@open-mercato/core 0.4.7-develop-78d7541539 → 0.4.7-develop-74069040de
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/AGENTS.md +1 -0
- package/dist/modules/catalog/api/bulk-delete/route.js +86 -0
- package/dist/modules/catalog/api/bulk-delete/route.js.map +7 -0
- package/dist/modules/catalog/api/prices/route.js +39 -6
- package/dist/modules/catalog/api/prices/route.js.map +2 -2
- package/dist/modules/catalog/api/products/route.js +6 -11
- package/dist/modules/catalog/api/products/route.js.map +2 -2
- package/dist/modules/catalog/commands/products.js +2 -0
- package/dist/modules/catalog/commands/products.js.map +2 -2
- package/dist/modules/catalog/components/products/ProductsDataTable.js +9 -1
- package/dist/modules/catalog/components/products/ProductsDataTable.js.map +2 -2
- package/dist/modules/catalog/lib/bulkDelete.js +70 -0
- package/dist/modules/catalog/lib/bulkDelete.js.map +7 -0
- package/dist/modules/catalog/widgets/injection/product-bulk-delete/widget.js +185 -0
- package/dist/modules/catalog/widgets/injection/product-bulk-delete/widget.js.map +7 -0
- package/dist/modules/catalog/widgets/injection-table.js +9 -1
- package/dist/modules/catalog/widgets/injection-table.js.map +2 -2
- package/dist/modules/catalog/workers/catalog-product-bulk-delete.js +40 -0
- package/dist/modules/catalog/workers/catalog-product-bulk-delete.js.map +7 -0
- package/dist/modules/data_sync/api/options.js +52 -0
- package/dist/modules/data_sync/api/options.js.map +7 -0
- package/dist/modules/data_sync/api/run.js +30 -35
- package/dist/modules/data_sync/api/run.js.map +2 -2
- package/dist/modules/data_sync/api/runs/[id]/cancel.js +2 -2
- package/dist/modules/data_sync/api/runs/[id]/cancel.js.map +2 -2
- package/dist/modules/data_sync/api/runs/[id]/retry.js +15 -30
- package/dist/modules/data_sync/api/runs/[id]/retry.js.map +2 -2
- package/dist/modules/data_sync/api/schedules/[id]/route.js +109 -0
- package/dist/modules/data_sync/api/schedules/[id]/route.js.map +7 -0
- package/dist/modules/data_sync/api/schedules/route.js +72 -0
- package/dist/modules/data_sync/api/schedules/route.js.map +7 -0
- package/dist/modules/data_sync/api/schedules/serialize.js +21 -0
- package/dist/modules/data_sync/api/schedules/serialize.js.map +7 -0
- package/dist/modules/data_sync/backend/data-sync/page.js +656 -47
- package/dist/modules/data_sync/backend/data-sync/page.js.map +2 -2
- package/dist/modules/data_sync/backend/data-sync/runs/[id]/page.js +116 -34
- package/dist/modules/data_sync/backend/data-sync/runs/[id]/page.js.map +2 -2
- package/dist/modules/data_sync/components/IntegrationScheduleTab.js +394 -0
- package/dist/modules/data_sync/components/IntegrationScheduleTab.js.map +7 -0
- package/dist/modules/data_sync/data/validators.js +32 -0
- package/dist/modules/data_sync/data/validators.js.map +2 -2
- package/dist/modules/data_sync/di.js +2 -0
- package/dist/modules/data_sync/di.js.map +2 -2
- package/dist/modules/data_sync/lib/id-mapping.js +24 -2
- package/dist/modules/data_sync/lib/id-mapping.js.map +2 -2
- package/dist/modules/data_sync/lib/start-run.js +57 -0
- package/dist/modules/data_sync/lib/start-run.js.map +7 -0
- package/dist/modules/data_sync/lib/sync-engine.js +93 -4
- package/dist/modules/data_sync/lib/sync-engine.js.map +2 -2
- package/dist/modules/data_sync/lib/sync-run-service.js +5 -1
- package/dist/modules/data_sync/lib/sync-run-service.js.map +2 -2
- package/dist/modules/data_sync/lib/sync-schedule-service.js +138 -0
- package/dist/modules/data_sync/lib/sync-schedule-service.js.map +7 -0
- package/dist/modules/data_sync/workers/sync-export.js +28 -2
- package/dist/modules/data_sync/workers/sync-export.js.map +2 -2
- package/dist/modules/data_sync/workers/sync-import.js +28 -2
- package/dist/modules/data_sync/workers/sync-import.js.map +2 -2
- package/dist/modules/data_sync/workers/sync-scheduled.js +5 -0
- package/dist/modules/data_sync/workers/sync-scheduled.js.map +2 -2
- package/dist/modules/entities/api/definitions.js +5 -2
- package/dist/modules/entities/api/definitions.js.map +2 -2
- package/dist/modules/entities/lib/field-definitions.js +3 -1
- package/dist/modules/entities/lib/field-definitions.js.map +2 -2
- package/dist/modules/integrations/api/[id]/route.js +14 -15
- package/dist/modules/integrations/api/[id]/route.js.map +2 -2
- package/dist/modules/integrations/api/route.js +3 -3
- package/dist/modules/integrations/api/route.js.map +2 -2
- package/dist/modules/integrations/backend/integrations/[id]/page.js +148 -33
- package/dist/modules/integrations/backend/integrations/[id]/page.js.map +2 -2
- package/dist/modules/integrations/lib/state-service.js +15 -1
- package/dist/modules/integrations/lib/state-service.js.map +2 -2
- package/dist/modules/messages/api/[id]/route.js +24 -22
- package/dist/modules/messages/api/[id]/route.js.map +2 -2
- package/dist/modules/payment_gateways/api/webhook/[provider]/route.js.map +2 -2
- package/dist/modules/progress/api/active/route.js +3 -1
- package/dist/modules/progress/api/active/route.js.map +2 -2
- package/dist/modules/progress/api/jobs/[id]/route.js +1 -1
- package/dist/modules/progress/api/jobs/[id]/route.js.map +2 -2
- package/dist/modules/progress/api/jobs/route.js +1 -1
- package/dist/modules/progress/api/jobs/route.js.map +2 -2
- package/dist/modules/progress/lib/events.js.map +1 -1
- package/dist/modules/progress/lib/progressService.js.map +2 -2
- package/dist/modules/progress/lib/progressServiceImpl.js +42 -1
- package/dist/modules/progress/lib/progressServiceImpl.js.map +2 -2
- package/dist/modules/query_index/lib/document.js +35 -1
- package/dist/modules/query_index/lib/document.js.map +2 -2
- package/dist/modules/query_index/lib/engine.js +91 -4
- package/dist/modules/query_index/lib/engine.js.map +2 -2
- package/dist/modules/query_index/lib/indexer.js +2 -0
- package/dist/modules/query_index/lib/indexer.js.map +2 -2
- package/dist/modules/sales/api/adjustment-kinds/route.js +3 -9
- package/dist/modules/sales/api/adjustment-kinds/route.js.map +2 -2
- package/dist/modules/sales/api/channels/route.js +3 -10
- package/dist/modules/sales/api/channels/route.js.map +2 -2
- package/dist/modules/sales/api/delivery-windows/route.js +3 -10
- package/dist/modules/sales/api/delivery-windows/route.js.map +2 -2
- package/dist/modules/sales/api/payment-methods/route.js +3 -11
- package/dist/modules/sales/api/payment-methods/route.js.map +2 -2
- package/dist/modules/sales/api/price-kinds/route.js +3 -5
- package/dist/modules/sales/api/price-kinds/route.js.map +2 -2
- package/dist/modules/sales/api/shipping-methods/route.js +3 -11
- package/dist/modules/sales/api/shipping-methods/route.js.map +2 -2
- package/dist/modules/sales/api/tags/route.js +3 -9
- package/dist/modules/sales/api/tags/route.js.map +2 -2
- package/dist/modules/sales/api/tax-rates/route.js +3 -13
- package/dist/modules/sales/api/tax-rates/route.js.map +2 -2
- package/dist/modules/sales/api/utils.js +9 -0
- package/dist/modules/sales/api/utils.js.map +2 -2
- package/dist/modules/sales/lib/makeStatusDictionaryRoute.js +3 -9
- package/dist/modules/sales/lib/makeStatusDictionaryRoute.js.map +2 -2
- package/dist/modules/workflows/api/definitions/[id]/route.js +3 -2
- package/dist/modules/workflows/api/definitions/[id]/route.js.map +2 -2
- package/dist/modules/workflows/api/definitions/route.js +4 -3
- package/dist/modules/workflows/api/definitions/route.js.map +2 -2
- package/dist/modules/workflows/api/definitions/serialize.js +25 -0
- package/dist/modules/workflows/api/definitions/serialize.js.map +7 -0
- package/package.json +3 -3
- package/src/modules/catalog/api/bulk-delete/route.ts +93 -0
- package/src/modules/catalog/api/prices/route.ts +53 -6
- package/src/modules/catalog/api/products/route.ts +6 -11
- package/src/modules/catalog/commands/products.ts +2 -0
- package/src/modules/catalog/components/products/ProductsDataTable.tsx +8 -0
- package/src/modules/catalog/i18n/de.json +10 -0
- package/src/modules/catalog/i18n/en.json +10 -0
- package/src/modules/catalog/i18n/es.json +10 -0
- package/src/modules/catalog/i18n/pl.json +10 -0
- package/src/modules/catalog/lib/bulkDelete.ts +106 -0
- package/src/modules/catalog/widgets/injection/product-bulk-delete/widget.ts +242 -0
- package/src/modules/catalog/widgets/injection-table.ts +8 -0
- package/src/modules/catalog/workers/catalog-product-bulk-delete.ts +48 -0
- package/src/modules/data_sync/AGENTS.md +11 -3
- package/src/modules/data_sync/api/options.ts +58 -0
- package/src/modules/data_sync/api/run.ts +34 -36
- package/src/modules/data_sync/api/runs/[id]/cancel.ts +2 -2
- package/src/modules/data_sync/api/runs/[id]/retry.ts +14 -31
- package/src/modules/data_sync/api/schedules/[id]/route.ts +130 -0
- package/src/modules/data_sync/api/schedules/route.ts +77 -0
- package/src/modules/data_sync/api/schedules/serialize.ts +31 -0
- package/src/modules/data_sync/backend/data-sync/page.tsx +756 -2
- package/src/modules/data_sync/backend/data-sync/runs/[id]/page.tsx +179 -53
- package/src/modules/data_sync/components/IntegrationScheduleTab.tsx +512 -0
- package/src/modules/data_sync/data/validators.ts +35 -0
- package/src/modules/data_sync/di.ts +6 -0
- package/src/modules/data_sync/i18n/de.json +72 -0
- package/src/modules/data_sync/i18n/en.json +72 -0
- package/src/modules/data_sync/i18n/es.json +72 -0
- package/src/modules/data_sync/i18n/pl.json +72 -0
- package/src/modules/data_sync/lib/adapter.ts +4 -1
- package/src/modules/data_sync/lib/id-mapping.ts +32 -2
- package/src/modules/data_sync/lib/start-run.ts +90 -0
- package/src/modules/data_sync/lib/sync-engine.ts +111 -4
- package/src/modules/data_sync/lib/sync-run-service.ts +5 -1
- package/src/modules/data_sync/lib/sync-schedule-service.ts +207 -0
- package/src/modules/data_sync/workers/sync-export.ts +33 -2
- package/src/modules/data_sync/workers/sync-import.ts +33 -2
- package/src/modules/data_sync/workers/sync-scheduled.ts +7 -0
- package/src/modules/entities/api/definitions.ts +12 -2
- package/src/modules/entities/lib/field-definitions.ts +2 -0
- package/src/modules/integrations/AGENTS.md +16 -3
- package/src/modules/integrations/api/[id]/route.ts +14 -15
- package/src/modules/integrations/api/route.ts +3 -3
- package/src/modules/integrations/backend/integrations/[id]/page.tsx +176 -54
- package/src/modules/integrations/lib/state-service.ts +25 -1
- package/src/modules/messages/api/[id]/route.ts +25 -22
- package/src/modules/payment_gateways/api/webhook/[provider]/route.ts +3 -3
- package/src/modules/progress/api/active/route.ts +4 -1
- package/src/modules/progress/api/jobs/[id]/route.ts +1 -1
- package/src/modules/progress/api/jobs/route.ts +1 -1
- package/src/modules/progress/lib/events.ts +6 -0
- package/src/modules/progress/lib/progressService.ts +1 -0
- package/src/modules/progress/lib/progressServiceImpl.ts +47 -1
- package/src/modules/query_index/lib/document.ts +52 -1
- package/src/modules/query_index/lib/engine.ts +104 -4
- package/src/modules/query_index/lib/indexer.ts +2 -0
- package/src/modules/sales/api/adjustment-kinds/route.ts +3 -9
- package/src/modules/sales/api/channels/route.ts +3 -10
- package/src/modules/sales/api/delivery-windows/route.ts +3 -10
- package/src/modules/sales/api/payment-methods/route.ts +3 -11
- package/src/modules/sales/api/price-kinds/route.ts +3 -5
- package/src/modules/sales/api/shipping-methods/route.ts +3 -11
- package/src/modules/sales/api/tags/route.ts +3 -9
- package/src/modules/sales/api/tax-rates/route.ts +3 -13
- package/src/modules/sales/api/utils.ts +9 -0
- package/src/modules/sales/lib/makeStatusDictionaryRoute.ts +3 -9
- package/src/modules/workflows/api/definitions/[id]/route.ts +3 -2
- package/src/modules/workflows/api/definitions/route.ts +4 -3
- package/src/modules/workflows/api/definitions/serialize.ts +23 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/modules/sales/api/shipping-methods/route.ts"],
|
|
4
|
-
"sourcesContent": ["import { z } from 'zod'\nimport { makeCrudRoute } from '@open-mercato/shared/lib/crud/factory'\nimport { splitCustomFieldPayload } from '@open-mercato/shared/lib/crud/custom-fields'\nimport { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'\nimport { SalesShippingMethod } from '../../data/entities'\nimport { shippingMethodCreateSchema, shippingMethodUpdateSchema } from '../../data/validators'\nimport { parseScopedCommandInput, resolveCrudRecordId } from '../utils'\nimport { E } from '#generated/entities.ids.generated'\nimport * as F from '#generated/entities/sales_shipping_method'\nimport {\n createPagedListResponseSchema,\n createSalesCrudOpenApi,\n defaultDeleteRequestSchema,\n} from '../openapi'\nimport {
|
|
5
|
-
"mappings": "AAAA,SAAS,SAAS;AAClB,SAAS,qBAAqB;AAC9B,SAAS,+BAA+B;AACxC,SAAS,2BAA2B;AACpC,SAAS,2BAA2B;AACpC,SAAS,4BAA4B,kCAAkC;AACvE,SAAS,yBAAyB,2BAA2B;
|
|
4
|
+
"sourcesContent": ["import { z } from 'zod'\nimport { makeCrudRoute } from '@open-mercato/shared/lib/crud/factory'\nimport { splitCustomFieldPayload } from '@open-mercato/shared/lib/crud/custom-fields'\nimport { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'\nimport { SalesShippingMethod } from '../../data/entities'\nimport { shippingMethodCreateSchema, shippingMethodUpdateSchema } from '../../data/validators'\nimport { buildAggregateSearchFilter, parseScopedCommandInput, resolveCrudRecordId } from '../utils'\nimport { E } from '#generated/entities.ids.generated'\nimport * as F from '#generated/entities/sales_shipping_method'\nimport {\n createPagedListResponseSchema,\n createSalesCrudOpenApi,\n defaultDeleteRequestSchema,\n} from '../openapi'\nimport { parseBooleanToken } from '@open-mercato/shared/lib/boolean'\n\nconst rawBodySchema = z.object({}).passthrough()\n\nconst listSchema = z\n .object({\n page: z.coerce.number().min(1).default(1),\n pageSize: z.coerce.number().min(1).max(100).default(50),\n search: z.string().optional(),\n currency: z.string().optional(),\n isActive: z.string().optional(),\n sortField: z.string().optional(),\n sortDir: z.enum(['asc', 'desc']).optional(),\n withDeleted: z.coerce.boolean().optional(),\n })\n .passthrough()\n\nconst routeMetadata = {\n GET: { requireAuth: true, requireFeatures: ['sales.settings.manage'] },\n POST: { requireAuth: true, requireFeatures: ['sales.settings.manage'] },\n PUT: { requireAuth: true, requireFeatures: ['sales.settings.manage'] },\n DELETE: { requireAuth: true, requireFeatures: ['sales.settings.manage'] },\n}\n\nexport const metadata = routeMetadata\n\nconst shippingMethodItemSchema = z.object({\n id: z.string().uuid(),\n name: z.string(),\n code: z.string(),\n description: z.string().nullable(),\n carrierCode: z.string().nullable(),\n providerKey: z.string().nullable(),\n serviceLevel: z.string().nullable(),\n estimatedTransitDays: z.number().nullable(),\n baseRateNet: z.string(),\n baseRateGross: z.string(),\n currencyCode: z.string().nullable(),\n isActive: z.boolean(),\n metadata: z.record(z.string(), z.unknown()).nullable(),\n providerSettings: z.record(z.string(), z.unknown()).nullable().optional(),\n organizationId: z.string().uuid().nullable(),\n tenantId: z.string().uuid().nullable(),\n createdAt: z.string(),\n updatedAt: z.string(),\n customFields: z.record(z.string(), z.unknown()).optional(),\n})\n\nconst shippingMethodListResponseSchema = createPagedListResponseSchema(shippingMethodItemSchema)\n\nfunction buildFilters(query: z.infer<typeof listSchema>): Record<string, unknown> {\n const filters: Record<string, unknown> = {}\n const searchFilter = buildAggregateSearchFilter(query.search)\n if (searchFilter) Object.assign(filters, searchFilter)\n if (query.currency && query.currency.trim().length > 0) {\n filters.currency_code = query.currency.trim().toUpperCase()\n }\n const isActive = parseBooleanToken(query.isActive)\n if (isActive !== null) filters.is_active = isActive\n return filters\n}\n\nconst crud = makeCrudRoute({\n metadata: routeMetadata,\n orm: {\n entity: SalesShippingMethod,\n idField: 'id',\n orgField: 'organizationId',\n tenantField: 'tenantId',\n softDeleteField: 'deletedAt',\n },\n list: {\n schema: listSchema,\n entityId: E.sales.sales_shipping_method,\n fields: [\n F.id,\n F.name,\n F.code,\n F.description,\n F.carrier_code,\n F.provider_key,\n F.service_level,\n F.estimated_transit_days,\n F.base_rate_net,\n F.base_rate_gross,\n F.currency_code,\n F.is_active,\n F.metadata,\n F.organization_id,\n F.tenant_id,\n F.created_at,\n F.updated_at,\n ],\n sortFieldMap: {\n id: F.id,\n name: F.name,\n code: F.code,\n carrierCode: F.carrier_code,\n createdAt: F.created_at,\n updatedAt: F.updated_at,\n },\n buildFilters: async (query) => buildFilters(query),\n decorateCustomFields: { entityIds: [E.sales.sales_shipping_method] },\n transformItem: (item: any) => {\n const base = {\n id: item.id,\n name: item.name,\n code: item.code,\n description: item.description ?? null,\n carrierCode: item.carrier_code ?? null,\n providerKey: item.provider_key ?? null,\n serviceLevel: item.service_level ?? null,\n estimatedTransitDays: item.estimated_transit_days ?? null,\n baseRateNet: item.base_rate_net ?? '0',\n baseRateGross: item.base_rate_gross ?? '0',\n currencyCode: item.currency_code ?? null,\n isActive: item.is_active ?? false,\n metadata: item.metadata ?? null,\n providerSettings:\n item.metadata && typeof item.metadata === 'object'\n ? (item.metadata as any).providerSettings ?? null\n : null,\n organizationId: item.organization_id ?? null,\n tenantId: item.tenant_id ?? null,\n createdAt: item.created_at,\n updatedAt: item.updated_at,\n }\n const { custom } = splitCustomFieldPayload(item)\n return Object.keys(custom).length ? { ...base, customFields: custom } : base\n },\n },\n actions: {\n create: {\n commandId: 'sales.shipping-methods.create',\n schema: rawBodySchema,\n mapInput: async ({ raw, ctx }) => {\n const { translate } = await resolveTranslations()\n return parseScopedCommandInput(shippingMethodCreateSchema, raw ?? {}, ctx, translate)\n },\n response: ({ result }) => ({ id: result?.shippingMethodId ?? result?.id ?? null }),\n status: 201,\n },\n update: {\n commandId: 'sales.shipping-methods.update',\n schema: rawBodySchema,\n mapInput: async ({ raw, ctx }) => {\n const { translate } = await resolveTranslations()\n return parseScopedCommandInput(shippingMethodUpdateSchema, raw ?? {}, ctx, translate)\n },\n response: () => ({ ok: true }),\n },\n delete: {\n commandId: 'sales.shipping-methods.delete',\n schema: rawBodySchema,\n mapInput: async ({ parsed, ctx }) => {\n const { translate } = await resolveTranslations()\n const id = resolveCrudRecordId(parsed, ctx, translate)\n return { id }\n },\n response: () => ({ ok: true }),\n },\n },\n})\n\nexport const openApi = createSalesCrudOpenApi({\n resourceName: 'Shipping method',\n pluralName: 'Shipping methods',\n description: 'Maintain shipping services, carrier mappings, and pricing defaults for order fulfillment.',\n querySchema: listSchema,\n listResponseSchema: shippingMethodListResponseSchema,\n create: { schema: shippingMethodCreateSchema },\n update: { schema: shippingMethodUpdateSchema },\n del: { schema: defaultDeleteRequestSchema },\n})\n\nexport const GET = crud.GET\nexport const POST = crud.POST\nexport const PUT = crud.PUT\nexport const DELETE = crud.DELETE\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -4,10 +4,9 @@ import { CrudHttpError } from "@open-mercato/shared/lib/crud/errors";
|
|
|
4
4
|
import { resolveTranslations } from "@open-mercato/shared/lib/i18n/server";
|
|
5
5
|
import { SalesDocumentTag } from "../../data/entities.js";
|
|
6
6
|
import { salesTagCreateSchema, salesTagUpdateSchema } from "../../data/validators.js";
|
|
7
|
-
import { withScopedPayload } from "../utils.js";
|
|
7
|
+
import { buildAggregateSearchFilter, withScopedPayload } from "../utils.js";
|
|
8
8
|
import { createPagedListResponseSchema, createSalesCrudOpenApi, defaultOkResponseSchema } from "../openapi.js";
|
|
9
9
|
import { slugifyTagLabel } from "@open-mercato/shared/lib/utils";
|
|
10
|
-
import { escapeLikePattern } from "@open-mercato/shared/lib/db/escapeLikePattern";
|
|
11
10
|
const rawBodySchema = z.object({}).passthrough();
|
|
12
11
|
const listSchema = z.object({
|
|
13
12
|
page: z.coerce.number().min(1).default(1),
|
|
@@ -37,13 +36,8 @@ const crud = makeCrudRoute({
|
|
|
37
36
|
fields: ["id", "slug", "label", "color", "description", "organization_id", "tenant_id"],
|
|
38
37
|
buildFilters: async (query) => {
|
|
39
38
|
const filters = {};
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
filters.$or = [
|
|
43
|
-
{ label: { $ilike: pattern } },
|
|
44
|
-
{ slug: { $ilike: pattern } }
|
|
45
|
-
];
|
|
46
|
-
}
|
|
39
|
+
const searchFilter = buildAggregateSearchFilter(query.search);
|
|
40
|
+
if (searchFilter) Object.assign(filters, searchFilter);
|
|
47
41
|
return filters;
|
|
48
42
|
}
|
|
49
43
|
},
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/modules/sales/api/tags/route.ts"],
|
|
4
|
-
"sourcesContent": ["import { z } from 'zod'\nimport { makeCrudRoute } from '@open-mercato/shared/lib/crud/factory'\nimport { CrudHttpError } from '@open-mercato/shared/lib/crud/errors'\nimport { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'\nimport { SalesDocumentTag } from '../../data/entities'\nimport { salesTagCreateSchema, salesTagUpdateSchema } from '../../data/validators'\nimport { withScopedPayload } from '../utils'\nimport { createPagedListResponseSchema, createSalesCrudOpenApi, defaultOkResponseSchema } from '../openapi'\nimport { slugifyTagLabel } from '@open-mercato/shared/lib/utils'\
|
|
5
|
-
"mappings": "AAAA,SAAS,SAAS;AAClB,SAAS,qBAAqB;AAC9B,SAAS,qBAAqB;AAC9B,SAAS,2BAA2B;AACpC,SAAS,wBAAwB;AACjC,SAAS,sBAAsB,4BAA4B;AAC3D,SAAS,yBAAyB;
|
|
4
|
+
"sourcesContent": ["import { z } from 'zod'\nimport { makeCrudRoute } from '@open-mercato/shared/lib/crud/factory'\nimport { CrudHttpError } from '@open-mercato/shared/lib/crud/errors'\nimport { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'\nimport { SalesDocumentTag } from '../../data/entities'\nimport { salesTagCreateSchema, salesTagUpdateSchema } from '../../data/validators'\nimport { buildAggregateSearchFilter, withScopedPayload } from '../utils'\nimport { createPagedListResponseSchema, createSalesCrudOpenApi, defaultOkResponseSchema } from '../openapi'\nimport { slugifyTagLabel } from '@open-mercato/shared/lib/utils'\n\nconst rawBodySchema = z.object({}).passthrough()\n\nconst listSchema = z\n .object({\n page: z.coerce.number().min(1).default(1),\n pageSize: z.coerce.number().min(1).max(100).default(100),\n search: z.string().optional(),\n sortField: z.string().optional(),\n sortDir: z.enum(['asc', 'desc']).optional(),\n })\n .passthrough()\n\nconst routeMetadata = {\n GET: { requireAuth: true, requireFeatures: ['sales.orders.view'] },\n POST: { requireAuth: true, requireFeatures: ['sales.orders.manage'] },\n PUT: { requireAuth: true, requireFeatures: ['sales.orders.manage'] },\n DELETE: { requireAuth: true, requireFeatures: ['sales.orders.manage'] },\n}\n\nexport const metadata = routeMetadata\n\nconst crud = makeCrudRoute({\n metadata: routeMetadata,\n orm: {\n entity: SalesDocumentTag,\n idField: 'id',\n orgField: 'organizationId',\n tenantField: 'tenantId',\n softDeleteField: null,\n },\n list: {\n schema: listSchema,\n fields: ['id', 'slug', 'label', 'color', 'description', 'organization_id', 'tenant_id'],\n buildFilters: async (query: any) => {\n const filters: Record<string, any> = {}\n const searchFilter = buildAggregateSearchFilter(query.search)\n if (searchFilter) Object.assign(filters, searchFilter)\n return filters\n },\n },\n actions: {\n create: {\n commandId: 'sales.tags.create',\n schema: rawBodySchema,\n mapInput: async ({ raw, ctx }) => {\n const { translate } = await resolveTranslations()\n try {\n const scoped = withScopedPayload(raw ?? {}, ctx, translate)\n const slug =\n typeof scoped.slug === 'string' && scoped.slug.trim().length\n ? scoped.slug.trim()\n : typeof scoped.label === 'string'\n ? slugifyTagLabel(scoped.label)\n : scoped.slug\n const payload = { ...scoped, slug }\n return salesTagCreateSchema.parse(payload)\n } catch {\n throw new CrudHttpError(400, { error: translate('sales.errors.tag_invalid', 'Invalid tag payload') })\n }\n },\n response: ({ result }) => ({ id: result?.tagId ?? result?.id ?? null }),\n status: 201,\n },\n update: {\n commandId: 'sales.tags.update',\n schema: rawBodySchema,\n mapInput: async ({ raw, ctx }) => {\n const { translate } = await resolveTranslations()\n try {\n return salesTagUpdateSchema.parse(raw ?? {})\n } catch {\n throw new CrudHttpError(400, { error: translate('sales.errors.tag_invalid', 'Invalid tag payload') })\n }\n },\n response: () => ({ ok: true }),\n },\n delete: {\n commandId: 'sales.tags.delete',\n schema: rawBodySchema,\n mapInput: async ({ parsed, ctx }) => {\n const { translate } = await resolveTranslations()\n const id =\n parsed?.body?.id ??\n parsed?.id ??\n parsed?.query?.id ??\n (ctx.request ? new URL(ctx.request.url).searchParams.get('id') : null)\n if (!id) throw new CrudHttpError(400, { error: translate('sales.errors.tag_required', 'Tag id is required') })\n return { id }\n },\n response: () => ({ ok: true }),\n },\n },\n})\n\nconst { POST, PUT, DELETE } = crud\nexport { POST, PUT, DELETE }\nexport const GET = crud.GET\n\nconst tagSchema = z.object({\n id: z.string().uuid(),\n slug: z.string(),\n label: z.string().nullable().optional(),\n color: z.string().nullable().optional(),\n description: z.string().nullable().optional(),\n organization_id: z.string().uuid().nullable().optional(),\n tenant_id: z.string().uuid().nullable().optional(),\n})\n\nexport const openApi = createSalesCrudOpenApi({\n resourceName: 'Sales tag',\n pluralName: 'Sales tags',\n description: 'Manage reusable tags to categorize sales orders and quotes.',\n querySchema: listSchema,\n listResponseSchema: createPagedListResponseSchema(tagSchema),\n create: {\n schema: salesTagCreateSchema,\n responseSchema: z.object({ id: z.string().uuid().nullable() }),\n description: 'Creates a sales document tag.',\n },\n update: {\n schema: salesTagUpdateSchema,\n responseSchema: defaultOkResponseSchema,\n description: 'Updates an existing sales tag.',\n },\n del: {\n responseSchema: defaultOkResponseSchema,\n description: 'Deletes a sales tag.',\n },\n})\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -4,10 +4,9 @@ import { splitCustomFieldPayload } from "@open-mercato/shared/lib/crud/custom-fi
|
|
|
4
4
|
import { resolveTranslations } from "@open-mercato/shared/lib/i18n/server";
|
|
5
5
|
import { SalesTaxRate } from "../../data/entities.js";
|
|
6
6
|
import { taxRateCreateSchema, taxRateUpdateSchema } from "../../data/validators.js";
|
|
7
|
-
import { parseScopedCommandInput, resolveCrudRecordId } from "../utils.js";
|
|
7
|
+
import { buildAggregateSearchFilter, parseScopedCommandInput, resolveCrudRecordId } from "../utils.js";
|
|
8
8
|
import { E } from "../../../../generated/entities.ids.generated.js";
|
|
9
9
|
import * as F from "../../../../generated/entities/sales_tax_rate/index.js";
|
|
10
|
-
import { escapeLikePattern } from "@open-mercato/shared/lib/db/escapeLikePattern";
|
|
11
10
|
import { parseBooleanToken } from "@open-mercato/shared/lib/boolean";
|
|
12
11
|
const rawBodySchema = z.object({}).passthrough();
|
|
13
12
|
const listSchema = z.object({
|
|
@@ -65,17 +64,8 @@ const taxRateDeleteSchema = z.object({
|
|
|
65
64
|
});
|
|
66
65
|
function buildFilters(query) {
|
|
67
66
|
const filters = {};
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
filters.$or = [
|
|
71
|
-
{ name: { $ilike: term } },
|
|
72
|
-
{ code: { $ilike: term } },
|
|
73
|
-
{ country_code: { $ilike: term } },
|
|
74
|
-
{ region_code: { $ilike: term } },
|
|
75
|
-
{ postal_code: { $ilike: term } },
|
|
76
|
-
{ city: { $ilike: term } }
|
|
77
|
-
];
|
|
78
|
-
}
|
|
67
|
+
const searchFilter = buildAggregateSearchFilter(query.search);
|
|
68
|
+
if (searchFilter) Object.assign(filters, searchFilter);
|
|
79
69
|
if (query.country && query.country.trim().length > 0) {
|
|
80
70
|
filters.country_code = query.country.trim().toUpperCase();
|
|
81
71
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/modules/sales/api/tax-rates/route.ts"],
|
|
4
|
-
"sourcesContent": ["import { z } from 'zod'\nimport { makeCrudRoute } from '@open-mercato/shared/lib/crud/factory'\nimport { splitCustomFieldPayload } from '@open-mercato/shared/lib/crud/custom-fields'\nimport type { OpenApiRouteDoc } from '@open-mercato/shared/lib/openapi'\nimport { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'\nimport { SalesTaxRate } from '../../data/entities'\nimport { taxRateCreateSchema, taxRateUpdateSchema } from '../../data/validators'\nimport { parseScopedCommandInput, resolveCrudRecordId } from '../utils'\nimport { E } from '#generated/entities.ids.generated'\nimport * as F from '#generated/entities/sales_tax_rate'\nimport {
|
|
5
|
-
"mappings": "AAAA,SAAS,SAAS;AAClB,SAAS,qBAAqB;AAC9B,SAAS,+BAA+B;AAExC,SAAS,2BAA2B;AACpC,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB,2BAA2B;AACzD,SAAS,yBAAyB,2BAA2B;
|
|
4
|
+
"sourcesContent": ["import { z } from 'zod'\nimport { makeCrudRoute } from '@open-mercato/shared/lib/crud/factory'\nimport { splitCustomFieldPayload } from '@open-mercato/shared/lib/crud/custom-fields'\nimport type { OpenApiRouteDoc } from '@open-mercato/shared/lib/openapi'\nimport { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'\nimport { SalesTaxRate } from '../../data/entities'\nimport { taxRateCreateSchema, taxRateUpdateSchema } from '../../data/validators'\nimport { buildAggregateSearchFilter, parseScopedCommandInput, resolveCrudRecordId } from '../utils'\nimport { E } from '#generated/entities.ids.generated'\nimport * as F from '#generated/entities/sales_tax_rate'\nimport { parseBooleanToken } from '@open-mercato/shared/lib/boolean'\n\nconst rawBodySchema = z.object({}).passthrough()\n\nconst listSchema = z\n .object({\n page: z.coerce.number().min(1).default(1),\n pageSize: z.coerce.number().min(1).max(200).default(50),\n search: z.string().optional(),\n country: z.string().optional(),\n region: z.string().optional(),\n channelId: z.string().uuid().optional(),\n isCompound: z.string().optional(),\n sortField: z.string().optional(),\n sortDir: z.enum(['asc', 'desc']).optional(),\n withDeleted: z.coerce.boolean().optional(),\n })\n .passthrough()\n\nconst routeMetadata = {\n GET: { requireAuth: true, requireFeatures: ['sales.settings.manage'] },\n POST: { requireAuth: true, requireFeatures: ['sales.settings.manage'] },\n PUT: { requireAuth: true, requireFeatures: ['sales.settings.manage'] },\n DELETE: { requireAuth: true, requireFeatures: ['sales.settings.manage'] },\n}\n\nexport const metadata = routeMetadata\n\nconst taxRateResponseItemSchema = z.object({\n id: z.string().uuid(),\n name: z.string(),\n code: z.string().nullable(),\n rate: z.number(),\n countryCode: z.string().nullable(),\n regionCode: z.string().nullable(),\n postalCode: z.string().nullable(),\n city: z.string().nullable(),\n customerGroupId: z.string().uuid().nullable(),\n productCategoryId: z.string().uuid().nullable(),\n channelId: z.string().uuid().nullable(),\n priority: z.number().nullable(),\n isCompound: z.boolean(),\n isDefault: z.boolean(),\n metadata: z.record(z.string(), z.any()).nullable().optional(),\n startsAt: z.string().nullable(),\n endsAt: z.string().nullable(),\n organizationId: z.string().uuid().nullable(),\n tenantId: z.string().uuid().nullable(),\n createdAt: z.string(),\n updatedAt: z.string(),\n customFields: z.record(z.string(), z.any()).optional(),\n})\n\nconst taxRateListResponseSchema = z.object({\n items: z.array(taxRateResponseItemSchema),\n total: z.number(),\n page: z.number(),\n pageSize: z.number(),\n totalPages: z.number(),\n})\n\nconst taxRateDeleteSchema = z.object({\n id: z.string().uuid(),\n})\n\nfunction buildFilters(query: z.infer<typeof listSchema>): Record<string, unknown> {\n const filters: Record<string, unknown> = {}\n const searchFilter = buildAggregateSearchFilter(query.search)\n if (searchFilter) Object.assign(filters, searchFilter)\n if (query.country && query.country.trim().length > 0) {\n filters.country_code = query.country.trim().toUpperCase()\n }\n if (query.region && query.region.trim().length > 0) {\n filters.region_code = query.region.trim()\n }\n if (query.channelId) {\n filters.channel_id = query.channelId\n }\n const isCompound = parseBooleanToken(query.isCompound)\n if (isCompound !== null) filters.is_compound = isCompound\n return filters\n}\n\nconst crud = makeCrudRoute({\n metadata: routeMetadata,\n orm: {\n entity: SalesTaxRate,\n idField: 'id',\n orgField: 'organizationId',\n tenantField: 'tenantId',\n softDeleteField: 'deletedAt',\n },\n list: {\n schema: listSchema,\n entityId: E.sales.sales_tax_rate,\n fields: [\n F.id,\n F.name,\n F.code,\n F.rate,\n F.country_code,\n F.region_code,\n F.postal_code,\n F.city,\n F.customer_group_id,\n F.product_category_id,\n F.channel_id,\n F.priority,\n F.is_compound,\n F.is_default,\n F.metadata,\n F.starts_at,\n F.ends_at,\n F.organization_id,\n F.tenant_id,\n F.created_at,\n F.updated_at,\n ],\n sortFieldMap: {\n id: F.id,\n name: F.name,\n code: F.code,\n rate: F.rate,\n priority: F.priority,\n createdAt: F.created_at,\n updatedAt: F.updated_at,\n },\n buildFilters: async (query) => buildFilters(query),\n decorateCustomFields: { entityIds: [E.sales.sales_tax_rate] },\n transformItem: (item: any) => {\n const base = {\n id: item.id,\n name: item.name,\n code: item.code,\n rate: item.rate,\n countryCode: item.country_code ?? null,\n regionCode: item.region_code ?? null,\n postalCode: item.postal_code ?? null,\n city: item.city ?? null,\n customerGroupId: item.customer_group_id ?? null,\n productCategoryId: item.product_category_id ?? null,\n channelId: item.channel_id ?? null,\n priority: item.priority ?? 0,\n isCompound: item.is_compound ?? false,\n isDefault: item.is_default ?? false,\n metadata: item.metadata ?? null,\n startsAt: item.starts_at ?? null,\n endsAt: item.ends_at ?? null,\n organizationId: item.organization_id ?? null,\n tenantId: item.tenant_id ?? null,\n createdAt: item.created_at,\n updatedAt: item.updated_at,\n }\n const { custom } = splitCustomFieldPayload(item)\n return Object.keys(custom).length ? { ...base, customFields: custom } : base\n },\n },\n actions: {\n create: {\n commandId: 'sales.tax-rates.create',\n schema: rawBodySchema,\n mapInput: async ({ raw, ctx }) => {\n const { translate } = await resolveTranslations()\n return parseScopedCommandInput(taxRateCreateSchema, raw ?? {}, ctx, translate)\n },\n response: ({ result }) => ({ id: result?.taxRateId ?? result?.id ?? null }),\n status: 201,\n },\n update: {\n commandId: 'sales.tax-rates.update',\n schema: rawBodySchema,\n mapInput: async ({ raw, ctx }) => {\n const { translate } = await resolveTranslations()\n return parseScopedCommandInput(taxRateUpdateSchema, raw ?? {}, ctx, translate)\n },\n response: () => ({ ok: true }),\n },\n delete: {\n commandId: 'sales.tax-rates.delete',\n schema: rawBodySchema,\n mapInput: async ({ parsed, ctx }) => {\n const { translate } = await resolveTranslations()\n const id = resolveCrudRecordId(parsed, ctx, translate)\n return { id }\n },\n response: () => ({ ok: true }),\n },\n },\n})\n\nexport const openApi: OpenApiRouteDoc = {\n tag: 'Sales',\n summary: 'Manage tax rates',\n methods: {\n GET: {\n summary: 'List tax rates',\n description: 'Returns a paginated list of sales tax rates for the current organization.',\n query: listSchema,\n responses: [{ status: 200, description: 'Paginated list of tax rates', schema: taxRateListResponseSchema }],\n },\n POST: {\n summary: 'Create tax rate',\n description: 'Creates a new tax rate record.',\n requestBody: {\n schema: taxRateCreateSchema,\n description: 'Payload describing the tax rate to create.',\n },\n responses: [\n {\n status: 201,\n description: 'Identifier of the created tax rate',\n schema: z.object({ id: z.string().uuid().nullable() }),\n },\n ],\n },\n PUT: {\n summary: 'Update tax rate',\n description: 'Updates an existing tax rate by identifier.',\n requestBody: {\n schema: taxRateUpdateSchema,\n description: 'Fields to update on the target tax rate.',\n },\n responses: [{ status: 200, description: 'Update acknowledgement', schema: z.object({ ok: z.boolean() }) }],\n },\n DELETE: {\n summary: 'Delete tax rate',\n description: 'Deletes a tax rate identified by `id`.',\n requestBody: {\n schema: taxRateDeleteSchema,\n description: 'Identifier payload for the tax rate to delete.',\n },\n responses: [{ status: 200, description: 'Deletion acknowledgement', schema: z.object({ ok: z.boolean() }) }],\n },\n },\n}\n\nexport const GET = crud.GET\nexport const POST = crud.POST\nexport const PUT = crud.PUT\nexport const DELETE = crud.DELETE\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { createScopedApiHelpers } from "@open-mercato/shared/lib/api/scoped";
|
|
2
|
+
import { escapeLikePattern } from "@open-mercato/shared/lib/db/escapeLikePattern";
|
|
2
3
|
const {
|
|
3
4
|
withScopedPayload,
|
|
4
5
|
parseScopedCommandInput,
|
|
@@ -11,7 +12,15 @@ const {
|
|
|
11
12
|
idRequired: { key: "sales.configuration.errors.id_required", fallback: "Record identifier is required." }
|
|
12
13
|
}
|
|
13
14
|
});
|
|
15
|
+
function buildAggregateSearchFilter(search) {
|
|
16
|
+
const term = typeof search === "string" ? search.trim() : "";
|
|
17
|
+
if (!term) return null;
|
|
18
|
+
return {
|
|
19
|
+
search_text: { $ilike: `%${escapeLikePattern(term)}%` }
|
|
20
|
+
};
|
|
21
|
+
}
|
|
14
22
|
export {
|
|
23
|
+
buildAggregateSearchFilter,
|
|
15
24
|
parseScopedCommandInput,
|
|
16
25
|
requireRecordId,
|
|
17
26
|
resolveCrudRecordId,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/modules/sales/api/utils.ts"],
|
|
4
|
-
"sourcesContent": ["import { createScopedApiHelpers } from '@open-mercato/shared/lib/api/scoped'\n\nconst {\n withScopedPayload,\n parseScopedCommandInput,\n requireRecordId,\n resolveCrudRecordId,\n} = createScopedApiHelpers({\n messages: {\n tenantRequired: { key: 'sales.configuration.errors.tenant_required', fallback: 'Tenant context is required.' },\n organizationRequired: { key: 'sales.configuration.errors.organization_required', fallback: 'Organization context is required.' },\n idRequired: { key: 'sales.configuration.errors.id_required', fallback: 'Record identifier is required.' },\n },\n})\n\nexport { withScopedPayload, parseScopedCommandInput, requireRecordId, resolveCrudRecordId }\n"],
|
|
5
|
-
"mappings": "AAAA,SAAS,8BAA8B;
|
|
4
|
+
"sourcesContent": ["import { createScopedApiHelpers } from '@open-mercato/shared/lib/api/scoped'\nimport { escapeLikePattern } from '@open-mercato/shared/lib/db/escapeLikePattern'\n\nconst {\n withScopedPayload,\n parseScopedCommandInput,\n requireRecordId,\n resolveCrudRecordId,\n} = createScopedApiHelpers({\n messages: {\n tenantRequired: { key: 'sales.configuration.errors.tenant_required', fallback: 'Tenant context is required.' },\n organizationRequired: { key: 'sales.configuration.errors.organization_required', fallback: 'Organization context is required.' },\n idRequired: { key: 'sales.configuration.errors.id_required', fallback: 'Record identifier is required.' },\n },\n})\n\nexport { withScopedPayload, parseScopedCommandInput, requireRecordId, resolveCrudRecordId }\n\nexport function buildAggregateSearchFilter(search?: string | null): Record<string, unknown> | null {\n const term = typeof search === 'string' ? search.trim() : ''\n if (!term) return null\n return {\n search_text: { $ilike: `%${escapeLikePattern(term)}%` },\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,8BAA8B;AACvC,SAAS,yBAAyB;AAElC,MAAM;AAAA,EACJ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,IAAI,uBAAuB;AAAA,EACzB,UAAU;AAAA,IACR,gBAAgB,EAAE,KAAK,8CAA8C,UAAU,8BAA8B;AAAA,IAC7G,sBAAsB,EAAE,KAAK,oDAAoD,UAAU,oCAAoC;AAAA,IAC/H,YAAY,EAAE,KAAK,0CAA0C,UAAU,iCAAiC;AAAA,EAC1G;AACF,CAAC;AAIM,SAAS,2BAA2B,QAAwD;AACjG,QAAM,OAAO,OAAO,WAAW,WAAW,OAAO,KAAK,IAAI;AAC1D,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO;AAAA,IACL,aAAa,EAAE,QAAQ,IAAI,kBAAkB,IAAI,CAAC,IAAI;AAAA,EACxD;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -5,13 +5,12 @@ import { CrudHttpError } from "@open-mercato/shared/lib/crud/errors";
|
|
|
5
5
|
import { Dictionary, DictionaryEntry } from "@open-mercato/core/modules/dictionaries/data/entities";
|
|
6
6
|
import { statusDictionaryCreateSchema, statusDictionaryUpdateSchema } from "../data/validators.js";
|
|
7
7
|
import { getSalesDictionaryDefinition, ensureSalesDictionary } from "./dictionaries.js";
|
|
8
|
-
import { parseScopedCommandInput, resolveCrudRecordId } from "../api/utils.js";
|
|
8
|
+
import { buildAggregateSearchFilter, parseScopedCommandInput, resolveCrudRecordId } from "../api/utils.js";
|
|
9
9
|
import {
|
|
10
10
|
createPagedListResponseSchema,
|
|
11
11
|
createSalesCrudOpenApi,
|
|
12
12
|
defaultDeleteRequestSchema
|
|
13
13
|
} from "../api/openapi.js";
|
|
14
|
-
import { escapeLikePattern } from "@open-mercato/shared/lib/db/escapeLikePattern";
|
|
15
14
|
function makeStatusDictionaryRoute(config) {
|
|
16
15
|
const { kind, entityId, fieldConstants: F } = config;
|
|
17
16
|
const definition = getSalesDictionaryDefinition(kind);
|
|
@@ -128,13 +127,8 @@ function makeStatusDictionaryRoute(config) {
|
|
|
128
127
|
const filters = {
|
|
129
128
|
dictionary_id: dictionaryId
|
|
130
129
|
};
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
filters.$or = [
|
|
134
|
-
{ [F.value]: { $ilike: term } },
|
|
135
|
-
{ [F.label]: { $ilike: term } }
|
|
136
|
-
];
|
|
137
|
-
}
|
|
130
|
+
const searchFilter = buildAggregateSearchFilter(query.search);
|
|
131
|
+
if (searchFilter) Object.assign(filters, searchFilter);
|
|
138
132
|
return filters;
|
|
139
133
|
},
|
|
140
134
|
transformItem: (item) => ({
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/modules/sales/lib/makeStatusDictionaryRoute.ts"],
|
|
4
|
-
"sourcesContent": ["import { z } from 'zod'\nimport { makeCrudRoute, type CrudCtx } from '@open-mercato/shared/lib/crud/factory'\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'\nimport { CrudHttpError } from '@open-mercato/shared/lib/crud/errors'\nimport { Dictionary, DictionaryEntry } from '@open-mercato/core/modules/dictionaries/data/entities'\nimport { statusDictionaryCreateSchema, statusDictionaryUpdateSchema } from '../data/validators'\nimport { getSalesDictionaryDefinition, ensureSalesDictionary, type SalesDictionaryKind } from './dictionaries'\nimport { parseScopedCommandInput, resolveCrudRecordId } from '../api/utils'\nimport {\n createPagedListResponseSchema,\n createSalesCrudOpenApi,\n defaultDeleteRequestSchema,\n} from '../api/openapi'\
|
|
5
|
-
"mappings": "AAAA,SAAS,SAAS;AAClB,SAAS,qBAAmC;AAE5C,SAAS,2BAA2B;AACpC,SAAS,qBAAqB;AAC9B,SAAS,YAAY,uBAAuB;AAC5C,SAAS,8BAA8B,oCAAoC;AAC3E,SAAS,8BAA8B,6BAAuD;AAC9F,SAAS,yBAAyB,2BAA2B;
|
|
4
|
+
"sourcesContent": ["import { z } from 'zod'\nimport { makeCrudRoute, type CrudCtx } from '@open-mercato/shared/lib/crud/factory'\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'\nimport { CrudHttpError } from '@open-mercato/shared/lib/crud/errors'\nimport { Dictionary, DictionaryEntry } from '@open-mercato/core/modules/dictionaries/data/entities'\nimport { statusDictionaryCreateSchema, statusDictionaryUpdateSchema } from '../data/validators'\nimport { getSalesDictionaryDefinition, ensureSalesDictionary, type SalesDictionaryKind } from './dictionaries'\nimport { buildAggregateSearchFilter, parseScopedCommandInput, resolveCrudRecordId } from '../api/utils'\nimport {\n createPagedListResponseSchema,\n createSalesCrudOpenApi,\n defaultDeleteRequestSchema,\n} from '../api/openapi'\n\ninterface StatusDictionaryRouteConfig {\n kind: SalesDictionaryKind\n entityId: string\n fieldConstants: Record<string, string>\n openApi: {\n resourceName: string\n pluralName: string\n description: string\n }\n}\n\nexport function makeStatusDictionaryRoute(config: StatusDictionaryRouteConfig) {\n const { kind, entityId, fieldConstants: F } = config\n const definition = getSalesDictionaryDefinition(kind)\n\n const rawBodySchema = z.object({}).passthrough()\n\n const listSchema = z\n .object({\n page: z.coerce.number().min(1).default(1),\n pageSize: z.coerce.number().min(1).max(100).default(50),\n search: z.string().optional(),\n sortField: z.string().optional(),\n sortDir: z.enum(['asc', 'desc']).optional(),\n })\n .passthrough()\n\n const metadata = {\n GET: { requireAuth: true, requireFeatures: ['sales.settings.manage'] },\n POST: { requireAuth: true, requireFeatures: ['sales.settings.manage'] },\n PUT: { requireAuth: true, requireFeatures: ['sales.settings.manage'] },\n DELETE: { requireAuth: true, requireFeatures: ['sales.settings.manage'] },\n }\n\n const dictionaryItemSchema = z.object({\n id: z.string().uuid(),\n value: z.string(),\n label: z.string().nullable(),\n color: z.string().nullable(),\n icon: z.string().nullable(),\n organizationId: z.string().uuid().nullable(),\n tenantId: z.string().uuid().nullable(),\n createdAt: z.string(),\n updatedAt: z.string(),\n })\n\n const dictionaryListResponseSchema = createPagedListResponseSchema(dictionaryItemSchema)\n\n const normalizeId = (value: unknown): string | null => {\n if (typeof value !== 'string') return null\n const trimmed = value.trim()\n return trimmed.length > 0 ? trimmed : null\n }\n\n async function resolveDictionaryContext(ctx: CrudCtx): Promise<{ dictionaryId: string; organizationId: string | null }> {\n if (!ctx.auth || !ctx.auth.tenantId) {\n throw new CrudHttpError(401, { error: 'Tenant context is required.' })\n }\n const em = ctx.container.resolve('em') as EntityManager\n const tenantId: string = ctx.auth.tenantId\n const candidateOrgIds = new Set<string>()\n const pushCandidate = (value: unknown) => {\n const normalized = normalizeId(value)\n if (normalized) candidateOrgIds.add(normalized)\n }\n pushCandidate(ctx.selectedOrganizationId)\n pushCandidate(ctx.auth.orgId ?? null)\n const scope = ctx.organizationScope\n if (scope) {\n if (Array.isArray(scope.filterIds)) {\n for (const id of scope.filterIds) pushCandidate(id)\n }\n if (Array.isArray(scope.allowedIds)) {\n for (const id of scope.allowedIds) pushCandidate(id)\n }\n }\n\n for (const orgId of candidateOrgIds) {\n const dictionary = await ensureSalesDictionary({\n em,\n tenantId,\n organizationId: orgId,\n kind,\n })\n if (dictionary) {\n return { dictionaryId: dictionary.id, organizationId: orgId }\n }\n }\n\n const fallback = await em.findOne(\n Dictionary,\n {\n tenantId,\n key: definition.key,\n deletedAt: null,\n },\n { orderBy: { createdAt: 'asc' } },\n )\n if (fallback) {\n return { dictionaryId: fallback.id, organizationId: fallback.organizationId }\n }\n throw new CrudHttpError(400, { error: 'Organization context is required.' })\n }\n\n const crud = makeCrudRoute({\n metadata,\n orm: {\n entity: DictionaryEntry,\n idField: 'id',\n orgField: 'organizationId',\n tenantField: 'tenantId',\n softDeleteField: null,\n },\n list: {\n schema: listSchema,\n entityId,\n fields: [\n F.id,\n F.value,\n F.label,\n F.color,\n F.icon,\n F.organization_id,\n F.tenant_id,\n F.created_at,\n F.updated_at,\n ],\n sortFieldMap: {\n id: F.id,\n value: F.value,\n label: F.label,\n createdAt: F.created_at,\n updatedAt: F.updated_at,\n },\n buildFilters: async (query, ctx) => {\n const { dictionaryId } = await resolveDictionaryContext(ctx)\n const filters: Record<string, unknown> = {\n dictionary_id: dictionaryId,\n }\n const searchFilter = buildAggregateSearchFilter(query.search)\n if (searchFilter) Object.assign(filters, searchFilter)\n return filters\n },\n transformItem: (item: Record<string, unknown>) => ({\n id: item.id,\n value: item.value,\n label: item.label,\n color: item.color ?? null,\n icon: item.icon ?? null,\n organizationId: item.organization_id ?? null,\n tenantId: item.tenant_id ?? null,\n createdAt: item.created_at,\n updatedAt: item.updated_at,\n }),\n },\n actions: {\n create: {\n commandId: `${definition.commandPrefix}.create`,\n schema: rawBodySchema,\n mapInput: async ({ raw, ctx }) => {\n const { translate } = await resolveTranslations()\n return parseScopedCommandInput(statusDictionaryCreateSchema, raw ?? {}, ctx, translate)\n },\n response: ({ result }) => ({ id: result?.entryId ?? null }),\n status: 201,\n },\n update: {\n commandId: `${definition.commandPrefix}.update`,\n schema: rawBodySchema,\n mapInput: async ({ raw, ctx }) => {\n const { translate } = await resolveTranslations()\n return parseScopedCommandInput(statusDictionaryUpdateSchema, raw ?? {}, ctx, translate)\n },\n response: () => ({ ok: true }),\n },\n delete: {\n commandId: `${definition.commandPrefix}.delete`,\n schema: rawBodySchema,\n mapInput: async ({ parsed, ctx }) => {\n const { translate } = await resolveTranslations()\n const id = resolveCrudRecordId(parsed, ctx, translate)\n return { id }\n },\n response: () => ({ ok: true }),\n },\n },\n })\n\n const openApi = createSalesCrudOpenApi({\n resourceName: config.openApi.resourceName,\n pluralName: config.openApi.pluralName,\n description: config.openApi.description,\n querySchema: listSchema,\n listResponseSchema: dictionaryListResponseSchema,\n create: { schema: statusDictionaryCreateSchema },\n update: { schema: statusDictionaryUpdateSchema },\n del: { schema: defaultDeleteRequestSchema },\n })\n\n return {\n metadata,\n openApi,\n GET: crud.GET,\n POST: crud.POST,\n PUT: crud.PUT,\n DELETE: crud.DELETE,\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -7,6 +7,7 @@ import { WorkflowDefinition } from "../../../data/entities.js";
|
|
|
7
7
|
import {
|
|
8
8
|
updateWorkflowDefinitionInputSchema
|
|
9
9
|
} from "../../../data/validators.js";
|
|
10
|
+
import { serializeWorkflowDefinition } from "../serialize.js";
|
|
10
11
|
const metadata = {
|
|
11
12
|
requireAuth: true,
|
|
12
13
|
requireFeatures: ["workflows.definitions.view"]
|
|
@@ -35,7 +36,7 @@ async function GET(request, context) {
|
|
|
35
36
|
{ status: 404 }
|
|
36
37
|
);
|
|
37
38
|
}
|
|
38
|
-
return NextResponse.json({ data: definition });
|
|
39
|
+
return NextResponse.json({ data: serializeWorkflowDefinition(definition) });
|
|
39
40
|
} catch (error) {
|
|
40
41
|
console.error("Error getting workflow definition:", error);
|
|
41
42
|
return NextResponse.json(
|
|
@@ -104,7 +105,7 @@ async function PUT(request, context) {
|
|
|
104
105
|
definition.updatedAt = /* @__PURE__ */ new Date();
|
|
105
106
|
await em.flush();
|
|
106
107
|
return NextResponse.json({
|
|
107
|
-
data: definition,
|
|
108
|
+
data: serializeWorkflowDefinition(definition),
|
|
108
109
|
message: "Workflow definition updated successfully"
|
|
109
110
|
});
|
|
110
111
|
} catch (error) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../src/modules/workflows/api/definitions/%5Bid%5D/route.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Workflow Definition Detail API\n *\n * Endpoints:\n * - GET /api/workflows/definitions/[id] - Get workflow definition\n * - PUT /api/workflows/definitions/[id] - Update workflow definition\n * - DELETE /api/workflows/definitions/[id] - Delete workflow definition (soft delete)\n */\n\nimport { NextRequest, NextResponse } from 'next/server'\nimport { z } from 'zod'\nimport { createRequestContainer } from '@open-mercato/shared/lib/di/container'\nimport { getAuthFromRequest } from '@open-mercato/shared/lib/auth/server'\nimport { resolveOrganizationScopeForRequest } from '@open-mercato/core/modules/directory/utils/organizationScope'\nimport { WorkflowDefinition } from '../../../data/entities'\nimport {\n updateWorkflowDefinitionInputSchema,\n type UpdateWorkflowDefinitionApiInput,\n} from '../../../data/validators'\n\nexport const metadata = {\n requireAuth: true,\n requireFeatures: ['workflows.definitions.view'],\n}\n\ninterface RouteContext {\n params: Promise<{\n id: string\n }>\n}\n\n/**\n * GET /api/workflows/definitions/[id]\n *\n * Get a single workflow definition by ID\n */\nexport async function GET(\n request: NextRequest,\n context: RouteContext\n) {\n try {\n const params = await context.params\n const container = await createRequestContainer()\n const em = container.resolve('em')\n const auth = await getAuthFromRequest(request)\n\n if (!auth) {\n return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n }\n\n const scope = await resolveOrganizationScopeForRequest({ container, auth, request })\n const tenantId = auth.tenantId\n const organizationId = scope?.selectedId ?? auth.orgId\n\n const definition = await em.findOne(WorkflowDefinition, {\n id: params.id,\n tenantId,\n organizationId,\n deletedAt: null,\n })\n\n if (!definition) {\n return NextResponse.json(\n { error: 'Workflow definition not found' },\n { status: 404 }\n )\n }\n\n return NextResponse.json({ data: definition })\n } catch (error) {\n console.error('Error getting workflow definition:', error)\n return NextResponse.json(\n { error: 'Failed to get workflow definition' },\n { status: 500 }\n )\n }\n}\n\n/**\n * PUT /api/workflows/definitions/[id]\n *\n * Update a workflow definition\n */\nexport async function PUT(\n request: NextRequest,\n context: RouteContext\n) {\n try {\n const params = await context.params\n const container = await createRequestContainer()\n const em = container.resolve('em')\n const auth = await getAuthFromRequest(request)\n\n if (!auth) {\n return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n }\n\n const scope = await resolveOrganizationScopeForRequest({ container, auth, request })\n const tenantId = auth.tenantId\n const organizationId = scope?.selectedId ?? auth.orgId\n\n // Check edit permission\n const rbacService = container.resolve('rbacService')\n const hasPermission = await rbacService.userHasAllFeatures(\n auth.sub,\n ['workflows.definitions.edit'],\n {\n tenantId,\n organizationId,\n }\n )\n\n if (!hasPermission) {\n return NextResponse.json(\n { error: 'Insufficient permissions' },\n { status: 403 }\n )\n }\n\n const body = await request.json()\n\n // Validate input\n const validation = updateWorkflowDefinitionInputSchema.safeParse(body)\n if (!validation.success) {\n return NextResponse.json(\n {\n error: 'Validation failed',\n details: validation.error.issues,\n },\n { status: 400 }\n )\n }\n\n const input: UpdateWorkflowDefinitionApiInput = validation.data\n\n // Find existing definition\n const definition = await em.findOne(WorkflowDefinition, {\n id: params.id,\n tenantId,\n organizationId,\n deletedAt: null,\n })\n\n if (!definition) {\n return NextResponse.json(\n { error: 'Workflow definition not found' },\n { status: 404 }\n )\n }\n\n // Update fields\n if (input.definition !== undefined) {\n definition.definition = input.definition\n }\n\n if (input.enabled !== undefined) {\n definition.enabled = input.enabled\n }\n\n definition.updatedAt = new Date()\n\n await em.flush()\n\n return NextResponse.json({\n data: definition,\n message: 'Workflow definition updated successfully',\n })\n } catch (error) {\n console.error('Error updating workflow definition:', error)\n return NextResponse.json(\n { error: 'Failed to update workflow definition' },\n { status: 500 }\n )\n }\n}\n\n/**\n * DELETE /api/workflows/definitions/[id]\n *\n * Soft delete a workflow definition\n */\nexport async function DELETE(\n request: NextRequest,\n context: RouteContext\n) {\n try {\n const params = await context.params\n const container = await createRequestContainer()\n const em = container.resolve('em')\n const auth = await getAuthFromRequest(request)\n\n if (!auth) {\n return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n }\n\n const scope = await resolveOrganizationScopeForRequest({ container, auth, request })\n const tenantId = auth.tenantId\n const organizationId = scope?.selectedId ?? auth.orgId\n\n // Check delete permission\n const rbacService = container.resolve('rbacService')\n const hasPermission = await rbacService.userHasAllFeatures(\n auth.sub,\n ['workflows.definitions.delete'],\n {\n tenantId,\n organizationId,\n }\n )\n\n if (!hasPermission) {\n return NextResponse.json(\n { error: 'Insufficient permissions' },\n { status: 403 }\n )\n }\n\n // Find existing definition\n const definition = await em.findOne(WorkflowDefinition, {\n id: params.id,\n tenantId,\n organizationId,\n deletedAt: null,\n })\n\n if (!definition) {\n return NextResponse.json(\n { error: 'Workflow definition not found' },\n { status: 404 }\n )\n }\n\n // Check if there are active workflow instances using this definition\n const { WorkflowInstance } = await import('../../../data/entities')\n const activeInstances = await em.count(WorkflowInstance, {\n definitionId: definition.id,\n status: { $in: ['RUNNING', 'WAITING'] },\n })\n\n if (activeInstances > 0) {\n return NextResponse.json(\n {\n error: `Cannot delete workflow definition with ${activeInstances} active instance(s)`,\n },\n { status: 409 }\n )\n }\n\n // Soft delete\n definition.deletedAt = new Date()\n definition.updatedAt = new Date()\n\n await em.flush()\n\n return NextResponse.json({\n message: 'Workflow definition deleted successfully',\n })\n } catch (error) {\n console.error('Error deleting workflow definition:', error)\n return NextResponse.json(\n { error: 'Failed to delete workflow definition' },\n { status: 500 }\n )\n }\n}\n\nexport const openApi = {\n methods: {\n GET: {\n summary: 'Get workflow definition',\n description: 'Get a single workflow definition by ID. Returns the complete workflow structure including steps and transitions (with embedded activities).',\n tags: ['Workflows'],\n pathParams: z.object({\n id: z.string().uuid(),\n }),\n responses: [\n {\n status: 200,\n description: 'Workflow definition found',\n example: {\n data: {\n id: '123e4567-e89b-12d3-a456-426614174000',\n workflowId: 'checkout-flow',\n workflowName: 'Checkout Flow',\n description: 'Complete checkout workflow for processing orders',\n version: 1,\n definition: {\n steps: [\n {\n stepId: 'start',\n stepName: 'Start',\n stepType: 'START',\n },\n {\n stepId: 'validate-cart',\n stepName: 'Validate Cart',\n stepType: 'AUTOMATED',\n description: 'Validate cart items and check inventory',\n },\n {\n stepId: 'payment',\n stepName: 'Process Payment',\n stepType: 'AUTOMATED',\n description: 'Charge payment method',\n retryPolicy: {\n maxAttempts: 3,\n backoffMs: 1000,\n },\n },\n {\n stepId: 'end',\n stepName: 'End',\n stepType: 'END',\n },\n ],\n transitions: [\n {\n transitionId: 'start-to-validate',\n fromStepId: 'start',\n toStepId: 'validate-cart',\n trigger: 'auto',\n },\n {\n transitionId: 'validate-to-payment',\n fromStepId: 'validate-cart',\n toStepId: 'payment',\n trigger: 'auto',\n },\n {\n transitionId: 'payment-to-end',\n fromStepId: 'payment',\n toStepId: 'end',\n trigger: 'auto',\n activities: [\n {\n activityName: 'Send Order Confirmation',\n activityType: 'SEND_EMAIL',\n config: {\n to: '{{context.customerEmail}}',\n subject: 'Order Confirmation #{{context.orderId}}',\n template: 'order_confirmation',\n },\n },\n ],\n },\n ],\n },\n enabled: true,\n tenantId: '123e4567-e89b-12d3-a456-426614174001',\n organizationId: '123e4567-e89b-12d3-a456-426614174002',\n createdAt: '2025-12-08T10:00:00.000Z',\n updatedAt: '2025-12-08T10:00:00.000Z',\n },\n },\n },\n {\n status: 404,\n description: 'Workflow definition not found',\n example: {\n error: 'Workflow definition not found',\n },\n },\n ],\n },\n PUT: {\n summary: 'Update workflow definition',\n description: 'Update an existing workflow definition. Supports partial updates - only provided fields will be updated.',\n tags: ['Workflows'],\n pathParams: z.object({\n id: z.string().uuid(),\n }),\n requestBody: {\n schema: updateWorkflowDefinitionInputSchema,\n example: {\n definition: {\n steps: [\n {\n stepId: 'start',\n stepName: 'Start',\n stepType: 'START',\n },\n {\n stepId: 'validate-cart',\n stepName: 'Validate Cart',\n stepType: 'AUTOMATED',\n },\n {\n stepId: 'payment',\n stepName: 'Process Payment',\n stepType: 'AUTOMATED',\n },\n {\n stepId: 'confirmation',\n stepName: 'Order Confirmation',\n stepType: 'AUTOMATED',\n },\n {\n stepId: 'end',\n stepName: 'End',\n stepType: 'END',\n },\n ],\n transitions: [\n {\n transitionId: 'start-to-validate',\n fromStepId: 'start',\n toStepId: 'validate-cart',\n trigger: 'auto',\n },\n {\n transitionId: 'validate-to-payment',\n fromStepId: 'validate-cart',\n toStepId: 'payment',\n trigger: 'auto',\n },\n {\n transitionId: 'payment-to-confirmation',\n fromStepId: 'payment',\n toStepId: 'confirmation',\n trigger: 'auto',\n },\n {\n transitionId: 'confirmation-to-end',\n fromStepId: 'confirmation',\n toStepId: 'end',\n trigger: 'auto',\n },\n ],\n },\n enabled: true,\n },\n },\n responses: [\n {\n status: 200,\n description: 'Workflow definition updated successfully',\n example: {\n data: {\n id: '123e4567-e89b-12d3-a456-426614174000',\n workflowId: 'checkout-flow',\n workflowName: 'Checkout Flow',\n description: 'Complete checkout workflow for processing orders',\n version: 1,\n definition: {\n steps: [\n { stepId: 'start', stepName: 'Start', stepType: 'START' },\n {\n stepId: 'validate-cart',\n stepName: 'Validate Cart',\n stepType: 'AUTOMATED',\n },\n {\n stepId: 'payment',\n stepName: 'Process Payment',\n stepType: 'AUTOMATED',\n },\n {\n stepId: 'confirmation',\n stepName: 'Order Confirmation',\n stepType: 'AUTOMATED',\n },\n { stepId: 'end', stepName: 'End', stepType: 'END' },\n ],\n transitions: [\n {\n transitionId: 'start-to-validate',\n fromStepId: 'start',\n toStepId: 'validate-cart',\n trigger: 'auto',\n },\n {\n transitionId: 'validate-to-payment',\n fromStepId: 'validate-cart',\n toStepId: 'payment',\n trigger: 'auto',\n },\n {\n transitionId: 'payment-to-confirmation',\n fromStepId: 'payment',\n toStepId: 'confirmation',\n trigger: 'auto',\n },\n {\n transitionId: 'confirmation-to-end',\n fromStepId: 'confirmation',\n toStepId: 'end',\n trigger: 'auto',\n },\n ],\n },\n enabled: true,\n tenantId: '123e4567-e89b-12d3-a456-426614174001',\n organizationId: '123e4567-e89b-12d3-a456-426614174002',\n createdAt: '2025-12-08T10:00:00.000Z',\n updatedAt: '2025-12-08T11:30:00.000Z',\n },\n message: 'Workflow definition updated successfully',\n },\n },\n {\n status: 400,\n description: 'Validation error',\n example: {\n error: 'Validation failed',\n details: [\n {\n code: 'invalid_type',\n message: 'Expected object, received string',\n path: ['definition'],\n },\n ],\n },\n },\n {\n status: 404,\n description: 'Workflow definition not found',\n example: {\n error: 'Workflow definition not found',\n },\n },\n ],\n },\n DELETE: {\n summary: 'Delete workflow definition',\n description: 'Soft delete a workflow definition. Cannot be deleted if there are active workflow instances (RUNNING or WAITING status) using this definition.',\n tags: ['Workflows'],\n pathParams: z.object({\n id: z.string().uuid(),\n }),\n responses: [\n {\n status: 200,\n description: 'Workflow definition deleted successfully',\n example: {\n message: 'Workflow definition deleted successfully',\n },\n },\n {\n status: 404,\n description: 'Workflow definition not found',\n example: {\n error: 'Workflow definition not found',\n },\n },\n {\n status: 409,\n description: 'Cannot delete - active workflow instances exist',\n example: {\n error: 'Cannot delete workflow definition with 3 active instance(s)',\n },\n },\n ],\n },\n },\n}\n"],
|
|
5
|
-
"mappings": "AASA,SAAsB,oBAAoB;AAC1C,SAAS,SAAS;AAClB,SAAS,8BAA8B;AACvC,SAAS,0BAA0B;AACnC,SAAS,0CAA0C;AACnD,SAAS,0BAA0B;AACnC;AAAA,EACE;AAAA,OAEK;
|
|
4
|
+
"sourcesContent": ["/**\n * Workflow Definition Detail API\n *\n * Endpoints:\n * - GET /api/workflows/definitions/[id] - Get workflow definition\n * - PUT /api/workflows/definitions/[id] - Update workflow definition\n * - DELETE /api/workflows/definitions/[id] - Delete workflow definition (soft delete)\n */\n\nimport { NextRequest, NextResponse } from 'next/server'\nimport { z } from 'zod'\nimport { createRequestContainer } from '@open-mercato/shared/lib/di/container'\nimport { getAuthFromRequest } from '@open-mercato/shared/lib/auth/server'\nimport { resolveOrganizationScopeForRequest } from '@open-mercato/core/modules/directory/utils/organizationScope'\nimport { WorkflowDefinition } from '../../../data/entities'\nimport {\n updateWorkflowDefinitionInputSchema,\n type UpdateWorkflowDefinitionApiInput,\n} from '../../../data/validators'\nimport { serializeWorkflowDefinition } from '../serialize'\n\nexport const metadata = {\n requireAuth: true,\n requireFeatures: ['workflows.definitions.view'],\n}\n\ninterface RouteContext {\n params: Promise<{\n id: string\n }>\n}\n\n/**\n * GET /api/workflows/definitions/[id]\n *\n * Get a single workflow definition by ID\n */\nexport async function GET(\n request: NextRequest,\n context: RouteContext\n) {\n try {\n const params = await context.params\n const container = await createRequestContainer()\n const em = container.resolve('em')\n const auth = await getAuthFromRequest(request)\n\n if (!auth) {\n return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n }\n\n const scope = await resolveOrganizationScopeForRequest({ container, auth, request })\n const tenantId = auth.tenantId\n const organizationId = scope?.selectedId ?? auth.orgId\n\n const definition = await em.findOne(WorkflowDefinition, {\n id: params.id,\n tenantId,\n organizationId,\n deletedAt: null,\n })\n\n if (!definition) {\n return NextResponse.json(\n { error: 'Workflow definition not found' },\n { status: 404 }\n )\n }\n\n return NextResponse.json({ data: serializeWorkflowDefinition(definition) })\n } catch (error) {\n console.error('Error getting workflow definition:', error)\n return NextResponse.json(\n { error: 'Failed to get workflow definition' },\n { status: 500 }\n )\n }\n}\n\n/**\n * PUT /api/workflows/definitions/[id]\n *\n * Update a workflow definition\n */\nexport async function PUT(\n request: NextRequest,\n context: RouteContext\n) {\n try {\n const params = await context.params\n const container = await createRequestContainer()\n const em = container.resolve('em')\n const auth = await getAuthFromRequest(request)\n\n if (!auth) {\n return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n }\n\n const scope = await resolveOrganizationScopeForRequest({ container, auth, request })\n const tenantId = auth.tenantId\n const organizationId = scope?.selectedId ?? auth.orgId\n\n // Check edit permission\n const rbacService = container.resolve('rbacService')\n const hasPermission = await rbacService.userHasAllFeatures(\n auth.sub,\n ['workflows.definitions.edit'],\n {\n tenantId,\n organizationId,\n }\n )\n\n if (!hasPermission) {\n return NextResponse.json(\n { error: 'Insufficient permissions' },\n { status: 403 }\n )\n }\n\n const body = await request.json()\n\n // Validate input\n const validation = updateWorkflowDefinitionInputSchema.safeParse(body)\n if (!validation.success) {\n return NextResponse.json(\n {\n error: 'Validation failed',\n details: validation.error.issues,\n },\n { status: 400 }\n )\n }\n\n const input: UpdateWorkflowDefinitionApiInput = validation.data\n\n // Find existing definition\n const definition = await em.findOne(WorkflowDefinition, {\n id: params.id,\n tenantId,\n organizationId,\n deletedAt: null,\n })\n\n if (!definition) {\n return NextResponse.json(\n { error: 'Workflow definition not found' },\n { status: 404 }\n )\n }\n\n // Update fields\n if (input.definition !== undefined) {\n definition.definition = input.definition\n }\n\n if (input.enabled !== undefined) {\n definition.enabled = input.enabled\n }\n\n definition.updatedAt = new Date()\n\n await em.flush()\n\n return NextResponse.json({\n data: serializeWorkflowDefinition(definition),\n message: 'Workflow definition updated successfully',\n })\n } catch (error) {\n console.error('Error updating workflow definition:', error)\n return NextResponse.json(\n { error: 'Failed to update workflow definition' },\n { status: 500 }\n )\n }\n}\n\n/**\n * DELETE /api/workflows/definitions/[id]\n *\n * Soft delete a workflow definition\n */\nexport async function DELETE(\n request: NextRequest,\n context: RouteContext\n) {\n try {\n const params = await context.params\n const container = await createRequestContainer()\n const em = container.resolve('em')\n const auth = await getAuthFromRequest(request)\n\n if (!auth) {\n return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n }\n\n const scope = await resolveOrganizationScopeForRequest({ container, auth, request })\n const tenantId = auth.tenantId\n const organizationId = scope?.selectedId ?? auth.orgId\n\n // Check delete permission\n const rbacService = container.resolve('rbacService')\n const hasPermission = await rbacService.userHasAllFeatures(\n auth.sub,\n ['workflows.definitions.delete'],\n {\n tenantId,\n organizationId,\n }\n )\n\n if (!hasPermission) {\n return NextResponse.json(\n { error: 'Insufficient permissions' },\n { status: 403 }\n )\n }\n\n // Find existing definition\n const definition = await em.findOne(WorkflowDefinition, {\n id: params.id,\n tenantId,\n organizationId,\n deletedAt: null,\n })\n\n if (!definition) {\n return NextResponse.json(\n { error: 'Workflow definition not found' },\n { status: 404 }\n )\n }\n\n // Check if there are active workflow instances using this definition\n const { WorkflowInstance } = await import('../../../data/entities')\n const activeInstances = await em.count(WorkflowInstance, {\n definitionId: definition.id,\n status: { $in: ['RUNNING', 'WAITING'] },\n })\n\n if (activeInstances > 0) {\n return NextResponse.json(\n {\n error: `Cannot delete workflow definition with ${activeInstances} active instance(s)`,\n },\n { status: 409 }\n )\n }\n\n // Soft delete\n definition.deletedAt = new Date()\n definition.updatedAt = new Date()\n\n await em.flush()\n\n return NextResponse.json({\n message: 'Workflow definition deleted successfully',\n })\n } catch (error) {\n console.error('Error deleting workflow definition:', error)\n return NextResponse.json(\n { error: 'Failed to delete workflow definition' },\n { status: 500 }\n )\n }\n}\n\nexport const openApi = {\n methods: {\n GET: {\n summary: 'Get workflow definition',\n description: 'Get a single workflow definition by ID. Returns the complete workflow structure including steps and transitions (with embedded activities).',\n tags: ['Workflows'],\n pathParams: z.object({\n id: z.string().uuid(),\n }),\n responses: [\n {\n status: 200,\n description: 'Workflow definition found',\n example: {\n data: {\n id: '123e4567-e89b-12d3-a456-426614174000',\n workflowId: 'checkout-flow',\n workflowName: 'Checkout Flow',\n description: 'Complete checkout workflow for processing orders',\n version: 1,\n definition: {\n steps: [\n {\n stepId: 'start',\n stepName: 'Start',\n stepType: 'START',\n },\n {\n stepId: 'validate-cart',\n stepName: 'Validate Cart',\n stepType: 'AUTOMATED',\n description: 'Validate cart items and check inventory',\n },\n {\n stepId: 'payment',\n stepName: 'Process Payment',\n stepType: 'AUTOMATED',\n description: 'Charge payment method',\n retryPolicy: {\n maxAttempts: 3,\n backoffMs: 1000,\n },\n },\n {\n stepId: 'end',\n stepName: 'End',\n stepType: 'END',\n },\n ],\n transitions: [\n {\n transitionId: 'start-to-validate',\n fromStepId: 'start',\n toStepId: 'validate-cart',\n trigger: 'auto',\n },\n {\n transitionId: 'validate-to-payment',\n fromStepId: 'validate-cart',\n toStepId: 'payment',\n trigger: 'auto',\n },\n {\n transitionId: 'payment-to-end',\n fromStepId: 'payment',\n toStepId: 'end',\n trigger: 'auto',\n activities: [\n {\n activityName: 'Send Order Confirmation',\n activityType: 'SEND_EMAIL',\n config: {\n to: '{{context.customerEmail}}',\n subject: 'Order Confirmation #{{context.orderId}}',\n template: 'order_confirmation',\n },\n },\n ],\n },\n ],\n },\n enabled: true,\n tenantId: '123e4567-e89b-12d3-a456-426614174001',\n organizationId: '123e4567-e89b-12d3-a456-426614174002',\n createdAt: '2025-12-08T10:00:00.000Z',\n updatedAt: '2025-12-08T10:00:00.000Z',\n },\n },\n },\n {\n status: 404,\n description: 'Workflow definition not found',\n example: {\n error: 'Workflow definition not found',\n },\n },\n ],\n },\n PUT: {\n summary: 'Update workflow definition',\n description: 'Update an existing workflow definition. Supports partial updates - only provided fields will be updated.',\n tags: ['Workflows'],\n pathParams: z.object({\n id: z.string().uuid(),\n }),\n requestBody: {\n schema: updateWorkflowDefinitionInputSchema,\n example: {\n definition: {\n steps: [\n {\n stepId: 'start',\n stepName: 'Start',\n stepType: 'START',\n },\n {\n stepId: 'validate-cart',\n stepName: 'Validate Cart',\n stepType: 'AUTOMATED',\n },\n {\n stepId: 'payment',\n stepName: 'Process Payment',\n stepType: 'AUTOMATED',\n },\n {\n stepId: 'confirmation',\n stepName: 'Order Confirmation',\n stepType: 'AUTOMATED',\n },\n {\n stepId: 'end',\n stepName: 'End',\n stepType: 'END',\n },\n ],\n transitions: [\n {\n transitionId: 'start-to-validate',\n fromStepId: 'start',\n toStepId: 'validate-cart',\n trigger: 'auto',\n },\n {\n transitionId: 'validate-to-payment',\n fromStepId: 'validate-cart',\n toStepId: 'payment',\n trigger: 'auto',\n },\n {\n transitionId: 'payment-to-confirmation',\n fromStepId: 'payment',\n toStepId: 'confirmation',\n trigger: 'auto',\n },\n {\n transitionId: 'confirmation-to-end',\n fromStepId: 'confirmation',\n toStepId: 'end',\n trigger: 'auto',\n },\n ],\n },\n enabled: true,\n },\n },\n responses: [\n {\n status: 200,\n description: 'Workflow definition updated successfully',\n example: {\n data: {\n id: '123e4567-e89b-12d3-a456-426614174000',\n workflowId: 'checkout-flow',\n workflowName: 'Checkout Flow',\n description: 'Complete checkout workflow for processing orders',\n version: 1,\n definition: {\n steps: [\n { stepId: 'start', stepName: 'Start', stepType: 'START' },\n {\n stepId: 'validate-cart',\n stepName: 'Validate Cart',\n stepType: 'AUTOMATED',\n },\n {\n stepId: 'payment',\n stepName: 'Process Payment',\n stepType: 'AUTOMATED',\n },\n {\n stepId: 'confirmation',\n stepName: 'Order Confirmation',\n stepType: 'AUTOMATED',\n },\n { stepId: 'end', stepName: 'End', stepType: 'END' },\n ],\n transitions: [\n {\n transitionId: 'start-to-validate',\n fromStepId: 'start',\n toStepId: 'validate-cart',\n trigger: 'auto',\n },\n {\n transitionId: 'validate-to-payment',\n fromStepId: 'validate-cart',\n toStepId: 'payment',\n trigger: 'auto',\n },\n {\n transitionId: 'payment-to-confirmation',\n fromStepId: 'payment',\n toStepId: 'confirmation',\n trigger: 'auto',\n },\n {\n transitionId: 'confirmation-to-end',\n fromStepId: 'confirmation',\n toStepId: 'end',\n trigger: 'auto',\n },\n ],\n },\n enabled: true,\n tenantId: '123e4567-e89b-12d3-a456-426614174001',\n organizationId: '123e4567-e89b-12d3-a456-426614174002',\n createdAt: '2025-12-08T10:00:00.000Z',\n updatedAt: '2025-12-08T11:30:00.000Z',\n },\n message: 'Workflow definition updated successfully',\n },\n },\n {\n status: 400,\n description: 'Validation error',\n example: {\n error: 'Validation failed',\n details: [\n {\n code: 'invalid_type',\n message: 'Expected object, received string',\n path: ['definition'],\n },\n ],\n },\n },\n {\n status: 404,\n description: 'Workflow definition not found',\n example: {\n error: 'Workflow definition not found',\n },\n },\n ],\n },\n DELETE: {\n summary: 'Delete workflow definition',\n description: 'Soft delete a workflow definition. Cannot be deleted if there are active workflow instances (RUNNING or WAITING status) using this definition.',\n tags: ['Workflows'],\n pathParams: z.object({\n id: z.string().uuid(),\n }),\n responses: [\n {\n status: 200,\n description: 'Workflow definition deleted successfully',\n example: {\n message: 'Workflow definition deleted successfully',\n },\n },\n {\n status: 404,\n description: 'Workflow definition not found',\n example: {\n error: 'Workflow definition not found',\n },\n },\n {\n status: 409,\n description: 'Cannot delete - active workflow instances exist',\n example: {\n error: 'Cannot delete workflow definition with 3 active instance(s)',\n },\n },\n ],\n },\n },\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -7,6 +7,7 @@ import { WorkflowDefinition } from "../../data/entities.js";
|
|
|
7
7
|
import {
|
|
8
8
|
createWorkflowDefinitionInputSchema
|
|
9
9
|
} from "../../data/validators.js";
|
|
10
|
+
import { serializeWorkflowDefinition } from "./serialize.js";
|
|
10
11
|
const metadata = {
|
|
11
12
|
requireAuth: true,
|
|
12
13
|
requireFeatures: ["workflows.definitions.view"]
|
|
@@ -42,7 +43,7 @@ async function GET(request) {
|
|
|
42
43
|
if (search) {
|
|
43
44
|
where.$or = [
|
|
44
45
|
{ workflowId: { $ilike: `%${search}%` } },
|
|
45
|
-
{
|
|
46
|
+
{ workflowName: { $ilike: `%${search}%` } }
|
|
46
47
|
];
|
|
47
48
|
}
|
|
48
49
|
const [definitions, total] = await em.findAndCount(
|
|
@@ -55,7 +56,7 @@ async function GET(request) {
|
|
|
55
56
|
}
|
|
56
57
|
);
|
|
57
58
|
return NextResponse.json({
|
|
58
|
-
data: definitions,
|
|
59
|
+
data: definitions.map(serializeWorkflowDefinition),
|
|
59
60
|
pagination: {
|
|
60
61
|
total,
|
|
61
62
|
limit,
|
|
@@ -140,7 +141,7 @@ async function POST(request) {
|
|
|
140
141
|
await em.persistAndFlush(definition);
|
|
141
142
|
return NextResponse.json(
|
|
142
143
|
{
|
|
143
|
-
data: definition,
|
|
144
|
+
data: serializeWorkflowDefinition(definition),
|
|
144
145
|
message: "Workflow definition created successfully"
|
|
145
146
|
},
|
|
146
147
|
{ status: 201 }
|