@things-factory/worklist 10.1.208 → 10.1.209

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 (77) hide show
  1. package/dist-client/components/timeline-entries.js +2 -1
  2. package/dist-client/components/timeline-entries.js.map +1 -1
  3. package/dist-client/pages/activity-instance/activity-instance-view.d.ts +1 -1
  4. package/dist-client/pages/activity-thread/activity-thread-page.d.ts +1 -1
  5. package/dist-client/pages/activity-thread/activity-thread-page.js +36 -12
  6. package/dist-client/pages/activity-thread/activity-thread-page.js.map +1 -1
  7. package/dist-client/pages/activity-thread/activity-thread-view-page.js +1 -1
  8. package/dist-client/pages/activity-thread/activity-thread-view-page.js.map +1 -1
  9. package/dist-client/pages/todo/draft-list-page.d.ts +1 -2
  10. package/dist-client/pages/todo/draft-list-page.js +11 -14
  11. package/dist-client/pages/todo/draft-list-page.js.map +1 -1
  12. package/dist-client/route.d.ts +1 -1
  13. package/dist-client/tsconfig.tsbuildinfo +1 -1
  14. package/dist-server/controllers/activity-approval/check-authority.d.ts +2 -13
  15. package/dist-server/controllers/activity-approval/check-authority.js +2 -49
  16. package/dist-server/controllers/activity-approval/check-authority.js.map +1 -1
  17. package/dist-server/controllers/activity-approval/delegate.js +1 -8
  18. package/dist-server/controllers/activity-approval/delegate.js.map +1 -1
  19. package/dist-server/controllers/activity-approval/delegation.d.ts +5 -15
  20. package/dist-server/controllers/activity-approval/delegation.js +2 -16
  21. package/dist-server/controllers/activity-approval/delegation.js.map +1 -1
  22. package/dist-server/controllers/activity-approval/resolve-judgeable-seats.d.ts +2 -2
  23. package/dist-server/controllers/activity-approval/resolve-judgeable-seats.js +1 -1
  24. package/dist-server/controllers/activity-approval/resolve-judgeable-seats.js.map +1 -1
  25. package/dist-server/controllers/activity-approval/seat-standing.d.ts +66 -0
  26. package/dist-server/controllers/activity-approval/seat-standing.js +57 -0
  27. package/dist-server/controllers/activity-approval/seat-standing.js.map +1 -0
  28. package/dist-server/controllers/activity-instance/issue.js +9 -15
  29. package/dist-server/controllers/activity-instance/issue.js.map +1 -1
  30. package/dist-server/controllers/activity-thread/abort.js +7 -0
  31. package/dist-server/controllers/activity-thread/abort.js.map +1 -1
  32. package/dist-server/controllers/activity-thread/restart.js +4 -2
  33. package/dist-server/controllers/activity-thread/restart.js.map +1 -1
  34. package/dist-server/controllers/activity-thread/submit.js +5 -1
  35. package/dist-server/controllers/activity-thread/submit.js.map +1 -1
  36. package/dist-server/controllers/common.js +1 -1
  37. package/dist-server/controllers/common.js.map +1 -1
  38. package/dist-server/service/activity/index.d.ts +2 -2
  39. package/dist-server/service/activity-approval/index.d.ts +1 -1
  40. package/dist-server/service/activity-approval/my-pending-approvals.d.ts +5 -5
  41. package/dist-server/service/activity-approval/my-pending-approvals.js +5 -8
  42. package/dist-server/service/activity-approval/my-pending-approvals.js.map +1 -1
  43. package/dist-server/service/activity-instance/activity-instance-query.d.ts +1 -1
  44. package/dist-server/service/activity-instance/activity-instance-query.js +9 -4
  45. package/dist-server/service/activity-instance/activity-instance-query.js.map +1 -1
  46. package/dist-server/service/activity-instance/index.d.ts +1 -1
  47. package/dist-server/service/activity-instance/request-box.d.ts +2 -0
  48. package/dist-server/service/activity-instance/request-box.js +18 -0
  49. package/dist-server/service/activity-instance/request-box.js.map +1 -0
  50. package/dist-server/service/activity-summary/activity-summary-query.js +3 -3
  51. package/dist-server/service/activity-summary/activity-summary-query.js.map +1 -1
  52. package/dist-server/service/activity-summary/index.d.ts +1 -1
  53. package/dist-server/service/activity-template/index.d.ts +2 -2
  54. package/dist-server/service/activity-thread/index.d.ts +1 -1
  55. package/dist-server/service/activity-thread/my-open-threads.d.ts +1 -2
  56. package/dist-server/service/activity-thread/my-open-threads.js +2 -3
  57. package/dist-server/service/activity-thread/my-open-threads.js.map +1 -1
  58. package/dist-server/service/index.d.ts +3 -3
  59. package/dist-server/service/subscription/subscription-filters.d.ts +2 -2
  60. package/dist-server/service/subscription/subscription-filters.js +2 -2
  61. package/dist-server/service/subscription/subscription-filters.js.map +1 -1
  62. package/dist-server/service/work-door/index.d.ts +1 -1
  63. package/dist-server/tsconfig.tsbuildinfo +1 -1
  64. package/package.json +2 -2
  65. package/shared/task-followup.d.ts +9 -0
  66. package/shared/task-followup.js +25 -0
  67. package/tests/delegate-approval.test.ts +7 -4
  68. package/tests/open-doors.test.ts +1 -1
  69. package/translations/en.json +4 -3
  70. package/translations/es.json +4 -3
  71. package/translations/ja.json +4 -3
  72. package/translations/ko.json +4 -3
  73. package/translations/ms.json +4 -3
  74. package/translations/zh.json +4 -3
  75. package/dist-server/controllers/activity-approval/own-request.d.ts +0 -162
  76. package/dist-server/controllers/activity-approval/own-request.js +0 -135
  77. package/dist-server/controllers/activity-approval/own-request.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"activity-instance-query.js","sourceRoot":"","sources":["../../../server/service/activity-instance/activity-instance-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arg, Args, Ctx, Directive, FieldResolver, Query, Resolver, Root } from 'type-graphql'\n\nimport { Attachment } from '@things-factory/attachment-base'\nimport { Role, User } from '@things-factory/auth-base'\nimport { adjustFilters, Domain, getQueryBuilderFromListParams, getRepository, ListParam } from '@things-factory/shell'\n\nimport { ApprovalLineItem } from '@things-factory/organization'\nimport { approvalLineSeats } from '../activity/approval-line-seats.js'\nimport { ActivityThread } from '../activity-thread/activity-thread.js'\nimport { Activity, AssigneeItem } from '../activity/activity.js'\nimport { ActivityInstance, ActivityInstanceStatus } from './activity-instance.js'\nimport { inPoolOf, poolIdsOf } from './assignee-pool.js'\nimport { statesFor, unknownStates } from './draft-list-states.js'\nimport { ActivityInstanceList } from './activity-instance-type.js'\nimport { assertMayReadInstance } from '../../controllers/activity-read/assert-may-read.js'\n\n@Resolver(ActivityInstance)\nexport class ActivityInstanceQuery {\n /*\n * One instance by id is decided in the body, as one thread and one approval are (ruling 2026-09-24):\n * its participants, or the activity-instance query privilege - § assert-may-read.ts.\n */\n @Query(returns => ActivityInstance!, { nullable: true, description: 'To fetch a ActivityInstance' })\n async activityInstance(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<ActivityInstance> {\n const { domain } = context.state\n\n const instance = await getRepository(ActivityInstance).findOne({\n where: { domain: { id: domain.id }, id }\n })\n\n if (instance) await assertMayReadInstance(instance, context)\n\n return instance\n }\n\n @Directive('@privilege(category: \"activity-instance\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => ActivityInstanceList, { description: 'To fetch multiple ActivityInstances' })\n async activityInstances(\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<ActivityInstanceList> {\n const { domain } = context.state\n\n const [items, total] = await getQueryBuilderFromListParams({\n domain,\n params,\n repository: getRepository(ActivityInstance),\n searchables: ['name', 'description']\n }).getManyAndCount()\n\n return { items, total }\n }\n\n @Directive('@privilege(category: \"activity-instance\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => ActivityInstanceList, { description: 'To fetch multiple ActivityInstances' })\n async activityInstancesIssuedByMe(\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<ActivityInstanceList> {\n const { domain, user } = context.state\n\n const { filters } = params\n\n params.filters = adjustFilters(filters, [{ name: 'issuerId', operator: 'eq', value: user.id }])\n\n const [items, total] = await getQueryBuilderFromListParams({\n domain,\n params,\n repository: getRepository(ActivityInstance),\n searchables: ['name', 'description']\n }).getManyAndCount()\n\n return { items, total }\n }\n\n @Directive('@privilege(category: \"activity-instance\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => ActivityInstanceList, { description: 'To fetch multiple activity instances by activity' })\n async activityInstancesByActivity(\n @Arg('activityId') activityId: string,\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<ActivityInstanceList> {\n const { domain } = context.state\n\n const activity = await getRepository(Activity).findOneBy({ id: activityId })\n const searchables = activity?.searchKeys?.map((item, index) => `key0${index + 1}`) || []\n\n const queryBuilder = getQueryBuilderFromListParams({\n repository: getRepository(ActivityInstance),\n params,\n domain,\n alias: 'ai',\n searchables: ['name', 'description'].concat(searchables)\n }).where('ai.activity = :activity', { activity: activityId })\n\n const [items, total] = await queryBuilder.getManyAndCount()\n\n return { items, total }\n }\n\n // @Directive('@privilege(category: \"activity-instance\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => ActivityInstanceList, { description: 'To get list of activity instance that a user can pick' })\n async pickableActivityList(\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<ActivityInstanceList> {\n var { domain, user } = context.state\n\n /* \n activity-instance 중에서 아직 created 상태이면서, \n activity-instance 의 assigneeRoles 중 하나라도 내가 가진 경우이면서,\n 나는 아직 해당 activity-instance의 thread를 할당받지 않은 경우에 해당하는\n activity-instance 리스트를 모두 가져오는 쿼리이다.\n */\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 if (!roles.length) {\n return { items: [], total: 0 }\n }\n\n const [items, total] = await getQueryBuilderFromListParams({\n repository: getRepository(ActivityInstance),\n params,\n domain,\n alias: 'ai',\n searchables: ['name', 'description']\n })\n .leftJoinAndSelect('ai.activityThreads', 'threads', 'threads.assignee = :user', { user: user.id })\n .andWhere('ai.state IN (:...status)', {\n status: [ActivityInstanceStatus.Issued, ActivityInstanceStatus.Unassigned]\n })\n .andWhere(inPoolOf('ai'), { roles })\n .andWhere('threads.id IS NULL') /* 이미 내가 할당된 경우는 제외한다. */\n .getManyAndCount()\n\n return { items, total }\n }\n\n // @Directive('@privilege(category: \"activity-instance\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => ActivityInstanceList, { description: 'To fetch my own ActivityInstances' })\n async draftList(\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<ActivityInstanceList> {\n var { domain, user } = context.state\n\n /*\n * 내가 올린 것 — 상태는 화면이 고르고, 안 고르면 작성 중만 낸다. 규칙은 순수 모듈이 든다\n * (`draft-list-states.ts`) — 여기에 적으면 시험이 못 든다.\n */\n const asked = unknownStates(params?.filters, Object.values(ActivityInstanceStatus))\n\n if (asked.length) {\n throw new Error(\n context.t('error.activity-instance unknown state', {\n state: asked.join(', '),\n known: Object.values(ActivityInstanceStatus).join(', '),\n defaultValue:\n `${asked.join(', ')} 는 업무의 상태가 아닙니다. ` +\n `쓸 수 있는 상태: ${Object.values(ActivityInstanceStatus).join(', ')}`\n })\n )\n }\n\n const status = statesFor(params?.filters)\n\n const builder = getQueryBuilderFromListParams({\n repository: getRepository(ActivityInstance),\n params,\n domain,\n alias: 'ai',\n searchables: ['name', 'description']\n })\n\n if (status) {\n builder.andWhere('ai.state IN (:...status)', { status: [...status] })\n }\n\n const [items, total] = await builder.andWhere('ai.creator = :user', { user: user.id }).getManyAndCount()\n\n return { items, total }\n }\n\n @FieldResolver(type => Activity)\n async activity(@Root() activityInstance: ActivityInstance): Promise<Activity> {\n const { activityId } = activityInstance\n\n return await getRepository(Activity).findOneBy({ id: activityId })\n }\n\n @FieldResolver(type => [ActivityThread])\n async activityThreads(\n @Root() activityInstance: ActivityInstance,\n @Ctx() context: ResolverContext\n ): Promise<ActivityThread[]> {\n const { user } = context.state\n const { supervisoryRoleId } = activityInstance\n\n if (supervisoryRoleId) {\n /* only user having supervisoryRole can get whole activityThreads */\n const roles = (\n (await getRepository(User).findOne({\n where: { id: user.id },\n relations: ['roles']\n })) as User\n ).roles.map(role => role.id)\n\n if (!roles.includes(supervisoryRoleId)) {\n return await getRepository(ActivityThread).findBy({\n activityInstance: { id: activityInstance.id },\n assignee: { id: user.id }\n })\n }\n }\n\n return await getRepository(ActivityThread).findBy({\n activityInstance: { id: activityInstance.id }\n })\n }\n\n @FieldResolver(type => [Role])\n async assigneeRoles(@Root() activityInstance: ActivityInstance): Promise<Role[]> {\n if (activityInstance.assigneeRoles) return activityInstance.assigneeRoles\n\n const ids = poolIdsOf(activityInstance)\n if (activityInstance.assigneeRoleIds && !ids.length) return []\n\n return await getRepository(ActivityInstance)\n .createQueryBuilder()\n .relation(ActivityInstance, 'assigneeRoles')\n .of(activityInstance.id)\n .loadMany()\n }\n\n @FieldResolver(type => [AssigneeItem])\n async assignees(\n @Root() activityInstance: ActivityInstance,\n @Ctx() context: ResolverContext\n ): Promise<AssigneeItem[]> {\n const { domain, user } = context.state\n const { assignees } = activityInstance\n\n if (!assignees || !(assignees instanceof Array)) {\n return null\n }\n\n var assigneeItemList = []\n\n for (let item of assignees) {\n // \"value\" deprecated. to be removed\n var { type, assignee, value } = item\n var id = assignee?.id || value\n\n switch (type) {\n case 'Employee':\n assignee = id && (await getRepository('Employee').findOneBy({ domain: { id: domain.id }, id }))\n break\n case 'Department':\n assignee = id && (await getRepository('Department').findOneBy({ domain: { id: domain.id }, id }))\n break\n case 'Role':\n assignee = id && (await getRepository('Role').findOneBy({ domain: { id: domain.id }, id }))\n break\n case 'Myself':\n assignee = user\n break\n case 'MyDepartment':\n case 'MySupervisor':\n break\n default:\n }\n\n assignee && assigneeItemList.push({ type, value: id, assignee })\n }\n\n return assigneeItemList\n }\n\n @FieldResolver(type => [ApprovalLineItem])\n async approvalLine(\n @Root() activityInstance: ActivityInstance,\n @Ctx() context: ResolverContext\n ): Promise<ApprovalLineItem[]> {\n const { domain, user } = context.state\n\n return await approvalLineSeats(activityInstance.approvalLine, domain, user)\n }\n\n @FieldResolver(type => Role)\n async supervisoryRole(@Root() activityInstance: ActivityInstance): Promise<Role> {\n return (\n activityInstance.supervisoryRole ||\n (activityInstance.supervisoryRoleId &&\n (await getRepository(Role).findOneBy({\n id: activityInstance.supervisoryRoleId\n })))\n )\n }\n\n @FieldResolver(type => String)\n async thumbnail(@Root() activityInstance: ActivityInstance): Promise<string | undefined> {\n const { activityId } = activityInstance\n const attachment: Attachment =\n activityId &&\n (await getRepository(Attachment).findOne({\n where: {\n domain: { id: activityInstance.domainId },\n refBy: activityId\n }\n }))\n\n return attachment?.fullpath\n }\n\n @FieldResolver(type => User)\n async issuer(@Root() activityInstance: ActivityInstance): Promise<User> {\n return activityInstance.issuerId && (await getRepository(User).findOneBy({ id: activityInstance.issuerId }))\n }\n\n @FieldResolver(type => User)\n async starter(@Root() activityInstance: ActivityInstance): Promise<User> {\n return activityInstance.starterId && (await getRepository(User).findOneBy({ id: activityInstance.starterId }))\n }\n\n @FieldResolver(type => Domain)\n async domain(@Root() activityInstance: ActivityInstance): Promise<Domain> {\n return await getRepository(Domain).findOneBy({ id: activityInstance.domainId })\n }\n\n @FieldResolver(type => User)\n async updater(@Root() activityInstance: ActivityInstance): Promise<User> {\n return activityInstance.updaterId && (await getRepository(User).findOneBy({ id: activityInstance.updaterId }))\n }\n\n @FieldResolver(type => User)\n async creator(@Root() activityInstance: ActivityInstance): Promise<User> {\n return activityInstance.creatorId && (await getRepository(User).findOneBy({ id: activityInstance.creatorId }))\n }\n}\n"]}
1
+ {"version":3,"file":"activity-instance-query.js","sourceRoot":"","sources":["../../../server/service/activity-instance/activity-instance-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arg, Args, Ctx, Directive, FieldResolver, Query, Resolver, Root } from 'type-graphql'\n\nimport { Attachment } from '@things-factory/attachment-base'\nimport { Role, User } from '@things-factory/auth-base'\nimport { adjustFilters, Domain, getQueryBuilderFromListParams, getRepository, ListParam } from '@things-factory/shell'\n\nimport { ApprovalLineItem } from '@things-factory/organization'\nimport { approvalLineSeats } from '../activity/approval-line-seats.js'\nimport { ActivityThread } from '../activity-thread/activity-thread.js'\nimport { Activity, AssigneeItem } from '../activity/activity.js'\nimport { ActivityInstance, ActivityInstanceStatus } from './activity-instance.js'\nimport { inPoolOf, poolIdsOf } from './assignee-pool.js'\nimport { requestBoxWhere } from './request-box.js'\nimport { statesFor, unknownStates } from './draft-list-states.js'\nimport { ActivityInstanceList } from './activity-instance-type.js'\nimport { assertMayReadInstance } from '../../controllers/activity-read/assert-may-read.js'\n\n@Resolver(ActivityInstance)\nexport class ActivityInstanceQuery {\n /*\n * One instance by id is decided in the body, as one thread and one approval are (ruling 2026-09-24):\n * its participants, or the activity-instance query privilege - § assert-may-read.ts.\n */\n @Query(returns => ActivityInstance!, { nullable: true, description: 'To fetch a ActivityInstance' })\n async activityInstance(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<ActivityInstance> {\n const { domain } = context.state\n\n const instance = await getRepository(ActivityInstance).findOne({\n where: { domain: { id: domain.id }, id }\n })\n\n if (instance) await assertMayReadInstance(instance, context)\n\n return instance\n }\n\n @Directive('@privilege(category: \"activity-instance\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => ActivityInstanceList, { description: 'To fetch multiple ActivityInstances' })\n async activityInstances(\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<ActivityInstanceList> {\n const { domain } = context.state\n\n const [items, total] = await getQueryBuilderFromListParams({\n domain,\n params,\n repository: getRepository(ActivityInstance),\n searchables: ['name', 'description']\n }).getManyAndCount()\n\n return { items, total }\n }\n\n @Directive('@privilege(category: \"activity-instance\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => ActivityInstanceList, { description: 'To fetch multiple ActivityInstances' })\n async activityInstancesIssuedByMe(\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<ActivityInstanceList> {\n const { domain, user } = context.state\n\n const { filters } = params\n\n params.filters = adjustFilters(filters, [{ name: 'issuerId', operator: 'eq', value: user.id }])\n\n const [items, total] = await getQueryBuilderFromListParams({\n domain,\n params,\n repository: getRepository(ActivityInstance),\n searchables: ['name', 'description']\n }).getManyAndCount()\n\n return { items, total }\n }\n\n @Directive('@privilege(category: \"activity-instance\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => ActivityInstanceList, { description: 'To fetch multiple activity instances by activity' })\n async activityInstancesByActivity(\n @Arg('activityId') activityId: string,\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<ActivityInstanceList> {\n const { domain } = context.state\n\n const activity = await getRepository(Activity).findOneBy({ id: activityId })\n const searchables = activity?.searchKeys?.map((item, index) => `key0${index + 1}`) || []\n\n const queryBuilder = getQueryBuilderFromListParams({\n repository: getRepository(ActivityInstance),\n params,\n domain,\n alias: 'ai',\n searchables: ['name', 'description'].concat(searchables)\n }).where('ai.activity = :activity', { activity: activityId })\n\n const [items, total] = await queryBuilder.getManyAndCount()\n\n return { items, total }\n }\n\n // @Directive('@privilege(category: \"activity-instance\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => ActivityInstanceList, { description: 'To get list of activity instance that a user can pick' })\n async pickableActivityList(\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<ActivityInstanceList> {\n var { domain, user } = context.state\n\n /* \n activity-instance 중에서 아직 created 상태이면서, \n activity-instance 의 assigneeRoles 중 하나라도 내가 가진 경우이면서,\n 나는 아직 해당 activity-instance의 thread를 할당받지 않은 경우에 해당하는\n activity-instance 리스트를 모두 가져오는 쿼리이다.\n */\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 if (!roles.length) {\n return { items: [], total: 0 }\n }\n\n const [items, total] = await getQueryBuilderFromListParams({\n repository: getRepository(ActivityInstance),\n params,\n domain,\n alias: 'ai',\n searchables: ['name', 'description']\n })\n .leftJoinAndSelect('ai.activityThreads', 'threads', 'threads.assignee = :user', { user: user.id })\n .andWhere('ai.state IN (:...status)', {\n status: [ActivityInstanceStatus.Issued, ActivityInstanceStatus.Unassigned]\n })\n .andWhere(inPoolOf('ai'), { roles })\n .andWhere('threads.id IS NULL') /* 이미 내가 할당된 경우는 제외한다. */\n .getManyAndCount()\n\n return { items, total }\n }\n\n // @Directive('@privilege(category: \"activity-instance\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => ActivityInstanceList, { description: 'To fetch my own ActivityInstances' })\n async draftList(\n @Args(type => ListParam) params: ListParam,\n @Arg('group', { nullable: true }) group: string,\n @Ctx() context: ResolverContext\n ): Promise<ActivityInstanceList> {\n var { domain, user } = context.state\n\n /*\n * 내가 올린 것 — 상태는 화면이 고르고, 안 고르면 작성 중만 낸다. 규칙은 순수 모듈이 든다\n * (`draft-list-states.ts`) — 여기에 적으면 시험이 못 든다.\n */\n const asked = unknownStates(params?.filters, Object.values(ActivityInstanceStatus))\n\n if (asked.length) {\n throw new Error(\n context.t('error.activity-instance unknown state', {\n state: asked.join(', '),\n known: Object.values(ActivityInstanceStatus).join(', '),\n defaultValue:\n `${asked.join(', ')} 는 업무의 상태가 아닙니다. ` +\n `쓸 수 있는 상태: ${Object.values(ActivityInstanceStatus).join(', ')}`\n })\n )\n }\n\n const status = statesFor(params?.filters)\n\n const builder = getQueryBuilderFromListParams({\n repository: getRepository(ActivityInstance),\n params,\n domain,\n alias: 'ai',\n searchables: ['name', 'description']\n })\n\n if (group) {\n builder.andWhere(requestBoxWhere(group))\n } else if (status) {\n builder.andWhere('ai.state IN (:...status)', { status: [...status] })\n }\n\n const [items, total] = await builder.andWhere('ai.creator = :user', { user: user.id }).getManyAndCount()\n\n return { items, total }\n }\n\n @FieldResolver(type => Activity)\n async activity(@Root() activityInstance: ActivityInstance): Promise<Activity> {\n const { activityId } = activityInstance\n\n return await getRepository(Activity).findOneBy({ id: activityId })\n }\n\n @FieldResolver(type => [ActivityThread])\n async activityThreads(\n @Root() activityInstance: ActivityInstance,\n @Ctx() context: ResolverContext\n ): Promise<ActivityThread[]> {\n const { user } = context.state\n const { supervisoryRoleId } = activityInstance\n\n if (supervisoryRoleId) {\n /* only user having supervisoryRole can get whole activityThreads */\n const roles = (\n (await getRepository(User).findOne({\n where: { id: user.id },\n relations: ['roles']\n })) as User\n ).roles.map(role => role.id)\n\n if (!roles.includes(supervisoryRoleId)) {\n return await getRepository(ActivityThread).findBy({\n activityInstance: { id: activityInstance.id },\n assignee: { id: user.id }\n })\n }\n }\n\n return await getRepository(ActivityThread).findBy({\n activityInstance: { id: activityInstance.id }\n })\n }\n\n @FieldResolver(type => [Role])\n async assigneeRoles(@Root() activityInstance: ActivityInstance): Promise<Role[]> {\n if (activityInstance.assigneeRoles) return activityInstance.assigneeRoles\n\n const ids = poolIdsOf(activityInstance)\n if (activityInstance.assigneeRoleIds && !ids.length) return []\n\n return await getRepository(ActivityInstance)\n .createQueryBuilder()\n .relation(ActivityInstance, 'assigneeRoles')\n .of(activityInstance.id)\n .loadMany()\n }\n\n @FieldResolver(type => [AssigneeItem])\n async assignees(\n @Root() activityInstance: ActivityInstance,\n @Ctx() context: ResolverContext\n ): Promise<AssigneeItem[]> {\n const { domain, user } = context.state\n const { assignees } = activityInstance\n\n if (!assignees || !(assignees instanceof Array)) {\n return null\n }\n\n var assigneeItemList = []\n\n for (let item of assignees) {\n // \"value\" deprecated. to be removed\n var { type, assignee, value } = item\n var id = assignee?.id || value\n\n switch (type) {\n case 'Employee':\n assignee = id && (await getRepository('Employee').findOneBy({ domain: { id: domain.id }, id }))\n break\n case 'Department':\n assignee = id && (await getRepository('Department').findOneBy({ domain: { id: domain.id }, id }))\n break\n case 'Role':\n assignee = id && (await getRepository('Role').findOneBy({ domain: { id: domain.id }, id }))\n break\n case 'Myself':\n assignee = user\n break\n case 'MyDepartment':\n case 'MySupervisor':\n break\n default:\n }\n\n assignee && assigneeItemList.push({ type, value: id, assignee })\n }\n\n return assigneeItemList\n }\n\n @FieldResolver(type => [ApprovalLineItem])\n async approvalLine(\n @Root() activityInstance: ActivityInstance,\n @Ctx() context: ResolverContext\n ): Promise<ApprovalLineItem[]> {\n const { domain, user } = context.state\n\n return await approvalLineSeats(activityInstance.approvalLine, domain, user)\n }\n\n @FieldResolver(type => Role)\n async supervisoryRole(@Root() activityInstance: ActivityInstance): Promise<Role> {\n return (\n activityInstance.supervisoryRole ||\n (activityInstance.supervisoryRoleId &&\n (await getRepository(Role).findOneBy({\n id: activityInstance.supervisoryRoleId\n })))\n )\n }\n\n @FieldResolver(type => String)\n async thumbnail(@Root() activityInstance: ActivityInstance): Promise<string | undefined> {\n const { activityId } = activityInstance\n const attachment: Attachment =\n activityId &&\n (await getRepository(Attachment).findOne({\n where: {\n domain: { id: activityInstance.domainId },\n refBy: activityId\n }\n }))\n\n return attachment?.fullpath\n }\n\n @FieldResolver(type => User)\n async issuer(@Root() activityInstance: ActivityInstance): Promise<User> {\n return activityInstance.issuerId && (await getRepository(User).findOneBy({ id: activityInstance.issuerId }))\n }\n\n @FieldResolver(type => User)\n async starter(@Root() activityInstance: ActivityInstance): Promise<User> {\n return activityInstance.starterId && (await getRepository(User).findOneBy({ id: activityInstance.starterId }))\n }\n\n @FieldResolver(type => Domain)\n async domain(@Root() activityInstance: ActivityInstance): Promise<Domain> {\n return await getRepository(Domain).findOneBy({ id: activityInstance.domainId })\n }\n\n @FieldResolver(type => User)\n async updater(@Root() activityInstance: ActivityInstance): Promise<User> {\n return activityInstance.updaterId && (await getRepository(User).findOneBy({ id: activityInstance.updaterId }))\n }\n\n @FieldResolver(type => User)\n async creator(@Root() activityInstance: ActivityInstance): Promise<User> {\n return activityInstance.creatorId && (await getRepository(User).findOneBy({ id: activityInstance.creatorId }))\n }\n}\n"]}
@@ -5,5 +5,5 @@ import { ActivityInstanceQuery } from "./activity-instance-query.js";
5
5
  import { ActivityInstanceSubscription } from "./activity-instance-subscription.js";
6
6
  import { ActivityInstanceHistoryEntitySubscriber, ActivityInstanceSubscriber } from "./event-subscriber.js";
7
7
  export declare const entities: (typeof ActivityInstance | typeof ActivityInstanceHistory)[];
8
- export declare const resolvers: (typeof ActivityInstanceSubscription | typeof ActivityInstanceQuery | typeof ActivityInstanceMutation)[];
8
+ export declare const resolvers: (typeof ActivityInstanceMutation | typeof ActivityInstanceQuery | typeof ActivityInstanceSubscription)[];
9
9
  export declare const subscribers: (typeof ActivityInstanceSubscriber | typeof ActivityInstanceHistoryEntitySubscriber)[];
@@ -0,0 +1,2 @@
1
+ /** One predicate for the request box and its badge. ai is an activity_instances alias. */
2
+ export declare function requestBoxWhere(group: string): string;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.requestBoxWhere = requestBoxWhere;
4
+ /** One predicate for the request box and its badge. ai is an activity_instances alias. */
5
+ function requestBoxWhere(group) {
6
+ const active = "ai.state IN ('issued', 'unassigned', 'assigned', 'started', 'pending')";
7
+ const editing = `EXISTS (SELECT 1 FROM activity_threads request_thread
8
+ WHERE request_thread.activity_instance_id = ai.id
9
+ AND request_thread.assignee_id = ai.creator_id
10
+ AND request_thread.state IN ('assigned', 'started', 'rejected'))`;
11
+ switch (group) {
12
+ case 'draft': return `(ai.state = 'draft' OR (${active} AND ${editing}))`;
13
+ case 'progress': return `(${active} AND NOT ${editing})`;
14
+ case 'completed': return "ai.state IN ('ended', 'aborted')";
15
+ default: throw new Error('Unknown request box group');
16
+ }
17
+ }
18
+ //# sourceMappingURL=request-box.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-box.js","sourceRoot":"","sources":["../../../server/service/activity-instance/request-box.ts"],"names":[],"mappings":";;AACA,0CAYC;AAbD,0FAA0F;AAC1F,SAAgB,eAAe,CAAC,KAAa;IAC3C,MAAM,MAAM,GAAG,wEAAwE,CAAA;IACvF,MAAM,OAAO,GAAG;;;uEAGqD,CAAA;IACrE,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,OAAO,CAAC,CAAC,OAAO,2BAA2B,MAAM,QAAQ,OAAO,IAAI,CAAA;QACzE,KAAK,UAAU,CAAC,CAAC,OAAO,IAAI,MAAM,YAAY,OAAO,GAAG,CAAA;QACxD,KAAK,WAAW,CAAC,CAAC,OAAO,kCAAkC,CAAA;QAC3D,OAAO,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAA;IACvD,CAAC;AACH,CAAC","sourcesContent":["/** One predicate for the request box and its badge. ai is an activity_instances alias. */\nexport function requestBoxWhere(group: string): string {\n const active = \"ai.state IN ('issued', 'unassigned', 'assigned', 'started', 'pending')\"\n const editing = `EXISTS (SELECT 1 FROM activity_threads request_thread\n WHERE request_thread.activity_instance_id = ai.id\n AND request_thread.assignee_id = ai.creator_id\n AND request_thread.state IN ('assigned', 'started', 'rejected'))`\n switch (group) {\n case 'draft': return `(ai.state = 'draft' OR (${active} AND ${editing}))`\n case 'progress': return `(${active} AND NOT ${editing})`\n case 'completed': return \"ai.state IN ('ended', 'aborted')\"\n default: throw new Error('Unknown request box group')\n }\n}\n"]}
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ActivitySummaryQuery = void 0;
4
4
  const tslib_1 = require("tslib");
5
+ const request_box_js_1 = require("../activity-instance/request-box.js");
5
6
  const type_graphql_1 = require("type-graphql");
6
7
  const auth_base_1 = require("@things-factory/auth-base");
7
8
  const shell_1 = require("@things-factory/shell");
@@ -78,15 +79,14 @@ let ActivitySummaryQuery = class ActivitySummaryQuery {
78
79
  }
79
80
  async numberOfDrafts(activitySummary, context) {
80
81
  var { domain, user } = context.state;
81
- /* 생성자가 자신이면서, 아직 Draft 상태인 activity-instance 리스트만 반환 */
82
- const status = [activity_instance_js_1.ActivityInstanceStatus.Draft];
82
+ // Drafts and requests returned to their author use the same predicate as the request box.
83
83
  return await (0, shell_1.getQueryBuilderFromListParams)({
84
84
  repository: (0, shell_1.getRepository)(activity_instance_js_1.ActivityInstance),
85
85
  params: {},
86
86
  domain,
87
87
  alias: 'ai'
88
88
  })
89
- .andWhere('ai.state IN (:...status)', { status })
89
+ .andWhere((0, request_box_js_1.requestBoxWhere)('draft'))
90
90
  .andWhere('ai.creator = :user', { user: user.id })
91
91
  .getCount();
92
92
  }
@@ -1 +1 @@
1
- {"version":3,"file":"activity-summary-query.js","sourceRoot":"","sources":["../../../server/service/activity-summary/activity-summary-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { Brackets } from 'typeorm'\nimport { Ctx, FieldResolver, Query, Resolver, Root } from 'type-graphql'\n\nimport { User } from '@things-factory/auth-base'\nimport { getQueryBuilderFromListParams, getRepository } from '@things-factory/shell'\n\nimport { ActivitySummary } from './activity-summary.js'\nimport { ActivityThread, ActivityThreadStatus } from '../activity-thread/activity-thread.js'\nimport { ActivityApproval } from '../activity-approval/activity-approval.js'\nimport { myPendingApprovalsWhere } from '../activity-approval/my-pending-approvals.js'\nimport { ActivityInstance, ActivityInstanceStatus } from '../activity-instance/activity-instance.js'\nimport { inPoolOf } from '../activity-instance/assignee-pool.js'\nimport { pendingApprovalsOf, toDosOf } from './open-work.js'\n\n@Resolver(ActivitySummary)\nexport class ActivitySummaryQuery {\n @Query(returns => ActivitySummary!, { nullable: true, description: 'To fetch a Activity Summary' })\n async activitySummary(@Ctx() context: ResolverContext): Promise<ActivitySummary> {\n return {}\n }\n\n @FieldResolver(type => Number)\n async numberOfToDos(@Root() activitySummary: ActivitySummary, @Ctx() context: ResolverContext): Promise<number> {\n const { domain, user } = context.state\n\n /* The rule lives in `open-work.ts`, shared with the person 360 - one answer to one question. */\n return await toDosOf(domain, user.id)\n }\n\n @FieldResolver(type => Number)\n async numberOfApprovalPendings(\n @Root() activitySummary: ActivitySummary,\n @Ctx() context: ResolverContext\n ): Promise<number> {\n const { domain, user } = context.state\n\n /*\n * The badge asks the same question the inbox does, through the same clause.\n *\n * ── What the badge was counting ───────────────────────────────────────\n * It had its own copy of \"not finished yet\", written as NOT IN four judgments, and that copy\n * had drifted three ways from the list it labels:\n *\n * closed a reference seat the case closed when it ended\n * aborted an approval closed because the thread was aborted\n * reference a seat that comments and never decides\n *\n * TERMINATED_JUDGMENTS holds six; this named four. So every ended thread and every case a\n * reference had been on kept adding to the number, and a role-held row had no judgment test at\n * all — once closed with nobody having pressed, `approver` stays empty and it would have been\n * counted forever, for everyone holding that role.\n *\n * The badge therefore read higher than the inbox it points at. Opening it showed fewer, or\n * nothing: a number that sends someone to an empty screen teaches them to stop believing it.\n *\n * ── Why the clause is borrowed rather than fixed here ─────────────────\n * Naming the six here would make the count right today and drift again at the seventh. The\n * inbox list and the calendar already share one clause for this; the badge is the third reader\n * and now asks through it too. `myPendingApprovalsWhere` carries why each part is there.\n */\n return await pendingApprovalsOf(domain, user.id)\n }\n\n @FieldResolver(type => Number)\n async numberOfPicks(@Root() activitySummary: ActivitySummary, @Ctx() context: ResolverContext): Promise<number> {\n var { domain, user } = context.state\n\n /* \n activity-instance 중에서 아직 created 상태이면서, \n activity-instance 의 assigneeRoles 중 하나라도 내가 가진 경우이면서,\n 나는 아직 해당 activity-instance의 thread를 할당받지 않은 경우에 해당하는\n activity-instance 리스트를 모두 가져오는 쿼리이다.\n */\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 if (!roles.length) {\n return 0\n }\n\n return await getQueryBuilderFromListParams({\n repository: getRepository(ActivityInstance),\n params: {},\n domain,\n alias: 'ai'\n })\n .leftJoinAndSelect('ai.activityThreads', 'threads', 'threads.assignee = :user', { user: user.id })\n .andWhere('ai.state IN (:...status)', {\n status: [ActivityInstanceStatus.Issued, ActivityInstanceStatus.Unassigned]\n })\n .andWhere(inPoolOf('ai'), { roles })\n .andWhere('threads.id IS NULL') /* 이미 내가 할당된 경우는 제외한다. */\n .getCount()\n }\n\n @FieldResolver(type => Number)\n async numberOfDrafts(@Root() activitySummary: ActivitySummary, @Ctx() context: ResolverContext): Promise<number> {\n var { domain, user } = context.state\n\n /* 생성자가 자신이면서, 아직 Draft 상태인 activity-instance 리스트만 반환 */\n const status = [ActivityInstanceStatus.Draft]\n\n return await getQueryBuilderFromListParams({\n repository: getRepository(ActivityInstance),\n params: {},\n domain,\n alias: 'ai'\n })\n .andWhere('ai.state IN (:...status)', { status })\n .andWhere('ai.creator = :user', { user: user.id })\n .getCount()\n }\n}\n"]}
1
+ {"version":3,"file":"activity-summary-query.js","sourceRoot":"","sources":["../../../server/service/activity-summary/activity-summary-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { requestBoxWhere } from '../activity-instance/request-box.js'\nimport { Brackets } from 'typeorm'\nimport { Ctx, FieldResolver, Query, Resolver, Root } from 'type-graphql'\n\nimport { User } from '@things-factory/auth-base'\nimport { getQueryBuilderFromListParams, getRepository } from '@things-factory/shell'\n\nimport { ActivitySummary } from './activity-summary.js'\nimport { ActivityThread, ActivityThreadStatus } from '../activity-thread/activity-thread.js'\nimport { ActivityApproval } from '../activity-approval/activity-approval.js'\nimport { myPendingApprovalsWhere } from '../activity-approval/my-pending-approvals.js'\nimport { ActivityInstance, ActivityInstanceStatus } from '../activity-instance/activity-instance.js'\nimport { inPoolOf } from '../activity-instance/assignee-pool.js'\nimport { pendingApprovalsOf, toDosOf } from './open-work.js'\n\n@Resolver(ActivitySummary)\nexport class ActivitySummaryQuery {\n @Query(returns => ActivitySummary!, { nullable: true, description: 'To fetch a Activity Summary' })\n async activitySummary(@Ctx() context: ResolverContext): Promise<ActivitySummary> {\n return {}\n }\n\n @FieldResolver(type => Number)\n async numberOfToDos(@Root() activitySummary: ActivitySummary, @Ctx() context: ResolverContext): Promise<number> {\n const { domain, user } = context.state\n\n /* The rule lives in `open-work.ts`, shared with the person 360 - one answer to one question. */\n return await toDosOf(domain, user.id)\n }\n\n @FieldResolver(type => Number)\n async numberOfApprovalPendings(\n @Root() activitySummary: ActivitySummary,\n @Ctx() context: ResolverContext\n ): Promise<number> {\n const { domain, user } = context.state\n\n /*\n * The badge asks the same question the inbox does, through the same clause.\n *\n * ── What the badge was counting ───────────────────────────────────────\n * It had its own copy of \"not finished yet\", written as NOT IN four judgments, and that copy\n * had drifted three ways from the list it labels:\n *\n * closed a reference seat the case closed when it ended\n * aborted an approval closed because the thread was aborted\n * reference a seat that comments and never decides\n *\n * TERMINATED_JUDGMENTS holds six; this named four. So every ended thread and every case a\n * reference had been on kept adding to the number, and a role-held row had no judgment test at\n * all — once closed with nobody having pressed, `approver` stays empty and it would have been\n * counted forever, for everyone holding that role.\n *\n * The badge therefore read higher than the inbox it points at. Opening it showed fewer, or\n * nothing: a number that sends someone to an empty screen teaches them to stop believing it.\n *\n * ── Why the clause is borrowed rather than fixed here ─────────────────\n * Naming the six here would make the count right today and drift again at the seventh. The\n * inbox list and the calendar already share one clause for this; the badge is the third reader\n * and now asks through it too. `myPendingApprovalsWhere` carries why each part is there.\n */\n return await pendingApprovalsOf(domain, user.id)\n }\n\n @FieldResolver(type => Number)\n async numberOfPicks(@Root() activitySummary: ActivitySummary, @Ctx() context: ResolverContext): Promise<number> {\n var { domain, user } = context.state\n\n /* \n activity-instance 중에서 아직 created 상태이면서, \n activity-instance 의 assigneeRoles 중 하나라도 내가 가진 경우이면서,\n 나는 아직 해당 activity-instance의 thread를 할당받지 않은 경우에 해당하는\n activity-instance 리스트를 모두 가져오는 쿼리이다.\n */\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 if (!roles.length) {\n return 0\n }\n\n return await getQueryBuilderFromListParams({\n repository: getRepository(ActivityInstance),\n params: {},\n domain,\n alias: 'ai'\n })\n .leftJoinAndSelect('ai.activityThreads', 'threads', 'threads.assignee = :user', { user: user.id })\n .andWhere('ai.state IN (:...status)', {\n status: [ActivityInstanceStatus.Issued, ActivityInstanceStatus.Unassigned]\n })\n .andWhere(inPoolOf('ai'), { roles })\n .andWhere('threads.id IS NULL') /* 이미 내가 할당된 경우는 제외한다. */\n .getCount()\n }\n\n @FieldResolver(type => Number)\n async numberOfDrafts(@Root() activitySummary: ActivitySummary, @Ctx() context: ResolverContext): Promise<number> {\n var { domain, user } = context.state\n\n // Drafts and requests returned to their author use the same predicate as the request box.\n\n return await getQueryBuilderFromListParams({\n repository: getRepository(ActivityInstance),\n params: {},\n domain,\n alias: 'ai'\n })\n .andWhere(requestBoxWhere('draft'))\n .andWhere('ai.creator = :user', { user: user.id })\n .getCount()\n }\n}\n"]}
@@ -2,4 +2,4 @@ import { ActivitySummary } from "./activity-summary.js";
2
2
  import { ActivitySummaryQuery } from "./activity-summary-query.js";
3
3
  import { PersonOpenWorkQuery } from "./person-open-work.js";
4
4
  export declare const entities: (typeof ActivitySummary)[];
5
- export declare const resolvers: (typeof PersonOpenWorkQuery | typeof ActivitySummaryQuery)[];
5
+ export declare const resolvers: (typeof ActivitySummaryQuery | typeof PersonOpenWorkQuery)[];
@@ -3,6 +3,6 @@ import { ActivityTemplateHistory } from "./activity-template-history.js";
3
3
  import { ActivityTemplateMutation } from "./activity-template-mutation.js";
4
4
  import { ActivityTemplateQuery } from "./activity-template-query.js";
5
5
  import { ActivityTemplateHistoryEntitySubscriber } from "./event-subscriber.js";
6
- export declare const entities: (typeof ActivityTemplateHistory | typeof ActivityTemplate)[];
7
- export declare const resolvers: (typeof ActivityTemplateQuery | typeof ActivityTemplateMutation)[];
6
+ export declare const entities: (typeof ActivityTemplate | typeof ActivityTemplateHistory)[];
7
+ export declare const resolvers: (typeof ActivityTemplateMutation | typeof ActivityTemplateQuery)[];
8
8
  export declare const subscribers: (typeof ActivityTemplateHistoryEntitySubscriber)[];
@@ -6,5 +6,5 @@ import { ActivityThreadHistoryQuery } from "./activity-thread-history-query.js";
6
6
  import { ActivityThreadSubscription } from "./activity-thread-subscription.js";
7
7
  import { ActivityThreadHistoryEntitySubscriber, ActivityThreadSubscriber } from "./event-subscriber.js";
8
8
  export declare const entities: (typeof ActivityThread | typeof ActivityThreadHistory)[];
9
- export declare const resolvers: (typeof ActivityThreadSubscription | typeof ActivityThreadHistoryQuery | typeof ActivityThreadQuery | typeof ActivityThreadMutation)[];
9
+ export declare const resolvers: (typeof ActivityThreadMutation | typeof ActivityThreadQuery | typeof ActivityThreadHistoryQuery | typeof ActivityThreadSubscription)[];
10
10
  export declare const subscribers: (typeof ActivityThreadSubscriber | typeof ActivityThreadHistoryEntitySubscriber)[];
@@ -23,8 +23,7 @@ export declare function myOpenThreadsWhere({ userId, roles }: {
23
23
  *
24
24
  * What I put up myself is followed in 상신함 — the box of what I gave others to do. A post thread
25
25
  * is mine only as the vehicle of my request: once submitted it waits on the approvers, and when it
26
- * ends it is my request that ended. Listing it again under 할 일 put one fact in two boxes. While it
27
- * is my turn - rejected and back with me - it stays in 할 일, which is myOpenThreadsWhere above.
26
+ * ends it is my request that ended. Listing it again under 할 일 put one fact in two boxes. Rejected requests and their revisions stay in 상신함 as well (2026-10-23 user decision).
28
27
  *
29
28
  * Expects `at` and `ai` joined.
30
29
  */
@@ -47,7 +47,7 @@ function myOpenThreadsWhere({ userId, roles }) {
47
47
  return new typeorm_1.Brackets(qb => {
48
48
  qb.where('at.state NOT IN (:...notMyTurn)', { notMyTurn: NOT_MY_TURN }).andWhere('at.assignee = :userId', {
49
49
  userId
50
- });
50
+ }).andWhere('(ai.creator IS NULL OR ai.creator != :userId)', { userId });
51
51
  /*
52
52
  * 역할로 걸린 것은 아직 임자가 없다 — 그 역할들 중 하나라도 가진 사람 모두의 할 일이다.
53
53
  *
@@ -71,8 +71,7 @@ function myOpenThreadsWhere({ userId, roles }) {
71
71
  *
72
72
  * What I put up myself is followed in 상신함 — the box of what I gave others to do. A post thread
73
73
  * is mine only as the vehicle of my request: once submitted it waits on the approvers, and when it
74
- * ends it is my request that ended. Listing it again under 할 일 put one fact in two boxes. While it
75
- * is my turn - rejected and back with me - it stays in 할 일, which is myOpenThreadsWhere above.
74
+ * ends it is my request that ended. Listing it again under 할 일 put one fact in two boxes. Rejected requests and their revisions stay in 상신함 as well (2026-10-23 user decision).
76
75
  *
77
76
  * Expects `at` and `ai` joined.
78
77
  */
@@ -1 +1 @@
1
- {"version":3,"file":"my-open-threads.js","sourceRoot":"","sources":["../../../server/service/activity-thread/my-open-threads.ts"],"names":[],"mappings":";;;AA8CA,gDA4BC;AAYD,wDAMC;AA5FD,qCAAkC;AAElC,4EAAgE;AAChE,6DAA2D;AAE3D;;;;;;;;;GASG;AACH,MAAM,WAAW,GAAG;IAClB,yCAAoB,CAAC,UAAU;IAC/B,yCAAoB,CAAC,SAAS;IAC9B,yCAAoB,CAAC,SAAS;IAC9B,yCAAoB,CAAC,KAAK;IAC1B,yCAAoB,CAAC,OAAO;CAC7B,CAAA;AAED,8GAA8G;AAC9G,MAAM,OAAO,GAAG;IACd,KAAK,EAAE,kBAAkB;IACzB,UAAU,EAAE,sBAAsB;IAClC,cAAc,EAAE,aAAa;CACrB,CAAA;AAEV,2DAA2D;AAC9C,QAAA,iBAAiB,GAAG,CAAC,yCAAoB,CAAC,SAAS,EAAE,yCAAoB,CAAC,SAAS,CAAC,CAAA;AAEjG,6BAA6B;AAChB,QAAA,QAAQ,GAAG,CAAC,yCAAoB,CAAC,KAAK,EAAE,yCAAoB,CAAC,OAAO,CAAC,CAAA;AAElF;;;;;;;;;GASG;AACH,SAAgB,kBAAkB,CAAC,EAAE,MAAM,EAAE,KAAK,EAAuC;IACvF,OAAO,IAAI,kBAAQ,CAAC,EAAE,CAAC,EAAE;QACvB,EAAE,CAAC,KAAK,CAAC,iCAAiC,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,uBAAuB,EAAE;YACxG,MAAM;SACP,CAAC,CAAA;QAEF;;;;;;WAMG;QACH,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,EAAE,CAAC,OAAO,CACR,IAAI,kBAAQ,CAAC,KAAK,CAAC,EAAE;gBACnB,KAAK;qBACF,KAAK,CAAC,IAAA,2BAAQ,EAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC;qBAChC,QAAQ,CAAC,wBAAwB,EAAE,EAAE,UAAU,EAAE,yCAAoB,CAAC,UAAU,EAAE,CAAC;qBACnF,QAAQ,CACP,6BAA6B,OAAO,CAAC,KAAK,OAAO;oBAC/C,eAAe,OAAO,CAAC,UAAU,qBAAqB,OAAO,CAAC,cAAc,aAAa,EAC3F,EAAE,MAAM,EAAE,CACX,CAAA;YACL,CAAC,CAAC,CACH,CAAA;QACH,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,SAAgB,sBAAsB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAsD;IAC3G,OAAO,IAAI,kBAAQ,CAAC,EAAE,CAAC,EAAE;QACvB,EAAE,CAAC,KAAK,CAAC,uBAAuB,EAAE,EAAE,MAAM,EAAE,CAAC;aAC1C,QAAQ,CAAC,0BAA0B,EAAE,EAAE,MAAM,EAAE,CAAC;aAChD,QAAQ,CAAC,+CAA+C,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;IAC1E,CAAC,CAAC,CAAA;AACJ,CAAC","sourcesContent":["import { Brackets } from 'typeorm'\n\nimport { inPoolOf } from '../activity-instance/assignee-pool.js'\nimport { ActivityThreadStatus } from './activity-thread.js'\n\n/**\n * Thread states that are **not** my turn.\n *\n * Submitted and escalated wait on an approver: the thread is still assigned to me, but nothing I do\n * moves it. Counting them made 할 일 say 1 to a person who had just put up an expenditure request\n * and had nothing left to do (2026-10-16). They are the 「제출한 것」 group of the same box.\n *\n * Unassigned belongs here for the person branch only — a thread nobody holds is not on my plate\n * until I claim it, and the role branch below is what surfaces it to the people who could.\n */\nconst NOT_MY_TURN = [\n ActivityThreadStatus.Unassigned,\n ActivityThreadStatus.Submitted,\n ActivityThreadStatus.Escalated,\n ActivityThreadStatus.Ended,\n ActivityThreadStatus.Aborted\n]\n\n/** The thread table, for the raw EXISTS below - this module reads no entity metadata, as assignee-pool.ts. */\nconst THREADS = {\n table: 'activity_threads',\n caseColumn: 'activity_instance_id',\n assigneeColumn: 'assignee_id'\n} as const\n\n/** A thread I submitted, waiting on someone's judgment. */\nexport const WAITING_ON_OTHERS = [ActivityThreadStatus.Submitted, ActivityThreadStatus.Escalated]\n\n/** A thread that is over. */\nexport const FINISHED = [ActivityThreadStatus.Ended, ActivityThreadStatus.Aborted]\n\n/**\n * The work that is on my plate — one definition, three readers.\n *\n * 할 일 목록 asks this, and so do the calendar and the badge (open-work). Written twice they drift:\n * a new state, or a new way of being assigned, lands in one and not the other, and the badge says\n * a different number than the list it opens. Nothing errors.\n *\n * Expects `at` (ActivityThread) and `ai` (ActivityInstance) to be joined already — the role branch\n * reads the instance's pool (assignee-pool.ts).\n */\nexport function myOpenThreadsWhere({ userId, roles }: { userId: string; roles: string[] }): Brackets {\n return new Brackets(qb => {\n qb.where('at.state NOT IN (:...notMyTurn)', { notMyTurn: NOT_MY_TURN }).andWhere('at.assignee = :userId', {\n userId\n })\n\n /*\n * 역할로 걸린 것은 아직 임자가 없다 — 그 역할들 중 하나라도 가진 사람 모두의 할 일이다.\n *\n * Except someone who holds a thread of the case already: in a case waiting for more than one person\n * (threadsMin > 1) they would see it twice - their own thread and the waiting one beside it - and taking\n * the waiting one is refused (one person, one thread of a case).\n */\n if (roles.length > 0) {\n qb.orWhere(\n new Brackets(subQb => {\n subQb\n .where(inPoolOf('ai'), { roles })\n .andWhere('at.state = :unassigned', { unassigned: ActivityThreadStatus.Unassigned })\n .andWhere(\n `NOT EXISTS (SELECT 1 FROM ${THREADS.table} mine` +\n ` WHERE mine.${THREADS.caseColumn} = ai.id AND mine.${THREADS.assigneeColumn} = :userId)`,\n { userId }\n )\n })\n )\n }\n })\n}\n\n/**\n * My threads in these states, of work **someone else** put up.\n *\n * What I put up myself is followed in 상신함 — the box of what I gave others to do. A post thread\n * is mine only as the vehicle of my request: once submitted it waits on the approvers, and when it\n * ends it is my request that ended. Listing it again under 할 일 put one fact in two boxes. While it\n * is my turn - rejected and back with me - it stays in 할 일, which is myOpenThreadsWhere above.\n *\n * Expects `at` and `ai` joined.\n */\nexport function myThreadsOfOthersWhere({ userId, states }: { userId: string; states: ActivityThreadStatus[] }): Brackets {\n return new Brackets(qb => {\n qb.where('at.assignee = :userId', { userId })\n .andWhere('at.state IN (:...states)', { states })\n .andWhere('(ai.creator IS NULL OR ai.creator != :userId)', { userId })\n })\n}\n"]}
1
+ {"version":3,"file":"my-open-threads.js","sourceRoot":"","sources":["../../../server/service/activity-thread/my-open-threads.ts"],"names":[],"mappings":";;;AA8CA,gDA4BC;AAWD,wDAMC;AA3FD,qCAAkC;AAElC,4EAAgE;AAChE,6DAA2D;AAE3D;;;;;;;;;GASG;AACH,MAAM,WAAW,GAAG;IAClB,yCAAoB,CAAC,UAAU;IAC/B,yCAAoB,CAAC,SAAS;IAC9B,yCAAoB,CAAC,SAAS;IAC9B,yCAAoB,CAAC,KAAK;IAC1B,yCAAoB,CAAC,OAAO;CAC7B,CAAA;AAED,8GAA8G;AAC9G,MAAM,OAAO,GAAG;IACd,KAAK,EAAE,kBAAkB;IACzB,UAAU,EAAE,sBAAsB;IAClC,cAAc,EAAE,aAAa;CACrB,CAAA;AAEV,2DAA2D;AAC9C,QAAA,iBAAiB,GAAG,CAAC,yCAAoB,CAAC,SAAS,EAAE,yCAAoB,CAAC,SAAS,CAAC,CAAA;AAEjG,6BAA6B;AAChB,QAAA,QAAQ,GAAG,CAAC,yCAAoB,CAAC,KAAK,EAAE,yCAAoB,CAAC,OAAO,CAAC,CAAA;AAElF;;;;;;;;;GASG;AACH,SAAgB,kBAAkB,CAAC,EAAE,MAAM,EAAE,KAAK,EAAuC;IACvF,OAAO,IAAI,kBAAQ,CAAC,EAAE,CAAC,EAAE;QACvB,EAAE,CAAC,KAAK,CAAC,iCAAiC,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,uBAAuB,EAAE;YACxG,MAAM;SACP,CAAC,CAAC,QAAQ,CAAC,+CAA+C,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;QAExE;;;;;;WAMG;QACH,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,EAAE,CAAC,OAAO,CACR,IAAI,kBAAQ,CAAC,KAAK,CAAC,EAAE;gBACnB,KAAK;qBACF,KAAK,CAAC,IAAA,2BAAQ,EAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC;qBAChC,QAAQ,CAAC,wBAAwB,EAAE,EAAE,UAAU,EAAE,yCAAoB,CAAC,UAAU,EAAE,CAAC;qBACnF,QAAQ,CACP,6BAA6B,OAAO,CAAC,KAAK,OAAO;oBAC/C,eAAe,OAAO,CAAC,UAAU,qBAAqB,OAAO,CAAC,cAAc,aAAa,EAC3F,EAAE,MAAM,EAAE,CACX,CAAA;YACL,CAAC,CAAC,CACH,CAAA;QACH,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,sBAAsB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAsD;IAC3G,OAAO,IAAI,kBAAQ,CAAC,EAAE,CAAC,EAAE;QACvB,EAAE,CAAC,KAAK,CAAC,uBAAuB,EAAE,EAAE,MAAM,EAAE,CAAC;aAC1C,QAAQ,CAAC,0BAA0B,EAAE,EAAE,MAAM,EAAE,CAAC;aAChD,QAAQ,CAAC,+CAA+C,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;IAC1E,CAAC,CAAC,CAAA;AACJ,CAAC","sourcesContent":["import { Brackets } from 'typeorm'\n\nimport { inPoolOf } from '../activity-instance/assignee-pool.js'\nimport { ActivityThreadStatus } from './activity-thread.js'\n\n/**\n * Thread states that are **not** my turn.\n *\n * Submitted and escalated wait on an approver: the thread is still assigned to me, but nothing I do\n * moves it. Counting them made 할 일 say 1 to a person who had just put up an expenditure request\n * and had nothing left to do (2026-10-16). They are the 「제출한 것」 group of the same box.\n *\n * Unassigned belongs here for the person branch only — a thread nobody holds is not on my plate\n * until I claim it, and the role branch below is what surfaces it to the people who could.\n */\nconst NOT_MY_TURN = [\n ActivityThreadStatus.Unassigned,\n ActivityThreadStatus.Submitted,\n ActivityThreadStatus.Escalated,\n ActivityThreadStatus.Ended,\n ActivityThreadStatus.Aborted\n]\n\n/** The thread table, for the raw EXISTS below - this module reads no entity metadata, as assignee-pool.ts. */\nconst THREADS = {\n table: 'activity_threads',\n caseColumn: 'activity_instance_id',\n assigneeColumn: 'assignee_id'\n} as const\n\n/** A thread I submitted, waiting on someone's judgment. */\nexport const WAITING_ON_OTHERS = [ActivityThreadStatus.Submitted, ActivityThreadStatus.Escalated]\n\n/** A thread that is over. */\nexport const FINISHED = [ActivityThreadStatus.Ended, ActivityThreadStatus.Aborted]\n\n/**\n * The work that is on my plate — one definition, three readers.\n *\n * 할 일 목록 asks this, and so do the calendar and the badge (open-work). Written twice they drift:\n * a new state, or a new way of being assigned, lands in one and not the other, and the badge says\n * a different number than the list it opens. Nothing errors.\n *\n * Expects `at` (ActivityThread) and `ai` (ActivityInstance) to be joined already — the role branch\n * reads the instance's pool (assignee-pool.ts).\n */\nexport function myOpenThreadsWhere({ userId, roles }: { userId: string; roles: string[] }): Brackets {\n return new Brackets(qb => {\n qb.where('at.state NOT IN (:...notMyTurn)', { notMyTurn: NOT_MY_TURN }).andWhere('at.assignee = :userId', {\n userId\n }).andWhere('(ai.creator IS NULL OR ai.creator != :userId)', { userId })\n\n /*\n * 역할로 걸린 것은 아직 임자가 없다 — 그 역할들 중 하나라도 가진 사람 모두의 할 일이다.\n *\n * Except someone who holds a thread of the case already: in a case waiting for more than one person\n * (threadsMin > 1) they would see it twice - their own thread and the waiting one beside it - and taking\n * the waiting one is refused (one person, one thread of a case).\n */\n if (roles.length > 0) {\n qb.orWhere(\n new Brackets(subQb => {\n subQb\n .where(inPoolOf('ai'), { roles })\n .andWhere('at.state = :unassigned', { unassigned: ActivityThreadStatus.Unassigned })\n .andWhere(\n `NOT EXISTS (SELECT 1 FROM ${THREADS.table} mine` +\n ` WHERE mine.${THREADS.caseColumn} = ai.id AND mine.${THREADS.assigneeColumn} = :userId)`,\n { userId }\n )\n })\n )\n }\n })\n}\n\n/**\n * My threads in these states, of work **someone else** put up.\n *\n * What I put up myself is followed in 상신함 — the box of what I gave others to do. A post thread\n * is mine only as the vehicle of my request: once submitted it waits on the approvers, and when it\n * ends it is my request that ended. Listing it again under 할 일 put one fact in two boxes. Rejected requests and their revisions stay in 상신함 as well (2026-10-23 user decision).\n *\n * Expects `at` and `ai` joined.\n */\nexport function myThreadsOfOthersWhere({ userId, states }: { userId: string; states: ActivityThreadStatus[] }): Brackets {\n return new Brackets(qb => {\n qb.where('at.assignee = :userId', { userId })\n .andWhere('at.state IN (:...states)', { states })\n .andWhere('(ai.creator IS NULL OR ai.creator != :userId)', { userId })\n })\n}\n"]}
@@ -16,8 +16,8 @@ export * from './work-door/work-door-not-used.js';
16
16
  export * from './work-door/work-door-journal.js';
17
17
  export * from './work-door/work-door-journal-service.js';
18
18
  export * from './work-door/work-door-service.js';
19
- export declare const entities: (typeof import("./work-door/work-door-journal.js").WorkDoorJournal | typeof import("./work-door/work-door-not-used.js").WorkDoorNotUsed | typeof import("./activity-thread/activity-thread.js").ActivityThread | typeof import("./activity-thread/activity-thread-history.js").ActivityThreadHistory | typeof import("./activity-template/activity-template-history.js").ActivityTemplateHistory | typeof import("./activity-instance/activity-instance.js").ActivityInstance | typeof import("./activity-instance/activity-instance-history.js").ActivityInstanceHistory | typeof import("./activity/activity-history.js").ActivityHistory | typeof import("./activity-approval/activity-approval.js").ActivityApproval | typeof import("./activity-template/activity-template.js").ActivityTemplate | typeof import("./activity/activity.js").Activity | typeof import("./activity-summary/activity-summary.js").ActivitySummary | typeof import("./installable-activity/installable-activity.js").InstallableActivity)[];
20
- export declare const subscribers: (typeof import("./activity-thread/event-subscriber.js").ActivityThreadSubscriber | typeof import("./activity-thread/event-subscriber.js").ActivityThreadHistoryEntitySubscriber | typeof import("./activity-instance/event-subscriber.js").ActivityInstanceSubscriber | typeof import("./activity-instance/event-subscriber.js").ActivityInstanceHistoryEntitySubscriber | typeof import("./activity-approval/event-subscriber.js").ActivityApprovalSubscriber | typeof import("./activity/event-subscriber.js").ActivityHistoryEntitySubscriber | typeof import("./activity/declaration-guard-subscriber.js").ActivityDeclarationGuardSubscriber)[];
19
+ export declare const entities: (typeof import("./activity/activity.js").Activity | typeof import("./activity-approval/activity-approval.js").ActivityApproval | typeof import("./activity-thread/activity-thread.js").ActivityThread | typeof import("./activity-instance/activity-instance.js").ActivityInstance | typeof import("./installable-activity/installable-activity.js").InstallableActivity | typeof import("./activity-template/activity-template.js").ActivityTemplate | typeof import("./activity-summary/activity-summary.js").ActivitySummary | typeof import("./activity/activity-history.js").ActivityHistory | typeof import("./activity-instance/activity-instance-history.js").ActivityInstanceHistory | typeof import("./activity-template/activity-template-history.js").ActivityTemplateHistory | typeof import("./activity-thread/activity-thread-history.js").ActivityThreadHistory | typeof import("./work-door/work-door-not-used.js").WorkDoorNotUsed | typeof import("./work-door/work-door-journal.js").WorkDoorJournal)[];
20
+ export declare const subscribers: (typeof import("./activity-approval/event-subscriber.js").ActivityApprovalSubscriber | typeof import("./activity/event-subscriber.js").ActivityHistoryEntitySubscriber | typeof import("./activity/declaration-guard-subscriber.js").ActivityDeclarationGuardSubscriber | typeof import("./activity-instance/event-subscriber.js").ActivityInstanceSubscriber | typeof import("./activity-instance/event-subscriber.js").ActivityInstanceHistoryEntitySubscriber | typeof import("./activity-thread/event-subscriber.js").ActivityThreadSubscriber | typeof import("./activity-thread/event-subscriber.js").ActivityThreadHistoryEntitySubscriber)[];
21
21
  export declare const schema: {
22
- resolverClasses: (typeof import("./work-door/work-door-resolver.js").WorkDoorResolver | typeof import("./activity-summary/person-open-work.js").PersonOpenWorkQuery | typeof import("./activity-summary/activity-summary-query.js").ActivitySummaryQuery | typeof import("./installable-activity/installable-activity-query.js").InstallableActivityQuery | typeof import("./activity-thread/activity-thread-subscription.js").ActivityThreadSubscription | typeof import("./activity-thread/activity-thread-history-query.js").ActivityThreadHistoryQuery | typeof import("./activity-thread/activity-thread-query.js").ActivityThreadQuery | typeof import("./activity-thread/activity-thread-mutation.js").ActivityThreadMutation | typeof import("./activity-template/activity-template-query.js").ActivityTemplateQuery | typeof import("./activity-instance/activity-instance-subscription.js").ActivityInstanceSubscription | typeof import("./activity-instance/activity-instance-query.js").ActivityInstanceQuery | typeof import("./activity-instance/activity-instance-mutation.js").ActivityInstanceMutation | typeof import("./activity/activity-query.js").ActivityQuery | typeof import("./activity-approval/activity-approval-subscription.js").ActivityApprovalSubscription | typeof import("./activity-approval/activity-approval-mutation.js").ActivityApprovalMutation | typeof import("./activity-approval/activity-approval-query.js").ActivityApprovalQuery | typeof import("./activity-stats/activity-stats-query.js").ActivityStatsQuery | typeof import("./activity/activity-mutation.js").ActivityMutation | typeof import("./activity-template/activity-template-mutation.js").ActivityTemplateMutation | typeof import("./installable-activity/installable-activity-mutation.js").InstallableActivityMutation)[];
22
+ resolverClasses: (typeof import("./activity-stats/activity-stats-query.js").ActivityStatsQuery | typeof import("./activity-approval/activity-approval-query.js").ActivityApprovalQuery | typeof import("./activity-approval/activity-approval-mutation.js").ActivityApprovalMutation | typeof import("./activity-approval/activity-approval-subscription.js").ActivityApprovalSubscription | typeof import("./activity/activity-mutation.js").ActivityMutation | typeof import("./activity/activity-query.js").ActivityQuery | typeof import("./activity-instance/activity-instance-mutation.js").ActivityInstanceMutation | typeof import("./activity-instance/activity-instance-query.js").ActivityInstanceQuery | typeof import("./activity-instance/activity-instance-subscription.js").ActivityInstanceSubscription | typeof import("./activity-template/activity-template-mutation.js").ActivityTemplateMutation | typeof import("./activity-template/activity-template-query.js").ActivityTemplateQuery | typeof import("./activity-thread/activity-thread-mutation.js").ActivityThreadMutation | typeof import("./activity-thread/activity-thread-query.js").ActivityThreadQuery | typeof import("./activity-thread/activity-thread-history-query.js").ActivityThreadHistoryQuery | typeof import("./activity-thread/activity-thread-subscription.js").ActivityThreadSubscription | typeof import("./installable-activity/installable-activity-query.js").InstallableActivityQuery | typeof import("./installable-activity/installable-activity-mutation.js").InstallableActivityMutation | typeof import("./activity-summary/activity-summary-query.js").ActivitySummaryQuery | typeof import("./activity-summary/person-open-work.js").PersonOpenWorkQuery | typeof import("./work-door/work-door-resolver.js").WorkDoorResolver)[];
23
23
  };
@@ -22,8 +22,8 @@ export declare function hearsThread(thread: {
22
22
  * step has no approver - only the role - so without the second half nobody hears it. The roles are
23
23
  * asked only after the domain matched, as for an instance.
24
24
  *
25
- * Hearing is not being offered: the client refetches its summary, and the summary leaves out what the
26
- * listener issued (own-request.ts). So the issuer may hear their own step and still not see it.
25
+ * Hearing is not being offered: the client refetches its summary, which counts what the listener may
26
+ * judge - their own requests included, since the one who raises a case may judge it (2026-10-23).
27
27
  */
28
28
  export declare function hearsApproval(approval: {
29
29
  domainId?: string;
@@ -26,8 +26,8 @@ function hearsThread(thread, domain, userId) {
26
26
  * step has no approver - only the role - so without the second half nobody hears it. The roles are
27
27
  * asked only after the domain matched, as for an instance.
28
28
  *
29
- * Hearing is not being offered: the client refetches its summary, and the summary leaves out what the
30
- * listener issued (own-request.ts). So the issuer may hear their own step and still not see it.
29
+ * Hearing is not being offered: the client refetches its summary, which counts what the listener may
30
+ * judge - their own requests included, since the one who raises a case may judge it (2026-10-23).
31
31
  */
32
32
  async function hearsApproval(approval, domain, userId, rolesOf) {
33
33
  if (!inDomain(approval?.domainId, domain))
@@ -1 +1 @@
1
- {"version":3,"file":"subscription-filters.js","sourceRoot":"","sources":["../../../server/service/subscription/subscription-filters.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;AASH,kCAEC;AAUD,sCAWC;AAOD,sCAaC;AAhDD,SAAS,QAAQ,CAAC,aAAiC,EAAE,MAAkB;IACrE,OAAO,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,IAAI,aAAa,KAAK,MAAM,CAAC,EAAE,CAAA;AACvE,CAAC;AAED,qDAAqD;AACrD,SAAgB,WAAW,CAAC,MAAkD,EAAE,MAAkB,EAAE,MAAc;IAChH,OAAO,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,UAAU,KAAK,MAAM,CAAA;AAC3E,CAAC;AAED;;;;;;;GAOG;AACI,KAAK,UAAU,aAAa,CACjC,QAA6E,EAC7E,MAAkB,EAClB,MAAc,EACd,OAAwC;IAExC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC;QAAE,OAAO,KAAK,CAAA;IACvD,IAAI,QAAQ,CAAC,UAAU,KAAK,MAAM;QAAE,OAAO,IAAI,CAAA;IAC/C,IAAI,CAAC,QAAQ,CAAC,cAAc;QAAE,OAAO,KAAK,CAAA;IAE1C,OAAO,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,QAAQ,CAAC,cAAc,CAAC,CAAA;AAC5E,CAAC;AAED;;;;GAIG;AACI,KAAK,UAAU,aAAa,CACjC,QAA+E,EAC/E,MAAkB,EAClB,MAAc,EACd,OAAwC;IAExC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC;QAAE,OAAO,KAAK,CAAA;IACvD,IAAI,QAAQ,CAAC,SAAS,KAAK,MAAM;QAAE,OAAO,IAAI,CAAA;IAC9C,MAAM,OAAO,GAAG,QAAQ,CAAC,eAAe,IAAI,EAAE,CAAA;IAC9C,IAAI,CAAC,OAAO,CAAC,MAAM;QAAE,OAAO,KAAK,CAAA;IAEjC,MAAM,IAAI,GAAG,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACnD,OAAO,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAA;AAC9C,CAAC","sourcesContent":["/**\n * Who hears which worklist event — the filters behind the three subscriptions, kept free of\n * entities and pubsub so they can be tested.\n *\n * Every filter compares the event's domain to the subscriber's first. A thread or an approval in\n * another tenant must never reach this socket, even when the ids beside it happen to match.\n * An event whose domain is not known is dropped: without it the filter cannot tell tenants apart.\n *\n * The ids are the entity's @RelationId fields. TypeORM fills them on the entity it hands the\n * subscriber, on insert as well as update - measured, and held by tests/published-shape.test.ts.\n */\n\ntype DomainLike = { id?: string } | null | undefined\n\nfunction inDomain(eventDomainId: string | undefined, domain: DomainLike): boolean {\n return !!eventDomainId && !!domain?.id && eventDomainId === domain.id\n}\n\n/** A thread reaches the person it is assigned to. */\nexport function hearsThread(thread: { domainId?: string; assigneeId?: string }, domain: DomainLike, userId: string) {\n return inDomain(thread?.domainId, domain) && thread.assigneeId === userId\n}\n\n/**\n * An approval reaches its approver, and anyone holding the role it is addressed to. A role-addressed\n * step has no approver - only the role - so without the second half nobody hears it. The roles are\n * asked only after the domain matched, as for an instance.\n *\n * Hearing is not being offered: the client refetches its summary, and the summary leaves out what the\n * listener issued (own-request.ts). So the issuer may hear their own step and still not see it.\n */\nexport async function hearsApproval(\n approval: { domainId?: string; approverId?: string; approverRoleId?: string },\n domain: DomainLike,\n userId: string,\n rolesOf: () => Promise<{ id: string }[]>\n): Promise<boolean> {\n if (!inDomain(approval?.domainId, domain)) return false\n if (approval.approverId === userId) return true\n if (!approval.approverRoleId) return false\n\n return (await rolesOf()).some(role => role.id === approval.approverRoleId)\n}\n\n/**\n * An instance reaches whoever made it, and anyone holding any one of the roles it is waiting for - once,\n * however many of them they hold: this answers yes or no for one subscriber. The roles are\n * asked only after the domain matched — the lookup is not free and is never needed for another tenant.\n */\nexport async function hearsInstance(\n instance: { domainId?: string; creatorId?: string; assigneeRoleIds?: string[] },\n domain: DomainLike,\n userId: string,\n rolesOf: () => Promise<{ id: string }[]>\n): Promise<boolean> {\n if (!inDomain(instance?.domainId, domain)) return false\n if (instance.creatorId === userId) return true\n const poolIds = instance.assigneeRoleIds || []\n if (!poolIds.length) return false\n\n const held = (await rolesOf()).map(role => role.id)\n return poolIds.some(id => held.includes(id))\n}\n"]}
1
+ {"version":3,"file":"subscription-filters.js","sourceRoot":"","sources":["../../../server/service/subscription/subscription-filters.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;AASH,kCAEC;AAUD,sCAWC;AAOD,sCAaC;AAhDD,SAAS,QAAQ,CAAC,aAAiC,EAAE,MAAkB;IACrE,OAAO,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,IAAI,aAAa,KAAK,MAAM,CAAC,EAAE,CAAA;AACvE,CAAC;AAED,qDAAqD;AACrD,SAAgB,WAAW,CAAC,MAAkD,EAAE,MAAkB,EAAE,MAAc;IAChH,OAAO,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,UAAU,KAAK,MAAM,CAAA;AAC3E,CAAC;AAED;;;;;;;GAOG;AACI,KAAK,UAAU,aAAa,CACjC,QAA6E,EAC7E,MAAkB,EAClB,MAAc,EACd,OAAwC;IAExC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC;QAAE,OAAO,KAAK,CAAA;IACvD,IAAI,QAAQ,CAAC,UAAU,KAAK,MAAM;QAAE,OAAO,IAAI,CAAA;IAC/C,IAAI,CAAC,QAAQ,CAAC,cAAc;QAAE,OAAO,KAAK,CAAA;IAE1C,OAAO,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,QAAQ,CAAC,cAAc,CAAC,CAAA;AAC5E,CAAC;AAED;;;;GAIG;AACI,KAAK,UAAU,aAAa,CACjC,QAA+E,EAC/E,MAAkB,EAClB,MAAc,EACd,OAAwC;IAExC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC;QAAE,OAAO,KAAK,CAAA;IACvD,IAAI,QAAQ,CAAC,SAAS,KAAK,MAAM;QAAE,OAAO,IAAI,CAAA;IAC9C,MAAM,OAAO,GAAG,QAAQ,CAAC,eAAe,IAAI,EAAE,CAAA;IAC9C,IAAI,CAAC,OAAO,CAAC,MAAM;QAAE,OAAO,KAAK,CAAA;IAEjC,MAAM,IAAI,GAAG,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACnD,OAAO,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAA;AAC9C,CAAC","sourcesContent":["/**\n * Who hears which worklist event — the filters behind the three subscriptions, kept free of\n * entities and pubsub so they can be tested.\n *\n * Every filter compares the event's domain to the subscriber's first. A thread or an approval in\n * another tenant must never reach this socket, even when the ids beside it happen to match.\n * An event whose domain is not known is dropped: without it the filter cannot tell tenants apart.\n *\n * The ids are the entity's @RelationId fields. TypeORM fills them on the entity it hands the\n * subscriber, on insert as well as update - measured, and held by tests/published-shape.test.ts.\n */\n\ntype DomainLike = { id?: string } | null | undefined\n\nfunction inDomain(eventDomainId: string | undefined, domain: DomainLike): boolean {\n return !!eventDomainId && !!domain?.id && eventDomainId === domain.id\n}\n\n/** A thread reaches the person it is assigned to. */\nexport function hearsThread(thread: { domainId?: string; assigneeId?: string }, domain: DomainLike, userId: string) {\n return inDomain(thread?.domainId, domain) && thread.assigneeId === userId\n}\n\n/**\n * An approval reaches its approver, and anyone holding the role it is addressed to. A role-addressed\n * step has no approver - only the role - so without the second half nobody hears it. The roles are\n * asked only after the domain matched, as for an instance.\n *\n * Hearing is not being offered: the client refetches its summary, which counts what the listener may\n * judge - their own requests included, since the one who raises a case may judge it (2026-10-23).\n */\nexport async function hearsApproval(\n approval: { domainId?: string; approverId?: string; approverRoleId?: string },\n domain: DomainLike,\n userId: string,\n rolesOf: () => Promise<{ id: string }[]>\n): Promise<boolean> {\n if (!inDomain(approval?.domainId, domain)) return false\n if (approval.approverId === userId) return true\n if (!approval.approverRoleId) return false\n\n return (await rolesOf()).some(role => role.id === approval.approverRoleId)\n}\n\n/**\n * An instance reaches whoever made it, and anyone holding any one of the roles it is waiting for - once,\n * however many of them they hold: this answers yes or no for one subscriber. The roles are\n * asked only after the domain matched — the lookup is not free and is never needed for another tenant.\n */\nexport async function hearsInstance(\n instance: { domainId?: string; creatorId?: string; assigneeRoleIds?: string[] },\n domain: DomainLike,\n userId: string,\n rolesOf: () => Promise<{ id: string }[]>\n): Promise<boolean> {\n if (!inDomain(instance?.domainId, domain)) return false\n if (instance.creatorId === userId) return true\n const poolIds = instance.assigneeRoleIds || []\n if (!poolIds.length) return false\n\n const held = (await rolesOf()).map(role => role.id)\n return poolIds.some(id => held.includes(id))\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  import { WorkDoorNotUsed } from './work-door-not-used.js';
2
2
  import { WorkDoorJournal } from './work-door-journal.js';
3
3
  import { WorkDoorResolver } from './work-door-resolver.js';
4
- export declare const entities: (typeof WorkDoorJournal | typeof WorkDoorNotUsed)[];
4
+ export declare const entities: (typeof WorkDoorNotUsed | typeof WorkDoorJournal)[];
5
5
  export declare const resolvers: (typeof WorkDoorResolver)[];
6
6
  export * from './approval-line-standing.js';
7
7
  export * from './activity-lookup.js';