@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.
- package/.turbo/turbo-build.log +1 -1
- package/dist/helpers/integration/auth.js +148 -82
- package/dist/helpers/integration/auth.js.map +2 -2
- package/dist/modules/sales/api/document-addresses/route.js +96 -6
- package/dist/modules/sales/api/document-addresses/route.js.map +2 -2
- package/dist/modules/sales/commands/documentAddresses.js +7 -0
- package/dist/modules/sales/commands/documentAddresses.js.map +2 -2
- package/dist/modules/staff/commands/activities.js +23 -12
- package/dist/modules/staff/commands/activities.js.map +2 -2
- package/dist/modules/staff/commands/addresses.js +20 -12
- package/dist/modules/staff/commands/addresses.js.map +2 -2
- package/dist/modules/staff/commands/comments.js +18 -11
- package/dist/modules/staff/commands/comments.js.map +2 -2
- package/dist/modules/staff/commands/job-histories.js +23 -12
- package/dist/modules/staff/commands/job-histories.js.map +2 -2
- package/dist/modules/staff/commands/leave-requests.js +37 -19
- package/dist/modules/staff/commands/leave-requests.js.map +2 -2
- package/dist/modules/staff/commands/shared.js +28 -1
- package/dist/modules/staff/commands/shared.js.map +2 -2
- package/dist/modules/staff/commands/tag-assignments.js +20 -3
- package/dist/modules/staff/commands/tag-assignments.js.map +2 -2
- package/dist/modules/staff/commands/team-members.js +21 -11
- package/dist/modules/staff/commands/team-members.js.map +2 -2
- package/dist/modules/staff/commands/team-roles.js +21 -11
- package/dist/modules/staff/commands/team-roles.js.map +2 -2
- package/dist/modules/staff/commands/teams.js +21 -11
- package/dist/modules/staff/commands/teams.js.map +2 -2
- package/dist/modules/staff/commands/timesheets-entries.js +24 -14
- package/dist/modules/staff/commands/timesheets-entries.js.map +2 -2
- package/dist/modules/staff/commands/timesheets-projects.js +34 -18
- package/dist/modules/staff/commands/timesheets-projects.js.map +2 -2
- package/dist/modules/workflows/api/instances/route.js +1 -1
- package/dist/modules/workflows/api/instances/route.js.map +2 -2
- package/package.json +7 -7
- package/src/helpers/integration/auth.ts +178 -86
- package/src/modules/sales/api/document-addresses/route.ts +140 -7
- package/src/modules/sales/commands/documentAddresses.ts +8 -0
- package/src/modules/staff/commands/activities.ts +23 -11
- package/src/modules/staff/commands/addresses.ts +20 -11
- package/src/modules/staff/commands/comments.ts +18 -10
- package/src/modules/staff/commands/job-histories.ts +27 -11
- package/src/modules/staff/commands/leave-requests.ts +38 -19
- package/src/modules/staff/commands/shared.ts +38 -0
- package/src/modules/staff/commands/tag-assignments.ts +19 -2
- package/src/modules/staff/commands/team-members.ts +21 -10
- package/src/modules/staff/commands/team-roles.ts +21 -10
- package/src/modules/staff/commands/teams.ts +21 -10
- package/src/modules/staff/commands/timesheets-entries.ts +24 -13
- package/src/modules/staff/commands/timesheets-projects.ts +34 -17
- 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/sales/commands/documentAddresses.ts"],
|
|
4
|
-
"sourcesContent": ["// @ts-nocheck\n\nimport { registerCommand, type CommandHandler } from '@open-mercato/shared/lib/commands'\nimport { emitCrudSideEffects } from '@open-mercato/shared/lib/commands/helpers'\nimport type { DataEngine } from '@open-mercato/shared/lib/data/engine'\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport { CrudHttpError } from '@open-mercato/shared/lib/crud/errors'\nimport {\n documentAddressCreateSchema,\n documentAddressDeleteSchema,\n documentAddressUpdateSchema,\n type DocumentAddressCreateInput,\n type DocumentAddressDeleteInput,\n type DocumentAddressUpdateInput,\n} from '../data/validators'\nimport { SalesDocumentAddress, SalesOrder, SalesQuote } from '../data/entities'\nimport { ensureOrganizationScope, ensureSameScope, ensureTenantScope, assertFound, extractUndoPayload } from './shared'\nimport { loadSalesSettings } from './settings'\nimport { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'\nimport { findOneWithDecryption } from '@open-mercato/shared/lib/encryption/find'\nimport { E } from '#generated/entities.ids.generated'\n\nconst DOCUMENT_ADDRESS_ENTITY_TYPE = E.sales.sales_document_address\n\ntype DocumentAddressSnapshot = {\n id: string\n organizationId: string\n tenantId: string\n documentId: string\n documentKind: 'order' | 'quote'\n customerAddressId: string | null\n name: string | null\n purpose: string | null\n companyName: string | null\n addressLine1: string\n addressLine2: string | null\n buildingNumber: string | null\n flatNumber: string | null\n city: string | null\n region: string | null\n postalCode: string | null\n country: string | null\n latitude: number | null\n longitude: number | null\n}\n\ntype DocumentAddressUndoPayload = {\n before?: DocumentAddressSnapshot | null\n after?: DocumentAddressSnapshot | null\n}\n\nfunction snapshotDocumentAddress(entity: SalesDocumentAddress): DocumentAddressSnapshot {\n return {\n id: entity.id,\n organizationId: entity.organizationId,\n tenantId: entity.tenantId,\n documentId: entity.documentId,\n documentKind: entity.documentKind as 'order' | 'quote',\n customerAddressId: entity.customerAddressId ?? null,\n name: entity.name ?? null,\n purpose: entity.purpose ?? null,\n companyName: entity.companyName ?? null,\n addressLine1: entity.addressLine1,\n addressLine2: entity.addressLine2 ?? null,\n buildingNumber: entity.buildingNumber ?? null,\n flatNumber: entity.flatNumber ?? null,\n city: entity.city ?? null,\n region: entity.region ?? null,\n postalCode: entity.postalCode ?? null,\n country: entity.country ?? null,\n latitude: entity.latitude ?? null,\n longitude: entity.longitude ?? null,\n }\n}\n\nasync function loadDocumentAddressSnapshot(\n em: EntityManager,\n id: string\n): Promise<DocumentAddressSnapshot | null> {\n const entity = await findOneWithDecryption(em, SalesDocumentAddress, { id }, {})\n return entity ? snapshotDocumentAddress(entity) : null\n}\n\nfunction applyDocumentAddressSnapshot(em: EntityManager, entity: SalesDocumentAddress, snapshot: DocumentAddressSnapshot): void {\n entity.organizationId = snapshot.organizationId\n entity.tenantId = snapshot.tenantId\n entity.documentId = snapshot.documentId\n entity.documentKind = snapshot.documentKind\n entity.customerAddressId = snapshot.customerAddressId\n entity.name = snapshot.name\n entity.purpose = snapshot.purpose\n entity.companyName = snapshot.companyName\n entity.addressLine1 = snapshot.addressLine1\n entity.addressLine2 = snapshot.addressLine2\n entity.buildingNumber = snapshot.buildingNumber\n entity.flatNumber = snapshot.flatNumber\n entity.city = snapshot.city\n entity.region = snapshot.region\n entity.postalCode = snapshot.postalCode\n entity.country = snapshot.country\n entity.latitude = snapshot.latitude\n entity.longitude = snapshot.longitude\n entity.order = snapshot.documentKind === 'order' ? em.getReference(SalesOrder, snapshot.documentId) : null\n entity.quote = snapshot.documentKind === 'quote' ? em.getReference(SalesQuote, snapshot.documentId) : null\n}\n\nasync function emitDocumentAddressIndexSideEffects(\n ctx: { container: { resolve: (name: string) => unknown } },\n action: 'created' | 'updated' | 'deleted',\n snapshot: DocumentAddressSnapshot\n): Promise<void> {\n let dataEngine: DataEngine | null = null\n try {\n dataEngine = ctx.container.resolve('dataEngine') as DataEngine\n } catch {\n dataEngine = null\n }\n if (!dataEngine) return\n await emitCrudSideEffects({\n dataEngine,\n action,\n entity: snapshot,\n identifiers: {\n id: snapshot.id,\n organizationId: snapshot.organizationId,\n tenantId: snapshot.tenantId,\n },\n indexer: { entityType: DOCUMENT_ADDRESS_ENTITY_TYPE },\n })\n}\n\nasync function requireDocument(\n em: EntityManager,\n kind: 'order' | 'quote',\n id: string,\n organizationId: string,\n tenantId: string\n): Promise<SalesOrder | SalesQuote> {\n const repo = kind === 'order' ? SalesOrder : SalesQuote\n const doc = await findOneWithDecryption(em, repo, { id, organizationId, tenantId }, {}, { tenantId, organizationId })\n if (!doc) {\n throw new CrudHttpError(404, { error: 'sales.document.not_found' })\n }\n return doc\n}\n\nasync function assertAddressEditable(\n em: EntityManager,\n params: { organizationId: string; tenantId: string; status: string | null }\n): Promise<void> {\n const settings = await loadSalesSettings(em, {\n tenantId: params.tenantId,\n organizationId: params.organizationId,\n })\n const allowed = settings?.orderAddressEditableStatuses ?? null\n if (!Array.isArray(allowed)) return\n const { translate } = await resolveTranslations()\n if (allowed.length === 0) {\n throw new CrudHttpError(400, { error: translate('sales.orders.edit_addresses_blocked', 'Addresses cannot be changed for the current status.') })\n }\n if (!params.status || !allowed.includes(params.status)) {\n throw new CrudHttpError(400, { error: translate('sales.orders.edit_addresses_blocked', 'Addresses cannot be changed for the current status.') })\n }\n}\n\nconst createDocumentAddress: CommandHandler<DocumentAddressCreateInput, { id: string }> = {\n id: 'sales.document-addresses.create',\n async execute(rawInput, ctx) {\n const input = documentAddressCreateSchema.parse(rawInput)\n ensureTenantScope(ctx, input.tenantId)\n ensureOrganizationScope(ctx, input.organizationId)\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const document = await requireDocument(em, input.documentKind, input.documentId, input.organizationId, input.tenantId)\n if (input.documentKind === 'order') {\n await assertAddressEditable(em, {\n organizationId: input.organizationId,\n tenantId: input.tenantId,\n status: (document as SalesOrder).status ?? null,\n })\n }\n\n const entity = em.create(SalesDocumentAddress, {\n organizationId: input.organizationId,\n tenantId: input.tenantId,\n documentId: input.documentId,\n documentKind: input.documentKind,\n customerAddressId: input.customerAddressId ?? null,\n name: input.name ?? null,\n purpose: input.purpose ?? null,\n companyName: input.companyName ?? null,\n addressLine1: input.addressLine1,\n addressLine2: input.addressLine2 ?? null,\n buildingNumber: input.buildingNumber ?? null,\n flatNumber: input.flatNumber ?? null,\n city: input.city ?? null,\n region: input.region ?? null,\n postalCode: input.postalCode ?? null,\n country: input.country ?? null,\n latitude: input.latitude ?? null,\n longitude: input.longitude ?? null,\n order: input.documentKind === 'order' ? (document as SalesOrder) : null,\n quote: input.documentKind === 'quote' ? (document as SalesQuote) : null,\n })\n await em.persist(entity).flush()\n return { id: entity.id }\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n return result?.id ? loadDocumentAddressSnapshot(em, result.id) : null\n },\n buildLog: async ({ result, snapshots }) => {\n const after = snapshots.after as DocumentAddressSnapshot | undefined\n if (!after) return null\n const { translate } = await resolveTranslations()\n return {\n actionLabel: translate('sales.audit.document_addresses.create', 'Add document address'),\n resourceKind: 'sales.document_address',\n resourceId: result.id,\n parentResourceKind: after.documentKind === 'order' ? 'sales.order' : 'sales.quote',\n parentResourceId: after.documentId,\n tenantId: after.tenantId,\n organizationId: after.organizationId,\n snapshotAfter: after,\n payload: { undo: { after } satisfies DocumentAddressUndoPayload },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<DocumentAddressUndoPayload>(logEntry)\n const after = payload?.after\n if (!after) return\n ensureTenantScope(ctx, after.tenantId)\n ensureOrganizationScope(ctx, after.organizationId)\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const entity = await findOneWithDecryption(em, SalesDocumentAddress, { id: after.id }, {}, { tenantId: after.tenantId, organizationId: after.organizationId })\n if (!entity) return\n await em.remove(entity).flush()\n await emitDocumentAddressIndexSideEffects(ctx, 'deleted', after)\n },\n}\n\nconst updateDocumentAddress: CommandHandler<DocumentAddressUpdateInput, { id: string }> = {\n id: 'sales.document-addresses.update',\n async prepare(rawInput, ctx) {\n const parsed = documentAddressUpdateSchema.parse(rawInput)\n const em = ctx.container.resolve('em') as EntityManager\n const snapshot = await loadDocumentAddressSnapshot(em, parsed.id)\n return snapshot ? { before: snapshot } : {}\n },\n async execute(rawInput, ctx) {\n const input = documentAddressUpdateSchema.parse(rawInput)\n ensureTenantScope(ctx, input.tenantId)\n ensureOrganizationScope(ctx, input.organizationId)\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const entity = assertFound(\n await findOneWithDecryption(em, SalesDocumentAddress, { id: input.id }, {}, { tenantId: input.tenantId, organizationId: input.organizationId }),\n 'sales.document.address.not_found'\n )\n ensureSameScope(entity, input.organizationId, input.tenantId)\n const document = await requireDocument(em, input.documentKind, input.documentId, input.organizationId, input.tenantId)\n if (input.documentKind === 'order') {\n await assertAddressEditable(em, {\n organizationId: input.organizationId,\n tenantId: input.tenantId,\n status: (document as SalesOrder).status ?? null,\n })\n }\n\n entity.documentId = input.documentId\n entity.documentKind = input.documentKind\n entity.customerAddressId = input.customerAddressId ?? null\n entity.name = input.name ?? null\n entity.purpose = input.purpose ?? null\n entity.companyName = input.companyName ?? null\n entity.addressLine1 = input.addressLine1\n entity.addressLine2 = input.addressLine2 ?? null\n entity.buildingNumber = input.buildingNumber ?? null\n entity.flatNumber = input.flatNumber ?? null\n entity.city = input.city ?? null\n entity.region = input.region ?? null\n entity.postalCode = input.postalCode ?? null\n entity.country = input.country ?? null\n entity.latitude = input.latitude ?? null\n entity.longitude = input.longitude ?? null\n\n await em.flush()\n return { id: entity.id }\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n return result?.id ? loadDocumentAddressSnapshot(em, result.id) : null\n },\n buildLog: async ({ result, snapshots }) => {\n const before = snapshots.before as DocumentAddressSnapshot | undefined\n const after = snapshots.after as DocumentAddressSnapshot | undefined\n if (!after) return null\n const { translate } = await resolveTranslations()\n return {\n actionLabel: translate('sales.audit.document_addresses.update', 'Update document address'),\n resourceKind: 'sales.document_address',\n resourceId: result.id,\n parentResourceKind: after.documentKind === 'order' ? 'sales.order' : 'sales.quote',\n parentResourceId: after.documentId,\n tenantId: after.tenantId,\n organizationId: after.organizationId,\n snapshotBefore: before ?? null,\n snapshotAfter: after,\n payload: { undo: { before: before ?? null, after } satisfies DocumentAddressUndoPayload },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<DocumentAddressUndoPayload>(logEntry)\n const before = payload?.before\n if (!before) return\n ensureTenantScope(ctx, before.tenantId)\n ensureOrganizationScope(ctx, before.organizationId)\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const entity =\n (await findOneWithDecryption(em, SalesDocumentAddress, { id: before.id }, {}, { tenantId: before.tenantId, organizationId: before.organizationId })) ??\n em.create(SalesDocumentAddress, { id: before.id } as Partial<SalesDocumentAddress>)\n applyDocumentAddressSnapshot(em, entity, before)\n await em.persist(entity).flush()\n await emitDocumentAddressIndexSideEffects(ctx, 'updated', before)\n },\n}\n\nconst deleteDocumentAddress: CommandHandler<\n DocumentAddressDeleteInput,\n { ok: true; id: string }\n> = {\n id: 'sales.document-addresses.delete',\n async prepare(rawInput, ctx) {\n const parsed = documentAddressDeleteSchema.parse(rawInput)\n const em = ctx.container.resolve('em') as EntityManager\n const snapshot = await loadDocumentAddressSnapshot(em, parsed.id)\n return snapshot ? { before: snapshot } : {}\n },\n async execute(rawInput, ctx) {\n const input = documentAddressDeleteSchema.parse(rawInput)\n ensureTenantScope(ctx, input.tenantId)\n ensureOrganizationScope(ctx, input.organizationId)\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const entity = assertFound(\n await findOneWithDecryption(em, SalesDocumentAddress, { id: input.id }, {}, { tenantId: input.tenantId, organizationId: input.organizationId }),\n 'sales.document.address.not_found'\n )\n ensureSameScope(entity, input.organizationId, input.tenantId)\n const document = await requireDocument(em, input.documentKind, input.documentId, input.organizationId, input.tenantId)\n if (input.documentKind === 'order') {\n await assertAddressEditable(em, {\n organizationId: input.organizationId,\n tenantId: input.tenantId,\n status: (document as SalesOrder).status ?? null,\n })\n }\n await em.remove(entity).flush()\n return { ok: true, id: input.id }\n },\n buildLog: async ({ result, snapshots }) => {\n const before = snapshots.before as DocumentAddressSnapshot | undefined\n if (!before) return null\n const { translate } = await resolveTranslations()\n return {\n actionLabel: translate('sales.audit.document_addresses.delete', 'Remove document address'),\n resourceKind: 'sales.document_address',\n resourceId: result.id,\n parentResourceKind: before.documentKind === 'order' ? 'sales.order' : 'sales.quote',\n parentResourceId: before.documentId,\n tenantId: before.tenantId,\n organizationId: before.organizationId,\n snapshotBefore: before,\n payload: { undo: { before } satisfies DocumentAddressUndoPayload },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<DocumentAddressUndoPayload>(logEntry)\n const before = payload?.before\n if (!before) return\n ensureTenantScope(ctx, before.tenantId)\n ensureOrganizationScope(ctx, before.organizationId)\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const existing = await findOneWithDecryption(em, SalesDocumentAddress, { id: before.id }, {}, { tenantId: before.tenantId, organizationId: before.organizationId })\n const entity = existing ?? em.create(SalesDocumentAddress, { id: before.id } as Partial<SalesDocumentAddress>)\n applyDocumentAddressSnapshot(em, entity, before)\n await em.persist(entity).flush()\n await emitDocumentAddressIndexSideEffects(ctx, 'created', before)\n },\n}\n\nexport const documentAddressCommands = [createDocumentAddress, updateDocumentAddress, deleteDocumentAddress]\n\nregisterCommand(createDocumentAddress)\nregisterCommand(updateDocumentAddress)\nregisterCommand(deleteDocumentAddress)\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["// @ts-nocheck\n\nimport { registerCommand, type CommandHandler } from '@open-mercato/shared/lib/commands'\nimport { emitCrudSideEffects } from '@open-mercato/shared/lib/commands/helpers'\nimport type { DataEngine } from '@open-mercato/shared/lib/data/engine'\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport { CrudHttpError } from '@open-mercato/shared/lib/crud/errors'\nimport {\n documentAddressCreateSchema,\n documentAddressDeleteSchema,\n documentAddressUpdateSchema,\n type DocumentAddressCreateInput,\n type DocumentAddressDeleteInput,\n type DocumentAddressUpdateInput,\n} from '../data/validators'\nimport { SalesDocumentAddress, SalesOrder, SalesQuote } from '../data/entities'\nimport { ensureOrganizationScope, ensureSameScope, ensureTenantScope, assertFound, extractUndoPayload } from './shared'\nimport { loadSalesSettings } from './settings'\nimport { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'\nimport { findOneWithDecryption } from '@open-mercato/shared/lib/encryption/find'\nimport { E } from '#generated/entities.ids.generated'\n\nconst DOCUMENT_ADDRESS_ENTITY_TYPE = E.sales.sales_document_address\n\ntype DocumentAddressSnapshot = {\n id: string\n organizationId: string\n tenantId: string\n documentId: string\n documentKind: 'order' | 'quote'\n customerAddressId: string | null\n name: string | null\n purpose: string | null\n companyName: string | null\n addressLine1: string\n addressLine2: string | null\n buildingNumber: string | null\n flatNumber: string | null\n city: string | null\n region: string | null\n postalCode: string | null\n country: string | null\n latitude: number | null\n longitude: number | null\n}\n\ntype DocumentAddressUndoPayload = {\n before?: DocumentAddressSnapshot | null\n after?: DocumentAddressSnapshot | null\n}\n\nfunction snapshotDocumentAddress(entity: SalesDocumentAddress): DocumentAddressSnapshot {\n return {\n id: entity.id,\n organizationId: entity.organizationId,\n tenantId: entity.tenantId,\n documentId: entity.documentId,\n documentKind: entity.documentKind as 'order' | 'quote',\n customerAddressId: entity.customerAddressId ?? null,\n name: entity.name ?? null,\n purpose: entity.purpose ?? null,\n companyName: entity.companyName ?? null,\n addressLine1: entity.addressLine1,\n addressLine2: entity.addressLine2 ?? null,\n buildingNumber: entity.buildingNumber ?? null,\n flatNumber: entity.flatNumber ?? null,\n city: entity.city ?? null,\n region: entity.region ?? null,\n postalCode: entity.postalCode ?? null,\n country: entity.country ?? null,\n latitude: entity.latitude ?? null,\n longitude: entity.longitude ?? null,\n }\n}\n\nasync function loadDocumentAddressSnapshot(\n em: EntityManager,\n id: string\n): Promise<DocumentAddressSnapshot | null> {\n const entity = await findOneWithDecryption(em, SalesDocumentAddress, { id }, {})\n return entity ? snapshotDocumentAddress(entity) : null\n}\n\nfunction applyDocumentAddressSnapshot(em: EntityManager, entity: SalesDocumentAddress, snapshot: DocumentAddressSnapshot): void {\n entity.organizationId = snapshot.organizationId\n entity.tenantId = snapshot.tenantId\n entity.documentId = snapshot.documentId\n entity.documentKind = snapshot.documentKind\n entity.customerAddressId = snapshot.customerAddressId\n entity.name = snapshot.name\n entity.purpose = snapshot.purpose\n entity.companyName = snapshot.companyName\n entity.addressLine1 = snapshot.addressLine1\n entity.addressLine2 = snapshot.addressLine2\n entity.buildingNumber = snapshot.buildingNumber\n entity.flatNumber = snapshot.flatNumber\n entity.city = snapshot.city\n entity.region = snapshot.region\n entity.postalCode = snapshot.postalCode\n entity.country = snapshot.country\n entity.latitude = snapshot.latitude\n entity.longitude = snapshot.longitude\n entity.order = snapshot.documentKind === 'order' ? em.getReference(SalesOrder, snapshot.documentId) : null\n entity.quote = snapshot.documentKind === 'quote' ? em.getReference(SalesQuote, snapshot.documentId) : null\n}\n\nfunction assertDocumentAddressParent(entity: SalesDocumentAddress, input: { documentId: string; documentKind: 'order' | 'quote' }): void {\n if (entity.documentId !== input.documentId || entity.documentKind !== input.documentKind) {\n throw new CrudHttpError(404, { error: 'sales.document.address.not_found' })\n }\n}\n\nasync function emitDocumentAddressIndexSideEffects(\n ctx: { container: { resolve: (name: string) => unknown } },\n action: 'created' | 'updated' | 'deleted',\n snapshot: DocumentAddressSnapshot\n): Promise<void> {\n let dataEngine: DataEngine | null = null\n try {\n dataEngine = ctx.container.resolve('dataEngine') as DataEngine\n } catch {\n dataEngine = null\n }\n if (!dataEngine) return\n await emitCrudSideEffects({\n dataEngine,\n action,\n entity: snapshot,\n identifiers: {\n id: snapshot.id,\n organizationId: snapshot.organizationId,\n tenantId: snapshot.tenantId,\n },\n indexer: { entityType: DOCUMENT_ADDRESS_ENTITY_TYPE },\n })\n}\n\nasync function requireDocument(\n em: EntityManager,\n kind: 'order' | 'quote',\n id: string,\n organizationId: string,\n tenantId: string\n): Promise<SalesOrder | SalesQuote> {\n const repo = kind === 'order' ? SalesOrder : SalesQuote\n const doc = await findOneWithDecryption(em, repo, { id, organizationId, tenantId }, {}, { tenantId, organizationId })\n if (!doc) {\n throw new CrudHttpError(404, { error: 'sales.document.not_found' })\n }\n return doc\n}\n\nasync function assertAddressEditable(\n em: EntityManager,\n params: { organizationId: string; tenantId: string; status: string | null }\n): Promise<void> {\n const settings = await loadSalesSettings(em, {\n tenantId: params.tenantId,\n organizationId: params.organizationId,\n })\n const allowed = settings?.orderAddressEditableStatuses ?? null\n if (!Array.isArray(allowed)) return\n const { translate } = await resolveTranslations()\n if (allowed.length === 0) {\n throw new CrudHttpError(400, { error: translate('sales.orders.edit_addresses_blocked', 'Addresses cannot be changed for the current status.') })\n }\n if (!params.status || !allowed.includes(params.status)) {\n throw new CrudHttpError(400, { error: translate('sales.orders.edit_addresses_blocked', 'Addresses cannot be changed for the current status.') })\n }\n}\n\nconst createDocumentAddress: CommandHandler<DocumentAddressCreateInput, { id: string }> = {\n id: 'sales.document-addresses.create',\n async execute(rawInput, ctx) {\n const input = documentAddressCreateSchema.parse(rawInput)\n ensureTenantScope(ctx, input.tenantId)\n ensureOrganizationScope(ctx, input.organizationId)\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const document = await requireDocument(em, input.documentKind, input.documentId, input.organizationId, input.tenantId)\n if (input.documentKind === 'order') {\n await assertAddressEditable(em, {\n organizationId: input.organizationId,\n tenantId: input.tenantId,\n status: (document as SalesOrder).status ?? null,\n })\n }\n\n const entity = em.create(SalesDocumentAddress, {\n organizationId: input.organizationId,\n tenantId: input.tenantId,\n documentId: input.documentId,\n documentKind: input.documentKind,\n customerAddressId: input.customerAddressId ?? null,\n name: input.name ?? null,\n purpose: input.purpose ?? null,\n companyName: input.companyName ?? null,\n addressLine1: input.addressLine1,\n addressLine2: input.addressLine2 ?? null,\n buildingNumber: input.buildingNumber ?? null,\n flatNumber: input.flatNumber ?? null,\n city: input.city ?? null,\n region: input.region ?? null,\n postalCode: input.postalCode ?? null,\n country: input.country ?? null,\n latitude: input.latitude ?? null,\n longitude: input.longitude ?? null,\n order: input.documentKind === 'order' ? (document as SalesOrder) : null,\n quote: input.documentKind === 'quote' ? (document as SalesQuote) : null,\n })\n await em.persist(entity).flush()\n return { id: entity.id }\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n return result?.id ? loadDocumentAddressSnapshot(em, result.id) : null\n },\n buildLog: async ({ result, snapshots }) => {\n const after = snapshots.after as DocumentAddressSnapshot | undefined\n if (!after) return null\n const { translate } = await resolveTranslations()\n return {\n actionLabel: translate('sales.audit.document_addresses.create', 'Add document address'),\n resourceKind: 'sales.document_address',\n resourceId: result.id,\n parentResourceKind: after.documentKind === 'order' ? 'sales.order' : 'sales.quote',\n parentResourceId: after.documentId,\n tenantId: after.tenantId,\n organizationId: after.organizationId,\n snapshotAfter: after,\n payload: { undo: { after } satisfies DocumentAddressUndoPayload },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<DocumentAddressUndoPayload>(logEntry)\n const after = payload?.after\n if (!after) return\n ensureTenantScope(ctx, after.tenantId)\n ensureOrganizationScope(ctx, after.organizationId)\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const entity = await findOneWithDecryption(em, SalesDocumentAddress, { id: after.id }, {}, { tenantId: after.tenantId, organizationId: after.organizationId })\n if (!entity) return\n await em.remove(entity).flush()\n await emitDocumentAddressIndexSideEffects(ctx, 'deleted', after)\n },\n}\n\nconst updateDocumentAddress: CommandHandler<DocumentAddressUpdateInput, { id: string }> = {\n id: 'sales.document-addresses.update',\n async prepare(rawInput, ctx) {\n const parsed = documentAddressUpdateSchema.parse(rawInput)\n const em = ctx.container.resolve('em') as EntityManager\n const snapshot = await loadDocumentAddressSnapshot(em, parsed.id)\n return snapshot ? { before: snapshot } : {}\n },\n async execute(rawInput, ctx) {\n const input = documentAddressUpdateSchema.parse(rawInput)\n ensureTenantScope(ctx, input.tenantId)\n ensureOrganizationScope(ctx, input.organizationId)\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const entity = assertFound(\n await findOneWithDecryption(em, SalesDocumentAddress, { id: input.id }, {}, { tenantId: input.tenantId, organizationId: input.organizationId }),\n 'sales.document.address.not_found'\n )\n ensureSameScope(entity, input.organizationId, input.tenantId)\n assertDocumentAddressParent(entity, input)\n const document = await requireDocument(em, input.documentKind, input.documentId, input.organizationId, input.tenantId)\n if (input.documentKind === 'order') {\n await assertAddressEditable(em, {\n organizationId: input.organizationId,\n tenantId: input.tenantId,\n status: (document as SalesOrder).status ?? null,\n })\n }\n\n entity.documentId = input.documentId\n entity.documentKind = input.documentKind\n entity.customerAddressId = input.customerAddressId ?? null\n entity.name = input.name ?? null\n entity.purpose = input.purpose ?? null\n entity.companyName = input.companyName ?? null\n entity.addressLine1 = input.addressLine1\n entity.addressLine2 = input.addressLine2 ?? null\n entity.buildingNumber = input.buildingNumber ?? null\n entity.flatNumber = input.flatNumber ?? null\n entity.city = input.city ?? null\n entity.region = input.region ?? null\n entity.postalCode = input.postalCode ?? null\n entity.country = input.country ?? null\n entity.latitude = input.latitude ?? null\n entity.longitude = input.longitude ?? null\n\n await em.flush()\n return { id: entity.id }\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n return result?.id ? loadDocumentAddressSnapshot(em, result.id) : null\n },\n buildLog: async ({ result, snapshots }) => {\n const before = snapshots.before as DocumentAddressSnapshot | undefined\n const after = snapshots.after as DocumentAddressSnapshot | undefined\n if (!after) return null\n const { translate } = await resolveTranslations()\n return {\n actionLabel: translate('sales.audit.document_addresses.update', 'Update document address'),\n resourceKind: 'sales.document_address',\n resourceId: result.id,\n parentResourceKind: after.documentKind === 'order' ? 'sales.order' : 'sales.quote',\n parentResourceId: after.documentId,\n tenantId: after.tenantId,\n organizationId: after.organizationId,\n snapshotBefore: before ?? null,\n snapshotAfter: after,\n payload: { undo: { before: before ?? null, after } satisfies DocumentAddressUndoPayload },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<DocumentAddressUndoPayload>(logEntry)\n const before = payload?.before\n if (!before) return\n ensureTenantScope(ctx, before.tenantId)\n ensureOrganizationScope(ctx, before.organizationId)\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const entity =\n (await findOneWithDecryption(em, SalesDocumentAddress, { id: before.id }, {}, { tenantId: before.tenantId, organizationId: before.organizationId })) ??\n em.create(SalesDocumentAddress, { id: before.id } as Partial<SalesDocumentAddress>)\n applyDocumentAddressSnapshot(em, entity, before)\n await em.persist(entity).flush()\n await emitDocumentAddressIndexSideEffects(ctx, 'updated', before)\n },\n}\n\nconst deleteDocumentAddress: CommandHandler<\n DocumentAddressDeleteInput,\n { ok: true; id: string }\n> = {\n id: 'sales.document-addresses.delete',\n async prepare(rawInput, ctx) {\n const parsed = documentAddressDeleteSchema.parse(rawInput)\n const em = ctx.container.resolve('em') as EntityManager\n const snapshot = await loadDocumentAddressSnapshot(em, parsed.id)\n return snapshot ? { before: snapshot } : {}\n },\n async execute(rawInput, ctx) {\n const input = documentAddressDeleteSchema.parse(rawInput)\n ensureTenantScope(ctx, input.tenantId)\n ensureOrganizationScope(ctx, input.organizationId)\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const entity = assertFound(\n await findOneWithDecryption(em, SalesDocumentAddress, { id: input.id }, {}, { tenantId: input.tenantId, organizationId: input.organizationId }),\n 'sales.document.address.not_found'\n )\n ensureSameScope(entity, input.organizationId, input.tenantId)\n assertDocumentAddressParent(entity, input)\n const document = await requireDocument(em, input.documentKind, input.documentId, input.organizationId, input.tenantId)\n if (input.documentKind === 'order') {\n await assertAddressEditable(em, {\n organizationId: input.organizationId,\n tenantId: input.tenantId,\n status: (document as SalesOrder).status ?? null,\n })\n }\n await em.remove(entity).flush()\n return { ok: true, id: input.id }\n },\n buildLog: async ({ result, snapshots }) => {\n const before = snapshots.before as DocumentAddressSnapshot | undefined\n if (!before) return null\n const { translate } = await resolveTranslations()\n return {\n actionLabel: translate('sales.audit.document_addresses.delete', 'Remove document address'),\n resourceKind: 'sales.document_address',\n resourceId: result.id,\n parentResourceKind: before.documentKind === 'order' ? 'sales.order' : 'sales.quote',\n parentResourceId: before.documentId,\n tenantId: before.tenantId,\n organizationId: before.organizationId,\n snapshotBefore: before,\n payload: { undo: { before } satisfies DocumentAddressUndoPayload },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<DocumentAddressUndoPayload>(logEntry)\n const before = payload?.before\n if (!before) return\n ensureTenantScope(ctx, before.tenantId)\n ensureOrganizationScope(ctx, before.organizationId)\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const existing = await findOneWithDecryption(em, SalesDocumentAddress, { id: before.id }, {}, { tenantId: before.tenantId, organizationId: before.organizationId })\n const entity = existing ?? em.create(SalesDocumentAddress, { id: before.id } as Partial<SalesDocumentAddress>)\n applyDocumentAddressSnapshot(em, entity, before)\n await em.persist(entity).flush()\n await emitDocumentAddressIndexSideEffects(ctx, 'created', before)\n },\n}\n\nexport const documentAddressCommands = [createDocumentAddress, updateDocumentAddress, deleteDocumentAddress]\n\nregisterCommand(createDocumentAddress)\nregisterCommand(updateDocumentAddress)\nregisterCommand(deleteDocumentAddress)\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -24,7 +24,10 @@ import {
|
|
|
24
24
|
ensureTenantScope,
|
|
25
25
|
explicitStaffCommandScope,
|
|
26
26
|
extractUndoPayload,
|
|
27
|
-
requireTeamMember
|
|
27
|
+
requireTeamMember,
|
|
28
|
+
scopedStaffSnapshotWhere,
|
|
29
|
+
staffSnapshotScopeFromContext,
|
|
30
|
+
staffSnapshotScopeFromSnapshot
|
|
28
31
|
} from "./shared.js";
|
|
29
32
|
import { resolveRedoSnapshot } from "@open-mercato/shared/lib/commands/redo";
|
|
30
33
|
import { E } from "../../../generated/entities.ids.generated.js";
|
|
@@ -36,8 +39,8 @@ import {
|
|
|
36
39
|
const activityCrudIndexer = {
|
|
37
40
|
entityType: E.staff.staff_team_member_activity
|
|
38
41
|
};
|
|
39
|
-
async function loadActivitySnapshot(em, id) {
|
|
40
|
-
const activity = await em.findOne(StaffTeamMemberActivity,
|
|
42
|
+
async function loadActivitySnapshot(em, id, scope) {
|
|
43
|
+
const activity = await em.findOne(StaffTeamMemberActivity, scopedStaffSnapshotWhere(id, scope));
|
|
41
44
|
if (!activity) return null;
|
|
42
45
|
const custom = await loadCustomFieldSnapshot(em, {
|
|
43
46
|
entityId: E.staff.staff_team_member_activity,
|
|
@@ -126,7 +129,7 @@ const createActivityCommand = {
|
|
|
126
129
|
},
|
|
127
130
|
captureAfter: async (_input, result, ctx) => {
|
|
128
131
|
const em = ctx.container.resolve("em").fork();
|
|
129
|
-
return await loadActivitySnapshot(em, result.activityId);
|
|
132
|
+
return await loadActivitySnapshot(em, result.activityId, staffSnapshotScopeFromContext(ctx));
|
|
130
133
|
},
|
|
131
134
|
buildLog: async ({ result, snapshots }) => {
|
|
132
135
|
const { translate } = await resolveTranslations();
|
|
@@ -148,10 +151,15 @@ const createActivityCommand = {
|
|
|
148
151
|
};
|
|
149
152
|
},
|
|
150
153
|
undo: async ({ logEntry, ctx }) => {
|
|
151
|
-
const
|
|
154
|
+
const payload = extractUndoPayload(logEntry);
|
|
155
|
+
const after = payload?.after;
|
|
156
|
+
const activityId = after?.activity.id ?? logEntry?.resourceId ?? null;
|
|
152
157
|
if (!activityId) return;
|
|
153
158
|
const em = ctx.container.resolve("em").fork();
|
|
154
|
-
const existing = await em.findOne(
|
|
159
|
+
const existing = await em.findOne(
|
|
160
|
+
StaffTeamMemberActivity,
|
|
161
|
+
scopedStaffSnapshotWhere(activityId, staffSnapshotScopeFromSnapshot(after?.activity))
|
|
162
|
+
);
|
|
155
163
|
if (existing) {
|
|
156
164
|
em.remove(existing);
|
|
157
165
|
await em.flush();
|
|
@@ -163,13 +171,14 @@ const createActivityCommand = {
|
|
|
163
171
|
throw new CrudHttpError(400, { error: "[internal] redo snapshot unavailable for activity create" });
|
|
164
172
|
}
|
|
165
173
|
const em = ctx.container.resolve("em").fork();
|
|
174
|
+
const snapshotScope = staffSnapshotScopeFromSnapshot(after.activity);
|
|
166
175
|
const member = await requireTeamMember(
|
|
167
176
|
em,
|
|
168
177
|
after.activity.memberId,
|
|
169
178
|
explicitStaffCommandScope(after.activity.tenantId, after.activity.organizationId),
|
|
170
179
|
"Team member not found"
|
|
171
180
|
);
|
|
172
|
-
let activity = await em.findOne(StaffTeamMemberActivity,
|
|
181
|
+
let activity = await em.findOne(StaffTeamMemberActivity, scopedStaffSnapshotWhere(after.activity.id, snapshotScope));
|
|
173
182
|
if (!activity) {
|
|
174
183
|
activity = em.create(StaffTeamMemberActivity, {
|
|
175
184
|
id: after.activity.id,
|
|
@@ -220,7 +229,7 @@ const updateActivityCommand = {
|
|
|
220
229
|
async prepare(rawInput, ctx) {
|
|
221
230
|
const parsed = staffTeamMemberActivityUpdateSchema.parse(rawInput);
|
|
222
231
|
const em = ctx.container.resolve("em");
|
|
223
|
-
const snapshot = await loadActivitySnapshot(em, parsed.id);
|
|
232
|
+
const snapshot = await loadActivitySnapshot(em, parsed.id, staffSnapshotScopeFromContext(ctx));
|
|
224
233
|
return snapshot ? { before: snapshot } : {};
|
|
225
234
|
},
|
|
226
235
|
async execute(rawInput, ctx) {
|
|
@@ -266,7 +275,7 @@ const updateActivityCommand = {
|
|
|
266
275
|
},
|
|
267
276
|
captureAfter: async (_input, result, ctx) => {
|
|
268
277
|
const em = ctx.container.resolve("em").fork();
|
|
269
|
-
return await loadActivitySnapshot(em, result.activityId);
|
|
278
|
+
return await loadActivitySnapshot(em, result.activityId, staffSnapshotScopeFromContext(ctx));
|
|
270
279
|
},
|
|
271
280
|
buildLog: async ({ snapshots }) => {
|
|
272
281
|
const { translate } = await resolveTranslations();
|
|
@@ -314,7 +323,8 @@ const updateActivityCommand = {
|
|
|
314
323
|
const before = payload?.before;
|
|
315
324
|
if (!before) return;
|
|
316
325
|
const em = ctx.container.resolve("em").fork();
|
|
317
|
-
|
|
326
|
+
const snapshotScope = staffSnapshotScopeFromSnapshot(before.activity);
|
|
327
|
+
let activity = await em.findOne(StaffTeamMemberActivity, scopedStaffSnapshotWhere(before.activity.id, snapshotScope));
|
|
318
328
|
const member = await requireTeamMember(
|
|
319
329
|
em,
|
|
320
330
|
before.activity.memberId,
|
|
@@ -381,7 +391,7 @@ const deleteActivityCommand = {
|
|
|
381
391
|
async prepare(input, ctx) {
|
|
382
392
|
const id = requireId(input, "Activity id required");
|
|
383
393
|
const em = ctx.container.resolve("em");
|
|
384
|
-
const snapshot = await loadActivitySnapshot(em, id);
|
|
394
|
+
const snapshot = await loadActivitySnapshot(em, id, staffSnapshotScopeFromContext(ctx));
|
|
385
395
|
return snapshot ? { before: snapshot } : {};
|
|
386
396
|
},
|
|
387
397
|
async execute(input, ctx) {
|
|
@@ -437,13 +447,14 @@ const deleteActivityCommand = {
|
|
|
437
447
|
const before = payload?.before;
|
|
438
448
|
if (!before) return;
|
|
439
449
|
const em = ctx.container.resolve("em").fork();
|
|
450
|
+
const snapshotScope = staffSnapshotScopeFromSnapshot(before.activity);
|
|
440
451
|
const member = await requireTeamMember(
|
|
441
452
|
em,
|
|
442
453
|
before.activity.memberId,
|
|
443
454
|
explicitStaffCommandScope(before.activity.tenantId, before.activity.organizationId),
|
|
444
455
|
"Team member not found"
|
|
445
456
|
);
|
|
446
|
-
let activity = await em.findOne(StaffTeamMemberActivity,
|
|
457
|
+
let activity = await em.findOne(StaffTeamMemberActivity, scopedStaffSnapshotWhere(before.activity.id, snapshotScope));
|
|
447
458
|
if (!activity) {
|
|
448
459
|
activity = em.create(StaffTeamMemberActivity, {
|
|
449
460
|
id: before.activity.id,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/modules/staff/commands/activities.ts"],
|
|
4
|
-
"sourcesContent": ["import { registerCommand } from '@open-mercato/shared/lib/commands'\nimport type { CommandHandler, CommandRuntimeContext } from '@open-mercato/shared/lib/commands'\nimport {\n emitCrudSideEffects,\n emitCrudUndoSideEffects,\n buildChanges,\n requireId,\n parseWithCustomFields,\n setCustomFieldsIfAny,\n normalizeAuthorUserId,\n} from '@open-mercato/shared/lib/commands/helpers'\nimport type { DataEngine } from '@open-mercato/shared/lib/data/engine'\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 type { CrudIndexerConfig } from '@open-mercato/shared/lib/crud/types'\nimport { StaffTeamMemberActivity } from '../data/entities'\nimport {\n staffTeamMemberActivityCreateSchema,\n staffTeamMemberActivityUpdateSchema,\n type StaffTeamMemberActivityCreateInput,\n type StaffTeamMemberActivityUpdateInput,\n} from '../data/validators'\nimport { staffTeamMemberActivityCrudEvents } from '../lib/crud'\nimport {\n applyScopeToWhere,\n commandActorScope,\n commandInputScope,\n ensureOrganizationScope,\n ensureTenantScope,\n explicitStaffCommandScope,\n extractUndoPayload,\n requireTeamMember,\n} from './shared'\nimport { resolveRedoSnapshot } from '@open-mercato/shared/lib/commands/redo'\nimport { E } from '#generated/entities.ids.generated'\nimport {\n loadCustomFieldSnapshot,\n diffCustomFieldChanges,\n buildCustomFieldResetMap,\n type CustomFieldChangeSet,\n} from '@open-mercato/shared/lib/commands/customFieldSnapshots'\n\nconst activityCrudIndexer: CrudIndexerConfig<StaffTeamMemberActivity> = {\n entityType: E.staff.staff_team_member_activity,\n}\n\ntype ActivitySnapshot = {\n activity: {\n id: string\n organizationId: string\n tenantId: string\n memberId: string\n activityType: string\n subject: string | null\n body: string | null\n occurredAt: Date | null\n authorUserId: string | null\n appearanceIcon: string | null\n appearanceColor: string | null\n }\n custom?: Record<string, unknown>\n}\n\ntype ActivityUndoPayload = {\n before?: ActivitySnapshot | null\n after?: ActivitySnapshot | null\n}\n\ntype ActivityChangeMap = Record<string, { from: unknown; to: unknown }> & {\n custom?: CustomFieldChangeSet\n}\n\nasync function loadActivitySnapshot(em: EntityManager, id: string): Promise<ActivitySnapshot | null> {\n const activity = await em.findOne(StaffTeamMemberActivity, { id })\n if (!activity) return null\n const custom = await loadCustomFieldSnapshot(em, {\n entityId: E.staff.staff_team_member_activity,\n recordId: activity.id,\n tenantId: activity.tenantId,\n organizationId: activity.organizationId,\n })\n return {\n activity: {\n id: activity.id,\n organizationId: activity.organizationId,\n tenantId: activity.tenantId,\n memberId: typeof activity.member === 'string' ? activity.member : activity.member.id,\n activityType: activity.activityType,\n subject: activity.subject ?? null,\n body: activity.body ?? null,\n occurredAt: activity.occurredAt ?? null,\n authorUserId: activity.authorUserId ?? null,\n appearanceIcon: activity.appearanceIcon ?? null,\n appearanceColor: activity.appearanceColor ?? null,\n },\n custom,\n }\n}\n\nasync function setActivityCustomFields(\n ctx: CommandRuntimeContext,\n activityId: string,\n organizationId: string,\n tenantId: string,\n values: Record<string, unknown>\n) {\n if (!values || !Object.keys(values).length) return\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await setCustomFieldsIfAny({\n dataEngine: de,\n entityId: E.staff.staff_team_member_activity,\n recordId: activityId,\n organizationId,\n tenantId,\n values,\n notify: false,\n })\n}\n\nconst createActivityCommand: CommandHandler<\n StaffTeamMemberActivityCreateInput,\n { activityId: string; authorUserId: string | null }\n> = {\n id: 'staff.team-member-activities.create',\n async execute(rawInput, ctx) {\n const { parsed, custom } = parseWithCustomFields(staffTeamMemberActivityCreateSchema, rawInput)\n ensureTenantScope(ctx, parsed.tenantId)\n ensureOrganizationScope(ctx, parsed.organizationId)\n const scope = commandInputScope(ctx, parsed.tenantId, parsed.organizationId)\n const normalizedAuthor = normalizeAuthorUserId(parsed.authorUserId, ctx.auth)\n\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const member = await requireTeamMember(\n em,\n parsed.entityId,\n scope,\n 'Team member not found',\n )\n ensureTenantScope(ctx, member.tenantId)\n ensureOrganizationScope(ctx, member.organizationId)\n\n const activity = em.create(StaffTeamMemberActivity, {\n organizationId: parsed.organizationId,\n tenantId: parsed.tenantId,\n member,\n activityType: parsed.activityType,\n subject: parsed.subject ?? null,\n body: parsed.body ?? null,\n occurredAt: parsed.occurredAt ?? null,\n authorUserId: normalizedAuthor,\n appearanceIcon: parsed.appearanceIcon ?? null,\n appearanceColor: parsed.appearanceColor ?? null,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n em.persist(activity)\n await em.flush()\n\n await setActivityCustomFields(ctx, activity.id, parsed.organizationId, parsed.tenantId, custom)\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await emitCrudSideEffects({\n dataEngine: de,\n action: 'created',\n entity: activity,\n identifiers: {\n id: activity.id,\n organizationId: activity.organizationId,\n tenantId: activity.tenantId,\n },\n events: staffTeamMemberActivityCrudEvents,\n indexer: activityCrudIndexer,\n })\n\n return { activityId: activity.id, authorUserId: activity.authorUserId ?? null }\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n return await loadActivitySnapshot(em, result.activityId)\n },\n buildLog: async ({ result, snapshots }) => {\n const { translate } = await resolveTranslations()\n const snapshot = snapshots.after as ActivitySnapshot | undefined\n return {\n actionLabel: translate('staff.audit.teamMemberActivities.create', 'Create activity'),\n resourceKind: 'staff.team_member_activity',\n resourceId: result.activityId,\n parentResourceKind: 'staff.teamMember',\n parentResourceId: snapshot?.activity?.memberId ?? null,\n tenantId: snapshot?.activity.tenantId ?? null,\n organizationId: snapshot?.activity.organizationId ?? null,\n snapshotAfter: snapshot ?? null,\n payload: {\n undo: {\n after: snapshot ?? null,\n } satisfies ActivityUndoPayload,\n },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const activityId = logEntry?.resourceId ?? null\n if (!activityId) return\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const existing = await em.findOne(StaffTeamMemberActivity, { id: activityId })\n if (existing) {\n em.remove(existing)\n await em.flush()\n }\n },\n redo: async ({ logEntry, ctx }) => {\n const after = resolveRedoSnapshot<ActivitySnapshot>(logEntry)\n if (!after) {\n throw new CrudHttpError(400, { error: '[internal] redo snapshot unavailable for activity create' })\n }\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const member = await requireTeamMember(\n em,\n after.activity.memberId,\n explicitStaffCommandScope(after.activity.tenantId, after.activity.organizationId),\n 'Team member not found',\n )\n let activity = await em.findOne(StaffTeamMemberActivity, { id: after.activity.id })\n if (!activity) {\n activity = em.create(StaffTeamMemberActivity, {\n id: after.activity.id,\n organizationId: after.activity.organizationId,\n tenantId: after.activity.tenantId,\n member,\n activityType: after.activity.activityType,\n subject: after.activity.subject,\n body: after.activity.body,\n occurredAt: after.activity.occurredAt ?? null,\n authorUserId: after.activity.authorUserId,\n appearanceIcon: after.activity.appearanceIcon,\n appearanceColor: after.activity.appearanceColor,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n em.persist(activity)\n } else {\n activity.member = member\n activity.activityType = after.activity.activityType\n activity.subject = after.activity.subject\n activity.body = after.activity.body\n activity.occurredAt = after.activity.occurredAt ?? null\n activity.authorUserId = after.activity.authorUserId\n activity.appearanceIcon = after.activity.appearanceIcon\n activity.appearanceColor = after.activity.appearanceColor\n }\n await em.flush()\n\n await setActivityCustomFields(ctx, activity.id, activity.organizationId, activity.tenantId, after.custom ?? {})\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await emitCrudSideEffects({\n dataEngine: de,\n action: 'created',\n entity: activity,\n identifiers: {\n id: activity.id,\n organizationId: activity.organizationId,\n tenantId: activity.tenantId,\n },\n events: staffTeamMemberActivityCrudEvents,\n indexer: activityCrudIndexer,\n })\n\n return { activityId: activity.id, authorUserId: activity.authorUserId ?? null }\n },\n}\n\nconst updateActivityCommand: CommandHandler<StaffTeamMemberActivityUpdateInput, { activityId: string }> = {\n id: 'staff.team-member-activities.update',\n async prepare(rawInput, ctx) {\n const parsed = staffTeamMemberActivityUpdateSchema.parse(rawInput)\n const em = (ctx.container.resolve('em') as EntityManager)\n const snapshot = await loadActivitySnapshot(em, parsed.id)\n return snapshot ? { before: snapshot } : {}\n },\n async execute(rawInput, ctx) {\n const { parsed, custom } = parseWithCustomFields(staffTeamMemberActivityUpdateSchema, rawInput)\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const scope = commandActorScope(ctx)\n const activity = await em.findOne(\n StaffTeamMemberActivity,\n applyScopeToWhere<StaffTeamMemberActivity>({ id: parsed.id }, scope),\n )\n if (!activity) throw new CrudHttpError(404, { error: 'Activity not found' })\n ensureTenantScope(ctx, activity.tenantId)\n ensureOrganizationScope(ctx, activity.organizationId)\n\n if (parsed.entityId !== undefined) {\n const member = await requireTeamMember(em, parsed.entityId, scope, 'Team member not found')\n ensureTenantScope(ctx, member.tenantId)\n ensureOrganizationScope(ctx, member.organizationId)\n activity.member = member\n }\n if (parsed.activityType !== undefined) activity.activityType = parsed.activityType\n if (parsed.subject !== undefined) activity.subject = parsed.subject ?? null\n if (parsed.body !== undefined) activity.body = parsed.body ?? null\n if (parsed.occurredAt !== undefined) activity.occurredAt = parsed.occurredAt ?? null\n if (parsed.authorUserId !== undefined) activity.authorUserId = parsed.authorUserId ?? null\n if (parsed.appearanceIcon !== undefined) activity.appearanceIcon = parsed.appearanceIcon ?? null\n if (parsed.appearanceColor !== undefined) activity.appearanceColor = parsed.appearanceColor ?? null\n\n await em.flush()\n\n await setActivityCustomFields(ctx, activity.id, activity.organizationId, activity.tenantId, custom)\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await emitCrudSideEffects({\n dataEngine: de,\n action: 'updated',\n entity: activity,\n identifiers: {\n id: activity.id,\n organizationId: activity.organizationId,\n tenantId: activity.tenantId,\n },\n events: staffTeamMemberActivityCrudEvents,\n indexer: activityCrudIndexer,\n })\n\n return { activityId: activity.id }\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n return await loadActivitySnapshot(em, result.activityId)\n },\n buildLog: async ({ snapshots }) => {\n const { translate } = await resolveTranslations()\n const before = snapshots.before as ActivitySnapshot | undefined\n if (!before) return null\n const afterSnapshot = snapshots.after as ActivitySnapshot | undefined\n const changeKeys: readonly string[] = [\n 'memberId',\n 'activityType',\n 'subject',\n 'body',\n 'occurredAt',\n 'authorUserId',\n 'appearanceIcon',\n 'appearanceColor',\n ]\n const changes: ActivityChangeMap =\n afterSnapshot && before\n ? buildChanges(\n before.activity as Record<string, unknown>,\n afterSnapshot.activity as Record<string, unknown>,\n changeKeys\n )\n : {}\n const customChanges = diffCustomFieldChanges(before.custom, afterSnapshot?.custom)\n if (Object.keys(customChanges).length) changes.custom = customChanges\n return {\n actionLabel: translate('staff.audit.teamMemberActivities.update', 'Update activity'),\n resourceKind: 'staff.team_member_activity',\n resourceId: before.activity.id,\n parentResourceKind: 'staff.teamMember',\n parentResourceId: before.activity.memberId ?? null,\n tenantId: before.activity.tenantId,\n organizationId: before.activity.organizationId,\n snapshotBefore: before,\n snapshotAfter: afterSnapshot ?? null,\n changes,\n payload: {\n undo: {\n before,\n after: afterSnapshot ?? null,\n } satisfies ActivityUndoPayload,\n },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<ActivityUndoPayload>(logEntry)\n const before = payload?.before\n if (!before) return\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n let activity = await em.findOne(StaffTeamMemberActivity, { id: before.activity.id })\n const member = await requireTeamMember(\n em,\n before.activity.memberId,\n explicitStaffCommandScope(before.activity.tenantId, before.activity.organizationId),\n 'Team member not found',\n )\n\n if (!activity) {\n activity = em.create(StaffTeamMemberActivity, {\n id: before.activity.id,\n organizationId: before.activity.organizationId,\n tenantId: before.activity.tenantId,\n member,\n activityType: before.activity.activityType,\n subject: before.activity.subject,\n body: before.activity.body,\n occurredAt: before.activity.occurredAt ?? null,\n authorUserId: before.activity.authorUserId,\n appearanceIcon: before.activity.appearanceIcon,\n appearanceColor: before.activity.appearanceColor,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n em.persist(activity)\n } else {\n activity.member = member\n activity.activityType = before.activity.activityType\n activity.subject = before.activity.subject\n activity.body = before.activity.body\n activity.occurredAt = before.activity.occurredAt ?? null\n activity.authorUserId = before.activity.authorUserId\n activity.appearanceIcon = before.activity.appearanceIcon\n activity.appearanceColor = before.activity.appearanceColor\n }\n await em.flush()\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await emitCrudUndoSideEffects({\n dataEngine: de,\n action: 'updated',\n entity: activity,\n identifiers: {\n id: activity.id,\n organizationId: activity.organizationId,\n tenantId: activity.tenantId,\n },\n events: staffTeamMemberActivityCrudEvents,\n indexer: activityCrudIndexer,\n })\n\n const resetValues = buildCustomFieldResetMap(before.custom, payload?.after?.custom)\n if (Object.keys(resetValues).length) {\n await setCustomFieldsIfAny({\n dataEngine: de,\n entityId: E.staff.staff_team_member_activity,\n recordId: activity.id,\n organizationId: activity.organizationId,\n tenantId: activity.tenantId,\n values: resetValues,\n notify: false,\n })\n }\n },\n}\n\nconst deleteActivityCommand: CommandHandler<{ body?: Record<string, unknown>; query?: Record<string, unknown> }, { activityId: string }> =\n {\n id: 'staff.team-member-activities.delete',\n async prepare(input, ctx) {\n const id = requireId(input, 'Activity id required')\n const em = (ctx.container.resolve('em') as EntityManager)\n const snapshot = await loadActivitySnapshot(em, id)\n return snapshot ? { before: snapshot } : {}\n },\n async execute(input, ctx) {\n const id = requireId(input, 'Activity id required')\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const scope = commandActorScope(ctx)\n const activity = await em.findOne(\n StaffTeamMemberActivity,\n applyScopeToWhere<StaffTeamMemberActivity>({ id }, scope),\n )\n if (!activity) throw new CrudHttpError(404, { error: 'Activity not found' })\n ensureTenantScope(ctx, activity.tenantId)\n ensureOrganizationScope(ctx, activity.organizationId)\n em.remove(activity)\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: activity,\n identifiers: {\n id: activity.id,\n organizationId: activity.organizationId,\n tenantId: activity.tenantId,\n },\n events: staffTeamMemberActivityCrudEvents,\n indexer: activityCrudIndexer,\n })\n return { activityId: activity.id }\n },\n buildLog: async ({ snapshots }) => {\n const before = snapshots.before as ActivitySnapshot | undefined\n if (!before) return null\n const { translate } = await resolveTranslations()\n return {\n actionLabel: translate('staff.audit.teamMemberActivities.delete', 'Delete activity'),\n resourceKind: 'staff.team_member_activity',\n resourceId: before.activity.id,\n parentResourceKind: 'staff.teamMember',\n parentResourceId: before.activity.memberId ?? null,\n tenantId: before.activity.tenantId,\n organizationId: before.activity.organizationId,\n snapshotBefore: before,\n payload: {\n undo: {\n before,\n } satisfies ActivityUndoPayload,\n },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<ActivityUndoPayload>(logEntry)\n const before = payload?.before\n if (!before) return\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const member = await requireTeamMember(\n em,\n before.activity.memberId,\n explicitStaffCommandScope(before.activity.tenantId, before.activity.organizationId),\n 'Team member not found',\n )\n let activity = await em.findOne(StaffTeamMemberActivity, { id: before.activity.id })\n if (!activity) {\n activity = em.create(StaffTeamMemberActivity, {\n id: before.activity.id,\n organizationId: before.activity.organizationId,\n tenantId: before.activity.tenantId,\n member,\n activityType: before.activity.activityType,\n subject: before.activity.subject,\n body: before.activity.body,\n occurredAt: before.activity.occurredAt ?? null,\n authorUserId: before.activity.authorUserId,\n appearanceIcon: before.activity.appearanceIcon,\n appearanceColor: before.activity.appearanceColor,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n em.persist(activity)\n } else {\n activity.member = member\n activity.activityType = before.activity.activityType\n activity.subject = before.activity.subject\n activity.body = before.activity.body\n activity.occurredAt = before.activity.occurredAt ?? null\n activity.authorUserId = before.activity.authorUserId\n activity.appearanceIcon = before.activity.appearanceIcon\n activity.appearanceColor = before.activity.appearanceColor\n }\n await em.flush()\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await emitCrudUndoSideEffects({\n dataEngine: de,\n action: 'created',\n entity: activity,\n identifiers: {\n id: activity.id,\n organizationId: activity.organizationId,\n tenantId: activity.tenantId,\n },\n events: staffTeamMemberActivityCrudEvents,\n indexer: activityCrudIndexer,\n })\n\n const resetValues = buildCustomFieldResetMap(before.custom, undefined)\n if (Object.keys(resetValues).length) {\n await setCustomFieldsIfAny({\n dataEngine: de,\n entityId: E.staff.staff_team_member_activity,\n recordId: activity.id,\n organizationId: activity.organizationId,\n tenantId: activity.tenantId,\n values: resetValues,\n notify: false,\n })\n }\n },\n }\n\nregisterCommand(createActivityCommand)\nregisterCommand(updateActivityCommand)\nregisterCommand(deleteActivityCommand)\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { registerCommand } from '@open-mercato/shared/lib/commands'\nimport type { CommandHandler, CommandRuntimeContext } from '@open-mercato/shared/lib/commands'\nimport {\n emitCrudSideEffects,\n emitCrudUndoSideEffects,\n buildChanges,\n requireId,\n parseWithCustomFields,\n setCustomFieldsIfAny,\n normalizeAuthorUserId,\n} from '@open-mercato/shared/lib/commands/helpers'\nimport type { DataEngine } from '@open-mercato/shared/lib/data/engine'\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 type { CrudIndexerConfig } from '@open-mercato/shared/lib/crud/types'\nimport { StaffTeamMemberActivity } from '../data/entities'\nimport {\n staffTeamMemberActivityCreateSchema,\n staffTeamMemberActivityUpdateSchema,\n type StaffTeamMemberActivityCreateInput,\n type StaffTeamMemberActivityUpdateInput,\n} from '../data/validators'\nimport { staffTeamMemberActivityCrudEvents } from '../lib/crud'\nimport {\n applyScopeToWhere,\n commandActorScope,\n commandInputScope,\n ensureOrganizationScope,\n ensureTenantScope,\n explicitStaffCommandScope,\n extractUndoPayload,\n requireTeamMember,\n scopedStaffSnapshotWhere,\n staffSnapshotScopeFromContext,\n staffSnapshotScopeFromSnapshot,\n type StaffSnapshotScope,\n} from './shared'\nimport { resolveRedoSnapshot } from '@open-mercato/shared/lib/commands/redo'\nimport { E } from '#generated/entities.ids.generated'\nimport {\n loadCustomFieldSnapshot,\n diffCustomFieldChanges,\n buildCustomFieldResetMap,\n type CustomFieldChangeSet,\n} from '@open-mercato/shared/lib/commands/customFieldSnapshots'\n\nconst activityCrudIndexer: CrudIndexerConfig<StaffTeamMemberActivity> = {\n entityType: E.staff.staff_team_member_activity,\n}\n\ntype ActivitySnapshot = {\n activity: {\n id: string\n organizationId: string\n tenantId: string\n memberId: string\n activityType: string\n subject: string | null\n body: string | null\n occurredAt: Date | null\n authorUserId: string | null\n appearanceIcon: string | null\n appearanceColor: string | null\n }\n custom?: Record<string, unknown>\n}\n\ntype ActivityUndoPayload = {\n before?: ActivitySnapshot | null\n after?: ActivitySnapshot | null\n}\n\ntype ActivityChangeMap = Record<string, { from: unknown; to: unknown }> & {\n custom?: CustomFieldChangeSet\n}\n\nasync function loadActivitySnapshot(em: EntityManager, id: string, scope?: StaffSnapshotScope | null): Promise<ActivitySnapshot | null> {\n const activity = await em.findOne(StaffTeamMemberActivity, scopedStaffSnapshotWhere(id, scope))\n if (!activity) return null\n const custom = await loadCustomFieldSnapshot(em, {\n entityId: E.staff.staff_team_member_activity,\n recordId: activity.id,\n tenantId: activity.tenantId,\n organizationId: activity.organizationId,\n })\n return {\n activity: {\n id: activity.id,\n organizationId: activity.organizationId,\n tenantId: activity.tenantId,\n memberId: typeof activity.member === 'string' ? activity.member : activity.member.id,\n activityType: activity.activityType,\n subject: activity.subject ?? null,\n body: activity.body ?? null,\n occurredAt: activity.occurredAt ?? null,\n authorUserId: activity.authorUserId ?? null,\n appearanceIcon: activity.appearanceIcon ?? null,\n appearanceColor: activity.appearanceColor ?? null,\n },\n custom,\n }\n}\n\nasync function setActivityCustomFields(\n ctx: CommandRuntimeContext,\n activityId: string,\n organizationId: string,\n tenantId: string,\n values: Record<string, unknown>\n) {\n if (!values || !Object.keys(values).length) return\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await setCustomFieldsIfAny({\n dataEngine: de,\n entityId: E.staff.staff_team_member_activity,\n recordId: activityId,\n organizationId,\n tenantId,\n values,\n notify: false,\n })\n}\n\nconst createActivityCommand: CommandHandler<\n StaffTeamMemberActivityCreateInput,\n { activityId: string; authorUserId: string | null }\n> = {\n id: 'staff.team-member-activities.create',\n async execute(rawInput, ctx) {\n const { parsed, custom } = parseWithCustomFields(staffTeamMemberActivityCreateSchema, rawInput)\n ensureTenantScope(ctx, parsed.tenantId)\n ensureOrganizationScope(ctx, parsed.organizationId)\n const scope = commandInputScope(ctx, parsed.tenantId, parsed.organizationId)\n const normalizedAuthor = normalizeAuthorUserId(parsed.authorUserId, ctx.auth)\n\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const member = await requireTeamMember(\n em,\n parsed.entityId,\n scope,\n 'Team member not found',\n )\n ensureTenantScope(ctx, member.tenantId)\n ensureOrganizationScope(ctx, member.organizationId)\n\n const activity = em.create(StaffTeamMemberActivity, {\n organizationId: parsed.organizationId,\n tenantId: parsed.tenantId,\n member,\n activityType: parsed.activityType,\n subject: parsed.subject ?? null,\n body: parsed.body ?? null,\n occurredAt: parsed.occurredAt ?? null,\n authorUserId: normalizedAuthor,\n appearanceIcon: parsed.appearanceIcon ?? null,\n appearanceColor: parsed.appearanceColor ?? null,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n em.persist(activity)\n await em.flush()\n\n await setActivityCustomFields(ctx, activity.id, parsed.organizationId, parsed.tenantId, custom)\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await emitCrudSideEffects({\n dataEngine: de,\n action: 'created',\n entity: activity,\n identifiers: {\n id: activity.id,\n organizationId: activity.organizationId,\n tenantId: activity.tenantId,\n },\n events: staffTeamMemberActivityCrudEvents,\n indexer: activityCrudIndexer,\n })\n\n return { activityId: activity.id, authorUserId: activity.authorUserId ?? null }\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n return await loadActivitySnapshot(em, result.activityId, staffSnapshotScopeFromContext(ctx))\n },\n buildLog: async ({ result, snapshots }) => {\n const { translate } = await resolveTranslations()\n const snapshot = snapshots.after as ActivitySnapshot | undefined\n return {\n actionLabel: translate('staff.audit.teamMemberActivities.create', 'Create activity'),\n resourceKind: 'staff.team_member_activity',\n resourceId: result.activityId,\n parentResourceKind: 'staff.teamMember',\n parentResourceId: snapshot?.activity?.memberId ?? null,\n tenantId: snapshot?.activity.tenantId ?? null,\n organizationId: snapshot?.activity.organizationId ?? null,\n snapshotAfter: snapshot ?? null,\n payload: {\n undo: {\n after: snapshot ?? null,\n } satisfies ActivityUndoPayload,\n },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<ActivityUndoPayload>(logEntry)\n const after = payload?.after\n const activityId = after?.activity.id ?? logEntry?.resourceId ?? null\n if (!activityId) return\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const existing = await em.findOne(\n StaffTeamMemberActivity,\n scopedStaffSnapshotWhere(activityId, staffSnapshotScopeFromSnapshot(after?.activity)),\n )\n if (existing) {\n em.remove(existing)\n await em.flush()\n }\n },\n redo: async ({ logEntry, ctx }) => {\n const after = resolveRedoSnapshot<ActivitySnapshot>(logEntry)\n if (!after) {\n throw new CrudHttpError(400, { error: '[internal] redo snapshot unavailable for activity create' })\n }\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const snapshotScope = staffSnapshotScopeFromSnapshot(after.activity)\n const member = await requireTeamMember(\n em,\n after.activity.memberId,\n explicitStaffCommandScope(after.activity.tenantId, after.activity.organizationId),\n 'Team member not found',\n )\n let activity = await em.findOne(StaffTeamMemberActivity, scopedStaffSnapshotWhere(after.activity.id, snapshotScope))\n if (!activity) {\n activity = em.create(StaffTeamMemberActivity, {\n id: after.activity.id,\n organizationId: after.activity.organizationId,\n tenantId: after.activity.tenantId,\n member,\n activityType: after.activity.activityType,\n subject: after.activity.subject,\n body: after.activity.body,\n occurredAt: after.activity.occurredAt ?? null,\n authorUserId: after.activity.authorUserId,\n appearanceIcon: after.activity.appearanceIcon,\n appearanceColor: after.activity.appearanceColor,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n em.persist(activity)\n } else {\n activity.member = member\n activity.activityType = after.activity.activityType\n activity.subject = after.activity.subject\n activity.body = after.activity.body\n activity.occurredAt = after.activity.occurredAt ?? null\n activity.authorUserId = after.activity.authorUserId\n activity.appearanceIcon = after.activity.appearanceIcon\n activity.appearanceColor = after.activity.appearanceColor\n }\n await em.flush()\n\n await setActivityCustomFields(ctx, activity.id, activity.organizationId, activity.tenantId, after.custom ?? {})\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await emitCrudSideEffects({\n dataEngine: de,\n action: 'created',\n entity: activity,\n identifiers: {\n id: activity.id,\n organizationId: activity.organizationId,\n tenantId: activity.tenantId,\n },\n events: staffTeamMemberActivityCrudEvents,\n indexer: activityCrudIndexer,\n })\n\n return { activityId: activity.id, authorUserId: activity.authorUserId ?? null }\n },\n}\n\nconst updateActivityCommand: CommandHandler<StaffTeamMemberActivityUpdateInput, { activityId: string }> = {\n id: 'staff.team-member-activities.update',\n async prepare(rawInput, ctx) {\n const parsed = staffTeamMemberActivityUpdateSchema.parse(rawInput)\n const em = (ctx.container.resolve('em') as EntityManager)\n const snapshot = await loadActivitySnapshot(em, parsed.id, staffSnapshotScopeFromContext(ctx))\n return snapshot ? { before: snapshot } : {}\n },\n async execute(rawInput, ctx) {\n const { parsed, custom } = parseWithCustomFields(staffTeamMemberActivityUpdateSchema, rawInput)\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const scope = commandActorScope(ctx)\n const activity = await em.findOne(\n StaffTeamMemberActivity,\n applyScopeToWhere<StaffTeamMemberActivity>({ id: parsed.id }, scope),\n )\n if (!activity) throw new CrudHttpError(404, { error: 'Activity not found' })\n ensureTenantScope(ctx, activity.tenantId)\n ensureOrganizationScope(ctx, activity.organizationId)\n\n if (parsed.entityId !== undefined) {\n const member = await requireTeamMember(em, parsed.entityId, scope, 'Team member not found')\n ensureTenantScope(ctx, member.tenantId)\n ensureOrganizationScope(ctx, member.organizationId)\n activity.member = member\n }\n if (parsed.activityType !== undefined) activity.activityType = parsed.activityType\n if (parsed.subject !== undefined) activity.subject = parsed.subject ?? null\n if (parsed.body !== undefined) activity.body = parsed.body ?? null\n if (parsed.occurredAt !== undefined) activity.occurredAt = parsed.occurredAt ?? null\n if (parsed.authorUserId !== undefined) activity.authorUserId = parsed.authorUserId ?? null\n if (parsed.appearanceIcon !== undefined) activity.appearanceIcon = parsed.appearanceIcon ?? null\n if (parsed.appearanceColor !== undefined) activity.appearanceColor = parsed.appearanceColor ?? null\n\n await em.flush()\n\n await setActivityCustomFields(ctx, activity.id, activity.organizationId, activity.tenantId, custom)\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await emitCrudSideEffects({\n dataEngine: de,\n action: 'updated',\n entity: activity,\n identifiers: {\n id: activity.id,\n organizationId: activity.organizationId,\n tenantId: activity.tenantId,\n },\n events: staffTeamMemberActivityCrudEvents,\n indexer: activityCrudIndexer,\n })\n\n return { activityId: activity.id }\n },\n captureAfter: async (_input, result, ctx) => {\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n return await loadActivitySnapshot(em, result.activityId, staffSnapshotScopeFromContext(ctx))\n },\n buildLog: async ({ snapshots }) => {\n const { translate } = await resolveTranslations()\n const before = snapshots.before as ActivitySnapshot | undefined\n if (!before) return null\n const afterSnapshot = snapshots.after as ActivitySnapshot | undefined\n const changeKeys: readonly string[] = [\n 'memberId',\n 'activityType',\n 'subject',\n 'body',\n 'occurredAt',\n 'authorUserId',\n 'appearanceIcon',\n 'appearanceColor',\n ]\n const changes: ActivityChangeMap =\n afterSnapshot && before\n ? buildChanges(\n before.activity as Record<string, unknown>,\n afterSnapshot.activity as Record<string, unknown>,\n changeKeys\n )\n : {}\n const customChanges = diffCustomFieldChanges(before.custom, afterSnapshot?.custom)\n if (Object.keys(customChanges).length) changes.custom = customChanges\n return {\n actionLabel: translate('staff.audit.teamMemberActivities.update', 'Update activity'),\n resourceKind: 'staff.team_member_activity',\n resourceId: before.activity.id,\n parentResourceKind: 'staff.teamMember',\n parentResourceId: before.activity.memberId ?? null,\n tenantId: before.activity.tenantId,\n organizationId: before.activity.organizationId,\n snapshotBefore: before,\n snapshotAfter: afterSnapshot ?? null,\n changes,\n payload: {\n undo: {\n before,\n after: afterSnapshot ?? null,\n } satisfies ActivityUndoPayload,\n },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<ActivityUndoPayload>(logEntry)\n const before = payload?.before\n if (!before) return\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const snapshotScope = staffSnapshotScopeFromSnapshot(before.activity)\n let activity = await em.findOne(StaffTeamMemberActivity, scopedStaffSnapshotWhere(before.activity.id, snapshotScope))\n const member = await requireTeamMember(\n em,\n before.activity.memberId,\n explicitStaffCommandScope(before.activity.tenantId, before.activity.organizationId),\n 'Team member not found',\n )\n\n if (!activity) {\n activity = em.create(StaffTeamMemberActivity, {\n id: before.activity.id,\n organizationId: before.activity.organizationId,\n tenantId: before.activity.tenantId,\n member,\n activityType: before.activity.activityType,\n subject: before.activity.subject,\n body: before.activity.body,\n occurredAt: before.activity.occurredAt ?? null,\n authorUserId: before.activity.authorUserId,\n appearanceIcon: before.activity.appearanceIcon,\n appearanceColor: before.activity.appearanceColor,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n em.persist(activity)\n } else {\n activity.member = member\n activity.activityType = before.activity.activityType\n activity.subject = before.activity.subject\n activity.body = before.activity.body\n activity.occurredAt = before.activity.occurredAt ?? null\n activity.authorUserId = before.activity.authorUserId\n activity.appearanceIcon = before.activity.appearanceIcon\n activity.appearanceColor = before.activity.appearanceColor\n }\n await em.flush()\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await emitCrudUndoSideEffects({\n dataEngine: de,\n action: 'updated',\n entity: activity,\n identifiers: {\n id: activity.id,\n organizationId: activity.organizationId,\n tenantId: activity.tenantId,\n },\n events: staffTeamMemberActivityCrudEvents,\n indexer: activityCrudIndexer,\n })\n\n const resetValues = buildCustomFieldResetMap(before.custom, payload?.after?.custom)\n if (Object.keys(resetValues).length) {\n await setCustomFieldsIfAny({\n dataEngine: de,\n entityId: E.staff.staff_team_member_activity,\n recordId: activity.id,\n organizationId: activity.organizationId,\n tenantId: activity.tenantId,\n values: resetValues,\n notify: false,\n })\n }\n },\n}\n\nconst deleteActivityCommand: CommandHandler<{ body?: Record<string, unknown>; query?: Record<string, unknown> }, { activityId: string }> =\n {\n id: 'staff.team-member-activities.delete',\n async prepare(input, ctx) {\n const id = requireId(input, 'Activity id required')\n const em = (ctx.container.resolve('em') as EntityManager)\n const snapshot = await loadActivitySnapshot(em, id, staffSnapshotScopeFromContext(ctx))\n return snapshot ? { before: snapshot } : {}\n },\n async execute(input, ctx) {\n const id = requireId(input, 'Activity id required')\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const scope = commandActorScope(ctx)\n const activity = await em.findOne(\n StaffTeamMemberActivity,\n applyScopeToWhere<StaffTeamMemberActivity>({ id }, scope),\n )\n if (!activity) throw new CrudHttpError(404, { error: 'Activity not found' })\n ensureTenantScope(ctx, activity.tenantId)\n ensureOrganizationScope(ctx, activity.organizationId)\n em.remove(activity)\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: activity,\n identifiers: {\n id: activity.id,\n organizationId: activity.organizationId,\n tenantId: activity.tenantId,\n },\n events: staffTeamMemberActivityCrudEvents,\n indexer: activityCrudIndexer,\n })\n return { activityId: activity.id }\n },\n buildLog: async ({ snapshots }) => {\n const before = snapshots.before as ActivitySnapshot | undefined\n if (!before) return null\n const { translate } = await resolveTranslations()\n return {\n actionLabel: translate('staff.audit.teamMemberActivities.delete', 'Delete activity'),\n resourceKind: 'staff.team_member_activity',\n resourceId: before.activity.id,\n parentResourceKind: 'staff.teamMember',\n parentResourceId: before.activity.memberId ?? null,\n tenantId: before.activity.tenantId,\n organizationId: before.activity.organizationId,\n snapshotBefore: before,\n payload: {\n undo: {\n before,\n } satisfies ActivityUndoPayload,\n },\n }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<ActivityUndoPayload>(logEntry)\n const before = payload?.before\n if (!before) return\n const em = (ctx.container.resolve('em') as EntityManager).fork()\n const snapshotScope = staffSnapshotScopeFromSnapshot(before.activity)\n const member = await requireTeamMember(\n em,\n before.activity.memberId,\n explicitStaffCommandScope(before.activity.tenantId, before.activity.organizationId),\n 'Team member not found',\n )\n let activity = await em.findOne(StaffTeamMemberActivity, scopedStaffSnapshotWhere(before.activity.id, snapshotScope))\n if (!activity) {\n activity = em.create(StaffTeamMemberActivity, {\n id: before.activity.id,\n organizationId: before.activity.organizationId,\n tenantId: before.activity.tenantId,\n member,\n activityType: before.activity.activityType,\n subject: before.activity.subject,\n body: before.activity.body,\n occurredAt: before.activity.occurredAt ?? null,\n authorUserId: before.activity.authorUserId,\n appearanceIcon: before.activity.appearanceIcon,\n appearanceColor: before.activity.appearanceColor,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n em.persist(activity)\n } else {\n activity.member = member\n activity.activityType = before.activity.activityType\n activity.subject = before.activity.subject\n activity.body = before.activity.body\n activity.occurredAt = before.activity.occurredAt ?? null\n activity.authorUserId = before.activity.authorUserId\n activity.appearanceIcon = before.activity.appearanceIcon\n activity.appearanceColor = before.activity.appearanceColor\n }\n await em.flush()\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await emitCrudUndoSideEffects({\n dataEngine: de,\n action: 'created',\n entity: activity,\n identifiers: {\n id: activity.id,\n organizationId: activity.organizationId,\n tenantId: activity.tenantId,\n },\n events: staffTeamMemberActivityCrudEvents,\n indexer: activityCrudIndexer,\n })\n\n const resetValues = buildCustomFieldResetMap(before.custom, undefined)\n if (Object.keys(resetValues).length) {\n await setCustomFieldsIfAny({\n dataEngine: de,\n entityId: E.staff.staff_team_member_activity,\n recordId: activity.id,\n organizationId: activity.organizationId,\n tenantId: activity.tenantId,\n values: resetValues,\n notify: false,\n })\n }\n },\n }\n\nregisterCommand(createActivityCommand)\nregisterCommand(updateActivityCommand)\nregisterCommand(deleteActivityCommand)\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -14,7 +14,10 @@ import {
|
|
|
14
14
|
ensureTenantScope,
|
|
15
15
|
explicitStaffCommandScope,
|
|
16
16
|
extractUndoPayload,
|
|
17
|
-
requireTeamMember
|
|
17
|
+
requireTeamMember,
|
|
18
|
+
scopedStaffSnapshotWhere,
|
|
19
|
+
staffSnapshotScopeFromContext,
|
|
20
|
+
staffSnapshotScopeFromSnapshot
|
|
18
21
|
} from "./shared.js";
|
|
19
22
|
import { resolveTranslations } from "@open-mercato/shared/lib/i18n/server";
|
|
20
23
|
import { resolveRedoSnapshot } from "@open-mercato/shared/lib/commands/redo";
|
|
@@ -23,8 +26,8 @@ import { E } from "../../../generated/entities.ids.generated.js";
|
|
|
23
26
|
const addressCrudIndexer = {
|
|
24
27
|
entityType: E.staff.staff_team_member_address
|
|
25
28
|
};
|
|
26
|
-
async function loadAddressSnapshot(em, id) {
|
|
27
|
-
const address = await em.findOne(StaffTeamMemberAddress,
|
|
29
|
+
async function loadAddressSnapshot(em, id, scope) {
|
|
30
|
+
const address = await em.findOne(StaffTeamMemberAddress, scopedStaffSnapshotWhere(id, scope));
|
|
28
31
|
if (!address) return null;
|
|
29
32
|
return {
|
|
30
33
|
id: address.id,
|
|
@@ -114,7 +117,7 @@ const createAddressCommand = {
|
|
|
114
117
|
},
|
|
115
118
|
captureAfter: async (_input, result, ctx) => {
|
|
116
119
|
const em = ctx.container.resolve("em").fork();
|
|
117
|
-
return await loadAddressSnapshot(em, result.addressId);
|
|
120
|
+
return await loadAddressSnapshot(em, result.addressId, staffSnapshotScopeFromContext(ctx));
|
|
118
121
|
},
|
|
119
122
|
buildLog: async ({ result, snapshots }) => {
|
|
120
123
|
const { translate } = await resolveTranslations();
|
|
@@ -136,10 +139,12 @@ const createAddressCommand = {
|
|
|
136
139
|
};
|
|
137
140
|
},
|
|
138
141
|
undo: async ({ logEntry, ctx }) => {
|
|
139
|
-
const
|
|
142
|
+
const payload = extractUndoPayload(logEntry);
|
|
143
|
+
const after = payload?.after;
|
|
144
|
+
const addressId = after?.id ?? logEntry?.resourceId ?? null;
|
|
140
145
|
if (!addressId) return;
|
|
141
146
|
const em = ctx.container.resolve("em").fork();
|
|
142
|
-
const address = await em.findOne(StaffTeamMemberAddress,
|
|
147
|
+
const address = await em.findOne(StaffTeamMemberAddress, scopedStaffSnapshotWhere(addressId, staffSnapshotScopeFromSnapshot(after)));
|
|
143
148
|
if (address) {
|
|
144
149
|
em.remove(address);
|
|
145
150
|
await em.flush();
|
|
@@ -151,13 +156,14 @@ const createAddressCommand = {
|
|
|
151
156
|
throw new CrudHttpError(400, { error: "[internal] redo snapshot unavailable for address create" });
|
|
152
157
|
}
|
|
153
158
|
const em = ctx.container.resolve("em").fork();
|
|
159
|
+
const snapshotScope = staffSnapshotScopeFromSnapshot(after);
|
|
154
160
|
const member = await requireTeamMember(
|
|
155
161
|
em,
|
|
156
162
|
after.memberId,
|
|
157
163
|
explicitStaffCommandScope(after.tenantId, after.organizationId),
|
|
158
164
|
"Team member not found"
|
|
159
165
|
);
|
|
160
|
-
let address = await em.findOne(StaffTeamMemberAddress,
|
|
166
|
+
let address = await em.findOne(StaffTeamMemberAddress, scopedStaffSnapshotWhere(after.id, snapshotScope));
|
|
161
167
|
if (!address) {
|
|
162
168
|
address = em.create(StaffTeamMemberAddress, {
|
|
163
169
|
id: after.id,
|
|
@@ -225,7 +231,7 @@ const updateAddressCommand = {
|
|
|
225
231
|
async prepare(rawInput, ctx) {
|
|
226
232
|
const parsed = staffTeamMemberAddressUpdateSchema.parse(rawInput);
|
|
227
233
|
const em = ctx.container.resolve("em");
|
|
228
|
-
const snapshot = await loadAddressSnapshot(em, parsed.id);
|
|
234
|
+
const snapshot = await loadAddressSnapshot(em, parsed.id, staffSnapshotScopeFromContext(ctx));
|
|
229
235
|
return snapshot ? { before: snapshot } : {};
|
|
230
236
|
},
|
|
231
237
|
async execute(rawInput, ctx) {
|
|
@@ -281,7 +287,7 @@ const updateAddressCommand = {
|
|
|
281
287
|
},
|
|
282
288
|
captureAfter: async (_input, result, ctx) => {
|
|
283
289
|
const em = ctx.container.resolve("em").fork();
|
|
284
|
-
return await loadAddressSnapshot(em, result.addressId);
|
|
290
|
+
return await loadAddressSnapshot(em, result.addressId, staffSnapshotScopeFromContext(ctx));
|
|
285
291
|
},
|
|
286
292
|
buildLog: async ({ snapshots }) => {
|
|
287
293
|
const { translate } = await resolveTranslations();
|
|
@@ -333,7 +339,8 @@ const updateAddressCommand = {
|
|
|
333
339
|
const before = payload?.before;
|
|
334
340
|
if (!before) return;
|
|
335
341
|
const em = ctx.container.resolve("em").fork();
|
|
336
|
-
|
|
342
|
+
const snapshotScope = staffSnapshotScopeFromSnapshot(before);
|
|
343
|
+
let address = await em.findOne(StaffTeamMemberAddress, scopedStaffSnapshotWhere(before.id, snapshotScope));
|
|
337
344
|
const member = await requireTeamMember(
|
|
338
345
|
em,
|
|
339
346
|
before.memberId,
|
|
@@ -406,7 +413,7 @@ const deleteAddressCommand = {
|
|
|
406
413
|
async prepare(input, ctx) {
|
|
407
414
|
const id = requireId(input, "Address id required");
|
|
408
415
|
const em = ctx.container.resolve("em");
|
|
409
|
-
const snapshot = await loadAddressSnapshot(em, id);
|
|
416
|
+
const snapshot = await loadAddressSnapshot(em, id, staffSnapshotScopeFromContext(ctx));
|
|
410
417
|
return snapshot ? { before: snapshot } : {};
|
|
411
418
|
},
|
|
412
419
|
async execute(input, ctx) {
|
|
@@ -462,13 +469,14 @@ const deleteAddressCommand = {
|
|
|
462
469
|
const before = payload?.before;
|
|
463
470
|
if (!before) return;
|
|
464
471
|
const em = ctx.container.resolve("em").fork();
|
|
472
|
+
const snapshotScope = staffSnapshotScopeFromSnapshot(before);
|
|
465
473
|
const member = await requireTeamMember(
|
|
466
474
|
em,
|
|
467
475
|
before.memberId,
|
|
468
476
|
explicitStaffCommandScope(before.tenantId, before.organizationId),
|
|
469
477
|
"Team member not found"
|
|
470
478
|
);
|
|
471
|
-
let address = await em.findOne(StaffTeamMemberAddress,
|
|
479
|
+
let address = await em.findOne(StaffTeamMemberAddress, scopedStaffSnapshotWhere(before.id, snapshotScope));
|
|
472
480
|
if (!address) {
|
|
473
481
|
address = em.create(StaffTeamMemberAddress, {
|
|
474
482
|
id: before.id,
|