@things-factory/biz-base 10.1.232 → 10.1.234
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.
- package/dist-server/service/bizplace/bizplace-access.d.ts +4 -1
- package/dist-server/service/bizplace/bizplace-access.js +10 -7
- package/dist-server/service/bizplace/bizplace-access.js.map +1 -1
- package/dist-server/service/bizplace/bizplace-mutation.js +7 -7
- package/dist-server/service/bizplace/bizplace-mutation.js.map +1 -1
- package/dist-server/service/bizplace/bizplace-query.js +1 -1
- package/dist-server/service/bizplace/bizplace-query.js.map +1 -1
- package/dist-server/service/company/company-mutation.js +3 -0
- package/dist-server/service/company/company-mutation.js.map +1 -1
- package/dist-server/service/company/company.js +3 -2
- package/dist-server/service/company/company.js.map +1 -1
- package/dist-server/service/counterparty/counterparty-bank-account-service.js +3 -1
- package/dist-server/service/counterparty/counterparty-bank-account-service.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -4
- package/tests/bizplace-access.test.cjs +6 -0
- package/tests/counterparty-bank-account.test.mjs +9 -1
- package/tests/our-company.test.mjs +9 -0
- package/translations/en.json +5 -1
- package/translations/es.json +5 -1
- package/translations/ja.json +5 -1
- package/translations/ko.json +5 -1
- package/translations/ms.json +5 -1
- package/translations/zh.json +5 -1
|
@@ -2,7 +2,10 @@ import { EntityManager } from 'typeorm';
|
|
|
2
2
|
import { Bizplace } from './bizplace';
|
|
3
3
|
import { BizplacePatch } from './bizplace-types';
|
|
4
4
|
import { Company } from '../company/company';
|
|
5
|
-
|
|
5
|
+
/** Not found and not yours are one answer - it does not tell whether another domain has it. Said in the reader's words. */
|
|
6
|
+
export declare function accessDenied(context?: {
|
|
7
|
+
t?: (key: string, options?: any) => string;
|
|
8
|
+
}): never;
|
|
6
9
|
export declare function callerDomain(context: ResolverContext): import("@things-factory/shell").Domain;
|
|
7
10
|
/** Explicitly shared reads do not grant permission to mutate another domain. */
|
|
8
11
|
export declare function readableBizplaceIds(context: ResolverContext): Promise<string[]>;
|
|
@@ -12,13 +12,16 @@ const shell_1 = require("@things-factory/shell");
|
|
|
12
12
|
const utils_1 = require("../../utils");
|
|
13
13
|
const bizplace_1 = require("./bizplace");
|
|
14
14
|
const company_1 = require("../company/company");
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
/** Not found and not yours are one answer - it does not tell whether another domain has it. Said in the reader's words. */
|
|
16
|
+
function accessDenied(context) {
|
|
17
|
+
const fallback = 'Bizplace not found or access denied.';
|
|
18
|
+
const message = context?.t ? String(context.t('error.bizplace-not-accessible', { defaultValue: fallback })) : fallback;
|
|
19
|
+
throw new graphql_1.GraphQLError(message, { extensions: { code: 'FORBIDDEN' } });
|
|
17
20
|
}
|
|
18
21
|
function callerDomain(context) {
|
|
19
22
|
const { domain, user } = context.state;
|
|
20
23
|
if (!domain?.id || !user?.id)
|
|
21
|
-
accessDenied();
|
|
24
|
+
accessDenied(context);
|
|
22
25
|
return domain;
|
|
23
26
|
}
|
|
24
27
|
/** Explicitly shared reads do not grant permission to mutate another domain. */
|
|
@@ -33,13 +36,13 @@ async function readableBizplaceIds(context) {
|
|
|
33
36
|
async function ownedBizplace(context, where, tx) {
|
|
34
37
|
const domain = callerDomain(context);
|
|
35
38
|
if (!where.id && !where.name)
|
|
36
|
-
accessDenied();
|
|
39
|
+
accessDenied(context);
|
|
37
40
|
const row = await (0, shell_1.getRepository)(bizplace_1.Bizplace, tx).findOne({
|
|
38
41
|
where: { ...where, domain: { id: domain.id } },
|
|
39
42
|
relations: ['domain', 'company', 'creator']
|
|
40
43
|
});
|
|
41
44
|
if (!row)
|
|
42
|
-
accessDenied();
|
|
45
|
+
accessDenied(context);
|
|
43
46
|
return row;
|
|
44
47
|
}
|
|
45
48
|
/** Only editable fields reach save; id/domain/audit fields stay server-owned. */
|
|
@@ -50,7 +53,7 @@ function editableBizplace(patch) {
|
|
|
50
53
|
async function accessibleCompany(context, id, tx) {
|
|
51
54
|
const domain = callerDomain(context);
|
|
52
55
|
if (!id)
|
|
53
|
-
accessDenied();
|
|
56
|
+
accessDenied(context);
|
|
54
57
|
const repo = (0, shell_1.getRepository)(company_1.Company, tx);
|
|
55
58
|
const own = await repo.findOneBy({ id, domain: { id: domain.id } });
|
|
56
59
|
if (own)
|
|
@@ -62,7 +65,7 @@ async function accessibleCompany(context, id, tx) {
|
|
|
62
65
|
relations: ['company']
|
|
63
66
|
});
|
|
64
67
|
if (!linked?.company)
|
|
65
|
-
accessDenied();
|
|
68
|
+
accessDenied(context);
|
|
66
69
|
return linked.company;
|
|
67
70
|
}
|
|
68
71
|
//# sourceMappingURL=bizplace-access.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bizplace-access.js","sourceRoot":"","sources":["../../../server/service/bizplace/bizplace-access.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"bizplace-access.js","sourceRoot":"","sources":["../../../server/service/bizplace/bizplace-access.ts"],"names":[],"mappings":"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","sourcesContent":["import { GraphQLError } from 'graphql'\nimport { EntityManager, In } from 'typeorm'\nimport { getRepository } from '@things-factory/shell'\nimport { getPermittedBizplaceIds, getPartnersBizplaces, getPartnersCompanyBizplaces } from '../../utils'\nimport { Bizplace } from './bizplace'\nimport { BizplacePatch } from './bizplace-types'\nimport { Company } from '../company/company'\n\n/** Not found and not yours are one answer - it does not tell whether another domain has it. Said in the reader's words. */\nexport function accessDenied(context?: { t?: (key: string, options?: any) => string }): never {\n const fallback = 'Bizplace not found or access denied.'\n const message = context?.t ? String(context.t('error.bizplace-not-accessible', { defaultValue: fallback })) : fallback\n throw new GraphQLError(message, { extensions: { code: 'FORBIDDEN' } })\n}\n\nexport function callerDomain(context: ResolverContext) {\n const { domain, user } = context.state\n if (!domain?.id || !user?.id) accessDenied(context)\n return domain\n}\n\n/** Explicitly shared reads do not grant permission to mutate another domain. */\nexport async function readableBizplaceIds(context: ResolverContext): Promise<string[]> {\n const domain = callerDomain(context)\n const { user } = context.state\n const permitted = await getPermittedBizplaceIds(domain, user)\n const partners = await getPartnersBizplaces(domain, user)\n const companies = await getPartnersCompanyBizplaces(domain, user, true)\n return [...new Set([...permitted, ...partners.map(b => b?.id), ...companies.map(b => b?.id)].filter(Boolean))]\n}\n\nexport async function ownedBizplace(\n context: ResolverContext,\n where: { id?: string; name?: string },\n tx?: EntityManager\n) {\n const domain = callerDomain(context)\n if (!where.id && !where.name) accessDenied(context)\n const row = await getRepository(Bizplace, tx).findOne({\n where: { ...where, domain: { id: domain.id } },\n relations: ['domain', 'company', 'creator']\n })\n if (!row) accessDenied(context)\n return row\n}\n\n/** Only editable fields reach save; id/domain/audit fields stay server-owned. */\nexport function editableBizplace(patch: BizplacePatch) {\n const { name, description, address, postalCode, latlng, status } = patch\n return Object.fromEntries(\n Object.entries({ name, description, address, postalCode, latlng, status }).filter(([, v]) => v !== undefined)\n )\n}\n\nexport async function accessibleCompany(context: ResolverContext, id: string, tx?: EntityManager): Promise<Company> {\n const domain = callerDomain(context)\n if (!id) accessDenied(context)\n const repo = getRepository(Company, tx)\n const own = await repo.findOneBy({ id, domain: { id: domain.id } })\n if (own) return own\n // Preserve company links exposed through the existing permitted/shared bizplaces.\n const ids = await readableBizplaceIds(context)\n const linked = await getRepository(Bizplace, tx).findOne({\n where: { id: In(ids), company: { id } },\n relations: ['company']\n })\n if (!linked?.company) accessDenied(context)\n return linked.company\n}\n"]}
|
|
@@ -47,10 +47,10 @@ let BizplaceMutation = class BizplaceMutation {
|
|
|
47
47
|
for (const patch of patches) {
|
|
48
48
|
const flag = patch.cuFlag?.toUpperCase();
|
|
49
49
|
if (flag !== '+' && flag !== 'M')
|
|
50
|
-
(0, bizplace_access_1.accessDenied)();
|
|
50
|
+
(0, bizplace_access_1.accessDenied)(context);
|
|
51
51
|
// save with a caller-supplied primary key can update an existing foreign row.
|
|
52
52
|
if (flag === '+' && patch.id)
|
|
53
|
-
(0, bizplace_access_1.accessDenied)();
|
|
53
|
+
(0, bizplace_access_1.accessDenied)(context);
|
|
54
54
|
const existing = flag === 'M' ? await (0, bizplace_access_1.ownedBizplace)(context, { id: patch.id }, tx) : undefined;
|
|
55
55
|
const company = patch.company?.id ? await (0, bizplace_access_1.accessibleCompany)(context, patch.company.id, tx) : existing?.company;
|
|
56
56
|
const result = await repo.save({
|
|
@@ -89,10 +89,10 @@ let BizplaceMutation = class BizplaceMutation {
|
|
|
89
89
|
async deleteBizplace(id, context) {
|
|
90
90
|
const domain = (0, bizplace_access_1.callerDomain)(context);
|
|
91
91
|
if (!id)
|
|
92
|
-
(0, bizplace_access_1.accessDenied)();
|
|
92
|
+
(0, bizplace_access_1.accessDenied)(context);
|
|
93
93
|
const result = await (0, shell_1.getRepository)(bizplace_1.Bizplace).delete({ id, domain: { id: domain.id } });
|
|
94
94
|
if (!result.affected)
|
|
95
|
-
(0, bizplace_access_1.accessDenied)();
|
|
95
|
+
(0, bizplace_access_1.accessDenied)(context);
|
|
96
96
|
return true;
|
|
97
97
|
}
|
|
98
98
|
async deleteBizplaces(ids, context) {
|
|
@@ -101,15 +101,15 @@ let BizplaceMutation = class BizplaceMutation {
|
|
|
101
101
|
return true;
|
|
102
102
|
const uniqueIds = [...new Set(ids)];
|
|
103
103
|
if (uniqueIds.some(id => !id))
|
|
104
|
-
(0, bizplace_access_1.accessDenied)();
|
|
104
|
+
(0, bizplace_access_1.accessDenied)(context);
|
|
105
105
|
await (0, shell_1.getRepository)(bizplace_1.Bizplace).manager.transaction(async (tx) => {
|
|
106
106
|
const repo = tx.getRepository(bizplace_1.Bizplace);
|
|
107
107
|
const where = { id: (0, typeorm_1.In)(uniqueIds), domain: { id: domain.id } };
|
|
108
108
|
if ((await repo.countBy(where)) !== uniqueIds.length)
|
|
109
|
-
(0, bizplace_access_1.accessDenied)();
|
|
109
|
+
(0, bizplace_access_1.accessDenied)(context);
|
|
110
110
|
const result = await repo.delete(where);
|
|
111
111
|
if (result.affected !== uniqueIds.length)
|
|
112
|
-
(0, bizplace_access_1.accessDenied)();
|
|
112
|
+
(0, bizplace_access_1.accessDenied)(context);
|
|
113
113
|
});
|
|
114
114
|
return true;
|
|
115
115
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bizplace-mutation.js","sourceRoot":"","sources":["../../../server/service/bizplace/bizplace-mutation.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arg, Ctx, Directive, Mutation, Resolver } from 'type-graphql'\n\nimport { Domain, getRepository } from '@things-factory/shell'\nimport { In } from 'typeorm'\nimport { slugger } from '@things-factory/utils'\n\nimport { Bizplace } from './bizplace'\nimport { BizplacePatch, NewBizplace } from './bizplace-types'\nimport { accessibleCompany, accessDenied, callerDomain, editableBizplace, ownedBizplace } from './bizplace-access'\n\n@Resolver(Bizplace)\nexport class BizplaceMutation {\n @Directive('@privilege(category: \"bizplace\", privilege: \"mutation\")')\n @Mutation(returns => Bizplace)\n async createBizplace(@Arg('bizplace') bizplace: NewBizplace, @Ctx() context: ResolverContext): Promise<Bizplace> {\n const domain = callerDomain(context)\n const { user } = context.state\n if (bizplace.company && bizplace.company.id) {\n bizplace.company = await accessibleCompany(context, bizplace.company.id)\n }\n\n return await getRepository(Bizplace).save({\n ...editableBizplace(bizplace),\n company: bizplace.company,\n domain,\n creator: user,\n updater: user\n })\n }\n\n @Directive('@privilege(category: \"bizplace\", privilege: \"mutation\")')\n @Mutation(returns => Bizplace)\n async updateBizplace(\n @Arg('name') name: string,\n @Arg('patch') patch: BizplacePatch,\n @Ctx() context: ResolverContext\n ): Promise<Bizplace> {\n callerDomain(context)\n const { user } = context.state\n const bizplace = await ownedBizplace(context, { name })\n\n if (patch.company && patch.company.id) {\n patch.company = await accessibleCompany(context, patch.company.id)\n }\n\n return await getRepository(Bizplace).save({\n ...bizplace,\n ...editableBizplace(patch),\n company: patch.company === undefined ? bizplace.company : patch.company,\n updater: user\n })\n }\n\n @Directive('@privilege(category: \"bizplace\", privilege: \"mutation\")')\n @Mutation(returns => [Bizplace])\n async updateMultipleBizplace(\n @Arg('patches', type => [BizplacePatch]) patches: BizplacePatch[],\n @Ctx() context: ResolverContext\n ): Promise<Bizplace[]> {\n const domain = callerDomain(context)\n const { user } = context.state\n return getRepository(Bizplace).manager.transaction(async tx => {\n const repo = tx.getRepository(Bizplace)\n const results: Bizplace[] = []\n for (const patch of patches) {\n const flag = patch.cuFlag?.toUpperCase()\n if (flag !== '+' && flag !== 'M') accessDenied()\n // save with a caller-supplied primary key can update an existing foreign row.\n if (flag === '+' && patch.id) accessDenied()\n const existing = flag === 'M' ? await ownedBizplace(context, { id: patch.id }, tx) : undefined\n const company = patch.company?.id ? await accessibleCompany(context, patch.company.id, tx) : existing?.company\n const result = await repo.save({\n ...existing,\n ...editableBizplace(patch),\n company,\n domain,\n creator: existing?.creator ?? user,\n updater: user\n })\n results.push({ ...result, cuFlag: flag } as Bizplace)\n }\n return results\n })\n }\n\n @Directive('@privilege(category: \"bizplace\", privilege: \"mutation\")')\n @Mutation(returns => Bizplace)\n async updateBizplaceCheckDomain(\n @Arg('name') name: string,\n @Arg('patch') patch: BizplacePatch,\n @Ctx() context: ResolverContext\n ): Promise<Bizplace> {\n callerDomain(context)\n return getRepository(Bizplace).manager.transaction(async tx => {\n const bizplace = await ownedBizplace(context, { name }, tx)\n const company = patch.company?.id ? await accessibleCompany(context, patch.company.id, tx) : bizplace.company\n if (patch.name !== undefined && bizplace.name !== patch.name) {\n await tx.getRepository(Domain).save({\n ...bizplace.domain,\n name: patch.name,\n subdomain: slugger(patch.name)\n })\n }\n return tx.getRepository(Bizplace).save({\n ...bizplace,\n ...editableBizplace(patch),\n company,\n updater: context.state.user\n })\n })\n }\n\n @Directive('@privilege(category: \"bizplace\", privilege: \"mutation\")')\n @Mutation(returns => Boolean)\n async deleteBizplace(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<Boolean> {\n const domain = callerDomain(context)\n if (!id) accessDenied()\n const result = await getRepository(Bizplace).delete({ id, domain: { id: domain.id } })\n if (!result.affected) accessDenied()\n\n return true\n }\n\n @Directive('@privilege(category: \"bizplace\", privilege: \"mutation\")')\n @Mutation(returns => Boolean)\n async deleteBizplaces(\n @Arg('ids', type => [String]) ids: string[],\n @Ctx() context: ResolverContext\n ): Promise<Boolean> {\n const domain = callerDomain(context)\n if (!ids.length) return true\n const uniqueIds = [...new Set(ids)]\n if (uniqueIds.some(id => !id)) accessDenied()\n await getRepository(Bizplace).manager.transaction(async tx => {\n const repo = tx.getRepository(Bizplace)\n const where = { id: In(uniqueIds), domain: { id: domain.id } }\n if ((await repo.countBy(where)) !== uniqueIds.length) accessDenied()\n const result = await repo.delete(where)\n if (result.affected !== uniqueIds.length) accessDenied()\n })\n\n return true\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"bizplace-mutation.js","sourceRoot":"","sources":["../../../server/service/bizplace/bizplace-mutation.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arg, Ctx, Directive, Mutation, Resolver } from 'type-graphql'\n\nimport { Domain, getRepository } from '@things-factory/shell'\nimport { In } from 'typeorm'\nimport { slugger } from '@things-factory/utils'\n\nimport { Bizplace } from './bizplace'\nimport { BizplacePatch, NewBizplace } from './bizplace-types'\nimport { accessibleCompany, accessDenied, callerDomain, editableBizplace, ownedBizplace } from './bizplace-access'\n\n@Resolver(Bizplace)\nexport class BizplaceMutation {\n @Directive('@privilege(category: \"bizplace\", privilege: \"mutation\")')\n @Mutation(returns => Bizplace)\n async createBizplace(@Arg('bizplace') bizplace: NewBizplace, @Ctx() context: ResolverContext): Promise<Bizplace> {\n const domain = callerDomain(context)\n const { user } = context.state\n if (bizplace.company && bizplace.company.id) {\n bizplace.company = await accessibleCompany(context, bizplace.company.id)\n }\n\n return await getRepository(Bizplace).save({\n ...editableBizplace(bizplace),\n company: bizplace.company,\n domain,\n creator: user,\n updater: user\n })\n }\n\n @Directive('@privilege(category: \"bizplace\", privilege: \"mutation\")')\n @Mutation(returns => Bizplace)\n async updateBizplace(\n @Arg('name') name: string,\n @Arg('patch') patch: BizplacePatch,\n @Ctx() context: ResolverContext\n ): Promise<Bizplace> {\n callerDomain(context)\n const { user } = context.state\n const bizplace = await ownedBizplace(context, { name })\n\n if (patch.company && patch.company.id) {\n patch.company = await accessibleCompany(context, patch.company.id)\n }\n\n return await getRepository(Bizplace).save({\n ...bizplace,\n ...editableBizplace(patch),\n company: patch.company === undefined ? bizplace.company : patch.company,\n updater: user\n })\n }\n\n @Directive('@privilege(category: \"bizplace\", privilege: \"mutation\")')\n @Mutation(returns => [Bizplace])\n async updateMultipleBizplace(\n @Arg('patches', type => [BizplacePatch]) patches: BizplacePatch[],\n @Ctx() context: ResolverContext\n ): Promise<Bizplace[]> {\n const domain = callerDomain(context)\n const { user } = context.state\n return getRepository(Bizplace).manager.transaction(async tx => {\n const repo = tx.getRepository(Bizplace)\n const results: Bizplace[] = []\n for (const patch of patches) {\n const flag = patch.cuFlag?.toUpperCase()\n if (flag !== '+' && flag !== 'M') accessDenied(context)\n // save with a caller-supplied primary key can update an existing foreign row.\n if (flag === '+' && patch.id) accessDenied(context)\n const existing = flag === 'M' ? await ownedBizplace(context, { id: patch.id }, tx) : undefined\n const company = patch.company?.id ? await accessibleCompany(context, patch.company.id, tx) : existing?.company\n const result = await repo.save({\n ...existing,\n ...editableBizplace(patch),\n company,\n domain,\n creator: existing?.creator ?? user,\n updater: user\n })\n results.push({ ...result, cuFlag: flag } as Bizplace)\n }\n return results\n })\n }\n\n @Directive('@privilege(category: \"bizplace\", privilege: \"mutation\")')\n @Mutation(returns => Bizplace)\n async updateBizplaceCheckDomain(\n @Arg('name') name: string,\n @Arg('patch') patch: BizplacePatch,\n @Ctx() context: ResolverContext\n ): Promise<Bizplace> {\n callerDomain(context)\n return getRepository(Bizplace).manager.transaction(async tx => {\n const bizplace = await ownedBizplace(context, { name }, tx)\n const company = patch.company?.id ? await accessibleCompany(context, patch.company.id, tx) : bizplace.company\n if (patch.name !== undefined && bizplace.name !== patch.name) {\n await tx.getRepository(Domain).save({\n ...bizplace.domain,\n name: patch.name,\n subdomain: slugger(patch.name)\n })\n }\n return tx.getRepository(Bizplace).save({\n ...bizplace,\n ...editableBizplace(patch),\n company,\n updater: context.state.user\n })\n })\n }\n\n @Directive('@privilege(category: \"bizplace\", privilege: \"mutation\")')\n @Mutation(returns => Boolean)\n async deleteBizplace(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<Boolean> {\n const domain = callerDomain(context)\n if (!id) accessDenied(context)\n const result = await getRepository(Bizplace).delete({ id, domain: { id: domain.id } })\n if (!result.affected) accessDenied(context)\n\n return true\n }\n\n @Directive('@privilege(category: \"bizplace\", privilege: \"mutation\")')\n @Mutation(returns => Boolean)\n async deleteBizplaces(\n @Arg('ids', type => [String]) ids: string[],\n @Ctx() context: ResolverContext\n ): Promise<Boolean> {\n const domain = callerDomain(context)\n if (!ids.length) return true\n const uniqueIds = [...new Set(ids)]\n if (uniqueIds.some(id => !id)) accessDenied(context)\n await getRepository(Bizplace).manager.transaction(async tx => {\n const repo = tx.getRepository(Bizplace)\n const where = { id: In(uniqueIds), domain: { id: domain.id } }\n if ((await repo.countBy(where)) !== uniqueIds.length) accessDenied(context)\n const result = await repo.delete(where)\n if (result.affected !== uniqueIds.length) accessDenied(context)\n })\n\n return true\n }\n}\n"]}
|
|
@@ -85,7 +85,7 @@ let BizplaceQuery = class BizplaceQuery {
|
|
|
85
85
|
}
|
|
86
86
|
async bizplace(id, context) {
|
|
87
87
|
if (!(await (0, bizplace_access_1.readableBizplaceIds)(context)).includes(id))
|
|
88
|
-
(0, bizplace_access_1.accessDenied)();
|
|
88
|
+
(0, bizplace_access_1.accessDenied)(context);
|
|
89
89
|
return await (0, shell_1.getRepository)(bizplace_1.Bizplace).findOne({
|
|
90
90
|
where: { id },
|
|
91
91
|
relations: ['company', 'domain', 'users', 'users.roles', 'creator', 'updater']
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bizplace-query.js","sourceRoot":"","sources":["../../../server/service/bizplace/bizplace-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arg, Args, Ctx, Directive, Query, Resolver } from 'type-graphql'\nimport { EntityManager, FindManyOptions, In, Not, Repository } from 'typeorm'\n\nimport { User, UserList } from '@things-factory/auth-base'\nimport { convertListParams, getRepository, ListParam } from '@things-factory/shell'\n\nimport {\n getMyBizplace,\n getPartnerBizplaceIds,\n getPartnersBizplaces,\n getPartnersCompanyBizplaces,\n getPermittedBizplaceIds,\n getUserBizplaces\n} from '../../utils'\nimport { Bizplace } from './bizplace'\nimport { BizplaceList } from './bizplace-types'\nimport { accessDenied, readableBizplaceIds } from './bizplace-access'\n\n@Resolver(Bizplace)\nexport class BizplaceQuery {\n @Directive('@privilege(category: \"bizplace\", privilege: \"query\")')\n @Query(returns => [Bizplace])\n async customerBizplaces(@Ctx() context: ResolverContext): Promise<Bizplace[]> {\n const { domain, user } = context.state\n return await getRepository(Bizplace).find({\n where: {\n domain: { id: domain.id },\n id: Not(In([await getMyBizplace(domain, user)]))\n },\n relations: ['domain', 'creator', 'updater']\n })\n }\n\n @Directive('@privilege(category: \"bizplace\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => Bizplace)\n async businessBizplace(@Ctx() context: ResolverContext): Promise<Bizplace> {\n const { domain, user } = context.state\n const myBizplace = await getMyBizplace(domain, user)\n return await getRepository(Bizplace).findOne({\n where: { id: myBizplace.id },\n relations: ['company', 'domain', 'users', 'creator', 'updater']\n })\n }\n\n /* TODO make it work */\n @Directive('@privilege(category: \"bizplace\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => [Bizplace])\n async userBizplaces(@Arg('email') email: string, @Ctx() context: ResolverContext): Promise<Bizplace[]> {\n const { domain } = context.state\n\n const user: User = await getRepository(User).findOneBy({\n email: email != '' ? email : context.state.user.email\n })\n\n const allowed = new Set(await readableBizplaceIds(context))\n return (await getUserBizplaces(user)).filter(b => b && allowed.has(b.id))\n\n // const bizplaces = await getRepository(Bizplace).find({ domain })\n // // const userBizplaces = user.bizplaces\n // return bizplaces.map((bizplace: Bizplace) => {\n // return {\n // id: bizplace.id,\n // name: bizplace.name,\n // description: bizplace.description,\n // userBizplaceId: userBizplaces\n // .map(userBiz => userBiz.bizplace.id)\n // .slice(0, 1)\n // .shift(),\n // assigned: userBizplaces.filter((userBizplace: Bizplace) => userBizplace.id === bizplace.id).length > 0\n // }\n // })\n }\n\n @Directive('@privilege(category: \"bizplace\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => BizplaceList)\n async bizplaces(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<BizplaceList> {\n let bizplace_ids = []\n let bizplaceIndex: any = params.filters.findIndex(x => x.name === 'bizplace')\n if (bizplaceIndex > -1) {\n bizplace_ids = params.filters\n .filter(x => x.name === 'bizplace')\n .map(item => {\n return item.value\n })\n params.filters.splice(bizplaceIndex, 1)\n }\n\n const convertedParams = convertListParams(params)\n\n let domainIndex: any = params.filters.findIndex(x => x.name === 'domain')\n if (domainIndex > -1) {\n convertedParams.where.id = In(await getPartnerBizplaceIds(context.state.domain, context.state.user))\n } else {\n if (!(bizplace_ids.length > 0))\n convertedParams.where.id = In(await getPermittedBizplaceIds(context.state.domain, context.state.user))\n else {\n const permitted = new Set(await getPermittedBizplaceIds(context.state.domain, context.state.user))\n convertedParams.where.id = In(bizplace_ids.filter(id => permitted.has(id)))\n }\n }\n\n const [items, total] = await getRepository(Bizplace).findAndCount({\n ...convertedParams,\n relations: ['domain', 'company', 'users', 'creator', 'updater']\n })\n\n return { items, total }\n }\n\n @Directive('@privilege(category: \"bizplace\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => Bizplace)\n async bizplace(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<Bizplace> {\n if (!(await readableBizplaceIds(context)).includes(id)) accessDenied()\n return await getRepository(Bizplace).findOne({\n where: { id },\n relations: ['company', 'domain', 'users', 'users.roles', 'creator', 'updater']\n })\n }\n\n /* The users of a bizplace with their roles and privileges - who may hold what is the user admin's (ADR-0139). */\n @Directive('@privilege(category: \"user\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => UserList)\n async bizplaceUsers(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<UserList> {\n const { domain, user } = context.state\n const myBizplace: Bizplace = await getMyBizplace(domain, user)\n return await bizplaceUsers(myBizplace, {\n ...(await convertListParams(params)),\n relations: ['domain', 'domains', 'roles', 'roles.privileges', 'roles.users']\n })\n }\n\n @Directive('@privilege(category: \"bizplace\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => BizplaceList)\n async partnersBizplaces(\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<BizplaceList> {\n let partnersBizplaceIds = []\n let bizplaceIndex: any = params.filters.findIndex(x => x.name === 'bizplace')\n if (bizplaceIndex > -1) {\n partnersBizplaceIds = params.filters\n .filter(x => x.name === 'bizplace')\n .map(item => {\n return item.value\n })\n params.filters.splice(bizplaceIndex, 1)\n }\n\n const allowed = new Set(\n (await getPartnersBizplaces(context.state.domain, context.state.user)).filter(Boolean).map(b => b.id)\n )\n if (partnersBizplaceIds.length) partnersBizplaceIds = partnersBizplaceIds.filter(id => allowed.has(id))\n else partnersBizplaceIds = [...allowed]\n const convertedParams = convertListParams(params, { searchables: ['name', 'description'] })\n convertedParams.where.id = In(partnersBizplaceIds)\n\n const [items, total] = await getRepository(Bizplace).findAndCount({\n ...convertedParams,\n relations: ['domain', 'company', 'users', 'creator', 'updater']\n })\n\n return { items, total }\n }\n\n @Directive('@privilege(category: \"bizplace\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => BizplaceList)\n async permittedPartnersCompanyBizplaces(\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<BizplaceList> {\n let partnersBizplaceIds = []\n let bizplaceIndex: any = params.filters.findIndex(x => x.name === 'bizplace')\n if (bizplaceIndex > -1) {\n partnersBizplaceIds = params.filters\n .filter(x => x.name === 'bizplace')\n .map(item => {\n return item.value\n })\n params.filters.splice(bizplaceIndex, 1)\n }\n\n const convertedParams = convertListParams(params)\n\n if (!(partnersBizplaceIds.length > 0)) {\n const partnersBizplaces: Bizplace[] = await getPartnersCompanyBizplaces(\n context.state.domain,\n context.state.user,\n true\n )\n partnersBizplaceIds = partnersBizplaces.map((bizplace: Bizplace) => bizplace.id || null)\n convertedParams.where.id = In(partnersBizplaceIds)\n } else {\n const allowed = new Set(\n (await getPartnersCompanyBizplaces(context.state.domain, context.state.user, true))\n .filter(Boolean)\n .map(b => b.id)\n )\n convertedParams.where.id = In(partnersBizplaceIds.filter(id => allowed.has(id)))\n }\n\n const [items, total] = await getRepository(Bizplace).findAndCount({\n ...convertedParams,\n relations: ['domain', 'company', 'users', 'creator', 'updater']\n })\n\n return { items, total }\n }\n}\n\nexport async function bizplaceUsers(\n bizplace: Bizplace,\n params: FindManyOptions<User>,\n trxMgr?: EntityManager\n): Promise<{ items: User[]; total: number }> {\n const bizplaceRepo: Repository<Bizplace> = trxMgr?.getRepository(Bizplace) || getRepository(Bizplace)\n const userRepo: Repository<User> = trxMgr?.getRepository(User) || getRepository(User)\n\n if (!bizplace?.users?.length) {\n bizplace = await bizplaceRepo.findOne({\n where: { id: bizplace.id },\n relations: ['users']\n })\n }\n const users: User[] = bizplace.users\n const userIds: string[] = users.map((user: User) => user.id)\n\n const [items, total] = await userRepo.findAndCount({\n ...params,\n where: {\n ...(params.where as any),\n id: In(userIds)\n }\n })\n\n return {\n items,\n total\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"bizplace-query.js","sourceRoot":"","sources":["../../../server/service/bizplace/bizplace-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arg, Args, Ctx, Directive, Query, Resolver } from 'type-graphql'\nimport { EntityManager, FindManyOptions, In, Not, Repository } from 'typeorm'\n\nimport { User, UserList } from '@things-factory/auth-base'\nimport { convertListParams, getRepository, ListParam } from '@things-factory/shell'\n\nimport {\n getMyBizplace,\n getPartnerBizplaceIds,\n getPartnersBizplaces,\n getPartnersCompanyBizplaces,\n getPermittedBizplaceIds,\n getUserBizplaces\n} from '../../utils'\nimport { Bizplace } from './bizplace'\nimport { BizplaceList } from './bizplace-types'\nimport { accessDenied, readableBizplaceIds } from './bizplace-access'\n\n@Resolver(Bizplace)\nexport class BizplaceQuery {\n @Directive('@privilege(category: \"bizplace\", privilege: \"query\")')\n @Query(returns => [Bizplace])\n async customerBizplaces(@Ctx() context: ResolverContext): Promise<Bizplace[]> {\n const { domain, user } = context.state\n return await getRepository(Bizplace).find({\n where: {\n domain: { id: domain.id },\n id: Not(In([await getMyBizplace(domain, user)]))\n },\n relations: ['domain', 'creator', 'updater']\n })\n }\n\n @Directive('@privilege(category: \"bizplace\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => Bizplace)\n async businessBizplace(@Ctx() context: ResolverContext): Promise<Bizplace> {\n const { domain, user } = context.state\n const myBizplace = await getMyBizplace(domain, user)\n return await getRepository(Bizplace).findOne({\n where: { id: myBizplace.id },\n relations: ['company', 'domain', 'users', 'creator', 'updater']\n })\n }\n\n /* TODO make it work */\n @Directive('@privilege(category: \"bizplace\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => [Bizplace])\n async userBizplaces(@Arg('email') email: string, @Ctx() context: ResolverContext): Promise<Bizplace[]> {\n const { domain } = context.state\n\n const user: User = await getRepository(User).findOneBy({\n email: email != '' ? email : context.state.user.email\n })\n\n const allowed = new Set(await readableBizplaceIds(context))\n return (await getUserBizplaces(user)).filter(b => b && allowed.has(b.id))\n\n // const bizplaces = await getRepository(Bizplace).find({ domain })\n // // const userBizplaces = user.bizplaces\n // return bizplaces.map((bizplace: Bizplace) => {\n // return {\n // id: bizplace.id,\n // name: bizplace.name,\n // description: bizplace.description,\n // userBizplaceId: userBizplaces\n // .map(userBiz => userBiz.bizplace.id)\n // .slice(0, 1)\n // .shift(),\n // assigned: userBizplaces.filter((userBizplace: Bizplace) => userBizplace.id === bizplace.id).length > 0\n // }\n // })\n }\n\n @Directive('@privilege(category: \"bizplace\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => BizplaceList)\n async bizplaces(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<BizplaceList> {\n let bizplace_ids = []\n let bizplaceIndex: any = params.filters.findIndex(x => x.name === 'bizplace')\n if (bizplaceIndex > -1) {\n bizplace_ids = params.filters\n .filter(x => x.name === 'bizplace')\n .map(item => {\n return item.value\n })\n params.filters.splice(bizplaceIndex, 1)\n }\n\n const convertedParams = convertListParams(params)\n\n let domainIndex: any = params.filters.findIndex(x => x.name === 'domain')\n if (domainIndex > -1) {\n convertedParams.where.id = In(await getPartnerBizplaceIds(context.state.domain, context.state.user))\n } else {\n if (!(bizplace_ids.length > 0))\n convertedParams.where.id = In(await getPermittedBizplaceIds(context.state.domain, context.state.user))\n else {\n const permitted = new Set(await getPermittedBizplaceIds(context.state.domain, context.state.user))\n convertedParams.where.id = In(bizplace_ids.filter(id => permitted.has(id)))\n }\n }\n\n const [items, total] = await getRepository(Bizplace).findAndCount({\n ...convertedParams,\n relations: ['domain', 'company', 'users', 'creator', 'updater']\n })\n\n return { items, total }\n }\n\n @Directive('@privilege(category: \"bizplace\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => Bizplace)\n async bizplace(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<Bizplace> {\n if (!(await readableBizplaceIds(context)).includes(id)) accessDenied(context)\n return await getRepository(Bizplace).findOne({\n where: { id },\n relations: ['company', 'domain', 'users', 'users.roles', 'creator', 'updater']\n })\n }\n\n /* The users of a bizplace with their roles and privileges - who may hold what is the user admin's (ADR-0139). */\n @Directive('@privilege(category: \"user\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => UserList)\n async bizplaceUsers(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<UserList> {\n const { domain, user } = context.state\n const myBizplace: Bizplace = await getMyBizplace(domain, user)\n return await bizplaceUsers(myBizplace, {\n ...(await convertListParams(params)),\n relations: ['domain', 'domains', 'roles', 'roles.privileges', 'roles.users']\n })\n }\n\n @Directive('@privilege(category: \"bizplace\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => BizplaceList)\n async partnersBizplaces(\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<BizplaceList> {\n let partnersBizplaceIds = []\n let bizplaceIndex: any = params.filters.findIndex(x => x.name === 'bizplace')\n if (bizplaceIndex > -1) {\n partnersBizplaceIds = params.filters\n .filter(x => x.name === 'bizplace')\n .map(item => {\n return item.value\n })\n params.filters.splice(bizplaceIndex, 1)\n }\n\n const allowed = new Set(\n (await getPartnersBizplaces(context.state.domain, context.state.user)).filter(Boolean).map(b => b.id)\n )\n if (partnersBizplaceIds.length) partnersBizplaceIds = partnersBizplaceIds.filter(id => allowed.has(id))\n else partnersBizplaceIds = [...allowed]\n const convertedParams = convertListParams(params, { searchables: ['name', 'description'] })\n convertedParams.where.id = In(partnersBizplaceIds)\n\n const [items, total] = await getRepository(Bizplace).findAndCount({\n ...convertedParams,\n relations: ['domain', 'company', 'users', 'creator', 'updater']\n })\n\n return { items, total }\n }\n\n @Directive('@privilege(category: \"bizplace\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => BizplaceList)\n async permittedPartnersCompanyBizplaces(\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<BizplaceList> {\n let partnersBizplaceIds = []\n let bizplaceIndex: any = params.filters.findIndex(x => x.name === 'bizplace')\n if (bizplaceIndex > -1) {\n partnersBizplaceIds = params.filters\n .filter(x => x.name === 'bizplace')\n .map(item => {\n return item.value\n })\n params.filters.splice(bizplaceIndex, 1)\n }\n\n const convertedParams = convertListParams(params)\n\n if (!(partnersBizplaceIds.length > 0)) {\n const partnersBizplaces: Bizplace[] = await getPartnersCompanyBizplaces(\n context.state.domain,\n context.state.user,\n true\n )\n partnersBizplaceIds = partnersBizplaces.map((bizplace: Bizplace) => bizplace.id || null)\n convertedParams.where.id = In(partnersBizplaceIds)\n } else {\n const allowed = new Set(\n (await getPartnersCompanyBizplaces(context.state.domain, context.state.user, true))\n .filter(Boolean)\n .map(b => b.id)\n )\n convertedParams.where.id = In(partnersBizplaceIds.filter(id => allowed.has(id)))\n }\n\n const [items, total] = await getRepository(Bizplace).findAndCount({\n ...convertedParams,\n relations: ['domain', 'company', 'users', 'creator', 'updater']\n })\n\n return { items, total }\n }\n}\n\nexport async function bizplaceUsers(\n bizplace: Bizplace,\n params: FindManyOptions<User>,\n trxMgr?: EntityManager\n): Promise<{ items: User[]; total: number }> {\n const bizplaceRepo: Repository<Bizplace> = trxMgr?.getRepository(Bizplace) || getRepository(Bizplace)\n const userRepo: Repository<User> = trxMgr?.getRepository(User) || getRepository(User)\n\n if (!bizplace?.users?.length) {\n bizplace = await bizplaceRepo.findOne({\n where: { id: bizplace.id },\n relations: ['users']\n })\n }\n const users: User[] = bizplace.users\n const userIds: string[] = users.map((user: User) => user.id)\n\n const [items, total] = await userRepo.findAndCount({\n ...params,\n where: {\n ...(params.where as any),\n id: In(userIds)\n }\n })\n\n return {\n items,\n total\n }\n}\n"]}
|
|
@@ -196,6 +196,9 @@ async function saveOurCompany(patch, domain, user, tx) {
|
|
|
196
196
|
const name = words.name ?? current?.name;
|
|
197
197
|
if (!name)
|
|
198
198
|
throw new shell_1.Refusal('company-name-required', {}, 'a company needs a name');
|
|
199
|
+
const clash = await repository.findOne({ where: { domain: { id: domain.id }, name } });
|
|
200
|
+
if (clash && clash.id !== current?.id)
|
|
201
|
+
throw new shell_1.Refusal('company-name-taken', { value: name }, `name: ${name} is already another company's`);
|
|
199
202
|
return await repository.save({ ...(current ?? { domain, creator: user }), ...words, updater: user });
|
|
200
203
|
}
|
|
201
204
|
//# sourceMappingURL=company-mutation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"company-mutation.js","sourceRoot":"","sources":["../../../server/service/company/company-mutation.ts"],"names":[],"mappings":"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","sourcesContent":["import type { FileUpload } from 'graphql-upload/GraphQLUpload.js'\nimport GraphQLUpload from 'graphql-upload/GraphQLUpload.js'\nimport { Arg, Ctx, Directive, Mutation, Resolver, UseMiddleware } from 'type-graphql'\nimport { EntityManager, Repository } from 'typeorm'\n\nimport { Attachment, replaceAttachment } from '@things-factory/attachment-base'\nimport { User } from '@things-factory/auth-base'\nimport { Domain, getRepository, Refusal, SpeakRefusals } from '@things-factory/shell'\nimport { slugger } from '@things-factory/utils'\n\nimport { Company } from './company'\nimport { CompanyPatch, NewCompany } from './company-types'\nimport { COMPANY_SEAL_REF_TYPE, ourCompanyOf } from './our-company'\n\n@Resolver(Company)\n@UseMiddleware(SpeakRefusals)\nexport class CompanyMutation {\n @Directive('@privilege(category: \"company\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Directive('@auditTarget(kind: \"Company\", arg: \"company\")')\n @Directive('@transaction')\n @Mutation(returns => Company, { description: \"To keep 「우리 회사」 - this domain's own company, made on its first save (ADR-0176)\" })\n async saveCompany(@Arg('company') company: CompanyPatch, @Ctx() context: ResolverContext): Promise<Company> {\n const { domain, user, tx } = context.state\n return await saveOurCompany(company, domain, user, tx)\n }\n\n @Directive('@privilege(category: \"company\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Directive('@auditTarget(kind: \"Company\", arg: \"companyId\")')\n @Directive('@transaction')\n @Mutation(returns => Attachment, { nullable: true, description: 'To put the seal (직인) on 「우리 회사」, replacing the one it had; no file takes it away' })\n async attachCompanySeal(\n @Arg('companyId') companyId: string,\n @Arg('file', type => GraphQLUpload, { nullable: true }) file: FileUpload | null,\n @Ctx() context: ResolverContext\n ): Promise<Attachment | null> {\n const { domain, tx } = context.state\n const company = await ourCompanyOf(domain, tx)\n if (!company || company.id !== companyId) throw new Refusal('company-not-found', {}, 'save the company first')\n return await replaceAttachment({ file, refType: COMPANY_SEAL_REF_TYPE, refBy: company.id, category: 'seal' }, context)\n }\n\n @Directive('@privilege(category: \"company\", privilege: \"mutation\")')\n @Directive('@transaction')\n @Mutation(returns => Company)\n async createCompany(@Arg('company') company: NewCompany, @Ctx() context: ResolverContext): Promise<Company> {\n const { domain, user, tx } = context.state\n return await createCompany(company, domain, user, tx)\n }\n\n @Directive('@privilege(category: \"company\", privilege: \"mutation\")')\n @Directive('@transaction')\n @Mutation(returns => Company)\n async updateCompany(\n @Arg('name') name: string,\n @Arg('patch') patch: CompanyPatch,\n @Ctx() context: ResolverContext\n ): Promise<Company> {\n const { domain, user, tx } = context.state\n return await updateCompany(name, patch, domain, user, tx)\n }\n\n @Directive('@privilege(category: \"company\", privilege: \"mutation\")')\n @Directive('@transaction')\n @Mutation(returns => [Company])\n async updateMultipleCompany(\n @Arg('patches', type => [CompanyPatch]) patches: CompanyPatch[],\n @Ctx() context: ResolverContext\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\n if (_createRecords.length > 0) {\n for (let i = 0; i < _createRecords.length; i++) {\n const patch: CompanyPatch = _createRecords[i]\n const result = await this.createCompany(patch as NewCompany, context)\n results.push({ ...result, cuFlag: '+' })\n }\n }\n\n if (_updateRecords.length > 0) {\n for (let i = 0; i < _updateRecords.length; i++) {\n const patch: CompanyPatch = _updateRecords[i]\n const result = await this.updateCompany(patch.name, patch, context)\n results.push({ ...result, cuFlag: 'M' })\n }\n }\n\n return results\n }\n\n @Directive('@privilege(category: \"company\", privilege: \"mutation\")')\n @Directive('@transaction')\n @Mutation(returns => Boolean)\n async deleteCompany(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<Boolean> {\n await deleteCompany(id, context.state.tx)\n\n return true\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"company\", privilege: \"mutation\")')\n @Mutation(returns => Boolean)\n async deleteCompanies(\n @Arg('ids', type => [String]) ids: string[],\n @Ctx() context: ResolverContext\n ): Promise<Boolean> {\n await deleteCompanies(ids, context.state.tx)\n\n return true\n }\n}\n\nexport async function createCompany(company: NewCompany, domain: Domain, user: User, tx?: EntityManager) {\n const companyRepository: Repository<Company> = tx ? tx.getRepository(Company) : getRepository(Company)\n const domainRepository: Repository<Domain> = tx ? tx.getRepository(Domain) : getRepository(Domain)\n\n const companyDomain: Domain = await domainRepository.save({\n subdomain: slugger(company.name),\n name: company.name\n })\n\n return await companyRepository.save({\n ...company,\n domain: companyDomain,\n creator: user,\n updater: user\n })\n}\n\nexport async function updateCompany(name: string, patch: CompanyPatch, domain: Domain, user: User, tx?: EntityManager) {\n const repository: Repository<Company> = tx ? tx.getRepository(Company) : getRepository(Company)\n const company = await repository.findOneBy({\n domain: { id: domain.id },\n name\n })\n\n return repository.save({\n ...company,\n ...patch,\n updater: user\n })\n}\n\nexport async function deleteCompanies(ids: string[], tx?: EntityManager) {\n const repository = tx ? tx.getRepository(Company) : getRepository(Company)\n return await repository.delete(ids)\n}\n\nexport async function deleteCompany(id: string, tx?: EntityManager) {\n const repository: Repository<Company> = tx ? tx.getRepository(Company) : getRepository(Company)\n return await repository.delete(id)\n}\n\n/** The words 「우리 회사」 keeps - what a save may set. */\nexport const OUR_COMPANY_FIELDS = ['name', 'representative', 'brn', 'corporateRegistrationNumber', 'address', 'phone'] as const\n\n/**\n * Keep this domain's own company: its row, made on the first save. Only the fields of 「우리 회사」 are taken, trimmed;\n * a name is required - a document cannot print a company without one.\n */\nexport async function saveOurCompany(patch: Partial<Company>, domain: Domain, user: User, tx: EntityManager): Promise<Company> {\n const repository = tx.getRepository(Company)\n const current = await ourCompanyOf(domain, tx)\n const words: Partial<Company> = {}\n for (const field of OUR_COMPANY_FIELDS) {\n const value = patch[field]\n if (value === undefined) continue\n words[field] = typeof value === 'string' ? value.trim() : value\n }\n const name = words.name ?? current?.name\n if (!name) throw new Refusal('company-name-required', {}, 'a company needs a name')\n return await repository.save({ ...(current ?? { domain, creator: user }), ...words, updater: user } as Company)\n}\n"]}
|
|
1
|
+
{"version":3,"file":"company-mutation.js","sourceRoot":"","sources":["../../../server/service/company/company-mutation.ts"],"names":[],"mappings":"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","sourcesContent":["import type { FileUpload } from 'graphql-upload/GraphQLUpload.js'\nimport GraphQLUpload from 'graphql-upload/GraphQLUpload.js'\nimport { Arg, Ctx, Directive, Mutation, Resolver, UseMiddleware } from 'type-graphql'\nimport { EntityManager, Repository } from 'typeorm'\n\nimport { Attachment, replaceAttachment } from '@things-factory/attachment-base'\nimport { User } from '@things-factory/auth-base'\nimport { Domain, getRepository, Refusal, SpeakRefusals } from '@things-factory/shell'\nimport { slugger } from '@things-factory/utils'\n\nimport { Company } from './company'\nimport { CompanyPatch, NewCompany } from './company-types'\nimport { COMPANY_SEAL_REF_TYPE, ourCompanyOf } from './our-company'\n\n@Resolver(Company)\n@UseMiddleware(SpeakRefusals)\nexport class CompanyMutation {\n @Directive('@privilege(category: \"company\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Directive('@auditTarget(kind: \"Company\", arg: \"company\")')\n @Directive('@transaction')\n @Mutation(returns => Company, { description: \"To keep 「우리 회사」 - this domain's own company, made on its first save (ADR-0176)\" })\n async saveCompany(@Arg('company') company: CompanyPatch, @Ctx() context: ResolverContext): Promise<Company> {\n const { domain, user, tx } = context.state\n return await saveOurCompany(company, domain, user, tx)\n }\n\n @Directive('@privilege(category: \"company\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Directive('@auditTarget(kind: \"Company\", arg: \"companyId\")')\n @Directive('@transaction')\n @Mutation(returns => Attachment, { nullable: true, description: 'To put the seal (직인) on 「우리 회사」, replacing the one it had; no file takes it away' })\n async attachCompanySeal(\n @Arg('companyId') companyId: string,\n @Arg('file', type => GraphQLUpload, { nullable: true }) file: FileUpload | null,\n @Ctx() context: ResolverContext\n ): Promise<Attachment | null> {\n const { domain, tx } = context.state\n const company = await ourCompanyOf(domain, tx)\n if (!company || company.id !== companyId) throw new Refusal('company-not-found', {}, 'save the company first')\n return await replaceAttachment({ file, refType: COMPANY_SEAL_REF_TYPE, refBy: company.id, category: 'seal' }, context)\n }\n\n @Directive('@privilege(category: \"company\", privilege: \"mutation\")')\n @Directive('@transaction')\n @Mutation(returns => Company)\n async createCompany(@Arg('company') company: NewCompany, @Ctx() context: ResolverContext): Promise<Company> {\n const { domain, user, tx } = context.state\n return await createCompany(company, domain, user, tx)\n }\n\n @Directive('@privilege(category: \"company\", privilege: \"mutation\")')\n @Directive('@transaction')\n @Mutation(returns => Company)\n async updateCompany(\n @Arg('name') name: string,\n @Arg('patch') patch: CompanyPatch,\n @Ctx() context: ResolverContext\n ): Promise<Company> {\n const { domain, user, tx } = context.state\n return await updateCompany(name, patch, domain, user, tx)\n }\n\n @Directive('@privilege(category: \"company\", privilege: \"mutation\")')\n @Directive('@transaction')\n @Mutation(returns => [Company])\n async updateMultipleCompany(\n @Arg('patches', type => [CompanyPatch]) patches: CompanyPatch[],\n @Ctx() context: ResolverContext\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\n if (_createRecords.length > 0) {\n for (let i = 0; i < _createRecords.length; i++) {\n const patch: CompanyPatch = _createRecords[i]\n const result = await this.createCompany(patch as NewCompany, context)\n results.push({ ...result, cuFlag: '+' })\n }\n }\n\n if (_updateRecords.length > 0) {\n for (let i = 0; i < _updateRecords.length; i++) {\n const patch: CompanyPatch = _updateRecords[i]\n const result = await this.updateCompany(patch.name, patch, context)\n results.push({ ...result, cuFlag: 'M' })\n }\n }\n\n return results\n }\n\n @Directive('@privilege(category: \"company\", privilege: \"mutation\")')\n @Directive('@transaction')\n @Mutation(returns => Boolean)\n async deleteCompany(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<Boolean> {\n await deleteCompany(id, context.state.tx)\n\n return true\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"company\", privilege: \"mutation\")')\n @Mutation(returns => Boolean)\n async deleteCompanies(\n @Arg('ids', type => [String]) ids: string[],\n @Ctx() context: ResolverContext\n ): Promise<Boolean> {\n await deleteCompanies(ids, context.state.tx)\n\n return true\n }\n}\n\nexport async function createCompany(company: NewCompany, domain: Domain, user: User, tx?: EntityManager) {\n const companyRepository: Repository<Company> = tx ? tx.getRepository(Company) : getRepository(Company)\n const domainRepository: Repository<Domain> = tx ? tx.getRepository(Domain) : getRepository(Domain)\n\n const companyDomain: Domain = await domainRepository.save({\n subdomain: slugger(company.name),\n name: company.name\n })\n\n return await companyRepository.save({\n ...company,\n domain: companyDomain,\n creator: user,\n updater: user\n })\n}\n\nexport async function updateCompany(name: string, patch: CompanyPatch, domain: Domain, user: User, tx?: EntityManager) {\n const repository: Repository<Company> = tx ? tx.getRepository(Company) : getRepository(Company)\n const company = await repository.findOneBy({\n domain: { id: domain.id },\n name\n })\n\n return repository.save({\n ...company,\n ...patch,\n updater: user\n })\n}\n\nexport async function deleteCompanies(ids: string[], tx?: EntityManager) {\n const repository = tx ? tx.getRepository(Company) : getRepository(Company)\n return await repository.delete(ids)\n}\n\nexport async function deleteCompany(id: string, tx?: EntityManager) {\n const repository: Repository<Company> = tx ? tx.getRepository(Company) : getRepository(Company)\n return await repository.delete(id)\n}\n\n/** The words 「우리 회사」 keeps - what a save may set. */\nexport const OUR_COMPANY_FIELDS = ['name', 'representative', 'brn', 'corporateRegistrationNumber', 'address', 'phone'] as const\n\n/**\n * Keep this domain's own company: its row, made on the first save. Only the fields of 「우리 회사」 are taken, trimmed;\n * a name is required - a document cannot print a company without one.\n */\nexport async function saveOurCompany(patch: Partial<Company>, domain: Domain, user: User, tx: EntityManager): Promise<Company> {\n const repository = tx.getRepository(Company)\n const current = await ourCompanyOf(domain, tx)\n const words: Partial<Company> = {}\n for (const field of OUR_COMPANY_FIELDS) {\n const value = patch[field]\n if (value === undefined) continue\n words[field] = typeof value === 'string' ? value.trim() : value\n }\n const name = words.name ?? current?.name\n if (!name) throw new Refusal('company-name-required', {}, 'a company needs a name')\n const clash = await repository.findOne({ where: { domain: { id: domain.id }, name } })\n if (clash && clash.id !== current?.id) throw new Refusal('company-name-taken', { value: name }, `name: ${name} is already another company's`)\n return await repository.save({ ...(current ?? { domain, creator: user }), ...words, updater: user } as Company)\n}\n"]}
|
|
@@ -10,7 +10,8 @@ const bizplace_1 = require("../bizplace/bizplace");
|
|
|
10
10
|
/*
|
|
11
11
|
* A company and, for a domain, 「우리 회사」 (ADR-0176 decision 4): the one place its name, representative, registration
|
|
12
12
|
* numbers, address, phone and seal are kept. Quotations, invoices, pay slips and every official document read them from
|
|
13
|
-
* here (`our-company.ts`); the seal is an attachment of the row (`COMPANY_SEAL_REF_TYPE`).
|
|
13
|
+
* here (`our-company.ts`); the seal is an attachment of the row (`COMPANY_SEAL_REF_TYPE`). A name is unique in its
|
|
14
|
+
* domain, not across domains - two businesses may share a trade name.
|
|
14
15
|
*/
|
|
15
16
|
let Company = class Company {
|
|
16
17
|
};
|
|
@@ -132,7 +133,7 @@ tslib_1.__decorate([
|
|
|
132
133
|
], Company.prototype, "updatedAt", void 0);
|
|
133
134
|
exports.Company = Company = tslib_1.__decorate([
|
|
134
135
|
(0, typeorm_1.Entity)(),
|
|
135
|
-
(0, typeorm_1.Index)('ix_companies_0', (company) => [company.name], { unique: true }),
|
|
136
|
+
(0, typeorm_1.Index)('ix_companies_0', (company) => [company.domain, company.name], { unique: true }),
|
|
136
137
|
(0, typeorm_1.Index)('ix_companies_1', (company) => [company.domain], { unique: false }),
|
|
137
138
|
(0, type_graphql_1.ObjectType)()
|
|
138
139
|
], Company);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"company.js","sourceRoot":"","sources":["../../../server/service/company/company.ts"],"names":[],"mappings":";;;;AAAA,+CAAoD;AACpD,qCAUgB;AAEhB,yDAAgD;AAChD,iDAA8C;AAE9C,mDAA+C;AAE/C
|
|
1
|
+
{"version":3,"file":"company.js","sourceRoot":"","sources":["../../../server/service/company/company.ts"],"names":[],"mappings":"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","sourcesContent":["import { Field, ID, ObjectType } from 'type-graphql'\nimport {\n Column,\n CreateDateColumn,\n Entity,\n Index,\n ManyToOne,\n OneToMany,\n PrimaryGeneratedColumn,\n RelationId,\n UpdateDateColumn\n} from 'typeorm'\n\nimport { User } from '@things-factory/auth-base'\nimport { Domain } from '@things-factory/shell'\n\nimport { Bizplace } from '../bizplace/bizplace'\n\n/*\n * A company and, for a domain, 「우리 회사」 (ADR-0176 decision 4): the one place its name, representative, registration\n * numbers, address, phone and seal are kept. Quotations, invoices, pay slips and every official document read them from\n * here (`our-company.ts`); the seal is an attachment of the row (`COMPANY_SEAL_REF_TYPE`). A name is unique in its\n * domain, not across domains - two businesses may share a trade name.\n */\n@Entity()\n@Index('ix_companies_0', (company: Company) => [company.domain, company.name], { unique: true })\n@Index('ix_companies_1', (company: Company) => [company.domain], { unique: false })\n@ObjectType()\nexport class Company {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID)\n readonly id: string\n\n @ManyToOne(type => Domain)\n @Field(type => Domain)\n domain?: Domain\n\n @RelationId((company: Company) => company.domain)\n @Field()\n domainId: string\n\n @Column()\n @Field()\n name: string\n\n @Column({\n nullable: true\n })\n @Field({ nullable: true })\n description: string\n\n @Column({ nullable: true })\n @Field({ nullable: true })\n countryCode: string\n\n /* 사업자등록번호 */\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Business registration number (사업자등록번호)' })\n brn: string\n\n /* 법인등록번호 */\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Corporate registration number (법인등록번호)' })\n corporateRegistrationNumber: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'The representative (대표자) as printed on official documents' })\n representative: string\n\n @Column({ nullable: true })\n @Field({ nullable: true })\n address: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'The main phone number (대표 전화)' })\n phone: string\n\n @Column({\n nullable: true\n })\n @Field({ nullable: true })\n postalCode: string\n\n @Column({\n nullable: true\n })\n @Field({ nullable: true })\n type: string\n\n @Column({\n nullable: true\n })\n @Field({ nullable: true })\n status: string\n\n @OneToMany(type => Bizplace, bizplace => bizplace.company)\n @Field(type => [Bizplace])\n bizplaces: Bizplace[]\n\n @ManyToOne(type => User, {\n nullable: true\n })\n @Field(type => User, { nullable: true })\n creator: User\n\n @RelationId((company: Company) => company.creator)\n creatorId: string\n\n @ManyToOne(type => User, {\n nullable: true\n })\n @Field(type => User, { nullable: true })\n updater: User\n\n @RelationId((company: Company) => company.updater)\n updaterId: string\n\n @CreateDateColumn()\n @Field({ nullable: true })\n createdAt: Date\n\n @UpdateDateColumn()\n @Field({ nullable: true })\n updatedAt: Date\n}\n"]}
|
|
@@ -31,13 +31,15 @@ function rowOf(patch, isNew) {
|
|
|
31
31
|
row[field] = String(patch[field] ?? '').trim() || null;
|
|
32
32
|
if (patch.accountNumber !== undefined || isNew) {
|
|
33
33
|
const key = (0, counterparty_names_1.accountKey)(patch.accountNumber);
|
|
34
|
+
if (/[^\d\s-]/.test(String(patch.accountNumber ?? '').trim()))
|
|
35
|
+
throw new shell_1.Refusal('counterparty-account-number-letters', { value: String(patch.accountNumber) }, `accountNumber: ${patch.accountNumber} - digits and hyphens only`);
|
|
34
36
|
if (!key)
|
|
35
37
|
throw new shell_1.Refusal('counterparty-account-number-required', {}, 'an account needs its number');
|
|
36
38
|
row.accountNumber = key;
|
|
37
39
|
}
|
|
38
40
|
if (patch.counterpartyId !== undefined || isNew) {
|
|
39
41
|
if (!patch.counterpartyId)
|
|
40
|
-
throw new shell_1.Refusal('counterparty-
|
|
42
|
+
throw new shell_1.Refusal('counterparty-account-counterparty-required', {}, 'counterparty: an account needs its counterparty');
|
|
41
43
|
row.counterpartyId = patch.counterpartyId;
|
|
42
44
|
}
|
|
43
45
|
return row;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"counterparty-bank-account-service.js","sourceRoot":"","sources":["../../../server/service/counterparty/counterparty-bank-account-service.ts"],"names":[],"mappings":"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","sourcesContent":["import { EntityManager, In } from 'typeorm'\n\nimport { Refusal, refuseTiedRows } from '@things-factory/shell'\n\nimport { Counterparty } from './counterparty'\nimport { CounterpartyBankAccount } from './counterparty-bank-account'\nimport { accountKey, keyClash } from './counterparty-names'\nimport { CounterpartyBankAccountPatch } from './counterparty-type'\n\n/**\n * Saving the accounts counterparties are paid into (ADR-0134), and what a module does once they are saved.\n *\n * A module whose rows carry an account number the bank wrote (accounting's bank lines) links them to the counterparty\n * the number is registered to — that is its rule, not this one's — by listening here (§`onCounterpartyBankAccountsSaved`).\n */\n\n/** The refType of a counterparty's business registration certificate. */\nexport const BUSINESS_REGISTRATION_REF_TYPE = 'Counterparty Business Registration'\n/** The refType of the passbook copy of a counterparty account - it shows the account number. */\nexport const PASSBOOK_REF_TYPE = 'Counterparty Passbook'\n\ntype Saved = (tx: EntityManager, domain: { id: string }, saved: CounterpartyBankAccount[], user: any) => Promise<void>\nconst listeners: Saved[] = []\n\n/** Run after every save of counterparty accounts, in the same transaction. */\nexport function onCounterpartyBankAccountsSaved(listener: Saved): void {\n listeners.push(listener)\n}\n\nconst TEXT = ['bankName', 'holderName', 'notes'] as const\n\nfunction rowOf(patch: CounterpartyBankAccountPatch, isNew: boolean): Partial<CounterpartyBankAccount> & { counterpartyId?: string } {\n const row: Record<string, any> = {}\n for (const field of TEXT) if (patch[field] !== undefined) row[field] = String(patch[field] ?? '').trim() || null\n if (patch.accountNumber !== undefined || isNew) {\n const key = accountKey(patch.accountNumber)\n if (!key) throw new Refusal('counterparty-account-number-required', {}, 'an account needs its number')\n row.accountNumber = key\n }\n if (patch.counterpartyId !== undefined || isNew) {\n if (!patch.counterpartyId) throw new Refusal('counterparty-not-found', {}, 'an account needs its counterparty')\n row.counterpartyId = patch.counterpartyId\n }\n return row\n}\n\n/**\n * Apply grid rows to a domain's counterparty accounts: `+` (or no id) registers, `M` changes, `-` deletes (softly — its\n * passbook copy stays with it). An account a payment request or any other row still names is not deleted\n * (§`refuseTiedRows`). An account number held by two live accounts is refused, naming the counterparty that holds it.\n */\nexport async function saveCounterpartyBankAccounts(\n tx: EntityManager,\n domain: { id: string },\n user: any,\n patches: CounterpartyBankAccountPatch[]\n): Promise<CounterpartyBankAccount[]> {\n const repo = tx.getRepository(CounterpartyBankAccount)\n const deletes = patches.filter(one => one.cuFlag === '-' && one.id).map(one => one.id!)\n const updates = patches.filter(one => one.id && one.cuFlag !== '-' && one.cuFlag !== '+').map(one => ({ id: one.id!, ...rowOf(one, false) }))\n const creates = patches.filter(one => !one.id || one.cuFlag === '+').filter(one => one.cuFlag !== '-').map(one => rowOf(one, true))\n\n const parties = new Map(\n (await tx.getRepository(Counterparty).find({ where: { domain: { id: domain.id } }, select: ['id', 'name'] })).map(one => [one.id, one])\n )\n for (const row of [...updates, ...creates])\n if (row.counterpartyId && !parties.has(row.counterpartyId))\n throw new Refusal('counterparty-not-found', {}, 'a counterparty was not found - reload and try again')\n\n const existing = await repo.find({ where: { domain: { id: domain.id } } })\n const owned = new Map(existing.map(one => [one.id, one]))\n for (const id of [...deletes, ...updates.map(one => one.id)])\n if (!owned.has(id)) throw new Refusal('counterparty-account-not-found', {}, 'an account was not found - reload and try again')\n\n const holder = (counterpartyId?: string) => parties.get(counterpartyId ?? '')?.name ?? ''\n const clash = keyClash(\n existing.map(one => ({ id: one.id, label: holder(one.counterpartyId), key: one.accountNumber })),\n [...updates, ...creates].map(one => ({\n id: (one as any).id,\n label: one.counterpartyId ? holder(one.counterpartyId) : undefined,\n key: one.accountNumber\n })),\n deletes\n )\n if (clash)\n throw new Refusal('counterparty-account-clash', clash, `account ${clash.number} is already registered to '${clash.existing}'`)\n\n if (deletes.length) {\n await refuseTiedRows(tx, CounterpartyBankAccount, deletes)\n await repo.softDelete({ id: In(deletes) })\n }\n\n const ids: string[] = []\n for (const { counterpartyId, ...row } of updates) {\n const current = owned.get(row.id)!\n ids.push((await repo.save({ ...current, ...row, ...(counterpartyId ? { counterparty: { id: counterpartyId } } : {}), updater: user } as CounterpartyBankAccount)).id)\n }\n for (const { counterpartyId, ...row } of creates)\n ids.push((await repo.save({ ...row, counterparty: { id: counterpartyId }, domain, creator: user, updater: user } as CounterpartyBankAccount)).id)\n\n /* Read back, so a listener has the counterparty of each as well as its number. */\n const saved = ids.length ? await repo.find({ where: { id: In(ids) } }) : []\n for (const listener of listeners) await listener(tx, domain, saved, user)\n return saved\n}\n"]}
|
|
1
|
+
{"version":3,"file":"counterparty-bank-account-service.js","sourceRoot":"","sources":["../../../server/service/counterparty/counterparty-bank-account-service.ts"],"names":[],"mappings":"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","sourcesContent":["import { EntityManager, In } from 'typeorm'\n\nimport { Refusal, refuseTiedRows } from '@things-factory/shell'\n\nimport { Counterparty } from './counterparty'\nimport { CounterpartyBankAccount } from './counterparty-bank-account'\nimport { accountKey, keyClash } from './counterparty-names'\nimport { CounterpartyBankAccountPatch } from './counterparty-type'\n\n/**\n * Saving the accounts counterparties are paid into (ADR-0134), and what a module does once they are saved.\n *\n * A module whose rows carry an account number the bank wrote (accounting's bank lines) links them to the counterparty\n * the number is registered to — that is its rule, not this one's — by listening here (§`onCounterpartyBankAccountsSaved`).\n */\n\n/** The refType of a counterparty's business registration certificate. */\nexport const BUSINESS_REGISTRATION_REF_TYPE = 'Counterparty Business Registration'\n/** The refType of the passbook copy of a counterparty account - it shows the account number. */\nexport const PASSBOOK_REF_TYPE = 'Counterparty Passbook'\n\ntype Saved = (tx: EntityManager, domain: { id: string }, saved: CounterpartyBankAccount[], user: any) => Promise<void>\nconst listeners: Saved[] = []\n\n/** Run after every save of counterparty accounts, in the same transaction. */\nexport function onCounterpartyBankAccountsSaved(listener: Saved): void {\n listeners.push(listener)\n}\n\nconst TEXT = ['bankName', 'holderName', 'notes'] as const\n\nfunction rowOf(patch: CounterpartyBankAccountPatch, isNew: boolean): Partial<CounterpartyBankAccount> & { counterpartyId?: string } {\n const row: Record<string, any> = {}\n for (const field of TEXT) if (patch[field] !== undefined) row[field] = String(patch[field] ?? '').trim() || null\n if (patch.accountNumber !== undefined || isNew) {\n const key = accountKey(patch.accountNumber)\n if (/[^\\d\\s-]/.test(String(patch.accountNumber ?? '').trim()))\n throw new Refusal('counterparty-account-number-letters', { value: String(patch.accountNumber) }, `accountNumber: ${patch.accountNumber} - digits and hyphens only`)\n if (!key) throw new Refusal('counterparty-account-number-required', {}, 'an account needs its number')\n row.accountNumber = key\n }\n if (patch.counterpartyId !== undefined || isNew) {\n if (!patch.counterpartyId) throw new Refusal('counterparty-account-counterparty-required', {}, 'counterparty: an account needs its counterparty')\n row.counterpartyId = patch.counterpartyId\n }\n return row\n}\n\n/**\n * Apply grid rows to a domain's counterparty accounts: `+` (or no id) registers, `M` changes, `-` deletes (softly — its\n * passbook copy stays with it). An account a payment request or any other row still names is not deleted\n * (§`refuseTiedRows`). An account number held by two live accounts is refused, naming the counterparty that holds it.\n */\nexport async function saveCounterpartyBankAccounts(\n tx: EntityManager,\n domain: { id: string },\n user: any,\n patches: CounterpartyBankAccountPatch[]\n): Promise<CounterpartyBankAccount[]> {\n const repo = tx.getRepository(CounterpartyBankAccount)\n const deletes = patches.filter(one => one.cuFlag === '-' && one.id).map(one => one.id!)\n const updates = patches.filter(one => one.id && one.cuFlag !== '-' && one.cuFlag !== '+').map(one => ({ id: one.id!, ...rowOf(one, false) }))\n const creates = patches.filter(one => !one.id || one.cuFlag === '+').filter(one => one.cuFlag !== '-').map(one => rowOf(one, true))\n\n const parties = new Map(\n (await tx.getRepository(Counterparty).find({ where: { domain: { id: domain.id } }, select: ['id', 'name'] })).map(one => [one.id, one])\n )\n for (const row of [...updates, ...creates])\n if (row.counterpartyId && !parties.has(row.counterpartyId))\n throw new Refusal('counterparty-not-found', {}, 'a counterparty was not found - reload and try again')\n\n const existing = await repo.find({ where: { domain: { id: domain.id } } })\n const owned = new Map(existing.map(one => [one.id, one]))\n for (const id of [...deletes, ...updates.map(one => one.id)])\n if (!owned.has(id)) throw new Refusal('counterparty-account-not-found', {}, 'an account was not found - reload and try again')\n\n const holder = (counterpartyId?: string) => parties.get(counterpartyId ?? '')?.name ?? ''\n const clash = keyClash(\n existing.map(one => ({ id: one.id, label: holder(one.counterpartyId), key: one.accountNumber })),\n [...updates, ...creates].map(one => ({\n id: (one as any).id,\n label: one.counterpartyId ? holder(one.counterpartyId) : undefined,\n key: one.accountNumber\n })),\n deletes\n )\n if (clash)\n throw new Refusal('counterparty-account-clash', clash, `account ${clash.number} is already registered to '${clash.existing}'`)\n\n if (deletes.length) {\n await refuseTiedRows(tx, CounterpartyBankAccount, deletes)\n await repo.softDelete({ id: In(deletes) })\n }\n\n const ids: string[] = []\n for (const { counterpartyId, ...row } of updates) {\n const current = owned.get(row.id)!\n ids.push((await repo.save({ ...current, ...row, ...(counterpartyId ? { counterparty: { id: counterpartyId } } : {}), updater: user } as CounterpartyBankAccount)).id)\n }\n for (const { counterpartyId, ...row } of creates)\n ids.push((await repo.save({ ...row, counterparty: { id: counterpartyId }, domain, creator: user, updater: user } as CounterpartyBankAccount)).id)\n\n /* Read back, so a listener has the counterparty of each as well as its number. */\n const saved = ids.length ? await repo.find({ where: { id: In(ids) } }) : []\n for (const listener of listeners) await listener(tx, domain, saved, user)\n return saved\n}\n"]}
|