@things-factory/setting-base 4.3.582 → 4.3.609
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -37,6 +37,12 @@ let PartnerSettingMutation = class PartnerSettingMutation {
|
|
|
37
37
|
await Promise.all(createRecords.map(async (record) => {
|
|
38
38
|
const partnerDomain = await domainRepo.findOne(record.partnerDomain.id);
|
|
39
39
|
const setting = await settingRepo.findOne(record.setting.id);
|
|
40
|
+
//validate input format for qr scanning configuration
|
|
41
|
+
if (record.setting.name == 'qr-data-parsing-configuration') {
|
|
42
|
+
if (!validateInputQRFormat(record.value)) {
|
|
43
|
+
throw new Error('Invalid input format');
|
|
44
|
+
}
|
|
45
|
+
}
|
|
40
46
|
const result = await partnerSettingRepo.save(Object.assign(Object.assign({ domain, creator: user, updater: user }, record), { name: setting.name, description: setting.description, category: setting.category, partnerDomain,
|
|
41
47
|
setting }));
|
|
42
48
|
results.push(result);
|
|
@@ -84,4 +90,35 @@ PartnerSettingMutation = __decorate([
|
|
|
84
90
|
(0, type_graphql_1.Resolver)(partner_setting_1.PartnerSetting)
|
|
85
91
|
], PartnerSettingMutation);
|
|
86
92
|
exports.PartnerSettingMutation = PartnerSettingMutation;
|
|
93
|
+
function validateInputQRFormat(jsonString) {
|
|
94
|
+
try {
|
|
95
|
+
//parse the JSON
|
|
96
|
+
let jsonObj = JSON.parse(jsonString.trim());
|
|
97
|
+
//check if the JSON object is null or not an object
|
|
98
|
+
if (!jsonObj || typeof jsonObj !== 'object') {
|
|
99
|
+
throw new Error('Input must be a JSON object');
|
|
100
|
+
}
|
|
101
|
+
//check if required properties exist
|
|
102
|
+
if (!jsonObj.hasOwnProperty('delimiter') && !jsonObj.hasOwnProperty('sequence') && !jsonObj.hasOwnProperty('type')) {
|
|
103
|
+
throw new Error("Missing required property");
|
|
104
|
+
}
|
|
105
|
+
//check if sequence values are valid
|
|
106
|
+
const validSequenceValues = ['serialNumber', 'productBarcode'];
|
|
107
|
+
for (let i = 0; i < jsonObj.sequence.length; i++) {
|
|
108
|
+
let value = jsonObj.sequence[i];
|
|
109
|
+
if (value === 'SerialNumber')
|
|
110
|
+
value = 'serialNumber';
|
|
111
|
+
if (value === 'gtin' || value === 'GTIN')
|
|
112
|
+
value = 'productBarcode';
|
|
113
|
+
if (!validSequenceValues.includes(value)) {
|
|
114
|
+
throw new Error(`Invalid sequence value: '${jsonObj.sequence[i]}'.`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
//if all checks pass, return the parsed object
|
|
118
|
+
return jsonObj;
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
throw new Error(error);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
87
124
|
//# sourceMappingURL=partner-setting-mutation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"partner-setting-mutation.js","sourceRoot":"","sources":["../../../server/service/partner-setting/partner-setting-mutation.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,+CAAsE;AACtE,qCAAsE;AACtE,iDAA8C;AAE9C,uDAAkD;AAClD,iEAA4D;AAC5D,gDAA4C;AAGrC,IAAM,sBAAsB,GAA5B,MAAM,sBAAsB;IAG3B,AAAN,KAAK,CAAC,4BAA4B,CACe,OAA8B,EACtE,OAAY;QAEnB,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,GAAsD,OAAO,CAAC,KAAK,CAAA;QAC7F,MAAM,kBAAkB,GACtB,CAAA,EAAE,aAAF,EAAE,uBAAF,EAAE,CAAE,aAAa,CAAC,gCAAc,CAAC,KAAI,IAAA,uBAAa,EAAC,gCAAc,CAAC,CAAA;QACpE,MAAM,UAAU,GAAuB,CAAA,EAAE,aAAF,EAAE,uBAAF,EAAE,CAAE,aAAa,CAAC,cAAM,CAAC,KAAI,IAAA,uBAAa,EAAC,cAAM,CAAC,CAAA;QACzF,MAAM,WAAW,GAAwB,CAAA,EAAE,aAAF,EAAE,uBAAF,EAAE,CAAE,aAAa,CAAC,iBAAO,CAAC,KAAI,IAAA,uBAAa,EAAC,iBAAO,CAAC,CAAA;QAE7F,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,MAAM,CACrD,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;YACjB,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG;gBAAE,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAC3D,IAAI,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,GAAG;gBAAE,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAEzE,OAAO,OAAO,CAAA;QAChB,CAAC,EACD,EAAE,aAAa,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,CACzC,CAAA;QAED,IAAI,OAAO,GAAqB,EAAE,CAAA;QAElC,IAAI,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,MAAM,EAAE;YACzB,MAAM,OAAO,CAAC,GAAG,CACf,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,MAAsB,EAAE,EAAE;gBACjD,MAAM,aAAa,GAAW,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAA;gBAC/E,MAAM,OAAO,GAAY,MAAM,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;gBAErE,MAAM,MAAM,GAAmB,MAAM,kBAAkB,CAAC,IAAI,+BAC1D,MAAM,EACN,OAAO,EAAE,IAAI,EACb,OAAO,EAAE,IAAI,IACV,MAAM,KACT,IAAI,EAAE,OAAO,CAAC,IAAI,EAClB,WAAW,EAAE,OAAO,CAAC,WAAW,EAChC,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAC1B,aAAa;oBACb,OAAO,IACP,CAAA;gBAEF,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YACtB,CAAC,CAAC,CACH,CAAA;SACF;QAED,IAAI,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,MAAM,EAAE;YACzB,MAAM,OAAO,CAAC,GAAG,CACf,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,MAAsB,EAAE,EAAE;gBACjD,MAAM,aAAa,GAAW,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAA;gBAC/E,MAAM,OAAO,GAAY,MAAM,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;gBAErE,MAAM,cAAc,GAAmB,MAAM,kBAAkB,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAA;gBAC3F,IAAI,CAAC,MAAM,CAAC,EAAE;oBAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAA;gBAEtE,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,IAAI,+CACvC,cAAc,GACd,MAAM,KACT,IAAI,EAAE,OAAO,CAAC,IAAI,EAClB,WAAW,EAAE,OAAO,CAAC,WAAW,EAChC,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAC1B,OAAO,EAAE,IAAI,EACb,aAAa;oBACb,OAAO,IACP,CAAA;gBAEF,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YACtB,CAAC,CAAC,CACH,CAAA;SACF;QAED,OAAO,OAAO,CAAA;IAChB,CAAC;IAIK,AAAN,KAAK,CAAC,qBAAqB,CAA+B,GAAa,EAAS,OAAY;QAC1F,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAEpC,MAAM,EAAE,CAAC,aAAa,CAAC,gCAAc,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAA,YAAE,EAAC,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;QACtE,OAAO,IAAI,CAAA;IACb,CAAC;CACF,CAAA;
|
|
1
|
+
{"version":3,"file":"partner-setting-mutation.js","sourceRoot":"","sources":["../../../server/service/partner-setting/partner-setting-mutation.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@things-factory/setting-base",
|
|
3
|
-
"version": "4.3.
|
|
3
|
+
"version": "4.3.609",
|
|
4
4
|
"main": "dist-server/index.js",
|
|
5
5
|
"browser": "client/index.js",
|
|
6
6
|
"things-factory": true,
|
|
@@ -23,8 +23,8 @@
|
|
|
23
23
|
"migration:create": "node ../../node_modules/typeorm/cli.js migration:create -d ./server/migrations"
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
|
-
"@things-factory/auth-base": "^4.3.
|
|
27
|
-
"@things-factory/code-base": "^4.3.
|
|
26
|
+
"@things-factory/auth-base": "^4.3.591",
|
|
27
|
+
"@things-factory/code-base": "^4.3.591"
|
|
28
28
|
},
|
|
29
|
-
"gitHead": "
|
|
29
|
+
"gitHead": "9442aa55ff704d8adf03b277522aa17a21fb6d3a"
|
|
30
30
|
}
|
|
@@ -38,6 +38,13 @@ export class PartnerSettingMutation {
|
|
|
38
38
|
const partnerDomain: Domain = await domainRepo.findOne(record.partnerDomain.id)
|
|
39
39
|
const setting: Setting = await settingRepo.findOne(record.setting.id)
|
|
40
40
|
|
|
41
|
+
//validate input format for qr scanning configuration
|
|
42
|
+
if(record.setting.name == 'qr-data-parsing-configuration') {
|
|
43
|
+
if (!validateInputQRFormat(record.value)) {
|
|
44
|
+
throw new Error('Invalid input format')
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
41
48
|
const result: PartnerSetting = await partnerSettingRepo.save({
|
|
42
49
|
domain,
|
|
43
50
|
creator: user,
|
|
@@ -92,3 +99,36 @@ export class PartnerSettingMutation {
|
|
|
92
99
|
return true
|
|
93
100
|
}
|
|
94
101
|
}
|
|
102
|
+
|
|
103
|
+
function validateInputQRFormat(jsonString) {
|
|
104
|
+
try {
|
|
105
|
+
//parse the JSON
|
|
106
|
+
let jsonObj = JSON.parse(jsonString.trim())
|
|
107
|
+
|
|
108
|
+
//check if the JSON object is null or not an object
|
|
109
|
+
if (!jsonObj || typeof jsonObj !== 'object') {
|
|
110
|
+
throw new Error('Input must be a JSON object')
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
//check if required properties exist
|
|
114
|
+
if (!jsonObj.hasOwnProperty('delimiter') && !jsonObj.hasOwnProperty('sequence') && !jsonObj.hasOwnProperty('type')) {
|
|
115
|
+
throw new Error("Missing required property")
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
//check if sequence values are valid
|
|
119
|
+
const validSequenceValues = ['serialNumber', 'productBarcode']
|
|
120
|
+
for (let i = 0; i < jsonObj.sequence.length; i++) {
|
|
121
|
+
let value = jsonObj.sequence[i]
|
|
122
|
+
if (value === 'SerialNumber') value = 'serialNumber'
|
|
123
|
+
if (value === 'gtin' || value === 'GTIN') value = 'productBarcode'
|
|
124
|
+
if (!validSequenceValues.includes(value)) {
|
|
125
|
+
throw new Error(`Invalid sequence value: '${jsonObj.sequence[i]}'.`)
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
//if all checks pass, return the parsed object
|
|
130
|
+
return jsonObj
|
|
131
|
+
} catch (error) {
|
|
132
|
+
throw new Error(error)
|
|
133
|
+
}
|
|
134
|
+
}
|