@things-factory/pdf 10.1.244 → 10.1.245
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-client/pages/issued-document/issued-document-list.d.ts +7 -0
- package/dist-client/pages/issued-document/issued-document-list.js +78 -6
- package/dist-client/pages/issued-document/issued-document-list.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-server/service/pdf-release/pdf-release-query.js +22 -10
- package/dist-server/service/pdf-release/pdf-release-query.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -6
- package/translations/en.json +1 -0
- package/translations/es.json +1 -0
- package/translations/ja.json +1 -0
- package/translations/ko.json +1 -0
- package/translations/ms.json +1 -0
- package/translations/zh.json +1 -0
|
@@ -70,21 +70,33 @@ async function readableRows(context, where) {
|
|
|
70
70
|
return kept;
|
|
71
71
|
}
|
|
72
72
|
const SEARCHED = ['number', 'subjectName', 'purpose', 'submittedTo'];
|
|
73
|
-
/**
|
|
73
|
+
/**
|
|
74
|
+
* The ledger's filters - kind, refType, refId, state - its search words, and the days it was issued on (`createdAt`
|
|
75
|
+
* between two 'YYYY-MM-DD', either end open), from a list's parameters.
|
|
76
|
+
*/
|
|
74
77
|
function listOf(params) {
|
|
75
78
|
const where = {};
|
|
76
79
|
let search = '';
|
|
80
|
+
let issued;
|
|
77
81
|
for (const filter of params?.filters ?? []) {
|
|
78
82
|
if (['kind', 'refType', 'refId', 'state'].includes(filter.name))
|
|
79
83
|
where[filter.name] = filter.operator === 'in' ? (0, typeorm_1.In)(filter.value) : filter.value;
|
|
80
84
|
else if (filter.name === 'q' || SEARCHED.includes(filter.name))
|
|
81
85
|
search = String(filter.value ?? '').replace(/%/g, '').toLowerCase();
|
|
86
|
+
else if (filter.name === 'createdAt' && Array.isArray(filter.value))
|
|
87
|
+
issued = { from: filter.value[0] || undefined, to: filter.value[1] || undefined };
|
|
82
88
|
}
|
|
83
|
-
return { where, search };
|
|
89
|
+
return { where, search, issued };
|
|
84
90
|
}
|
|
85
|
-
/** A page of rows, after the search words. */
|
|
86
|
-
function pageOf(rows, search, params) {
|
|
87
|
-
const
|
|
91
|
+
/** A page of rows, after the search words and the days issued on - each row's day in the domain's timezone. */
|
|
92
|
+
function pageOf(rows, search, params, issued, timezone) {
|
|
93
|
+
const onDays = issued && (issued.from || issued.to)
|
|
94
|
+
? rows.filter(row => {
|
|
95
|
+
const day = (0, shell_1.calendarDay)(timezone, row.createdAt);
|
|
96
|
+
return (!issued.from || day >= issued.from) && (!issued.to || day <= issued.to);
|
|
97
|
+
})
|
|
98
|
+
: rows;
|
|
99
|
+
const found = search ? onDays.filter(row => SEARCHED.some(field => String(row[field] ?? '').toLowerCase().includes(search))) : onDays;
|
|
88
100
|
const { page = 1, limit = 0 } = params?.pagination ?? {};
|
|
89
101
|
return { items: limit > 0 ? found.slice((page - 1) * limit, page * limit) : found, total: found.length };
|
|
90
102
|
}
|
|
@@ -109,12 +121,12 @@ async function aboutCaller(context, row, own) {
|
|
|
109
121
|
*/
|
|
110
122
|
let PDFReleaseQuery = class PDFReleaseQuery {
|
|
111
123
|
async issuedDocuments(params, context) {
|
|
112
|
-
const { where, search } = listOf(params);
|
|
124
|
+
const { where, search, issued } = listOf(params);
|
|
113
125
|
const rows = await (0, shell_1.getRepository)(pdf_release_1.PDFRelease).find({ where: { domain: { id: context.state.domain.id }, ...where }, order: { createdAt: 'DESC' } });
|
|
114
|
-
return pageOf(rows, search, params);
|
|
126
|
+
return pageOf(rows, search, params, issued, context.state.domain.timezone);
|
|
115
127
|
}
|
|
116
128
|
async readableIssuedDocuments(params, mine, context) {
|
|
117
|
-
const { where, search } = listOf(params);
|
|
129
|
+
const { where, search, issued } = listOf(params);
|
|
118
130
|
let rows = await readableRows(context, where);
|
|
119
131
|
if (mine) {
|
|
120
132
|
const own = new Map();
|
|
@@ -124,7 +136,7 @@ let PDFReleaseQuery = class PDFReleaseQuery {
|
|
|
124
136
|
kept.push(row);
|
|
125
137
|
rows = kept;
|
|
126
138
|
}
|
|
127
|
-
return pageOf(rows, search, params);
|
|
139
|
+
return pageOf(rows, search, params, issued, context.state.domain.timezone);
|
|
128
140
|
}
|
|
129
141
|
async issuedDocument(id, context) {
|
|
130
142
|
return (await readableRows(context, { id }))[0] ?? null;
|
|
@@ -174,7 +186,7 @@ let PDFReleaseQuery = class PDFReleaseQuery {
|
|
|
174
186
|
exports.PDFReleaseQuery = PDFReleaseQuery;
|
|
175
187
|
tslib_1.__decorate([
|
|
176
188
|
(0, type_graphql_1.Directive)('@privilege(category: "issued-document", privilege: "query", domainOwnerGranted: true)'),
|
|
177
|
-
(0, type_graphql_1.Query)(returns => pdf_release_type_1.PDFReleaseList, { description: 'The whole issuance ledger, newest first - filter by kind, refType, refId, state; search number, subject, purpose or recipient' }),
|
|
189
|
+
(0, type_graphql_1.Query)(returns => pdf_release_type_1.PDFReleaseList, { description: 'The whole issuance ledger, newest first - filter by kind, refType, refId, state, the days issued on (createdAt between); search number, subject, purpose or recipient' }),
|
|
178
190
|
tslib_1.__param(0, (0, type_graphql_1.Args)(type => shell_1.ListParam)),
|
|
179
191
|
tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
|
|
180
192
|
tslib_1.__metadata("design:type", Function),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pdf-release-query.js","sourceRoot":"","sources":["../../../server/service/pdf-release/pdf-release-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arg, Args, Ctx, Directive, Field, FieldResolver, InputType, Int, Mutation, ObjectType, Query, Resolver, Root, UseMiddleware } from 'type-graphql'\nimport { In } from 'typeorm'\n\nimport { Attachment } from '@things-factory/attachment-base'\nimport { User } from '@things-factory/auth-base'\nimport { Domain, getRepository, ListParam, SpeakRefusals } from '@things-factory/shell'\n\nimport { issuedDocumentKindOf, issuedDocumentKinds } from '../../controller/issued-document-kind'\nimport { mayReadRelease, previewPdf, releasePdf, revokeRelease } from '../../controller/pdf-release-service'\nimport { PDFRelease } from './pdf-release'\nimport { PDFReleaseList } from './pdf-release-type'\n\n@InputType({ description: 'What a person gives when issuing a document' })\nexport class IssueDocumentInput {\n @Field({ nullable: true, description: 'What the document is for (용도)' }) purpose?: string\n @Field({ nullable: true, description: 'Where it is handed in (제출처)' }) submittedTo?: string\n @Field({ nullable: true, description: 'The day it speaks of (기준일), YYYY-MM-DD - today in the domain when none' }) asOf?: string\n}\n\n@ObjectType({ description: 'An issued document kind a module registered' })\nexport class IssuedDocumentKindInfo {\n @Field({ description: '<module>.<document>' }) kind: string\n @Field({ description: 'The head of its numbers' }) prefix: string\n @Field({ description: 'What its subject is' }) refType: string\n @Field({ description: 'Whether the issue form asks for the day it speaks of' }) asOf: boolean\n @Field({ description: 'Whether the caller may issue it here, in the ledger - a kind about the company itself, or about the caller' }) issuable: boolean\n @Field({ nullable: true, description: 'The subject it is issued for here - the caller\\'s own, for a kind about the caller' }) refId?: string\n}\n\n/** The ledger rows a person may read, newest first - each row asks its kind's module (`mayRead`). */\nasync function readableRows(context: ResolverContext, where: Record<string, any>): Promise<PDFRelease[]> {\n const { domain } = context.state\n const rows = await getRepository(PDFRelease).find({ where: { domain: { id: domain.id }, ...where }, order: { createdAt: 'DESC' } })\n const kept: PDFRelease[] = []\n for (const row of rows) if (await mayReadRelease(context, row)) kept.push(row)\n return kept\n}\n\nconst SEARCHED = ['number', 'subjectName', 'purpose', 'submittedTo']\n\n/** The ledger's filters - kind, refType, refId, state - and its search words, from a list's parameters. */\nfunction listOf(params: ListParam) {\n const where: Record<string, any> = {}\n let search = ''\n for (const filter of params?.filters ?? []) {\n if (['kind', 'refType', 'refId', 'state'].includes(filter.name)) where[filter.name] = filter.operator === 'in' ? In(filter.value) : filter.value\n else if (filter.name === 'q' || SEARCHED.includes(filter.name)) search = String(filter.value ?? '').replace(/%/g, '').toLowerCase()\n }\n return { where, search }\n}\n\n/** A page of rows, after the search words. */\nfunction pageOf(rows: PDFRelease[], search: string, params: ListParam): PDFReleaseList {\n const found = search ? rows.filter(row => SEARCHED.some(field => String((row as any)[field] ?? '').toLowerCase().includes(search))) : rows\n const { page = 1, limit = 0 } = params?.pagination ?? {}\n return { items: limit > 0 ? found.slice((page - 1) * limit, page * limit) : found, total: found.length }\n}\n\n/** Whether a row is about the caller - its kind's own subject for them (one's own employee record). */\nasync function aboutCaller(context: ResolverContext, row: PDFRelease, own: Map<string, string | null>): Promise<boolean> {\n const kind = issuedDocumentKindOf(row.kind)\n if (!kind?.ownSubject || !row.kind) return false\n if (!own.has(row.kind)) own.set(row.kind, await kind.ownSubject(context).catch(() => null))\n return !!row.refId && own.get(row.kind) === row.refId\n}\n\n/*\n * The issuance ledger (발급 대장, ADR-0176 decision 2), two ways:\n *\n * - The whole ledger - every row's number, kind, subject, purpose, recipient and issuer - is read under its own category\n * `issued-document` (`pdf.issuance-ledger`; management support keeps it, the user 2026-10-30). A row's file still\n * opens by its kind's rule.\n * - Everyone else reads rows by each kind's rule (`mayRead`), asked row by row: their own (내 정보 › 내 증명서,\n * `mine` - about them or issued by them), the registers on the register screen. Issuing and revoking ask the kind (`mayIssue`). These\n * doors carry no `@privilege` and are declared open by design on `schema.openFields`.\n */\n@Resolver(PDFRelease)\n@UseMiddleware(SpeakRefusals)\nexport class PDFReleaseQuery {\n @Directive('@privilege(category: \"issued-document\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => PDFReleaseList, { description: 'The whole issuance ledger, newest first - filter by kind, refType, refId, state; search number, subject, purpose or recipient' })\n async issuedDocuments(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<PDFReleaseList> {\n const { where, search } = listOf(params)\n const rows = await getRepository(PDFRelease).find({ where: { domain: { id: context.state.domain.id }, ...where }, order: { createdAt: 'DESC' } })\n return pageOf(rows, search, params)\n }\n\n @Query(returns => PDFReleaseList, { description: \"The issued documents the caller may read by their kinds' rules, newest first - with mine, those about the caller or issued by them\" })\n async readableIssuedDocuments(\n @Args(type => ListParam) params: ListParam,\n @Arg('mine', { nullable: true, description: 'Only the caller\\'s own: the documents about them and those they issued' }) mine: boolean,\n @Ctx() context: ResolverContext\n ): Promise<PDFReleaseList> {\n const { where, search } = listOf(params)\n let rows = await readableRows(context, where)\n if (mine) {\n const own = new Map<string, string | null>()\n const kept: PDFRelease[] = []\n for (const row of rows) if (row.creatorId === context.state.user?.id || (await aboutCaller(context, row, own))) kept.push(row)\n rows = kept\n }\n return pageOf(rows, search, params)\n }\n\n @Query(returns => PDFRelease, { nullable: true, description: 'One issued document, if the caller may read it' })\n async issuedDocument(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<PDFRelease | null> {\n return (await readableRows(context, { id }))[0] ?? null\n }\n\n @Query(returns => [IssuedDocumentKindInfo], { description: 'The kinds of document the loaded modules issue' })\n async issuedDocumentKinds(@Ctx() context: ResolverContext): Promise<IssuedDocumentKindInfo[]> {\n const domainId = context.state.domain?.id\n const infos: IssuedDocumentKindInfo[] = []\n for (const one of issuedDocumentKinds()) {\n /*\n * Issued here: a kind about the company itself, and a kind about the caller (one's own 재직증명서). Anyone else's\n * is issued from the screen of its subject.\n */\n const own = one.refType === 'Domain' ? null : ((await one.ownSubject?.(context).catch(() => null)) ?? null)\n const subject = one.refType === 'Domain' ? domainId : own\n const issuable = !!subject && (await one.mayIssue(context, subject).catch(() => false))\n infos.push({ kind: one.kind, prefix: one.prefix, refType: one.refType, asOf: !!one.asOf, issuable, refId: issuable && own ? own : undefined })\n }\n return infos\n }\n\n @Directive('@transaction')\n @Query(returns => String, { description: 'A document of a kind as it would be issued, before it is - unnumbered, kept nowhere, marked as a preview; base64 PDF' })\n async previewIssuedDocument(\n @Arg('kind') kind: string,\n @Arg('refId', { nullable: true, description: 'What it is about - none for a document about the company itself' }) refId: string | null,\n @Arg('input', type => IssueDocumentInput, { nullable: true }) input: IssueDocumentInput,\n @Ctx() context: ResolverContext\n ): Promise<string> {\n return (await previewPdf(context, { kind, refId, input })).toString('base64')\n }\n\n @Directive('@transaction')\n @Mutation(returns => PDFRelease, { description: 'To issue a document of a kind for its subject - numbered, printed and kept in the ledger; the kind\\'s module says who may' })\n async issueDocument(\n @Arg('kind') kind: string,\n @Arg('refId', { nullable: true, description: 'What it is about - none for a document about the company itself' }) refId: string | null,\n @Arg('input', type => IssueDocumentInput, { nullable: true }) input: IssueDocumentInput,\n @Ctx() context: ResolverContext\n ): Promise<PDFRelease> {\n return (await releasePdf(context, { kind, refId, input })).release\n }\n\n @Directive('@transaction')\n @Mutation(returns => PDFRelease, { description: 'To revoke an issued document, with the reason - the row and its file stay' })\n async revokeIssuedDocument(@Arg('id') id: string, @Arg('reason') reason: string, @Ctx() context: ResolverContext): Promise<PDFRelease> {\n return await revokeRelease(context, id, reason)\n }\n\n @FieldResolver(type => Boolean, { description: \"Whether the caller may open the file - its kind's rule\" })\n async readable(@Root() pdfRelease: PDFRelease, @Ctx() context: ResolverContext): Promise<boolean> {\n return await mayReadRelease(context, pdfRelease)\n }\n\n @FieldResolver(type => Attachment, { nullable: true, description: \"The PDF file of the release - for whoever may open it by its kind's rule\" })\n async file(@Root() pdfRelease: PDFRelease, @Ctx() context: ResolverContext): Promise<Attachment | null> {\n if (!(await mayReadRelease(context, pdfRelease))) return null\n return await getRepository(Attachment).findOne({ where: { refType: 'PDFRelease', refBy: pdfRelease.id }, order: { createdAt: 'DESC' } })\n }\n\n @FieldResolver(type => Domain)\n async domain(@Root() pdfRelease: PDFRelease): Promise<Domain> {\n return pdfRelease.domainId && (await getRepository(Domain).findOneBy({ id: pdfRelease.domainId }))\n }\n\n @FieldResolver(type => User)\n async updater(@Root() pdfRelease: PDFRelease): Promise<User> {\n return pdfRelease.updaterId && (await getRepository(User).findOneBy({ id: pdfRelease.updaterId }))\n }\n\n @FieldResolver(type => User)\n async creator(@Root() pdfRelease: PDFRelease): Promise<User> {\n return pdfRelease.creatorId && (await getRepository(User).findOneBy({ id: pdfRelease.creatorId }))\n }\n}\n\n/** The ledger's doors, open by design (auth-base `openFields`). */\nexport const OPEN_FIELDS = {\n 'Query.readableIssuedDocuments': \"each row is read by its kind's module rule (mayRead)\",\n 'Query.issuedDocument': \"read by its kind's module rule (mayRead)\",\n 'Query.issuedDocumentKinds': 'the names of the kinds the loaded modules issue - no data',\n 'Query.previewIssuedDocument': \"previewed by whoever may issue it - its kind's module rule (mayIssue)\",\n 'Mutation.issueDocument': \"issued by its kind's module rule (mayIssue)\",\n 'Mutation.revokeIssuedDocument': \"revoked by whoever may issue the kind for its subject (mayIssue)\"\n}\n"]}
|
|
1
|
+
{"version":3,"file":"pdf-release-query.js","sourceRoot":"","sources":["../../../server/service/pdf-release/pdf-release-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arg, Args, Ctx, Directive, Field, FieldResolver, InputType, Int, Mutation, ObjectType, Query, Resolver, Root, UseMiddleware } from 'type-graphql'\nimport { In } from 'typeorm'\n\nimport { Attachment } from '@things-factory/attachment-base'\nimport { User } from '@things-factory/auth-base'\nimport { calendarDay, Domain, getRepository, ListParam, SpeakRefusals } from '@things-factory/shell'\n\nimport { issuedDocumentKindOf, issuedDocumentKinds } from '../../controller/issued-document-kind'\nimport { mayReadRelease, previewPdf, releasePdf, revokeRelease } from '../../controller/pdf-release-service'\nimport { PDFRelease } from './pdf-release'\nimport { PDFReleaseList } from './pdf-release-type'\n\n@InputType({ description: 'What a person gives when issuing a document' })\nexport class IssueDocumentInput {\n @Field({ nullable: true, description: 'What the document is for (용도)' }) purpose?: string\n @Field({ nullable: true, description: 'Where it is handed in (제출처)' }) submittedTo?: string\n @Field({ nullable: true, description: 'The day it speaks of (기준일), YYYY-MM-DD - today in the domain when none' }) asOf?: string\n}\n\n@ObjectType({ description: 'An issued document kind a module registered' })\nexport class IssuedDocumentKindInfo {\n @Field({ description: '<module>.<document>' }) kind: string\n @Field({ description: 'The head of its numbers' }) prefix: string\n @Field({ description: 'What its subject is' }) refType: string\n @Field({ description: 'Whether the issue form asks for the day it speaks of' }) asOf: boolean\n @Field({ description: 'Whether the caller may issue it here, in the ledger - a kind about the company itself, or about the caller' }) issuable: boolean\n @Field({ nullable: true, description: 'The subject it is issued for here - the caller\\'s own, for a kind about the caller' }) refId?: string\n}\n\n/** The ledger rows a person may read, newest first - each row asks its kind's module (`mayRead`). */\nasync function readableRows(context: ResolverContext, where: Record<string, any>): Promise<PDFRelease[]> {\n const { domain } = context.state\n const rows = await getRepository(PDFRelease).find({ where: { domain: { id: domain.id }, ...where }, order: { createdAt: 'DESC' } })\n const kept: PDFRelease[] = []\n for (const row of rows) if (await mayReadRelease(context, row)) kept.push(row)\n return kept\n}\n\nconst SEARCHED = ['number', 'subjectName', 'purpose', 'submittedTo']\n\n/**\n * The ledger's filters - kind, refType, refId, state - its search words, and the days it was issued on (`createdAt`\n * between two 'YYYY-MM-DD', either end open), from a list's parameters.\n */\nfunction listOf(params: ListParam) {\n const where: Record<string, any> = {}\n let search = ''\n let issued: { from?: string; to?: string } | undefined\n for (const filter of params?.filters ?? []) {\n if (['kind', 'refType', 'refId', 'state'].includes(filter.name)) where[filter.name] = filter.operator === 'in' ? In(filter.value) : filter.value\n else if (filter.name === 'q' || SEARCHED.includes(filter.name)) search = String(filter.value ?? '').replace(/%/g, '').toLowerCase()\n else if (filter.name === 'createdAt' && Array.isArray(filter.value)) issued = { from: filter.value[0] || undefined, to: filter.value[1] || undefined }\n }\n return { where, search, issued }\n}\n\n/** A page of rows, after the search words and the days issued on - each row's day in the domain's timezone. */\nfunction pageOf(rows: PDFRelease[], search: string, params: ListParam, issued?: { from?: string; to?: string }, timezone?: string): PDFReleaseList {\n const onDays = issued && (issued.from || issued.to)\n ? rows.filter(row => {\n const day = calendarDay(timezone, row.createdAt)\n return (!issued.from || day >= issued.from) && (!issued.to || day <= issued.to)\n })\n : rows\n const found = search ? onDays.filter(row => SEARCHED.some(field => String((row as any)[field] ?? '').toLowerCase().includes(search))) : onDays\n const { page = 1, limit = 0 } = params?.pagination ?? {}\n return { items: limit > 0 ? found.slice((page - 1) * limit, page * limit) : found, total: found.length }\n}\n\n/** Whether a row is about the caller - its kind's own subject for them (one's own employee record). */\nasync function aboutCaller(context: ResolverContext, row: PDFRelease, own: Map<string, string | null>): Promise<boolean> {\n const kind = issuedDocumentKindOf(row.kind)\n if (!kind?.ownSubject || !row.kind) return false\n if (!own.has(row.kind)) own.set(row.kind, await kind.ownSubject(context).catch(() => null))\n return !!row.refId && own.get(row.kind) === row.refId\n}\n\n/*\n * The issuance ledger (발급 대장, ADR-0176 decision 2), two ways:\n *\n * - The whole ledger - every row's number, kind, subject, purpose, recipient and issuer - is read under its own category\n * `issued-document` (`pdf.issuance-ledger`; management support keeps it, the user 2026-10-30). A row's file still\n * opens by its kind's rule.\n * - Everyone else reads rows by each kind's rule (`mayRead`), asked row by row: their own (내 정보 › 내 증명서,\n * `mine` - about them or issued by them), the registers on the register screen. Issuing and revoking ask the kind (`mayIssue`). These\n * doors carry no `@privilege` and are declared open by design on `schema.openFields`.\n */\n@Resolver(PDFRelease)\n@UseMiddleware(SpeakRefusals)\nexport class PDFReleaseQuery {\n @Directive('@privilege(category: \"issued-document\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => PDFReleaseList, { description: 'The whole issuance ledger, newest first - filter by kind, refType, refId, state, the days issued on (createdAt between); search number, subject, purpose or recipient' })\n async issuedDocuments(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<PDFReleaseList> {\n const { where, search, issued } = listOf(params)\n const rows = await getRepository(PDFRelease).find({ where: { domain: { id: context.state.domain.id }, ...where }, order: { createdAt: 'DESC' } })\n return pageOf(rows, search, params, issued, context.state.domain.timezone)\n }\n\n @Query(returns => PDFReleaseList, { description: \"The issued documents the caller may read by their kinds' rules, newest first - with mine, those about the caller or issued by them\" })\n async readableIssuedDocuments(\n @Args(type => ListParam) params: ListParam,\n @Arg('mine', { nullable: true, description: 'Only the caller\\'s own: the documents about them and those they issued' }) mine: boolean,\n @Ctx() context: ResolverContext\n ): Promise<PDFReleaseList> {\n const { where, search, issued } = listOf(params)\n let rows = await readableRows(context, where)\n if (mine) {\n const own = new Map<string, string | null>()\n const kept: PDFRelease[] = []\n for (const row of rows) if (row.creatorId === context.state.user?.id || (await aboutCaller(context, row, own))) kept.push(row)\n rows = kept\n }\n return pageOf(rows, search, params, issued, context.state.domain.timezone)\n }\n\n @Query(returns => PDFRelease, { nullable: true, description: 'One issued document, if the caller may read it' })\n async issuedDocument(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<PDFRelease | null> {\n return (await readableRows(context, { id }))[0] ?? null\n }\n\n @Query(returns => [IssuedDocumentKindInfo], { description: 'The kinds of document the loaded modules issue' })\n async issuedDocumentKinds(@Ctx() context: ResolverContext): Promise<IssuedDocumentKindInfo[]> {\n const domainId = context.state.domain?.id\n const infos: IssuedDocumentKindInfo[] = []\n for (const one of issuedDocumentKinds()) {\n /*\n * Issued here: a kind about the company itself, and a kind about the caller (one's own 재직증명서). Anyone else's\n * is issued from the screen of its subject.\n */\n const own = one.refType === 'Domain' ? null : ((await one.ownSubject?.(context).catch(() => null)) ?? null)\n const subject = one.refType === 'Domain' ? domainId : own\n const issuable = !!subject && (await one.mayIssue(context, subject).catch(() => false))\n infos.push({ kind: one.kind, prefix: one.prefix, refType: one.refType, asOf: !!one.asOf, issuable, refId: issuable && own ? own : undefined })\n }\n return infos\n }\n\n @Directive('@transaction')\n @Query(returns => String, { description: 'A document of a kind as it would be issued, before it is - unnumbered, kept nowhere, marked as a preview; base64 PDF' })\n async previewIssuedDocument(\n @Arg('kind') kind: string,\n @Arg('refId', { nullable: true, description: 'What it is about - none for a document about the company itself' }) refId: string | null,\n @Arg('input', type => IssueDocumentInput, { nullable: true }) input: IssueDocumentInput,\n @Ctx() context: ResolverContext\n ): Promise<string> {\n return (await previewPdf(context, { kind, refId, input })).toString('base64')\n }\n\n @Directive('@transaction')\n @Mutation(returns => PDFRelease, { description: 'To issue a document of a kind for its subject - numbered, printed and kept in the ledger; the kind\\'s module says who may' })\n async issueDocument(\n @Arg('kind') kind: string,\n @Arg('refId', { nullable: true, description: 'What it is about - none for a document about the company itself' }) refId: string | null,\n @Arg('input', type => IssueDocumentInput, { nullable: true }) input: IssueDocumentInput,\n @Ctx() context: ResolverContext\n ): Promise<PDFRelease> {\n return (await releasePdf(context, { kind, refId, input })).release\n }\n\n @Directive('@transaction')\n @Mutation(returns => PDFRelease, { description: 'To revoke an issued document, with the reason - the row and its file stay' })\n async revokeIssuedDocument(@Arg('id') id: string, @Arg('reason') reason: string, @Ctx() context: ResolverContext): Promise<PDFRelease> {\n return await revokeRelease(context, id, reason)\n }\n\n @FieldResolver(type => Boolean, { description: \"Whether the caller may open the file - its kind's rule\" })\n async readable(@Root() pdfRelease: PDFRelease, @Ctx() context: ResolverContext): Promise<boolean> {\n return await mayReadRelease(context, pdfRelease)\n }\n\n @FieldResolver(type => Attachment, { nullable: true, description: \"The PDF file of the release - for whoever may open it by its kind's rule\" })\n async file(@Root() pdfRelease: PDFRelease, @Ctx() context: ResolverContext): Promise<Attachment | null> {\n if (!(await mayReadRelease(context, pdfRelease))) return null\n return await getRepository(Attachment).findOne({ where: { refType: 'PDFRelease', refBy: pdfRelease.id }, order: { createdAt: 'DESC' } })\n }\n\n @FieldResolver(type => Domain)\n async domain(@Root() pdfRelease: PDFRelease): Promise<Domain> {\n return pdfRelease.domainId && (await getRepository(Domain).findOneBy({ id: pdfRelease.domainId }))\n }\n\n @FieldResolver(type => User)\n async updater(@Root() pdfRelease: PDFRelease): Promise<User> {\n return pdfRelease.updaterId && (await getRepository(User).findOneBy({ id: pdfRelease.updaterId }))\n }\n\n @FieldResolver(type => User)\n async creator(@Root() pdfRelease: PDFRelease): Promise<User> {\n return pdfRelease.creatorId && (await getRepository(User).findOneBy({ id: pdfRelease.creatorId }))\n }\n}\n\n/** The ledger's doors, open by design (auth-base `openFields`). */\nexport const OPEN_FIELDS = {\n 'Query.readableIssuedDocuments': \"each row is read by its kind's module rule (mayRead)\",\n 'Query.issuedDocument': \"read by its kind's module rule (mayRead)\",\n 'Query.issuedDocumentKinds': 'the names of the kinds the loaded modules issue - no data',\n 'Query.previewIssuedDocument': \"previewed by whoever may issue it - its kind's module rule (mayIssue)\",\n 'Mutation.issueDocument': \"issued by its kind's module rule (mayIssue)\",\n 'Mutation.revokeIssuedDocument': \"revoked by whoever may issue the kind for its subject (mayIssue)\"\n}\n"]}
|