@open-mercato/core 0.4.6-develop-2ba4e02ffb → 0.4.6-develop-15c18897fc

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.
@@ -20,7 +20,7 @@ class Migration20251116191744 extends Migration {
20
20
  if not exists (
21
21
  select 1
22
22
  from information_schema.columns
23
- where table_schema = 'public'
23
+ where table_schema = current_schema()
24
24
  and table_name = 'catalog_product_variant_relations'
25
25
  and column_name = 'child_product_id'
26
26
  ) then
@@ -30,7 +30,7 @@ class Migration20251116191744 extends Migration {
30
30
  if exists (
31
31
  select 1
32
32
  from information_schema.columns
33
- where table_schema = 'public'
33
+ where table_schema = current_schema()
34
34
  and table_name = 'catalog_product_variant_relations'
35
35
  and column_name = 'child_variant_id'
36
36
  ) then
@@ -85,7 +85,7 @@ class Migration20251116191744 extends Migration {
85
85
  if exists (
86
86
  select 1
87
87
  from information_schema.columns
88
- where table_schema = 'public'
88
+ where table_schema = current_schema()
89
89
  and table_name = 'catalog_product_variant_relations'
90
90
  and column_name = 'child_product_id'
91
91
  ) then
@@ -95,7 +95,7 @@ class Migration20251116191744 extends Migration {
95
95
  if exists (
96
96
  select 1
97
97
  from information_schema.columns
98
- where table_schema = 'public'
98
+ where table_schema = current_schema()
99
99
  and table_name = 'catalog_product_variant_relations'
100
100
  and column_name = 'child_variant_id'
101
101
  ) then
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/catalog/migrations/Migration20251116191744.ts"],
4
- "sourcesContent": ["import { Migration } from '@mikro-orm/migrations';\n\nexport class Migration20251116191744 extends Migration {\n\n override async up(): Promise<void> {\n this.addSql(`\n do $$\n begin\n if to_regclass('catalog_product_variant_relations') is null then\n return;\n end if;\n\n if exists (\n select 1\n from pg_constraint\n where conrelid = 'catalog_product_variant_relations'::regclass\n and conname = 'catalog_product_variant_relations_unique'\n ) then\n alter table \"catalog_product_variant_relations\" drop constraint \"catalog_product_variant_relations_unique\";\n end if;\n\n if not exists (\n select 1\n from information_schema.columns\n where table_schema = 'public'\n and table_name = 'catalog_product_variant_relations'\n and column_name = 'child_product_id'\n ) then\n alter table \"catalog_product_variant_relations\" add column \"child_product_id\" uuid null;\n end if;\n\n if exists (\n select 1\n from information_schema.columns\n where table_schema = 'public'\n and table_name = 'catalog_product_variant_relations'\n and column_name = 'child_variant_id'\n ) then\n alter table \"catalog_product_variant_relations\" alter column \"child_variant_id\" drop default;\n alter table \"catalog_product_variant_relations\" alter column \"child_variant_id\" type uuid using (\"child_variant_id\"::text::uuid);\n alter table \"catalog_product_variant_relations\" alter column \"child_variant_id\" drop not null;\n end if;\n\n if not exists (\n select 1\n from pg_constraint\n where conrelid = 'catalog_product_variant_relations'::regclass\n and conname = 'catalog_product_variant_relations_child_product_id_foreign'\n ) then\n alter table \"catalog_product_variant_relations\"\n add constraint \"catalog_product_variant_relations_child_product_id_foreign\"\n foreign key (\"child_product_id\") references \"catalog_products\" (\"id\") on update cascade on delete cascade;\n end if;\n\n if not exists (\n select 1\n from pg_class\n where relname = 'catalog_product_variant_relations_child_product_idx'\n and relkind = 'i'\n ) then\n create index \"catalog_product_variant_relations_child_product_idx\"\n on \"catalog_product_variant_relations\" (\"child_product_id\", \"organization_id\", \"tenant_id\");\n end if;\n end\n $$;\n `);\n }\n\n override async down(): Promise<void> {\n this.addSql(`\n do $$\n begin\n if to_regclass('catalog_product_variant_relations') is null then\n return;\n end if;\n\n if exists (\n select 1\n from pg_constraint\n where conrelid = 'catalog_product_variant_relations'::regclass\n and conname = 'catalog_product_variant_relations_child_product_id_foreign'\n ) then\n alter table \"catalog_product_variant_relations\" drop constraint \"catalog_product_variant_relations_child_product_id_foreign\";\n end if;\n\n drop index if exists \"catalog_product_variant_relations_child_product_idx\";\n\n if exists (\n select 1\n from information_schema.columns\n where table_schema = 'public'\n and table_name = 'catalog_product_variant_relations'\n and column_name = 'child_product_id'\n ) then\n alter table \"catalog_product_variant_relations\" drop column \"child_product_id\";\n end if;\n\n if exists (\n select 1\n from information_schema.columns\n where table_schema = 'public'\n and table_name = 'catalog_product_variant_relations'\n and column_name = 'child_variant_id'\n ) then\n alter table \"catalog_product_variant_relations\" alter column \"child_variant_id\" drop default;\n alter table \"catalog_product_variant_relations\" alter column \"child_variant_id\" type uuid using (\"child_variant_id\"::text::uuid);\n alter table \"catalog_product_variant_relations\" alter column \"child_variant_id\" set not null;\n end if;\n\n if not exists (\n select 1\n from pg_constraint\n where conrelid = 'catalog_product_variant_relations'::regclass\n and conname = 'catalog_product_variant_relations_unique'\n ) then\n alter table \"catalog_product_variant_relations\"\n add constraint \"catalog_product_variant_relations_unique\"\n unique (\"parent_variant_id\", \"child_variant_id\", \"relation_type\");\n end if;\n end\n $$;\n `);\n }\n\n}\n"],
4
+ "sourcesContent": ["import { Migration } from '@mikro-orm/migrations';\n\nexport class Migration20251116191744 extends Migration {\n\n override async up(): Promise<void> {\n this.addSql(`\n do $$\n begin\n if to_regclass('catalog_product_variant_relations') is null then\n return;\n end if;\n\n if exists (\n select 1\n from pg_constraint\n where conrelid = 'catalog_product_variant_relations'::regclass\n and conname = 'catalog_product_variant_relations_unique'\n ) then\n alter table \"catalog_product_variant_relations\" drop constraint \"catalog_product_variant_relations_unique\";\n end if;\n\n if not exists (\n select 1\n from information_schema.columns\n where table_schema = current_schema()\n and table_name = 'catalog_product_variant_relations'\n and column_name = 'child_product_id'\n ) then\n alter table \"catalog_product_variant_relations\" add column \"child_product_id\" uuid null;\n end if;\n\n if exists (\n select 1\n from information_schema.columns\n where table_schema = current_schema()\n and table_name = 'catalog_product_variant_relations'\n and column_name = 'child_variant_id'\n ) then\n alter table \"catalog_product_variant_relations\" alter column \"child_variant_id\" drop default;\n alter table \"catalog_product_variant_relations\" alter column \"child_variant_id\" type uuid using (\"child_variant_id\"::text::uuid);\n alter table \"catalog_product_variant_relations\" alter column \"child_variant_id\" drop not null;\n end if;\n\n if not exists (\n select 1\n from pg_constraint\n where conrelid = 'catalog_product_variant_relations'::regclass\n and conname = 'catalog_product_variant_relations_child_product_id_foreign'\n ) then\n alter table \"catalog_product_variant_relations\"\n add constraint \"catalog_product_variant_relations_child_product_id_foreign\"\n foreign key (\"child_product_id\") references \"catalog_products\" (\"id\") on update cascade on delete cascade;\n end if;\n\n if not exists (\n select 1\n from pg_class\n where relname = 'catalog_product_variant_relations_child_product_idx'\n and relkind = 'i'\n ) then\n create index \"catalog_product_variant_relations_child_product_idx\"\n on \"catalog_product_variant_relations\" (\"child_product_id\", \"organization_id\", \"tenant_id\");\n end if;\n end\n $$;\n `);\n }\n\n override async down(): Promise<void> {\n this.addSql(`\n do $$\n begin\n if to_regclass('catalog_product_variant_relations') is null then\n return;\n end if;\n\n if exists (\n select 1\n from pg_constraint\n where conrelid = 'catalog_product_variant_relations'::regclass\n and conname = 'catalog_product_variant_relations_child_product_id_foreign'\n ) then\n alter table \"catalog_product_variant_relations\" drop constraint \"catalog_product_variant_relations_child_product_id_foreign\";\n end if;\n\n drop index if exists \"catalog_product_variant_relations_child_product_idx\";\n\n if exists (\n select 1\n from information_schema.columns\n where table_schema = current_schema()\n and table_name = 'catalog_product_variant_relations'\n and column_name = 'child_product_id'\n ) then\n alter table \"catalog_product_variant_relations\" drop column \"child_product_id\";\n end if;\n\n if exists (\n select 1\n from information_schema.columns\n where table_schema = current_schema()\n and table_name = 'catalog_product_variant_relations'\n and column_name = 'child_variant_id'\n ) then\n alter table \"catalog_product_variant_relations\" alter column \"child_variant_id\" drop default;\n alter table \"catalog_product_variant_relations\" alter column \"child_variant_id\" type uuid using (\"child_variant_id\"::text::uuid);\n alter table \"catalog_product_variant_relations\" alter column \"child_variant_id\" set not null;\n end if;\n\n if not exists (\n select 1\n from pg_constraint\n where conrelid = 'catalog_product_variant_relations'::regclass\n and conname = 'catalog_product_variant_relations_unique'\n ) then\n alter table \"catalog_product_variant_relations\"\n add constraint \"catalog_product_variant_relations_unique\"\n unique (\"parent_variant_id\", \"child_variant_id\", \"relation_type\");\n end if;\n end\n $$;\n `);\n }\n\n}\n"],
5
5
  "mappings": "AAAA,SAAS,iBAAiB;AAEnB,MAAM,gCAAgC,UAAU;AAAA,EAErD,MAAe,KAAoB;AACjC,SAAK,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KA4DX;AAAA,EACH;AAAA,EAEA,MAAe,OAAsB;AACnC,SAAK,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAoDX;AAAA,EACH;AAEF;",
6
6
  "names": []
7
7
  }
@@ -524,7 +524,8 @@ async function GET(_req, ctx) {
524
524
  timezone: profile.timezone,
525
525
  linkedInUrl: profile.linkedInUrl,
526
526
  twitterUrl: profile.twitterUrl,
527
- companyEntityId: profile.company ? typeof profile.company === "string" ? profile.company : profile.company.id : null
527
+ companyEntityId: profile.company ? typeof profile.company === "string" ? profile.company : profile.company.id : null,
528
+ updatedAt: profile.updatedAt.toISOString()
528
529
  } : null,
529
530
  customFields,
530
531
  tags: serializeTags(tagAssignments),
@@ -672,7 +673,8 @@ const personDetailResponseSchema = z.object({
672
673
  timezone: z.string().nullable().optional(),
673
674
  linkedInUrl: z.string().nullable().optional(),
674
675
  twitterUrl: z.string().nullable().optional(),
675
- companyEntityId: z.string().uuid().nullable().optional()
676
+ companyEntityId: z.string().uuid().nullable().optional(),
677
+ updatedAt: z.string()
676
678
  }).nullable(),
677
679
  customFields: z.record(z.string(), z.unknown()),
678
680
  tags: z.array(
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/modules/customers/api/people/%5Bid%5D/route.ts"],
4
- "sourcesContent": ["import { 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 type { EntityManager } from '@mikro-orm/postgresql'\nimport {\n CustomerEntity,\n CustomerPersonProfile,\n CustomerAddress,\n CustomerComment,\n CustomerActivity,\n CustomerTagAssignment,\n CustomerTag,\n CustomerDealPersonLink,\n CustomerDeal,\n CustomerTodoLink,\n} from '../../../data/entities'\nimport { User } from '@open-mercato/core/modules/auth/data/entities'\nimport { loadCustomFieldValues } from '@open-mercato/shared/lib/crud/custom-fields'\nimport { E } from '#generated/entities.ids.generated'\nimport { mergePersonCustomFieldValues, resolvePersonCustomFieldRouting } from '../../../lib/customFieldRouting'\nimport type { QueryEngine } from '@open-mercato/shared/lib/query/types'\nimport type { EntityId } from '@open-mercato/shared/modules/entities'\nimport type { OpenApiRouteDoc } from '@open-mercato/shared/lib/openapi'\nimport { findWithDecryption } from '@open-mercato/shared/lib/encryption/find'\nimport { parseBooleanFromUnknown, parseBooleanToken } from '@open-mercato/shared/lib/boolean'\n\nconst paramsSchema = z.object({\n id: z.string().uuid(),\n})\n\nfunction parseIncludeParams(request: Request): Set<string> {\n const url = new URL(request.url)\n const raw = url.searchParams.getAll('include')\n const tokens = new Set<string>()\n raw.forEach((entry) => {\n if (!entry) return\n entry\n .split(',')\n .map((part) => part.trim().toLowerCase())\n .filter((part) => part.length > 0)\n .forEach((part) => tokens.add(part))\n })\n return tokens\n}\n\nfunction forbidden(message: string) {\n return NextResponse.json({ error: message }, { status: 403 })\n}\n\nfunction notFound(message: string) {\n return NextResponse.json({ error: message }, { status: 404 })\n}\n\nfunction serializeTags(assignments: CustomerTagAssignment[]): Array<{ id: string; label: string; color: string | null }> {\n return assignments\n .map((assignment) => {\n const tag = assignment.tag as CustomerTag | string | null\n if (!tag || typeof tag === 'string') return null\n return {\n id: tag.id,\n label: tag.label,\n color: tag.color ?? null,\n }\n })\n .filter(\n (tag: { id: string; label: string; color: string | null } | null): tag is {\n id: string\n label: string\n color: string | null\n } => tag !== null,\n )\n}\n\ntype TodoDetail = {\n title: string | null\n isDone: boolean | null\n priority: number | null\n severity: string | null\n description: string | null\n dueAt: string | null\n organizationId: string | null\n customValues: Record<string, unknown> | null\n}\n\nfunction extractTodoTitle(record: Record<string, unknown>): string | null {\n const candidates = ['title', 'subject', 'name', 'summary', 'text', 'description']\n for (const key of candidates) {\n const value = record[key]\n if (typeof value === 'string' && value.trim().length > 0) {\n return value.trim()\n }\n }\n return null\n}\n\nfunction parseNumber(value: unknown): number | null {\n if (typeof value === 'number' && Number.isFinite(value)) return value\n if (typeof value === 'string') {\n const trimmed = value.trim()\n if (!trimmed) return null\n const parsed = Number(trimmed)\n if (!Number.isNaN(parsed)) return parsed\n }\n return null\n}\n\nfunction parseDateValue(value: unknown): string | null {\n if (value instanceof Date) {\n const ts = value.getTime()\n return Number.isNaN(ts) ? null : value.toISOString()\n }\n if (typeof value === 'string') {\n const trimmed = value.trim()\n if (!trimmed) return null\n const candidate = new Date(trimmed)\n if (!Number.isNaN(candidate.getTime())) return candidate.toISOString()\n }\n return null\n}\n\nfunction readCustomField(record: Record<string, unknown>, key: string): unknown {\n const custom = record.custom ?? record.customFields ?? record.cf\n if (custom && typeof custom === 'object') {\n const bucket = custom as Record<string, unknown>\n if (key in bucket) return bucket[key]\n }\n return undefined\n}\n\ntype RouteProfilerMark = { label: string; time: bigint; extra?: Record<string, unknown> }\ntype RouteProfiler = { enabled: boolean; mark: (label: string, extra?: Record<string, unknown>) => void; end: (extra?: Record<string, unknown>) => void }\n\nfunction normalizeProfilerTokens(input: string | null | undefined): string[] {\n if (!input) return []\n return input\n .split(',')\n .map((token) => token.trim().toLowerCase())\n .filter((token) => token.length > 0)\n}\n\nfunction profilerMatches(scope: string, tokens: string[]): boolean {\n if (!tokens.length) return false\n const lower = scope.toLowerCase()\n return tokens.some((token) => {\n if (token === '*' || token === 'all' || parseBooleanToken(token) === true) return true\n if (token.endsWith('*')) {\n const prefix = token.slice(0, -1)\n return prefix.length === 0 ? true : lower.startsWith(prefix)\n }\n return token === lower\n })\n}\n\nfunction isRouteProfilingEnabled(scope: string): boolean {\n const candidates = [\n process.env.OM_CRUD_PROFILE,\n process.env.NEXT_PUBLIC_OM_CRUD_PROFILE,\n process.env.OM_ROUTE_PROFILE,\n process.env.NEXT_PUBLIC_OM_ROUTE_PROFILE,\n ]\n for (const raw of candidates) {\n if (!raw) continue\n const tokens = normalizeProfilerTokens(raw)\n if (profilerMatches(scope, tokens)) return true\n }\n return false\n}\n\nfunction createRouteProfiler(scope: string): RouteProfiler {\n if (!isRouteProfilingEnabled(scope)) {\n return { enabled: false, mark: () => {}, end: () => {} }\n }\n const marks: RouteProfilerMark[] = [{ label: 'start', time: process.hrtime.bigint() }]\n const round = (value: number) => Math.round(value * 1000) / 1000\n return {\n enabled: true,\n mark(label, extra) {\n marks.push({ label, time: process.hrtime.bigint(), extra })\n },\n end(extra) {\n marks.push({ label: 'end', time: process.hrtime.bigint(), extra })\n const segments: Array<{ step: string; durationMs: number; extra?: Record<string, unknown> }> = []\n for (let idx = 1; idx < marks.length; idx += 1) {\n const current = marks[idx]\n const previous = marks[idx - 1]\n if (current.label === 'end') continue\n const durationMs = Number(current.time - previous.time) / 1_000_000\n segments.push({\n step: current.label,\n durationMs: round(durationMs),\n ...(current.extra ? { extra: current.extra } : {}),\n })\n }\n const totalNs = marks[marks.length - 1].time - marks[0].time\n const payload: Record<string, unknown> = {\n scope,\n totalMs: round(Number(totalNs) / 1_000_000),\n steps: segments,\n }\n const tail = marks[marks.length - 1]\n if (tail.extra && Object.keys(tail.extra).length > 0) payload.meta = tail.extra\n else if (extra && Object.keys(extra).length > 0) payload.meta = extra\n try {\n console.info('[route:profile]', payload)\n } catch {\n // ignore logging failures\n }\n },\n }\n}\n\nasync function resolveTodoDetails(\n queryEngine: QueryEngine,\n links: CustomerTodoLink[],\n tenantId: string | null,\n organizationIds: Array<string | null>,\n profiler?: RouteProfiler,\n): Promise<Map<string, TodoDetail>> {\n const details = new Map<string, TodoDetail>()\n if (!links.length || !tenantId) return details\n\n const scopedOrgIds = organizationIds\n .filter((value): value is string => typeof value === 'string' && value.trim().length > 0)\n\n const idsBySource = new Map<string, Set<string>>()\n for (const link of links) {\n const source = typeof link.todoSource === 'string' && link.todoSource.trim().length > 0 ? link.todoSource : 'example:todo'\n const id = typeof link.todoId === 'string' && link.todoId.trim().length > 0 ? link.todoId : String(link.todoId ?? '')\n if (!id) continue\n if (!idsBySource.has(source)) idsBySource.set(source, new Set<string>())\n idsBySource.get(source)!.add(id)\n }\n\n profiler?.mark('todo_links_grouped', { sourceCount: idsBySource.size, linkCount: links.length })\n\n for (const [source, idSet] of idsBySource.entries()) {\n const ids = Array.from(idSet)\n if (!ids.length) continue\n profiler?.mark('todo_query_start', { source, count: ids.length })\n try {\n const result = await queryEngine.query<Record<string, unknown>>(source as EntityId, {\n tenantId,\n organizationIds: scopedOrgIds.length > 0 ? scopedOrgIds : undefined,\n filters: { id: { $in: ids } },\n includeCustomFields: ['priority', 'due_at', 'severity', 'description'],\n page: { page: 1, pageSize: Math.max(ids.length, 1) },\n })\n const itemCount = Array.isArray(result.items) ? result.items.length : 0\n profiler?.mark('todo_query_complete', { source, itemCount })\n let enriched = 0\n for (const item of result.items ?? []) {\n if (!item || typeof item !== 'object') continue\n const record = item as Record<string, unknown>\n const rawId = typeof record.id === 'string' && record.id.trim().length > 0 ? record.id : String(record.id ?? '')\n if (!rawId) continue\n const title = extractTodoTitle(record)\n const isDone = (() => {\n const direct = parseBooleanFromUnknown(record.is_done)\n if (direct !== null) return direct\n const custom = parseBooleanFromUnknown(readCustomField(record, 'is_done'))\n if (custom !== null) return custom\n const generic = parseBooleanFromUnknown(record.isDone)\n if (generic !== null) return generic\n return parseBooleanFromUnknown(readCustomField(record, 'isDone'))\n })()\n const priority = (() => {\n const candidates = [\n record['cf:priority'],\n record['cf_priority'],\n record.priority,\n readCustomField(record, 'priority'),\n ]\n for (const candidate of candidates) {\n const parsed = parseNumber(candidate)\n if (parsed !== null) return parsed\n }\n return null\n })()\n const severity = (() => {\n const candidates = [\n record['cf:severity'],\n record['cf_severity'],\n readCustomField(record, 'severity'),\n ]\n for (const candidate of candidates) {\n if (typeof candidate === 'string') {\n const trimmed = candidate.trim()\n if (trimmed.length) return trimmed\n }\n }\n return null\n })()\n const descriptionValue = (() => {\n const candidates = [\n record.description,\n record['cf:description'],\n record['cf_description'],\n readCustomField(record, 'description'),\n ]\n for (const candidate of candidates) {\n if (typeof candidate === 'string') {\n const trimmed = candidate.trim()\n if (trimmed.length) return trimmed\n }\n }\n return null\n })()\n const dueAt = (() => {\n const candidates = [\n record.due_at,\n record.dueAt,\n record['cf:due_at'],\n record['cf_due_at'],\n readCustomField(record, 'due_at'),\n readCustomField(record, 'dueAt'),\n ]\n for (const candidate of candidates) {\n const parsed = parseDateValue(candidate)\n if (parsed) return parsed\n }\n return null\n })()\n const organizationId = typeof record.organization_id === 'string' && record.organization_id.trim().length > 0\n ? record.organization_id\n : (typeof record.organizationId === 'string' && record.organizationId.trim().length > 0 ? record.organizationId : null)\n const customValues: Record<string, unknown> = {}\n const assignCustomValue = (key: unknown, value: unknown) => {\n if (typeof key !== 'string') return\n const trimmedKey = key.trim()\n if (!trimmedKey.length) return\n customValues[trimmedKey] = value === undefined ? null : value\n }\n for (const [rawKey, rawValue] of Object.entries(record)) {\n if (rawKey.startsWith('cf:')) {\n assignCustomValue(rawKey.slice(3), rawValue)\n } else if (rawKey.startsWith('cf_')) {\n assignCustomValue(rawKey.slice(3), rawValue)\n }\n }\n const nestedCustom = record.custom ?? record.customFields ?? record.cf\n if (nestedCustom && typeof nestedCustom === 'object') {\n for (const [nestedKey, nestedValue] of Object.entries(nestedCustom as Record<string, unknown>)) {\n assignCustomValue(nestedKey, nestedValue)\n }\n }\n\n details.set(`${source}:${rawId}`, {\n title,\n isDone,\n priority,\n severity,\n description: descriptionValue,\n dueAt,\n organizationId,\n customValues: Object.keys(customValues).length ? customValues : null,\n })\n enriched += 1\n }\n profiler?.mark('todo_items_processed', { source, enriched })\n } catch (err) {\n profiler?.mark('todo_query_failed', { source, error: err instanceof Error ? err.message : String(err) })\n console.warn(`customers.people.detail: failed to resolve todos for source ${source}`, err)\n }\n }\n\n profiler?.mark('todo_details_ready', { enrichedCount: details.size })\n return details\n}\n\nexport async function GET(_req: Request, ctx: { params?: { id?: string } }) {\n const profiler = createRouteProfiler('customers.people.detail')\n profiler.mark('request_received')\n\n const includeTokens = parseIncludeParams(_req)\n profiler.mark('includes_parsed', { include: Array.from(includeTokens) })\n\n const includeActivities = includeTokens.has('activities')\n const includeAddresses = includeTokens.has('addresses')\n const includeComments = includeTokens.has('comments') || includeTokens.has('notes')\n const includeDeals = includeTokens.has('deals')\n const includeTodos = includeTokens.has('todos') || includeTokens.has('tasks')\n\n let statusCode = 500\n let profileMeta: Record<string, unknown> | undefined\n let addresses: CustomerAddress[] = []\n let comments: CustomerComment[] = []\n let activities: CustomerActivity[] = []\n let todoLinks: CustomerTodoLink[] = []\n let todoDetails = new Map<string, TodoDetail>()\n let deals: CustomerDeal[] = []\n let tagAssignments: CustomerTagAssignment[] = []\n let userMap = new Map<string, { name: string | null; email: string | null }>()\n let customFields: Record<string, unknown> = {}\n let viewerUserId: string | null = null\n let profile: CustomerPersonProfile | null = null\n\n try {\n const parse = paramsSchema.safeParse({ id: ctx.params?.id })\n if (!parse.success) {\n statusCode = 400\n profileMeta = { reason: 'invalid_person_id' }\n return NextResponse.json({ error: 'Invalid person id' }, { status: 400 })\n }\n profiler.mark('params_resolved', { id: parse.data.id })\n\n const auth = await getAuthFromRequest(_req)\n if (!auth) {\n profiler.mark('auth_missing')\n statusCode = 401\n profileMeta = { reason: 'unauthorized' }\n return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n }\n profiler.mark('auth_resolved', {\n tenantId: auth.tenantId ?? null,\n organizationId: auth.orgId ?? null,\n userId: auth.sub ?? null,\n isApiKey: !!auth.isApiKey,\n })\n viewerUserId = auth.isApiKey ? null : auth.sub ?? null\n\n const container = await createRequestContainer()\n profiler.mark('container_resolved')\n\n const scope = await resolveOrganizationScopeForRequest({ container, auth, request: _req })\n profiler.mark('scope_resolved', {\n scopedOrganizations: Array.isArray(scope?.filterIds) ? scope.filterIds.length : 0,\n })\n const em = (container.resolve('em') as EntityManager)\n\n const person = await em.findOne(CustomerEntity, { id: parse.data.id, kind: 'person', deletedAt: null })\n profiler.mark('person_loaded', { found: !!person })\n if (!person) {\n statusCode = 404\n profileMeta = { reason: 'person_not_found' }\n return notFound('Person not found')\n }\n\n if (auth.tenantId && person.tenantId !== auth.tenantId) {\n statusCode = 404\n profileMeta = { reason: 'person_tenant_mismatch' }\n return notFound('Person not found')\n }\n const allowedOrgIds = new Set<string>()\n if (scope?.filterIds?.length) scope.filterIds.forEach((id) => allowedOrgIds.add(id))\n else if (auth.orgId) allowedOrgIds.add(auth.orgId)\n\n if (allowedOrgIds.size && person.organizationId && !allowedOrgIds.has(person.organizationId)) {\n statusCode = 403\n profileMeta = { reason: 'organization_forbidden' }\n return forbidden('Access denied')\n }\n\n profile = await em.findOne(CustomerPersonProfile, { entity: person })\n profiler.mark('profile_loaded', { found: !!profile })\n\n if (includeAddresses) {\n addresses = await em.find(CustomerAddress, { entity: person.id }, { orderBy: { isPrimary: 'desc', createdAt: 'desc' } })\n profiler.mark('addresses_loaded', { count: addresses.length })\n }\n\n tagAssignments = await findWithDecryption(\n em,\n CustomerTagAssignment,\n { entity: person.id },\n { populate: ['tag'] },\n { tenantId: person.tenantId ?? auth.tenantId ?? null, organizationId: person.organizationId ?? auth.orgId ?? null },\n )\n profiler.mark('tags_loaded', { count: tagAssignments.length })\n\n if (includeComments) {\n comments = await em.find(CustomerComment, { entity: person.id }, { orderBy: { createdAt: 'desc' }, limit: 50 })\n profiler.mark('comments_loaded', { count: comments.length })\n }\n\n if (includeActivities) {\n activities = await em.find(CustomerActivity, { entity: person.id }, { orderBy: { occurredAt: 'desc', createdAt: 'desc' }, limit: 50 })\n profiler.mark('activities_loaded', { count: activities.length })\n }\n\n if (includeTodos) {\n todoLinks = await em.find(CustomerTodoLink, { entity: person.id }, { orderBy: { createdAt: 'desc' }, limit: 50 })\n profiler.mark('todo_links_loaded', { count: todoLinks.length })\n if (todoLinks.length) {\n const queryEngine = (container.resolve('queryEngine') as QueryEngine)\n try {\n todoDetails = await resolveTodoDetails(\n queryEngine,\n todoLinks,\n person.tenantId ?? auth.tenantId ?? null,\n [person.organizationId ?? null, ...(scope?.filterIds ?? [])],\n profiler,\n )\n } catch (err) {\n console.warn('customers.people.detail: failed to enrich todo links', err)\n }\n profiler.mark('todo_details_enriched', { count: todoDetails.size, links: todoLinks.length })\n }\n }\n\n const authorIds = new Set<string>()\n if (includeActivities) {\n for (const activity of activities) {\n if (activity.authorUserId) authorIds.add(activity.authorUserId)\n }\n }\n if (includeComments) {\n for (const comment of comments) {\n if (comment.authorUserId) authorIds.add(comment.authorUserId)\n }\n }\n if (viewerUserId) authorIds.add(viewerUserId)\n\n if (authorIds.size) {\n const users = await em.find(User, { id: { $in: Array.from(authorIds) } })\n userMap = new Map(\n users.map((user) => [\n user.id,\n {\n name: user.name ?? null,\n email: user.email ?? null,\n },\n ])\n )\n profiler.mark('authors_loaded', { count: userMap.size })\n }\n\n if (includeDeals) {\n const dealLinks = await findWithDecryption(\n em,\n CustomerDealPersonLink,\n { person: person.id },\n { populate: ['deal'] },\n { tenantId: person.tenantId ?? auth.tenantId ?? null, organizationId: person.organizationId ?? auth.orgId ?? null },\n )\n deals = dealLinks\n .map((link) => (link.deal as CustomerDeal | string | null) ?? null)\n .filter((deal): deal is CustomerDeal => !!deal && typeof deal !== 'string')\n profiler.mark('deals_loaded', { count: deals.length })\n }\n\n const entityCustomFieldValues = await loadCustomFieldValues({\n em,\n entityId: E.customers.customer_entity,\n recordIds: [person.id],\n tenantIdByRecord: { [person.id]: person.tenantId ?? null },\n organizationIdByRecord: { [person.id]: person.organizationId ?? null },\n tenantFallbacks: [\n person.tenantId ?? auth.tenantId ?? null,\n ].filter((v): v is string => !!v),\n })\n profiler.mark('entity_custom_fields_loaded', { keys: Object.keys(entityCustomFieldValues?.[person.id] ?? {}).length })\n\n let profileCustomFieldValues: Record<string, Record<string, unknown>> = {}\n const profileId = profile?.id ?? null\n if (profileId) {\n profileCustomFieldValues = await loadCustomFieldValues({\n em,\n entityId: E.customers.customer_person_profile,\n recordIds: [profileId],\n tenantIdByRecord: { [profileId]: profile?.tenantId ?? null },\n organizationIdByRecord: { [profileId]: profile?.organizationId ?? null },\n tenantFallbacks: [\n profile?.tenantId ?? person.tenantId ?? auth.tenantId ?? null,\n ].filter((v): v is string => !!v),\n })\n profiler.mark('profile_custom_fields_loaded', { keys: Object.keys(profileCustomFieldValues?.[profileId] ?? {}).length })\n }\n\n const routing = await resolvePersonCustomFieldRouting(em, person.tenantId ?? null, person.organizationId ?? null)\n profiler.mark('custom_field_routing_resolved', { keys: routing.size })\n customFields = mergePersonCustomFieldValues(\n routing,\n entityCustomFieldValues?.[person.id] ?? {},\n profileId ? profileCustomFieldValues?.[profileId] ?? {} : {},\n )\n profiler.mark('custom_fields_merged', { keys: Object.keys(customFields).length })\n\n const viewerUserIdFinal = viewerUserId\n const response = NextResponse.json({\n person: {\n id: person.id,\n displayName: person.displayName,\n description: person.description,\n ownerUserId: person.ownerUserId,\n primaryEmail: person.primaryEmail,\n primaryPhone: person.primaryPhone,\n status: person.status,\n lifecycleStage: person.lifecycleStage,\n source: person.source,\n nextInteractionAt: person.nextInteractionAt ? person.nextInteractionAt.toISOString() : null,\n nextInteractionName: person.nextInteractionName,\n nextInteractionRefId: person.nextInteractionRefId,\n nextInteractionIcon: person.nextInteractionIcon,\n nextInteractionColor: person.nextInteractionColor,\n organizationId: person.organizationId,\n tenantId: person.tenantId,\n isActive: person.isActive,\n createdAt: person.createdAt.toISOString(),\n updatedAt: person.updatedAt.toISOString(),\n },\n profile: profile\n ? {\n id: profile.id,\n firstName: profile.firstName,\n lastName: profile.lastName,\n preferredName: profile.preferredName,\n jobTitle: profile.jobTitle,\n department: profile.department,\n seniority: profile.seniority,\n timezone: profile.timezone,\n linkedInUrl: profile.linkedInUrl,\n twitterUrl: profile.twitterUrl,\n companyEntityId: profile.company ? (typeof profile.company === 'string' ? profile.company : profile.company.id) : null,\n }\n : null,\n customFields,\n tags: serializeTags(tagAssignments),\n addresses: includeAddresses\n ? addresses.map((address) => ({\n id: address.id,\n name: address.name,\n purpose: address.purpose,\n addressLine1: address.addressLine1,\n addressLine2: address.addressLine2,\n buildingNumber: address.buildingNumber,\n flatNumber: address.flatNumber,\n city: address.city,\n region: address.region,\n postalCode: address.postalCode,\n country: address.country,\n latitude: address.latitude,\n longitude: address.longitude,\n isPrimary: address.isPrimary,\n createdAt: address.createdAt.toISOString(),\n }))\n : [],\n comments: includeComments\n ? comments.map((comment) => {\n const authorInfo = comment.authorUserId ? userMap.get(comment.authorUserId) : null\n return {\n id: comment.id,\n body: comment.body,\n authorUserId: comment.authorUserId,\n authorName: authorInfo?.name ?? null,\n authorEmail: authorInfo?.email ?? null,\n dealId: comment.deal ? (typeof comment.deal === 'string' ? comment.deal : comment.deal.id) : null,\n createdAt: comment.createdAt.toISOString(),\n appearanceIcon: comment.appearanceIcon ?? null,\n appearanceColor: comment.appearanceColor ?? null,\n }\n })\n : [],\n activities: includeActivities\n ? activities.map((activity) => ({\n id: activity.id,\n activityType: activity.activityType,\n subject: activity.subject,\n body: activity.body,\n occurredAt: activity.occurredAt ? activity.occurredAt.toISOString() : null,\n dealId: activity.deal ? (typeof activity.deal === 'string' ? activity.deal : activity.deal.id) : null,\n authorUserId: activity.authorUserId,\n authorName: activity.authorUserId ? userMap.get(activity.authorUserId)?.name ?? null : null,\n authorEmail: activity.authorUserId ? userMap.get(activity.authorUserId)?.email ?? null : null,\n createdAt: activity.createdAt.toISOString(),\n appearanceIcon: activity.appearanceIcon ?? null,\n appearanceColor: activity.appearanceColor ?? null,\n }))\n : [],\n deals: includeDeals\n ? deals.map((deal) => ({\n id: deal.id,\n title: deal.title,\n status: deal.status,\n pipelineStage: deal.pipelineStage,\n valueAmount: deal.valueAmount,\n valueCurrency: deal.valueCurrency,\n probability: deal.probability,\n expectedCloseAt: deal.expectedCloseAt ? deal.expectedCloseAt.toISOString() : null,\n ownerUserId: deal.ownerUserId,\n source: deal.source,\n createdAt: deal.createdAt.toISOString(),\n updatedAt: deal.updatedAt.toISOString(),\n }))\n : [],\n todos: includeTodos\n ? todoLinks.map((link) => {\n const source = typeof link.todoSource === 'string' && link.todoSource.trim().length > 0 ? link.todoSource : 'example:todo'\n const key = `${source}:${link.todoId}`\n const detail = todoDetails.get(key)\n return {\n id: link.id,\n todoId: link.todoId,\n todoSource: source,\n createdAt: link.createdAt.toISOString(),\n createdByUserId: link.createdByUserId,\n title: detail?.title ?? null,\n isDone: detail?.isDone ?? null,\n priority: detail?.priority ?? null,\n severity: detail?.severity ?? null,\n description: detail?.description ?? null,\n dueAt: detail?.dueAt ?? null,\n todoOrganizationId: detail?.organizationId ?? null,\n customValues: detail?.customValues ?? null,\n }\n })\n : [],\n viewer: {\n userId: viewerUserIdFinal,\n name: viewerUserIdFinal ? userMap.get(viewerUserIdFinal)?.name ?? null : null,\n email: viewerUserIdFinal ? userMap.get(viewerUserIdFinal)?.email ?? auth.email ?? null : auth.email ?? null,\n },\n })\n statusCode = 200\n profileMeta = {\n include: Array.from(includeTokens),\n counts: {\n tags: tagAssignments.length,\n comments: comments.length,\n activities: activities.length,\n todos: todoLinks.length,\n addresses: addresses.length,\n deals: deals.length,\n },\n }\n profiler.mark('response_ready', { status: statusCode })\n return response\n } catch (err) {\n if (statusCode < 400) statusCode = 500\n const message = err instanceof Error ? err.message : String(err)\n profileMeta = { ...(profileMeta ?? {}), error: message }\n throw err\n } finally {\n profiler.end({ status: statusCode, ...(profileMeta ?? {}) })\n }\n}\nconst personDetailQuerySchema = z.object({\n include: z\n .string()\n .optional()\n .describe('Comma-separated list of relations to include (addresses, comments, activities, deals, todos).'),\n}).passthrough()\n\nconst personDetailResponseSchema = z.object({\n person: z.object({\n id: z.string().uuid(),\n displayName: z.string().nullable().optional(),\n description: z.string().nullable().optional(),\n ownerUserId: z.string().uuid().nullable().optional(),\n primaryEmail: z.string().nullable().optional(),\n primaryPhone: z.string().nullable().optional(),\n status: z.string().nullable().optional(),\n lifecycleStage: z.string().nullable().optional(),\n source: z.string().nullable().optional(),\n nextInteractionAt: z.string().nullable().optional(),\n nextInteractionName: z.string().nullable().optional(),\n nextInteractionRefId: z.string().nullable().optional(),\n nextInteractionIcon: z.string().nullable().optional(),\n nextInteractionColor: z.string().nullable().optional(),\n organizationId: z.string().uuid().nullable().optional(),\n tenantId: z.string().uuid().nullable().optional(),\n isActive: z.boolean().optional(),\n createdAt: z.string(),\n updatedAt: z.string(),\n }),\n profile: z\n .object({\n id: z.string().uuid(),\n firstName: z.string().nullable().optional(),\n lastName: z.string().nullable().optional(),\n preferredName: z.string().nullable().optional(),\n jobTitle: z.string().nullable().optional(),\n department: z.string().nullable().optional(),\n seniority: z.string().nullable().optional(),\n timezone: z.string().nullable().optional(),\n linkedInUrl: z.string().nullable().optional(),\n twitterUrl: z.string().nullable().optional(),\n companyEntityId: z.string().uuid().nullable().optional(),\n })\n .nullable(),\n customFields: z.record(z.string(), z.unknown()),\n tags: z.array(\n z.object({\n id: z.string().uuid(),\n label: z.string(),\n color: z.string().nullable().optional(),\n }),\n ),\n addresses: z.array(\n z.object({\n id: z.string().uuid(),\n name: z.string().nullable().optional(),\n purpose: z.string().nullable().optional(),\n addressLine1: z.string().nullable().optional(),\n addressLine2: z.string().nullable().optional(),\n buildingNumber: z.string().nullable().optional(),\n flatNumber: z.string().nullable().optional(),\n city: z.string().nullable().optional(),\n region: z.string().nullable().optional(),\n postalCode: z.string().nullable().optional(),\n country: z.string().nullable().optional(),\n latitude: z.number().nullable().optional(),\n longitude: z.number().nullable().optional(),\n isPrimary: z.boolean().nullable().optional(),\n createdAt: z.string(),\n }),\n ),\n comments: z.array(\n z.object({\n id: z.string().uuid(),\n body: z.string().nullable().optional(),\n authorUserId: z.string().uuid().nullable().optional(),\n authorName: z.string().nullable().optional(),\n authorEmail: z.string().nullable().optional(),\n dealId: z.string().uuid().nullable().optional(),\n createdAt: z.string(),\n appearanceIcon: z.string().nullable().optional(),\n appearanceColor: z.string().nullable().optional(),\n }),\n ),\n activities: z.array(\n z.object({\n id: z.string().uuid(),\n activityType: z.string(),\n subject: z.string().nullable().optional(),\n body: z.string().nullable().optional(),\n occurredAt: z.string().nullable().optional(),\n dealId: z.string().uuid().nullable().optional(),\n authorUserId: z.string().uuid().nullable().optional(),\n authorName: z.string().nullable().optional(),\n authorEmail: z.string().nullable().optional(),\n createdAt: z.string(),\n appearanceIcon: z.string().nullable().optional(),\n appearanceColor: z.string().nullable().optional(),\n }),\n ),\n deals: z.array(\n z.object({\n id: z.string().uuid(),\n title: z.string().nullable().optional(),\n status: z.string().nullable().optional(),\n pipelineStage: z.string().nullable().optional(),\n valueAmount: z.number().nullable().optional(),\n valueCurrency: z.string().nullable().optional(),\n probability: z.number().nullable().optional(),\n expectedCloseAt: z.string().nullable().optional(),\n ownerUserId: z.string().uuid().nullable().optional(),\n source: z.string().nullable().optional(),\n createdAt: z.string(),\n updatedAt: z.string(),\n }),\n ),\n todos: z.array(\n z.object({\n id: z.string().uuid(),\n todoId: z.string().uuid(),\n todoSource: z.string(),\n createdAt: z.string(),\n createdByUserId: z.string().uuid().nullable().optional(),\n title: z.string().nullable().optional(),\n isDone: z.boolean().nullable().optional(),\n priority: z.number().nullable().optional(),\n severity: z.string().nullable().optional(),\n description: z.string().nullable().optional(),\n dueAt: z.string().nullable().optional(),\n todoOrganizationId: z.string().uuid().nullable().optional(),\n customValues: z.record(z.string(), z.unknown()).nullable().optional(),\n }),\n ),\n viewer: z.object({\n userId: z.string().uuid().nullable(),\n name: z.string().nullable(),\n email: z.string().nullable(),\n }),\n})\n\nconst personDetailErrorSchema = z.object({\n error: z.string(),\n})\n\nexport const openApi: OpenApiRouteDoc = {\n tag: 'Customers',\n summary: 'Fetch person detail',\n methods: {\n GET: {\n summary: 'Fetch person with related data',\n description: 'Returns a person customer record with optional related resources such as addresses, comments, activities, deals, and todos.',\n query: personDetailQuerySchema,\n responses: [\n { status: 200, description: 'Person detail payload', schema: personDetailResponseSchema },\n ],\n errors: [\n { status: 400, description: 'Invalid identifier', schema: personDetailErrorSchema },\n { status: 401, description: 'Unauthorized', schema: personDetailErrorSchema },\n { status: 403, description: 'Forbidden for tenant/organization scope', schema: personDetailErrorSchema },\n { status: 404, description: 'Person not found', schema: personDetailErrorSchema },\n ],\n },\n },\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { 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 type { EntityManager } from '@mikro-orm/postgresql'\nimport {\n CustomerEntity,\n CustomerPersonProfile,\n CustomerAddress,\n CustomerComment,\n CustomerActivity,\n CustomerTagAssignment,\n CustomerTag,\n CustomerDealPersonLink,\n CustomerDeal,\n CustomerTodoLink,\n} from '../../../data/entities'\nimport { User } from '@open-mercato/core/modules/auth/data/entities'\nimport { loadCustomFieldValues } from '@open-mercato/shared/lib/crud/custom-fields'\nimport { E } from '#generated/entities.ids.generated'\nimport { mergePersonCustomFieldValues, resolvePersonCustomFieldRouting } from '../../../lib/customFieldRouting'\nimport type { QueryEngine } from '@open-mercato/shared/lib/query/types'\nimport type { EntityId } from '@open-mercato/shared/modules/entities'\nimport type { OpenApiRouteDoc } from '@open-mercato/shared/lib/openapi'\nimport { findWithDecryption } from '@open-mercato/shared/lib/encryption/find'\nimport { parseBooleanFromUnknown, parseBooleanToken } from '@open-mercato/shared/lib/boolean'\n\nconst paramsSchema = z.object({\n id: z.string().uuid(),\n})\n\nfunction parseIncludeParams(request: Request): Set<string> {\n const url = new URL(request.url)\n const raw = url.searchParams.getAll('include')\n const tokens = new Set<string>()\n raw.forEach((entry) => {\n if (!entry) return\n entry\n .split(',')\n .map((part) => part.trim().toLowerCase())\n .filter((part) => part.length > 0)\n .forEach((part) => tokens.add(part))\n })\n return tokens\n}\n\nfunction forbidden(message: string) {\n return NextResponse.json({ error: message }, { status: 403 })\n}\n\nfunction notFound(message: string) {\n return NextResponse.json({ error: message }, { status: 404 })\n}\n\nfunction serializeTags(assignments: CustomerTagAssignment[]): Array<{ id: string; label: string; color: string | null }> {\n return assignments\n .map((assignment) => {\n const tag = assignment.tag as CustomerTag | string | null\n if (!tag || typeof tag === 'string') return null\n return {\n id: tag.id,\n label: tag.label,\n color: tag.color ?? null,\n }\n })\n .filter(\n (tag: { id: string; label: string; color: string | null } | null): tag is {\n id: string\n label: string\n color: string | null\n } => tag !== null,\n )\n}\n\ntype TodoDetail = {\n title: string | null\n isDone: boolean | null\n priority: number | null\n severity: string | null\n description: string | null\n dueAt: string | null\n organizationId: string | null\n customValues: Record<string, unknown> | null\n}\n\nfunction extractTodoTitle(record: Record<string, unknown>): string | null {\n const candidates = ['title', 'subject', 'name', 'summary', 'text', 'description']\n for (const key of candidates) {\n const value = record[key]\n if (typeof value === 'string' && value.trim().length > 0) {\n return value.trim()\n }\n }\n return null\n}\n\nfunction parseNumber(value: unknown): number | null {\n if (typeof value === 'number' && Number.isFinite(value)) return value\n if (typeof value === 'string') {\n const trimmed = value.trim()\n if (!trimmed) return null\n const parsed = Number(trimmed)\n if (!Number.isNaN(parsed)) return parsed\n }\n return null\n}\n\nfunction parseDateValue(value: unknown): string | null {\n if (value instanceof Date) {\n const ts = value.getTime()\n return Number.isNaN(ts) ? null : value.toISOString()\n }\n if (typeof value === 'string') {\n const trimmed = value.trim()\n if (!trimmed) return null\n const candidate = new Date(trimmed)\n if (!Number.isNaN(candidate.getTime())) return candidate.toISOString()\n }\n return null\n}\n\nfunction readCustomField(record: Record<string, unknown>, key: string): unknown {\n const custom = record.custom ?? record.customFields ?? record.cf\n if (custom && typeof custom === 'object') {\n const bucket = custom as Record<string, unknown>\n if (key in bucket) return bucket[key]\n }\n return undefined\n}\n\ntype RouteProfilerMark = { label: string; time: bigint; extra?: Record<string, unknown> }\ntype RouteProfiler = { enabled: boolean; mark: (label: string, extra?: Record<string, unknown>) => void; end: (extra?: Record<string, unknown>) => void }\n\nfunction normalizeProfilerTokens(input: string | null | undefined): string[] {\n if (!input) return []\n return input\n .split(',')\n .map((token) => token.trim().toLowerCase())\n .filter((token) => token.length > 0)\n}\n\nfunction profilerMatches(scope: string, tokens: string[]): boolean {\n if (!tokens.length) return false\n const lower = scope.toLowerCase()\n return tokens.some((token) => {\n if (token === '*' || token === 'all' || parseBooleanToken(token) === true) return true\n if (token.endsWith('*')) {\n const prefix = token.slice(0, -1)\n return prefix.length === 0 ? true : lower.startsWith(prefix)\n }\n return token === lower\n })\n}\n\nfunction isRouteProfilingEnabled(scope: string): boolean {\n const candidates = [\n process.env.OM_CRUD_PROFILE,\n process.env.NEXT_PUBLIC_OM_CRUD_PROFILE,\n process.env.OM_ROUTE_PROFILE,\n process.env.NEXT_PUBLIC_OM_ROUTE_PROFILE,\n ]\n for (const raw of candidates) {\n if (!raw) continue\n const tokens = normalizeProfilerTokens(raw)\n if (profilerMatches(scope, tokens)) return true\n }\n return false\n}\n\nfunction createRouteProfiler(scope: string): RouteProfiler {\n if (!isRouteProfilingEnabled(scope)) {\n return { enabled: false, mark: () => {}, end: () => {} }\n }\n const marks: RouteProfilerMark[] = [{ label: 'start', time: process.hrtime.bigint() }]\n const round = (value: number) => Math.round(value * 1000) / 1000\n return {\n enabled: true,\n mark(label, extra) {\n marks.push({ label, time: process.hrtime.bigint(), extra })\n },\n end(extra) {\n marks.push({ label: 'end', time: process.hrtime.bigint(), extra })\n const segments: Array<{ step: string; durationMs: number; extra?: Record<string, unknown> }> = []\n for (let idx = 1; idx < marks.length; idx += 1) {\n const current = marks[idx]\n const previous = marks[idx - 1]\n if (current.label === 'end') continue\n const durationMs = Number(current.time - previous.time) / 1_000_000\n segments.push({\n step: current.label,\n durationMs: round(durationMs),\n ...(current.extra ? { extra: current.extra } : {}),\n })\n }\n const totalNs = marks[marks.length - 1].time - marks[0].time\n const payload: Record<string, unknown> = {\n scope,\n totalMs: round(Number(totalNs) / 1_000_000),\n steps: segments,\n }\n const tail = marks[marks.length - 1]\n if (tail.extra && Object.keys(tail.extra).length > 0) payload.meta = tail.extra\n else if (extra && Object.keys(extra).length > 0) payload.meta = extra\n try {\n console.info('[route:profile]', payload)\n } catch {\n // ignore logging failures\n }\n },\n }\n}\n\nasync function resolveTodoDetails(\n queryEngine: QueryEngine,\n links: CustomerTodoLink[],\n tenantId: string | null,\n organizationIds: Array<string | null>,\n profiler?: RouteProfiler,\n): Promise<Map<string, TodoDetail>> {\n const details = new Map<string, TodoDetail>()\n if (!links.length || !tenantId) return details\n\n const scopedOrgIds = organizationIds\n .filter((value): value is string => typeof value === 'string' && value.trim().length > 0)\n\n const idsBySource = new Map<string, Set<string>>()\n for (const link of links) {\n const source = typeof link.todoSource === 'string' && link.todoSource.trim().length > 0 ? link.todoSource : 'example:todo'\n const id = typeof link.todoId === 'string' && link.todoId.trim().length > 0 ? link.todoId : String(link.todoId ?? '')\n if (!id) continue\n if (!idsBySource.has(source)) idsBySource.set(source, new Set<string>())\n idsBySource.get(source)!.add(id)\n }\n\n profiler?.mark('todo_links_grouped', { sourceCount: idsBySource.size, linkCount: links.length })\n\n for (const [source, idSet] of idsBySource.entries()) {\n const ids = Array.from(idSet)\n if (!ids.length) continue\n profiler?.mark('todo_query_start', { source, count: ids.length })\n try {\n const result = await queryEngine.query<Record<string, unknown>>(source as EntityId, {\n tenantId,\n organizationIds: scopedOrgIds.length > 0 ? scopedOrgIds : undefined,\n filters: { id: { $in: ids } },\n includeCustomFields: ['priority', 'due_at', 'severity', 'description'],\n page: { page: 1, pageSize: Math.max(ids.length, 1) },\n })\n const itemCount = Array.isArray(result.items) ? result.items.length : 0\n profiler?.mark('todo_query_complete', { source, itemCount })\n let enriched = 0\n for (const item of result.items ?? []) {\n if (!item || typeof item !== 'object') continue\n const record = item as Record<string, unknown>\n const rawId = typeof record.id === 'string' && record.id.trim().length > 0 ? record.id : String(record.id ?? '')\n if (!rawId) continue\n const title = extractTodoTitle(record)\n const isDone = (() => {\n const direct = parseBooleanFromUnknown(record.is_done)\n if (direct !== null) return direct\n const custom = parseBooleanFromUnknown(readCustomField(record, 'is_done'))\n if (custom !== null) return custom\n const generic = parseBooleanFromUnknown(record.isDone)\n if (generic !== null) return generic\n return parseBooleanFromUnknown(readCustomField(record, 'isDone'))\n })()\n const priority = (() => {\n const candidates = [\n record['cf:priority'],\n record['cf_priority'],\n record.priority,\n readCustomField(record, 'priority'),\n ]\n for (const candidate of candidates) {\n const parsed = parseNumber(candidate)\n if (parsed !== null) return parsed\n }\n return null\n })()\n const severity = (() => {\n const candidates = [\n record['cf:severity'],\n record['cf_severity'],\n readCustomField(record, 'severity'),\n ]\n for (const candidate of candidates) {\n if (typeof candidate === 'string') {\n const trimmed = candidate.trim()\n if (trimmed.length) return trimmed\n }\n }\n return null\n })()\n const descriptionValue = (() => {\n const candidates = [\n record.description,\n record['cf:description'],\n record['cf_description'],\n readCustomField(record, 'description'),\n ]\n for (const candidate of candidates) {\n if (typeof candidate === 'string') {\n const trimmed = candidate.trim()\n if (trimmed.length) return trimmed\n }\n }\n return null\n })()\n const dueAt = (() => {\n const candidates = [\n record.due_at,\n record.dueAt,\n record['cf:due_at'],\n record['cf_due_at'],\n readCustomField(record, 'due_at'),\n readCustomField(record, 'dueAt'),\n ]\n for (const candidate of candidates) {\n const parsed = parseDateValue(candidate)\n if (parsed) return parsed\n }\n return null\n })()\n const organizationId = typeof record.organization_id === 'string' && record.organization_id.trim().length > 0\n ? record.organization_id\n : (typeof record.organizationId === 'string' && record.organizationId.trim().length > 0 ? record.organizationId : null)\n const customValues: Record<string, unknown> = {}\n const assignCustomValue = (key: unknown, value: unknown) => {\n if (typeof key !== 'string') return\n const trimmedKey = key.trim()\n if (!trimmedKey.length) return\n customValues[trimmedKey] = value === undefined ? null : value\n }\n for (const [rawKey, rawValue] of Object.entries(record)) {\n if (rawKey.startsWith('cf:')) {\n assignCustomValue(rawKey.slice(3), rawValue)\n } else if (rawKey.startsWith('cf_')) {\n assignCustomValue(rawKey.slice(3), rawValue)\n }\n }\n const nestedCustom = record.custom ?? record.customFields ?? record.cf\n if (nestedCustom && typeof nestedCustom === 'object') {\n for (const [nestedKey, nestedValue] of Object.entries(nestedCustom as Record<string, unknown>)) {\n assignCustomValue(nestedKey, nestedValue)\n }\n }\n\n details.set(`${source}:${rawId}`, {\n title,\n isDone,\n priority,\n severity,\n description: descriptionValue,\n dueAt,\n organizationId,\n customValues: Object.keys(customValues).length ? customValues : null,\n })\n enriched += 1\n }\n profiler?.mark('todo_items_processed', { source, enriched })\n } catch (err) {\n profiler?.mark('todo_query_failed', { source, error: err instanceof Error ? err.message : String(err) })\n console.warn(`customers.people.detail: failed to resolve todos for source ${source}`, err)\n }\n }\n\n profiler?.mark('todo_details_ready', { enrichedCount: details.size })\n return details\n}\n\nexport async function GET(_req: Request, ctx: { params?: { id?: string } }) {\n const profiler = createRouteProfiler('customers.people.detail')\n profiler.mark('request_received')\n\n const includeTokens = parseIncludeParams(_req)\n profiler.mark('includes_parsed', { include: Array.from(includeTokens) })\n\n const includeActivities = includeTokens.has('activities')\n const includeAddresses = includeTokens.has('addresses')\n const includeComments = includeTokens.has('comments') || includeTokens.has('notes')\n const includeDeals = includeTokens.has('deals')\n const includeTodos = includeTokens.has('todos') || includeTokens.has('tasks')\n\n let statusCode = 500\n let profileMeta: Record<string, unknown> | undefined\n let addresses: CustomerAddress[] = []\n let comments: CustomerComment[] = []\n let activities: CustomerActivity[] = []\n let todoLinks: CustomerTodoLink[] = []\n let todoDetails = new Map<string, TodoDetail>()\n let deals: CustomerDeal[] = []\n let tagAssignments: CustomerTagAssignment[] = []\n let userMap = new Map<string, { name: string | null; email: string | null }>()\n let customFields: Record<string, unknown> = {}\n let viewerUserId: string | null = null\n let profile: CustomerPersonProfile | null = null\n\n try {\n const parse = paramsSchema.safeParse({ id: ctx.params?.id })\n if (!parse.success) {\n statusCode = 400\n profileMeta = { reason: 'invalid_person_id' }\n return NextResponse.json({ error: 'Invalid person id' }, { status: 400 })\n }\n profiler.mark('params_resolved', { id: parse.data.id })\n\n const auth = await getAuthFromRequest(_req)\n if (!auth) {\n profiler.mark('auth_missing')\n statusCode = 401\n profileMeta = { reason: 'unauthorized' }\n return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n }\n profiler.mark('auth_resolved', {\n tenantId: auth.tenantId ?? null,\n organizationId: auth.orgId ?? null,\n userId: auth.sub ?? null,\n isApiKey: !!auth.isApiKey,\n })\n viewerUserId = auth.isApiKey ? null : auth.sub ?? null\n\n const container = await createRequestContainer()\n profiler.mark('container_resolved')\n\n const scope = await resolveOrganizationScopeForRequest({ container, auth, request: _req })\n profiler.mark('scope_resolved', {\n scopedOrganizations: Array.isArray(scope?.filterIds) ? scope.filterIds.length : 0,\n })\n const em = (container.resolve('em') as EntityManager)\n\n const person = await em.findOne(CustomerEntity, { id: parse.data.id, kind: 'person', deletedAt: null })\n profiler.mark('person_loaded', { found: !!person })\n if (!person) {\n statusCode = 404\n profileMeta = { reason: 'person_not_found' }\n return notFound('Person not found')\n }\n\n if (auth.tenantId && person.tenantId !== auth.tenantId) {\n statusCode = 404\n profileMeta = { reason: 'person_tenant_mismatch' }\n return notFound('Person not found')\n }\n const allowedOrgIds = new Set<string>()\n if (scope?.filterIds?.length) scope.filterIds.forEach((id) => allowedOrgIds.add(id))\n else if (auth.orgId) allowedOrgIds.add(auth.orgId)\n\n if (allowedOrgIds.size && person.organizationId && !allowedOrgIds.has(person.organizationId)) {\n statusCode = 403\n profileMeta = { reason: 'organization_forbidden' }\n return forbidden('Access denied')\n }\n\n profile = await em.findOne(CustomerPersonProfile, { entity: person })\n profiler.mark('profile_loaded', { found: !!profile })\n\n if (includeAddresses) {\n addresses = await em.find(CustomerAddress, { entity: person.id }, { orderBy: { isPrimary: 'desc', createdAt: 'desc' } })\n profiler.mark('addresses_loaded', { count: addresses.length })\n }\n\n tagAssignments = await findWithDecryption(\n em,\n CustomerTagAssignment,\n { entity: person.id },\n { populate: ['tag'] },\n { tenantId: person.tenantId ?? auth.tenantId ?? null, organizationId: person.organizationId ?? auth.orgId ?? null },\n )\n profiler.mark('tags_loaded', { count: tagAssignments.length })\n\n if (includeComments) {\n comments = await em.find(CustomerComment, { entity: person.id }, { orderBy: { createdAt: 'desc' }, limit: 50 })\n profiler.mark('comments_loaded', { count: comments.length })\n }\n\n if (includeActivities) {\n activities = await em.find(CustomerActivity, { entity: person.id }, { orderBy: { occurredAt: 'desc', createdAt: 'desc' }, limit: 50 })\n profiler.mark('activities_loaded', { count: activities.length })\n }\n\n if (includeTodos) {\n todoLinks = await em.find(CustomerTodoLink, { entity: person.id }, { orderBy: { createdAt: 'desc' }, limit: 50 })\n profiler.mark('todo_links_loaded', { count: todoLinks.length })\n if (todoLinks.length) {\n const queryEngine = (container.resolve('queryEngine') as QueryEngine)\n try {\n todoDetails = await resolveTodoDetails(\n queryEngine,\n todoLinks,\n person.tenantId ?? auth.tenantId ?? null,\n [person.organizationId ?? null, ...(scope?.filterIds ?? [])],\n profiler,\n )\n } catch (err) {\n console.warn('customers.people.detail: failed to enrich todo links', err)\n }\n profiler.mark('todo_details_enriched', { count: todoDetails.size, links: todoLinks.length })\n }\n }\n\n const authorIds = new Set<string>()\n if (includeActivities) {\n for (const activity of activities) {\n if (activity.authorUserId) authorIds.add(activity.authorUserId)\n }\n }\n if (includeComments) {\n for (const comment of comments) {\n if (comment.authorUserId) authorIds.add(comment.authorUserId)\n }\n }\n if (viewerUserId) authorIds.add(viewerUserId)\n\n if (authorIds.size) {\n const users = await em.find(User, { id: { $in: Array.from(authorIds) } })\n userMap = new Map(\n users.map((user) => [\n user.id,\n {\n name: user.name ?? null,\n email: user.email ?? null,\n },\n ])\n )\n profiler.mark('authors_loaded', { count: userMap.size })\n }\n\n if (includeDeals) {\n const dealLinks = await findWithDecryption(\n em,\n CustomerDealPersonLink,\n { person: person.id },\n { populate: ['deal'] },\n { tenantId: person.tenantId ?? auth.tenantId ?? null, organizationId: person.organizationId ?? auth.orgId ?? null },\n )\n deals = dealLinks\n .map((link) => (link.deal as CustomerDeal | string | null) ?? null)\n .filter((deal): deal is CustomerDeal => !!deal && typeof deal !== 'string')\n profiler.mark('deals_loaded', { count: deals.length })\n }\n\n const entityCustomFieldValues = await loadCustomFieldValues({\n em,\n entityId: E.customers.customer_entity,\n recordIds: [person.id],\n tenantIdByRecord: { [person.id]: person.tenantId ?? null },\n organizationIdByRecord: { [person.id]: person.organizationId ?? null },\n tenantFallbacks: [\n person.tenantId ?? auth.tenantId ?? null,\n ].filter((v): v is string => !!v),\n })\n profiler.mark('entity_custom_fields_loaded', { keys: Object.keys(entityCustomFieldValues?.[person.id] ?? {}).length })\n\n let profileCustomFieldValues: Record<string, Record<string, unknown>> = {}\n const profileId = profile?.id ?? null\n if (profileId) {\n profileCustomFieldValues = await loadCustomFieldValues({\n em,\n entityId: E.customers.customer_person_profile,\n recordIds: [profileId],\n tenantIdByRecord: { [profileId]: profile?.tenantId ?? null },\n organizationIdByRecord: { [profileId]: profile?.organizationId ?? null },\n tenantFallbacks: [\n profile?.tenantId ?? person.tenantId ?? auth.tenantId ?? null,\n ].filter((v): v is string => !!v),\n })\n profiler.mark('profile_custom_fields_loaded', { keys: Object.keys(profileCustomFieldValues?.[profileId] ?? {}).length })\n }\n\n const routing = await resolvePersonCustomFieldRouting(em, person.tenantId ?? null, person.organizationId ?? null)\n profiler.mark('custom_field_routing_resolved', { keys: routing.size })\n customFields = mergePersonCustomFieldValues(\n routing,\n entityCustomFieldValues?.[person.id] ?? {},\n profileId ? profileCustomFieldValues?.[profileId] ?? {} : {},\n )\n profiler.mark('custom_fields_merged', { keys: Object.keys(customFields).length })\n\n const viewerUserIdFinal = viewerUserId\n const response = NextResponse.json({\n person: {\n id: person.id,\n displayName: person.displayName,\n description: person.description,\n ownerUserId: person.ownerUserId,\n primaryEmail: person.primaryEmail,\n primaryPhone: person.primaryPhone,\n status: person.status,\n lifecycleStage: person.lifecycleStage,\n source: person.source,\n nextInteractionAt: person.nextInteractionAt ? person.nextInteractionAt.toISOString() : null,\n nextInteractionName: person.nextInteractionName,\n nextInteractionRefId: person.nextInteractionRefId,\n nextInteractionIcon: person.nextInteractionIcon,\n nextInteractionColor: person.nextInteractionColor,\n organizationId: person.organizationId,\n tenantId: person.tenantId,\n isActive: person.isActive,\n createdAt: person.createdAt.toISOString(),\n updatedAt: person.updatedAt.toISOString(),\n },\n profile: profile\n ? {\n id: profile.id,\n firstName: profile.firstName,\n lastName: profile.lastName,\n preferredName: profile.preferredName,\n jobTitle: profile.jobTitle,\n department: profile.department,\n seniority: profile.seniority,\n timezone: profile.timezone,\n linkedInUrl: profile.linkedInUrl,\n twitterUrl: profile.twitterUrl,\n companyEntityId: profile.company ? (typeof profile.company === 'string' ? profile.company : profile.company.id) : null,\n updatedAt: profile.updatedAt.toISOString(),\n }\n : null,\n customFields,\n tags: serializeTags(tagAssignments),\n addresses: includeAddresses\n ? addresses.map((address) => ({\n id: address.id,\n name: address.name,\n purpose: address.purpose,\n addressLine1: address.addressLine1,\n addressLine2: address.addressLine2,\n buildingNumber: address.buildingNumber,\n flatNumber: address.flatNumber,\n city: address.city,\n region: address.region,\n postalCode: address.postalCode,\n country: address.country,\n latitude: address.latitude,\n longitude: address.longitude,\n isPrimary: address.isPrimary,\n createdAt: address.createdAt.toISOString(),\n }))\n : [],\n comments: includeComments\n ? comments.map((comment) => {\n const authorInfo = comment.authorUserId ? userMap.get(comment.authorUserId) : null\n return {\n id: comment.id,\n body: comment.body,\n authorUserId: comment.authorUserId,\n authorName: authorInfo?.name ?? null,\n authorEmail: authorInfo?.email ?? null,\n dealId: comment.deal ? (typeof comment.deal === 'string' ? comment.deal : comment.deal.id) : null,\n createdAt: comment.createdAt.toISOString(),\n appearanceIcon: comment.appearanceIcon ?? null,\n appearanceColor: comment.appearanceColor ?? null,\n }\n })\n : [],\n activities: includeActivities\n ? activities.map((activity) => ({\n id: activity.id,\n activityType: activity.activityType,\n subject: activity.subject,\n body: activity.body,\n occurredAt: activity.occurredAt ? activity.occurredAt.toISOString() : null,\n dealId: activity.deal ? (typeof activity.deal === 'string' ? activity.deal : activity.deal.id) : null,\n authorUserId: activity.authorUserId,\n authorName: activity.authorUserId ? userMap.get(activity.authorUserId)?.name ?? null : null,\n authorEmail: activity.authorUserId ? userMap.get(activity.authorUserId)?.email ?? null : null,\n createdAt: activity.createdAt.toISOString(),\n appearanceIcon: activity.appearanceIcon ?? null,\n appearanceColor: activity.appearanceColor ?? null,\n }))\n : [],\n deals: includeDeals\n ? deals.map((deal) => ({\n id: deal.id,\n title: deal.title,\n status: deal.status,\n pipelineStage: deal.pipelineStage,\n valueAmount: deal.valueAmount,\n valueCurrency: deal.valueCurrency,\n probability: deal.probability,\n expectedCloseAt: deal.expectedCloseAt ? deal.expectedCloseAt.toISOString() : null,\n ownerUserId: deal.ownerUserId,\n source: deal.source,\n createdAt: deal.createdAt.toISOString(),\n updatedAt: deal.updatedAt.toISOString(),\n }))\n : [],\n todos: includeTodos\n ? todoLinks.map((link) => {\n const source = typeof link.todoSource === 'string' && link.todoSource.trim().length > 0 ? link.todoSource : 'example:todo'\n const key = `${source}:${link.todoId}`\n const detail = todoDetails.get(key)\n return {\n id: link.id,\n todoId: link.todoId,\n todoSource: source,\n createdAt: link.createdAt.toISOString(),\n createdByUserId: link.createdByUserId,\n title: detail?.title ?? null,\n isDone: detail?.isDone ?? null,\n priority: detail?.priority ?? null,\n severity: detail?.severity ?? null,\n description: detail?.description ?? null,\n dueAt: detail?.dueAt ?? null,\n todoOrganizationId: detail?.organizationId ?? null,\n customValues: detail?.customValues ?? null,\n }\n })\n : [],\n viewer: {\n userId: viewerUserIdFinal,\n name: viewerUserIdFinal ? userMap.get(viewerUserIdFinal)?.name ?? null : null,\n email: viewerUserIdFinal ? userMap.get(viewerUserIdFinal)?.email ?? auth.email ?? null : auth.email ?? null,\n },\n })\n statusCode = 200\n profileMeta = {\n include: Array.from(includeTokens),\n counts: {\n tags: tagAssignments.length,\n comments: comments.length,\n activities: activities.length,\n todos: todoLinks.length,\n addresses: addresses.length,\n deals: deals.length,\n },\n }\n profiler.mark('response_ready', { status: statusCode })\n return response\n } catch (err) {\n if (statusCode < 400) statusCode = 500\n const message = err instanceof Error ? err.message : String(err)\n profileMeta = { ...(profileMeta ?? {}), error: message }\n throw err\n } finally {\n profiler.end({ status: statusCode, ...(profileMeta ?? {}) })\n }\n}\nconst personDetailQuerySchema = z.object({\n include: z\n .string()\n .optional()\n .describe('Comma-separated list of relations to include (addresses, comments, activities, deals, todos).'),\n}).passthrough()\n\nconst personDetailResponseSchema = z.object({\n person: z.object({\n id: z.string().uuid(),\n displayName: z.string().nullable().optional(),\n description: z.string().nullable().optional(),\n ownerUserId: z.string().uuid().nullable().optional(),\n primaryEmail: z.string().nullable().optional(),\n primaryPhone: z.string().nullable().optional(),\n status: z.string().nullable().optional(),\n lifecycleStage: z.string().nullable().optional(),\n source: z.string().nullable().optional(),\n nextInteractionAt: z.string().nullable().optional(),\n nextInteractionName: z.string().nullable().optional(),\n nextInteractionRefId: z.string().nullable().optional(),\n nextInteractionIcon: z.string().nullable().optional(),\n nextInteractionColor: z.string().nullable().optional(),\n organizationId: z.string().uuid().nullable().optional(),\n tenantId: z.string().uuid().nullable().optional(),\n isActive: z.boolean().optional(),\n createdAt: z.string(),\n updatedAt: z.string(),\n }),\n profile: z\n .object({\n id: z.string().uuid(),\n firstName: z.string().nullable().optional(),\n lastName: z.string().nullable().optional(),\n preferredName: z.string().nullable().optional(),\n jobTitle: z.string().nullable().optional(),\n department: z.string().nullable().optional(),\n seniority: z.string().nullable().optional(),\n timezone: z.string().nullable().optional(),\n linkedInUrl: z.string().nullable().optional(),\n twitterUrl: z.string().nullable().optional(),\n companyEntityId: z.string().uuid().nullable().optional(),\n updatedAt: z.string(),\n })\n .nullable(),\n customFields: z.record(z.string(), z.unknown()),\n tags: z.array(\n z.object({\n id: z.string().uuid(),\n label: z.string(),\n color: z.string().nullable().optional(),\n }),\n ),\n addresses: z.array(\n z.object({\n id: z.string().uuid(),\n name: z.string().nullable().optional(),\n purpose: z.string().nullable().optional(),\n addressLine1: z.string().nullable().optional(),\n addressLine2: z.string().nullable().optional(),\n buildingNumber: z.string().nullable().optional(),\n flatNumber: z.string().nullable().optional(),\n city: z.string().nullable().optional(),\n region: z.string().nullable().optional(),\n postalCode: z.string().nullable().optional(),\n country: z.string().nullable().optional(),\n latitude: z.number().nullable().optional(),\n longitude: z.number().nullable().optional(),\n isPrimary: z.boolean().nullable().optional(),\n createdAt: z.string(),\n }),\n ),\n comments: z.array(\n z.object({\n id: z.string().uuid(),\n body: z.string().nullable().optional(),\n authorUserId: z.string().uuid().nullable().optional(),\n authorName: z.string().nullable().optional(),\n authorEmail: z.string().nullable().optional(),\n dealId: z.string().uuid().nullable().optional(),\n createdAt: z.string(),\n appearanceIcon: z.string().nullable().optional(),\n appearanceColor: z.string().nullable().optional(),\n }),\n ),\n activities: z.array(\n z.object({\n id: z.string().uuid(),\n activityType: z.string(),\n subject: z.string().nullable().optional(),\n body: z.string().nullable().optional(),\n occurredAt: z.string().nullable().optional(),\n dealId: z.string().uuid().nullable().optional(),\n authorUserId: z.string().uuid().nullable().optional(),\n authorName: z.string().nullable().optional(),\n authorEmail: z.string().nullable().optional(),\n createdAt: z.string(),\n appearanceIcon: z.string().nullable().optional(),\n appearanceColor: z.string().nullable().optional(),\n }),\n ),\n deals: z.array(\n z.object({\n id: z.string().uuid(),\n title: z.string().nullable().optional(),\n status: z.string().nullable().optional(),\n pipelineStage: z.string().nullable().optional(),\n valueAmount: z.number().nullable().optional(),\n valueCurrency: z.string().nullable().optional(),\n probability: z.number().nullable().optional(),\n expectedCloseAt: z.string().nullable().optional(),\n ownerUserId: z.string().uuid().nullable().optional(),\n source: z.string().nullable().optional(),\n createdAt: z.string(),\n updatedAt: z.string(),\n }),\n ),\n todos: z.array(\n z.object({\n id: z.string().uuid(),\n todoId: z.string().uuid(),\n todoSource: z.string(),\n createdAt: z.string(),\n createdByUserId: z.string().uuid().nullable().optional(),\n title: z.string().nullable().optional(),\n isDone: z.boolean().nullable().optional(),\n priority: z.number().nullable().optional(),\n severity: z.string().nullable().optional(),\n description: z.string().nullable().optional(),\n dueAt: z.string().nullable().optional(),\n todoOrganizationId: z.string().uuid().nullable().optional(),\n customValues: z.record(z.string(), z.unknown()).nullable().optional(),\n }),\n ),\n viewer: z.object({\n userId: z.string().uuid().nullable(),\n name: z.string().nullable(),\n email: z.string().nullable(),\n }),\n})\n\nconst personDetailErrorSchema = z.object({\n error: z.string(),\n})\n\nexport const openApi: OpenApiRouteDoc = {\n tag: 'Customers',\n summary: 'Fetch person detail',\n methods: {\n GET: {\n summary: 'Fetch person with related data',\n description: 'Returns a person customer record with optional related resources such as addresses, comments, activities, deals, and todos.',\n query: personDetailQuerySchema,\n responses: [\n { status: 200, description: 'Person detail payload', schema: personDetailResponseSchema },\n ],\n errors: [\n { status: 400, description: 'Invalid identifier', schema: personDetailErrorSchema },\n { status: 401, description: 'Unauthorized', schema: personDetailErrorSchema },\n { status: 403, description: 'Forbidden for tenant/organization scope', schema: personDetailErrorSchema },\n { status: 404, description: 'Person not found', schema: personDetailErrorSchema },\n ],\n },\n },\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -2166,7 +2166,7 @@ async function warnIfStressTestSchemaChanged(knex) {
2166
2166
  try {
2167
2167
  const warnings = [];
2168
2168
  for (const [table, requiredColumns] of Object.entries(STRESS_TEST_REQUIRED_COLUMNS)) {
2169
- const rows = await knex("information_schema.columns").select("column_name").where({ table_schema: "public", table_name: table });
2169
+ const rows = await knex("information_schema.columns").select("column_name").whereRaw("table_schema = current_schema()").where({ table_name: table });
2170
2170
  const existing = new Set(rows.map((row) => row.column_name));
2171
2171
  const missing = requiredColumns.filter((column) => !existing.has(column));
2172
2172
  if (missing.length) warnings.push(`${table}: missing ${missing.join(", ")}`);