@things-factory/integration-sftp 10.1.6 → 10.1.13
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.
|
@@ -92,30 +92,50 @@ let SftpMutation = class SftpMutation {
|
|
|
92
92
|
});
|
|
93
93
|
for (var i = 0; i < sftpUsers.length; i++) {
|
|
94
94
|
const sftpUser = sftpUsers[i];
|
|
95
|
-
|
|
95
|
+
/*
|
|
96
|
+
* This call had no `await`.
|
|
97
|
+
*
|
|
98
|
+
* `processSftp` is async, so the transaction committed while the work was still
|
|
99
|
+
* running, and anything it threw became an unhandled rejection that no caller saw.
|
|
100
|
+
* The mutation returned `true` either way, so a partial import looked like a
|
|
101
|
+
* complete one.
|
|
102
|
+
*
|
|
103
|
+
* `syncAllSftpOrders` below awaits the same function. One file doing the same thing
|
|
104
|
+
* two ways is what says this was an omission rather than a choice.
|
|
105
|
+
*/
|
|
106
|
+
await processSftp(sftpUser, context, customerBizplace.id);
|
|
96
107
|
}
|
|
97
108
|
});
|
|
98
109
|
return true;
|
|
99
110
|
}
|
|
100
111
|
async syncAllSftpOrders(context) {
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
112
|
+
/*
|
|
113
|
+
* This was wrapped in `try { ... } catch (e) { console.log(e) }` with `return true` after
|
|
114
|
+
* it, so a failed import reported success. A caller — the scheduler or a screen — got
|
|
115
|
+
* `true` whether the SFTP host was unreachable, or `getCustomerBizplace` returned
|
|
116
|
+
* undefined for a domain with no bizplace, or nothing was fetched at all.
|
|
117
|
+
*
|
|
118
|
+
* Swallowing looked like it bought per-domain resilience, but it did not: every domain
|
|
119
|
+
* runs inside one transaction, so a throw rolls all of them back regardless. The catch
|
|
120
|
+
* only hid that it happened.
|
|
121
|
+
*
|
|
122
|
+
* Letting it throw puts the failure in the GraphQL errors array where the caller can see
|
|
123
|
+
* it. Continuing past one bad domain is a different change — one transaction per domain —
|
|
124
|
+
* not a reason to drop the exception here.
|
|
125
|
+
*/
|
|
126
|
+
await (0, typeorm_1.getConnection)().transaction(async (tx) => {
|
|
127
|
+
const sftps = await tx
|
|
128
|
+
.getRepository(sftp_1.Sftp)
|
|
129
|
+
.createQueryBuilder('s')
|
|
130
|
+
.where('s.status = :status', { status: 'ACTIVE' })
|
|
131
|
+
.getMany();
|
|
132
|
+
if (sftps.length === 0)
|
|
133
|
+
return;
|
|
134
|
+
for (const sftp of sftps) {
|
|
135
|
+
const customerBizplace = await getCustomerBizplace(sftp.domainId, tx);
|
|
136
|
+
await processSftp(sftp, context, customerBizplace.id);
|
|
137
|
+
}
|
|
138
|
+
});
|
|
119
139
|
return true;
|
|
120
140
|
}
|
|
121
141
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sftp-mutation.js","sourceRoot":"","sources":["../../../server/service/sftp/sftp-mutation.ts"],"names":[],"mappings":"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","sourcesContent":["import '../../sftp-s3'\n\nimport { Arg, Ctx, Directive, Mutation, Resolver } from 'type-graphql'\nimport { EntityManager, getConnection, In } from 'typeorm'\n\nimport { Bizplace } from '@things-factory/biz-base'\nimport { FulfillmentAPI, FulfillmentCenter } from '@things-factory/integration-fulfillment'\nimport { Domain } from '@things-factory/shell'\n\nimport { SftpAPI } from '../../controllers'\nimport { FAILEDDATAPATH, SFTPFILESTORAGE, SUBMITDATAPATH, SUCCESSDATAPATH } from '../../sftp-const'\nimport { getPermittedDirectories } from '../../util'\nimport { Sftp, SftpStatus } from './sftp'\nimport { NewSftp, SftpPatch } from './sftp-type'\n\n@Resolver(Sftp)\nexport class SftpMutation {\n @Directive('@transaction')\n @Mutation(returns => Sftp, { description: 'To create new Sftp' })\n async createSftp(@Arg('sftp') sftp: NewSftp, @Ctx() context: ResolverContext): Promise<Sftp> {\n const { domain, user, tx } = context.state\n\n return await tx.getRepository(Sftp).save({\n ...sftp,\n domain,\n creator: user,\n updater: user\n })\n }\n\n @Directive('@transaction')\n @Mutation(returns => Sftp, { description: 'To modify Sftp information' })\n async updateSftp(\n @Arg('id') id: string,\n @Arg('patch') patch: SftpPatch,\n @Ctx() context: ResolverContext\n ): Promise<Sftp> {\n const { domain, user, tx } = context.state\n\n const repository = tx.getRepository(Sftp)\n const sftp = await repository.findOne({\n where: { domain: { id: domain.id }, id }\n })\n\n return await repository.save({\n ...sftp,\n ...patch,\n updater: user\n })\n }\n\n @Directive('@transaction')\n @Mutation(returns => [Sftp], { description: \"To modify multiple Sftps' information\" })\n async updateMultipleSftp(\n @Arg('patches', type => [SftpPatch]) patches: SftpPatch[],\n @Ctx() context: ResolverContext\n ): Promise<Sftp[]> {\n const { domain, user, tx } = context.state\n\n let results = []\n const _createRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === '+')\n const _updateRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === 'M')\n const sftpRepo = tx.getRepository(Sftp)\n\n if (_createRecords.length > 0) {\n for (let i = 0; i < _createRecords.length; i++) {\n const newRecord = _createRecords[i]\n\n const result = await sftpRepo.save({\n ...newRecord,\n domain,\n creator: user,\n updater: user\n })\n\n results.push({ ...result, cuFlag: '+' })\n }\n }\n\n if (_updateRecords.length > 0) {\n for (let i = 0; i < _updateRecords.length; i++) {\n const newRecord = _updateRecords[i]\n const sftp = await sftpRepo.findOneBy({ id: newRecord.id })\n\n const result = await sftpRepo.save({\n ...sftp,\n ...newRecord,\n updater: user\n })\n\n results.push({ ...result, cuFlag: 'M' })\n }\n }\n\n return results\n }\n\n @Directive('@transaction')\n @Mutation(returns => Boolean, { description: 'To delete Sftp' })\n async deleteSftp(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain, tx } = context.state\n\n await tx.getRepository(Sftp).delete({ domain: { id: domain.id }, id })\n return true\n }\n\n @Directive('@transaction')\n @Mutation(returns => Boolean, { description: 'To delete multiple sftps' })\n async deleteSftps(@Arg('ids', type => [String]) ids: string[], @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain, tx } = context.state\n\n await tx.getRepository(Sftp).delete({\n domain: { id: domain.id },\n id: In(ids)\n })\n\n return true\n }\n\n @Mutation(returns => Boolean, { description: 'To sync all orders from sftp' })\n async syncSftpOrders(\n @Arg('customerDomainId', type => String) customerDomainId: string,\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n await getConnection().transaction(async (tx: EntityManager) => {\n const customerDomain: Domain = await tx.getRepository(Domain).findOneBy({ id: customerDomainId })\n\n const customerBizplace: Bizplace = await getCustomerBizplace(customerDomainId, tx)\n\n const sftpUsers: Sftp[] = await tx.getRepository(Sftp).find({\n where: { domain: { id: customerDomainId }, status: SftpStatus.ACTIVE },\n relations: ['fulfillmentCenter']\n })\n\n for (var i = 0; i < sftpUsers.length; i++) {\n const sftpUser: Sftp = sftpUsers[i]\n processSftp(sftpUser, context, customerBizplace.id)\n }\n })\n\n return true\n }\n\n @Directive('@transaction')\n @Mutation(returns => Boolean, { description: 'Calls syncSftpOrders for all domain Ids' })\n async syncAllSftpOrders(@Ctx() context: ResolverContext): Promise<Boolean> {\n try {\n await getConnection().transaction(async tx => {\n const sftps = await tx\n .getRepository(Sftp)\n .createQueryBuilder('s')\n .where('s.status = :status', { status: 'ACTIVE' })\n .getMany()\n\n if (sftps.length === 0) return\n for (const sftp of sftps) {\n const customerBizplace = await getCustomerBizplace(sftp.domainId, tx)\n await processSftp(sftp, context, customerBizplace.id)\n }\n })\n } catch (e) {\n console.log(e)\n }\n return true\n }\n}\n\nexport async function processSftp(sftpUser, context, customerBizplaceId) {\n const fulfilmentCenter: FulfillmentCenter = sftpUser.fulfillmentCenter\n const isDevelopment: boolean = sftpUser.isDevelopment\n const folderPath: string = sftpUser.folderPath\n const folderType: string = isDevelopment ? 'dev' : 'prd'\n let initialDataPath: string = `${sftpUser.folderPath}/${folderType}${SUBMITDATAPATH}/`\n const results: any[] = await getPermittedDirectories({ path: initialDataPath }, context)\n const filesDirectories: any[] = results.filter(result => result.Size > 0)\n\n for await (let fileDirectory of filesDirectories) {\n let dataPath: string = `${sftpUser.folderPath}/${folderType}${SUBMITDATAPATH}/`\n let successPath: string = `${sftpUser.folderPath}/${folderType}${SUCCESSDATAPATH}/`\n let failedPath: string = `${sftpUser.folderPath}/${folderType}${FAILEDDATAPATH}/`\n const fileKey: string = fileDirectory.Key\n const lastSlashIdx = fileKey.lastIndexOf('/')\n const fileString: string = fileKey.substring(lastSlashIdx + 1, fileKey.length)\n try {\n const sftp: any = sftpUser\n let result: any = await SftpAPI.getOutboundOrder(sftp, { folderPath, folderType, fileKey: fileString })\n let isAccept: boolean = result.isAccept\n\n if (isAccept) {\n delete result.isAccept\n if (result) {\n let { items: releaseOrders }: any = await FulfillmentAPI.getOutboundOrders(fulfilmentCenter, {\n customerBizplaceId,\n refNo: result.refNo\n })\n\n if (releaseOrders) {\n result.collectionOrderNo = result.collectionOrderNo + ' - ' + (releaseOrders.length + 1)\n }\n\n result.requiredDraft = false\n\n const releaseOrder: any = await FulfillmentAPI.createOutboundOrder(fulfilmentCenter, {\n customerBizplaceId,\n releaseOrder: result\n })\n\n if (releaseOrder) {\n let movePaths = {\n source: (dataPath += fileString),\n destination: (successPath += fileString)\n }\n await SFTPFILESTORAGE.moveFile(movePaths)\n }\n }\n } else {\n let movePaths = {\n source: (dataPath += fileString),\n destination: (failedPath += fileString)\n }\n await SFTPFILESTORAGE.moveFile(movePaths)\n }\n } catch (e) {\n let movePaths = {\n source: (dataPath += fileString),\n destination: (failedPath += fileString)\n }\n await SFTPFILESTORAGE.moveFile(movePaths)\n }\n }\n}\n\nexport async function getCustomerBizplace(customerDomainId, tx): Promise<Bizplace> {\n const customerDomain: Domain = await tx.getRepository(Domain).findOneBy({ id: customerDomainId })\n\n const customerBizplace: Bizplace = await tx.getRepository(Bizplace).findOne({\n where: { domain: { id: customerDomain.id } }\n })\n\n return customerBizplace\n}\n"]}
|
|
1
|
+
{"version":3,"file":"sftp-mutation.js","sourceRoot":"","sources":["../../../server/service/sftp/sftp-mutation.ts"],"names":[],"mappings":"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","sourcesContent":["import '../../sftp-s3'\n\nimport { Arg, Ctx, Directive, Mutation, Resolver } from 'type-graphql'\nimport { EntityManager, getConnection, In } from 'typeorm'\n\nimport { Bizplace } from '@things-factory/biz-base'\nimport { FulfillmentAPI, FulfillmentCenter } from '@things-factory/integration-fulfillment'\nimport { Domain } from '@things-factory/shell'\n\nimport { SftpAPI } from '../../controllers'\nimport { FAILEDDATAPATH, SFTPFILESTORAGE, SUBMITDATAPATH, SUCCESSDATAPATH } from '../../sftp-const'\nimport { getPermittedDirectories } from '../../util'\nimport { Sftp, SftpStatus } from './sftp'\nimport { NewSftp, SftpPatch } from './sftp-type'\n\n@Resolver(Sftp)\nexport class SftpMutation {\n @Directive('@transaction')\n @Mutation(returns => Sftp, { description: 'To create new Sftp' })\n async createSftp(@Arg('sftp') sftp: NewSftp, @Ctx() context: ResolverContext): Promise<Sftp> {\n const { domain, user, tx } = context.state\n\n return await tx.getRepository(Sftp).save({\n ...sftp,\n domain,\n creator: user,\n updater: user\n })\n }\n\n @Directive('@transaction')\n @Mutation(returns => Sftp, { description: 'To modify Sftp information' })\n async updateSftp(\n @Arg('id') id: string,\n @Arg('patch') patch: SftpPatch,\n @Ctx() context: ResolverContext\n ): Promise<Sftp> {\n const { domain, user, tx } = context.state\n\n const repository = tx.getRepository(Sftp)\n const sftp = await repository.findOne({\n where: { domain: { id: domain.id }, id }\n })\n\n return await repository.save({\n ...sftp,\n ...patch,\n updater: user\n })\n }\n\n @Directive('@transaction')\n @Mutation(returns => [Sftp], { description: \"To modify multiple Sftps' information\" })\n async updateMultipleSftp(\n @Arg('patches', type => [SftpPatch]) patches: SftpPatch[],\n @Ctx() context: ResolverContext\n ): Promise<Sftp[]> {\n const { domain, user, tx } = context.state\n\n let results = []\n const _createRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === '+')\n const _updateRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === 'M')\n const sftpRepo = tx.getRepository(Sftp)\n\n if (_createRecords.length > 0) {\n for (let i = 0; i < _createRecords.length; i++) {\n const newRecord = _createRecords[i]\n\n const result = await sftpRepo.save({\n ...newRecord,\n domain,\n creator: user,\n updater: user\n })\n\n results.push({ ...result, cuFlag: '+' })\n }\n }\n\n if (_updateRecords.length > 0) {\n for (let i = 0; i < _updateRecords.length; i++) {\n const newRecord = _updateRecords[i]\n const sftp = await sftpRepo.findOneBy({ id: newRecord.id })\n\n const result = await sftpRepo.save({\n ...sftp,\n ...newRecord,\n updater: user\n })\n\n results.push({ ...result, cuFlag: 'M' })\n }\n }\n\n return results\n }\n\n @Directive('@transaction')\n @Mutation(returns => Boolean, { description: 'To delete Sftp' })\n async deleteSftp(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain, tx } = context.state\n\n await tx.getRepository(Sftp).delete({ domain: { id: domain.id }, id })\n return true\n }\n\n @Directive('@transaction')\n @Mutation(returns => Boolean, { description: 'To delete multiple sftps' })\n async deleteSftps(@Arg('ids', type => [String]) ids: string[], @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain, tx } = context.state\n\n await tx.getRepository(Sftp).delete({\n domain: { id: domain.id },\n id: In(ids)\n })\n\n return true\n }\n\n @Mutation(returns => Boolean, { description: 'To sync all orders from sftp' })\n async syncSftpOrders(\n @Arg('customerDomainId', type => String) customerDomainId: string,\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n await getConnection().transaction(async (tx: EntityManager) => {\n const customerDomain: Domain = await tx.getRepository(Domain).findOneBy({ id: customerDomainId })\n\n const customerBizplace: Bizplace = await getCustomerBizplace(customerDomainId, tx)\n\n const sftpUsers: Sftp[] = await tx.getRepository(Sftp).find({\n where: { domain: { id: customerDomainId }, status: SftpStatus.ACTIVE },\n relations: ['fulfillmentCenter']\n })\n\n for (var i = 0; i < sftpUsers.length; i++) {\n const sftpUser: Sftp = sftpUsers[i]\n\n /*\n * This call had no `await`.\n *\n * `processSftp` is async, so the transaction committed while the work was still\n * running, and anything it threw became an unhandled rejection that no caller saw.\n * The mutation returned `true` either way, so a partial import looked like a\n * complete one.\n *\n * `syncAllSftpOrders` below awaits the same function. One file doing the same thing\n * two ways is what says this was an omission rather than a choice.\n */\n await processSftp(sftpUser, context, customerBizplace.id)\n }\n })\n\n return true\n }\n\n @Directive('@transaction')\n @Mutation(returns => Boolean, { description: 'Calls syncSftpOrders for all domain Ids' })\n async syncAllSftpOrders(@Ctx() context: ResolverContext): Promise<Boolean> {\n /*\n * This was wrapped in `try { ... } catch (e) { console.log(e) }` with `return true` after\n * it, so a failed import reported success. A caller — the scheduler or a screen — got\n * `true` whether the SFTP host was unreachable, or `getCustomerBizplace` returned\n * undefined for a domain with no bizplace, or nothing was fetched at all.\n *\n * Swallowing looked like it bought per-domain resilience, but it did not: every domain\n * runs inside one transaction, so a throw rolls all of them back regardless. The catch\n * only hid that it happened.\n *\n * Letting it throw puts the failure in the GraphQL errors array where the caller can see\n * it. Continuing past one bad domain is a different change — one transaction per domain —\n * not a reason to drop the exception here.\n */\n await getConnection().transaction(async tx => {\n const sftps = await tx\n .getRepository(Sftp)\n .createQueryBuilder('s')\n .where('s.status = :status', { status: 'ACTIVE' })\n .getMany()\n\n if (sftps.length === 0) return\n for (const sftp of sftps) {\n const customerBizplace = await getCustomerBizplace(sftp.domainId, tx)\n await processSftp(sftp, context, customerBizplace.id)\n }\n })\n\n return true\n }\n}\n\nexport async function processSftp(sftpUser, context, customerBizplaceId) {\n const fulfilmentCenter: FulfillmentCenter = sftpUser.fulfillmentCenter\n const isDevelopment: boolean = sftpUser.isDevelopment\n const folderPath: string = sftpUser.folderPath\n const folderType: string = isDevelopment ? 'dev' : 'prd'\n let initialDataPath: string = `${sftpUser.folderPath}/${folderType}${SUBMITDATAPATH}/`\n const results: any[] = await getPermittedDirectories({ path: initialDataPath }, context)\n const filesDirectories: any[] = results.filter(result => result.Size > 0)\n\n for await (let fileDirectory of filesDirectories) {\n let dataPath: string = `${sftpUser.folderPath}/${folderType}${SUBMITDATAPATH}/`\n let successPath: string = `${sftpUser.folderPath}/${folderType}${SUCCESSDATAPATH}/`\n let failedPath: string = `${sftpUser.folderPath}/${folderType}${FAILEDDATAPATH}/`\n const fileKey: string = fileDirectory.Key\n const lastSlashIdx = fileKey.lastIndexOf('/')\n const fileString: string = fileKey.substring(lastSlashIdx + 1, fileKey.length)\n try {\n const sftp: any = sftpUser\n let result: any = await SftpAPI.getOutboundOrder(sftp, { folderPath, folderType, fileKey: fileString })\n let isAccept: boolean = result.isAccept\n\n if (isAccept) {\n delete result.isAccept\n if (result) {\n let { items: releaseOrders }: any = await FulfillmentAPI.getOutboundOrders(fulfilmentCenter, {\n customerBizplaceId,\n refNo: result.refNo\n })\n\n if (releaseOrders) {\n result.collectionOrderNo = result.collectionOrderNo + ' - ' + (releaseOrders.length + 1)\n }\n\n result.requiredDraft = false\n\n const releaseOrder: any = await FulfillmentAPI.createOutboundOrder(fulfilmentCenter, {\n customerBizplaceId,\n releaseOrder: result\n })\n\n if (releaseOrder) {\n let movePaths = {\n source: (dataPath += fileString),\n destination: (successPath += fileString)\n }\n await SFTPFILESTORAGE.moveFile(movePaths)\n }\n }\n } else {\n let movePaths = {\n source: (dataPath += fileString),\n destination: (failedPath += fileString)\n }\n await SFTPFILESTORAGE.moveFile(movePaths)\n }\n } catch (e) {\n let movePaths = {\n source: (dataPath += fileString),\n destination: (failedPath += fileString)\n }\n await SFTPFILESTORAGE.moveFile(movePaths)\n }\n }\n}\n\nexport async function getCustomerBizplace(customerDomainId, tx): Promise<Bizplace> {\n const customerDomain: Domain = await tx.getRepository(Domain).findOneBy({ id: customerDomainId })\n\n const customerBizplace: Bizplace = await tx.getRepository(Bizplace).findOne({\n where: { domain: { id: customerDomain.id } }\n })\n\n return customerBizplace\n}\n"]}
|