@things-factory/pdf 10.1.244 → 10.1.246

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.
@@ -70,21 +70,33 @@ async function readableRows(context, where) {
70
70
  return kept;
71
71
  }
72
72
  const SEARCHED = ['number', 'subjectName', 'purpose', 'submittedTo'];
73
- /** The ledger's filters - kind, refType, refId, state - and its search words, from a list's parameters. */
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 found = search ? rows.filter(row => SEARCHED.some(field => String(row[field] ?? '').toLowerCase().includes(search))) : rows;
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":";;;;AAAA,+CAA0J;AAC1J,qCAA4B;AAE5B,qEAA4D;AAC5D,yDAAgD;AAChD,iDAAuF;AAEvF,gFAAiG;AACjG,8EAA4G;AAC5G,+CAA0C;AAC1C,yDAAmD;AAG5C,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;CAI9B,CAAA;AAJY,gDAAkB;AAC4C;IAAxE,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,+BAA+B,EAAE,CAAC;;mDAAiB;AAClB;IAAtE,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,6BAA6B,EAAE,CAAC;;uDAAqB;AACuB;IAAjH,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,wEAAwE,EAAE,CAAC;;gDAAc;6BAHpH,kBAAkB;IAD9B,IAAA,wBAAS,EAAC,EAAE,WAAW,EAAE,6CAA6C,EAAE,CAAC;GAC7D,kBAAkB,CAI9B;AAGM,IAAM,sBAAsB,GAA5B,MAAM,sBAAsB;CAOlC,CAAA;AAPY,wDAAsB;AACc;IAA9C,IAAA,oBAAK,EAAC,EAAE,WAAW,EAAE,qBAAqB,EAAE,CAAC;;oDAAa;AACR;IAAlD,IAAA,oBAAK,EAAC,EAAE,WAAW,EAAE,yBAAyB,EAAE,CAAC;;sDAAe;AAClB;IAA9C,IAAA,oBAAK,EAAC,EAAE,WAAW,EAAE,qBAAqB,EAAE,CAAC;;uDAAgB;AACkB;IAA/E,IAAA,oBAAK,EAAC,EAAE,WAAW,EAAE,sDAAsD,EAAE,CAAC;;oDAAc;AACyC;IAArI,IAAA,oBAAK,EAAC,EAAE,WAAW,EAAE,4GAA4G,EAAE,CAAC;;wDAAkB;AACzB;IAA7H,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,oFAAoF,EAAE,CAAC;;qDAAe;iCANjI,sBAAsB;IADlC,IAAA,yBAAU,EAAC,EAAE,WAAW,EAAE,6CAA6C,EAAE,CAAC;GAC9D,sBAAsB,CAOlC;AAED,qGAAqG;AACrG,KAAK,UAAU,YAAY,CAAC,OAAwB,EAAE,KAA0B;IAC9E,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;IAChC,MAAM,IAAI,GAAG,MAAM,IAAA,qBAAa,EAAC,wBAAU,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC,CAAA;IACnI,MAAM,IAAI,GAAiB,EAAE,CAAA;IAC7B,KAAK,MAAM,GAAG,IAAI,IAAI;QAAE,IAAI,MAAM,IAAA,oCAAc,EAAC,OAAO,EAAE,GAAG,CAAC;YAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC9E,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,QAAQ,GAAG,CAAC,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,aAAa,CAAC,CAAA;AAEpE,2GAA2G;AAC3G,SAAS,MAAM,CAAC,MAAiB;IAC/B,MAAM,KAAK,GAAwB,EAAE,CAAA;IACrC,IAAI,MAAM,GAAG,EAAE,CAAA;IACf,KAAK,MAAM,MAAM,IAAI,MAAM,EAAE,OAAO,IAAI,EAAE,EAAE,CAAC;QAC3C,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;YAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,IAAA,YAAE,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAA;aAC3I,IAAI,MAAM,CAAC,IAAI,KAAK,GAAG,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;YAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;IACrI,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAA;AAC1B,CAAC;AAED,8CAA8C;AAC9C,SAAS,MAAM,CAAC,IAAkB,EAAE,MAAc,EAAE,MAAiB;IACnE,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAE,GAAW,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAC1I,MAAM,EAAE,IAAI,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,MAAM,EAAE,UAAU,IAAI,EAAE,CAAA;IACxD,OAAO,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,EAAE,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,CAAA;AAC1G,CAAC;AAED,uGAAuG;AACvG,KAAK,UAAU,WAAW,CAAC,OAAwB,EAAE,GAAe,EAAE,GAA+B;IACnG,MAAM,IAAI,GAAG,IAAA,2CAAoB,EAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAC3C,IAAI,CAAC,IAAI,EAAE,UAAU,IAAI,CAAC,GAAG,CAAC,IAAI;QAAE,OAAO,KAAK,CAAA;IAChD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;IAC3F,OAAO,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,KAAK,CAAA;AACvD,CAAC;AAED;;;;;;;;;GASG;AAGI,IAAM,eAAe,GAArB,MAAM,eAAe;IAGpB,AAAN,KAAK,CAAC,eAAe,CAA0B,MAAiB,EAAS,OAAwB;QAC/F,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAA;QACxC,MAAM,IAAI,GAAG,MAAM,IAAA,qBAAa,EAAC,wBAAU,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC,CAAA;QACjJ,OAAO,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACrC,CAAC;IAGK,AAAN,KAAK,CAAC,uBAAuB,CACF,MAAiB,EAC8E,IAAa,EAC9H,OAAwB;QAE/B,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAA;QACxC,IAAI,IAAI,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;QAC7C,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,GAAG,GAAG,IAAI,GAAG,EAAyB,CAAA;YAC5C,MAAM,IAAI,GAAiB,EAAE,CAAA;YAC7B,KAAK,MAAM,GAAG,IAAI,IAAI;gBAAE,IAAI,GAAG,CAAC,SAAS,KAAK,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,MAAM,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;oBAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAC9H,IAAI,GAAG,IAAI,CAAA;QACb,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACrC,CAAC;IAGK,AAAN,KAAK,CAAC,cAAc,CAAY,EAAU,EAAS,OAAwB;QACzE,OAAO,CAAC,MAAM,YAAY,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAA;IACzD,CAAC;IAGK,AAAN,KAAK,CAAC,mBAAmB,CAAQ,OAAwB;QACvD,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAA;QACzC,MAAM,KAAK,GAA6B,EAAE,CAAA;QAC1C,KAAK,MAAM,GAAG,IAAI,IAAA,0CAAmB,GAAE,EAAE,CAAC;YACxC;;;eAGG;YACH,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAA;YAC3G,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAA;YACzD,MAAM,QAAQ,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAA;YACvF,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAA;QAChJ,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAIK,AAAN,KAAK,CAAC,qBAAqB,CACZ,IAAY,EACyF,KAAoB,EACxE,KAAyB,EAChF,OAAwB;QAE/B,OAAO,CAAC,MAAM,IAAA,gCAAU,EAAC,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;IAC/E,CAAC;IAIK,AAAN,KAAK,CAAC,aAAa,CACJ,IAAY,EACyF,KAAoB,EACxE,KAAyB,EAChF,OAAwB;QAE/B,OAAO,CAAC,MAAM,IAAA,gCAAU,EAAC,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAA;IACpE,CAAC;IAIK,AAAN,KAAK,CAAC,oBAAoB,CAAY,EAAU,EAAiB,MAAc,EAAS,OAAwB;QAC9G,OAAO,MAAM,IAAA,mCAAa,EAAC,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,CAAA;IACjD,CAAC;IAGK,AAAN,KAAK,CAAC,QAAQ,CAAS,UAAsB,EAAS,OAAwB;QAC5E,OAAO,MAAM,IAAA,oCAAc,EAAC,OAAO,EAAE,UAAU,CAAC,CAAA;IAClD,CAAC;IAGK,AAAN,KAAK,CAAC,IAAI,CAAS,UAAsB,EAAS,OAAwB;QACxE,IAAI,CAAC,CAAC,MAAM,IAAA,oCAAc,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;YAAE,OAAO,IAAI,CAAA;QAC7D,OAAO,MAAM,IAAA,qBAAa,EAAC,4BAAU,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC,CAAA;IAC1I,CAAC;IAGK,AAAN,KAAK,CAAC,MAAM,CAAS,UAAsB;QACzC,OAAO,UAAU,CAAC,QAAQ,IAAI,CAAC,MAAM,IAAA,qBAAa,EAAC,cAAM,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;IACpG,CAAC;IAGK,AAAN,KAAK,CAAC,OAAO,CAAS,UAAsB;QAC1C,OAAO,UAAU,CAAC,SAAS,IAAI,CAAC,MAAM,IAAA,qBAAa,EAAC,gBAAI,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC,CAAA;IACpG,CAAC;IAGK,AAAN,KAAK,CAAC,OAAO,CAAS,UAAsB;QAC1C,OAAO,UAAU,CAAC,SAAS,IAAI,CAAC,MAAM,IAAA,qBAAa,EAAC,gBAAI,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC,CAAA;IACpG,CAAC;CACF,CAAA;AArGY,0CAAe;AAGpB;IAFL,IAAA,wBAAS,EAAC,uFAAuF,CAAC;IAClG,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,iCAAc,EAAE,EAAE,WAAW,EAAE,+HAA+H,EAAE,CAAC;IAC5J,mBAAA,IAAA,mBAAI,EAAC,IAAI,CAAC,EAAE,CAAC,iBAAS,CAAC,CAAA;IAAqB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;6CAAjB,iBAAS;;sDAI/D;AAGK;IADL,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,iCAAc,EAAE,EAAE,WAAW,EAAE,oIAAoI,EAAE,CAAC;IAErL,mBAAA,IAAA,mBAAI,EAAC,IAAI,CAAC,EAAE,CAAC,iBAAS,CAAC,CAAA;IACvB,mBAAA,IAAA,kBAAG,EAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,wEAAwE,EAAE,CAAC,CAAA;IACtH,mBAAA,IAAA,kBAAG,GAAE,CAAA;;6CAF2B,iBAAS;;8DAa3C;AAGK;IADL,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,wBAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,gDAAgD,EAAE,CAAC;IAC1F,mBAAA,IAAA,kBAAG,EAAC,IAAI,CAAC,CAAA;IAAc,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;qDAEjD;AAGK;IADL,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC,sBAAsB,CAAC,EAAE,EAAE,WAAW,EAAE,gDAAgD,EAAE,CAAC;IACnF,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;0DAc/B;AAIK;IAFL,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,sHAAsH,EAAE,CAAC;IAE/J,mBAAA,IAAA,kBAAG,EAAC,MAAM,CAAC,CAAA;IACX,mBAAA,IAAA,kBAAG,EAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,iEAAiE,EAAE,CAAC,CAAA;IAChH,mBAAA,IAAA,kBAAG,EAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,kBAAkB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;IAC5D,mBAAA,IAAA,kBAAG,GAAE,CAAA;;6DAD+D,kBAAkB;;4DAIxF;AAIK;IAFL,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,wBAAU,EAAE,EAAE,WAAW,EAAE,2HAA2H,EAAE,CAAC;IAE3K,mBAAA,IAAA,kBAAG,EAAC,MAAM,CAAC,CAAA;IACX,mBAAA,IAAA,kBAAG,EAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,iEAAiE,EAAE,CAAC,CAAA;IAChH,mBAAA,IAAA,kBAAG,EAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,kBAAkB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;IAC5D,mBAAA,IAAA,kBAAG,GAAE,CAAA;;6DAD+D,kBAAkB;;oDAIxF;AAIK;IAFL,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,wBAAU,EAAE,EAAE,WAAW,EAAE,2EAA2E,EAAE,CAAC;IAClG,mBAAA,IAAA,kBAAG,EAAC,IAAI,CAAC,CAAA;IAAc,mBAAA,IAAA,kBAAG,EAAC,QAAQ,CAAC,CAAA;IAAkB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;2DAEtF;AAGK;IADL,IAAA,4BAAa,EAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,wDAAwD,EAAE,CAAC;IAC1F,mBAAA,IAAA,mBAAI,GAAE,CAAA;IAA0B,mBAAA,IAAA,kBAAG,GAAE,CAAA;;6CAAlB,wBAAU;;+CAE5C;AAGK;IADL,IAAA,4BAAa,EAAC,IAAI,CAAC,EAAE,CAAC,4BAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,0EAA0E,EAAE,CAAC;IACnI,mBAAA,IAAA,mBAAI,GAAE,CAAA;IAA0B,mBAAA,IAAA,kBAAG,GAAE,CAAA;;6CAAlB,wBAAU;;2CAGxC;AAGK;IADL,IAAA,4BAAa,EAAC,IAAI,CAAC,EAAE,CAAC,cAAM,CAAC;IAChB,mBAAA,IAAA,mBAAI,GAAE,CAAA;;6CAAa,wBAAU;;6CAE1C;AAGK;IADL,IAAA,4BAAa,EAAC,IAAI,CAAC,EAAE,CAAC,gBAAI,CAAC;IACb,mBAAA,IAAA,mBAAI,GAAE,CAAA;;6CAAa,wBAAU;;8CAE3C;AAGK;IADL,IAAA,4BAAa,EAAC,IAAI,CAAC,EAAE,CAAC,gBAAI,CAAC;IACb,mBAAA,IAAA,mBAAI,GAAE,CAAA;;6CAAa,wBAAU;;8CAE3C;0BApGU,eAAe;IAF3B,IAAA,uBAAQ,EAAC,wBAAU,CAAC;IACpB,IAAA,4BAAa,EAAC,qBAAa,CAAC;GAChB,eAAe,CAqG3B;AAED,mEAAmE;AACtD,QAAA,WAAW,GAAG;IACzB,+BAA+B,EAAE,sDAAsD;IACvF,sBAAsB,EAAE,0CAA0C;IAClE,2BAA2B,EAAE,2DAA2D;IACxF,6BAA6B,EAAE,uEAAuE;IACtG,wBAAwB,EAAE,6CAA6C;IACvE,+BAA+B,EAAE,kEAAkE;CACpG,CAAA","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"]}