@things-factory/worklist 10.1.37 → 10.1.38

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.
Files changed (113) hide show
  1. package/dist-client/components/activity-instance-preview.js +2 -13
  2. package/dist-client/components/activity-instance-preview.js.map +1 -1
  3. package/dist-client/components/activity-thread-timeline.d.ts +2 -2
  4. package/dist-client/components/can-pick.d.ts +15 -0
  5. package/dist-client/components/can-pick.js +16 -0
  6. package/dist-client/components/can-pick.js.map +1 -0
  7. package/dist-client/pages/activity-catalog/activity-detail-page.d.ts +23 -2
  8. package/dist-client/pages/activity-catalog/activity-detail-page.js +69 -10
  9. package/dist-client/pages/activity-catalog/activity-detail-page.js.map +1 -1
  10. package/dist-client/pages/activity-catalog/activity-panels.d.ts +28 -0
  11. package/dist-client/pages/activity-catalog/activity-panels.js +19 -0
  12. package/dist-client/pages/activity-catalog/activity-panels.js.map +1 -1
  13. package/dist-client/pages/activity-instance/activity-instance-start-page.d.ts +1 -0
  14. package/dist-client/pages/activity-instance/activity-instance-start-page.js +33 -1
  15. package/dist-client/pages/activity-instance/activity-instance-start-page.js.map +1 -1
  16. package/dist-client/pages/activity-instance/discard-offer.d.ts +11 -0
  17. package/dist-client/pages/activity-instance/discard-offer.js +11 -0
  18. package/dist-client/pages/activity-instance/discard-offer.js.map +1 -0
  19. package/dist-client/pages/activity-thread/activity-thread-view.d.ts +1 -1
  20. package/dist-client/pages/todo/approval-done-list-page.d.ts +5 -1
  21. package/dist-client/pages/todo/approval-done-list-page.js +8 -1
  22. package/dist-client/pages/todo/approval-done-list-page.js.map +1 -1
  23. package/dist-client/pages/todo/approval-pending-list-page.d.ts +5 -1
  24. package/dist-client/pages/todo/approval-pending-list-page.js +8 -1
  25. package/dist-client/pages/todo/approval-pending-list-page.js.map +1 -1
  26. package/dist-client/pages/todo/done-list-page.d.ts +5 -1
  27. package/dist-client/pages/todo/done-list-page.js +8 -1
  28. package/dist-client/pages/todo/done-list-page.js.map +1 -1
  29. package/dist-client/pages/todo/draft-list-page.d.ts +5 -1
  30. package/dist-client/pages/todo/draft-list-page.js +18 -12
  31. package/dist-client/pages/todo/draft-list-page.js.map +1 -1
  32. package/dist-client/pages/todo/list-thumbnail.d.ts +25 -0
  33. package/dist-client/pages/todo/list-thumbnail.js +25 -0
  34. package/dist-client/pages/todo/list-thumbnail.js.map +1 -0
  35. package/dist-client/pages/todo/todo-list-page.d.ts +5 -1
  36. package/dist-client/pages/todo/todo-list-page.js +8 -1
  37. package/dist-client/pages/todo/todo-list-page.js.map +1 -1
  38. package/dist-client/pages/work-door/door-links.d.ts +30 -0
  39. package/dist-client/pages/work-door/door-links.js +30 -0
  40. package/dist-client/pages/work-door/door-links.js.map +1 -0
  41. package/dist-client/pages/work-door/work-doors-page.js +15 -5
  42. package/dist-client/pages/work-door/work-doors-page.js.map +1 -1
  43. package/dist-client/route.d.ts +1 -1
  44. package/dist-client/tsconfig.tsbuildinfo +1 -1
  45. package/dist-server/controllers/activity-approval/delegate.js +27 -2
  46. package/dist-server/controllers/activity-approval/delegate.js.map +1 -1
  47. package/dist-server/controllers/activity-approval/delegation.d.ts +31 -0
  48. package/dist-server/controllers/activity-approval/delegation.js +31 -0
  49. package/dist-server/controllers/activity-approval/delegation.js.map +1 -0
  50. package/dist-server/controllers/activity-instance/discard-draft.d.ts +22 -0
  51. package/dist-server/controllers/activity-instance/discard-draft.js +54 -0
  52. package/dist-server/controllers/activity-instance/discard-draft.js.map +1 -0
  53. package/dist-server/controllers/activity-read/assert-may-read.d.ts +15 -0
  54. package/dist-server/controllers/activity-read/assert-may-read.js +99 -0
  55. package/dist-server/controllers/activity-read/assert-may-read.js.map +1 -0
  56. package/dist-server/controllers/activity-read/participates.d.ts +41 -0
  57. package/dist-server/controllers/activity-read/participates.js +42 -0
  58. package/dist-server/controllers/activity-read/participates.js.map +1 -0
  59. package/dist-server/controllers/activity-thread/delegate.js +23 -1
  60. package/dist-server/controllers/activity-thread/delegate.js.map +1 -1
  61. package/dist-server/service/activity/activity-mutation.js +1 -0
  62. package/dist-server/service/activity/activity-mutation.js.map +1 -1
  63. package/dist-server/service/activity-approval/activity-approval-query.js +7 -1
  64. package/dist-server/service/activity-approval/activity-approval-query.js.map +1 -1
  65. package/dist-server/service/activity-approval/activity-approval-subscription.js +2 -11
  66. package/dist-server/service/activity-approval/activity-approval-subscription.js.map +1 -1
  67. package/dist-server/service/activity-instance/activity-instance-mutation.js +12 -20
  68. package/dist-server/service/activity-instance/activity-instance-mutation.js.map +1 -1
  69. package/dist-server/service/activity-instance/activity-instance-query.js +9 -2
  70. package/dist-server/service/activity-instance/activity-instance-query.js.map +1 -1
  71. package/dist-server/service/activity-instance/activity-instance-subscription.js +4 -12
  72. package/dist-server/service/activity-instance/activity-instance-subscription.js.map +1 -1
  73. package/dist-server/service/activity-instance/index.d.ts +1 -2
  74. package/dist-server/service/activity-instance/index.js +1 -2
  75. package/dist-server/service/activity-instance/index.js.map +1 -1
  76. package/dist-server/service/activity-template/activity-template-mutation.js +6 -0
  77. package/dist-server/service/activity-template/activity-template-mutation.js.map +1 -1
  78. package/dist-server/service/activity-thread/activity-thread-mutation.d.ts +0 -3
  79. package/dist-server/service/activity-thread/activity-thread-mutation.js +0 -19
  80. package/dist-server/service/activity-thread/activity-thread-mutation.js.map +1 -1
  81. package/dist-server/service/activity-thread/activity-thread-query.js +7 -1
  82. package/dist-server/service/activity-thread/activity-thread-query.js.map +1 -1
  83. package/dist-server/service/activity-thread/activity-thread-subscription.js +2 -8
  84. package/dist-server/service/activity-thread/activity-thread-subscription.js.map +1 -1
  85. package/dist-server/service/index.d.ts +2 -2
  86. package/dist-server/service/subscription/subscription-filters.d.ts +36 -0
  87. package/dist-server/service/subscription/subscription-filters.js +41 -0
  88. package/dist-server/service/subscription/subscription-filters.js.map +1 -0
  89. package/dist-server/service/work-door/work-door-declaration.d.ts +15 -0
  90. package/dist-server/service/work-door/work-door-declaration.js +18 -0
  91. package/dist-server/service/work-door/work-door-declaration.js.map +1 -1
  92. package/dist-server/service/work-door/work-door-resolver.d.ts +3 -0
  93. package/dist-server/service/work-door/work-door-resolver.js +21 -1
  94. package/dist-server/service/work-door/work-door-resolver.js.map +1 -1
  95. package/dist-server/tsconfig.tsbuildinfo +1 -1
  96. package/package.json +10 -10
  97. package/tests/delegate-approval.test.ts +112 -0
  98. package/tests/discard-draft.test.ts +145 -0
  99. package/tests/may-read-case.test.ts +166 -0
  100. package/tests/open-doors.test.ts +274 -0
  101. package/tests/published-shape.test.ts +85 -0
  102. package/tests/work-door-not-used-refuse.test.ts +110 -0
  103. package/translations/en.json +15 -2
  104. package/translations/ja.json +15 -2
  105. package/translations/ko.json +15 -2
  106. package/translations/ms.json +15 -2
  107. package/translations/zh.json +15 -2
  108. package/dist-server/service/activity-instance/activity-instance-history-query.d.ts +0 -12
  109. package/dist-server/service/activity-instance/activity-instance-history-query.js +0 -79
  110. package/dist-server/service/activity-instance/activity-instance-history-query.js.map +0 -1
  111. package/dist-server/service/activity-instance/activity-instance-history-type.d.ts +0 -5
  112. package/dist-server/service/activity-instance/activity-instance-history-type.js +0 -21
  113. package/dist-server/service/activity-instance/activity-instance-history-type.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"activity-mutation.js","sourceRoot":"","sources":["../../../server/service/activity/activity-mutation.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arg, Ctx, Directive, Mutation, Resolver } from 'type-graphql'\nimport { In } from 'typeorm'\n\nimport { createAttachment, deleteAttachmentsByRef } from '@things-factory/attachment-base'\nimport { Application, CallbackBase, registerSchedule, unregisterSchedule } from '@things-factory/scheduler-client'\nimport { ApprovalLineItem, OrgMemberTargetType } from '@things-factory/organization'\n\nimport { Activity, AssigneeItem } from './activity.js'\nimport { ActivityPatch, NewActivity } from './activity-type.js'\n\nfunction getApprovalLineValue(patch: NewActivity | ActivityPatch): ApprovalLineItem[] {\n const { approvalLine } = patch\n\n if (!('approvalLine' in patch)) {\n /* approvalLine이 언급되지 않았다면, 업데이트하지 않는다. */\n return\n }\n\n if (!approvalLine || !(approvalLine instanceof Array)) {\n /* approvalLine의 값이 없거나 배열이 아니라면, 클리어시킨다. */\n return null\n }\n\n return approvalLine\n .map(m => {\n return {\n type: m.type,\n /*\n * `value` 를 버리지 않는다. 결재자를 찾는 쪽이 **`value` 를 먼저** 본다\n * (`controllers/common.ts` — `approver?.id || assignee?.id || value`). 저장에서 버리면 화면이\n * `value` 로 지정한 결재자가 오류 없이 사라지고, 그 액티비티는 결재가 영영 안 걸린다.\n */\n value: m.value,\n approver: m.approver,\n /*\n * 무슨 자격으로 서나 — 비어 있으면 결재다. 여기서 버리면 참조로 지정한 사람이 결재자가 되어\n * **결재를 막게 된다**(참조는 안 막는 것이 뜻이다).\n */\n participation: m.participation,\n /* 참조에게 언제 알리나. 없으면 상신 즉시. */\n notifyAfter: m.notifyAfter\n } as ApprovalLineItem\n })\n .filter(m => m.type)\n .filter(m => {\n switch (m.type) {\n case OrgMemberTargetType.Employee:\n case OrgMemberTargetType.Department:\n case OrgMemberTargetType.Role:\n /* 찾는 쪽과 같은 것을 본다 — 여기서만 좁히면 저장은 됐는데 결재가 안 걸린다. */\n return !!(m.approver?.id || m.value)\n default:\n return true\n }\n })\n}\n\nfunction getAssigneesValue(patch: NewActivity | ActivityPatch): AssigneeItem[] {\n const { assignees } = patch\n\n if (!('assignees' in patch)) {\n /* assignees이 언급되지 않았다면, 업데이트하지 않는다. */\n return\n }\n\n if (!assignees || !(assignees instanceof Array)) {\n /* assignees의 값이 없거나 배열이 아니라면, 클리어시킨다. */\n return null\n }\n\n return assignees\n .map(m => {\n return {\n type: m.type,\n /* 결재선과 같은 이유다 — 찾는 쪽이 `value` 를 본다. */\n value: m.value,\n assignee: m.assignee\n } as AssigneeItem\n })\n .filter(m => m.type)\n .filter(m => {\n switch (m.type) {\n case OrgMemberTargetType.Employee:\n case OrgMemberTargetType.Department:\n case OrgMemberTargetType.Role:\n return !!(m.assignee?.id || m.value)\n default:\n return true\n }\n })\n}\n\n@Resolver(Activity)\nexport class ActivityMutation {\n @Directive('@transaction')\n @Directive('@privilege(category: \"activity\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Activity, { description: 'To create new Activity' })\n async createActivity(@Arg('activity') activity: NewActivity, @Ctx() context: ResolverContext): Promise<Activity> {\n const { domain, user, tx } = context.state\n\n const result = await tx.getRepository(Activity).save({\n ...activity,\n assignees: getAssigneesValue(activity),\n approvalLine: getApprovalLineValue(activity),\n domain,\n creator: user,\n updater: user\n })\n\n if (activity.thumbnail) {\n await createAttachment(\n null,\n {\n attachment: {\n file: activity.thumbnail,\n refType: Activity.name,\n refBy: result.id\n }\n },\n context\n )\n }\n\n return result\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"activity\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Activity, { description: 'To modify Activity information' })\n async updateActivity(\n @Arg('id') id: string,\n @Arg('patch') patch: ActivityPatch,\n @Ctx() context: ResolverContext\n ): Promise<Activity> {\n const { domain, user, tx } = context.state\n\n const repository = tx.getRepository(Activity)\n const activity = await repository.findOne({\n where: { domain: { id: domain.id }, id },\n /* history에 항상 반영될 수 있도록 relations가 있어야 함. */\n relations: ['domain', 'issuerRole', 'assigneeRole', 'supervisoryRole', 'creator', 'updater']\n })\n\n const result = await repository.save({\n ...activity,\n ...patch,\n /*\n * **`patch` 를 본다.** 앞서는 DB 에서 읽은 `activity` 를 넘기고 있어서, 화면에서 결재선이나\n * 담당자를 고쳐도 옛 값이 다시 저장됐다. 오류가 안 나서 「저장됐다」로 보인다.\n */\n assignees: getAssigneesValue(patch),\n approvalLine: getApprovalLineValue(patch),\n updater: user\n })\n\n if (patch.thumbnail) {\n await deleteAttachmentsByRef(null, { refBys: [result.id] }, context)\n await createAttachment(\n null,\n {\n attachment: {\n file: patch.thumbnail,\n refType: Activity.name,\n refBy: result.id\n }\n },\n context\n )\n }\n\n return result\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"activity\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => [Activity], { description: \"To modify multiple Activities' information\" })\n async updateMultipleActivity(\n @Arg('patches', type => [ActivityPatch]) patches: ActivityPatch[],\n @Ctx() context: ResolverContext\n ): Promise<Activity[]> {\n const { domain, user, tx } = context.state\n\n let results = []\n const _createRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === '+')\n const _updateRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === 'M')\n const activityRepo = tx.getRepository(Activity)\n\n if (_createRecords.length > 0) {\n for (let i = 0; i < _createRecords.length; i++) {\n const newRecord = _createRecords[i]\n\n const result = await activityRepo.save({\n ...newRecord,\n assignees: getAssigneesValue(newRecord),\n approvalLine: getApprovalLineValue(newRecord),\n domain,\n creator: user,\n updater: user\n })\n\n if (newRecord.thumbnail) {\n await createAttachment(\n null,\n {\n attachment: {\n file: newRecord.thumbnail,\n refType: Activity.name,\n refBy: result.id\n }\n },\n context\n )\n }\n\n results.push({ ...result, cuFlag: '+' })\n }\n }\n\n if (_updateRecords.length > 0) {\n for (let i = 0; i < _updateRecords.length; i++) {\n const updateRecord = _updateRecords[i]\n const activity = await activityRepo.findOne({\n where: { id: updateRecord.id },\n /* history에 항상 반영될 수 있도록 relations가 있어야 함. */\n relations: ['domain', 'issuerRole', 'assigneeRole', 'supervisoryRole', 'creator', 'updater']\n })\n\n const result = await activityRepo.save({\n ...activity,\n ...updateRecord,\n assignees: getAssigneesValue(updateRecord),\n approvalLine: getApprovalLineValue(updateRecord),\n updater: user\n })\n\n if (updateRecord.thumbnail) {\n await deleteAttachmentsByRef(null, { refBys: [result.id] }, context)\n await createAttachment(\n null,\n {\n attachment: {\n file: updateRecord.thumbnail,\n refType: Activity.name,\n refBy: result.id\n }\n },\n context\n )\n }\n\n results.push({ ...result, cuFlag: 'M' })\n }\n }\n\n return results\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"activity\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Boolean, { description: 'To delete Activity' })\n async deleteActivity(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain, tx } = context.state\n\n await tx.getRepository(Activity).delete({ domain: { id: domain.id }, id })\n await deleteAttachmentsByRef(null, { refBys: [id] }, context)\n\n return true\n }\n\n @Directive('@transaction')\n @Mutation(returns => Boolean, { description: 'To delete multiple Activities' })\n async deleteActivities(\n @Arg('ids', type => [String]) ids: string[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, tx } = context.state\n\n await tx.getRepository(Activity).delete({\n domain: { id: domain.id },\n id: In(ids)\n })\n\n await deleteAttachmentsByRef(null, { refBys: ids }, context)\n\n return true\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"activity\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Boolean, { description: 'To import multiple Activities' })\n async importActivities(\n @Arg('activities', type => [ActivityPatch]) activities: ActivityPatch[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, tx } = context.state\n\n await Promise.all(\n activities.map(async (activity: ActivityPatch) => {\n const createdActivity: Activity = await tx.getRepository(Activity).save({ domain, ...activity })\n })\n )\n\n return true\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"activity\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Activity, {\n description: 'To start posting activity based on the schedule of the given activity'\n })\n async startActivitySchedule(\n @Arg('activityId') activityId: string,\n @Ctx() context: ResolverContext\n ): Promise<Activity> {\n const { domain, tx } = context.state\n\n var repository = tx.getRepository(Activity)\n var activity = await repository.findOne({\n where: { domain: { id: domain.id }, id: activityId }\n })\n\n if (!activity) {\n throw new Error(\n context.t('error.activity not found', {\n activity: activityId\n })\n )\n }\n\n try {\n var handle = await registerSchedule({\n name: activity.name,\n client: {\n application: Application,\n group: `${domain.id}`,\n type: 'activity',\n key: activity.id,\n operation: 'schedule'\n },\n type: 'cron',\n schedule: activity.schedule,\n timezone: activity.timezone,\n task: {\n type: 'rest',\n connection: {\n host: `${CallbackBase}/callback-schedule-for-activity`,\n headers: {\n 'Content-Type': 'application/json',\n accept: '*/*'\n }\n },\n data: {\n domainId: domain.id,\n activityId\n },\n history_check: true,\n failed_policy: 'retry_dlq',\n max_retry_count: 3,\n retry_period: 60\n }\n })\n\n return await repository.save({\n ...activity,\n scheduleId: handle\n })\n } catch (err) {\n console.error('startActivitySchedule', err)\n }\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"activity\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Activity, {\n nullable: true,\n description: 'To stop posting activity based on the schedule of the given activity'\n })\n async stopActivitySchedule(\n @Arg('activityId') activityId: string,\n @Ctx() context: ResolverContext\n ): Promise<Activity | undefined> {\n const { domain, tx } = context.state\n\n var repository = tx.getRepository(Activity)\n var activity = await repository.findOne({\n where: { domain: { id: domain.id }, id: activityId }\n })\n\n if (!activity) {\n throw new Error(\n context.t('error.activity not found', {\n activity: activityId\n })\n )\n }\n\n try {\n await unregisterSchedule(activity.scheduleId)\n\n return await repository.save({\n ...activity,\n scheduleId: null\n })\n } catch (err) {\n console.error('stopActivitySchedule', err)\n }\n }\n}\n"]}
1
+ {"version":3,"file":"activity-mutation.js","sourceRoot":"","sources":["../../../server/service/activity/activity-mutation.ts"],"names":[],"mappings":";;;;AAAA,+CAAsE;AACtE,qCAA4B;AAE5B,qEAA0F;AAC1F,uEAAkH;AAClH,+DAAoF;AAEpF,+CAAsD;AACtD,yDAA+D;AAE/D,SAAS,oBAAoB,CAAC,KAAkC;IAC9D,MAAM,EAAE,YAAY,EAAE,GAAG,KAAK,CAAA;IAE9B,IAAI,CAAC,CAAC,cAAc,IAAI,KAAK,CAAC,EAAE,CAAC;QAC/B,0CAA0C;QAC1C,OAAM;IACR,CAAC;IAED,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC,YAAY,YAAY,KAAK,CAAC,EAAE,CAAC;QACtD,4CAA4C;QAC5C,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO,YAAY;SAChB,GAAG,CAAC,CAAC,CAAC,EAAE;QACP,OAAO;YACL,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ;;;;eAIG;YACH,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB;;;eAGG;YACH,aAAa,EAAE,CAAC,CAAC,aAAa;YAC9B,6BAA6B;YAC7B,WAAW,EAAE,CAAC,CAAC,WAAW;SACP,CAAA;IACvB,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SACnB,MAAM,CAAC,CAAC,CAAC,EAAE;QACV,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;YACf,KAAK,kCAAmB,CAAC,QAAQ,CAAC;YAClC,KAAK,kCAAmB,CAAC,UAAU,CAAC;YACpC,KAAK,kCAAmB,CAAC,IAAI;gBAC3B,kDAAkD;gBAClD,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,CAAA;YACtC;gBACE,OAAO,IAAI,CAAA;QACf,CAAC;IACH,CAAC,CAAC,CAAA;AACN,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAkC;IAC3D,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAA;IAE3B,IAAI,CAAC,CAAC,WAAW,IAAI,KAAK,CAAC,EAAE,CAAC;QAC5B,uCAAuC;QACvC,OAAM;IACR,CAAC;IAED,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,SAAS,YAAY,KAAK,CAAC,EAAE,CAAC;QAChD,yCAAyC;QACzC,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO,SAAS;SACb,GAAG,CAAC,CAAC,CAAC,EAAE;QACP,OAAO;YACL,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,uCAAuC;YACvC,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,QAAQ,EAAE,CAAC,CAAC,QAAQ;SACL,CAAA;IACnB,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SACnB,MAAM,CAAC,CAAC,CAAC,EAAE;QACV,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;YACf,KAAK,kCAAmB,CAAC,QAAQ,CAAC;YAClC,KAAK,kCAAmB,CAAC,UAAU,CAAC;YACpC,KAAK,kCAAmB,CAAC,IAAI;gBAC3B,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,CAAA;YACtC;gBACE,OAAO,IAAI,CAAA;QACf,CAAC;IACH,CAAC,CAAC,CAAA;AACN,CAAC;AAGM,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IAIrB,AAAN,KAAK,CAAC,cAAc,CAAkB,QAAqB,EAAS,OAAwB;QAC1F,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAE1C,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,aAAa,CAAC,sBAAQ,CAAC,CAAC,IAAI,CAAC;YACnD,GAAG,QAAQ;YACX,SAAS,EAAE,iBAAiB,CAAC,QAAQ,CAAC;YACtC,YAAY,EAAE,oBAAoB,CAAC,QAAQ,CAAC;YAC5C,MAAM;YACN,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,IAAI;SACd,CAAC,CAAA;QAEF,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;YACvB,MAAM,IAAA,kCAAgB,EACpB,IAAI,EACJ;gBACE,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ,CAAC,SAAS;oBACxB,OAAO,EAAE,sBAAQ,CAAC,IAAI;oBACtB,KAAK,EAAE,MAAM,CAAC,EAAE;iBACjB;aACF,EACD,OAAO,CACR,CAAA;QACH,CAAC;QAED,OAAO,MAAM,CAAA;IACf,CAAC;IAKK,AAAN,KAAK,CAAC,cAAc,CACP,EAAU,EACP,KAAoB,EAC3B,OAAwB;QAE/B,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAE1C,MAAM,UAAU,GAAG,EAAE,CAAC,aAAa,CAAC,sBAAQ,CAAC,CAAA;QAC7C,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC;YACxC,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE;YACxC,6CAA6C;YAC7C,SAAS,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,iBAAiB,EAAE,SAAS,EAAE,SAAS,CAAC;SAC7F,CAAC,CAAA;QAEF,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC;YACnC,GAAG,QAAQ;YACX,GAAG,KAAK;YACR;;;eAGG;YACH,SAAS,EAAE,iBAAiB,CAAC,KAAK,CAAC;YACnC,YAAY,EAAE,oBAAoB,CAAC,KAAK,CAAC;YACzC,OAAO,EAAE,IAAI;SACd,CAAC,CAAA;QAEF,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,IAAA,wCAAsB,EAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;YACpE,MAAM,IAAA,kCAAgB,EACpB,IAAI,EACJ;gBACE,UAAU,EAAE;oBACV,IAAI,EAAE,KAAK,CAAC,SAAS;oBACrB,OAAO,EAAE,sBAAQ,CAAC,IAAI;oBACtB,KAAK,EAAE,MAAM,CAAC,EAAE;iBACjB;aACF,EACD,OAAO,CACR,CAAA;QACH,CAAC;QAED,OAAO,MAAM,CAAA;IACf,CAAC;IAKK,AAAN,KAAK,CAAC,sBAAsB,CACe,OAAwB,EAC1D,OAAwB;QAE/B,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAE1C,IAAI,OAAO,GAAG,EAAE,CAAA;QAChB,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,KAAU,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,CAAA;QACzF,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,KAAU,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,CAAA;QACzF,MAAM,YAAY,GAAG,EAAE,CAAC,aAAa,CAAC,sBAAQ,CAAC,CAAA;QAE/C,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC/C,MAAM,SAAS,GAAG,cAAc,CAAC,CAAC,CAAC,CAAA;gBAEnC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC;oBACrC,GAAG,SAAS;oBACZ,SAAS,EAAE,iBAAiB,CAAC,SAAS,CAAC;oBACvC,YAAY,EAAE,oBAAoB,CAAC,SAAS,CAAC;oBAC7C,MAAM;oBACN,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,IAAI;iBACd,CAAC,CAAA;gBAEF,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;oBACxB,MAAM,IAAA,kCAAgB,EACpB,IAAI,EACJ;wBACE,UAAU,EAAE;4BACV,IAAI,EAAE,SAAS,CAAC,SAAS;4BACzB,OAAO,EAAE,sBAAQ,CAAC,IAAI;4BACtB,KAAK,EAAE,MAAM,CAAC,EAAE;yBACjB;qBACF,EACD,OAAO,CACR,CAAA;gBACH,CAAC;gBAED,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;YAC1C,CAAC;QACH,CAAC;QAED,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC/C,MAAM,YAAY,GAAG,cAAc,CAAC,CAAC,CAAC,CAAA;gBACtC,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC;oBAC1C,KAAK,EAAE,EAAE,EAAE,EAAE,YAAY,CAAC,EAAE,EAAE;oBAC9B,6CAA6C;oBAC7C,SAAS,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,iBAAiB,EAAE,SAAS,EAAE,SAAS,CAAC;iBAC7F,CAAC,CAAA;gBAEF,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC;oBACrC,GAAG,QAAQ;oBACX,GAAG,YAAY;oBACf,SAAS,EAAE,iBAAiB,CAAC,YAAY,CAAC;oBAC1C,YAAY,EAAE,oBAAoB,CAAC,YAAY,CAAC;oBAChD,OAAO,EAAE,IAAI;iBACd,CAAC,CAAA;gBAEF,IAAI,YAAY,CAAC,SAAS,EAAE,CAAC;oBAC3B,MAAM,IAAA,wCAAsB,EAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;oBACpE,MAAM,IAAA,kCAAgB,EACpB,IAAI,EACJ;wBACE,UAAU,EAAE;4BACV,IAAI,EAAE,YAAY,CAAC,SAAS;4BAC5B,OAAO,EAAE,sBAAQ,CAAC,IAAI;4BACtB,KAAK,EAAE,MAAM,CAAC,EAAE;yBACjB;qBACF,EACD,OAAO,CACR,CAAA;gBACH,CAAC;gBAED,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;YAC1C,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAA;IAChB,CAAC;IAKK,AAAN,KAAK,CAAC,cAAc,CAAY,EAAU,EAAS,OAAwB;QACzE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAEpC,MAAM,EAAE,CAAC,aAAa,CAAC,sBAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;QAC1E,MAAM,IAAA,wCAAsB,EAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;QAE7D,OAAO,IAAI,CAAA;IACb,CAAC;IAKK,AAAN,KAAK,CAAC,gBAAgB,CACU,GAAa,EACpC,OAAwB;QAE/B,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAEpC,MAAM,EAAE,CAAC,aAAa,CAAC,sBAAQ,CAAC,CAAC,MAAM,CAAC;YACtC,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE;YACzB,EAAE,EAAE,IAAA,YAAE,EAAC,GAAG,CAAC;SACZ,CAAC,CAAA;QAEF,MAAM,IAAA,wCAAsB,EAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,OAAO,CAAC,CAAA;QAE5D,OAAO,IAAI,CAAA;IACb,CAAC;IAKK,AAAN,KAAK,CAAC,gBAAgB,CACwB,UAA2B,EAChE,OAAwB;QAE/B,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAEpC,MAAM,OAAO,CAAC,GAAG,CACf,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,QAAuB,EAAE,EAAE;YAC/C,MAAM,eAAe,GAAa,MAAM,EAAE,CAAC,aAAa,CAAC,sBAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAA;QAClG,CAAC,CAAC,CACH,CAAA;QAED,OAAO,IAAI,CAAA;IACb,CAAC;IAOK,AAAN,KAAK,CAAC,qBAAqB,CACN,UAAkB,EAC9B,OAAwB;QAE/B,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAEpC,IAAI,UAAU,GAAG,EAAE,CAAC,aAAa,CAAC,sBAAQ,CAAC,CAAA;QAC3C,IAAI,QAAQ,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC;YACtC,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE;SACrD,CAAC,CAAA;QAEF,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CACb,OAAO,CAAC,CAAC,CAAC,0BAA0B,EAAE;gBACpC,QAAQ,EAAE,UAAU;aACrB,CAAC,CACH,CAAA;QACH,CAAC;QAED,IAAI,CAAC;YACH,IAAI,MAAM,GAAG,MAAM,IAAA,mCAAgB,EAAC;gBAClC,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,MAAM,EAAE;oBACN,WAAW,EAAE,8BAAW;oBACxB,KAAK,EAAE,GAAG,MAAM,CAAC,EAAE,EAAE;oBACrB,IAAI,EAAE,UAAU;oBAChB,GAAG,EAAE,QAAQ,CAAC,EAAE;oBAChB,SAAS,EAAE,UAAU;iBACtB;gBACD,IAAI,EAAE,MAAM;gBACZ,QAAQ,EAAE,QAAQ,CAAC,QAAQ;gBAC3B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;gBAC3B,IAAI,EAAE;oBACJ,IAAI,EAAE,MAAM;oBACZ,UAAU,EAAE;wBACV,IAAI,EAAE,GAAG,+BAAY,iCAAiC;wBACtD,OAAO,EAAE;4BACP,cAAc,EAAE,kBAAkB;4BAClC,MAAM,EAAE,KAAK;yBACd;qBACF;oBACD,IAAI,EAAE;wBACJ,QAAQ,EAAE,MAAM,CAAC,EAAE;wBACnB,UAAU;qBACX;oBACD,aAAa,EAAE,IAAI;oBACnB,aAAa,EAAE,WAAW;oBAC1B,eAAe,EAAE,CAAC;oBAClB,YAAY,EAAE,EAAE;iBACjB;aACF,CAAC,CAAA;YAEF,OAAO,MAAM,UAAU,CAAC,IAAI,CAAC;gBAC3B,GAAG,QAAQ;gBACX,UAAU,EAAE,MAAM;aACnB,CAAC,CAAA;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,GAAG,CAAC,CAAA;QAC7C,CAAC;IACH,CAAC;IAQK,AAAN,KAAK,CAAC,oBAAoB,CACL,UAAkB,EAC9B,OAAwB;QAE/B,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAEpC,IAAI,UAAU,GAAG,EAAE,CAAC,aAAa,CAAC,sBAAQ,CAAC,CAAA;QAC3C,IAAI,QAAQ,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC;YACtC,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE;SACrD,CAAC,CAAA;QAEF,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CACb,OAAO,CAAC,CAAC,CAAC,0BAA0B,EAAE;gBACpC,QAAQ,EAAE,UAAU;aACrB,CAAC,CACH,CAAA;QACH,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAA,qCAAkB,EAAC,QAAQ,CAAC,UAAU,CAAC,CAAA;YAE7C,OAAO,MAAM,UAAU,CAAC,IAAI,CAAC;gBAC3B,GAAG,QAAQ;gBACX,UAAU,EAAE,IAAI;aACjB,CAAC,CAAA;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAA;QAC5C,CAAC;IACH,CAAC;CACF,CAAA;AA3TY,4CAAgB;AAIrB;IAHL,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,wBAAS,EAAC,mFAAmF,CAAC;IAC9F,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,sBAAQ,EAAE,EAAE,WAAW,EAAE,wBAAwB,EAAE,CAAC;IACnD,mBAAA,IAAA,kBAAG,EAAC,UAAU,CAAC,CAAA;IAAyB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;6CAAnB,8BAAW;;sDA2B1D;AAKK;IAHL,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,wBAAS,EAAC,mFAAmF,CAAC;IAC9F,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,sBAAQ,EAAE,EAAE,WAAW,EAAE,gCAAgC,EAAE,CAAC;IAE9E,mBAAA,IAAA,kBAAG,EAAC,IAAI,CAAC,CAAA;IACT,mBAAA,IAAA,kBAAG,EAAC,OAAO,CAAC,CAAA;IACZ,mBAAA,IAAA,kBAAG,GAAE,CAAA;;qDADe,gCAAa;;sDAwCnC;AAKK;IAHL,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,wBAAS,EAAC,mFAAmF,CAAC;IAC9F,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC,sBAAQ,CAAC,EAAE,EAAE,WAAW,EAAE,4CAA4C,EAAE,CAAC;IAE5F,mBAAA,IAAA,kBAAG,EAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,gCAAa,CAAC,CAAC,CAAA;IACvC,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;8DA6EP;AAKK;IAHL,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,wBAAS,EAAC,mFAAmF,CAAC;IAC9F,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,oBAAoB,EAAE,CAAC;IAC9C,mBAAA,IAAA,kBAAG,EAAC,IAAI,CAAC,CAAA;IAAc,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;sDAOjD;AAKK;IAHL,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,wBAAS,EAAC,mFAAmF,CAAC;IAC9F,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,+BAA+B,EAAE,CAAC;IAE5E,mBAAA,IAAA,kBAAG,EAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA;IAC5B,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;wDAYP;AAKK;IAHL,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,wBAAS,EAAC,mFAAmF,CAAC;IAC9F,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,+BAA+B,EAAE,CAAC;IAE5E,mBAAA,IAAA,kBAAG,EAAC,YAAY,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,gCAAa,CAAC,CAAC,CAAA;IAC1C,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;wDAWP;AAOK;IALL,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,wBAAS,EAAC,mFAAmF,CAAC;IAC9F,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,sBAAQ,EAAE;QAC7B,WAAW,EAAE,uEAAuE;KACrF,CAAC;IAEC,mBAAA,IAAA,kBAAG,EAAC,YAAY,CAAC,CAAA;IACjB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;6DAyDP;AAQK;IANL,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,wBAAS,EAAC,mFAAmF,CAAC;IAC9F,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,sBAAQ,EAAE;QAC7B,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,sEAAsE;KACpF,CAAC;IAEC,mBAAA,IAAA,kBAAG,EAAC,YAAY,CAAC,CAAA;IACjB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;4DA2BP;2BA1TU,gBAAgB;IAD5B,IAAA,uBAAQ,EAAC,sBAAQ,CAAC;GACN,gBAAgB,CA2T5B","sourcesContent":["import { Arg, Ctx, Directive, Mutation, Resolver } from 'type-graphql'\nimport { In } from 'typeorm'\n\nimport { createAttachment, deleteAttachmentsByRef } from '@things-factory/attachment-base'\nimport { Application, CallbackBase, registerSchedule, unregisterSchedule } from '@things-factory/scheduler-client'\nimport { ApprovalLineItem, OrgMemberTargetType } from '@things-factory/organization'\n\nimport { Activity, AssigneeItem } from './activity.js'\nimport { ActivityPatch, NewActivity } from './activity-type.js'\n\nfunction getApprovalLineValue(patch: NewActivity | ActivityPatch): ApprovalLineItem[] {\n const { approvalLine } = patch\n\n if (!('approvalLine' in patch)) {\n /* approvalLine이 언급되지 않았다면, 업데이트하지 않는다. */\n return\n }\n\n if (!approvalLine || !(approvalLine instanceof Array)) {\n /* approvalLine의 값이 없거나 배열이 아니라면, 클리어시킨다. */\n return null\n }\n\n return approvalLine\n .map(m => {\n return {\n type: m.type,\n /*\n * `value` 를 버리지 않는다. 결재자를 찾는 쪽이 **`value` 를 먼저** 본다\n * (`controllers/common.ts` — `approver?.id || assignee?.id || value`). 저장에서 버리면 화면이\n * `value` 로 지정한 결재자가 오류 없이 사라지고, 그 액티비티는 결재가 영영 안 걸린다.\n */\n value: m.value,\n approver: m.approver,\n /*\n * 무슨 자격으로 서나 — 비어 있으면 결재다. 여기서 버리면 참조로 지정한 사람이 결재자가 되어\n * **결재를 막게 된다**(참조는 안 막는 것이 뜻이다).\n */\n participation: m.participation,\n /* 참조에게 언제 알리나. 없으면 상신 즉시. */\n notifyAfter: m.notifyAfter\n } as ApprovalLineItem\n })\n .filter(m => m.type)\n .filter(m => {\n switch (m.type) {\n case OrgMemberTargetType.Employee:\n case OrgMemberTargetType.Department:\n case OrgMemberTargetType.Role:\n /* 찾는 쪽과 같은 것을 본다 — 여기서만 좁히면 저장은 됐는데 결재가 안 걸린다. */\n return !!(m.approver?.id || m.value)\n default:\n return true\n }\n })\n}\n\nfunction getAssigneesValue(patch: NewActivity | ActivityPatch): AssigneeItem[] {\n const { assignees } = patch\n\n if (!('assignees' in patch)) {\n /* assignees이 언급되지 않았다면, 업데이트하지 않는다. */\n return\n }\n\n if (!assignees || !(assignees instanceof Array)) {\n /* assignees의 값이 없거나 배열이 아니라면, 클리어시킨다. */\n return null\n }\n\n return assignees\n .map(m => {\n return {\n type: m.type,\n /* 결재선과 같은 이유다 — 찾는 쪽이 `value` 를 본다. */\n value: m.value,\n assignee: m.assignee\n } as AssigneeItem\n })\n .filter(m => m.type)\n .filter(m => {\n switch (m.type) {\n case OrgMemberTargetType.Employee:\n case OrgMemberTargetType.Department:\n case OrgMemberTargetType.Role:\n return !!(m.assignee?.id || m.value)\n default:\n return true\n }\n })\n}\n\n@Resolver(Activity)\nexport class ActivityMutation {\n @Directive('@transaction')\n @Directive('@privilege(category: \"activity\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Activity, { description: 'To create new Activity' })\n async createActivity(@Arg('activity') activity: NewActivity, @Ctx() context: ResolverContext): Promise<Activity> {\n const { domain, user, tx } = context.state\n\n const result = await tx.getRepository(Activity).save({\n ...activity,\n assignees: getAssigneesValue(activity),\n approvalLine: getApprovalLineValue(activity),\n domain,\n creator: user,\n updater: user\n })\n\n if (activity.thumbnail) {\n await createAttachment(\n null,\n {\n attachment: {\n file: activity.thumbnail,\n refType: Activity.name,\n refBy: result.id\n }\n },\n context\n )\n }\n\n return result\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"activity\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Activity, { description: 'To modify Activity information' })\n async updateActivity(\n @Arg('id') id: string,\n @Arg('patch') patch: ActivityPatch,\n @Ctx() context: ResolverContext\n ): Promise<Activity> {\n const { domain, user, tx } = context.state\n\n const repository = tx.getRepository(Activity)\n const activity = await repository.findOne({\n where: { domain: { id: domain.id }, id },\n /* history에 항상 반영될 수 있도록 relations가 있어야 함. */\n relations: ['domain', 'issuerRole', 'assigneeRole', 'supervisoryRole', 'creator', 'updater']\n })\n\n const result = await repository.save({\n ...activity,\n ...patch,\n /*\n * **`patch` 를 본다.** 앞서는 DB 에서 읽은 `activity` 를 넘기고 있어서, 화면에서 결재선이나\n * 담당자를 고쳐도 옛 값이 다시 저장됐다. 오류가 안 나서 「저장됐다」로 보인다.\n */\n assignees: getAssigneesValue(patch),\n approvalLine: getApprovalLineValue(patch),\n updater: user\n })\n\n if (patch.thumbnail) {\n await deleteAttachmentsByRef(null, { refBys: [result.id] }, context)\n await createAttachment(\n null,\n {\n attachment: {\n file: patch.thumbnail,\n refType: Activity.name,\n refBy: result.id\n }\n },\n context\n )\n }\n\n return result\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"activity\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => [Activity], { description: \"To modify multiple Activities' information\" })\n async updateMultipleActivity(\n @Arg('patches', type => [ActivityPatch]) patches: ActivityPatch[],\n @Ctx() context: ResolverContext\n ): Promise<Activity[]> {\n const { domain, user, tx } = context.state\n\n let results = []\n const _createRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === '+')\n const _updateRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === 'M')\n const activityRepo = tx.getRepository(Activity)\n\n if (_createRecords.length > 0) {\n for (let i = 0; i < _createRecords.length; i++) {\n const newRecord = _createRecords[i]\n\n const result = await activityRepo.save({\n ...newRecord,\n assignees: getAssigneesValue(newRecord),\n approvalLine: getApprovalLineValue(newRecord),\n domain,\n creator: user,\n updater: user\n })\n\n if (newRecord.thumbnail) {\n await createAttachment(\n null,\n {\n attachment: {\n file: newRecord.thumbnail,\n refType: Activity.name,\n refBy: result.id\n }\n },\n context\n )\n }\n\n results.push({ ...result, cuFlag: '+' })\n }\n }\n\n if (_updateRecords.length > 0) {\n for (let i = 0; i < _updateRecords.length; i++) {\n const updateRecord = _updateRecords[i]\n const activity = await activityRepo.findOne({\n where: { id: updateRecord.id },\n /* history에 항상 반영될 수 있도록 relations가 있어야 함. */\n relations: ['domain', 'issuerRole', 'assigneeRole', 'supervisoryRole', 'creator', 'updater']\n })\n\n const result = await activityRepo.save({\n ...activity,\n ...updateRecord,\n assignees: getAssigneesValue(updateRecord),\n approvalLine: getApprovalLineValue(updateRecord),\n updater: user\n })\n\n if (updateRecord.thumbnail) {\n await deleteAttachmentsByRef(null, { refBys: [result.id] }, context)\n await createAttachment(\n null,\n {\n attachment: {\n file: updateRecord.thumbnail,\n refType: Activity.name,\n refBy: result.id\n }\n },\n context\n )\n }\n\n results.push({ ...result, cuFlag: 'M' })\n }\n }\n\n return results\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"activity\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Boolean, { description: 'To delete Activity' })\n async deleteActivity(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain, tx } = context.state\n\n await tx.getRepository(Activity).delete({ domain: { id: domain.id }, id })\n await deleteAttachmentsByRef(null, { refBys: [id] }, context)\n\n return true\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"activity\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Boolean, { description: 'To delete multiple Activities' })\n async deleteActivities(\n @Arg('ids', type => [String]) ids: string[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, tx } = context.state\n\n await tx.getRepository(Activity).delete({\n domain: { id: domain.id },\n id: In(ids)\n })\n\n await deleteAttachmentsByRef(null, { refBys: ids }, context)\n\n return true\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"activity\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Boolean, { description: 'To import multiple Activities' })\n async importActivities(\n @Arg('activities', type => [ActivityPatch]) activities: ActivityPatch[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, tx } = context.state\n\n await Promise.all(\n activities.map(async (activity: ActivityPatch) => {\n const createdActivity: Activity = await tx.getRepository(Activity).save({ domain, ...activity })\n })\n )\n\n return true\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"activity\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Activity, {\n description: 'To start posting activity based on the schedule of the given activity'\n })\n async startActivitySchedule(\n @Arg('activityId') activityId: string,\n @Ctx() context: ResolverContext\n ): Promise<Activity> {\n const { domain, tx } = context.state\n\n var repository = tx.getRepository(Activity)\n var activity = await repository.findOne({\n where: { domain: { id: domain.id }, id: activityId }\n })\n\n if (!activity) {\n throw new Error(\n context.t('error.activity not found', {\n activity: activityId\n })\n )\n }\n\n try {\n var handle = await registerSchedule({\n name: activity.name,\n client: {\n application: Application,\n group: `${domain.id}`,\n type: 'activity',\n key: activity.id,\n operation: 'schedule'\n },\n type: 'cron',\n schedule: activity.schedule,\n timezone: activity.timezone,\n task: {\n type: 'rest',\n connection: {\n host: `${CallbackBase}/callback-schedule-for-activity`,\n headers: {\n 'Content-Type': 'application/json',\n accept: '*/*'\n }\n },\n data: {\n domainId: domain.id,\n activityId\n },\n history_check: true,\n failed_policy: 'retry_dlq',\n max_retry_count: 3,\n retry_period: 60\n }\n })\n\n return await repository.save({\n ...activity,\n scheduleId: handle\n })\n } catch (err) {\n console.error('startActivitySchedule', err)\n }\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"activity\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Activity, {\n nullable: true,\n description: 'To stop posting activity based on the schedule of the given activity'\n })\n async stopActivitySchedule(\n @Arg('activityId') activityId: string,\n @Ctx() context: ResolverContext\n ): Promise<Activity | undefined> {\n const { domain, tx } = context.state\n\n var repository = tx.getRepository(Activity)\n var activity = await repository.findOne({\n where: { domain: { id: domain.id }, id: activityId }\n })\n\n if (!activity) {\n throw new Error(\n context.t('error.activity not found', {\n activity: activityId\n })\n )\n }\n\n try {\n await unregisterSchedule(activity.scheduleId)\n\n return await repository.save({\n ...activity,\n scheduleId: null\n })\n } catch (err) {\n console.error('stopActivitySchedule', err)\n }\n }\n}\n"]}
@@ -12,6 +12,7 @@ const activity_approval_js_1 = require("./activity-approval.js");
12
12
  const activity_approval_type_js_1 = require("./activity-approval-type.js");
13
13
  const approval_line_js_1 = require("../../controllers/activity-approval/approval-line.js");
14
14
  const my_pending_approvals_js_1 = require("./my-pending-approvals.js");
15
+ const assert_may_read_js_1 = require("../../controllers/activity-read/assert-may-read.js");
15
16
  const activity_instance_js_1 = require("../activity-instance/activity-instance.js");
16
17
  const nulls_last_js_1 = require("../nulls-last.js");
17
18
  /*
@@ -120,9 +121,13 @@ function applyApprovalSortings(queryBuilder, sortings) {
120
121
  let ActivityApprovalQuery = class ActivityApprovalQuery {
121
122
  async activityApproval(id, context) {
122
123
  const { domain } = context.state;
123
- return await (0, shell_1.getRepository)(activity_approval_js_1.ActivityApproval).findOne({
124
+ const approval = await (0, shell_1.getRepository)(activity_approval_js_1.ActivityApproval).findOne({
124
125
  where: { domain: { id: domain.id }, id }
125
126
  });
127
+ /* 없는 건은 없다고(null). 있는데 못 읽는 건은 이름 붙여 거절한다 — § assert-may-read.ts */
128
+ if (approval)
129
+ await (0, assert_may_read_js_1.assertMayReadApproval)(approval, context);
130
+ return approval;
126
131
  }
127
132
  async activityApprovals(params, context) {
128
133
  const { domain } = context.state;
@@ -285,6 +290,7 @@ tslib_1.__decorate([
285
290
  tslib_1.__metadata("design:returntype", Promise)
286
291
  ], ActivityApprovalQuery.prototype, "activityApproval", null);
287
292
  tslib_1.__decorate([
293
+ (0, type_graphql_1.Directive)('@privilege(category: "activity-instance", privilege: "query", domainOwnerGranted: true)'),
288
294
  (0, type_graphql_1.Query)(returns => activity_approval_type_js_1.ActivityApprovalList, { description: 'To fetch multiple ActivityApprovals' }),
289
295
  tslib_1.__param(0, (0, type_graphql_1.Args)(type => shell_1.ListParam)),
290
296
  tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
@@ -1 +1 @@
1
- {"version":3,"file":"activity-approval-query.js","sourceRoot":"","sources":["../../../server/service/activity-approval/activity-approval-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { Brackets } from 'typeorm'\nimport { DriverUtils } from 'typeorm/driver/DriverUtils.js'\nimport { Resolver, Query, FieldResolver, Root, Args, Arg, Ctx, Directive } from 'type-graphql'\nimport { Domain, getQueryBuilderFromListParams, getRepository, ListParam } from '@things-factory/shell'\nimport { Role, User } from '@things-factory/auth-base'\nimport { ActivityThread } from '../activity-thread/activity-thread.js'\nimport { ActivityApproval } from './activity-approval.js'\nimport { ActivityApprovalList } from './activity-approval-type.js'\nimport { TERMINATED_JUDGMENTS } from '../../controllers/activity-approval/approval-line.js'\nimport { myPendingApprovalsWhere } from './my-pending-approvals.js'\nimport { ActivityInstance } from '../activity-instance/activity-instance.js'\nimport { NULL_RANK_ALIAS, nullsLastSelect } from '../nulls-last.js'\n\n/*\n * **결재 목록이 걸러 볼 수 있는 칸** — 네 목록이 같은 표를 쓴다.\n *\n * ── 왜 하나로 모으나 (2026-09-05) ──────────────────────────────────────────\n * 이 칸들은 `ActivityApproval` 에 없다. 활동 인스턴스에 있고, 결재는 스레드를 거쳐 그것을 본다.\n * 그래서 목록마다 `filtersMap` 으로 길을 알려 줘야 하고, 안 알려 주면 **그 칸으로 거르는 순간\n * 500 이 난다.**\n *\n * 표를 손으로 네 벌 들고 있었고, 실제로 갈라졌다.\n *\n * approvalPendingList name · description · priority · dueAt\n * approvalDoneList name · description · priority · dueAt\n * approvalReferenceList name · description ← `dueAt` 에서 터졌다\n * activityApprovals (표가 아예 없다) ← `name` 에서도 터진다\n *\n * 화면은 넷에 같은 칩을 보낸다(`client/chip-filters.ts` 의 「24시간 내 마감」이 `dueAt lte` 를\n * 보낸다). 그러니 목록마다 표가 다르면 **어느 목록에서만 터지는** 모양이 된다 — 실측된 것이 그\n * 모양이었다.\n *\n * 다섯 번째 목록이 생길 때 또 갈라지지 않게 한 곳에 둔다.\n */\nconst APPROVAL_FILTERS_MAP: Record<string, { relationColumn: string; columnName: string }> = {\n ...['name', 'description', 'priority'].reduce(\n (map, columnName) => ({ ...map, [columnName]: { relationColumn: 'activityThread.activityInstance', columnName } }),\n {} as Record<string, { relationColumn: string; columnName: string }>\n ),\n\n /*\n * 기한은 **스레드의 것**이다 — 인스턴스에도 같은 이름의 칸이 있지만 화면이 보여 주는 것은 스레드\n * 쪽이다(approval-pending-list-page 는 인스턴스를 펼친 뒤 `dueAt: thread.dueAt` 으로 덮어쓴다).\n *\n * 매핑이 인스턴스를 가리키고 있었다. 지금 자료에서는 두 값이 같아 드러나지 않지만 다른 칸이고,\n * 어긋나는 순간 목록이 **보이지 않는 값으로** 정렬되고 「만기」 칩도 보이지 않는 값으로 거른다.\n * 화면이 보여 주는 것과 같은 칸을 본다.\n */\n dueAt: { relationColumn: 'activityThread', columnName: 'dueAt' }\n}\n\n/** 결재선 스레드가 아니라 업무 인스턴스 쪽 칸으로 정렬하는 이름들. 나머지는 결재 행(ap) 자신이다. */\nconst APPROVAL_INSTANCE_SORTS = new Set(['name', 'description', 'priority'])\n\n/** 스레드(at) 쪽 칸으로 정렬하는 이름들. 화면이 보여 주는 것과 같은 칸이다. */\nconst APPROVAL_THREAD_SORTS = new Set(['dueAt', 'assignedAt', 'state'])\n\n/** 값이 없으면 뒤로 보낼 칸. 기한이 없는 건은 「언제까지」를 묻는 정렬에서 맨 뒤가 맞다. */\nconst APPROVAL_NULLS_LAST = new Set(['dueAt'])\n\n/**\n * 내 결재함의 정렬 — **기한이 없는 건은 뒤로 간다.**\n *\n * 공통 빌더에 맡기면 NULL 자리를 정할 수 없다. sqlite 는 오름차순에서 NULL 을 먼저 내므로 기본\n * 정렬이 기한 순인 목록의 맨 위가 **기한 없는 건**으로 채워진다 — 급한 것부터 보라는 정렬인데\n * 정작 급한 것이 아래로 밀린다. 「할 일」 목록이 같은 이유로 이미 이 처리를 갖고 있고, 규칙은\n * nulls-last.ts 한 곳에 있다.\n *\n * 정렬에 쓸 join 은 여기서 직접 건다. 공통 빌더의 join 은 filter 가 있을 때만 생기므로, 정렬만\n * 하는 요청에서는 기댈 것이 없다.\n */\nfunction applyApprovalSortings(queryBuilder: any, sortings: { name: string; desc?: boolean }[]) {\n const escape = (part: string) => queryBuilder.connection.driver.escape(part)\n\n const fieldOf = (name: string) => {\n const metadata = getRepository(APPROVAL_INSTANCE_SORTS.has(name) ? ActivityInstance : ActivityThread).metadata\n const column = metadata.findColumnWithPropertyName(name)\n\n /* 이름을 못 찾으면 SQL 을 지어내지 않는다. */\n return column ? `${escape(APPROVAL_INSTANCE_SORTS.has(name) ? 'ai' : 'at')}.${escape(column.databaseName)}` : undefined\n }\n\n const terms: { expression: string; direction: 'ASC' | 'DESC'; select?: string }[] = []\n\n for (const sorting of sortings || []) {\n if (!sorting?.name) {\n continue\n }\n\n const direction: 'ASC' | 'DESC' = sorting.desc ? 'DESC' : 'ASC'\n\n if (APPROVAL_NULLS_LAST.has(sorting.name)) {\n const field = fieldOf(sorting.name)\n\n /* 방향이 뒤집혀도 값 없는 것은 뒤다 — 이 항목만 늘 오름차순이다. */\n if (field) {\n terms.push({ expression: NULL_RANK_ALIAS, direction: 'ASC', select: nullsLastSelect(field) })\n }\n }\n\n const alias = APPROVAL_INSTANCE_SORTS.has(sorting.name)\n ? 'ai'\n : APPROVAL_THREAD_SORTS.has(sorting.name)\n ? 'at'\n : 'ap'\n\n /*\n * join 한 칸으로 정렬하면 그 칸이 select 에 있어야 한다.\n *\n * 여기 join 은 leftJoin 이라 칸을 싣지 않는데, 정렬 + 페이지네이션은 TypeORM 의 distinct 경로를\n * 타고 모든 것을 서브쿼리로 감싼 뒤 ORDER BY 를 `distinctAlias.<별칭>` 으로 다시 쓴다. 실을 것이\n * 없으면 그 이름이 없다 — 실측: `no such column: distinctAlias.at_due_at`.\n *\n * 별칭은 TypeORM 이 찾을 때 쓰는 그 함수로 만든다. property 이름으로 지으면 dueAt 처럼 DB 칸\n * 이름과 철자가 다른 칸에서 어긋난다(shell 의 applyJoins 가 같은 이유로 고쳐졌다).\n */\n if (alias !== 'ap') {\n const metadata = getRepository(alias === 'ai' ? ActivityInstance : ActivityThread).metadata\n const column = metadata.findColumnWithPropertyName(sorting.name)\n\n if (column) {\n queryBuilder.addSelect(\n `${alias}.${sorting.name}`,\n DriverUtils.buildAlias(queryBuilder.connection.driver, undefined, alias, column.databaseName)\n )\n }\n }\n\n terms.push({ expression: `${alias}.${sorting.name}`, direction })\n }\n\n terms.forEach(({ expression, direction, select }, index) => {\n /* 식은 select 에 이름 붙여 올린다 — orderBy 는 점이 든 식을 alias 로 읽는다(nulls-last 머리말). */\n if (select) {\n queryBuilder.addSelect(select, expression)\n }\n\n index === 0 ? queryBuilder.orderBy(expression, direction) : queryBuilder.addOrderBy(expression, direction)\n })\n}\n\n@Resolver(ActivityApproval)\nexport class ActivityApprovalQuery {\n @Query(returns => ActivityApproval!, { nullable: true, description: 'To fetch a ActivityApproval' })\n async activityApproval(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<ActivityApproval> {\n const { domain } = context.state\n\n return await getRepository(ActivityApproval).findOne({\n where: { domain: { id: domain.id }, id }\n })\n }\n\n @Query(returns => ActivityApprovalList, { description: 'To fetch multiple ActivityApprovals' })\n async activityApprovals(\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<ActivityApprovalList> {\n const { domain } = context.state\n\n const queryBuilder = getQueryBuilderFromListParams({\n domain,\n params,\n repository: getRepository(ActivityApproval),\n searchables: ['name', 'description'],\n filtersMap: APPROVAL_FILTERS_MAP\n })\n\n const [items, total] = await queryBuilder.getManyAndCount()\n\n return { items, total }\n }\n\n @Query(returns => ActivityApprovalList, { description: 'To fetch the list of work results I need to review' })\n async approvalPendingList(\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<ActivityApprovalList> {\n var { domain, user } = context.state\n\n user = await getRepository(User).findOne({\n where: { id: user.id },\n relations: ['roles']\n })\n const roles = user.roles.filter(role => role.domainId === domain.id).map(role => role.id)\n\n const queryBuilder = getQueryBuilderFromListParams({\n repository: getRepository(ActivityApproval),\n /* 정렬은 아래에서 직접 건다(applyApprovalSortings 머리말) — 여기에 넘기면 NULL 자리를 못 정한다. */\n params: { ...params, sortings: [] },\n domain,\n alias: 'ap',\n searchables: ['name', 'description'],\n filtersMap: APPROVAL_FILTERS_MAP\n })\n /* 정렬이 쓸 join — 정렬만 하는 요청에는 filter 쪽 join 이 없다. */\n .leftJoin('ap.activityThread', 'at')\n .leftJoin('at.activityInstance', 'ai')\n /* 「내가 판단해야 할 것」의 정의는 한 자리에 있다 — 달력도 같은 것을 읽는다. */\n .andWhere(myPendingApprovalsWhere({ userId: user.id, roles }))\n\n applyApprovalSortings(queryBuilder, params.sortings || [])\n\n const [items, total] = await queryBuilder.getManyAndCount()\n\n return { items, total }\n }\n\n /**\n * **내가 참조로 걸린 것** — 결재하는 것이 아니라 보고 의견을 낼 수 있는 것.\n *\n * 승인 대기 목록과 나눈다. 섞으면 참조자가 「내가 승인해야 하나」로 읽고, 결재자는 남의 참조 건까지\n * 훑게 된다. 두 목록의 물음이 다르다 — 「내가 결정할 것」과 「내가 알아야 할 것」.\n *\n * 내 결재함은 아직 확인할 일이 있는 건만 보인다. 업무가 끝나며 참조 행도 `closed`로 닫히므로,\n * 끝난 참조는 여기에서 빼고 완료 이력에서 확인한다.\n */\n @Query(returns => ActivityApprovalList, {\n description: 'To fetch the approvals where I am a reference — I may comment, I do not decide'\n })\n async approvalReferenceList(\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<ActivityApprovalList> {\n var { domain, user } = context.state\n\n user = await getRepository(User).findOne({ where: { id: user.id }, relations: ['roles'] })\n const roles = (user.roles ?? []).filter(role => role.domainId === domain.id).map(role => role.id)\n\n const queryBuilder = getQueryBuilderFromListParams({\n repository: getRepository(ActivityApproval),\n params,\n domain,\n alias: 'ap',\n searchables: ['name', 'description'],\n filtersMap: APPROVAL_FILTERS_MAP\n })\n .andWhere(`ap.participation = 'reference'`)\n /* `NULL`은 오래된 행을 위한 열린 상태다. SQL의 NOT IN은 NULL을 걸러 버리므로 따로 포함한다. */\n .andWhere('(ap.judgment IS NULL OR ap.judgment NOT IN (:...judgment))', { judgment: [...TERMINATED_JUDGMENTS] })\n .andWhere(\n new Brackets(qb => {\n qb.where('ap.approver = :user', { user: user.id })\n /* 역할로 걸린 참조는 그 역할을 가진 사람 모두가 본다 — 결재와 같은 규칙이다. */\n if (roles.length > 0) qb.orWhere('ap.approverRole IN (:...roles)', { roles })\n })\n )\n\n const [items, total] = await queryBuilder.getManyAndCount()\n\n return { items, total }\n }\n\n /**\n * 내가 결재하거나 참조로 받은 건 중 끝난 것.\n *\n * `doneList`는 업무 담당자 기준이라, 결재·참조 참여자에게 완료 이력을 보장하지 않는다. 참여 행\n * 자신을 기준으로 읽는 목록을 둬야 「내 결재함」에서 열린 건을 치운 뒤에도 이력을 다시 찾을 수 있다.\n */\n @Query(returns => ActivityApprovalList, {\n description: 'To fetch completed approvals where I participated'\n })\n async approvalCompletedList(\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<ActivityApprovalList> {\n var { domain, user } = context.state\n\n user = await getRepository(User).findOne({ where: { id: user.id }, relations: ['roles'] })\n const roles = (user.roles ?? []).filter(role => role.domainId === domain.id).map(role => role.id)\n const judgment = [...TERMINATED_JUDGMENTS]\n\n const queryBuilder = getQueryBuilderFromListParams({\n repository: getRepository(ActivityApproval),\n params,\n domain,\n alias: 'ap',\n searchables: ['name', 'description'],\n filtersMap: APPROVAL_FILTERS_MAP\n })\n .andWhere('ap.judgment IN (:...judgment)', { judgment })\n .andWhere(\n new Brackets(qb => {\n qb.where('ap.approver = :user', { user: user.id })\n if (roles.length > 0) qb.orWhere('ap.approverRole IN (:...roles)', { roles })\n })\n )\n\n const [items, total] = await queryBuilder.getManyAndCount()\n\n return { items, total }\n }\n\n @Query(returns => ActivityApprovalList, {\n description: 'To fetch the approvals(ActivityApprovals) which has done by me'\n })\n async approvalDoneList(\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<ActivityApprovalList> {\n var { domain, user } = context.state\n\n /* 「끝난 것」의 정의는 한 자리에 있다 — 여기서 다시 세면 값이 늘 때 한쪽만 늘어난다. */\n const judgment = [...TERMINATED_JUDGMENTS]\n\n const [items, total] = await getQueryBuilderFromListParams({\n repository: getRepository(ActivityApproval),\n params,\n domain,\n alias: 'ap',\n searchables: ['name', 'description'],\n filtersMap: APPROVAL_FILTERS_MAP\n })\n .andWhere('ap.judgment IN (:...judgment)', { judgment })\n /*\n * 역할로 걸린 결재를 처리하면 이제 `approver` 에 처리한 사람이 들어간다(`approve.ts`·`reject.ts`).\n * 그래서 이 한 줄로 자기가 처리한 것이 다 걸린다 — 개인으로 걸린 것이든 역할로 걸린 것이든.\n *\n * 고치기 전에 처리한 역할 결재는 `approver` 가 비어 있어 여기 안 나온다. 지난 기록을 뒤에서 고쳐\n * 쓰지 않는다는 규율에 따라 그대로 둔다.\n */\n .andWhere('ap.approver = :user', { user: user.id })\n .getManyAndCount()\n\n return { items, total }\n }\n\n @FieldResolver(type => ActivityThread)\n async activityThread(@Root() activityApproval: ActivityApproval): Promise<ActivityThread> {\n return await getRepository(ActivityThread).findOneBy({ id: activityApproval.activityThreadId })\n }\n\n @FieldResolver(type => Domain)\n async domain(@Root() activityApproval: ActivityApproval): Promise<Domain> {\n return await getRepository(Domain).findOneBy({ id: activityApproval.domainId })\n }\n\n @FieldResolver(type => User)\n async approver(@Root() activityApproval: ActivityApproval): Promise<User> {\n return activityApproval.approverId && (await getRepository(User).findOneBy({ id: activityApproval.approverId }))\n }\n\n /**\n * 누가 결재해야 하나가 **역할**일 때.\n *\n * 이 리졸버가 없어서 `approverRole` 이 늘 `null` 로 나갔다. DB 에는 들어 있는데 질의가 관계를 안\n * 싣기 때문이다. 그래서 결재 목록이 「누가 결재해야 하나」를 못 보였다 — 개인으로 지정한 건만 보이고\n * 역할로 지정한 건은 빈칸이었다.\n */\n @FieldResolver(type => Role, { nullable: true })\n async approverRole(@Root() activityApproval: ActivityApproval): Promise<Role> {\n return activityApproval.approverRoleId && (await getRepository(Role).findOneBy({ id: activityApproval.approverRoleId }))\n }\n\n @FieldResolver(type => User)\n async updater(@Root() activityApproval: ActivityApproval): Promise<User> {\n return activityApproval.updaterId && (await getRepository(User).findOneBy({ id: activityApproval.updaterId }))\n }\n\n @FieldResolver(type => User)\n async creator(@Root() activityApproval: ActivityApproval): Promise<User> {\n return activityApproval.creatorId && (await getRepository(User).findOneBy({ id: activityApproval.creatorId }))\n }\n\n @FieldResolver(type => User)\n async terminator(@Root() activityApproval: ActivityApproval): Promise<User> {\n return activityApproval.terminatorId && (await getRepository(User).findOneBy({ id: activityApproval.terminatorId }))\n }\n}\n"]}
1
+ {"version":3,"file":"activity-approval-query.js","sourceRoot":"","sources":["../../../server/service/activity-approval/activity-approval-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { Brackets } from 'typeorm'\nimport { DriverUtils } from 'typeorm/driver/DriverUtils.js'\nimport { Resolver, Query, FieldResolver, Root, Args, Arg, Ctx, Directive } from 'type-graphql'\nimport { Domain, getQueryBuilderFromListParams, getRepository, ListParam } from '@things-factory/shell'\nimport { Role, User } from '@things-factory/auth-base'\nimport { ActivityThread } from '../activity-thread/activity-thread.js'\nimport { ActivityApproval } from './activity-approval.js'\nimport { ActivityApprovalList } from './activity-approval-type.js'\nimport { TERMINATED_JUDGMENTS } from '../../controllers/activity-approval/approval-line.js'\nimport { myPendingApprovalsWhere } from './my-pending-approvals.js'\nimport { assertMayReadApproval } from '../../controllers/activity-read/assert-may-read.js'\nimport { ActivityInstance } from '../activity-instance/activity-instance.js'\nimport { NULL_RANK_ALIAS, nullsLastSelect } from '../nulls-last.js'\n\n/*\n * **결재 목록이 걸러 볼 수 있는 칸** — 네 목록이 같은 표를 쓴다.\n *\n * ── 왜 하나로 모으나 (2026-09-05) ──────────────────────────────────────────\n * 이 칸들은 `ActivityApproval` 에 없다. 활동 인스턴스에 있고, 결재는 스레드를 거쳐 그것을 본다.\n * 그래서 목록마다 `filtersMap` 으로 길을 알려 줘야 하고, 안 알려 주면 **그 칸으로 거르는 순간\n * 500 이 난다.**\n *\n * 표를 손으로 네 벌 들고 있었고, 실제로 갈라졌다.\n *\n * approvalPendingList name · description · priority · dueAt\n * approvalDoneList name · description · priority · dueAt\n * approvalReferenceList name · description ← `dueAt` 에서 터졌다\n * activityApprovals (표가 아예 없다) ← `name` 에서도 터진다\n *\n * 화면은 넷에 같은 칩을 보낸다(`client/chip-filters.ts` 의 「24시간 내 마감」이 `dueAt lte` 를\n * 보낸다). 그러니 목록마다 표가 다르면 **어느 목록에서만 터지는** 모양이 된다 — 실측된 것이 그\n * 모양이었다.\n *\n * 다섯 번째 목록이 생길 때 또 갈라지지 않게 한 곳에 둔다.\n */\nconst APPROVAL_FILTERS_MAP: Record<string, { relationColumn: string; columnName: string }> = {\n ...['name', 'description', 'priority'].reduce(\n (map, columnName) => ({ ...map, [columnName]: { relationColumn: 'activityThread.activityInstance', columnName } }),\n {} as Record<string, { relationColumn: string; columnName: string }>\n ),\n\n /*\n * 기한은 **스레드의 것**이다 — 인스턴스에도 같은 이름의 칸이 있지만 화면이 보여 주는 것은 스레드\n * 쪽이다(approval-pending-list-page 는 인스턴스를 펼친 뒤 `dueAt: thread.dueAt` 으로 덮어쓴다).\n *\n * 매핑이 인스턴스를 가리키고 있었다. 지금 자료에서는 두 값이 같아 드러나지 않지만 다른 칸이고,\n * 어긋나는 순간 목록이 **보이지 않는 값으로** 정렬되고 「만기」 칩도 보이지 않는 값으로 거른다.\n * 화면이 보여 주는 것과 같은 칸을 본다.\n */\n dueAt: { relationColumn: 'activityThread', columnName: 'dueAt' }\n}\n\n/** 결재선 스레드가 아니라 업무 인스턴스 쪽 칸으로 정렬하는 이름들. 나머지는 결재 행(ap) 자신이다. */\nconst APPROVAL_INSTANCE_SORTS = new Set(['name', 'description', 'priority'])\n\n/** 스레드(at) 쪽 칸으로 정렬하는 이름들. 화면이 보여 주는 것과 같은 칸이다. */\nconst APPROVAL_THREAD_SORTS = new Set(['dueAt', 'assignedAt', 'state'])\n\n/** 값이 없으면 뒤로 보낼 칸. 기한이 없는 건은 「언제까지」를 묻는 정렬에서 맨 뒤가 맞다. */\nconst APPROVAL_NULLS_LAST = new Set(['dueAt'])\n\n/**\n * 내 결재함의 정렬 — **기한이 없는 건은 뒤로 간다.**\n *\n * 공통 빌더에 맡기면 NULL 자리를 정할 수 없다. sqlite 는 오름차순에서 NULL 을 먼저 내므로 기본\n * 정렬이 기한 순인 목록의 맨 위가 **기한 없는 건**으로 채워진다 — 급한 것부터 보라는 정렬인데\n * 정작 급한 것이 아래로 밀린다. 「할 일」 목록이 같은 이유로 이미 이 처리를 갖고 있고, 규칙은\n * nulls-last.ts 한 곳에 있다.\n *\n * 정렬에 쓸 join 은 여기서 직접 건다. 공통 빌더의 join 은 filter 가 있을 때만 생기므로, 정렬만\n * 하는 요청에서는 기댈 것이 없다.\n */\nfunction applyApprovalSortings(queryBuilder: any, sortings: { name: string; desc?: boolean }[]) {\n const escape = (part: string) => queryBuilder.connection.driver.escape(part)\n\n const fieldOf = (name: string) => {\n const metadata = getRepository(APPROVAL_INSTANCE_SORTS.has(name) ? ActivityInstance : ActivityThread).metadata\n const column = metadata.findColumnWithPropertyName(name)\n\n /* 이름을 못 찾으면 SQL 을 지어내지 않는다. */\n return column ? `${escape(APPROVAL_INSTANCE_SORTS.has(name) ? 'ai' : 'at')}.${escape(column.databaseName)}` : undefined\n }\n\n const terms: { expression: string; direction: 'ASC' | 'DESC'; select?: string }[] = []\n\n for (const sorting of sortings || []) {\n if (!sorting?.name) {\n continue\n }\n\n const direction: 'ASC' | 'DESC' = sorting.desc ? 'DESC' : 'ASC'\n\n if (APPROVAL_NULLS_LAST.has(sorting.name)) {\n const field = fieldOf(sorting.name)\n\n /* 방향이 뒤집혀도 값 없는 것은 뒤다 — 이 항목만 늘 오름차순이다. */\n if (field) {\n terms.push({ expression: NULL_RANK_ALIAS, direction: 'ASC', select: nullsLastSelect(field) })\n }\n }\n\n const alias = APPROVAL_INSTANCE_SORTS.has(sorting.name)\n ? 'ai'\n : APPROVAL_THREAD_SORTS.has(sorting.name)\n ? 'at'\n : 'ap'\n\n /*\n * join 한 칸으로 정렬하면 그 칸이 select 에 있어야 한다.\n *\n * 여기 join 은 leftJoin 이라 칸을 싣지 않는데, 정렬 + 페이지네이션은 TypeORM 의 distinct 경로를\n * 타고 모든 것을 서브쿼리로 감싼 뒤 ORDER BY 를 `distinctAlias.<별칭>` 으로 다시 쓴다. 실을 것이\n * 없으면 그 이름이 없다 — 실측: `no such column: distinctAlias.at_due_at`.\n *\n * 별칭은 TypeORM 이 찾을 때 쓰는 그 함수로 만든다. property 이름으로 지으면 dueAt 처럼 DB 칸\n * 이름과 철자가 다른 칸에서 어긋난다(shell 의 applyJoins 가 같은 이유로 고쳐졌다).\n */\n if (alias !== 'ap') {\n const metadata = getRepository(alias === 'ai' ? ActivityInstance : ActivityThread).metadata\n const column = metadata.findColumnWithPropertyName(sorting.name)\n\n if (column) {\n queryBuilder.addSelect(\n `${alias}.${sorting.name}`,\n DriverUtils.buildAlias(queryBuilder.connection.driver, undefined, alias, column.databaseName)\n )\n }\n }\n\n terms.push({ expression: `${alias}.${sorting.name}`, direction })\n }\n\n terms.forEach(({ expression, direction, select }, index) => {\n /* 식은 select 에 이름 붙여 올린다 — orderBy 는 점이 든 식을 alias 로 읽는다(nulls-last 머리말). */\n if (select) {\n queryBuilder.addSelect(select, expression)\n }\n\n index === 0 ? queryBuilder.orderBy(expression, direction) : queryBuilder.addOrderBy(expression, direction)\n })\n}\n\n@Resolver(ActivityApproval)\nexport class ActivityApprovalQuery {\n @Query(returns => ActivityApproval!, { nullable: true, description: 'To fetch a ActivityApproval' })\n async activityApproval(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<ActivityApproval> {\n const { domain } = context.state\n\n const approval = await getRepository(ActivityApproval).findOne({\n where: { domain: { id: domain.id }, id }\n })\n\n /* 없는 건은 없다고(null). 있는데 못 읽는 건은 이름 붙여 거절한다 — § assert-may-read.ts */\n if (approval) await assertMayReadApproval(approval, context)\n\n return approval\n }\n\n @Directive('@privilege(category: \"activity-instance\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => ActivityApprovalList, { description: 'To fetch multiple ActivityApprovals' })\n async activityApprovals(\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<ActivityApprovalList> {\n const { domain } = context.state\n\n const queryBuilder = getQueryBuilderFromListParams({\n domain,\n params,\n repository: getRepository(ActivityApproval),\n searchables: ['name', 'description'],\n filtersMap: APPROVAL_FILTERS_MAP\n })\n\n const [items, total] = await queryBuilder.getManyAndCount()\n\n return { items, total }\n }\n\n @Query(returns => ActivityApprovalList, { description: 'To fetch the list of work results I need to review' })\n async approvalPendingList(\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<ActivityApprovalList> {\n var { domain, user } = context.state\n\n user = await getRepository(User).findOne({\n where: { id: user.id },\n relations: ['roles']\n })\n const roles = user.roles.filter(role => role.domainId === domain.id).map(role => role.id)\n\n const queryBuilder = getQueryBuilderFromListParams({\n repository: getRepository(ActivityApproval),\n /* 정렬은 아래에서 직접 건다(applyApprovalSortings 머리말) — 여기에 넘기면 NULL 자리를 못 정한다. */\n params: { ...params, sortings: [] },\n domain,\n alias: 'ap',\n searchables: ['name', 'description'],\n filtersMap: APPROVAL_FILTERS_MAP\n })\n /* 정렬이 쓸 join — 정렬만 하는 요청에는 filter 쪽 join 이 없다. */\n .leftJoin('ap.activityThread', 'at')\n .leftJoin('at.activityInstance', 'ai')\n /* 「내가 판단해야 할 것」의 정의는 한 자리에 있다 — 달력도 같은 것을 읽는다. */\n .andWhere(myPendingApprovalsWhere({ userId: user.id, roles }))\n\n applyApprovalSortings(queryBuilder, params.sortings || [])\n\n const [items, total] = await queryBuilder.getManyAndCount()\n\n return { items, total }\n }\n\n /**\n * **내가 참조로 걸린 것** — 결재하는 것이 아니라 보고 의견을 낼 수 있는 것.\n *\n * 승인 대기 목록과 나눈다. 섞으면 참조자가 「내가 승인해야 하나」로 읽고, 결재자는 남의 참조 건까지\n * 훑게 된다. 두 목록의 물음이 다르다 — 「내가 결정할 것」과 「내가 알아야 할 것」.\n *\n * 내 결재함은 아직 확인할 일이 있는 건만 보인다. 업무가 끝나며 참조 행도 `closed`로 닫히므로,\n * 끝난 참조는 여기에서 빼고 완료 이력에서 확인한다.\n */\n @Query(returns => ActivityApprovalList, {\n description: 'To fetch the approvals where I am a reference — I may comment, I do not decide'\n })\n async approvalReferenceList(\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<ActivityApprovalList> {\n var { domain, user } = context.state\n\n user = await getRepository(User).findOne({ where: { id: user.id }, relations: ['roles'] })\n const roles = (user.roles ?? []).filter(role => role.domainId === domain.id).map(role => role.id)\n\n const queryBuilder = getQueryBuilderFromListParams({\n repository: getRepository(ActivityApproval),\n params,\n domain,\n alias: 'ap',\n searchables: ['name', 'description'],\n filtersMap: APPROVAL_FILTERS_MAP\n })\n .andWhere(`ap.participation = 'reference'`)\n /* `NULL`은 오래된 행을 위한 열린 상태다. SQL의 NOT IN은 NULL을 걸러 버리므로 따로 포함한다. */\n .andWhere('(ap.judgment IS NULL OR ap.judgment NOT IN (:...judgment))', { judgment: [...TERMINATED_JUDGMENTS] })\n .andWhere(\n new Brackets(qb => {\n qb.where('ap.approver = :user', { user: user.id })\n /* 역할로 걸린 참조는 그 역할을 가진 사람 모두가 본다 — 결재와 같은 규칙이다. */\n if (roles.length > 0) qb.orWhere('ap.approverRole IN (:...roles)', { roles })\n })\n )\n\n const [items, total] = await queryBuilder.getManyAndCount()\n\n return { items, total }\n }\n\n /**\n * 내가 결재하거나 참조로 받은 건 중 끝난 것.\n *\n * `doneList`는 업무 담당자 기준이라, 결재·참조 참여자에게 완료 이력을 보장하지 않는다. 참여 행\n * 자신을 기준으로 읽는 목록을 둬야 「내 결재함」에서 열린 건을 치운 뒤에도 이력을 다시 찾을 수 있다.\n */\n @Query(returns => ActivityApprovalList, {\n description: 'To fetch completed approvals where I participated'\n })\n async approvalCompletedList(\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<ActivityApprovalList> {\n var { domain, user } = context.state\n\n user = await getRepository(User).findOne({ where: { id: user.id }, relations: ['roles'] })\n const roles = (user.roles ?? []).filter(role => role.domainId === domain.id).map(role => role.id)\n const judgment = [...TERMINATED_JUDGMENTS]\n\n const queryBuilder = getQueryBuilderFromListParams({\n repository: getRepository(ActivityApproval),\n params,\n domain,\n alias: 'ap',\n searchables: ['name', 'description'],\n filtersMap: APPROVAL_FILTERS_MAP\n })\n .andWhere('ap.judgment IN (:...judgment)', { judgment })\n .andWhere(\n new Brackets(qb => {\n qb.where('ap.approver = :user', { user: user.id })\n if (roles.length > 0) qb.orWhere('ap.approverRole IN (:...roles)', { roles })\n })\n )\n\n const [items, total] = await queryBuilder.getManyAndCount()\n\n return { items, total }\n }\n\n @Query(returns => ActivityApprovalList, {\n description: 'To fetch the approvals(ActivityApprovals) which has done by me'\n })\n async approvalDoneList(\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<ActivityApprovalList> {\n var { domain, user } = context.state\n\n /* 「끝난 것」의 정의는 한 자리에 있다 — 여기서 다시 세면 값이 늘 때 한쪽만 늘어난다. */\n const judgment = [...TERMINATED_JUDGMENTS]\n\n const [items, total] = await getQueryBuilderFromListParams({\n repository: getRepository(ActivityApproval),\n params,\n domain,\n alias: 'ap',\n searchables: ['name', 'description'],\n filtersMap: APPROVAL_FILTERS_MAP\n })\n .andWhere('ap.judgment IN (:...judgment)', { judgment })\n /*\n * 역할로 걸린 결재를 처리하면 이제 `approver` 에 처리한 사람이 들어간다(`approve.ts`·`reject.ts`).\n * 그래서 이 한 줄로 자기가 처리한 것이 다 걸린다 — 개인으로 걸린 것이든 역할로 걸린 것이든.\n *\n * 고치기 전에 처리한 역할 결재는 `approver` 가 비어 있어 여기 안 나온다. 지난 기록을 뒤에서 고쳐\n * 쓰지 않는다는 규율에 따라 그대로 둔다.\n */\n .andWhere('ap.approver = :user', { user: user.id })\n .getManyAndCount()\n\n return { items, total }\n }\n\n @FieldResolver(type => ActivityThread)\n async activityThread(@Root() activityApproval: ActivityApproval): Promise<ActivityThread> {\n return await getRepository(ActivityThread).findOneBy({ id: activityApproval.activityThreadId })\n }\n\n @FieldResolver(type => Domain)\n async domain(@Root() activityApproval: ActivityApproval): Promise<Domain> {\n return await getRepository(Domain).findOneBy({ id: activityApproval.domainId })\n }\n\n @FieldResolver(type => User)\n async approver(@Root() activityApproval: ActivityApproval): Promise<User> {\n return activityApproval.approverId && (await getRepository(User).findOneBy({ id: activityApproval.approverId }))\n }\n\n /**\n * 누가 결재해야 하나가 **역할**일 때.\n *\n * 이 리졸버가 없어서 `approverRole` 이 늘 `null` 로 나갔다. DB 에는 들어 있는데 질의가 관계를 안\n * 싣기 때문이다. 그래서 결재 목록이 「누가 결재해야 하나」를 못 보였다 — 개인으로 지정한 건만 보이고\n * 역할로 지정한 건은 빈칸이었다.\n */\n @FieldResolver(type => Role, { nullable: true })\n async approverRole(@Root() activityApproval: ActivityApproval): Promise<Role> {\n return activityApproval.approverRoleId && (await getRepository(Role).findOneBy({ id: activityApproval.approverRoleId }))\n }\n\n @FieldResolver(type => User)\n async updater(@Root() activityApproval: ActivityApproval): Promise<User> {\n return activityApproval.updaterId && (await getRepository(User).findOneBy({ id: activityApproval.updaterId }))\n }\n\n @FieldResolver(type => User)\n async creator(@Root() activityApproval: ActivityApproval): Promise<User> {\n return activityApproval.creatorId && (await getRepository(User).findOneBy({ id: activityApproval.creatorId }))\n }\n\n @FieldResolver(type => User)\n async terminator(@Root() activityApproval: ActivityApproval): Promise<User> {\n return activityApproval.terminatorId && (await getRepository(User).findOneBy({ id: activityApproval.terminatorId }))\n }\n}\n"]}
@@ -6,6 +6,7 @@ const graphql_yoga_1 = require("graphql-yoga");
6
6
  const type_graphql_1 = require("type-graphql");
7
7
  const shell_1 = require("@things-factory/shell");
8
8
  const activity_approval_js_1 = require("./activity-approval.js");
9
+ const subscription_filters_js_1 = require("../subscription/subscription-filters.js");
9
10
  let ActivityApprovalSubscription = class ActivityApprovalSubscription {
10
11
  activityApproval(payload) {
11
12
  return payload.activityApproval;
@@ -23,17 +24,7 @@ tslib_1.__decorate([
23
24
  if (!user.domains?.find(d => d.subdomain === subdomain) && !(await process.superUserGranted(domain, user))) {
24
25
  throw new Error(`domain(${subdomain}) is not working for user(${user.email}).`);
25
26
  }
26
- return (0, graphql_yoga_1.pipe)(shell_1.pubsub.subscribe('activity-approval'), (0, graphql_yoga_1.filter)((payload) => {
27
- const { activityApproval } = payload;
28
- const { domainId } = activityApproval;
29
- if (domainId !== domain?.id) {
30
- return false;
31
- }
32
- if (activityApproval.approverId === user.id) {
33
- return true;
34
- }
35
- return false;
36
- }));
27
+ return (0, graphql_yoga_1.pipe)(shell_1.pubsub.subscribe('activity-approval'), (0, graphql_yoga_1.filter)((payload) => (0, subscription_filters_js_1.hearsApproval)(payload.activityApproval, domain, user.id)));
37
28
  }
38
29
  }),
39
30
  tslib_1.__param(0, (0, type_graphql_1.Root)()),
@@ -1 +1 @@
1
- {"version":3,"file":"activity-approval-subscription.js","sourceRoot":"","sources":["../../../server/service/activity-approval/activity-approval-subscription.ts"],"names":[],"mappings":";;;;AAAA,+CAA2C;AAC3C,+CAA2D;AAE3D,iDAA8C;AAE9C,iEAAyD;AAGlD,IAAM,4BAA4B,GAAlC,MAAM,4BAA4B;IAiCvC,gBAAgB,CAAS,OAA+C;QACtE,OAAO,OAAO,CAAC,gBAAgB,CAAA;IACjC,CAAC;CACF,CAAA;AApCY,oEAA4B;AAiCvC;IAhCC,IAAA,2BAAY,EAAC;QACZ,SAAS,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE;YAC3C,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;YACtC,MAAM,SAAS,GAAG,MAAM,EAAE,SAAS,CAAA;YAEnC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAA;YACpC,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,IAAI,CAAC,CAAC,MAAM,OAAO,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;gBAC3G,MAAM,IAAI,KAAK,CAAC,UAAU,SAAS,6BAA6B,IAAI,CAAC,KAAK,IAAI,CAAC,CAAA;YACjF,CAAC;YAED,OAAO,IAAA,mBAAI,EACT,cAAM,CAAC,SAAS,CAAC,mBAAmB,CAAC,EACrC,IAAA,qBAAM,EAAC,CAAC,OAA+C,EAAE,EAAE;gBACzD,MAAM,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAA;gBACpC,MAAM,EAAE,QAAQ,EAAE,GAAG,gBAAgB,CAAA;gBAErC,IAAI,QAAQ,KAAK,MAAM,EAAE,EAAE,EAAE,CAAC;oBAC5B,OAAO,KAAK,CAAA;gBACd,CAAC;gBAED,IAAI,gBAAgB,CAAC,UAAU,KAAK,IAAI,CAAC,EAAE,EAAE,CAAC;oBAC5C,OAAO,IAAI,CAAA;gBACb,CAAC;gBAED,OAAO,KAAK,CAAA;YACd,CAAC,CAAC,CACH,CAAA;QACH,CAAC;KACF,CAAC;IACgB,mBAAA,IAAA,mBAAI,GAAE,CAAA;;;4CAAmD,uCAAgB;oEAE1F;uCAnCU,4BAA4B;IADxC,IAAA,uBAAQ,EAAC,uCAAgB,CAAC;GACd,4BAA4B,CAoCxC","sourcesContent":["import { filter, pipe } from 'graphql-yoga'\nimport { Resolver, Root, Subscription } from 'type-graphql'\n\nimport { pubsub } from '@things-factory/shell'\n\nimport { ActivityApproval } from './activity-approval.js'\n\n@Resolver(ActivityApproval)\nexport class ActivityApprovalSubscription {\n @Subscription({\n subscribe: async ({ args, context, info }) => {\n const { domain, user } = context.state\n const subdomain = domain?.subdomain\n\n if (!domain) {\n throw new Error('domain required')\n }\n\n if (!user.domains?.find(d => d.subdomain === subdomain) && !(await process.superUserGranted(domain, user))) {\n throw new Error(`domain(${subdomain}) is not working for user(${user.email}).`)\n }\n\n return pipe(\n pubsub.subscribe('activity-approval'),\n filter((payload: { activityApproval: ActivityApproval }) => {\n const { activityApproval } = payload\n const { domainId } = activityApproval\n\n if (domainId !== domain?.id) {\n return false\n }\n\n if (activityApproval.approverId === user.id) {\n return true\n }\n\n return false\n })\n )\n }\n })\n activityApproval(@Root() payload: { activityApproval: ActivityApproval }): ActivityApproval {\n return payload.activityApproval\n }\n}\n"]}
1
+ {"version":3,"file":"activity-approval-subscription.js","sourceRoot":"","sources":["../../../server/service/activity-approval/activity-approval-subscription.ts"],"names":[],"mappings":";;;;AAAA,+CAA2C;AAC3C,+CAA2D;AAE3D,iDAA8C;AAE9C,iEAAyD;AACzD,qFAAuE;AAGhE,IAAM,4BAA4B,GAAlC,MAAM,4BAA4B;IAsBvC,gBAAgB,CAAS,OAA+C;QACtE,OAAO,OAAO,CAAC,gBAAgB,CAAA;IACjC,CAAC;CACF,CAAA;AAzBY,oEAA4B;AAsBvC;IArBC,IAAA,2BAAY,EAAC;QACZ,SAAS,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE;YAC3C,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;YACtC,MAAM,SAAS,GAAG,MAAM,EAAE,SAAS,CAAA;YAEnC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAA;YACpC,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,IAAI,CAAC,CAAC,MAAM,OAAO,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;gBAC3G,MAAM,IAAI,KAAK,CAAC,UAAU,SAAS,6BAA6B,IAAI,CAAC,KAAK,IAAI,CAAC,CAAA;YACjF,CAAC;YAED,OAAO,IAAA,mBAAI,EACT,cAAM,CAAC,SAAS,CAAC,mBAAmB,CAAC,EACrC,IAAA,qBAAM,EAAC,CAAC,OAA+C,EAAE,EAAE,CACzD,IAAA,uCAAa,EAAC,OAAO,CAAC,gBAAgB,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,CACzD,CACF,CAAA;QACH,CAAC;KACF,CAAC;IACgB,mBAAA,IAAA,mBAAI,GAAE,CAAA;;;4CAAmD,uCAAgB;oEAE1F;uCAxBU,4BAA4B;IADxC,IAAA,uBAAQ,EAAC,uCAAgB,CAAC;GACd,4BAA4B,CAyBxC","sourcesContent":["import { filter, pipe } from 'graphql-yoga'\nimport { Resolver, Root, Subscription } from 'type-graphql'\n\nimport { pubsub } from '@things-factory/shell'\n\nimport { ActivityApproval } from './activity-approval.js'\nimport { hearsApproval } from '../subscription/subscription-filters.js'\n\n@Resolver(ActivityApproval)\nexport class ActivityApprovalSubscription {\n @Subscription({\n subscribe: async ({ args, context, info }) => {\n const { domain, user } = context.state\n const subdomain = domain?.subdomain\n\n if (!domain) {\n throw new Error('domain required')\n }\n\n if (!user.domains?.find(d => d.subdomain === subdomain) && !(await process.superUserGranted(domain, user))) {\n throw new Error(`domain(${subdomain}) is not working for user(${user.email}).`)\n }\n\n return pipe(\n pubsub.subscribe('activity-approval'),\n filter((payload: { activityApproval: ActivityApproval }) =>\n hearsApproval(payload.activityApproval, domain, user.id)\n )\n )\n }\n })\n activityApproval(@Root() payload: { activityApproval: ActivityApproval }): ActivityApproval {\n return payload.activityApproval\n }\n}\n"]}
@@ -3,33 +3,25 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ActivityInstanceMutation = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const type_graphql_1 = require("type-graphql");
6
- const typeorm_1 = require("typeorm");
7
6
  const shell_1 = require("@things-factory/shell");
8
7
  const index_js_1 = require("../../controllers/activity-instance/index.js");
8
+ const discard_draft_js_1 = require("../../controllers/activity-instance/discard-draft.js");
9
9
  const activity_thread_js_1 = require("../activity-thread/activity-thread.js");
10
10
  const activity_instance_js_1 = require("./activity-instance.js");
11
11
  const activity_instance_type_js_1 = require("./activity-instance-type.js");
12
12
  let ActivityInstanceMutation = class ActivityInstanceMutation {
13
+ /*
14
+ * Whoever wrote the draft may throw it away - the entitlement is checked in the body, as for draft
15
+ * and issue below (ruling 2026-09-24). § controllers/activity-instance/discard-draft.ts
16
+ */
13
17
  async deleteDraftActivityInstance(id, context) {
14
- const { domain, tx } = context.state;
15
- let draftActInst = await tx.getRepository(activity_instance_js_1.ActivityInstance).findOne({
16
- where: { domain: { id: domain.id }, id, state: activity_instance_js_1.ActivityInstanceStatus.Draft }
17
- });
18
- if (draftActInst) {
19
- await tx.getRepository(activity_instance_js_1.ActivityInstance).remove(draftActInst);
20
- return true;
21
- }
22
- else {
23
- return false;
24
- }
18
+ return await (0, discard_draft_js_1.discardDraft)(id, context);
25
19
  }
26
20
  async deleteDraftActivityInstances(ids, context) {
27
- const { domain, tx } = context.state;
28
- await tx.getRepository(activity_instance_js_1.ActivityInstance).delete({
29
- domain: { id: domain.id },
30
- id: (0, typeorm_1.In)(ids),
31
- state: activity_instance_js_1.ActivityInstanceStatus.Draft
32
- });
21
+ /* The same steps as one draft, for each - so no child row is left and an issued one is refused. */
22
+ for (const id of ids) {
23
+ await (0, discard_draft_js_1.discardDraft)(id, context);
24
+ }
33
25
  return true;
34
26
  }
35
27
  /*
@@ -39,7 +31,8 @@ let ActivityInstanceMutation = class ActivityInstanceMutation {
39
31
  * 일을 집는다」에 그것을 요구하면 현장 작업자 전원에게 남의 일을 재배정하고 중단시킬 권한을
40
32
  * 함께 줘야 한다. 그래서 문을 범주로 막지 않는다.
41
33
  *
42
- * 게이트 있음 남의 일에 손대는 것 · 되돌릴 수 없는 것 assign · end · abort · delete draft
34
+ * 게이트 있음 남의 일에 손대는 것 · 되돌릴 수 없는 것 assign · end · abort · 초안 여러 건 지우기
35
+ * (초안 한 건 버리기는 2026-09-24 판정으로 쓴 사람에게 열었다 — 몸통이 entitlement 로 막는다)
43
36
  * 게이트 없음 자기 일을 하는 것 draft · issue · pick
44
37
  *
45
38
  * 대신 **건별 자격**을 본다(`controllers/activity-instance/entitlement.ts`) — 남의 초안은 못
@@ -88,7 +81,6 @@ let ActivityInstanceMutation = class ActivityInstanceMutation {
88
81
  exports.ActivityInstanceMutation = ActivityInstanceMutation;
89
82
  tslib_1.__decorate([
90
83
  (0, type_graphql_1.Directive)('@transaction'),
91
- (0, type_graphql_1.Directive)('@privilege(category: "activity-instance", privilege: "mutation", domainOwnerGranted: true)'),
92
84
  (0, type_graphql_1.Mutation)(returns => Boolean, { description: 'To delete Activity Instance of draft state' }),
93
85
  tslib_1.__param(0, (0, type_graphql_1.Arg)('id')),
94
86
  tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
@@ -1 +1 @@
1
- {"version":3,"file":"activity-instance-mutation.js","sourceRoot":"","sources":["../../../server/service/activity-instance/activity-instance-mutation.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arg, Ctx, Directive, Mutation, Resolver } from 'type-graphql'\nimport { In } from 'typeorm'\n\nimport { ScalarObject } from '@things-factory/shell'\n\nimport { abort, assign, draft, end, pick, issue } from '../../controllers/activity-instance/index.js'\nimport { ActivityThread } from '../activity-thread/activity-thread.js'\nimport { ActivityInstance, ActivityInstanceStatus } from './activity-instance.js'\nimport { ActivityInstanceIssue, ActivityInstanceDraft } from './activity-instance-type.js'\n\n@Resolver(ActivityInstance)\nexport class ActivityInstanceMutation {\n @Directive('@transaction')\n @Directive('@privilege(category: \"activity-instance\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Boolean, { description: 'To delete Activity Instance of draft state' })\n async deleteDraftActivityInstance(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain, tx } = context.state\n\n let draftActInst = await tx.getRepository(ActivityInstance).findOne({\n where: { domain: { id: domain.id }, id, state: ActivityInstanceStatus.Draft }\n })\n\n if (draftActInst) {\n await tx.getRepository(ActivityInstance).remove(draftActInst)\n return true\n } else {\n return false\n }\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"activity-instance\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Boolean, { description: 'To delete multiple Activity Instances of draft state' })\n async deleteDraftActivityInstances(\n @Arg('ids', type => [String]) ids: string[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, tx } = context.state\n\n await tx.getRepository(ActivityInstance).delete({\n domain: { id: domain.id },\n id: In(ids),\n state: ActivityInstanceStatus.Draft\n })\n\n return true\n }\n\n /*\n * 이 셋(draft · issue · pick)에는 `@privilege` 를 안 단다 — **일부러다.**\n *\n * 그 권한(`activity-instance:mutation` + domainOwnerGranted)은 **관리 권한**이다. 「내게 온\n * 일을 집는다」에 그것을 요구하면 현장 작업자 전원에게 남의 일을 재배정하고 중단시킬 권한을\n * 함께 줘야 한다. 그래서 문을 범주로 막지 않는다.\n *\n * 게이트 있음 남의 일에 손대는 것 · 되돌릴 수 없는 것 assign · end · abort · delete draft\n * 게이트 없음 자기 일을 하는 것 draft · issue · pick\n *\n * 대신 **건별 자격**을 본다(`controllers/activity-instance/entitlement.ts`) — 남의 초안은 못\n * 고치고 못 내보내며, 역할이 걸린 업무는 그 역할을 가진 사람만 집는다.\n *\n * 2025-04-10(`74acc61f6d`)에 나머지 여섯에 게이트를 달면서 이 셋만 주석으로 남겼는데, **그\n * 이유가 어디에도 안 적혀 있어서** 읽는 사람이 「일부러」와 「빠뜨림」을 구별할 수 없었다.\n * 주석 처리된 줄은 지운다 — 죽은 줄이 남아 있는 한 다음 사람이 또 같은 것을 묻는다.\n */\n @Directive('@transaction')\n @Mutation(returns => ActivityInstance, { description: 'To draft standard ActivityInstance' })\n async draftActivityInstance(\n @Arg('activityInstance') activityInstance: ActivityInstanceDraft,\n @Ctx() context: ResolverContext\n ): Promise<ActivityInstance> {\n return await draft(activityInstance, context)\n }\n\n @Directive('@transaction')\n @Mutation(returns => ActivityInstance, { description: 'To issue standard ActivityInstance' })\n async issueActivityInstance(\n @Arg('activityInstance') activityInstance: ActivityInstanceIssue,\n @Ctx() context: ResolverContext\n ): Promise<ActivityInstance> {\n return await issue(activityInstance, context)\n }\n\n @Directive('@transaction')\n @Mutation(returns => ActivityThread!, {\n nullable: true,\n description:\n 'To pick an activity ActivityInstance voluntarily. [cautions] This resolver will return a assigned ActivityThread.'\n })\n async pickActivityInstance(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<ActivityThread> {\n return await pick(id, context)\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"activity-instance\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => ActivityInstance, { description: 'To assign a ActivityInstance' })\n async assignActivityInstance(\n @Arg('id') id: string,\n @Arg('assignees', type => [String], { nullable: true, description: 'Email of assignee users' }) assignees: string[],\n @Arg('reason', { nullable: true }) reason: string,\n @Arg('dueAt', { nullable: true }) dueAt: Date,\n @Ctx() context: ResolverContext\n ): Promise<ActivityInstance> {\n return await assign(\n {\n id,\n assignees,\n reason,\n dueAt\n },\n context\n )\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"activity-instance\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => ActivityInstance, { description: 'To end a ActivityInstance' })\n async endActivityInstance(\n @Arg('id') id: string,\n @Arg('output', type => ScalarObject, { nullable: true }) output: { [key: string]: any },\n @Arg('reason', { nullable: true }) reason: string,\n @Ctx() context: ResolverContext\n ): Promise<ActivityInstance> {\n return await end({ id, output, reason }, context)\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"activity-instance\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => ActivityInstance, { description: 'To abort a ActivityInstance' })\n async abortActivityInstance(\n @Arg('id') id: string,\n @Arg('reason', { nullable: true }) reason: string,\n @Ctx() context: ResolverContext\n ): Promise<ActivityInstance> {\n return await abort({ id, reason }, context)\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"activity-instance\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Boolean, { description: 'To abort multiple ActivityInstances' })\n async abortActivityInstances(\n @Arg('ids', type => [String]) ids: string[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n for (const id of ids) {\n try {\n await abort({ id, reason: 'Aborted by user' }, context)\n } catch (error) {\n console.error(`Failed to abort activity instance ${id}:`, error)\n return false\n }\n }\n\n return true\n }\n}\n"]}
1
+ {"version":3,"file":"activity-instance-mutation.js","sourceRoot":"","sources":["../../../server/service/activity-instance/activity-instance-mutation.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arg, Ctx, Directive, Mutation, Resolver } from 'type-graphql'\nimport { In } from 'typeorm'\n\nimport { ScalarObject } from '@things-factory/shell'\n\nimport { abort, assign, draft, end, pick, issue } from '../../controllers/activity-instance/index.js'\nimport { discardDraft } from '../../controllers/activity-instance/discard-draft.js'\nimport { ActivityThread } from '../activity-thread/activity-thread.js'\nimport { ActivityInstance, ActivityInstanceStatus } from './activity-instance.js'\nimport { ActivityInstanceIssue, ActivityInstanceDraft } from './activity-instance-type.js'\n\n@Resolver(ActivityInstance)\nexport class ActivityInstanceMutation {\n /*\n * Whoever wrote the draft may throw it away - the entitlement is checked in the body, as for draft\n * and issue below (ruling 2026-09-24). § controllers/activity-instance/discard-draft.ts\n */\n @Directive('@transaction')\n @Mutation(returns => Boolean, { description: 'To delete Activity Instance of draft state' })\n async deleteDraftActivityInstance(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {\n return await discardDraft(id, context)\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"activity-instance\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Boolean, { description: 'To delete multiple Activity Instances of draft state' })\n async deleteDraftActivityInstances(\n @Arg('ids', type => [String]) ids: string[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n /* The same steps as one draft, for each - so no child row is left and an issued one is refused. */\n for (const id of ids) {\n await discardDraft(id, context)\n }\n\n return true\n }\n\n /*\n * 이 셋(draft · issue · pick)에는 `@privilege` 를 안 단다 — **일부러다.**\n *\n * 그 권한(`activity-instance:mutation` + domainOwnerGranted)은 **관리 권한**이다. 「내게 온\n * 일을 집는다」에 그것을 요구하면 현장 작업자 전원에게 남의 일을 재배정하고 중단시킬 권한을\n * 함께 줘야 한다. 그래서 문을 범주로 막지 않는다.\n *\n * 게이트 있음 남의 일에 손대는 것 · 되돌릴 수 없는 것 assign · end · abort · 초안 여러 건 지우기\n * (초안 한 건 버리기는 2026-09-24 판정으로 쓴 사람에게 열었다 — 몸통이 entitlement 로 막는다)\n * 게이트 없음 자기 일을 하는 것 draft · issue · pick\n *\n * 대신 **건별 자격**을 본다(`controllers/activity-instance/entitlement.ts`) — 남의 초안은 못\n * 고치고 못 내보내며, 역할이 걸린 업무는 그 역할을 가진 사람만 집는다.\n *\n * 2025-04-10(`74acc61f6d`)에 나머지 여섯에 게이트를 달면서 이 셋만 주석으로 남겼는데, **그\n * 이유가 어디에도 안 적혀 있어서** 읽는 사람이 「일부러」와 「빠뜨림」을 구별할 수 없었다.\n * 주석 처리된 줄은 지운다 — 죽은 줄이 남아 있는 한 다음 사람이 또 같은 것을 묻는다.\n */\n @Directive('@transaction')\n @Mutation(returns => ActivityInstance, { description: 'To draft standard ActivityInstance' })\n async draftActivityInstance(\n @Arg('activityInstance') activityInstance: ActivityInstanceDraft,\n @Ctx() context: ResolverContext\n ): Promise<ActivityInstance> {\n return await draft(activityInstance, context)\n }\n\n @Directive('@transaction')\n @Mutation(returns => ActivityInstance, { description: 'To issue standard ActivityInstance' })\n async issueActivityInstance(\n @Arg('activityInstance') activityInstance: ActivityInstanceIssue,\n @Ctx() context: ResolverContext\n ): Promise<ActivityInstance> {\n return await issue(activityInstance, context)\n }\n\n @Directive('@transaction')\n @Mutation(returns => ActivityThread!, {\n nullable: true,\n description:\n 'To pick an activity ActivityInstance voluntarily. [cautions] This resolver will return a assigned ActivityThread.'\n })\n async pickActivityInstance(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<ActivityThread> {\n return await pick(id, context)\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"activity-instance\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => ActivityInstance, { description: 'To assign a ActivityInstance' })\n async assignActivityInstance(\n @Arg('id') id: string,\n @Arg('assignees', type => [String], { nullable: true, description: 'Email of assignee users' }) assignees: string[],\n @Arg('reason', { nullable: true }) reason: string,\n @Arg('dueAt', { nullable: true }) dueAt: Date,\n @Ctx() context: ResolverContext\n ): Promise<ActivityInstance> {\n return await assign(\n {\n id,\n assignees,\n reason,\n dueAt\n },\n context\n )\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"activity-instance\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => ActivityInstance, { description: 'To end a ActivityInstance' })\n async endActivityInstance(\n @Arg('id') id: string,\n @Arg('output', type => ScalarObject, { nullable: true }) output: { [key: string]: any },\n @Arg('reason', { nullable: true }) reason: string,\n @Ctx() context: ResolverContext\n ): Promise<ActivityInstance> {\n return await end({ id, output, reason }, context)\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"activity-instance\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => ActivityInstance, { description: 'To abort a ActivityInstance' })\n async abortActivityInstance(\n @Arg('id') id: string,\n @Arg('reason', { nullable: true }) reason: string,\n @Ctx() context: ResolverContext\n ): Promise<ActivityInstance> {\n return await abort({ id, reason }, context)\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"activity-instance\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Boolean, { description: 'To abort multiple ActivityInstances' })\n async abortActivityInstances(\n @Arg('ids', type => [String]) ids: string[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n for (const id of ids) {\n try {\n await abort({ id, reason: 'Aborted by user' }, context)\n } catch (error) {\n console.error(`Failed to abort activity instance ${id}:`, error)\n return false\n }\n }\n\n return true\n }\n}\n"]}
@@ -12,12 +12,20 @@ const activity_js_1 = require("../activity/activity.js");
12
12
  const activity_instance_js_1 = require("./activity-instance.js");
13
13
  const draft_list_states_js_1 = require("./draft-list-states.js");
14
14
  const activity_instance_type_js_1 = require("./activity-instance-type.js");
15
+ const assert_may_read_js_1 = require("../../controllers/activity-read/assert-may-read.js");
15
16
  let ActivityInstanceQuery = class ActivityInstanceQuery {
17
+ /*
18
+ * One instance by id is decided in the body, as one thread and one approval are (ruling 2026-09-24):
19
+ * its participants, or the activity-instance query privilege - § assert-may-read.ts.
20
+ */
16
21
  async activityInstance(id, context) {
17
22
  const { domain } = context.state;
18
- return await (0, shell_1.getRepository)(activity_instance_js_1.ActivityInstance).findOne({
23
+ const instance = await (0, shell_1.getRepository)(activity_instance_js_1.ActivityInstance).findOne({
19
24
  where: { domain: { id: domain.id }, id }
20
25
  });
26
+ if (instance)
27
+ await (0, assert_may_read_js_1.assertMayReadInstance)(instance, context);
28
+ return instance;
21
29
  }
22
30
  async activityInstances(params, context) {
23
31
  const { domain } = context.state;
@@ -283,7 +291,6 @@ let ActivityInstanceQuery = class ActivityInstanceQuery {
283
291
  };
284
292
  exports.ActivityInstanceQuery = ActivityInstanceQuery;
285
293
  tslib_1.__decorate([
286
- (0, type_graphql_1.Directive)('@privilege(category: "activity-instance", privilege: "query", domainOwnerGranted: true)'),
287
294
  (0, type_graphql_1.Query)(returns => activity_instance_js_1.ActivityInstance, { nullable: true, description: 'To fetch a ActivityInstance' }),
288
295
  tslib_1.__param(0, (0, type_graphql_1.Arg)('id')),
289
296
  tslib_1.__param(1, (0, type_graphql_1.Ctx)()),