@open-mercato/core 0.6.6-develop.6460.1.f94c74174c → 0.6.6-develop.6465.1.019f0fb26f

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 (50) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/dist/helpers/integration/auth.js +148 -82
  3. package/dist/helpers/integration/auth.js.map +2 -2
  4. package/dist/modules/sales/api/document-addresses/route.js +96 -6
  5. package/dist/modules/sales/api/document-addresses/route.js.map +2 -2
  6. package/dist/modules/sales/commands/documentAddresses.js +7 -0
  7. package/dist/modules/sales/commands/documentAddresses.js.map +2 -2
  8. package/dist/modules/staff/commands/activities.js +23 -12
  9. package/dist/modules/staff/commands/activities.js.map +2 -2
  10. package/dist/modules/staff/commands/addresses.js +20 -12
  11. package/dist/modules/staff/commands/addresses.js.map +2 -2
  12. package/dist/modules/staff/commands/comments.js +18 -11
  13. package/dist/modules/staff/commands/comments.js.map +2 -2
  14. package/dist/modules/staff/commands/job-histories.js +23 -12
  15. package/dist/modules/staff/commands/job-histories.js.map +2 -2
  16. package/dist/modules/staff/commands/leave-requests.js +37 -19
  17. package/dist/modules/staff/commands/leave-requests.js.map +2 -2
  18. package/dist/modules/staff/commands/shared.js +28 -1
  19. package/dist/modules/staff/commands/shared.js.map +2 -2
  20. package/dist/modules/staff/commands/tag-assignments.js +20 -3
  21. package/dist/modules/staff/commands/tag-assignments.js.map +2 -2
  22. package/dist/modules/staff/commands/team-members.js +21 -11
  23. package/dist/modules/staff/commands/team-members.js.map +2 -2
  24. package/dist/modules/staff/commands/team-roles.js +21 -11
  25. package/dist/modules/staff/commands/team-roles.js.map +2 -2
  26. package/dist/modules/staff/commands/teams.js +21 -11
  27. package/dist/modules/staff/commands/teams.js.map +2 -2
  28. package/dist/modules/staff/commands/timesheets-entries.js +24 -14
  29. package/dist/modules/staff/commands/timesheets-entries.js.map +2 -2
  30. package/dist/modules/staff/commands/timesheets-projects.js +34 -18
  31. package/dist/modules/staff/commands/timesheets-projects.js.map +2 -2
  32. package/dist/modules/workflows/api/instances/route.js +1 -1
  33. package/dist/modules/workflows/api/instances/route.js.map +2 -2
  34. package/package.json +7 -7
  35. package/src/helpers/integration/auth.ts +178 -86
  36. package/src/modules/sales/api/document-addresses/route.ts +140 -7
  37. package/src/modules/sales/commands/documentAddresses.ts +8 -0
  38. package/src/modules/staff/commands/activities.ts +23 -11
  39. package/src/modules/staff/commands/addresses.ts +20 -11
  40. package/src/modules/staff/commands/comments.ts +18 -10
  41. package/src/modules/staff/commands/job-histories.ts +27 -11
  42. package/src/modules/staff/commands/leave-requests.ts +38 -19
  43. package/src/modules/staff/commands/shared.ts +38 -0
  44. package/src/modules/staff/commands/tag-assignments.ts +19 -2
  45. package/src/modules/staff/commands/team-members.ts +21 -10
  46. package/src/modules/staff/commands/team-roles.ts +21 -10
  47. package/src/modules/staff/commands/teams.ts +21 -10
  48. package/src/modules/staff/commands/timesheets-entries.ts +24 -13
  49. package/src/modules/staff/commands/timesheets-projects.ts +34 -17
  50. package/src/modules/workflows/api/instances/route.ts +2 -2
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/staff/commands/team-roles.ts"],
4
- "sourcesContent": ["import type { CommandHandler } from '@open-mercato/shared/lib/commands'\nimport { registerCommand } from '@open-mercato/shared/lib/commands'\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport { CrudHttpError } from '@open-mercato/shared/lib/crud/errors'\nimport { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'\nimport { findOneWithDecryption } from '@open-mercato/shared/lib/encryption/find'\nimport { buildChanges, emitCrudSideEffects, emitCrudUndoSideEffects, parseWithCustomFields, setCustomFieldsIfAny } from '@open-mercato/shared/lib/commands/helpers'\nimport { buildCustomFieldResetMap, diffCustomFieldChanges, loadCustomFieldSnapshot, type CustomFieldSnapshot } from '@open-mercato/shared/lib/commands/customFieldSnapshots'\nimport { makeCreateRedo } from '@open-mercato/shared/lib/commands/redo'\nimport type { DataEngine } from '@open-mercato/shared/lib/data/engine'\nimport type { CrudIndexerConfig } from '@open-mercato/shared/lib/crud/types'\nimport { StaffTeam, StaffTeamMember, StaffTeamRole } from '../data/entities'\nimport {\n staffTeamRoleCreateSchema,\n staffTeamRoleUpdateSchema,\n type StaffTeamRoleCreateInput,\n type StaffTeamRoleUpdateInput,\n} from '../data/validators'\nimport { staffTeamRoleCrudEvents } from '../lib/crud'\nimport {\n applyScopeToWhere,\n commandActorScope,\n commandInputScope,\n ensureOrganizationScope,\n ensureTenantScope,\n extractUndoPayload,\n scopeForDecryption,\n} from './shared'\nimport { E } from '#generated/entities.ids.generated'\n\nconst teamRoleCrudIndexer: CrudIndexerConfig<StaffTeamRole> = {\n entityType: E.staff.staff_team_role,\n}\n\ntype TeamRoleSnapshot = {\n id: string\n tenantId: string\n organizationId: string\n teamId: string | null\n name: string\n description: string | null\n appearanceIcon: string | null\n appearanceColor: string | null\n deletedAt: string | null\n}\n\ntype TeamRoleUndoPayload = {\n before?: TeamRoleSnapshot | null\n after?: TeamRoleSnapshot | null\n customBefore?: CustomFieldSnapshot | null\n customAfter?: CustomFieldSnapshot | null\n}\n\nasync function loadTeamRoleSnapshot(em: EntityManager, id: string): Promise<TeamRoleSnapshot | null> {\n const role = await findOneWithDecryption(em, StaffTeamRole, { id }, undefined, { tenantId: null, organizationId: null })\n if (!role) return null\n return {\n id: role.id,\n tenantId: role.tenantId,\n organizationId: role.organizationId,\n teamId: role.teamId ?? null,\n name: role.name,\n description: role.description ?? null,\n appearanceIcon: role.appearanceIcon ?? null,\n appearanceColor: role.appearanceColor ?? null,\n deletedAt: role.deletedAt ? role.deletedAt.toISOString() : null,\n }\n}\n\nasync function loadTeamRoleCustomSnapshot(\n em: EntityManager,\n snapshot: TeamRoleSnapshot,\n): Promise<CustomFieldSnapshot> {\n return loadCustomFieldSnapshot(em, {\n entityId: E.staff.staff_team_role,\n recordId: snapshot.id,\n tenantId: snapshot.tenantId,\n organizationId: snapshot.organizationId,\n })\n}\n\nconst redoTeamRoleCreate = makeCreateRedo<StaffTeamRole, TeamRoleSnapshot, StaffTeamRoleCreateInput, { roleId: string }>({\n entityClass: StaffTeamRole,\n buildResult: (entity) => ({ roleId: entity.id }),\n events: staffTeamRoleCrudEvents,\n indexer: teamRoleCrudIndexer,\n})\n\nasync function ensureTeamExists(\n em: EntityManager,\n teamId: string,\n tenantId: string,\n organizationId: string,\n): Promise<void> {\n const team = await findOneWithDecryption(\n em,\n StaffTeam,\n { id: teamId, tenantId, organizationId, deletedAt: null },\n undefined,\n { tenantId, organizationId },\n )\n if (!team) throw new CrudHttpError(400, { error: 'Team not found.' })\n}\n\nconst createTeamRoleCommand: CommandHandler<StaffTeamRoleCreateInput, { roleId: string }> = {\n id: 'staff.team-roles.create',\n async execute(rawInput, ctx) {\n const { parsed, custom } = parseWithCustomFields(staffTeamRoleCreateSchema, rawInput)\n ensureTenantScope(ctx, parsed.tenantId)\n ensureOrganizationScope(ctx, parsed.organizationId)\n commandInputScope(ctx, parsed.tenantId, parsed.organizationId)\n\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n if (parsed.teamId) {\n await ensureTeamExists(em, parsed.teamId, parsed.tenantId, parsed.organizationId)\n }\n const now = new Date()\n const role = em.create(StaffTeamRole, {\n tenantId: parsed.tenantId,\n organizationId: parsed.organizationId,\n teamId: parsed.teamId ?? null,\n name: parsed.name,\n description: parsed.description ?? null,\n appearanceIcon: parsed.appearanceIcon ?? null,\n appearanceColor: parsed.appearanceColor ?? null,\n createdAt: now,\n updatedAt: now,\n deletedAt: null,\n })\n em.persist(role)\n await em.flush()\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await setCustomFieldsIfAny({\n dataEngine: de,\n entityId: E.staff.staff_team_role,\n recordId: role.id,\n tenantId: role.tenantId,\n organizationId: role.organizationId,\n values: custom,\n })\n\n await emitCrudSideEffects({\n dataEngine: de,\n action: 'created',\n entity: role,\n identifiers: {\n id: role.id,\n organizationId: role.organizationId,\n tenantId: role.tenantId,\n },\n events: staffTeamRoleCrudEvents,\n indexer: teamRoleCrudIndexer,\n })\n\n return { roleId: role.id }\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const snapshot = await loadTeamRoleSnapshot(em, result.roleId)\n if (!snapshot) return null\n const custom = await loadTeamRoleCustomSnapshot(em, snapshot)\n return { snapshot, custom }\n },\n buildLog: async ({ result, ctx }) => {\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const snapshot = await loadTeamRoleSnapshot(em, result.roleId)\n if (!snapshot) return null\n const custom = await loadTeamRoleCustomSnapshot(em, snapshot)\n const { translate } = await resolveTranslations()\n return {\n actionLabel: translate('staff.audit.teamRoles.create', 'Create team role'),\n resourceKind: 'staff.teamRole',\n resourceId: snapshot.id,\n tenantId: snapshot.tenantId,\n organizationId: snapshot.organizationId,\n snapshotAfter: snapshot,\n payload: {\n undo: {\n after: snapshot,\n customAfter: custom,\n } satisfies TeamRoleUndoPayload,\n },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<TeamRoleUndoPayload>(logEntry)\n const after = payload?.after\n if (!after) return\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const role = await em.findOne(StaffTeamRole, { id: after.id })\n if (role) {\n role.deletedAt = new Date()\n await em.flush()\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await emitCrudUndoSideEffects({\n dataEngine: de,\n action: 'deleted',\n entity: role,\n identifiers: {\n id: role.id,\n organizationId: role.organizationId,\n tenantId: role.tenantId,\n },\n events: staffTeamRoleCrudEvents,\n indexer: teamRoleCrudIndexer,\n })\n }\n },\n redo: async ({ logEntry, ctx }) => {\n const result = await redoTeamRoleCreate({ input: undefined as unknown as StaffTeamRoleCreateInput, ctx, logEntry })\n const payload = extractUndoPayload<TeamRoleUndoPayload>(logEntry)\n const customAfter = payload?.customAfter\n if (customAfter && Object.keys(customAfter).length) {\n await setCustomFieldsIfAny({\n dataEngine: ctx.container.resolve('dataEngine') as DataEngine,\n entityId: E.staff.staff_team_role,\n recordId: result.roleId,\n tenantId: payload?.after?.tenantId ?? '',\n organizationId: payload?.after?.organizationId ?? '',\n values: customAfter,\n })\n }\n return result\n },\n}\n\nconst updateTeamRoleCommand: CommandHandler<StaffTeamRoleUpdateInput, { roleId: string }> = {\n id: 'staff.team-roles.update',\n async prepare(rawInput, ctx) {\n const { parsed } = parseWithCustomFields(staffTeamRoleUpdateSchema, rawInput)\n const em = (ctx.container.resolve('em') as EntityManager)\n const snapshot = await loadTeamRoleSnapshot(em, parsed.id)\n if (!snapshot) return {}\n const custom = await loadTeamRoleCustomSnapshot(em, snapshot)\n return { before: snapshot, customBefore: custom }\n },\n async execute(rawInput, ctx) {\n const { parsed, custom } = parseWithCustomFields(staffTeamRoleUpdateSchema, rawInput)\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const scope = commandActorScope(ctx)\n const role = await findOneWithDecryption(\n em,\n StaffTeamRole,\n applyScopeToWhere<StaffTeamRole>({ id: parsed.id, deletedAt: null }, scope),\n undefined,\n scopeForDecryption(scope),\n )\n if (!role) throw new CrudHttpError(404, { error: 'Team role not found.' })\n ensureTenantScope(ctx, role.tenantId)\n ensureOrganizationScope(ctx, role.organizationId)\n\n if (parsed.teamId !== undefined) {\n if (parsed.teamId) {\n await ensureTeamExists(em, parsed.teamId, role.tenantId, role.organizationId)\n }\n role.teamId = parsed.teamId ?? null\n }\n if (parsed.name !== undefined) role.name = parsed.name\n if (parsed.description !== undefined) role.description = parsed.description ?? null\n if (parsed.appearanceIcon !== undefined) role.appearanceIcon = parsed.appearanceIcon ?? null\n if (parsed.appearanceColor !== undefined) role.appearanceColor = parsed.appearanceColor ?? null\n role.updatedAt = new Date()\n await em.flush()\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await setCustomFieldsIfAny({\n dataEngine: de,\n entityId: E.staff.staff_team_role,\n recordId: role.id,\n tenantId: role.tenantId,\n organizationId: role.organizationId,\n values: custom,\n })\n\n await emitCrudSideEffects({\n dataEngine: de,\n action: 'updated',\n entity: role,\n identifiers: {\n id: role.id,\n organizationId: role.organizationId,\n tenantId: role.tenantId,\n },\n events: staffTeamRoleCrudEvents,\n indexer: teamRoleCrudIndexer,\n })\n\n return { roleId: role.id }\n },\n buildLog: async ({ snapshots, ctx }) => {\n const before = snapshots.before as TeamRoleSnapshot | undefined\n if (!before) return null\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const after = await loadTeamRoleSnapshot(em, before.id)\n if (!after) return null\n const customBefore = (snapshots as { customBefore?: CustomFieldSnapshot | null }).customBefore ?? undefined\n const customAfter = await loadTeamRoleCustomSnapshot(em, after)\n const changes = buildChanges(before as unknown as Record<string, unknown>, after as unknown as Record<string, unknown>, [\n 'teamId',\n 'name',\n 'description',\n 'appearanceIcon',\n 'appearanceColor',\n 'deletedAt',\n ])\n const customChanges = diffCustomFieldChanges(customBefore, customAfter)\n if (Object.keys(customChanges).length) {\n changes.customFields = { from: customBefore ?? null, to: customAfter ?? null }\n }\n const { translate } = await resolveTranslations()\n return {\n actionLabel: translate('staff.audit.teamRoles.update', 'Update team role'),\n resourceKind: 'staff.teamRole',\n resourceId: before.id,\n tenantId: before.tenantId,\n organizationId: before.organizationId,\n snapshotBefore: before,\n snapshotAfter: after,\n changes,\n payload: {\n undo: {\n before,\n after,\n customBefore: customBefore ?? null,\n customAfter,\n } satisfies TeamRoleUndoPayload,\n },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<TeamRoleUndoPayload>(logEntry)\n const before = payload?.before\n if (!before) return\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const role = await em.findOne(StaffTeamRole, { id: before.id })\n if (!role) return\n role.teamId = before.teamId ?? null\n role.name = before.name\n role.description = before.description ?? null\n role.appearanceIcon = before.appearanceIcon ?? null\n role.appearanceColor = before.appearanceColor ?? null\n role.deletedAt = before.deletedAt ? new Date(before.deletedAt) : null\n role.updatedAt = new Date()\n await em.flush()\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n if (payload.customBefore || payload.customAfter) {\n const reset = buildCustomFieldResetMap(payload.customBefore ?? undefined, payload.customAfter ?? undefined)\n await setCustomFieldsIfAny({\n dataEngine: de,\n entityId: E.staff.staff_team_role,\n recordId: role.id,\n tenantId: role.tenantId,\n organizationId: role.organizationId,\n values: reset,\n })\n }\n\n await emitCrudUndoSideEffects({\n dataEngine: de,\n action: 'updated',\n entity: role,\n identifiers: {\n id: role.id,\n organizationId: role.organizationId,\n tenantId: role.tenantId,\n },\n events: staffTeamRoleCrudEvents,\n indexer: teamRoleCrudIndexer,\n })\n },\n}\n\nconst deleteTeamRoleCommand: CommandHandler<{ id?: string }, { roleId: string }> = {\n id: 'staff.team-roles.delete',\n async prepare(input, ctx) {\n const id = input?.id\n if (!id) throw new CrudHttpError(400, { error: 'Role id is required.' })\n const em = (ctx.container.resolve('em') as EntityManager)\n const snapshot = await loadTeamRoleSnapshot(em, id)\n if (!snapshot) return {}\n const custom = await loadTeamRoleCustomSnapshot(em, snapshot)\n return { before: snapshot, customBefore: custom }\n },\n async execute(input, ctx) {\n const id = input?.id\n if (!id) throw new CrudHttpError(400, { error: 'Role id is required.' })\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const scope = commandActorScope(ctx)\n const role = await findOneWithDecryption(\n em,\n StaffTeamRole,\n applyScopeToWhere<StaffTeamRole>({ id, deletedAt: null }, scope),\n undefined,\n scopeForDecryption(scope),\n )\n if (!role) throw new CrudHttpError(404, { error: 'Team role not found.' })\n ensureTenantScope(ctx, role.tenantId)\n ensureOrganizationScope(ctx, role.organizationId)\n const assignedMember = await findOneWithDecryption(\n em,\n StaffTeamMember,\n {\n tenantId: role.tenantId,\n organizationId: role.organizationId,\n deletedAt: null,\n roleIds: { $contains: [role.id] },\n },\n undefined,\n { tenantId: role.tenantId, organizationId: role.organizationId },\n )\n if (assignedMember) {\n const { translate } = await resolveTranslations()\n throw new CrudHttpError(409, {\n error: translate(\n 'staff.teamRoles.errors.assignedMembers',\n 'Team role has assigned team members. Remove them before deleting.',\n ),\n })\n }\n role.deletedAt = new Date()\n role.updatedAt = new Date()\n await em.flush()\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await emitCrudSideEffects({\n dataEngine: de,\n action: 'deleted',\n entity: role,\n identifiers: {\n id: role.id,\n organizationId: role.organizationId,\n tenantId: role.tenantId,\n },\n events: staffTeamRoleCrudEvents,\n indexer: teamRoleCrudIndexer,\n })\n return { roleId: role.id }\n },\n buildLog: async ({ snapshots }) => {\n const before = snapshots.before as TeamRoleSnapshot | undefined\n if (!before) return null\n const customBefore = (snapshots as { customBefore?: CustomFieldSnapshot | null }).customBefore ?? undefined\n const { translate } = await resolveTranslations()\n return {\n actionLabel: translate('staff.audit.teamRoles.delete', 'Delete team role'),\n resourceKind: 'staff.teamRole',\n resourceId: before.id,\n tenantId: before.tenantId,\n organizationId: before.organizationId,\n snapshotBefore: before,\n payload: {\n undo: {\n before,\n customBefore: customBefore ?? null,\n } satisfies TeamRoleUndoPayload,\n },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<TeamRoleUndoPayload>(logEntry)\n const before = payload?.before\n if (!before) return\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n let role = await em.findOne(StaffTeamRole, { id: before.id })\n if (!role) {\n role = em.create(StaffTeamRole, {\n id: before.id,\n tenantId: before.tenantId,\n organizationId: before.organizationId,\n teamId: before.teamId ?? null,\n name: before.name,\n description: before.description ?? null,\n appearanceIcon: before.appearanceIcon ?? null,\n appearanceColor: before.appearanceColor ?? null,\n deletedAt: null,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n em.persist(role)\n } else {\n role.teamId = before.teamId ?? null\n role.name = before.name\n role.description = before.description ?? null\n role.appearanceIcon = before.appearanceIcon ?? null\n role.appearanceColor = before.appearanceColor ?? null\n role.deletedAt = null\n role.updatedAt = new Date()\n }\n await em.flush()\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n if (payload.customBefore) {\n const reset = buildCustomFieldResetMap(payload.customBefore, undefined)\n await setCustomFieldsIfAny({\n dataEngine: de,\n entityId: E.staff.staff_team_role,\n recordId: role.id,\n tenantId: role.tenantId,\n organizationId: role.organizationId,\n values: reset,\n })\n }\n\n await emitCrudUndoSideEffects({\n dataEngine: de,\n action: 'created',\n entity: role,\n identifiers: {\n id: role.id,\n organizationId: role.organizationId,\n tenantId: role.tenantId,\n },\n events: staffTeamRoleCrudEvents,\n indexer: teamRoleCrudIndexer,\n })\n },\n}\n\nregisterCommand(createTeamRoleCommand)\nregisterCommand(updateTeamRoleCommand)\nregisterCommand(deleteTeamRoleCommand)\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { CommandHandler } from '@open-mercato/shared/lib/commands'\nimport { registerCommand } from '@open-mercato/shared/lib/commands'\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport { CrudHttpError } from '@open-mercato/shared/lib/crud/errors'\nimport { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'\nimport { findOneWithDecryption } from '@open-mercato/shared/lib/encryption/find'\nimport { buildChanges, emitCrudSideEffects, emitCrudUndoSideEffects, parseWithCustomFields, setCustomFieldsIfAny } from '@open-mercato/shared/lib/commands/helpers'\nimport { buildCustomFieldResetMap, diffCustomFieldChanges, loadCustomFieldSnapshot, type CustomFieldSnapshot } from '@open-mercato/shared/lib/commands/customFieldSnapshots'\nimport { makeCreateRedo } from '@open-mercato/shared/lib/commands/redo'\nimport type { DataEngine } from '@open-mercato/shared/lib/data/engine'\nimport type { CrudIndexerConfig } from '@open-mercato/shared/lib/crud/types'\nimport { StaffTeam, StaffTeamMember, StaffTeamRole } from '../data/entities'\nimport {\n staffTeamRoleCreateSchema,\n staffTeamRoleUpdateSchema,\n type StaffTeamRoleCreateInput,\n type StaffTeamRoleUpdateInput,\n} from '../data/validators'\nimport { staffTeamRoleCrudEvents } from '../lib/crud'\nimport {\n applyScopeToWhere,\n commandActorScope,\n commandInputScope,\n ensureOrganizationScope,\n ensureTenantScope,\n extractUndoPayload,\n scopeForDecryption,\n scopedStaffSnapshotWhere,\n staffSnapshotDecryptionScope,\n staffSnapshotScopeFromContext,\n staffSnapshotScopeFromSnapshot,\n type StaffSnapshotScope,\n} from './shared'\nimport { E } from '#generated/entities.ids.generated'\n\nconst teamRoleCrudIndexer: CrudIndexerConfig<StaffTeamRole> = {\n entityType: E.staff.staff_team_role,\n}\n\ntype TeamRoleSnapshot = {\n id: string\n tenantId: string\n organizationId: string\n teamId: string | null\n name: string\n description: string | null\n appearanceIcon: string | null\n appearanceColor: string | null\n deletedAt: string | null\n}\n\ntype TeamRoleUndoPayload = {\n before?: TeamRoleSnapshot | null\n after?: TeamRoleSnapshot | null\n customBefore?: CustomFieldSnapshot | null\n customAfter?: CustomFieldSnapshot | null\n}\n\nasync function loadTeamRoleSnapshot(em: EntityManager, id: string, scope?: StaffSnapshotScope | null): Promise<TeamRoleSnapshot | null> {\n const role = await findOneWithDecryption(\n em,\n StaffTeamRole,\n scopedStaffSnapshotWhere(id, scope),\n undefined,\n staffSnapshotDecryptionScope(scope),\n )\n if (!role) return null\n return {\n id: role.id,\n tenantId: role.tenantId,\n organizationId: role.organizationId,\n teamId: role.teamId ?? null,\n name: role.name,\n description: role.description ?? null,\n appearanceIcon: role.appearanceIcon ?? null,\n appearanceColor: role.appearanceColor ?? null,\n deletedAt: role.deletedAt ? role.deletedAt.toISOString() : null,\n }\n}\n\nasync function loadTeamRoleCustomSnapshot(\n em: EntityManager,\n snapshot: TeamRoleSnapshot,\n): Promise<CustomFieldSnapshot> {\n return loadCustomFieldSnapshot(em, {\n entityId: E.staff.staff_team_role,\n recordId: snapshot.id,\n tenantId: snapshot.tenantId,\n organizationId: snapshot.organizationId,\n })\n}\n\nconst redoTeamRoleCreate = makeCreateRedo<StaffTeamRole, TeamRoleSnapshot, StaffTeamRoleCreateInput, { roleId: string }>({\n entityClass: StaffTeamRole,\n buildResult: (entity) => ({ roleId: entity.id }),\n events: staffTeamRoleCrudEvents,\n indexer: teamRoleCrudIndexer,\n})\n\nasync function ensureTeamExists(\n em: EntityManager,\n teamId: string,\n tenantId: string,\n organizationId: string,\n): Promise<void> {\n const team = await findOneWithDecryption(\n em,\n StaffTeam,\n { id: teamId, tenantId, organizationId, deletedAt: null },\n undefined,\n { tenantId, organizationId },\n )\n if (!team) throw new CrudHttpError(400, { error: 'Team not found.' })\n}\n\nconst createTeamRoleCommand: CommandHandler<StaffTeamRoleCreateInput, { roleId: string }> = {\n id: 'staff.team-roles.create',\n async execute(rawInput, ctx) {\n const { parsed, custom } = parseWithCustomFields(staffTeamRoleCreateSchema, rawInput)\n ensureTenantScope(ctx, parsed.tenantId)\n ensureOrganizationScope(ctx, parsed.organizationId)\n commandInputScope(ctx, parsed.tenantId, parsed.organizationId)\n\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n if (parsed.teamId) {\n await ensureTeamExists(em, parsed.teamId, parsed.tenantId, parsed.organizationId)\n }\n const now = new Date()\n const role = em.create(StaffTeamRole, {\n tenantId: parsed.tenantId,\n organizationId: parsed.organizationId,\n teamId: parsed.teamId ?? null,\n name: parsed.name,\n description: parsed.description ?? null,\n appearanceIcon: parsed.appearanceIcon ?? null,\n appearanceColor: parsed.appearanceColor ?? null,\n createdAt: now,\n updatedAt: now,\n deletedAt: null,\n })\n em.persist(role)\n await em.flush()\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await setCustomFieldsIfAny({\n dataEngine: de,\n entityId: E.staff.staff_team_role,\n recordId: role.id,\n tenantId: role.tenantId,\n organizationId: role.organizationId,\n values: custom,\n })\n\n await emitCrudSideEffects({\n dataEngine: de,\n action: 'created',\n entity: role,\n identifiers: {\n id: role.id,\n organizationId: role.organizationId,\n tenantId: role.tenantId,\n },\n events: staffTeamRoleCrudEvents,\n indexer: teamRoleCrudIndexer,\n })\n\n return { roleId: role.id }\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const snapshot = await loadTeamRoleSnapshot(em, result.roleId, staffSnapshotScopeFromContext(ctx))\n if (!snapshot) return null\n const custom = await loadTeamRoleCustomSnapshot(em, snapshot)\n return { snapshot, custom }\n },\n buildLog: async ({ result, ctx }) => {\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const snapshot = await loadTeamRoleSnapshot(em, result.roleId, staffSnapshotScopeFromContext(ctx))\n if (!snapshot) return null\n const custom = await loadTeamRoleCustomSnapshot(em, snapshot)\n const { translate } = await resolveTranslations()\n return {\n actionLabel: translate('staff.audit.teamRoles.create', 'Create team role'),\n resourceKind: 'staff.teamRole',\n resourceId: snapshot.id,\n tenantId: snapshot.tenantId,\n organizationId: snapshot.organizationId,\n snapshotAfter: snapshot,\n payload: {\n undo: {\n after: snapshot,\n customAfter: custom,\n } satisfies TeamRoleUndoPayload,\n },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<TeamRoleUndoPayload>(logEntry)\n const after = payload?.after\n if (!after) return\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const role = await em.findOne(StaffTeamRole, scopedStaffSnapshotWhere(after.id, staffSnapshotScopeFromSnapshot(after)))\n if (role) {\n role.deletedAt = new Date()\n await em.flush()\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await emitCrudUndoSideEffects({\n dataEngine: de,\n action: 'deleted',\n entity: role,\n identifiers: {\n id: role.id,\n organizationId: role.organizationId,\n tenantId: role.tenantId,\n },\n events: staffTeamRoleCrudEvents,\n indexer: teamRoleCrudIndexer,\n })\n }\n },\n redo: async ({ logEntry, ctx }) => {\n const result = await redoTeamRoleCreate({ input: undefined as unknown as StaffTeamRoleCreateInput, ctx, logEntry })\n const payload = extractUndoPayload<TeamRoleUndoPayload>(logEntry)\n const customAfter = payload?.customAfter\n if (customAfter && Object.keys(customAfter).length) {\n await setCustomFieldsIfAny({\n dataEngine: ctx.container.resolve('dataEngine') as DataEngine,\n entityId: E.staff.staff_team_role,\n recordId: result.roleId,\n tenantId: payload?.after?.tenantId ?? '',\n organizationId: payload?.after?.organizationId ?? '',\n values: customAfter,\n })\n }\n return result\n },\n}\n\nconst updateTeamRoleCommand: CommandHandler<StaffTeamRoleUpdateInput, { roleId: string }> = {\n id: 'staff.team-roles.update',\n async prepare(rawInput, ctx) {\n const { parsed } = parseWithCustomFields(staffTeamRoleUpdateSchema, rawInput)\n const em = (ctx.container.resolve('em') as EntityManager)\n const snapshot = await loadTeamRoleSnapshot(em, parsed.id, staffSnapshotScopeFromContext(ctx))\n if (!snapshot) return {}\n const custom = await loadTeamRoleCustomSnapshot(em, snapshot)\n return { before: snapshot, customBefore: custom }\n },\n async execute(rawInput, ctx) {\n const { parsed, custom } = parseWithCustomFields(staffTeamRoleUpdateSchema, rawInput)\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const scope = commandActorScope(ctx)\n const role = await findOneWithDecryption(\n em,\n StaffTeamRole,\n applyScopeToWhere<StaffTeamRole>({ id: parsed.id, deletedAt: null }, scope),\n undefined,\n scopeForDecryption(scope),\n )\n if (!role) throw new CrudHttpError(404, { error: 'Team role not found.' })\n ensureTenantScope(ctx, role.tenantId)\n ensureOrganizationScope(ctx, role.organizationId)\n\n if (parsed.teamId !== undefined) {\n if (parsed.teamId) {\n await ensureTeamExists(em, parsed.teamId, role.tenantId, role.organizationId)\n }\n role.teamId = parsed.teamId ?? null\n }\n if (parsed.name !== undefined) role.name = parsed.name\n if (parsed.description !== undefined) role.description = parsed.description ?? null\n if (parsed.appearanceIcon !== undefined) role.appearanceIcon = parsed.appearanceIcon ?? null\n if (parsed.appearanceColor !== undefined) role.appearanceColor = parsed.appearanceColor ?? null\n role.updatedAt = new Date()\n await em.flush()\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await setCustomFieldsIfAny({\n dataEngine: de,\n entityId: E.staff.staff_team_role,\n recordId: role.id,\n tenantId: role.tenantId,\n organizationId: role.organizationId,\n values: custom,\n })\n\n await emitCrudSideEffects({\n dataEngine: de,\n action: 'updated',\n entity: role,\n identifiers: {\n id: role.id,\n organizationId: role.organizationId,\n tenantId: role.tenantId,\n },\n events: staffTeamRoleCrudEvents,\n indexer: teamRoleCrudIndexer,\n })\n\n return { roleId: role.id }\n },\n buildLog: async ({ snapshots, ctx }) => {\n const before = snapshots.before as TeamRoleSnapshot | undefined\n if (!before) return null\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const after = await loadTeamRoleSnapshot(em, before.id, staffSnapshotScopeFromSnapshot(before))\n if (!after) return null\n const customBefore = (snapshots as { customBefore?: CustomFieldSnapshot | null }).customBefore ?? undefined\n const customAfter = await loadTeamRoleCustomSnapshot(em, after)\n const changes = buildChanges(before as unknown as Record<string, unknown>, after as unknown as Record<string, unknown>, [\n 'teamId',\n 'name',\n 'description',\n 'appearanceIcon',\n 'appearanceColor',\n 'deletedAt',\n ])\n const customChanges = diffCustomFieldChanges(customBefore, customAfter)\n if (Object.keys(customChanges).length) {\n changes.customFields = { from: customBefore ?? null, to: customAfter ?? null }\n }\n const { translate } = await resolveTranslations()\n return {\n actionLabel: translate('staff.audit.teamRoles.update', 'Update team role'),\n resourceKind: 'staff.teamRole',\n resourceId: before.id,\n tenantId: before.tenantId,\n organizationId: before.organizationId,\n snapshotBefore: before,\n snapshotAfter: after,\n changes,\n payload: {\n undo: {\n before,\n after,\n customBefore: customBefore ?? null,\n customAfter,\n } satisfies TeamRoleUndoPayload,\n },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<TeamRoleUndoPayload>(logEntry)\n const before = payload?.before\n if (!before) return\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const role = await em.findOne(StaffTeamRole, scopedStaffSnapshotWhere(before.id, staffSnapshotScopeFromSnapshot(before)))\n if (!role) return\n role.teamId = before.teamId ?? null\n role.name = before.name\n role.description = before.description ?? null\n role.appearanceIcon = before.appearanceIcon ?? null\n role.appearanceColor = before.appearanceColor ?? null\n role.deletedAt = before.deletedAt ? new Date(before.deletedAt) : null\n role.updatedAt = new Date()\n await em.flush()\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n if (payload.customBefore || payload.customAfter) {\n const reset = buildCustomFieldResetMap(payload.customBefore ?? undefined, payload.customAfter ?? undefined)\n await setCustomFieldsIfAny({\n dataEngine: de,\n entityId: E.staff.staff_team_role,\n recordId: role.id,\n tenantId: role.tenantId,\n organizationId: role.organizationId,\n values: reset,\n })\n }\n\n await emitCrudUndoSideEffects({\n dataEngine: de,\n action: 'updated',\n entity: role,\n identifiers: {\n id: role.id,\n organizationId: role.organizationId,\n tenantId: role.tenantId,\n },\n events: staffTeamRoleCrudEvents,\n indexer: teamRoleCrudIndexer,\n })\n },\n}\n\nconst deleteTeamRoleCommand: CommandHandler<{ id?: string }, { roleId: string }> = {\n id: 'staff.team-roles.delete',\n async prepare(input, ctx) {\n const id = input?.id\n if (!id) throw new CrudHttpError(400, { error: 'Role id is required.' })\n const em = (ctx.container.resolve('em') as EntityManager)\n const snapshot = await loadTeamRoleSnapshot(em, id, staffSnapshotScopeFromContext(ctx))\n if (!snapshot) return {}\n const custom = await loadTeamRoleCustomSnapshot(em, snapshot)\n return { before: snapshot, customBefore: custom }\n },\n async execute(input, ctx) {\n const id = input?.id\n if (!id) throw new CrudHttpError(400, { error: 'Role id is required.' })\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const scope = commandActorScope(ctx)\n const role = await findOneWithDecryption(\n em,\n StaffTeamRole,\n applyScopeToWhere<StaffTeamRole>({ id, deletedAt: null }, scope),\n undefined,\n scopeForDecryption(scope),\n )\n if (!role) throw new CrudHttpError(404, { error: 'Team role not found.' })\n ensureTenantScope(ctx, role.tenantId)\n ensureOrganizationScope(ctx, role.organizationId)\n const assignedMember = await findOneWithDecryption(\n em,\n StaffTeamMember,\n {\n tenantId: role.tenantId,\n organizationId: role.organizationId,\n deletedAt: null,\n roleIds: { $contains: [role.id] },\n },\n undefined,\n { tenantId: role.tenantId, organizationId: role.organizationId },\n )\n if (assignedMember) {\n const { translate } = await resolveTranslations()\n throw new CrudHttpError(409, {\n error: translate(\n 'staff.teamRoles.errors.assignedMembers',\n 'Team role has assigned team members. Remove them before deleting.',\n ),\n })\n }\n role.deletedAt = new Date()\n role.updatedAt = new Date()\n await em.flush()\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await emitCrudSideEffects({\n dataEngine: de,\n action: 'deleted',\n entity: role,\n identifiers: {\n id: role.id,\n organizationId: role.organizationId,\n tenantId: role.tenantId,\n },\n events: staffTeamRoleCrudEvents,\n indexer: teamRoleCrudIndexer,\n })\n return { roleId: role.id }\n },\n buildLog: async ({ snapshots }) => {\n const before = snapshots.before as TeamRoleSnapshot | undefined\n if (!before) return null\n const customBefore = (snapshots as { customBefore?: CustomFieldSnapshot | null }).customBefore ?? undefined\n const { translate } = await resolveTranslations()\n return {\n actionLabel: translate('staff.audit.teamRoles.delete', 'Delete team role'),\n resourceKind: 'staff.teamRole',\n resourceId: before.id,\n tenantId: before.tenantId,\n organizationId: before.organizationId,\n snapshotBefore: before,\n payload: {\n undo: {\n before,\n customBefore: customBefore ?? null,\n } satisfies TeamRoleUndoPayload,\n },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<TeamRoleUndoPayload>(logEntry)\n const before = payload?.before\n if (!before) return\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n let role = await em.findOne(StaffTeamRole, scopedStaffSnapshotWhere(before.id, staffSnapshotScopeFromSnapshot(before)))\n if (!role) {\n role = em.create(StaffTeamRole, {\n id: before.id,\n tenantId: before.tenantId,\n organizationId: before.organizationId,\n teamId: before.teamId ?? null,\n name: before.name,\n description: before.description ?? null,\n appearanceIcon: before.appearanceIcon ?? null,\n appearanceColor: before.appearanceColor ?? null,\n deletedAt: null,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n em.persist(role)\n } else {\n role.teamId = before.teamId ?? null\n role.name = before.name\n role.description = before.description ?? null\n role.appearanceIcon = before.appearanceIcon ?? null\n role.appearanceColor = before.appearanceColor ?? null\n role.deletedAt = null\n role.updatedAt = new Date()\n }\n await em.flush()\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n if (payload.customBefore) {\n const reset = buildCustomFieldResetMap(payload.customBefore, undefined)\n await setCustomFieldsIfAny({\n dataEngine: de,\n entityId: E.staff.staff_team_role,\n recordId: role.id,\n tenantId: role.tenantId,\n organizationId: role.organizationId,\n values: reset,\n })\n }\n\n await emitCrudUndoSideEffects({\n dataEngine: de,\n action: 'created',\n entity: role,\n identifiers: {\n id: role.id,\n organizationId: role.organizationId,\n tenantId: role.tenantId,\n },\n events: staffTeamRoleCrudEvents,\n indexer: teamRoleCrudIndexer,\n })\n },\n}\n\nregisterCommand(createTeamRoleCommand)\nregisterCommand(updateTeamRoleCommand)\nregisterCommand(deleteTeamRoleCommand)\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -18,14 +18,24 @@ import {
18
18
  ensureOrganizationScope,
19
19
  ensureTenantScope,
20
20
  extractUndoPayload,
21
- scopeForDecryption
21
+ scopeForDecryption,
22
+ scopedStaffSnapshotWhere,
23
+ staffSnapshotDecryptionScope,
24
+ staffSnapshotScopeFromContext,
25
+ staffSnapshotScopeFromSnapshot
22
26
  } from "./shared.js";
23
27
  import { E } from "../../../generated/entities.ids.generated.js";
24
28
  const teamCrudIndexer = {
25
29
  entityType: E.staff.staff_team
26
30
  };
27
- async function loadTeamSnapshot(em, id) {
28
- const team = await findOneWithDecryption(em, StaffTeam, { id }, void 0, { tenantId: null, organizationId: null });
31
+ async function loadTeamSnapshot(em, id, scope) {
32
+ const team = await findOneWithDecryption(
33
+ em,
34
+ StaffTeam,
35
+ scopedStaffSnapshotWhere(id, scope),
36
+ void 0,
37
+ staffSnapshotDecryptionScope(scope)
38
+ );
29
39
  if (!team) return null;
30
40
  return {
31
41
  id: team.id,
@@ -97,14 +107,14 @@ const createTeamCommand = {
97
107
  },
98
108
  captureAfter: async (_input, result, ctx) => {
99
109
  const em = ctx.container.resolve("em").fork();
100
- const snapshot = await loadTeamSnapshot(em, result.teamId);
110
+ const snapshot = await loadTeamSnapshot(em, result.teamId, staffSnapshotScopeFromContext(ctx));
101
111
  if (!snapshot) return null;
102
112
  const custom = await loadTeamCustomSnapshot(em, snapshot);
103
113
  return { snapshot, custom };
104
114
  },
105
115
  buildLog: async ({ result, ctx }) => {
106
116
  const em = ctx.container.resolve("em").fork();
107
- const snapshot = await loadTeamSnapshot(em, result.teamId);
117
+ const snapshot = await loadTeamSnapshot(em, result.teamId, staffSnapshotScopeFromContext(ctx));
108
118
  if (!snapshot) return null;
109
119
  const custom = await loadTeamCustomSnapshot(em, snapshot);
110
120
  const { translate } = await resolveTranslations();
@@ -128,7 +138,7 @@ const createTeamCommand = {
128
138
  const after = payload?.after;
129
139
  if (!after) return;
130
140
  const em = ctx.container.resolve("em").fork();
131
- const team = await em.findOne(StaffTeam, { id: after.id });
141
+ const team = await em.findOne(StaffTeam, scopedStaffSnapshotWhere(after.id, staffSnapshotScopeFromSnapshot(after)));
132
142
  if (team) {
133
143
  team.deletedAt = /* @__PURE__ */ new Date();
134
144
  await em.flush();
@@ -169,7 +179,7 @@ const updateTeamCommand = {
169
179
  async prepare(rawInput, ctx) {
170
180
  const { parsed } = parseWithCustomFields(staffTeamUpdateSchema, rawInput);
171
181
  const em = ctx.container.resolve("em");
172
- const snapshot = await loadTeamSnapshot(em, parsed.id);
182
+ const snapshot = await loadTeamSnapshot(em, parsed.id, staffSnapshotScopeFromContext(ctx));
173
183
  if (!snapshot) return {};
174
184
  const custom = await loadTeamCustomSnapshot(em, snapshot);
175
185
  return { before: snapshot, customBefore: custom };
@@ -220,7 +230,7 @@ const updateTeamCommand = {
220
230
  const before = snapshots.before;
221
231
  if (!before) return null;
222
232
  const em = ctx.container.resolve("em").fork();
223
- const after = await loadTeamSnapshot(em, before.id);
233
+ const after = await loadTeamSnapshot(em, before.id, staffSnapshotScopeFromSnapshot(before));
224
234
  if (!after) return null;
225
235
  const customBefore = snapshots.customBefore ?? void 0;
226
236
  const customAfter = await loadTeamCustomSnapshot(em, after);
@@ -259,7 +269,7 @@ const updateTeamCommand = {
259
269
  const before = payload?.before;
260
270
  if (!before) return;
261
271
  const em = ctx.container.resolve("em").fork();
262
- const team = await em.findOne(StaffTeam, { id: before.id });
272
+ const team = await em.findOne(StaffTeam, scopedStaffSnapshotWhere(before.id, staffSnapshotScopeFromSnapshot(before)));
263
273
  if (!team) return;
264
274
  team.name = before.name;
265
275
  team.description = before.description ?? null;
@@ -299,7 +309,7 @@ const deleteTeamCommand = {
299
309
  const id = input?.id;
300
310
  if (!id) throw new CrudHttpError(400, { error: "Team id is required." });
301
311
  const em = ctx.container.resolve("em");
302
- const snapshot = await loadTeamSnapshot(em, id);
312
+ const snapshot = await loadTeamSnapshot(em, id, staffSnapshotScopeFromContext(ctx));
303
313
  if (!snapshot) return {};
304
314
  const custom = await loadTeamCustomSnapshot(em, snapshot);
305
315
  return { before: snapshot, customBefore: custom };
@@ -374,7 +384,7 @@ const deleteTeamCommand = {
374
384
  const before = payload?.before;
375
385
  if (!before) return;
376
386
  const em = ctx.container.resolve("em").fork();
377
- let team = await em.findOne(StaffTeam, { id: before.id });
387
+ let team = await em.findOne(StaffTeam, scopedStaffSnapshotWhere(before.id, staffSnapshotScopeFromSnapshot(before)));
378
388
  if (!team) {
379
389
  team = em.create(StaffTeam, {
380
390
  id: before.id,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/staff/commands/teams.ts"],
4
- "sourcesContent": ["import type { CommandHandler } from '@open-mercato/shared/lib/commands'\nimport { registerCommand } from '@open-mercato/shared/lib/commands'\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport { CrudHttpError } from '@open-mercato/shared/lib/crud/errors'\nimport { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'\nimport { findOneWithDecryption } from '@open-mercato/shared/lib/encryption/find'\nimport { buildChanges, emitCrudSideEffects, emitCrudUndoSideEffects, parseWithCustomFields, setCustomFieldsIfAny } from '@open-mercato/shared/lib/commands/helpers'\nimport { buildCustomFieldResetMap, diffCustomFieldChanges, loadCustomFieldSnapshot, type CustomFieldSnapshot } from '@open-mercato/shared/lib/commands/customFieldSnapshots'\nimport { makeCreateRedo } from '@open-mercato/shared/lib/commands/redo'\nimport type { DataEngine } from '@open-mercato/shared/lib/data/engine'\nimport type { CrudIndexerConfig } from '@open-mercato/shared/lib/crud/types'\nimport { StaffTeam, StaffTeamMember } from '../data/entities'\nimport {\n staffTeamCreateSchema,\n staffTeamUpdateSchema,\n type StaffTeamCreateInput,\n type StaffTeamUpdateInput,\n} from '../data/validators'\nimport { staffTeamCrudEvents } from '../lib/crud'\nimport {\n applyScopeToWhere,\n commandActorScope,\n commandInputScope,\n ensureOrganizationScope,\n ensureTenantScope,\n extractUndoPayload,\n scopeForDecryption,\n} from './shared'\nimport { E } from '#generated/entities.ids.generated'\n\nconst teamCrudIndexer: CrudIndexerConfig<StaffTeam> = {\n entityType: E.staff.staff_team,\n}\n\ntype TeamSnapshot = {\n id: string\n tenantId: string\n organizationId: string\n name: string\n description: string | null\n isActive: boolean\n deletedAt: string | null\n}\n\ntype TeamUndoPayload = {\n before?: TeamSnapshot | null\n after?: TeamSnapshot | null\n customBefore?: CustomFieldSnapshot | null\n customAfter?: CustomFieldSnapshot | null\n}\n\nasync function loadTeamSnapshot(em: EntityManager, id: string): Promise<TeamSnapshot | null> {\n const team = await findOneWithDecryption(em, StaffTeam, { id }, undefined, { tenantId: null, organizationId: null })\n if (!team) return null\n return {\n id: team.id,\n tenantId: team.tenantId,\n organizationId: team.organizationId,\n name: team.name,\n description: team.description ?? null,\n isActive: team.isActive ?? true,\n deletedAt: team.deletedAt ? team.deletedAt.toISOString() : null,\n }\n}\n\nasync function loadTeamCustomSnapshot(em: EntityManager, snapshot: TeamSnapshot): Promise<CustomFieldSnapshot> {\n return loadCustomFieldSnapshot(em, {\n entityId: E.staff.staff_team,\n recordId: snapshot.id,\n tenantId: snapshot.tenantId,\n organizationId: snapshot.organizationId,\n })\n}\n\nconst redoTeamCreate = makeCreateRedo<StaffTeam, TeamSnapshot, StaffTeamCreateInput, { teamId: string }>({\n entityClass: StaffTeam,\n buildResult: (entity) => ({ teamId: entity.id }),\n events: staffTeamCrudEvents,\n indexer: teamCrudIndexer,\n})\n\nconst createTeamCommand: CommandHandler<StaffTeamCreateInput, { teamId: string }> = {\n id: 'staff.teams.create',\n async execute(rawInput, ctx) {\n const { parsed, custom } = parseWithCustomFields(staffTeamCreateSchema, rawInput)\n ensureTenantScope(ctx, parsed.tenantId)\n ensureOrganizationScope(ctx, parsed.organizationId)\n commandInputScope(ctx, parsed.tenantId, parsed.organizationId)\n\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const now = new Date()\n const team = em.create(StaffTeam, {\n tenantId: parsed.tenantId,\n organizationId: parsed.organizationId,\n name: parsed.name,\n description: parsed.description ?? null,\n isActive: parsed.isActive ?? true,\n createdAt: now,\n updatedAt: now,\n deletedAt: null,\n })\n em.persist(team)\n await em.flush()\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await setCustomFieldsIfAny({\n dataEngine: de,\n entityId: E.staff.staff_team,\n recordId: team.id,\n tenantId: team.tenantId,\n organizationId: team.organizationId,\n values: custom,\n })\n\n await emitCrudSideEffects({\n dataEngine: de,\n action: 'created',\n entity: team,\n identifiers: {\n id: team.id,\n organizationId: team.organizationId,\n tenantId: team.tenantId,\n },\n events: staffTeamCrudEvents,\n indexer: teamCrudIndexer,\n })\n\n return { teamId: team.id }\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const snapshot = await loadTeamSnapshot(em, result.teamId)\n if (!snapshot) return null\n const custom = await loadTeamCustomSnapshot(em, snapshot)\n return { snapshot, custom }\n },\n buildLog: async ({ result, ctx }) => {\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const snapshot = await loadTeamSnapshot(em, result.teamId)\n if (!snapshot) return null\n const custom = await loadTeamCustomSnapshot(em, snapshot)\n const { translate } = await resolveTranslations()\n return {\n actionLabel: translate('staff.audit.teams.create', 'Create team'),\n resourceKind: 'staff.team',\n resourceId: snapshot.id,\n tenantId: snapshot.tenantId,\n organizationId: snapshot.organizationId,\n snapshotAfter: snapshot,\n payload: {\n undo: {\n after: snapshot,\n customAfter: custom,\n } satisfies TeamUndoPayload,\n },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<TeamUndoPayload>(logEntry)\n const after = payload?.after\n if (!after) return\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const team = await em.findOne(StaffTeam, { id: after.id })\n if (team) {\n team.deletedAt = new Date()\n await em.flush()\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await emitCrudUndoSideEffects({\n dataEngine: de,\n action: 'deleted',\n entity: team,\n identifiers: {\n id: team.id,\n organizationId: team.organizationId,\n tenantId: team.tenantId,\n },\n events: staffTeamCrudEvents,\n indexer: teamCrudIndexer,\n })\n }\n },\n redo: async ({ logEntry, ctx }) => {\n const result = await redoTeamCreate({ input: undefined as unknown as StaffTeamCreateInput, ctx, logEntry })\n const payload = extractUndoPayload<TeamUndoPayload>(logEntry)\n const customAfter = payload?.customAfter\n if (customAfter && Object.keys(customAfter).length) {\n await setCustomFieldsIfAny({\n dataEngine: ctx.container.resolve('dataEngine') as DataEngine,\n entityId: E.staff.staff_team,\n recordId: result.teamId,\n tenantId: payload?.after?.tenantId ?? '',\n organizationId: payload?.after?.organizationId ?? '',\n values: customAfter,\n })\n }\n return result\n },\n}\n\nconst updateTeamCommand: CommandHandler<StaffTeamUpdateInput, { teamId: string }> = {\n id: 'staff.teams.update',\n async prepare(rawInput, ctx) {\n const { parsed } = parseWithCustomFields(staffTeamUpdateSchema, rawInput)\n const em = (ctx.container.resolve('em') as EntityManager)\n const snapshot = await loadTeamSnapshot(em, parsed.id)\n if (!snapshot) return {}\n const custom = await loadTeamCustomSnapshot(em, snapshot)\n return { before: snapshot, customBefore: custom }\n },\n async execute(rawInput, ctx) {\n const { parsed, custom } = parseWithCustomFields(staffTeamUpdateSchema, rawInput)\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const scope = commandActorScope(ctx)\n const team = await findOneWithDecryption(\n em,\n StaffTeam,\n applyScopeToWhere<StaffTeam>({ id: parsed.id, deletedAt: null }, scope),\n undefined,\n scopeForDecryption(scope),\n )\n if (!team) throw new CrudHttpError(404, { error: 'Team not found.' })\n ensureTenantScope(ctx, team.tenantId)\n ensureOrganizationScope(ctx, team.organizationId)\n\n if (parsed.name !== undefined) team.name = parsed.name\n if (parsed.description !== undefined) team.description = parsed.description ?? null\n if (parsed.isActive !== undefined) team.isActive = parsed.isActive\n team.updatedAt = new Date()\n await em.flush()\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await setCustomFieldsIfAny({\n dataEngine: de,\n entityId: E.staff.staff_team,\n recordId: team.id,\n tenantId: team.tenantId,\n organizationId: team.organizationId,\n values: custom,\n })\n\n await emitCrudSideEffects({\n dataEngine: de,\n action: 'updated',\n entity: team,\n identifiers: {\n id: team.id,\n organizationId: team.organizationId,\n tenantId: team.tenantId,\n },\n events: staffTeamCrudEvents,\n indexer: teamCrudIndexer,\n })\n\n return { teamId: team.id }\n },\n buildLog: async ({ snapshots, ctx }) => {\n const before = snapshots.before as TeamSnapshot | undefined\n if (!before) return null\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const after = await loadTeamSnapshot(em, before.id)\n if (!after) return null\n const customBefore = (snapshots as { customBefore?: CustomFieldSnapshot | null }).customBefore ?? undefined\n const customAfter = await loadTeamCustomSnapshot(em, after)\n const changes = buildChanges(before as unknown as Record<string, unknown>, after as unknown as Record<string, unknown>, [\n 'name',\n 'description',\n 'isActive',\n 'deletedAt',\n ])\n const customChanges = diffCustomFieldChanges(customBefore, customAfter)\n if (Object.keys(customChanges).length) {\n changes.customFields = { from: customBefore ?? null, to: customAfter ?? null }\n }\n const { translate } = await resolveTranslations()\n return {\n actionLabel: translate('staff.audit.teams.update', 'Update team'),\n resourceKind: 'staff.team',\n resourceId: before.id,\n tenantId: before.tenantId,\n organizationId: before.organizationId,\n snapshotBefore: before,\n snapshotAfter: after,\n changes,\n payload: {\n undo: {\n before,\n after,\n customBefore: customBefore ?? null,\n customAfter,\n } satisfies TeamUndoPayload,\n },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<TeamUndoPayload>(logEntry)\n const before = payload?.before\n if (!before) return\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const team = await em.findOne(StaffTeam, { id: before.id })\n if (!team) return\n team.name = before.name\n team.description = before.description ?? null\n team.isActive = before.isActive\n team.deletedAt = before.deletedAt ? new Date(before.deletedAt) : null\n team.updatedAt = new Date()\n await em.flush()\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n if (payload.customBefore || payload.customAfter) {\n const reset = buildCustomFieldResetMap(payload.customBefore ?? undefined, payload.customAfter ?? undefined)\n await setCustomFieldsIfAny({\n dataEngine: de,\n entityId: E.staff.staff_team,\n recordId: team.id,\n tenantId: team.tenantId,\n organizationId: team.organizationId,\n values: reset,\n })\n }\n\n await emitCrudUndoSideEffects({\n dataEngine: de,\n action: 'updated',\n entity: team,\n identifiers: {\n id: team.id,\n organizationId: team.organizationId,\n tenantId: team.tenantId,\n },\n events: staffTeamCrudEvents,\n indexer: teamCrudIndexer,\n })\n },\n}\n\nconst deleteTeamCommand: CommandHandler<{ id?: string }, { teamId: string }> = {\n id: 'staff.teams.delete',\n async prepare(input, ctx) {\n const id = input?.id\n if (!id) throw new CrudHttpError(400, { error: 'Team id is required.' })\n const em = (ctx.container.resolve('em') as EntityManager)\n const snapshot = await loadTeamSnapshot(em, id)\n if (!snapshot) return {}\n const custom = await loadTeamCustomSnapshot(em, snapshot)\n return { before: snapshot, customBefore: custom }\n },\n async execute(input, ctx) {\n const id = input?.id\n if (!id) throw new CrudHttpError(400, { error: 'Team id is required.' })\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const scope = commandActorScope(ctx)\n const team = await findOneWithDecryption(\n em,\n StaffTeam,\n applyScopeToWhere<StaffTeam>({ id, deletedAt: null }, scope),\n undefined,\n scopeForDecryption(scope),\n )\n if (!team) throw new CrudHttpError(404, { error: 'Team not found.' })\n ensureTenantScope(ctx, team.tenantId)\n ensureOrganizationScope(ctx, team.organizationId)\n\n const assignedMemberCount = await em.count(StaffTeamMember, {\n tenantId: team.tenantId,\n organizationId: team.organizationId,\n teamId: team.id,\n deletedAt: null,\n })\n if (assignedMemberCount > 0) {\n const { t } = await resolveTranslations()\n throw new CrudHttpError(409, {\n error: t('staff.teams.errors.deleteAssigned', 'Team has assigned members and cannot be deleted.'),\n })\n }\n\n team.deletedAt = new Date()\n team.updatedAt = new Date()\n await em.flush()\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await emitCrudSideEffects({\n dataEngine: de,\n action: 'deleted',\n entity: team,\n identifiers: {\n id: team.id,\n organizationId: team.organizationId,\n tenantId: team.tenantId,\n },\n events: staffTeamCrudEvents,\n indexer: teamCrudIndexer,\n })\n return { teamId: team.id }\n },\n buildLog: async ({ snapshots }) => {\n const before = snapshots.before as TeamSnapshot | undefined\n if (!before) return null\n const customBefore = (snapshots as { customBefore?: CustomFieldSnapshot | null }).customBefore ?? undefined\n const { translate } = await resolveTranslations()\n return {\n actionLabel: translate('staff.audit.teams.delete', 'Delete team'),\n resourceKind: 'staff.team',\n resourceId: before.id,\n tenantId: before.tenantId,\n organizationId: before.organizationId,\n snapshotBefore: before,\n payload: {\n undo: {\n before,\n customBefore: customBefore ?? null,\n } satisfies TeamUndoPayload,\n },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<TeamUndoPayload>(logEntry)\n const before = payload?.before\n if (!before) return\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n let team = await em.findOne(StaffTeam, { id: before.id })\n if (!team) {\n team = em.create(StaffTeam, {\n id: before.id,\n tenantId: before.tenantId,\n organizationId: before.organizationId,\n name: before.name,\n description: before.description ?? null,\n isActive: before.isActive,\n deletedAt: null,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n em.persist(team)\n } else {\n team.name = before.name\n team.description = before.description ?? null\n team.isActive = before.isActive\n team.deletedAt = null\n team.updatedAt = new Date()\n }\n await em.flush()\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n if (payload.customBefore) {\n const reset = buildCustomFieldResetMap(payload.customBefore, undefined)\n await setCustomFieldsIfAny({\n dataEngine: de,\n entityId: E.staff.staff_team,\n recordId: team.id,\n tenantId: team.tenantId,\n organizationId: team.organizationId,\n values: reset,\n })\n }\n\n await emitCrudUndoSideEffects({\n dataEngine: de,\n action: 'created',\n entity: team,\n identifiers: {\n id: team.id,\n organizationId: team.organizationId,\n tenantId: team.tenantId,\n },\n events: staffTeamCrudEvents,\n indexer: teamCrudIndexer,\n })\n },\n}\n\nregisterCommand(createTeamCommand)\nregisterCommand(updateTeamCommand)\nregisterCommand(deleteTeamCommand)\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { CommandHandler } from '@open-mercato/shared/lib/commands'\nimport { registerCommand } from '@open-mercato/shared/lib/commands'\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport { CrudHttpError } from '@open-mercato/shared/lib/crud/errors'\nimport { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'\nimport { findOneWithDecryption } from '@open-mercato/shared/lib/encryption/find'\nimport { buildChanges, emitCrudSideEffects, emitCrudUndoSideEffects, parseWithCustomFields, setCustomFieldsIfAny } from '@open-mercato/shared/lib/commands/helpers'\nimport { buildCustomFieldResetMap, diffCustomFieldChanges, loadCustomFieldSnapshot, type CustomFieldSnapshot } from '@open-mercato/shared/lib/commands/customFieldSnapshots'\nimport { makeCreateRedo } from '@open-mercato/shared/lib/commands/redo'\nimport type { DataEngine } from '@open-mercato/shared/lib/data/engine'\nimport type { CrudIndexerConfig } from '@open-mercato/shared/lib/crud/types'\nimport { StaffTeam, StaffTeamMember } from '../data/entities'\nimport {\n staffTeamCreateSchema,\n staffTeamUpdateSchema,\n type StaffTeamCreateInput,\n type StaffTeamUpdateInput,\n} from '../data/validators'\nimport { staffTeamCrudEvents } from '../lib/crud'\nimport {\n applyScopeToWhere,\n commandActorScope,\n commandInputScope,\n ensureOrganizationScope,\n ensureTenantScope,\n extractUndoPayload,\n scopeForDecryption,\n scopedStaffSnapshotWhere,\n staffSnapshotDecryptionScope,\n staffSnapshotScopeFromContext,\n staffSnapshotScopeFromSnapshot,\n type StaffSnapshotScope,\n} from './shared'\nimport { E } from '#generated/entities.ids.generated'\n\nconst teamCrudIndexer: CrudIndexerConfig<StaffTeam> = {\n entityType: E.staff.staff_team,\n}\n\ntype TeamSnapshot = {\n id: string\n tenantId: string\n organizationId: string\n name: string\n description: string | null\n isActive: boolean\n deletedAt: string | null\n}\n\ntype TeamUndoPayload = {\n before?: TeamSnapshot | null\n after?: TeamSnapshot | null\n customBefore?: CustomFieldSnapshot | null\n customAfter?: CustomFieldSnapshot | null\n}\n\nasync function loadTeamSnapshot(em: EntityManager, id: string, scope?: StaffSnapshotScope | null): Promise<TeamSnapshot | null> {\n const team = await findOneWithDecryption(\n em,\n StaffTeam,\n scopedStaffSnapshotWhere(id, scope),\n undefined,\n staffSnapshotDecryptionScope(scope),\n )\n if (!team) return null\n return {\n id: team.id,\n tenantId: team.tenantId,\n organizationId: team.organizationId,\n name: team.name,\n description: team.description ?? null,\n isActive: team.isActive ?? true,\n deletedAt: team.deletedAt ? team.deletedAt.toISOString() : null,\n }\n}\n\nasync function loadTeamCustomSnapshot(em: EntityManager, snapshot: TeamSnapshot): Promise<CustomFieldSnapshot> {\n return loadCustomFieldSnapshot(em, {\n entityId: E.staff.staff_team,\n recordId: snapshot.id,\n tenantId: snapshot.tenantId,\n organizationId: snapshot.organizationId,\n })\n}\n\nconst redoTeamCreate = makeCreateRedo<StaffTeam, TeamSnapshot, StaffTeamCreateInput, { teamId: string }>({\n entityClass: StaffTeam,\n buildResult: (entity) => ({ teamId: entity.id }),\n events: staffTeamCrudEvents,\n indexer: teamCrudIndexer,\n})\n\nconst createTeamCommand: CommandHandler<StaffTeamCreateInput, { teamId: string }> = {\n id: 'staff.teams.create',\n async execute(rawInput, ctx) {\n const { parsed, custom } = parseWithCustomFields(staffTeamCreateSchema, rawInput)\n ensureTenantScope(ctx, parsed.tenantId)\n ensureOrganizationScope(ctx, parsed.organizationId)\n commandInputScope(ctx, parsed.tenantId, parsed.organizationId)\n\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const now = new Date()\n const team = em.create(StaffTeam, {\n tenantId: parsed.tenantId,\n organizationId: parsed.organizationId,\n name: parsed.name,\n description: parsed.description ?? null,\n isActive: parsed.isActive ?? true,\n createdAt: now,\n updatedAt: now,\n deletedAt: null,\n })\n em.persist(team)\n await em.flush()\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await setCustomFieldsIfAny({\n dataEngine: de,\n entityId: E.staff.staff_team,\n recordId: team.id,\n tenantId: team.tenantId,\n organizationId: team.organizationId,\n values: custom,\n })\n\n await emitCrudSideEffects({\n dataEngine: de,\n action: 'created',\n entity: team,\n identifiers: {\n id: team.id,\n organizationId: team.organizationId,\n tenantId: team.tenantId,\n },\n events: staffTeamCrudEvents,\n indexer: teamCrudIndexer,\n })\n\n return { teamId: team.id }\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const snapshot = await loadTeamSnapshot(em, result.teamId, staffSnapshotScopeFromContext(ctx))\n if (!snapshot) return null\n const custom = await loadTeamCustomSnapshot(em, snapshot)\n return { snapshot, custom }\n },\n buildLog: async ({ result, ctx }) => {\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const snapshot = await loadTeamSnapshot(em, result.teamId, staffSnapshotScopeFromContext(ctx))\n if (!snapshot) return null\n const custom = await loadTeamCustomSnapshot(em, snapshot)\n const { translate } = await resolveTranslations()\n return {\n actionLabel: translate('staff.audit.teams.create', 'Create team'),\n resourceKind: 'staff.team',\n resourceId: snapshot.id,\n tenantId: snapshot.tenantId,\n organizationId: snapshot.organizationId,\n snapshotAfter: snapshot,\n payload: {\n undo: {\n after: snapshot,\n customAfter: custom,\n } satisfies TeamUndoPayload,\n },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<TeamUndoPayload>(logEntry)\n const after = payload?.after\n if (!after) return\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const team = await em.findOne(StaffTeam, scopedStaffSnapshotWhere(after.id, staffSnapshotScopeFromSnapshot(after)))\n if (team) {\n team.deletedAt = new Date()\n await em.flush()\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await emitCrudUndoSideEffects({\n dataEngine: de,\n action: 'deleted',\n entity: team,\n identifiers: {\n id: team.id,\n organizationId: team.organizationId,\n tenantId: team.tenantId,\n },\n events: staffTeamCrudEvents,\n indexer: teamCrudIndexer,\n })\n }\n },\n redo: async ({ logEntry, ctx }) => {\n const result = await redoTeamCreate({ input: undefined as unknown as StaffTeamCreateInput, ctx, logEntry })\n const payload = extractUndoPayload<TeamUndoPayload>(logEntry)\n const customAfter = payload?.customAfter\n if (customAfter && Object.keys(customAfter).length) {\n await setCustomFieldsIfAny({\n dataEngine: ctx.container.resolve('dataEngine') as DataEngine,\n entityId: E.staff.staff_team,\n recordId: result.teamId,\n tenantId: payload?.after?.tenantId ?? '',\n organizationId: payload?.after?.organizationId ?? '',\n values: customAfter,\n })\n }\n return result\n },\n}\n\nconst updateTeamCommand: CommandHandler<StaffTeamUpdateInput, { teamId: string }> = {\n id: 'staff.teams.update',\n async prepare(rawInput, ctx) {\n const { parsed } = parseWithCustomFields(staffTeamUpdateSchema, rawInput)\n const em = (ctx.container.resolve('em') as EntityManager)\n const snapshot = await loadTeamSnapshot(em, parsed.id, staffSnapshotScopeFromContext(ctx))\n if (!snapshot) return {}\n const custom = await loadTeamCustomSnapshot(em, snapshot)\n return { before: snapshot, customBefore: custom }\n },\n async execute(rawInput, ctx) {\n const { parsed, custom } = parseWithCustomFields(staffTeamUpdateSchema, rawInput)\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const scope = commandActorScope(ctx)\n const team = await findOneWithDecryption(\n em,\n StaffTeam,\n applyScopeToWhere<StaffTeam>({ id: parsed.id, deletedAt: null }, scope),\n undefined,\n scopeForDecryption(scope),\n )\n if (!team) throw new CrudHttpError(404, { error: 'Team not found.' })\n ensureTenantScope(ctx, team.tenantId)\n ensureOrganizationScope(ctx, team.organizationId)\n\n if (parsed.name !== undefined) team.name = parsed.name\n if (parsed.description !== undefined) team.description = parsed.description ?? null\n if (parsed.isActive !== undefined) team.isActive = parsed.isActive\n team.updatedAt = new Date()\n await em.flush()\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await setCustomFieldsIfAny({\n dataEngine: de,\n entityId: E.staff.staff_team,\n recordId: team.id,\n tenantId: team.tenantId,\n organizationId: team.organizationId,\n values: custom,\n })\n\n await emitCrudSideEffects({\n dataEngine: de,\n action: 'updated',\n entity: team,\n identifiers: {\n id: team.id,\n organizationId: team.organizationId,\n tenantId: team.tenantId,\n },\n events: staffTeamCrudEvents,\n indexer: teamCrudIndexer,\n })\n\n return { teamId: team.id }\n },\n buildLog: async ({ snapshots, ctx }) => {\n const before = snapshots.before as TeamSnapshot | undefined\n if (!before) return null\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const after = await loadTeamSnapshot(em, before.id, staffSnapshotScopeFromSnapshot(before))\n if (!after) return null\n const customBefore = (snapshots as { customBefore?: CustomFieldSnapshot | null }).customBefore ?? undefined\n const customAfter = await loadTeamCustomSnapshot(em, after)\n const changes = buildChanges(before as unknown as Record<string, unknown>, after as unknown as Record<string, unknown>, [\n 'name',\n 'description',\n 'isActive',\n 'deletedAt',\n ])\n const customChanges = diffCustomFieldChanges(customBefore, customAfter)\n if (Object.keys(customChanges).length) {\n changes.customFields = { from: customBefore ?? null, to: customAfter ?? null }\n }\n const { translate } = await resolveTranslations()\n return {\n actionLabel: translate('staff.audit.teams.update', 'Update team'),\n resourceKind: 'staff.team',\n resourceId: before.id,\n tenantId: before.tenantId,\n organizationId: before.organizationId,\n snapshotBefore: before,\n snapshotAfter: after,\n changes,\n payload: {\n undo: {\n before,\n after,\n customBefore: customBefore ?? null,\n customAfter,\n } satisfies TeamUndoPayload,\n },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<TeamUndoPayload>(logEntry)\n const before = payload?.before\n if (!before) return\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const team = await em.findOne(StaffTeam, scopedStaffSnapshotWhere(before.id, staffSnapshotScopeFromSnapshot(before)))\n if (!team) return\n team.name = before.name\n team.description = before.description ?? null\n team.isActive = before.isActive\n team.deletedAt = before.deletedAt ? new Date(before.deletedAt) : null\n team.updatedAt = new Date()\n await em.flush()\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n if (payload.customBefore || payload.customAfter) {\n const reset = buildCustomFieldResetMap(payload.customBefore ?? undefined, payload.customAfter ?? undefined)\n await setCustomFieldsIfAny({\n dataEngine: de,\n entityId: E.staff.staff_team,\n recordId: team.id,\n tenantId: team.tenantId,\n organizationId: team.organizationId,\n values: reset,\n })\n }\n\n await emitCrudUndoSideEffects({\n dataEngine: de,\n action: 'updated',\n entity: team,\n identifiers: {\n id: team.id,\n organizationId: team.organizationId,\n tenantId: team.tenantId,\n },\n events: staffTeamCrudEvents,\n indexer: teamCrudIndexer,\n })\n },\n}\n\nconst deleteTeamCommand: CommandHandler<{ id?: string }, { teamId: string }> = {\n id: 'staff.teams.delete',\n async prepare(input, ctx) {\n const id = input?.id\n if (!id) throw new CrudHttpError(400, { error: 'Team id is required.' })\n const em = (ctx.container.resolve('em') as EntityManager)\n const snapshot = await loadTeamSnapshot(em, id, staffSnapshotScopeFromContext(ctx))\n if (!snapshot) return {}\n const custom = await loadTeamCustomSnapshot(em, snapshot)\n return { before: snapshot, customBefore: custom }\n },\n async execute(input, ctx) {\n const id = input?.id\n if (!id) throw new CrudHttpError(400, { error: 'Team id is required.' })\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const scope = commandActorScope(ctx)\n const team = await findOneWithDecryption(\n em,\n StaffTeam,\n applyScopeToWhere<StaffTeam>({ id, deletedAt: null }, scope),\n undefined,\n scopeForDecryption(scope),\n )\n if (!team) throw new CrudHttpError(404, { error: 'Team not found.' })\n ensureTenantScope(ctx, team.tenantId)\n ensureOrganizationScope(ctx, team.organizationId)\n\n const assignedMemberCount = await em.count(StaffTeamMember, {\n tenantId: team.tenantId,\n organizationId: team.organizationId,\n teamId: team.id,\n deletedAt: null,\n })\n if (assignedMemberCount > 0) {\n const { t } = await resolveTranslations()\n throw new CrudHttpError(409, {\n error: t('staff.teams.errors.deleteAssigned', 'Team has assigned members and cannot be deleted.'),\n })\n }\n\n team.deletedAt = new Date()\n team.updatedAt = new Date()\n await em.flush()\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await emitCrudSideEffects({\n dataEngine: de,\n action: 'deleted',\n entity: team,\n identifiers: {\n id: team.id,\n organizationId: team.organizationId,\n tenantId: team.tenantId,\n },\n events: staffTeamCrudEvents,\n indexer: teamCrudIndexer,\n })\n return { teamId: team.id }\n },\n buildLog: async ({ snapshots }) => {\n const before = snapshots.before as TeamSnapshot | undefined\n if (!before) return null\n const customBefore = (snapshots as { customBefore?: CustomFieldSnapshot | null }).customBefore ?? undefined\n const { translate } = await resolveTranslations()\n return {\n actionLabel: translate('staff.audit.teams.delete', 'Delete team'),\n resourceKind: 'staff.team',\n resourceId: before.id,\n tenantId: before.tenantId,\n organizationId: before.organizationId,\n snapshotBefore: before,\n payload: {\n undo: {\n before,\n customBefore: customBefore ?? null,\n } satisfies TeamUndoPayload,\n },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<TeamUndoPayload>(logEntry)\n const before = payload?.before\n if (!before) return\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n let team = await em.findOne(StaffTeam, scopedStaffSnapshotWhere(before.id, staffSnapshotScopeFromSnapshot(before)))\n if (!team) {\n team = em.create(StaffTeam, {\n id: before.id,\n tenantId: before.tenantId,\n organizationId: before.organizationId,\n name: before.name,\n description: before.description ?? null,\n isActive: before.isActive,\n deletedAt: null,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n em.persist(team)\n } else {\n team.name = before.name\n team.description = before.description ?? null\n team.isActive = before.isActive\n team.deletedAt = null\n team.updatedAt = new Date()\n }\n await em.flush()\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n if (payload.customBefore) {\n const reset = buildCustomFieldResetMap(payload.customBefore, undefined)\n await setCustomFieldsIfAny({\n dataEngine: de,\n entityId: E.staff.staff_team,\n recordId: team.id,\n tenantId: team.tenantId,\n organizationId: team.organizationId,\n values: reset,\n })\n }\n\n await emitCrudUndoSideEffects({\n dataEngine: de,\n action: 'created',\n entity: team,\n identifiers: {\n id: team.id,\n organizationId: team.organizationId,\n tenantId: team.tenantId,\n },\n events: staffTeamCrudEvents,\n indexer: teamCrudIndexer,\n })\n },\n}\n\nregisterCommand(createTeamCommand)\nregisterCommand(updateTeamCommand)\nregisterCommand(deleteTeamCommand)\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -22,7 +22,11 @@ import {
22
22
  ensureOrganizationScope,
23
23
  ensureTenantScope,
24
24
  extractUndoPayload,
25
- scopeForDecryption
25
+ scopeForDecryption,
26
+ scopedStaffSnapshotWhere,
27
+ staffSnapshotDecryptionScope,
28
+ staffSnapshotScopeFromContext,
29
+ staffSnapshotScopeFromSnapshot
26
30
  } from "./shared.js";
27
31
  import { getStaffMemberByUserId } from "../lib/staffMemberResolver.js";
28
32
  async function callerHasManageAll(ctx) {
@@ -68,8 +72,14 @@ async function assertTimeProjectInScope(em, projectId, tenantId, organizationId)
68
72
  });
69
73
  }
70
74
  }
71
- async function loadTimeEntrySnapshot(em, id) {
72
- const entry = await findOneWithDecryption(em, StaffTimeEntry, { id }, void 0, { tenantId: null, organizationId: null });
75
+ async function loadTimeEntrySnapshot(em, id, scope) {
76
+ const entry = await findOneWithDecryption(
77
+ em,
78
+ StaffTimeEntry,
79
+ scopedStaffSnapshotWhere(id, scope),
80
+ void 0,
81
+ staffSnapshotDecryptionScope(scope)
82
+ );
73
83
  if (!entry) return null;
74
84
  return {
75
85
  id: entry.id,
@@ -163,13 +173,13 @@ const createTimeEntryCommand = {
163
173
  },
164
174
  captureAfter: async (_input, result, ctx) => {
165
175
  const em = ctx.container.resolve("em").fork();
166
- const snapshot = await loadTimeEntrySnapshot(em, result.timeEntryId);
176
+ const snapshot = await loadTimeEntrySnapshot(em, result.timeEntryId, staffSnapshotScopeFromContext(ctx));
167
177
  if (!snapshot) return null;
168
178
  return { snapshot };
169
179
  },
170
180
  buildLog: async ({ result, ctx }) => {
171
181
  const em = ctx.container.resolve("em").fork();
172
- const snapshot = await loadTimeEntrySnapshot(em, result.timeEntryId);
182
+ const snapshot = await loadTimeEntrySnapshot(em, result.timeEntryId, staffSnapshotScopeFromContext(ctx));
173
183
  if (!snapshot) return null;
174
184
  const { translate } = await resolveTranslations();
175
185
  return {
@@ -191,7 +201,7 @@ const createTimeEntryCommand = {
191
201
  const after = payload?.after;
192
202
  if (!after) return;
193
203
  const em = ctx.container.resolve("em").fork();
194
- const entry = await em.findOne(StaffTimeEntry, { id: after.id });
204
+ const entry = await em.findOne(StaffTimeEntry, scopedStaffSnapshotWhere(after.id, staffSnapshotScopeFromSnapshot(after)));
195
205
  if (entry) {
196
206
  entry.deletedAt = /* @__PURE__ */ new Date();
197
207
  await em.flush();
@@ -310,13 +320,13 @@ const startTimerCommand = {
310
320
  },
311
321
  captureAfter: async (_input, result, ctx) => {
312
322
  const em = ctx.container.resolve("em").fork();
313
- const snapshot = await loadTimeEntrySnapshot(em, result.timeEntryId);
323
+ const snapshot = await loadTimeEntrySnapshot(em, result.timeEntryId, staffSnapshotScopeFromContext(ctx));
314
324
  if (!snapshot) return null;
315
325
  return { snapshot };
316
326
  },
317
327
  buildLog: async ({ result, ctx }) => {
318
328
  const em = ctx.container.resolve("em").fork();
319
- const snapshot = await loadTimeEntrySnapshot(em, result.timeEntryId);
329
+ const snapshot = await loadTimeEntrySnapshot(em, result.timeEntryId, staffSnapshotScopeFromContext(ctx));
320
330
  if (!snapshot) return null;
321
331
  const { translate } = await resolveTranslations();
322
332
  return {
@@ -338,7 +348,7 @@ const startTimerCommand = {
338
348
  const after = payload?.after;
339
349
  if (!after) return;
340
350
  const em = ctx.container.resolve("em").fork();
341
- const entry = await em.findOne(StaffTimeEntry, { id: after.id });
351
+ const entry = await em.findOne(StaffTimeEntry, scopedStaffSnapshotWhere(after.id, staffSnapshotScopeFromSnapshot(after)));
342
352
  if (entry) {
343
353
  entry.deletedAt = /* @__PURE__ */ new Date();
344
354
  await em.flush();
@@ -357,7 +367,7 @@ const updateTimeEntryCommand = {
357
367
  async prepare(rawInput, ctx) {
358
368
  const parsed = staffTimeEntryUpdateSchema.parse(rawInput);
359
369
  const em = ctx.container.resolve("em");
360
- const snapshot = await loadTimeEntrySnapshot(em, parsed.id);
370
+ const snapshot = await loadTimeEntrySnapshot(em, parsed.id, staffSnapshotScopeFromContext(ctx));
361
371
  if (!snapshot) return {};
362
372
  return { before: snapshot };
363
373
  },
@@ -410,7 +420,7 @@ const updateTimeEntryCommand = {
410
420
  const before = snapshots.before;
411
421
  if (!before) return null;
412
422
  const em = ctx.container.resolve("em").fork();
413
- const after = await loadTimeEntrySnapshot(em, before.id);
423
+ const after = await loadTimeEntrySnapshot(em, before.id, staffSnapshotScopeFromSnapshot(before));
414
424
  if (!after) return null;
415
425
  const changes = buildChanges(before, after, [
416
426
  "date",
@@ -445,7 +455,7 @@ const updateTimeEntryCommand = {
445
455
  const before = payload?.before;
446
456
  if (!before) return;
447
457
  const em = ctx.container.resolve("em").fork();
448
- const entry = await em.findOne(StaffTimeEntry, { id: before.id });
458
+ const entry = await em.findOne(StaffTimeEntry, scopedStaffSnapshotWhere(before.id, staffSnapshotScopeFromSnapshot(before)));
449
459
  if (!entry) return;
450
460
  entry.date = before.date;
451
461
  entry.durationMinutes = before.durationMinutes;
@@ -473,7 +483,7 @@ const deleteTimeEntryCommand = {
473
483
  const id = input?.id;
474
484
  if (!id) throw new CrudHttpError(400, { error: "Time entry id is required." });
475
485
  const em = ctx.container.resolve("em");
476
- const snapshot = await loadTimeEntrySnapshot(em, id);
486
+ const snapshot = await loadTimeEntrySnapshot(em, id, staffSnapshotScopeFromContext(ctx));
477
487
  if (!snapshot) return {};
478
488
  return { before: snapshot };
479
489
  },
@@ -537,7 +547,7 @@ const deleteTimeEntryCommand = {
537
547
  const before = payload?.before;
538
548
  if (!before) return;
539
549
  const em = ctx.container.resolve("em").fork();
540
- let entry = await em.findOne(StaffTimeEntry, { id: before.id });
550
+ let entry = await em.findOne(StaffTimeEntry, scopedStaffSnapshotWhere(before.id, staffSnapshotScopeFromSnapshot(before)));
541
551
  if (!entry) {
542
552
  entry = em.create(StaffTimeEntry, {
543
553
  id: before.id,