Commit 50ad7d6d61f1df4a07737d617d894ac489ae5034
1 parent
53004544
Exists in
master
and in
1 other branch
update get vizcard get customer
Showing
7 changed files
with
125 additions
and
57 deletions
Show diff stats
@@ -0,0 +1,20 @@ | @@ -0,0 +1,20 @@ | ||
1 | +{ | ||
2 | + // Use IntelliSense to learn about possible attributes. | ||
3 | + // Hover to view descriptions of existing attributes. | ||
4 | + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 | ||
5 | + "version": "0.2.0", | ||
6 | + "configurations": [ | ||
7 | + { | ||
8 | + "type": "node", | ||
9 | + "request": "launch", | ||
10 | + "name": "Launch Program", | ||
11 | + "program": "${workspaceFolder}/index.js" | ||
12 | + }, | ||
13 | + { | ||
14 | + "type": "node", | ||
15 | + "request": "attach", | ||
16 | + "name": "Attach by Process ID", | ||
17 | + "processId": "${command:PickProcess}" | ||
18 | + } | ||
19 | + ] | ||
20 | +} | ||
0 | \ No newline at end of file | 21 | \ No newline at end of file |
ais-structure/src/modules/customer/customer.ctrl.js
@@ -7,21 +7,25 @@ var log = require('../helper/log.js'); | @@ -7,21 +7,25 @@ var log = require('../helper/log.js'); | ||
7 | exports.customer = async function (req, res, next) { | 7 | exports.customer = async function (req, res, next) { |
8 | var getCmd = "Customer"; | 8 | var getCmd = "Customer"; |
9 | var sendCmd = "Customer"; | 9 | var sendCmd = "Customer"; |
10 | + var sacf = "SACF"; | ||
11 | + var d01 = "D01" | ||
10 | 12 | ||
11 | log.startlog(getCmd,req); | 13 | log.startlog(getCmd,req); |
12 | - log.logDetail.addInput("Client",getCmd,"Request",req); | 14 | + log.logDetail.addInput(sacf,getCmd,"Request",req,req.body); |
13 | 15 | ||
14 | var err = validator(req,getCmd); | 16 | var err = validator(req,getCmd); |
15 | 17 | ||
16 | if(err.length > 0) | 18 | if(err.length > 0) |
17 | { | 19 | { |
18 | - console.log(err); | 20 | + log.log(err,'error'); |
19 | var response = responseMsg.error(req,getCmd,40300); | 21 | var response = responseMsg.error(req,getCmd,40300); |
20 | // res.status(200).json(response); | 22 | // res.status(200).json(response); |
21 | }else | 23 | }else |
22 | { | 24 | { |
23 | var objectData = req.query; | 25 | var objectData = req.query; |
26 | + log.logDetail.addOutput(d01,sendCmd,"Request",req.url,req.body); | ||
24 | const result = await connection.requestJsonToD01(objectData,sendCmd,"GET"); | 27 | const result = await connection.requestJsonToD01(objectData,sendCmd,"GET"); |
28 | + log.logDetail.addInput(d01,sendCmd,"Response",result,result.resultData); | ||
25 | if(typeof result.err === 'undefined'){ | 29 | if(typeof result.err === 'undefined'){ |
26 | // console.log(result.response); | 30 | // console.log(result.response); |
27 | var resultObj = result.response; | 31 | var resultObj = result.response; |
@@ -30,22 +34,25 @@ exports.customer = async function (req, res, next) { | @@ -30,22 +34,25 @@ exports.customer = async function (req, res, next) { | ||
30 | if(resultObj.resultData && resultObj.resultData.length>0) | 34 | if(resultObj.resultData && resultObj.resultData.length>0) |
31 | { | 35 | { |
32 | var response = responseMsg.success(req,getCmd,resultObj); | 36 | var response = responseMsg.success(req,getCmd,resultObj); |
37 | + log.addSuccessSummary(sacf,sendCmd,response); | ||
33 | }else | 38 | }else |
34 | { | 39 | { |
35 | var response = responseMsg.error(req,getCmd,40300); | 40 | var response = responseMsg.error(req,getCmd,40300); |
41 | + log.addErrorSummary(sacf,sendCmd,response); | ||
36 | } | 42 | } |
37 | } | 43 | } |
38 | } else { | 44 | } else { |
39 | response = responseMsg.direct(req,getCmd,result.response); | 45 | response = responseMsg.direct(req,getCmd,result.response); |
46 | + log.addErrorSummary(sacf,sendCmd,response); | ||
40 | } | 47 | } |
41 | } | 48 | } |
42 | 49 | ||
43 | - if(!response) | 50 | + if(!response){ |
44 | var response = responseMsg.error(req,getCmd,50000); | 51 | var response = responseMsg.error(req,getCmd,50000); |
52 | + stats.receiveResponse(sacf,sendCmd,"Error"); | ||
53 | + } | ||
45 | 54 | ||
46 | - log.logDetail.addOutput("Client",getCmd,"Response",response,response); | ||
47 | - // log.logDetail.write(); | ||
48 | - log.logSummary(); | 55 | + log.logDetail.addOutput(sacf,getCmd,"Response",response,response); |
49 | res.status(200).json(response); | 56 | res.status(200).json(response); |
50 | next(); | 57 | next(); |
51 | }; | 58 | }; |
@@ -67,9 +74,9 @@ function validator(req,api) | @@ -67,9 +74,9 @@ function validator(req,api) | ||
67 | } | 74 | } |
68 | 75 | ||
69 | if(err.length > 0) | 76 | if(err.length > 0) |
70 | - stats.reciveRequest(req.method,api,false); | 77 | + stats.receiveRequest(req.method,api,false); |
71 | else | 78 | else |
72 | - stats.reciveRequest(req.method,api,true); | 79 | + stats.receiveRequest(req.method,api,true); |
73 | 80 | ||
74 | return err; | 81 | return err; |
75 | } | 82 | } |
ais-structure/src/modules/helper/connection.js
@@ -18,11 +18,34 @@ connection.requestSoapToSACF = async function (soap,cmd,myMethod) { | @@ -18,11 +18,34 @@ connection.requestSoapToSACF = async function (soap,cmd,myMethod) { | ||
18 | } | 18 | } |
19 | 19 | ||
20 | stats.sendSACFRequest(cfg.service.SACF.Name,cmd) | 20 | stats.sendSACFRequest(cfg.service.SACF.Name,cmd) |
21 | - log.logDetail.addOutput(cfg.service.SACF.Name,cmd,"Request",params.body,soap); | ||
22 | - log.logDetail.write(); | 21 | + log.logDetail.addOutput(cfg.service.SACF.Name,cmd,"Request",params.body,soap); |
23 | 22 | ||
24 | - return asyncRequest(params,cmd,cfg.service.SACF.Name); | 23 | + var result = await asyncRequest(params,cmd,cfg.service.SACF.Name); |
24 | + | ||
25 | + if(result.err) | ||
26 | + { | ||
27 | + result.response = {}; | ||
28 | + result.response.resultCode = "50000"; | ||
29 | + | ||
30 | + //ETIMEDOUT = timeout | ||
31 | + //ECONNREFUSED = servercode | ||
32 | + | ||
33 | + if(result.err.code == 'ETIMEDOUT'){ | ||
34 | + result.response.resultCode = "50003"; | ||
35 | + result.response.resultDescription = "Timeout"; | ||
36 | + } else if(result.err.code == 'ECONNREFUSED'){ | ||
37 | + result.response.resultCode = "50002"; | ||
38 | + result.response.resultDescription = "Reject"; | ||
39 | + } else { | ||
40 | + result.response.resultCode = "50000"; | ||
41 | + result.response.resultDescription = "System error"; | ||
42 | + } | ||
43 | + stats.receiveResponse(cfg.service.SACF.Name,cmd,"Error"); | ||
44 | + } | ||
45 | + | ||
46 | + return result; | ||
25 | }; | 47 | }; |
48 | + | ||
26 | connection.requestJsonToD01 = async function (obj,cmd,myMethod) { | 49 | connection.requestJsonToD01 = async function (obj,cmd,myMethod) { |
27 | 50 | ||
28 | var service = cfg.service.D01; | 51 | var service = cfg.service.D01; |
@@ -157,7 +180,7 @@ connection.requestJsonToD01 = async function (obj,cmd,myMethod) { | @@ -157,7 +180,7 @@ connection.requestJsonToD01 = async function (obj,cmd,myMethod) { | ||
157 | if(result.response.resultCode == "40300"){ | 180 | if(result.response.resultCode == "40300"){ |
158 | stats.receiveBadRestResponse(service.Name,params.method,cmd); | 181 | stats.receiveBadRestResponse(service.Name,params.method,cmd); |
159 | } else { | 182 | } else { |
160 | - stats.reciveResponse(service.Name,cmd,"Error"); | 183 | + stats.receiveResponse(service.Name,cmd,"Error"); |
161 | } | 184 | } |
162 | 185 | ||
163 | 186 | ||
@@ -184,7 +207,7 @@ async function parallelRequest(multiParams,cmd,node) | @@ -184,7 +207,7 @@ async function parallelRequest(multiParams,cmd,node) | ||
184 | for(var i=0;i<res.length;i++) | 207 | for(var i=0;i<res.length;i++) |
185 | { | 208 | { |
186 | if(!res[i].err) | 209 | if(!res[i].err) |
187 | - stats.reciveResponse(node,cmd,"Success"); | 210 | + stats.receiveResponse(node,cmd,"Success"); |
188 | 211 | ||
189 | } | 212 | } |
190 | 213 | ||
@@ -208,7 +231,7 @@ function asyncRequest (params = {},cmd,node) { | @@ -208,7 +231,7 @@ function asyncRequest (params = {},cmd,node) { | ||
208 | }); | 231 | }); |
209 | } else { | 232 | } else { |
210 | 233 | ||
211 | - // stats.reciveResponse(node,cmd,"Success"); | 234 | + // stats.receiveResponse(node,cmd,"Success"); |
212 | resolve({ | 235 | resolve({ |
213 | 'body' : body, | 236 | 'body' : body, |
214 | 'response' : response | 237 | 'response' : response |
ais-structure/src/modules/helper/log.js
@@ -101,7 +101,7 @@ logger.logSummary = function (response) | @@ -101,7 +101,7 @@ logger.logSummary = function (response) | ||
101 | log.addErrorBlock(row.node,row.cmd,row.resultCode,row.resultDesc); | 101 | log.addErrorBlock(row.node,row.cmd,row.resultCode,row.resultDesc); |
102 | } | 102 | } |
103 | } | 103 | } |
104 | - | 104 | + |
105 | if(response){ | 105 | if(response){ |
106 | log.end(response.resultCode,response.developerMessage) | 106 | log.end(response.resultCode,response.developerMessage) |
107 | } else { | 107 | } else { |
@@ -120,7 +120,7 @@ var addlogDetailData = function(inputType,node,cmd,type,rawData,data){ | @@ -120,7 +120,7 @@ var addlogDetailData = function(inputType,node,cmd,type,rawData,data){ | ||
120 | params : rawData.params | 120 | params : rawData.params |
121 | }; | 121 | }; |
122 | } else { | 122 | } else { |
123 | - var raw = { | 123 | + var raw = { |
124 | }; | 124 | }; |
125 | } | 125 | } |
126 | 126 | ||
@@ -144,20 +144,24 @@ var addlogDetailData = function(inputType,node,cmd,type,rawData,data){ | @@ -144,20 +144,24 @@ var addlogDetailData = function(inputType,node,cmd,type,rawData,data){ | ||
144 | data : data | 144 | data : data |
145 | }; | 145 | }; |
146 | 146 | ||
147 | + var log = logg.detail(start.session, start.cmd, start.identity); | ||
148 | + log.addInput( detail.input.node, detail.input.cmd, detail.input.type, detail.input.rawData, detail.input.data ); | ||
149 | + log.addOutput( detail.output.node, detail.output.cmd, detail.output.type, detail.output.rawData, detail.output.data ); | ||
150 | + log.end(); | ||
147 | // console.log(detail.output); | 151 | // console.log(detail.output); |
148 | } | 152 | } |
149 | } | 153 | } |
150 | 154 | ||
151 | var logDetailData = { | 155 | var logDetailData = { |
152 | addInput : function(node,cmd,type,rawData,data){addlogDetailData('input',node,cmd,type,rawData,data)}, | 156 | addInput : function(node,cmd,type,rawData,data){addlogDetailData('input',node,cmd,type,rawData,data)}, |
153 | - addOutput : function(node,cmd,type,rawData,data){addlogDetailData('output',node,cmd,type,rawData,data)}, | ||
154 | - write : function () | ||
155 | - { | ||
156 | - var log = logg.detail(start.session, start.cmd, start.identity); | ||
157 | - log.addInput( detail.input.node, detail.input.cmd, detail.input.type, detail.input.rawData, detail.input.data ); | ||
158 | - log.addOutput( detail.output.node, detail.output.cmd, detail.output.type, detail.output.rawData, detail.output.data ); | ||
159 | - log.end(); | ||
160 | - } | 157 | + addOutput : function(node,cmd,type,rawData,data){addlogDetailData('output',node,cmd,type,rawData,data)} |
158 | + // write : function () | ||
159 | + // { | ||
160 | + // var log = logg.detail(start.session, start.cmd, start.identity); | ||
161 | + // log.addInput( detail.input.node, detail.input.cmd, detail.input.type, detail.input.rawData, detail.input.data ); | ||
162 | + // log.addOutput( detail.output.node, detail.output.cmd, detail.output.type, detail.output.rawData, detail.output.data ); | ||
163 | + // log.end(); | ||
164 | + // } | ||
161 | }; | 165 | }; |
162 | 166 | ||
163 | logger.logDetail = logDetailData; | 167 | logger.logDetail = logDetailData; |
ais-structure/src/modules/helper/messageSOAP.js
@@ -37,11 +37,12 @@ soap.soapToArray = function(req,resultSoap) | @@ -37,11 +37,12 @@ soap.soapToArray = function(req,resultSoap) | ||
37 | 37 | ||
38 | // console.log(resultSet); | 38 | // console.log(resultSet); |
39 | 39 | ||
40 | - | 40 | + var rawDataArr = []; |
41 | 41 | ||
42 | for(var i=0;i<resultSet.length;i++) | 42 | for(var i=0;i<resultSet.length;i++) |
43 | { | 43 | { |
44 | var data = {} | 44 | var data = {} |
45 | + var rawData = {} | ||
45 | for(var key in resultSet[i]){ | 46 | for(var key in resultSet[i]){ |
46 | var keyObj = capitalizeFirstLetter(key.replace('tem:','')) | 47 | var keyObj = capitalizeFirstLetter(key.replace('tem:','')) |
47 | // console.log(keyObj+' : '+resultSet[i][key]['_text']); | 48 | // console.log(keyObj+' : '+resultSet[i][key]['_text']); |
@@ -52,13 +53,13 @@ soap.soapToArray = function(req,resultSoap) | @@ -52,13 +53,13 @@ soap.soapToArray = function(req,resultSoap) | ||
52 | } else { | 53 | } else { |
53 | data[keyObj] = resultSet[i][key]['_text']; | 54 | data[keyObj] = resultSet[i][key]['_text']; |
54 | } | 55 | } |
56 | + rawData[keyObj] = resultSet[i][key]['_text']; | ||
55 | } | 57 | } |
58 | + rawDataArr.push(rawData); | ||
56 | returnData.push(data); | 59 | returnData.push(data); |
57 | } | 60 | } |
58 | 61 | ||
59 | - console.log(resultSet) | ||
60 | - | ||
61 | - return { returnData : returnData, rawDataJson : resultSet}; | 62 | + return { returnData : returnData, rawDataJson : rawDataArr}; |
62 | }; | 63 | }; |
63 | 64 | ||
64 | function getBodySOAP(objectData) | 65 | function getBodySOAP(objectData) |
ais-structure/src/modules/helper/stats.js
@@ -10,21 +10,21 @@ stat.sendSACFRequest = function (toNode,cmd){ | @@ -10,21 +10,21 @@ stat.sendSACFRequest = function (toNode,cmd){ | ||
10 | writeStats(nodeName+" Send "+toNode+" OutRedirect SPW_"+cmd+" Request"); | 10 | writeStats(nodeName+" Send "+toNode+" OutRedirect SPW_"+cmd+" Request"); |
11 | }; | 11 | }; |
12 | 12 | ||
13 | -stat.reciveSACFResponse = function (fromNode,cmd,result){ | ||
14 | - writeStats(nodeName+" Recive "+fromNode+" OutRedirect SPW_"+cmd+" Response "+result); | 13 | +stat.receiveSACFResponse = function (fromNode,cmd,result){ |
14 | + writeStats(nodeName+" Receive "+fromNode+" OutRedirect SPW_"+cmd+" Response "+result); | ||
15 | }; | 15 | }; |
16 | 16 | ||
17 | -stat.reciveSACFBadResponse = function (fromNode,cmd){ | ||
18 | - writeStats(nodeName+" Recive "+fromNode+" Bad OutRedirect SPW_"+cmd+" Response"); | 17 | +stat.receiveSACFBadResponse = function (fromNode,cmd){ |
18 | + writeStats(nodeName+" Receive "+fromNode+" Bad OutRedirect SPW_"+cmd+" Response"); | ||
19 | }; | 19 | }; |
20 | 20 | ||
21 | //client => CMF | 21 | //client => CMF |
22 | -stat.reciveRequest = function (method,cmd){ | ||
23 | - writeStats(nodeName+" Recive "+method+" "+cmd+" Request"); | 22 | +stat.receiveRequest = function (method,cmd){ |
23 | + writeStats(nodeName+" Receive "+method+" "+cmd+" Request"); | ||
24 | }; | 24 | }; |
25 | 25 | ||
26 | -stat.reciveBadRequest = function (method,cmd){ | ||
27 | - writeStats(nodeName+" Recive Bad "+method+" "+cmd+" Request"); | 26 | +stat.receiveBadRequest = function (method,cmd){ |
27 | + writeStats(nodeName+" Receive Bad "+method+" "+cmd+" Request"); | ||
28 | }; | 28 | }; |
29 | 29 | ||
30 | stat.sendResponse = function (method,cmd,result){ | 30 | stat.sendResponse = function (method,cmd,result){ |
@@ -49,12 +49,12 @@ stat.sendRequest = function (toNode,cmd){ | @@ -49,12 +49,12 @@ stat.sendRequest = function (toNode,cmd){ | ||
49 | writeStats(nodeName+" Send "+toNode+" "+cmd+" Request"); | 49 | writeStats(nodeName+" Send "+toNode+" "+cmd+" Request"); |
50 | }; | 50 | }; |
51 | 51 | ||
52 | -stat.reciveResponse = function (fromNode,cmd,result){ | ||
53 | - writeStats(nodeName+" Recive "+fromNode+" "+cmd+" Response "+result); | 52 | +stat.receiveResponse = function (fromNode,cmd,result){ |
53 | + writeStats(nodeName+" Receive "+fromNode+" "+cmd+" Response "+result); | ||
54 | }; | 54 | }; |
55 | 55 | ||
56 | -stat.reciveBadResponse = function (fromNode,cmd,result){ | ||
57 | - writeStats(nodeName+" Recive "+fromNode+" Bad "+cmd+" Response "); | 56 | +stat.receiveBadResponse = function (fromNode,cmd,result){ |
57 | + writeStats(nodeName+" Receive "+fromNode+" Bad "+cmd+" Response "); | ||
58 | }; | 58 | }; |
59 | 59 | ||
60 | 60 |
ais-structure/src/modules/vizcard/vizCard.ctrl.js
@@ -19,9 +19,9 @@ exports.vizcard = async function (req, res, next) { | @@ -19,9 +19,9 @@ exports.vizcard = async function (req, res, next) { | ||
19 | 19 | ||
20 | if(err.length > 0) | 20 | if(err.length > 0) |
21 | { | 21 | { |
22 | - log.log(err); | 22 | + log.log(err,'error'); |
23 | var response = responseMsg.error(req,getCmd,40300); | 23 | var response = responseMsg.error(req,getCmd,40300); |
24 | - res.status(200).json(response); | 24 | + // res.status(200).json(response); |
25 | }else | 25 | }else |
26 | { | 26 | { |
27 | 27 | ||
@@ -41,30 +41,43 @@ exports.vizcard = async function (req, res, next) { | @@ -41,30 +41,43 @@ exports.vizcard = async function (req, res, next) { | ||
41 | // console.log(result.err) | 41 | // console.log(result.err) |
42 | 42 | ||
43 | if(typeof result.err === 'undefined'){ | 43 | if(typeof result.err === 'undefined'){ |
44 | - stats.reciveSACFResponse(sacf,sendCmd,"Success"); | ||
45 | 44 | ||
46 | - var resultSoap = parseJson.xml2json(result.body, {compact: true, spaces: 4}) | ||
47 | - resultSoap = JSON.parse(resultSoap) | ||
48 | - resultSoap = resultSoap['soap:Envelope']['soap:Body']['tem:SearchCustomerResponse']['tem:SearchCustomerResult']['tem:CustomerSearchResult']; | 45 | + try { |
46 | + var resultSoap = parseJson.xml2json(result.body, {compact: true, spaces: 4}) | ||
47 | + resultSoap = JSON.parse(resultSoap) | ||
48 | + resultSoap = resultSoap['soap:Envelope']['soap:Body']['tem:SearchCustomerResponse']['tem:SearchCustomerResult']['tem:CustomerSearchResult']; | ||
49 | + | ||
50 | + var resultSet = messageSOAP.soapToArray(req,resultSoap); | ||
51 | + stats.receiveSACFResponse(sacf,sendCmd,"Success"); | ||
52 | + var response = responseMsg.success(req,getCmd,{resultData:resultSet.returnData,rowCount:resultSet.returnData.length}); | ||
53 | + | ||
54 | + log.addSuccessSummary(sacf,sendCmd,response); | ||
55 | + // log.addErrorSummary("ABCD","EFGH",{resultCode : '50000',developerMessage : "error"}); | ||
56 | + } | ||
57 | + catch(error) { | ||
58 | + result.response.resultCode = "50000"; | ||
59 | + result.response.resultDescription = "Bad Response"; | ||
49 | 60 | ||
50 | - var resultSet = messageSOAP.soapToArray(req,resultSoap); | ||
51 | - var response = responseMsg.success(req,getCmd,{resultData:resultSet.returnData,rowCount:resultSet.returnData.length}); | 61 | + stats.receiveSACFBadResponse(sacf,sendCmd); |
62 | + log.addErrorSummary(sacf,sendCmd,response); | ||
52 | 63 | ||
53 | - log.addSuccessSummary(sacf,sendCmd,response); | ||
54 | - // log.addErrorSummary("ABCD","EFGH",{resultCode : '50000',developerMessage : "error"}); | 64 | + response = responseMsg.direct(req,getCmd,result.response); |
65 | + var resultSet = {rawDataJson : ""} | ||
66 | + } | ||
55 | 67 | ||
68 | + } else { | ||
69 | + response = responseMsg.direct(req,getCmd,result.response); | ||
70 | + var resultSet = {rawDataJson : ""} | ||
56 | } | 71 | } |
57 | 72 | ||
58 | - log.logDetail.addInput(sacf,getCmd,"Response",result,resultSet.rawDataJson); | 73 | + log.logDetail.addInput(sacf,sendCmd,"Response",result,resultSet.rawDataJson); |
59 | 74 | ||
60 | if(!response){ | 75 | if(!response){ |
61 | var response = responseMsg.error(req,getCmd,50000); | 76 | var response = responseMsg.error(req,getCmd,50000); |
62 | - stats.reciveResponse(sacf,"SPW_"+sendCmd,"Error"); | 77 | + stats.receiveSACFResponse(sacf,sendCmd,"Error"); |
63 | } | 78 | } |
64 | 79 | ||
65 | - log.logDetail.addOutput(sacf,sendCmd,"Response",response,response); | ||
66 | - log.logDetail.write(); | ||
67 | - log.logSummary(response); | 80 | + log.logDetail.addOutput(sacf,getCmd,"Response",response,response); |
68 | res.status(200).json(response); | 81 | res.status(200).json(response); |
69 | next(); | 82 | next(); |
70 | } | 83 | } |
@@ -83,9 +96,9 @@ function validator(req,cmd) | @@ -83,9 +96,9 @@ function validator(req,cmd) | ||
83 | 96 | ||
84 | var err = validatorHelper(req,list); | 97 | var err = validatorHelper(req,list); |
85 | if(err.length > 0) | 98 | if(err.length > 0) |
86 | - stats.reciveRequest(req.method,cmd,false); | 99 | + stats.receiveRequest(req.method,cmd,false); |
87 | else | 100 | else |
88 | - stats.reciveRequest(req.method,cmd,true); | 101 | + stats.receiveRequest(req.method,cmd,true); |
89 | 102 | ||
90 | return err; | 103 | return err; |
91 | } | 104 | } |