@htlkg/data 0.0.21 → 0.0.22
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/dist/hooks/index.d.ts +601 -94
- package/dist/hooks/index.js +682 -73
- package/dist/hooks/index.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +691 -82
- package/dist/index.js.map +1 -1
- package/dist/mutations/index.js +4 -4
- package/dist/mutations/index.js.map +1 -1
- package/dist/queries/index.js +5 -5
- package/dist/queries/index.js.map +1 -1
- package/package.json +11 -12
- package/src/hooks/accounts/index.ts +2 -0
- package/src/hooks/{useAccounts.ts → accounts/useAccounts.ts} +48 -5
- package/src/hooks/accounts/usePaginatedAccounts.ts +166 -0
- package/src/hooks/brands/index.ts +2 -0
- package/src/hooks/{useBrands.ts → brands/useBrands.ts} +1 -1
- package/src/hooks/brands/usePaginatedBrands.ts +206 -0
- package/src/hooks/createPaginatedDataHook.ts +359 -0
- package/src/hooks/data-hook-errors.property.test.ts +4 -4
- package/src/hooks/data-hook-filters.property.test.ts +4 -4
- package/src/hooks/data-hooks.property.test.ts +4 -4
- package/src/hooks/index.ts +96 -8
- package/src/hooks/productInstances/index.ts +1 -0
- package/src/hooks/{useProductInstances.ts → productInstances/useProductInstances.ts} +9 -6
- package/src/hooks/products/index.ts +1 -0
- package/src/hooks/{useProducts.ts → products/useProducts.ts} +4 -5
- package/src/hooks/reservations/index.ts +2 -0
- package/src/hooks/reservations/usePaginatedReservations.ts +258 -0
- package/src/hooks/{useReservations.ts → reservations/useReservations.ts} +65 -10
- package/src/hooks/users/index.ts +2 -0
- package/src/hooks/users/usePaginatedUsers.ts +213 -0
- package/src/hooks/{useUsers.ts → users/useUsers.ts} +1 -1
- package/src/mutations/accounts/accounts.test.ts +287 -0
- package/src/mutations/{accounts.ts → accounts/accounts.ts} +2 -2
- package/src/mutations/accounts/index.ts +1 -0
- package/src/mutations/brands/brands.test.ts +292 -0
- package/src/mutations/{brands.ts → brands/brands.ts} +2 -2
- package/src/mutations/brands/index.ts +1 -0
- package/src/mutations/reservations/index.ts +1 -0
- package/src/mutations/{reservations.test.ts → reservations/reservations.test.ts} +1 -1
- package/src/mutations/{reservations.ts → reservations/reservations.ts} +2 -2
- package/src/mutations/users/index.ts +1 -0
- package/src/mutations/users/users.test.ts +289 -0
- package/src/mutations/{users.ts → users/users.ts} +2 -2
- package/src/queries/accounts/accounts.test.ts +228 -0
- package/src/queries/accounts/index.ts +1 -0
- package/src/queries/brands/brands.test.ts +288 -0
- package/src/queries/brands/index.ts +1 -0
- package/src/queries/products/index.ts +1 -0
- package/src/queries/products/products.test.ts +347 -0
- package/src/queries/reservations/index.ts +1 -0
- package/src/queries/users/index.ts +1 -0
- package/src/queries/users/users.test.ts +301 -0
- /package/src/queries/{accounts.ts → accounts/accounts.ts} +0 -0
- /package/src/queries/{brands.ts → brands/brands.ts} +0 -0
- /package/src/queries/{products.ts → products/products.ts} +0 -0
- /package/src/queries/{reservations.test.ts → reservations/reservations.test.ts} +0 -0
- /package/src/queries/{reservations.ts → reservations/reservations.ts} +0 -0
- /package/src/queries/{users.ts → users/users.ts} +0 -0
package/dist/mutations/index.js
CHANGED
|
@@ -32,7 +32,7 @@ function checkRestoreEligibility(deletedAt, retentionDays) {
|
|
|
32
32
|
};
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
// src/mutations/brands.ts
|
|
35
|
+
// src/mutations/brands/brands.ts
|
|
36
36
|
async function createBrand(client, input) {
|
|
37
37
|
try {
|
|
38
38
|
const { data, errors } = await client.models.Brand.create(input);
|
|
@@ -120,7 +120,7 @@ async function deleteBrand(client, id) {
|
|
|
120
120
|
}
|
|
121
121
|
}
|
|
122
122
|
|
|
123
|
-
// src/mutations/accounts.ts
|
|
123
|
+
// src/mutations/accounts/accounts.ts
|
|
124
124
|
async function createAccount(client, input) {
|
|
125
125
|
try {
|
|
126
126
|
const { data, errors } = await client.models.Account.create(input);
|
|
@@ -208,7 +208,7 @@ async function deleteAccount(client, id) {
|
|
|
208
208
|
}
|
|
209
209
|
}
|
|
210
210
|
|
|
211
|
-
// src/mutations/users.ts
|
|
211
|
+
// src/mutations/users/users.ts
|
|
212
212
|
async function createUser(client, input) {
|
|
213
213
|
try {
|
|
214
214
|
const { data, errors } = await client.models.User.create(input);
|
|
@@ -510,7 +510,7 @@ async function initializeSystemSettings(client, initializedBy) {
|
|
|
510
510
|
}
|
|
511
511
|
}
|
|
512
512
|
|
|
513
|
-
// src/mutations/reservations.ts
|
|
513
|
+
// src/mutations/reservations/reservations.ts
|
|
514
514
|
var STATUS_TRANSITIONS = {
|
|
515
515
|
confirmed: ["checked_in", "cancelled", "no_show"],
|
|
516
516
|
checked_in: ["checked_out", "cancelled"],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/queries/systemSettings.ts","../../src/mutations/brands.ts","../../src/mutations/accounts.ts","../../src/mutations/users.ts","../../src/mutations/productInstances/productInstances.ts","../../src/mutations/systemSettings.ts","../../src/mutations/reservations.ts","../../src/mutations/contacts.ts","../../src/queries/contacts.ts"],"sourcesContent":["/**\n * SystemSettings Query Functions\n *\n * Provides query functions for fetching system settings from the GraphQL API.\n */\n\nimport type { SystemSettings } from \"@htlkg/core/types\";\n\n/** Default retention days if no settings exist */\nexport const DEFAULT_SOFT_DELETE_RETENTION_DAYS = 30;\n\n/** The key used for global system settings */\nexport const SYSTEM_SETTINGS_KEY = \"GLOBAL\";\n\n/**\n * Get system settings\n *\n * @example\n * ```typescript\n * import { getSystemSettings } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const settings = await getSystemSettings(client);\n * ```\n */\nexport async function getSystemSettings<TClient = any>(\n\tclient: TClient,\n): Promise<SystemSettings | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.SystemSettings.get({\n\t\t\tkey: SYSTEM_SETTINGS_KEY,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getSystemSettings] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as SystemSettings;\n\t} catch (error) {\n\t\tconsole.error(\"[getSystemSettings] Error fetching system settings:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Get the soft delete retention days from system settings\n * Returns the default (30 days) if settings don't exist\n *\n * @example\n * ```typescript\n * import { getSoftDeleteRetentionDays } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const days = await getSoftDeleteRetentionDays(client);\n * ```\n */\nexport async function getSoftDeleteRetentionDays<TClient = any>(\n\tclient: TClient,\n): Promise<number> {\n\tconst settings = await getSystemSettings(client);\n\treturn settings?.softDeleteRetentionDays ?? DEFAULT_SOFT_DELETE_RETENTION_DAYS;\n}\n\n/**\n * Check if a soft-deleted item can still be restored based on retention period\n *\n * @param deletedAt - The ISO date string when the item was deleted\n * @param retentionDays - Number of days items can be restored\n * @returns Object with canRestore flag and daysRemaining/daysExpired\n */\nexport function checkRestoreEligibility(\n\tdeletedAt: string | undefined | null,\n\tretentionDays: number,\n): {\n\tcanRestore: boolean;\n\tdaysRemaining: number;\n\tdaysExpired: number;\n\texpiresAt: Date | null;\n} {\n\tif (!deletedAt) {\n\t\treturn {\n\t\t\tcanRestore: false,\n\t\t\tdaysRemaining: 0,\n\t\t\tdaysExpired: 0,\n\t\t\texpiresAt: null,\n\t\t};\n\t}\n\n\tconst deletedDate = new Date(deletedAt);\n\tconst expiresAt = new Date(deletedDate);\n\texpiresAt.setDate(expiresAt.getDate() + retentionDays);\n\n\tconst now = new Date();\n\tconst msRemaining = expiresAt.getTime() - now.getTime();\n\tconst daysRemaining = Math.ceil(msRemaining / (1000 * 60 * 60 * 24));\n\n\tif (daysRemaining <= 0) {\n\t\treturn {\n\t\t\tcanRestore: false,\n\t\t\tdaysRemaining: 0,\n\t\t\tdaysExpired: Math.abs(daysRemaining),\n\t\t\texpiresAt,\n\t\t};\n\t}\n\n\treturn {\n\t\tcanRestore: true,\n\t\tdaysRemaining,\n\t\tdaysExpired: 0,\n\t\texpiresAt,\n\t};\n}\n","/**\n * Brand Mutation Functions\n *\n * Provides mutation functions for creating, updating, and deleting brands.\n */\n\nimport type { Brand } from \"@htlkg/core/types\";\nimport {\n\tcheckRestoreEligibility,\n\tDEFAULT_SOFT_DELETE_RETENTION_DAYS,\n} from \"../queries/systemSettings\";\nimport type { CreateAuditFields, UpdateWithSoftDeleteFields } from \"./common\";\n\n/**\n * Input type for creating a brand\n */\nexport interface CreateBrandInput extends CreateAuditFields {\n\taccountId: string;\n\tname: string;\n\tlogo?: string;\n\ttimezone?: string;\n\tstatus?: \"active\" | \"inactive\" | \"maintenance\" | \"suspended\" | \"deleted\";\n\tsettings?: Record<string, any>;\n}\n\n/**\n * Input type for updating a brand\n */\nexport interface UpdateBrandInput extends UpdateWithSoftDeleteFields {\n\tid: string;\n\tname?: string;\n\tlogo?: string;\n\ttimezone?: string;\n\tstatus?: \"active\" | \"inactive\" | \"maintenance\" | \"suspended\" | \"deleted\";\n\tsettings?: Record<string, any>;\n}\n\n/**\n * Create a new brand\n *\n * @example\n * ```typescript\n * import { createBrand } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const brand = await createBrand(client, {\n * accountId: 'account-123',\n * name: 'My Brand',\n * timezone: 'America/New_York',\n * status: 'active'\n * });\n * ```\n */\nexport async function createBrand<TClient = any>(\n\tclient: TClient,\n\tinput: CreateBrandInput,\n): Promise<Brand | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.Brand.create(input);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[createBrand] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as Brand;\n\t} catch (error) {\n\t\tconsole.error(\"[createBrand] Error creating brand:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Update an existing brand\n *\n * @example\n * ```typescript\n * import { updateBrand } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const brand = await updateBrand(client, {\n * id: 'brand-123',\n * name: 'Updated Brand Name',\n * status: 'maintenance'\n * });\n * ```\n */\nexport async function updateBrand<TClient = any>(\n\tclient: TClient,\n\tinput: UpdateBrandInput,\n): Promise<Brand | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.Brand.update(input);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[updateBrand] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as Brand;\n\t} catch (error) {\n\t\tconsole.error(\"[updateBrand] Error updating brand:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Soft delete a brand (sets status to \"deleted\" instead of removing)\n *\n * @example\n * ```typescript\n * import { softDeleteBrand } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * await softDeleteBrand(client, 'brand-123', 'admin@example.com');\n * ```\n */\nexport async function softDeleteBrand<TClient = any>(\n\tclient: TClient,\n\tid: string,\n\tdeletedBy: string,\n): Promise<boolean> {\n\ttry {\n\t\tconst { errors } = await (client as any).models.Brand.update({\n\t\t\tid,\n\t\t\tstatus: \"deleted\",\n\t\t\tdeletedAt: new Date().toISOString(),\n\t\t\tdeletedBy,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[softDeleteBrand] GraphQL errors:\", errors);\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (error) {\n\t\tconsole.error(\"[softDeleteBrand] Error soft-deleting brand:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Restore a soft-deleted brand (sets status back to \"active\")\n * Checks retention period before allowing restoration\n *\n * @example\n * ```typescript\n * import { restoreBrand } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * await restoreBrand(client, 'brand-123');\n * // Or with custom retention days:\n * await restoreBrand(client, 'brand-123', 60);\n * ```\n */\nexport async function restoreBrand<TClient = any>(\n\tclient: TClient,\n\tid: string,\n\tretentionDays: number = DEFAULT_SOFT_DELETE_RETENTION_DAYS,\n): Promise<{ success: boolean; error?: string }> {\n\ttry {\n\t\t// First, get the brand to check its deletedAt timestamp\n\t\tconst { data: brand, errors: getErrors } = await (\n\t\t\tclient as any\n\t\t).models.Brand.get({ id });\n\n\t\tif (getErrors || !brand) {\n\t\t\tconsole.error(\"[restoreBrand] Error fetching brand:\", getErrors);\n\t\t\treturn { success: false, error: \"Brand not found\" };\n\t\t}\n\n\t\t// Check if restoration is allowed based on retention period\n\t\tconst eligibility = checkRestoreEligibility(brand.deletedAt, retentionDays);\n\n\t\tif (!eligibility.canRestore) {\n\t\t\tconst errorMsg = `Cannot restore brand. Retention period of ${retentionDays} days has expired. Item was deleted ${eligibility.daysExpired} days ago.`;\n\t\t\tconsole.error(\"[restoreBrand]\", errorMsg);\n\t\t\treturn { success: false, error: errorMsg };\n\t\t}\n\n\t\tconst { errors } = await (client as any).models.Brand.update({\n\t\t\tid,\n\t\t\tstatus: \"active\",\n\t\t\tdeletedAt: null,\n\t\t\tdeletedBy: null,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[restoreBrand] GraphQL errors:\", errors);\n\t\t\treturn { success: false, error: \"Failed to restore brand\" };\n\t\t}\n\n\t\treturn { success: true };\n\t} catch (error) {\n\t\tconsole.error(\"[restoreBrand] Error restoring brand:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Hard delete a brand (permanently removes from database)\n * Use with caution - prefer softDeleteBrand for recoverable deletion\n *\n * @example\n * ```typescript\n * import { deleteBrand } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * await deleteBrand(client, 'brand-123');\n * ```\n */\nexport async function deleteBrand<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<boolean> {\n\ttry {\n\t\tconst { errors } = await (client as any).models.Brand.delete({ id });\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[deleteBrand] GraphQL errors:\", errors);\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (error) {\n\t\tconsole.error(\"[deleteBrand] Error deleting brand:\", error);\n\t\tthrow error;\n\t}\n}\n","/**\n * Account Mutation Functions\n *\n * Provides mutation functions for creating, updating, and deleting accounts.\n */\n\nimport type { Account } from \"@htlkg/core/types\";\nimport {\n\tcheckRestoreEligibility,\n\tDEFAULT_SOFT_DELETE_RETENTION_DAYS,\n} from \"../queries/systemSettings\";\nimport type { CreateAuditFields, UpdateWithSoftDeleteFields } from \"./common\";\n\n/**\n * Input type for creating an account\n */\nexport interface CreateAccountInput extends CreateAuditFields {\n\tname: string;\n\tlogo?: string;\n\tsubscription?: Record<string, any>;\n\tsettings?: Record<string, any>;\n\tstatus?: \"active\" | \"inactive\" | \"deleted\";\n}\n\n/**\n * Input type for updating an account\n */\nexport interface UpdateAccountInput extends UpdateWithSoftDeleteFields {\n\tid: string;\n\tname?: string;\n\tlogo?: string;\n\tsubscription?: Record<string, any>;\n\tsettings?: Record<string, any>;\n\tstatus?: \"active\" | \"inactive\" | \"deleted\";\n}\n\n/**\n * Create a new account\n *\n * @example\n * ```typescript\n * import { createAccount } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const account = await createAccount(client, {\n * name: 'My Account',\n * subscription: { plan: 'premium' }\n * });\n * ```\n */\nexport async function createAccount<TClient = any>(\n\tclient: TClient,\n\tinput: CreateAccountInput,\n): Promise<Account | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.Account.create(input);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[createAccount] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as Account;\n\t} catch (error) {\n\t\tconsole.error(\"[createAccount] Error creating account:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Update an existing account\n *\n * @example\n * ```typescript\n * import { updateAccount } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const account = await updateAccount(client, {\n * id: 'account-123',\n * name: 'Updated Account Name'\n * });\n * ```\n */\nexport async function updateAccount<TClient = any>(\n\tclient: TClient,\n\tinput: UpdateAccountInput,\n): Promise<Account | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.Account.update(input);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[updateAccount] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as Account;\n\t} catch (error) {\n\t\tconsole.error(\"[updateAccount] Error updating account:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Soft delete an account (sets status to \"deleted\" instead of removing)\n *\n * @example\n * ```typescript\n * import { softDeleteAccount } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * await softDeleteAccount(client, 'account-123', 'admin@example.com');\n * ```\n */\nexport async function softDeleteAccount<TClient = any>(\n\tclient: TClient,\n\tid: string,\n\tdeletedBy: string,\n): Promise<boolean> {\n\ttry {\n\t\tconst { errors } = await (client as any).models.Account.update({\n\t\t\tid,\n\t\t\tstatus: \"deleted\",\n\t\t\tdeletedAt: new Date().toISOString(),\n\t\t\tdeletedBy,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[softDeleteAccount] GraphQL errors:\", errors);\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (error) {\n\t\tconsole.error(\"[softDeleteAccount] Error soft-deleting account:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Restore a soft-deleted account (sets status back to \"active\")\n * Checks retention period before allowing restoration\n *\n * @example\n * ```typescript\n * import { restoreAccount } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * await restoreAccount(client, 'account-123');\n * // Or with custom retention days:\n * await restoreAccount(client, 'account-123', 60);\n * ```\n */\nexport async function restoreAccount<TClient = any>(\n\tclient: TClient,\n\tid: string,\n\tretentionDays: number = DEFAULT_SOFT_DELETE_RETENTION_DAYS,\n): Promise<{ success: boolean; error?: string }> {\n\ttry {\n\t\t// First, get the account to check its deletedAt timestamp\n\t\tconst { data: account, errors: getErrors } = await (\n\t\t\tclient as any\n\t\t).models.Account.get({ id });\n\n\t\tif (getErrors || !account) {\n\t\t\tconsole.error(\"[restoreAccount] Error fetching account:\", getErrors);\n\t\t\treturn { success: false, error: \"Account not found\" };\n\t\t}\n\n\t\t// Check if restoration is allowed based on retention period\n\t\tconst eligibility = checkRestoreEligibility(account.deletedAt, retentionDays);\n\n\t\tif (!eligibility.canRestore) {\n\t\t\tconst errorMsg = `Cannot restore account. Retention period of ${retentionDays} days has expired. Item was deleted ${eligibility.daysExpired} days ago.`;\n\t\t\tconsole.error(\"[restoreAccount]\", errorMsg);\n\t\t\treturn { success: false, error: errorMsg };\n\t\t}\n\n\t\tconst { errors } = await (client as any).models.Account.update({\n\t\t\tid,\n\t\t\tstatus: \"active\",\n\t\t\tdeletedAt: null,\n\t\t\tdeletedBy: null,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[restoreAccount] GraphQL errors:\", errors);\n\t\t\treturn { success: false, error: \"Failed to restore account\" };\n\t\t}\n\n\t\treturn { success: true };\n\t} catch (error) {\n\t\tconsole.error(\"[restoreAccount] Error restoring account:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Hard delete an account (permanently removes from database)\n * Use with caution - prefer softDeleteAccount for recoverable deletion\n *\n * @example\n * ```typescript\n * import { deleteAccount } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * await deleteAccount(client, 'account-123');\n * ```\n */\nexport async function deleteAccount<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<boolean> {\n\ttry {\n\t\tconst { errors } = await (client as any).models.Account.delete({ id });\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[deleteAccount] GraphQL errors:\", errors);\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (error) {\n\t\tconsole.error(\"[deleteAccount] Error deleting account:\", error);\n\t\tthrow error;\n\t}\n}\n","/**\n * User Mutation Functions\n *\n * Provides mutation functions for creating, updating, and deleting users.\n */\n\nimport type { User } from \"@htlkg/core/types\";\nimport {\n\tcheckRestoreEligibility,\n\tDEFAULT_SOFT_DELETE_RETENTION_DAYS,\n} from \"../queries/systemSettings\";\nimport type { CreateAuditFields, UpdateWithSoftDeleteFields } from \"./common\";\n\n/**\n * Input type for creating a user\n */\nexport interface CreateUserInput extends CreateAuditFields {\n\tcognitoId: string;\n\temail: string;\n\taccountId: string;\n\tbrandIds?: string[];\n\troles?: string[];\n\tpermissions?: Record<string, any>;\n\tstatus?: \"active\" | \"inactive\" | \"pending\" | \"suspended\" | \"deleted\";\n}\n\n/**\n * Input type for updating a user\n */\nexport interface UpdateUserInput extends UpdateWithSoftDeleteFields {\n\tid: string;\n\temail?: string;\n\tbrandIds?: string[];\n\troles?: string[];\n\tpermissions?: Record<string, any>;\n\tlastLogin?: string;\n\tstatus?: \"active\" | \"inactive\" | \"pending\" | \"suspended\" | \"deleted\";\n}\n\n/**\n * Create a new user\n *\n * @example\n * ```typescript\n * import { createUser } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const user = await createUser(client, {\n * cognitoId: 'cognito-123',\n * email: 'user@example.com',\n * accountId: 'account-123',\n * roles: ['BRAND_ADMIN'],\n * status: 'active'\n * });\n * ```\n */\nexport async function createUser<TClient = any>(\n\tclient: TClient,\n\tinput: CreateUserInput,\n): Promise<User | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.User.create(input);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[createUser] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as User;\n\t} catch (error) {\n\t\tconsole.error(\"[createUser] Error creating user:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Update an existing user\n *\n * @example\n * ```typescript\n * import { updateUser } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const user = await updateUser(client, {\n * id: 'user-123',\n * roles: ['BRAND_ADMIN', 'ACCOUNT_ADMIN'],\n * status: 'active'\n * });\n * ```\n */\nexport async function updateUser<TClient = any>(\n\tclient: TClient,\n\tinput: UpdateUserInput,\n): Promise<User | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.User.update(input);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[updateUser] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as User;\n\t} catch (error) {\n\t\tconsole.error(\"[updateUser] Error updating user:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Soft delete a user (sets status to \"deleted\" instead of removing)\n *\n * @example\n * ```typescript\n * import { softDeleteUser } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * await softDeleteUser(client, 'user-123', 'admin@example.com');\n * ```\n */\nexport async function softDeleteUser<TClient = any>(\n\tclient: TClient,\n\tid: string,\n\tdeletedBy: string,\n): Promise<boolean> {\n\ttry {\n\t\tconst { errors } = await (client as any).models.User.update({\n\t\t\tid,\n\t\t\tstatus: \"deleted\",\n\t\t\tdeletedAt: new Date().toISOString(),\n\t\t\tdeletedBy,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[softDeleteUser] GraphQL errors:\", errors);\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (error) {\n\t\tconsole.error(\"[softDeleteUser] Error soft-deleting user:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Restore a soft-deleted user (sets status back to \"active\")\n * Checks retention period before allowing restoration\n *\n * @example\n * ```typescript\n * import { restoreUser } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * await restoreUser(client, 'user-123');\n * // Or with custom retention days:\n * await restoreUser(client, 'user-123', 60);\n * ```\n */\nexport async function restoreUser<TClient = any>(\n\tclient: TClient,\n\tid: string,\n\tretentionDays: number = DEFAULT_SOFT_DELETE_RETENTION_DAYS,\n): Promise<{ success: boolean; error?: string }> {\n\ttry {\n\t\t// First, get the user to check its deletedAt timestamp\n\t\tconst { data: user, errors: getErrors } = await (\n\t\t\tclient as any\n\t\t).models.User.get({ id });\n\n\t\tif (getErrors || !user) {\n\t\t\tconsole.error(\"[restoreUser] Error fetching user:\", getErrors);\n\t\t\treturn { success: false, error: \"User not found\" };\n\t\t}\n\n\t\t// Check if restoration is allowed based on retention period\n\t\tconst eligibility = checkRestoreEligibility(user.deletedAt, retentionDays);\n\n\t\tif (!eligibility.canRestore) {\n\t\t\tconst errorMsg = `Cannot restore user. Retention period of ${retentionDays} days has expired. Item was deleted ${eligibility.daysExpired} days ago.`;\n\t\t\tconsole.error(\"[restoreUser]\", errorMsg);\n\t\t\treturn { success: false, error: errorMsg };\n\t\t}\n\n\t\tconst { errors } = await (client as any).models.User.update({\n\t\t\tid,\n\t\t\tstatus: \"active\",\n\t\t\tdeletedAt: null,\n\t\t\tdeletedBy: null,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[restoreUser] GraphQL errors:\", errors);\n\t\t\treturn { success: false, error: \"Failed to restore user\" };\n\t\t}\n\n\t\treturn { success: true };\n\t} catch (error) {\n\t\tconsole.error(\"[restoreUser] Error restoring user:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Hard delete a user (permanently removes from database)\n * Use with caution - prefer softDeleteUser for recoverable deletion\n *\n * @example\n * ```typescript\n * import { deleteUser } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * await deleteUser(client, 'user-123');\n * ```\n */\nexport async function deleteUser<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<boolean> {\n\ttry {\n\t\tconst { errors } = await (client as any).models.User.delete({ id });\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[deleteUser] GraphQL errors:\", errors);\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (error) {\n\t\tconsole.error(\"[deleteUser] Error deleting user:\", error);\n\t\tthrow error;\n\t}\n}\n","/**\n * ProductInstance Mutation Functions\n *\n * Provides mutation functions for creating, updating, and deleting product instances.\n * Product instances represent enabled products for a specific brand with their configuration.\n */\n\nimport type { ProductInstance } from \"@htlkg/core/types\";\nimport { getClientUser } from \"@htlkg/core/auth\";\nimport { getCurrentTimestamp } from \"@htlkg/core/utils\";\nimport { AppError } from \"@htlkg/core/errors\";\nimport type { CreateAuditFields, UpdateAuditFields } from \"../common\";\n\n/**\n * Get current user identifier for audit trails\n * Uses getClientUser() and returns email or username, falling back to \"system\"\n */\nasync function getUserIdentifier(fallback = \"system\"): Promise<string> {\n\ttry {\n\t\tconst user = await getClientUser();\n\t\tif (user) {\n\t\t\treturn user.email || user.username || fallback;\n\t\t}\n\t\treturn fallback;\n\t} catch {\n\t\treturn fallback;\n\t}\n}\n\n/**\n * Input type for creating a product instance\n */\nexport interface CreateProductInstanceInput extends CreateAuditFields {\n\tproductId: string;\n\tbrandId: string;\n\taccountId: string;\n\tproductName: string;\n\tenabled: boolean;\n\tconfig?: Record<string, any>;\n\tversion?: string;\n}\n\n/**\n * Input type for updating a product instance\n */\nexport interface UpdateProductInstanceInput extends UpdateAuditFields {\n\tid: string;\n\tenabled?: boolean;\n\tconfig?: Record<string, any>;\n\tversion?: string;\n}\n\n/**\n * Create a new product instance\n *\n * @example\n * ```typescript\n * import { createProductInstance } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const instance = await createProductInstance(client, {\n * productId: 'product-123',\n * brandId: 'brand-456',\n * accountId: 'account-789',\n * enabled: true,\n * config: { apiKey: 'xxx', maxRequests: 100 }\n * });\n * ```\n */\nexport async function createProductInstance<TClient = any>(\n\tclient: TClient,\n\tinput: CreateProductInstanceInput,\n): Promise<ProductInstance | null> {\n\ttry {\n\t\t// Get user identifier for audit trail\n\t\tconst userIdentifier = input.createdBy || input.updatedBy || await getUserIdentifier();\n\n\t\t// Build input - manually construct to avoid Vue Proxy issues\n\t\tconst timestamp = input.createdAt || getCurrentTimestamp();\n\t\tconst createInput: any = {\n\t\t\tproductId: input.productId,\n\t\t\tproductName: input.productName,\n\t\t\tbrandId: input.brandId,\n\t\t\taccountId: input.accountId,\n\t\t\tenabled: input.enabled,\n\t\t\tversion: input.version,\n\t\t\tcreatedAt: timestamp,\n\t\t\tcreatedBy: userIdentifier,\n\t\t\tupdatedAt: input.updatedAt || timestamp,\n\t\t\tupdatedBy: userIdentifier,\n\t\t};\n\n\t\t// AWSJSON type requires JSON STRING\n\t\tif (input.config) {\n\t\t\t// Double stringify: first to strip Vue Proxy, second to create JSON string\n\t\t\tcreateInput.config = JSON.stringify(JSON.parse(JSON.stringify(input.config)));\n\t\t}\n\n\t\tconsole.log(\"[createProductInstance] Config as string:\", createInput.config);\n\t\tconsole.log(\"[createProductInstance] Config type:\", typeof createInput.config);\n\n\t\tconst { data, errors } = await (client as any).models.ProductInstance.create(createInput);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[createProductInstance] GraphQL errors:\", errors);\n\t\t\tthrow new AppError(\n\t\t\t\t\"Failed to create product instance\",\n\t\t\t\t\"PRODUCT_INSTANCE_CREATE_ERROR\",\n\t\t\t\t500,\n\t\t\t\t{ errors }\n\t\t\t);\n\t\t}\n\n\t\treturn data as ProductInstance;\n\t} catch (error) {\n\t\tconsole.error(\"[createProductInstance] Error creating product instance:\", error);\n\t\tif (error instanceof AppError) {\n\t\t\tthrow error;\n\t\t}\n\t\tthrow new AppError(\n\t\t\t\"Failed to create product instance\",\n\t\t\t\"PRODUCT_INSTANCE_CREATE_ERROR\",\n\t\t\t500,\n\t\t\t{ originalError: error }\n\t\t);\n\t}\n}\n\n/**\n * Update an existing product instance\n *\n * @example\n * ```typescript\n * import { updateProductInstance } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const instance = await updateProductInstance(client, {\n * id: 'instance-123',\n * enabled: false,\n * config: { apiKey: 'new-key', maxRequests: 200 }\n * });\n * ```\n */\nexport async function updateProductInstance<TClient = any>(\n\tclient: TClient,\n\tinput: UpdateProductInstanceInput,\n): Promise<ProductInstance | null> {\n\ttry {\n\t\t// Add timestamp and user metadata if not provided\n\t\t// Convert config from Vue Proxy to plain object\n\t\tconst updateInput: any = {\n\t\t\t...input,\n\t\t\tupdatedAt: input.updatedAt || getCurrentTimestamp(),\n\t\t\tupdatedBy: input.updatedBy || await getUserIdentifier(),\n\t\t};\n\n\t\t// AWSJSON type requires JSON STRING\n\t\tif (input.config) {\n\t\t\tupdateInput.config = JSON.stringify(JSON.parse(JSON.stringify(input.config)));\n\t\t}\n\n\t\tconst { data, errors } = await (client as any).models.ProductInstance.update(updateInput);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[updateProductInstance] GraphQL errors:\", errors);\n\t\t\tthrow new AppError(\n\t\t\t\t\"Failed to update product instance\",\n\t\t\t\t\"PRODUCT_INSTANCE_UPDATE_ERROR\",\n\t\t\t\t500,\n\t\t\t\t{ errors }\n\t\t\t);\n\t\t}\n\n\t\treturn data as ProductInstance;\n\t} catch (error) {\n\t\tconsole.error(\"[updateProductInstance] Error updating product instance:\", error);\n\t\tif (error instanceof AppError) {\n\t\t\tthrow error;\n\t\t}\n\t\tthrow new AppError(\n\t\t\t\"Failed to update product instance\",\n\t\t\t\"PRODUCT_INSTANCE_UPDATE_ERROR\",\n\t\t\t500,\n\t\t\t{ originalError: error }\n\t\t);\n\t}\n}\n\n/**\n * Delete a product instance\n *\n * @example\n * ```typescript\n * import { deleteProductInstance } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * await deleteProductInstance(client, 'instance-123');\n * ```\n */\nexport async function deleteProductInstance<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<boolean> {\n\ttry {\n\t\tconst { errors } = await (client as any).models.ProductInstance.delete({ id });\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[deleteProductInstance] GraphQL errors:\", errors);\n\t\t\tthrow new AppError(\n\t\t\t\t\"Failed to delete product instance\",\n\t\t\t\t\"PRODUCT_INSTANCE_DELETE_ERROR\",\n\t\t\t\t500,\n\t\t\t\t{ errors }\n\t\t\t);\n\t\t}\n\n\t\treturn true;\n\t} catch (error) {\n\t\tconsole.error(\"[deleteProductInstance] Error deleting product instance:\", error);\n\t\tif (error instanceof AppError) {\n\t\t\tthrow error;\n\t\t}\n\t\tthrow new AppError(\n\t\t\t\"Failed to delete product instance\",\n\t\t\t\"PRODUCT_INSTANCE_DELETE_ERROR\",\n\t\t\t500,\n\t\t\t{ originalError: error }\n\t\t);\n\t}\n}\n\n/**\n * Toggle the enabled status of a product instance\n *\n * @example\n * ```typescript\n * import { toggleProductInstanceEnabled } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const instance = await toggleProductInstanceEnabled(client, 'instance-123', true);\n * ```\n */\nexport async function toggleProductInstanceEnabled<TClient = any>(\n\tclient: TClient,\n\tid: string,\n\tenabled: boolean,\n): Promise<ProductInstance | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.ProductInstance.update({\n\t\t\tid,\n\t\t\tenabled,\n\t\t\tlastUpdated: getCurrentTimestamp(),\n\t\t\tupdatedBy: await getUserIdentifier(),\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[toggleProductInstanceEnabled] GraphQL errors:\", errors);\n\t\t\tthrow new AppError(\n\t\t\t\t\"Failed to toggle product instance\",\n\t\t\t\t\"PRODUCT_INSTANCE_TOGGLE_ERROR\",\n\t\t\t\t500,\n\t\t\t\t{ errors }\n\t\t\t);\n\t\t}\n\n\t\treturn data as ProductInstance;\n\t} catch (error) {\n\t\tconsole.error(\"[toggleProductInstanceEnabled] Error toggling product instance:\", error);\n\t\tif (error instanceof AppError) {\n\t\t\tthrow error;\n\t\t}\n\t\tthrow new AppError(\n\t\t\t\"Failed to toggle product instance\",\n\t\t\t\"PRODUCT_INSTANCE_TOGGLE_ERROR\",\n\t\t\t500,\n\t\t\t{ originalError: error }\n\t\t);\n\t}\n}\n","/**\n * SystemSettings Mutation Functions\n *\n * Provides mutation functions for managing system settings.\n */\n\nimport type { SystemSettings } from \"@htlkg/core/types\";\nimport {\n\tSYSTEM_SETTINGS_KEY,\n\tDEFAULT_SOFT_DELETE_RETENTION_DAYS,\n} from \"../queries/systemSettings\";\n\n/**\n * Input type for updating system settings\n */\nexport interface UpdateSystemSettingsInput {\n\tsoftDeleteRetentionDays: number;\n\tupdatedBy: string;\n}\n\n/**\n * Update or create system settings\n * Only SUPER_ADMINS can update system settings\n *\n * @example\n * ```typescript\n * import { updateSystemSettings } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const settings = await updateSystemSettings(client, {\n * softDeleteRetentionDays: 60,\n * updatedBy: 'admin@example.com'\n * });\n * ```\n */\nexport async function updateSystemSettings<TClient = any>(\n\tclient: TClient,\n\tinput: UpdateSystemSettingsInput,\n): Promise<SystemSettings | null> {\n\ttry {\n\t\t// Validate retention days (minimum 1 day, maximum 365 days)\n\t\tif (input.softDeleteRetentionDays < 1 || input.softDeleteRetentionDays > 365) {\n\t\t\tconsole.error(\n\t\t\t\t\"[updateSystemSettings] Invalid retention days. Must be between 1 and 365.\",\n\t\t\t);\n\t\t\treturn null;\n\t\t}\n\n\t\t// First, try to get existing settings\n\t\tconst { data: existing } = await (client as any).models.SystemSettings.get({\n\t\t\tkey: SYSTEM_SETTINGS_KEY,\n\t\t});\n\n\t\tconst settingsData = {\n\t\t\tkey: SYSTEM_SETTINGS_KEY,\n\t\t\tsoftDeleteRetentionDays: input.softDeleteRetentionDays,\n\t\t\tupdatedAt: new Date().toISOString(),\n\t\t\tupdatedBy: input.updatedBy,\n\t\t};\n\n\t\tlet result;\n\t\tif (existing) {\n\t\t\t// Update existing settings\n\t\t\tresult = await (client as any).models.SystemSettings.update(settingsData);\n\t\t} else {\n\t\t\t// Create new settings\n\t\t\tresult = await (client as any).models.SystemSettings.create(settingsData);\n\t\t}\n\n\t\tif (result.errors) {\n\t\t\tconsole.error(\"[updateSystemSettings] GraphQL errors:\", result.errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn result.data as SystemSettings;\n\t} catch (error) {\n\t\tconsole.error(\"[updateSystemSettings] Error updating system settings:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Initialize system settings with default values if they don't exist\n *\n * @example\n * ```typescript\n * import { initializeSystemSettings } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const settings = await initializeSystemSettings(client, 'system@hotelinking.com');\n * ```\n */\nexport async function initializeSystemSettings<TClient = any>(\n\tclient: TClient,\n\tinitializedBy: string,\n): Promise<SystemSettings | null> {\n\ttry {\n\t\t// Check if settings already exist\n\t\tconst { data: existing } = await (client as any).models.SystemSettings.get({\n\t\t\tkey: SYSTEM_SETTINGS_KEY,\n\t\t});\n\n\t\tif (existing) {\n\t\t\treturn existing as SystemSettings;\n\t\t}\n\n\t\t// Create default settings\n\t\tconst { data, errors } = await (client as any).models.SystemSettings.create({\n\t\t\tkey: SYSTEM_SETTINGS_KEY,\n\t\t\tsoftDeleteRetentionDays: DEFAULT_SOFT_DELETE_RETENTION_DAYS,\n\t\t\tupdatedAt: new Date().toISOString(),\n\t\t\tupdatedBy: initializedBy,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[initializeSystemSettings] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as SystemSettings;\n\t} catch (error) {\n\t\tconsole.error(\n\t\t\t\"[initializeSystemSettings] Error initializing system settings:\",\n\t\t\terror,\n\t\t);\n\t\tthrow error;\n\t}\n}\n","/**\n * Reservation Mutation Functions\n *\n * Provides type-safe mutation functions for creating, updating, and deleting reservations.\n * Includes date validation and status transition rules.\n */\n\nimport {\n\tcheckRestoreEligibility,\n\tDEFAULT_SOFT_DELETE_RETENTION_DAYS,\n} from \"../queries/systemSettings\";\nimport type { CreateAuditFields, UpdateWithSoftDeleteFields } from \"./common\";\n\n/**\n * Reservation status type\n */\nexport type ReservationStatus = \"confirmed\" | \"checked_in\" | \"checked_out\" | \"cancelled\" | \"no_show\";\n\n/**\n * Valid status transitions for reservations\n * Maps current status -> allowed next statuses\n */\nconst STATUS_TRANSITIONS: Record<ReservationStatus, ReservationStatus[]> = {\n\tconfirmed: [\"checked_in\", \"cancelled\", \"no_show\"],\n\tchecked_in: [\"checked_out\", \"cancelled\"],\n\tchecked_out: [], // Terminal state - no transitions allowed\n\tcancelled: [], // Terminal state - no transitions allowed\n\tno_show: [], // Terminal state - no transitions allowed\n};\n\n/**\n * Validation error class for reservation operations\n */\nexport class ReservationValidationError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"ReservationValidationError\";\n\t}\n}\n\n/**\n * Validate check-in and check-out dates\n * @throws {ReservationValidationError} if dates are invalid\n */\nfunction validateDates(checkIn: string, checkOut: string): void {\n\tconst checkInDate = new Date(checkIn);\n\tconst checkOutDate = new Date(checkOut);\n\n\t// Check if dates are valid\n\tif (isNaN(checkInDate.getTime())) {\n\t\tthrow new ReservationValidationError(\"Invalid check-in date\");\n\t}\n\n\tif (isNaN(checkOutDate.getTime())) {\n\t\tthrow new ReservationValidationError(\"Invalid check-out date\");\n\t}\n\n\t// Check-out must be after check-in\n\tif (checkOutDate <= checkInDate) {\n\t\tthrow new ReservationValidationError(\n\t\t\t\"Check-out date must be after check-in date\"\n\t\t);\n\t}\n\n\t// Calculate minimum stay (at least a few hours)\n\tconst minStayHours = 4;\n\tconst stayDuration = checkOutDate.getTime() - checkInDate.getTime();\n\tconst hoursDiff = stayDuration / (1000 * 60 * 60);\n\n\tif (hoursDiff < minStayHours) {\n\t\tthrow new ReservationValidationError(\n\t\t\t`Minimum stay is ${minStayHours} hours`\n\t\t);\n\t}\n}\n\n/**\n * Validate status transition\n * @throws {ReservationValidationError} if transition is not allowed\n */\nfunction validateStatusTransition(\n\tcurrentStatus: ReservationStatus,\n\tnewStatus: ReservationStatus\n): void {\n\tconst allowedTransitions = STATUS_TRANSITIONS[currentStatus];\n\n\tif (!allowedTransitions.includes(newStatus)) {\n\t\tthrow new ReservationValidationError(\n\t\t\t`Invalid status transition from '${currentStatus}' to '${newStatus}'. ` +\n\t\t\t`Allowed transitions: ${allowedTransitions.length > 0 ? allowedTransitions.join(\", \") : \"none (terminal state)\"}`\n\t\t);\n\t}\n}\n\n/**\n * Input type for creating a reservation\n */\nexport interface CreateReservationInput extends CreateAuditFields {\n\tbrandId: string;\n\tvisitId: string;\n\tconfirmationCode: string;\n\tcheckIn: string;\n\tcheckOut: string;\n\tstatus?: \"confirmed\" | \"checked_in\" | \"checked_out\" | \"cancelled\" | \"no_show\";\n\tsource?: string;\n\tchannel?: string;\n\troomType?: string;\n\troom?: string;\n\ttotalAmount?: number;\n\tcurrency?: string;\n\tnights?: number;\n}\n\n/**\n * Input type for updating a reservation\n */\nexport interface UpdateReservationInput extends UpdateWithSoftDeleteFields {\n\tid: string;\n\tbrandId?: string;\n\tvisitId?: string;\n\tconfirmationCode?: string;\n\tcheckIn?: string;\n\tcheckOut?: string;\n\tstatus?: \"confirmed\" | \"checked_in\" | \"checked_out\" | \"cancelled\" | \"no_show\";\n\tsource?: string;\n\tchannel?: string;\n\troomType?: string;\n\troom?: string;\n\ttotalAmount?: number;\n\tcurrency?: string;\n\tnights?: number;\n}\n\n/**\n * Create a new reservation with date validation\n *\n * @throws {ReservationValidationError} if dates are invalid\n *\n * @example\n * ```typescript\n * import { createReservation } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const reservation = await createReservation(client, {\n * brandId: 'brand-123',\n * visitId: 'visit-456',\n * confirmationCode: 'ABC123',\n * checkIn: '2024-01-01',\n * checkOut: '2024-01-05',\n * status: 'confirmed'\n * });\n * ```\n */\nexport async function createReservation<TClient = any>(\n\tclient: TClient,\n\tinput: CreateReservationInput,\n): Promise<any | null> {\n\ttry {\n\t\t// Validate dates before creating\n\t\tvalidateDates(input.checkIn, input.checkOut);\n\n\t\t// Calculate nights if not provided\n\t\tif (!input.nights) {\n\t\t\tconst checkInDate = new Date(input.checkIn);\n\t\t\tconst checkOutDate = new Date(input.checkOut);\n\t\t\tconst diffTime = checkOutDate.getTime() - checkInDate.getTime();\n\t\t\tconst diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));\n\t\t\tinput.nights = diffDays;\n\t\t}\n\n\t\tconst { data, errors } = await (client as any).models.Reservation.create(input);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[createReservation] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data;\n\t} catch (error) {\n\t\tif (error instanceof ReservationValidationError) {\n\t\t\tconsole.error(\"[createReservation] Validation error:\", error.message);\n\t\t\tthrow error;\n\t\t}\n\t\tconsole.error(\"[createReservation] Error creating reservation:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Update an existing reservation with validation\n *\n * @throws {ReservationValidationError} if dates or status transition is invalid\n *\n * @example\n * ```typescript\n * import { updateReservation } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const reservation = await updateReservation(client, {\n * id: 'reservation-123',\n * status: 'checked_in',\n * room: '201'\n * });\n * ```\n */\nexport async function updateReservation<TClient = any>(\n\tclient: TClient,\n\tinput: UpdateReservationInput,\n): Promise<any | null> {\n\ttry {\n\t\t// If both dates are being updated, validate them\n\t\tif (input.checkIn && input.checkOut) {\n\t\t\tvalidateDates(input.checkIn, input.checkOut);\n\n\t\t\t// Recalculate nights if dates changed\n\t\t\tconst checkInDate = new Date(input.checkIn);\n\t\t\tconst checkOutDate = new Date(input.checkOut);\n\t\t\tconst diffTime = checkOutDate.getTime() - checkInDate.getTime();\n\t\t\tconst diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));\n\t\t\tinput.nights = diffDays;\n\t\t}\n\n\t\t// If status is being updated, validate the transition\n\t\tif (input.status) {\n\t\t\t// Get current reservation to check current status\n\t\t\tconst { data: currentReservation, errors: getErrors } = await (\n\t\t\t\tclient as any\n\t\t\t).models.Reservation.get({ id: input.id });\n\n\t\t\tif (getErrors || !currentReservation) {\n\t\t\t\tconsole.error(\"[updateReservation] Error fetching current reservation:\", getErrors);\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst currentStatus = currentReservation.status as ReservationStatus;\n\t\t\tvalidateStatusTransition(currentStatus, input.status as ReservationStatus);\n\t\t}\n\n\t\tconst { data, errors } = await (client as any).models.Reservation.update(input);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[updateReservation] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data;\n\t} catch (error) {\n\t\tif (error instanceof ReservationValidationError) {\n\t\t\tconsole.error(\"[updateReservation] Validation error:\", error.message);\n\t\t\tthrow error;\n\t\t}\n\t\tconsole.error(\"[updateReservation] Error updating reservation:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Soft delete a reservation (sets deletedAt/deletedBy instead of removing)\n *\n * @example\n * ```typescript\n * import { softDeleteReservation } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * await softDeleteReservation(client, 'reservation-123', 'admin@example.com');\n * ```\n */\nexport async function softDeleteReservation<TClient = any>(\n\tclient: TClient,\n\tid: string,\n\tdeletedBy: string,\n): Promise<boolean> {\n\ttry {\n\t\tconst { errors } = await (client as any).models.Reservation.update({\n\t\t\tid,\n\t\t\tdeletedAt: new Date().toISOString(),\n\t\t\tdeletedBy,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[softDeleteReservation] GraphQL errors:\", errors);\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (error) {\n\t\tconsole.error(\"[softDeleteReservation] Error soft-deleting reservation:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Restore a soft-deleted reservation\n * Checks retention period before allowing restoration\n *\n * @example\n * ```typescript\n * import { restoreReservation } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * await restoreReservation(client, 'reservation-123');\n * // Or with custom retention days:\n * await restoreReservation(client, 'reservation-123', 60);\n * ```\n */\nexport async function restoreReservation<TClient = any>(\n\tclient: TClient,\n\tid: string,\n\tretentionDays: number = DEFAULT_SOFT_DELETE_RETENTION_DAYS,\n): Promise<{ success: boolean; error?: string }> {\n\ttry {\n\t\t// First, get the reservation to check its deletedAt timestamp\n\t\tconst { data: reservation, errors: getErrors } = await (\n\t\t\tclient as any\n\t\t).models.Reservation.get({ id });\n\n\t\tif (getErrors || !reservation) {\n\t\t\tconsole.error(\"[restoreReservation] Error fetching reservation:\", getErrors);\n\t\t\treturn { success: false, error: \"Reservation not found\" };\n\t\t}\n\n\t\t// Check if restoration is allowed based on retention period\n\t\tconst eligibility = checkRestoreEligibility(reservation.deletedAt, retentionDays);\n\n\t\tif (!eligibility.canRestore) {\n\t\t\tconst errorMsg = `Cannot restore reservation. Retention period of ${retentionDays} days has expired. Item was deleted ${eligibility.daysExpired} days ago.`;\n\t\t\tconsole.error(\"[restoreReservation]\", errorMsg);\n\t\t\treturn { success: false, error: errorMsg };\n\t\t}\n\n\t\tconst { errors } = await (client as any).models.Reservation.update({\n\t\t\tid,\n\t\t\tdeletedAt: null,\n\t\t\tdeletedBy: null,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[restoreReservation] GraphQL errors:\", errors);\n\t\t\treturn { success: false, error: \"Failed to restore reservation\" };\n\t\t}\n\n\t\treturn { success: true };\n\t} catch (error) {\n\t\tconsole.error(\"[restoreReservation] Error restoring reservation:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Hard delete a reservation (permanently removes from database)\n * Use with caution - prefer softDeleteReservation for recoverable deletion\n *\n * @example\n * ```typescript\n * import { deleteReservation } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * await deleteReservation(client, 'reservation-123');\n * ```\n */\nexport async function deleteReservation<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<boolean> {\n\ttry {\n\t\tconst { errors } = await (client as any).models.Reservation.delete({ id });\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[deleteReservation] GraphQL errors:\", errors);\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (error) {\n\t\tconsole.error(\"[deleteReservation] Error deleting reservation:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Update reservation status with validation\n *\n * Validates that the status transition is allowed based on current status.\n * Status transition rules:\n * - confirmed → checked_in, cancelled, no_show\n * - checked_in → checked_out, cancelled\n * - checked_out → (terminal state, no transitions)\n * - cancelled → (terminal state, no transitions)\n * - no_show → (terminal state, no transitions)\n *\n * @throws {ReservationValidationError} if status transition is invalid\n *\n * @example\n * ```typescript\n * import { updateReservationStatus } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const reservation = await updateReservationStatus(\n * client,\n * 'reservation-123',\n * 'checked_in'\n * );\n * ```\n */\nexport async function updateReservationStatus<TClient = any>(\n\tclient: TClient,\n\tid: string,\n\tnewStatus: ReservationStatus,\n): Promise<any | null> {\n\ttry {\n\t\t// Get current reservation to check current status\n\t\tconst { data: currentReservation, errors: getErrors } = await (\n\t\t\tclient as any\n\t\t).models.Reservation.get({ id });\n\n\t\tif (getErrors || !currentReservation) {\n\t\t\tconsole.error(\"[updateReservationStatus] Error fetching reservation:\", getErrors);\n\t\t\treturn null;\n\t\t}\n\n\t\tconst currentStatus = currentReservation.status as ReservationStatus;\n\n\t\t// Validate status transition\n\t\tvalidateStatusTransition(currentStatus, newStatus);\n\n\t\t// Perform the update\n\t\tconst { data, errors } = await (client as any).models.Reservation.update({\n\t\t\tid,\n\t\t\tstatus: newStatus,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[updateReservationStatus] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data;\n\t} catch (error) {\n\t\tif (error instanceof ReservationValidationError) {\n\t\t\tconsole.error(\"[updateReservationStatus] Validation error:\", error.message);\n\t\t\tthrow error;\n\t\t}\n\t\tconsole.error(\"[updateReservationStatus] Error updating status:\", error);\n\t\tthrow error;\n\t}\n}\n","/**\n * Contact Mutation Functions\n *\n * Provides type-safe mutation functions for creating, updating, and deleting contacts.\n * Includes Zod validation for input data before mutations.\n */\n\nimport { z } from \"zod\";\nimport type { Contact } from \"@htlkg/core/types\";\nimport {\n\tcheckRestoreEligibility,\n\tDEFAULT_SOFT_DELETE_RETENTION_DAYS,\n} from \"../queries/systemSettings\";\nimport { getContact } from \"../queries/contacts\";\nimport type { CreateAuditFields, UpdateWithSoftDeleteFields } from \"./common\";\n\n// ============================================\n// Added Zod Validation Schemas\n// ============================================\n\n/**\n * Zod schema for creating a contact \n */\nexport const createContactSchema = z.object({\n\tbrandId: z.string().min(1, \"Brand ID is required\"),\n\temail: z.string().email(\"Invalid email address\"),\n\tphone: z.string().optional(),\n\tfirstName: z.string().min(1, \"First name is required\"),\n\tlastName: z.string().min(1, \"Last name is required\"),\n\tlocale: z.string().optional(),\n\tgdprConsent: z.boolean(),\n\tgdprConsentDate: z.string().optional(),\n\tmarketingOptIn: z.boolean().optional(),\n\tpreferences: z.record(z.any()).optional(),\n\ttags: z.array(z.string()).optional(),\n\ttotalVisits: z.number().int().min(0).optional(),\n\tlastVisitDate: z.string().optional(),\n\tfirstVisitDate: z.string().optional(),\n\tlegacyId: z.string().optional(),\n\t// Audit fields\n\tcreatedAt: z.string().optional(),\n\tcreatedBy: z.string().optional(),\n\tupdatedAt: z.string().optional(),\n\tupdatedBy: z.string().optional(),\n});\n\n/**\n * Zod schema for updating a contact\n */\nexport const updateContactSchema = z.object({\n\tid: z.string().min(1, \"Contact ID is required\"),\n\tbrandId: z.string().min(1).optional(),\n\temail: z.string().email(\"Invalid email address\").optional(),\n\tphone: z.string().optional(),\n\tfirstName: z.string().min(1).optional(),\n\tlastName: z.string().min(1).optional(),\n\tlocale: z.string().optional(),\n\tgdprConsent: z.boolean().optional(),\n\tgdprConsentDate: z.string().optional(),\n\tmarketingOptIn: z.boolean().optional(),\n\tpreferences: z.record(z.any()).optional(),\n\ttags: z.array(z.string()).optional(),\n\ttotalVisits: z.number().int().min(0).optional(),\n\tlastVisitDate: z.string().optional(),\n\tfirstVisitDate: z.string().optional(),\n\tlegacyId: z.string().optional(),\n\t// Audit fields\n\tupdatedAt: z.string().optional(),\n\tupdatedBy: z.string().optional(),\n\tdeletedAt: z.string().nullable().optional(),\n\tdeletedBy: z.string().nullable().optional(),\n});\n\n/**\n * Zod schema for merging contacts\n */\nexport const mergeContactsSchema = z.object({\n\tprimaryId: z.string().min(1, \"Primary contact ID is required\"),\n\tduplicateIds: z.array(z.string().min(1)).min(1, \"At least one duplicate ID is required\"),\n});\n\n// ============================================\n// Validation Error Class\n// ============================================\n\n/**\n * Validation error class for contact operations\n */\nexport class ContactValidationError extends Error {\n\tpublic readonly issues: z.ZodIssue[];\n\n\tconstructor(message: string, issues: z.ZodIssue[] = []) {\n\t\tsuper(message);\n\t\tthis.name = \"ContactValidationError\";\n\t\tthis.issues = issues;\n\t}\n}\n\n// ============================================\n// Input Types\n// ============================================\n\n/**\n * Input type for creating a contact\n */\nexport interface CreateContactInput extends CreateAuditFields {\n\tbrandId: string;\n\temail: string;\n\tphone?: string;\n\tfirstName: string;\n\tlastName: string;\n\tlocale?: string;\n\tgdprConsent: boolean;\n\tgdprConsentDate?: string;\n\tmarketingOptIn?: boolean;\n\tpreferences?: Record<string, any>;\n\ttags?: string[];\n\ttotalVisits?: number;\n\tlastVisitDate?: string;\n\tfirstVisitDate?: string;\n\tlegacyId?: string;\n}\n\n/**\n * Input type for updating a contact\n */\nexport interface UpdateContactInput extends UpdateWithSoftDeleteFields {\n\tid: string;\n\tbrandId?: string;\n\temail?: string;\n\tphone?: string;\n\tfirstName?: string;\n\tlastName?: string;\n\tlocale?: string;\n\tgdprConsent?: boolean;\n\tgdprConsentDate?: string;\n\tmarketingOptIn?: boolean;\n\tpreferences?: Record<string, any>;\n\ttags?: string[];\n\ttotalVisits?: number;\n\tlastVisitDate?: string;\n\tfirstVisitDate?: string;\n\tlegacyId?: string;\n}\n\n/**\n * Input type for merging contacts\n */\nexport interface MergeContactsInput {\n\tprimaryId: string;\n\tduplicateIds: string[];\n}\n\n/**\n * Result type for merge operation\n */\nexport interface MergeContactsResult {\n\tsuccess: boolean;\n\tmergedContact?: Contact;\n\tdeletedIds?: string[];\n\terror?: string;\n}\n\n// ============================================\n// Mutation Functions\n// ============================================\n\n/**\n * Create a new contact with Zod validation\n *\n * @throws {ContactValidationError} if input validation fails\n *\n * @example\n * ```typescript\n * import { createContact } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const contact = await createContact(client, {\n * brandId: 'brand-123',\n * email: 'guest@example.com',\n * firstName: 'John',\n * lastName: 'Doe',\n * gdprConsent: true,\n * gdprConsentDate: new Date().toISOString()\n * });\n * ```\n */\nexport async function createContact<TClient = any>(\n\tclient: TClient,\n\tinput: CreateContactInput,\n): Promise<Contact | null> {\n\ttry {\n\t\t// Validate input with Zod\n\t\tconst validationResult = createContactSchema.safeParse(input);\n\n\t\tif (!validationResult.success) {\n\t\t\tconst errorMessage = validationResult.error.issues\n\t\t\t\t.map((issue) => `${issue.path.join(\".\")}: ${issue.message}`)\n\t\t\t\t.join(\", \");\n\t\t\tthrow new ContactValidationError(\n\t\t\t\t`Validation failed: ${errorMessage}`,\n\t\t\t\tvalidationResult.error.issues\n\t\t\t);\n\t\t}\n\n\t\tconst { data, errors } = await (client as any).models.Contact.create(input);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[createContact] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as Contact;\n\t} catch (error) {\n\t\tif (error instanceof ContactValidationError) {\n\t\t\tconsole.error(\"[createContact] Validation error:\", error.message);\n\t\t\tthrow error;\n\t\t}\n\t\tconsole.error(\"[createContact] Error creating contact:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Update an existing contact with Zod validation\n *\n * @throws {ContactValidationError} if input validation fails\n *\n * @example\n * ```typescript\n * import { updateContact } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const contact = await updateContact(client, {\n * id: 'contact-123',\n * firstName: 'Jane',\n * marketingOptIn: true\n * });\n * ```\n */\nexport async function updateContact<TClient = any>(\n\tclient: TClient,\n\tinput: UpdateContactInput,\n): Promise<Contact | null> {\n\ttry {\n\t\t// Validate input with Zod\n\t\tconst validationResult = updateContactSchema.safeParse(input);\n\n\t\tif (!validationResult.success) {\n\t\t\tconst errorMessage = validationResult.error.issues\n\t\t\t\t.map((issue) => `${issue.path.join(\".\")}: ${issue.message}`)\n\t\t\t\t.join(\", \");\n\t\t\tthrow new ContactValidationError(\n\t\t\t\t`Validation failed: ${errorMessage}`,\n\t\t\t\tvalidationResult.error.issues\n\t\t\t);\n\t\t}\n\n\t\tconst { data, errors } = await (client as any).models.Contact.update(input);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[updateContact] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as Contact;\n\t} catch (error) {\n\t\tif (error instanceof ContactValidationError) {\n\t\t\tconsole.error(\"[updateContact] Validation error:\", error.message);\n\t\t\tthrow error;\n\t\t}\n\t\tconsole.error(\"[updateContact] Error updating contact:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Soft delete a contact (sets deletedAt/deletedBy instead of removing)\n *\n * @example\n * ```typescript\n * import { softDeleteContact } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * await softDeleteContact(client, 'contact-123', 'admin@example.com');\n * ```\n */\nexport async function softDeleteContact<TClient = any>(\n\tclient: TClient,\n\tid: string,\n\tdeletedBy: string,\n): Promise<boolean> {\n\ttry {\n\t\tconst { errors } = await (client as any).models.Contact.update({\n\t\t\tid,\n\t\t\tdeletedAt: new Date().toISOString(),\n\t\t\tdeletedBy,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[softDeleteContact] GraphQL errors:\", errors);\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (error) {\n\t\tconsole.error(\"[softDeleteContact] Error soft-deleting contact:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Restore a soft-deleted contact\n * Checks retention period before allowing restoration\n *\n * @example\n * ```typescript\n * import { restoreContact } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * await restoreContact(client, 'contact-123');\n * // Or with custom retention days:\n * await restoreContact(client, 'contact-123', 60);\n * ```\n */\nexport async function restoreContact<TClient = any>(\n\tclient: TClient,\n\tid: string,\n\tretentionDays: number = DEFAULT_SOFT_DELETE_RETENTION_DAYS,\n): Promise<{ success: boolean; error?: string }> {\n\ttry {\n\t\t// First, get the contact to check its deletedAt timestamp\n\t\tconst contact = await getContact(client, id);\n\n\t\tif (!contact) {\n\t\t\tconsole.error(\"[restoreContact] Contact not found\");\n\t\t\treturn { success: false, error: \"Contact not found\" };\n\t\t}\n\n\t\t// Check if restoration is allowed based on retention period\n\t\tconst eligibility = checkRestoreEligibility(\n\t\t\t(contact as any).deletedAt,\n\t\t\tretentionDays\n\t\t);\n\n\t\tif (!eligibility.canRestore) {\n\t\t\tconst errorMsg = `Cannot restore contact. Retention period of ${retentionDays} days has expired. Item was deleted ${eligibility.daysExpired} days ago.`;\n\t\t\tconsole.error(\"[restoreContact]\", errorMsg);\n\t\t\treturn { success: false, error: errorMsg };\n\t\t}\n\n\t\tconst { errors } = await (client as any).models.Contact.update({\n\t\t\tid,\n\t\t\tdeletedAt: null,\n\t\t\tdeletedBy: null,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[restoreContact] GraphQL errors:\", errors);\n\t\t\treturn { success: false, error: \"Failed to restore contact\" };\n\t\t}\n\n\t\treturn { success: true };\n\t} catch (error) {\n\t\tconsole.error(\"[restoreContact] Error restoring contact:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Hard delete a contact (permanently removes from database)\n * Use with caution - prefer softDeleteContact for recoverable deletion\n *\n * @example\n * ```typescript\n * import { deleteContact } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * await deleteContact(client, 'contact-123');\n * ```\n */\nexport async function deleteContact<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<boolean> {\n\ttry {\n\t\tconst { errors } = await (client as any).models.Contact.delete({ id });\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[deleteContact] GraphQL errors:\", errors);\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (error) {\n\t\tconsole.error(\"[deleteContact] Error deleting contact:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Merge duplicate contacts into a primary contact\n *\n * This function:\n * 1. Validates all contact IDs exist\n * 2. Aggregates data from duplicates into the primary contact\n * 3. Soft deletes the duplicate contacts\n * 4. Returns the updated primary contact\n *\n * Merge strategy:\n * - totalVisits: Sum of all contacts\n * - firstVisitDate: Earliest date across all contacts\n * - lastVisitDate: Latest date across all contacts\n * - tags: Merged unique tags from all contacts\n * - preferences: Primary contact preferences take precedence\n * - Other fields: Primary contact values are preserved\n *\n * @throws {ContactValidationError} if input validation fails\n *\n * @example\n * ```typescript\n * import { mergeContacts } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const result = await mergeContacts(client, {\n * primaryId: 'contact-primary',\n * duplicateIds: ['contact-dup-1', 'contact-dup-2']\n * }, 'admin@example.com');\n * ```\n */\nexport async function mergeContacts<TClient = any>(\n\tclient: TClient,\n\tinput: MergeContactsInput,\n\tmergedBy: string,\n): Promise<MergeContactsResult> {\n\ttry {\n\t\t// Validate input with Zod\n\t\tconst validationResult = mergeContactsSchema.safeParse(input);\n\n\t\tif (!validationResult.success) {\n\t\t\tconst errorMessage = validationResult.error.issues\n\t\t\t\t.map((issue) => `${issue.path.join(\".\")}: ${issue.message}`)\n\t\t\t\t.join(\", \");\n\t\t\tthrow new ContactValidationError(\n\t\t\t\t`Validation failed: ${errorMessage}`,\n\t\t\t\tvalidationResult.error.issues\n\t\t\t);\n\t\t}\n\n\t\tconst { primaryId, duplicateIds } = input;\n\n\t\t// Fetch primary contact\n\t\tconst primaryContact = await getContact(client, primaryId);\n\t\tif (!primaryContact) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: `Primary contact not found: ${primaryId}`,\n\t\t\t};\n\t\t}\n\n\t\t// Fetch all duplicate contacts\n\t\tconst duplicateContacts: Contact[] = [];\n\t\tfor (const duplicateId of duplicateIds) {\n\t\t\tconst duplicate = await getContact(client, duplicateId);\n\t\t\tif (!duplicate) {\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: `Duplicate contact not found: ${duplicateId}`,\n\t\t\t\t};\n\t\t\t}\n\t\t\tduplicateContacts.push(duplicate);\n\t\t}\n\n\t\t// Aggregate data from duplicates\n\t\tlet totalVisits = primaryContact.totalVisits || 0;\n\t\tlet firstVisitDate = primaryContact.firstVisitDate;\n\t\tlet lastVisitDate = primaryContact.lastVisitDate;\n\t\tconst allTags = new Set<string>(primaryContact.tags || []);\n\n\t\tfor (const duplicate of duplicateContacts) {\n\t\t\t// Sum total visits\n\t\t\ttotalVisits += duplicate.totalVisits || 0;\n\n\t\t\t// Find earliest first visit date\n\t\t\tif (duplicate.firstVisitDate) {\n\t\t\t\tif (!firstVisitDate || duplicate.firstVisitDate < firstVisitDate) {\n\t\t\t\t\tfirstVisitDate = duplicate.firstVisitDate;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Find latest last visit date\n\t\t\tif (duplicate.lastVisitDate) {\n\t\t\t\tif (!lastVisitDate || duplicate.lastVisitDate > lastVisitDate) {\n\t\t\t\t\tlastVisitDate = duplicate.lastVisitDate;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Merge tags\n\t\t\tif (duplicate.tags) {\n\t\t\t\tduplicate.tags.forEach((tag) => allTags.add(tag));\n\t\t\t}\n\t\t}\n\n\t\t// Update primary contact with aggregated data\n\t\tconst updateInput: UpdateContactInput = {\n\t\t\tid: primaryId,\n\t\t\ttotalVisits,\n\t\t\tfirstVisitDate,\n\t\t\tlastVisitDate,\n\t\t\ttags: Array.from(allTags),\n\t\t\tupdatedAt: new Date().toISOString(),\n\t\t\tupdatedBy: mergedBy,\n\t\t};\n\n\t\tconst updatedPrimary = await updateContact(client, updateInput);\n\n\t\tif (!updatedPrimary) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: \"Failed to update primary contact with merged data\",\n\t\t\t};\n\t\t}\n\n\t\t// Soft delete all duplicate contacts\n\t\tconst deletedIds: string[] = [];\n\t\tfor (const duplicateId of duplicateIds) {\n\t\t\tconst deleted = await softDeleteContact(client, duplicateId, mergedBy);\n\t\t\tif (deleted) {\n\t\t\t\tdeletedIds.push(duplicateId);\n\t\t\t} else {\n\t\t\t\tconsole.error(`[mergeContacts] Failed to soft-delete duplicate: ${duplicateId}`);\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tmergedContact: updatedPrimary,\n\t\t\tdeletedIds,\n\t\t};\n\t} catch (error) {\n\t\tif (error instanceof ContactValidationError) {\n\t\t\tconsole.error(\"[mergeContacts] Validation error:\", error.message);\n\t\t\tthrow error;\n\t\t}\n\t\tconsole.error(\"[mergeContacts] Error merging contacts:\", error);\n\t\tthrow error;\n\t}\n}\n","/**\n * Contact Query Functions\n *\n * Provides query functions for fetching contact data from the GraphQL API.\n */\n\nimport type { Contact } from \"@htlkg/core/types\";\n\n/**\n * Get a single contact by ID\n *\n * @example\n * ```typescript\n * import { getContact } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const contact = await getContact(client, 'contact-123');\n * ```\n */\nexport async function getContact<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<Contact | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.Contact.get({ id });\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getContact] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as Contact;\n\t} catch (error) {\n\t\tconsole.error(\"[getContact] Error fetching contact:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List all contacts with optional filtering\n *\n * @example\n * ```typescript\n * import { listContacts } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const contacts = await listContacts(client, {\n * filter: { gdprConsent: { eq: true } },\n * limit: 50\n * });\n * ```\n */\nexport async function listContacts<TClient = any>(\n\tclient: TClient,\n\toptions?: {\n\t\tfilter?: any;\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: Contact[]; nextToken?: string }> {\n\ttry {\n\t\tconst { data, errors, nextToken } = await (\n\t\t\tclient as any\n\t\t).models.Contact.list(options);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[listContacts] GraphQL errors:\", errors);\n\t\t\treturn { items: [], nextToken: undefined };\n\t\t}\n\n\t\treturn {\n\t\t\titems: (data || []) as Contact[],\n\t\t\tnextToken,\n\t\t};\n\t} catch (error) {\n\t\tconsole.error(\"[listContacts] Error fetching contacts:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List contacts by brand ID\n *\n * @example\n * ```typescript\n * import { listContactsByBrand } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const contacts = await listContactsByBrand(client, 'brand-123');\n * ```\n */\nexport async function listContactsByBrand<TClient = any>(\n\tclient: TClient,\n\tbrandId: string,\n\toptions?: {\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: Contact[]; nextToken?: string }> {\n\treturn listContacts(client, {\n\t\tfilter: { brandId: { eq: brandId } },\n\t\t...options,\n\t});\n}\n\n/**\n * Get a contact by email within a brand\n *\n * @example\n * ```typescript\n * import { getContactByEmail } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const contact = await getContactByEmail(client, 'guest@example.com', 'brand-123');\n * ```\n */\nexport async function getContactByEmail<TClient = any>(\n\tclient: TClient,\n\temail: string,\n\tbrandId: string,\n): Promise<Contact | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.Contact.list({\n\t\t\tfilter: {\n\t\t\t\tand: [{ email: { eq: email } }, { brandId: { eq: brandId } }],\n\t\t\t},\n\t\t\tlimit: 1,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getContactByEmail] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data?.[0] as Contact | null;\n\t} catch (error) {\n\t\tconsole.error(\"[getContactByEmail] Error fetching contact:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Get a contact by phone within a brand\n *\n * @example\n * ```typescript\n * import { getContactByPhone } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const contact = await getContactByPhone(client, '+1234567890', 'brand-123');\n * ```\n */\nexport async function getContactByPhone<TClient = any>(\n\tclient: TClient,\n\tphone: string,\n\tbrandId: string,\n): Promise<Contact | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.Contact.list({\n\t\t\tfilter: {\n\t\t\t\tand: [{ phone: { eq: phone } }, { brandId: { eq: brandId } }],\n\t\t\t},\n\t\t\tlimit: 1,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getContactByPhone] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data?.[0] as Contact | null;\n\t} catch (error) {\n\t\tconsole.error(\"[getContactByPhone] Error fetching contact:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Search contacts by query string within a brand\n * Searches across email, firstName, and lastName fields\n *\n * @example\n * ```typescript\n * import { searchContacts } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const contacts = await searchContacts(client, 'john', 'brand-123');\n * ```\n */\nexport async function searchContacts<TClient = any>(\n\tclient: TClient,\n\tquery: string,\n\tbrandId: string,\n\toptions?: {\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: Contact[]; nextToken?: string }> {\n\ttry {\n\t\tconst { data, errors, nextToken } = await (\n\t\t\tclient as any\n\t\t).models.Contact.list({\n\t\t\tfilter: {\n\t\t\t\tand: [\n\t\t\t\t\t{ brandId: { eq: brandId } },\n\t\t\t\t\t{\n\t\t\t\t\t\tor: [\n\t\t\t\t\t\t\t{ email: { contains: query } },\n\t\t\t\t\t\t\t{ firstName: { contains: query } },\n\t\t\t\t\t\t\t{ lastName: { contains: query } },\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t\t...options,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[searchContacts] GraphQL errors:\", errors);\n\t\t\treturn { items: [], nextToken: undefined };\n\t\t}\n\n\t\treturn {\n\t\t\titems: (data || []) as Contact[],\n\t\t\tnextToken,\n\t\t};\n\t} catch (error) {\n\t\tconsole.error(\"[searchContacts] Error searching contacts:\", error);\n\t\tthrow error;\n\t}\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/queries/systemSettings.ts","../../src/mutations/brands/brands.ts","../../src/mutations/accounts/accounts.ts","../../src/mutations/users/users.ts","../../src/mutations/productInstances/productInstances.ts","../../src/mutations/systemSettings.ts","../../src/mutations/reservations/reservations.ts","../../src/mutations/contacts.ts","../../src/queries/contacts.ts"],"sourcesContent":["/**\n * SystemSettings Query Functions\n *\n * Provides query functions for fetching system settings from the GraphQL API.\n */\n\nimport type { SystemSettings } from \"@htlkg/core/types\";\n\n/** Default retention days if no settings exist */\nexport const DEFAULT_SOFT_DELETE_RETENTION_DAYS = 30;\n\n/** The key used for global system settings */\nexport const SYSTEM_SETTINGS_KEY = \"GLOBAL\";\n\n/**\n * Get system settings\n *\n * @example\n * ```typescript\n * import { getSystemSettings } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const settings = await getSystemSettings(client);\n * ```\n */\nexport async function getSystemSettings<TClient = any>(\n\tclient: TClient,\n): Promise<SystemSettings | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.SystemSettings.get({\n\t\t\tkey: SYSTEM_SETTINGS_KEY,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getSystemSettings] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as SystemSettings;\n\t} catch (error) {\n\t\tconsole.error(\"[getSystemSettings] Error fetching system settings:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Get the soft delete retention days from system settings\n * Returns the default (30 days) if settings don't exist\n *\n * @example\n * ```typescript\n * import { getSoftDeleteRetentionDays } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const days = await getSoftDeleteRetentionDays(client);\n * ```\n */\nexport async function getSoftDeleteRetentionDays<TClient = any>(\n\tclient: TClient,\n): Promise<number> {\n\tconst settings = await getSystemSettings(client);\n\treturn settings?.softDeleteRetentionDays ?? DEFAULT_SOFT_DELETE_RETENTION_DAYS;\n}\n\n/**\n * Check if a soft-deleted item can still be restored based on retention period\n *\n * @param deletedAt - The ISO date string when the item was deleted\n * @param retentionDays - Number of days items can be restored\n * @returns Object with canRestore flag and daysRemaining/daysExpired\n */\nexport function checkRestoreEligibility(\n\tdeletedAt: string | undefined | null,\n\tretentionDays: number,\n): {\n\tcanRestore: boolean;\n\tdaysRemaining: number;\n\tdaysExpired: number;\n\texpiresAt: Date | null;\n} {\n\tif (!deletedAt) {\n\t\treturn {\n\t\t\tcanRestore: false,\n\t\t\tdaysRemaining: 0,\n\t\t\tdaysExpired: 0,\n\t\t\texpiresAt: null,\n\t\t};\n\t}\n\n\tconst deletedDate = new Date(deletedAt);\n\tconst expiresAt = new Date(deletedDate);\n\texpiresAt.setDate(expiresAt.getDate() + retentionDays);\n\n\tconst now = new Date();\n\tconst msRemaining = expiresAt.getTime() - now.getTime();\n\tconst daysRemaining = Math.ceil(msRemaining / (1000 * 60 * 60 * 24));\n\n\tif (daysRemaining <= 0) {\n\t\treturn {\n\t\t\tcanRestore: false,\n\t\t\tdaysRemaining: 0,\n\t\t\tdaysExpired: Math.abs(daysRemaining),\n\t\t\texpiresAt,\n\t\t};\n\t}\n\n\treturn {\n\t\tcanRestore: true,\n\t\tdaysRemaining,\n\t\tdaysExpired: 0,\n\t\texpiresAt,\n\t};\n}\n","/**\n * Brand Mutation Functions\n *\n * Provides mutation functions for creating, updating, and deleting brands.\n */\n\nimport type { Brand } from \"@htlkg/core/types\";\nimport {\n\tcheckRestoreEligibility,\n\tDEFAULT_SOFT_DELETE_RETENTION_DAYS,\n} from \"../../queries/systemSettings\";\nimport type { CreateAuditFields, UpdateWithSoftDeleteFields } from \"../common\";\n\n/**\n * Input type for creating a brand\n */\nexport interface CreateBrandInput extends CreateAuditFields {\n\taccountId: string;\n\tname: string;\n\tlogo?: string;\n\ttimezone?: string;\n\tstatus?: \"active\" | \"inactive\" | \"maintenance\" | \"suspended\" | \"deleted\";\n\tsettings?: Record<string, any>;\n}\n\n/**\n * Input type for updating a brand\n */\nexport interface UpdateBrandInput extends UpdateWithSoftDeleteFields {\n\tid: string;\n\tname?: string;\n\tlogo?: string;\n\ttimezone?: string;\n\tstatus?: \"active\" | \"inactive\" | \"maintenance\" | \"suspended\" | \"deleted\";\n\tsettings?: Record<string, any>;\n}\n\n/**\n * Create a new brand\n *\n * @example\n * ```typescript\n * import { createBrand } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const brand = await createBrand(client, {\n * accountId: 'account-123',\n * name: 'My Brand',\n * timezone: 'America/New_York',\n * status: 'active'\n * });\n * ```\n */\nexport async function createBrand<TClient = any>(\n\tclient: TClient,\n\tinput: CreateBrandInput,\n): Promise<Brand | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.Brand.create(input);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[createBrand] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as Brand;\n\t} catch (error) {\n\t\tconsole.error(\"[createBrand] Error creating brand:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Update an existing brand\n *\n * @example\n * ```typescript\n * import { updateBrand } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const brand = await updateBrand(client, {\n * id: 'brand-123',\n * name: 'Updated Brand Name',\n * status: 'maintenance'\n * });\n * ```\n */\nexport async function updateBrand<TClient = any>(\n\tclient: TClient,\n\tinput: UpdateBrandInput,\n): Promise<Brand | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.Brand.update(input);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[updateBrand] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as Brand;\n\t} catch (error) {\n\t\tconsole.error(\"[updateBrand] Error updating brand:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Soft delete a brand (sets status to \"deleted\" instead of removing)\n *\n * @example\n * ```typescript\n * import { softDeleteBrand } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * await softDeleteBrand(client, 'brand-123', 'admin@example.com');\n * ```\n */\nexport async function softDeleteBrand<TClient = any>(\n\tclient: TClient,\n\tid: string,\n\tdeletedBy: string,\n): Promise<boolean> {\n\ttry {\n\t\tconst { errors } = await (client as any).models.Brand.update({\n\t\t\tid,\n\t\t\tstatus: \"deleted\",\n\t\t\tdeletedAt: new Date().toISOString(),\n\t\t\tdeletedBy,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[softDeleteBrand] GraphQL errors:\", errors);\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (error) {\n\t\tconsole.error(\"[softDeleteBrand] Error soft-deleting brand:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Restore a soft-deleted brand (sets status back to \"active\")\n * Checks retention period before allowing restoration\n *\n * @example\n * ```typescript\n * import { restoreBrand } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * await restoreBrand(client, 'brand-123');\n * // Or with custom retention days:\n * await restoreBrand(client, 'brand-123', 60);\n * ```\n */\nexport async function restoreBrand<TClient = any>(\n\tclient: TClient,\n\tid: string,\n\tretentionDays: number = DEFAULT_SOFT_DELETE_RETENTION_DAYS,\n): Promise<{ success: boolean; error?: string }> {\n\ttry {\n\t\t// First, get the brand to check its deletedAt timestamp\n\t\tconst { data: brand, errors: getErrors } = await (\n\t\t\tclient as any\n\t\t).models.Brand.get({ id });\n\n\t\tif (getErrors || !brand) {\n\t\t\tconsole.error(\"[restoreBrand] Error fetching brand:\", getErrors);\n\t\t\treturn { success: false, error: \"Brand not found\" };\n\t\t}\n\n\t\t// Check if restoration is allowed based on retention period\n\t\tconst eligibility = checkRestoreEligibility(brand.deletedAt, retentionDays);\n\n\t\tif (!eligibility.canRestore) {\n\t\t\tconst errorMsg = `Cannot restore brand. Retention period of ${retentionDays} days has expired. Item was deleted ${eligibility.daysExpired} days ago.`;\n\t\t\tconsole.error(\"[restoreBrand]\", errorMsg);\n\t\t\treturn { success: false, error: errorMsg };\n\t\t}\n\n\t\tconst { errors } = await (client as any).models.Brand.update({\n\t\t\tid,\n\t\t\tstatus: \"active\",\n\t\t\tdeletedAt: null,\n\t\t\tdeletedBy: null,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[restoreBrand] GraphQL errors:\", errors);\n\t\t\treturn { success: false, error: \"Failed to restore brand\" };\n\t\t}\n\n\t\treturn { success: true };\n\t} catch (error) {\n\t\tconsole.error(\"[restoreBrand] Error restoring brand:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Hard delete a brand (permanently removes from database)\n * Use with caution - prefer softDeleteBrand for recoverable deletion\n *\n * @example\n * ```typescript\n * import { deleteBrand } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * await deleteBrand(client, 'brand-123');\n * ```\n */\nexport async function deleteBrand<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<boolean> {\n\ttry {\n\t\tconst { errors } = await (client as any).models.Brand.delete({ id });\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[deleteBrand] GraphQL errors:\", errors);\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (error) {\n\t\tconsole.error(\"[deleteBrand] Error deleting brand:\", error);\n\t\tthrow error;\n\t}\n}\n","/**\n * Account Mutation Functions\n *\n * Provides mutation functions for creating, updating, and deleting accounts.\n */\n\nimport type { Account } from \"@htlkg/core/types\";\nimport {\n\tcheckRestoreEligibility,\n\tDEFAULT_SOFT_DELETE_RETENTION_DAYS,\n} from \"../../queries/systemSettings\";\nimport type { CreateAuditFields, UpdateWithSoftDeleteFields } from \"../common\";\n\n/**\n * Input type for creating an account\n */\nexport interface CreateAccountInput extends CreateAuditFields {\n\tname: string;\n\tlogo?: string;\n\tsubscription?: Record<string, any>;\n\tsettings?: Record<string, any>;\n\tstatus?: \"active\" | \"inactive\" | \"deleted\";\n}\n\n/**\n * Input type for updating an account\n */\nexport interface UpdateAccountInput extends UpdateWithSoftDeleteFields {\n\tid: string;\n\tname?: string;\n\tlogo?: string;\n\tsubscription?: Record<string, any>;\n\tsettings?: Record<string, any>;\n\tstatus?: \"active\" | \"inactive\" | \"deleted\";\n}\n\n/**\n * Create a new account\n *\n * @example\n * ```typescript\n * import { createAccount } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const account = await createAccount(client, {\n * name: 'My Account',\n * subscription: { plan: 'premium' }\n * });\n * ```\n */\nexport async function createAccount<TClient = any>(\n\tclient: TClient,\n\tinput: CreateAccountInput,\n): Promise<Account | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.Account.create(input);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[createAccount] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as Account;\n\t} catch (error) {\n\t\tconsole.error(\"[createAccount] Error creating account:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Update an existing account\n *\n * @example\n * ```typescript\n * import { updateAccount } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const account = await updateAccount(client, {\n * id: 'account-123',\n * name: 'Updated Account Name'\n * });\n * ```\n */\nexport async function updateAccount<TClient = any>(\n\tclient: TClient,\n\tinput: UpdateAccountInput,\n): Promise<Account | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.Account.update(input);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[updateAccount] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as Account;\n\t} catch (error) {\n\t\tconsole.error(\"[updateAccount] Error updating account:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Soft delete an account (sets status to \"deleted\" instead of removing)\n *\n * @example\n * ```typescript\n * import { softDeleteAccount } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * await softDeleteAccount(client, 'account-123', 'admin@example.com');\n * ```\n */\nexport async function softDeleteAccount<TClient = any>(\n\tclient: TClient,\n\tid: string,\n\tdeletedBy: string,\n): Promise<boolean> {\n\ttry {\n\t\tconst { errors } = await (client as any).models.Account.update({\n\t\t\tid,\n\t\t\tstatus: \"deleted\",\n\t\t\tdeletedAt: new Date().toISOString(),\n\t\t\tdeletedBy,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[softDeleteAccount] GraphQL errors:\", errors);\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (error) {\n\t\tconsole.error(\"[softDeleteAccount] Error soft-deleting account:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Restore a soft-deleted account (sets status back to \"active\")\n * Checks retention period before allowing restoration\n *\n * @example\n * ```typescript\n * import { restoreAccount } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * await restoreAccount(client, 'account-123');\n * // Or with custom retention days:\n * await restoreAccount(client, 'account-123', 60);\n * ```\n */\nexport async function restoreAccount<TClient = any>(\n\tclient: TClient,\n\tid: string,\n\tretentionDays: number = DEFAULT_SOFT_DELETE_RETENTION_DAYS,\n): Promise<{ success: boolean; error?: string }> {\n\ttry {\n\t\t// First, get the account to check its deletedAt timestamp\n\t\tconst { data: account, errors: getErrors } = await (\n\t\t\tclient as any\n\t\t).models.Account.get({ id });\n\n\t\tif (getErrors || !account) {\n\t\t\tconsole.error(\"[restoreAccount] Error fetching account:\", getErrors);\n\t\t\treturn { success: false, error: \"Account not found\" };\n\t\t}\n\n\t\t// Check if restoration is allowed based on retention period\n\t\tconst eligibility = checkRestoreEligibility(account.deletedAt, retentionDays);\n\n\t\tif (!eligibility.canRestore) {\n\t\t\tconst errorMsg = `Cannot restore account. Retention period of ${retentionDays} days has expired. Item was deleted ${eligibility.daysExpired} days ago.`;\n\t\t\tconsole.error(\"[restoreAccount]\", errorMsg);\n\t\t\treturn { success: false, error: errorMsg };\n\t\t}\n\n\t\tconst { errors } = await (client as any).models.Account.update({\n\t\t\tid,\n\t\t\tstatus: \"active\",\n\t\t\tdeletedAt: null,\n\t\t\tdeletedBy: null,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[restoreAccount] GraphQL errors:\", errors);\n\t\t\treturn { success: false, error: \"Failed to restore account\" };\n\t\t}\n\n\t\treturn { success: true };\n\t} catch (error) {\n\t\tconsole.error(\"[restoreAccount] Error restoring account:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Hard delete an account (permanently removes from database)\n * Use with caution - prefer softDeleteAccount for recoverable deletion\n *\n * @example\n * ```typescript\n * import { deleteAccount } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * await deleteAccount(client, 'account-123');\n * ```\n */\nexport async function deleteAccount<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<boolean> {\n\ttry {\n\t\tconst { errors } = await (client as any).models.Account.delete({ id });\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[deleteAccount] GraphQL errors:\", errors);\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (error) {\n\t\tconsole.error(\"[deleteAccount] Error deleting account:\", error);\n\t\tthrow error;\n\t}\n}\n","/**\n * User Mutation Functions\n *\n * Provides mutation functions for creating, updating, and deleting users.\n */\n\nimport type { User } from \"@htlkg/core/types\";\nimport {\n\tcheckRestoreEligibility,\n\tDEFAULT_SOFT_DELETE_RETENTION_DAYS,\n} from \"../../queries/systemSettings\";\nimport type { CreateAuditFields, UpdateWithSoftDeleteFields } from \"../common\";\n\n/**\n * Input type for creating a user\n */\nexport interface CreateUserInput extends CreateAuditFields {\n\tcognitoId: string;\n\temail: string;\n\taccountId: string;\n\tbrandIds?: string[];\n\troles?: string[];\n\tpermissions?: Record<string, any>;\n\tstatus?: \"active\" | \"inactive\" | \"pending\" | \"suspended\" | \"deleted\";\n}\n\n/**\n * Input type for updating a user\n */\nexport interface UpdateUserInput extends UpdateWithSoftDeleteFields {\n\tid: string;\n\temail?: string;\n\tbrandIds?: string[];\n\troles?: string[];\n\tpermissions?: Record<string, any>;\n\tlastLogin?: string;\n\tstatus?: \"active\" | \"inactive\" | \"pending\" | \"suspended\" | \"deleted\";\n}\n\n/**\n * Create a new user\n *\n * @example\n * ```typescript\n * import { createUser } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const user = await createUser(client, {\n * cognitoId: 'cognito-123',\n * email: 'user@example.com',\n * accountId: 'account-123',\n * roles: ['BRAND_ADMIN'],\n * status: 'active'\n * });\n * ```\n */\nexport async function createUser<TClient = any>(\n\tclient: TClient,\n\tinput: CreateUserInput,\n): Promise<User | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.User.create(input);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[createUser] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as User;\n\t} catch (error) {\n\t\tconsole.error(\"[createUser] Error creating user:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Update an existing user\n *\n * @example\n * ```typescript\n * import { updateUser } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const user = await updateUser(client, {\n * id: 'user-123',\n * roles: ['BRAND_ADMIN', 'ACCOUNT_ADMIN'],\n * status: 'active'\n * });\n * ```\n */\nexport async function updateUser<TClient = any>(\n\tclient: TClient,\n\tinput: UpdateUserInput,\n): Promise<User | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.User.update(input);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[updateUser] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as User;\n\t} catch (error) {\n\t\tconsole.error(\"[updateUser] Error updating user:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Soft delete a user (sets status to \"deleted\" instead of removing)\n *\n * @example\n * ```typescript\n * import { softDeleteUser } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * await softDeleteUser(client, 'user-123', 'admin@example.com');\n * ```\n */\nexport async function softDeleteUser<TClient = any>(\n\tclient: TClient,\n\tid: string,\n\tdeletedBy: string,\n): Promise<boolean> {\n\ttry {\n\t\tconst { errors } = await (client as any).models.User.update({\n\t\t\tid,\n\t\t\tstatus: \"deleted\",\n\t\t\tdeletedAt: new Date().toISOString(),\n\t\t\tdeletedBy,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[softDeleteUser] GraphQL errors:\", errors);\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (error) {\n\t\tconsole.error(\"[softDeleteUser] Error soft-deleting user:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Restore a soft-deleted user (sets status back to \"active\")\n * Checks retention period before allowing restoration\n *\n * @example\n * ```typescript\n * import { restoreUser } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * await restoreUser(client, 'user-123');\n * // Or with custom retention days:\n * await restoreUser(client, 'user-123', 60);\n * ```\n */\nexport async function restoreUser<TClient = any>(\n\tclient: TClient,\n\tid: string,\n\tretentionDays: number = DEFAULT_SOFT_DELETE_RETENTION_DAYS,\n): Promise<{ success: boolean; error?: string }> {\n\ttry {\n\t\t// First, get the user to check its deletedAt timestamp\n\t\tconst { data: user, errors: getErrors } = await (\n\t\t\tclient as any\n\t\t).models.User.get({ id });\n\n\t\tif (getErrors || !user) {\n\t\t\tconsole.error(\"[restoreUser] Error fetching user:\", getErrors);\n\t\t\treturn { success: false, error: \"User not found\" };\n\t\t}\n\n\t\t// Check if restoration is allowed based on retention period\n\t\tconst eligibility = checkRestoreEligibility(user.deletedAt, retentionDays);\n\n\t\tif (!eligibility.canRestore) {\n\t\t\tconst errorMsg = `Cannot restore user. Retention period of ${retentionDays} days has expired. Item was deleted ${eligibility.daysExpired} days ago.`;\n\t\t\tconsole.error(\"[restoreUser]\", errorMsg);\n\t\t\treturn { success: false, error: errorMsg };\n\t\t}\n\n\t\tconst { errors } = await (client as any).models.User.update({\n\t\t\tid,\n\t\t\tstatus: \"active\",\n\t\t\tdeletedAt: null,\n\t\t\tdeletedBy: null,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[restoreUser] GraphQL errors:\", errors);\n\t\t\treturn { success: false, error: \"Failed to restore user\" };\n\t\t}\n\n\t\treturn { success: true };\n\t} catch (error) {\n\t\tconsole.error(\"[restoreUser] Error restoring user:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Hard delete a user (permanently removes from database)\n * Use with caution - prefer softDeleteUser for recoverable deletion\n *\n * @example\n * ```typescript\n * import { deleteUser } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * await deleteUser(client, 'user-123');\n * ```\n */\nexport async function deleteUser<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<boolean> {\n\ttry {\n\t\tconst { errors } = await (client as any).models.User.delete({ id });\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[deleteUser] GraphQL errors:\", errors);\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (error) {\n\t\tconsole.error(\"[deleteUser] Error deleting user:\", error);\n\t\tthrow error;\n\t}\n}\n","/**\n * ProductInstance Mutation Functions\n *\n * Provides mutation functions for creating, updating, and deleting product instances.\n * Product instances represent enabled products for a specific brand with their configuration.\n */\n\nimport type { ProductInstance } from \"@htlkg/core/types\";\nimport { getClientUser } from \"@htlkg/core/auth\";\nimport { getCurrentTimestamp } from \"@htlkg/core/utils\";\nimport { AppError } from \"@htlkg/core/errors\";\nimport type { CreateAuditFields, UpdateAuditFields } from \"../common\";\n\n/**\n * Get current user identifier for audit trails\n * Uses getClientUser() and returns email or username, falling back to \"system\"\n */\nasync function getUserIdentifier(fallback = \"system\"): Promise<string> {\n\ttry {\n\t\tconst user = await getClientUser();\n\t\tif (user) {\n\t\t\treturn user.email || user.username || fallback;\n\t\t}\n\t\treturn fallback;\n\t} catch {\n\t\treturn fallback;\n\t}\n}\n\n/**\n * Input type for creating a product instance\n */\nexport interface CreateProductInstanceInput extends CreateAuditFields {\n\tproductId: string;\n\tbrandId: string;\n\taccountId: string;\n\tproductName: string;\n\tenabled: boolean;\n\tconfig?: Record<string, any>;\n\tversion?: string;\n}\n\n/**\n * Input type for updating a product instance\n */\nexport interface UpdateProductInstanceInput extends UpdateAuditFields {\n\tid: string;\n\tenabled?: boolean;\n\tconfig?: Record<string, any>;\n\tversion?: string;\n}\n\n/**\n * Create a new product instance\n *\n * @example\n * ```typescript\n * import { createProductInstance } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const instance = await createProductInstance(client, {\n * productId: 'product-123',\n * brandId: 'brand-456',\n * accountId: 'account-789',\n * enabled: true,\n * config: { apiKey: 'xxx', maxRequests: 100 }\n * });\n * ```\n */\nexport async function createProductInstance<TClient = any>(\n\tclient: TClient,\n\tinput: CreateProductInstanceInput,\n): Promise<ProductInstance | null> {\n\ttry {\n\t\t// Get user identifier for audit trail\n\t\tconst userIdentifier = input.createdBy || input.updatedBy || await getUserIdentifier();\n\n\t\t// Build input - manually construct to avoid Vue Proxy issues\n\t\tconst timestamp = input.createdAt || getCurrentTimestamp();\n\t\tconst createInput: any = {\n\t\t\tproductId: input.productId,\n\t\t\tproductName: input.productName,\n\t\t\tbrandId: input.brandId,\n\t\t\taccountId: input.accountId,\n\t\t\tenabled: input.enabled,\n\t\t\tversion: input.version,\n\t\t\tcreatedAt: timestamp,\n\t\t\tcreatedBy: userIdentifier,\n\t\t\tupdatedAt: input.updatedAt || timestamp,\n\t\t\tupdatedBy: userIdentifier,\n\t\t};\n\n\t\t// AWSJSON type requires JSON STRING\n\t\tif (input.config) {\n\t\t\t// Double stringify: first to strip Vue Proxy, second to create JSON string\n\t\t\tcreateInput.config = JSON.stringify(JSON.parse(JSON.stringify(input.config)));\n\t\t}\n\n\t\tconsole.log(\"[createProductInstance] Config as string:\", createInput.config);\n\t\tconsole.log(\"[createProductInstance] Config type:\", typeof createInput.config);\n\n\t\tconst { data, errors } = await (client as any).models.ProductInstance.create(createInput);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[createProductInstance] GraphQL errors:\", errors);\n\t\t\tthrow new AppError(\n\t\t\t\t\"Failed to create product instance\",\n\t\t\t\t\"PRODUCT_INSTANCE_CREATE_ERROR\",\n\t\t\t\t500,\n\t\t\t\t{ errors }\n\t\t\t);\n\t\t}\n\n\t\treturn data as ProductInstance;\n\t} catch (error) {\n\t\tconsole.error(\"[createProductInstance] Error creating product instance:\", error);\n\t\tif (error instanceof AppError) {\n\t\t\tthrow error;\n\t\t}\n\t\tthrow new AppError(\n\t\t\t\"Failed to create product instance\",\n\t\t\t\"PRODUCT_INSTANCE_CREATE_ERROR\",\n\t\t\t500,\n\t\t\t{ originalError: error }\n\t\t);\n\t}\n}\n\n/**\n * Update an existing product instance\n *\n * @example\n * ```typescript\n * import { updateProductInstance } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const instance = await updateProductInstance(client, {\n * id: 'instance-123',\n * enabled: false,\n * config: { apiKey: 'new-key', maxRequests: 200 }\n * });\n * ```\n */\nexport async function updateProductInstance<TClient = any>(\n\tclient: TClient,\n\tinput: UpdateProductInstanceInput,\n): Promise<ProductInstance | null> {\n\ttry {\n\t\t// Add timestamp and user metadata if not provided\n\t\t// Convert config from Vue Proxy to plain object\n\t\tconst updateInput: any = {\n\t\t\t...input,\n\t\t\tupdatedAt: input.updatedAt || getCurrentTimestamp(),\n\t\t\tupdatedBy: input.updatedBy || await getUserIdentifier(),\n\t\t};\n\n\t\t// AWSJSON type requires JSON STRING\n\t\tif (input.config) {\n\t\t\tupdateInput.config = JSON.stringify(JSON.parse(JSON.stringify(input.config)));\n\t\t}\n\n\t\tconst { data, errors } = await (client as any).models.ProductInstance.update(updateInput);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[updateProductInstance] GraphQL errors:\", errors);\n\t\t\tthrow new AppError(\n\t\t\t\t\"Failed to update product instance\",\n\t\t\t\t\"PRODUCT_INSTANCE_UPDATE_ERROR\",\n\t\t\t\t500,\n\t\t\t\t{ errors }\n\t\t\t);\n\t\t}\n\n\t\treturn data as ProductInstance;\n\t} catch (error) {\n\t\tconsole.error(\"[updateProductInstance] Error updating product instance:\", error);\n\t\tif (error instanceof AppError) {\n\t\t\tthrow error;\n\t\t}\n\t\tthrow new AppError(\n\t\t\t\"Failed to update product instance\",\n\t\t\t\"PRODUCT_INSTANCE_UPDATE_ERROR\",\n\t\t\t500,\n\t\t\t{ originalError: error }\n\t\t);\n\t}\n}\n\n/**\n * Delete a product instance\n *\n * @example\n * ```typescript\n * import { deleteProductInstance } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * await deleteProductInstance(client, 'instance-123');\n * ```\n */\nexport async function deleteProductInstance<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<boolean> {\n\ttry {\n\t\tconst { errors } = await (client as any).models.ProductInstance.delete({ id });\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[deleteProductInstance] GraphQL errors:\", errors);\n\t\t\tthrow new AppError(\n\t\t\t\t\"Failed to delete product instance\",\n\t\t\t\t\"PRODUCT_INSTANCE_DELETE_ERROR\",\n\t\t\t\t500,\n\t\t\t\t{ errors }\n\t\t\t);\n\t\t}\n\n\t\treturn true;\n\t} catch (error) {\n\t\tconsole.error(\"[deleteProductInstance] Error deleting product instance:\", error);\n\t\tif (error instanceof AppError) {\n\t\t\tthrow error;\n\t\t}\n\t\tthrow new AppError(\n\t\t\t\"Failed to delete product instance\",\n\t\t\t\"PRODUCT_INSTANCE_DELETE_ERROR\",\n\t\t\t500,\n\t\t\t{ originalError: error }\n\t\t);\n\t}\n}\n\n/**\n * Toggle the enabled status of a product instance\n *\n * @example\n * ```typescript\n * import { toggleProductInstanceEnabled } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const instance = await toggleProductInstanceEnabled(client, 'instance-123', true);\n * ```\n */\nexport async function toggleProductInstanceEnabled<TClient = any>(\n\tclient: TClient,\n\tid: string,\n\tenabled: boolean,\n): Promise<ProductInstance | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.ProductInstance.update({\n\t\t\tid,\n\t\t\tenabled,\n\t\t\tlastUpdated: getCurrentTimestamp(),\n\t\t\tupdatedBy: await getUserIdentifier(),\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[toggleProductInstanceEnabled] GraphQL errors:\", errors);\n\t\t\tthrow new AppError(\n\t\t\t\t\"Failed to toggle product instance\",\n\t\t\t\t\"PRODUCT_INSTANCE_TOGGLE_ERROR\",\n\t\t\t\t500,\n\t\t\t\t{ errors }\n\t\t\t);\n\t\t}\n\n\t\treturn data as ProductInstance;\n\t} catch (error) {\n\t\tconsole.error(\"[toggleProductInstanceEnabled] Error toggling product instance:\", error);\n\t\tif (error instanceof AppError) {\n\t\t\tthrow error;\n\t\t}\n\t\tthrow new AppError(\n\t\t\t\"Failed to toggle product instance\",\n\t\t\t\"PRODUCT_INSTANCE_TOGGLE_ERROR\",\n\t\t\t500,\n\t\t\t{ originalError: error }\n\t\t);\n\t}\n}\n","/**\n * SystemSettings Mutation Functions\n *\n * Provides mutation functions for managing system settings.\n */\n\nimport type { SystemSettings } from \"@htlkg/core/types\";\nimport {\n\tSYSTEM_SETTINGS_KEY,\n\tDEFAULT_SOFT_DELETE_RETENTION_DAYS,\n} from \"../queries/systemSettings\";\n\n/**\n * Input type for updating system settings\n */\nexport interface UpdateSystemSettingsInput {\n\tsoftDeleteRetentionDays: number;\n\tupdatedBy: string;\n}\n\n/**\n * Update or create system settings\n * Only SUPER_ADMINS can update system settings\n *\n * @example\n * ```typescript\n * import { updateSystemSettings } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const settings = await updateSystemSettings(client, {\n * softDeleteRetentionDays: 60,\n * updatedBy: 'admin@example.com'\n * });\n * ```\n */\nexport async function updateSystemSettings<TClient = any>(\n\tclient: TClient,\n\tinput: UpdateSystemSettingsInput,\n): Promise<SystemSettings | null> {\n\ttry {\n\t\t// Validate retention days (minimum 1 day, maximum 365 days)\n\t\tif (input.softDeleteRetentionDays < 1 || input.softDeleteRetentionDays > 365) {\n\t\t\tconsole.error(\n\t\t\t\t\"[updateSystemSettings] Invalid retention days. Must be between 1 and 365.\",\n\t\t\t);\n\t\t\treturn null;\n\t\t}\n\n\t\t// First, try to get existing settings\n\t\tconst { data: existing } = await (client as any).models.SystemSettings.get({\n\t\t\tkey: SYSTEM_SETTINGS_KEY,\n\t\t});\n\n\t\tconst settingsData = {\n\t\t\tkey: SYSTEM_SETTINGS_KEY,\n\t\t\tsoftDeleteRetentionDays: input.softDeleteRetentionDays,\n\t\t\tupdatedAt: new Date().toISOString(),\n\t\t\tupdatedBy: input.updatedBy,\n\t\t};\n\n\t\tlet result;\n\t\tif (existing) {\n\t\t\t// Update existing settings\n\t\t\tresult = await (client as any).models.SystemSettings.update(settingsData);\n\t\t} else {\n\t\t\t// Create new settings\n\t\t\tresult = await (client as any).models.SystemSettings.create(settingsData);\n\t\t}\n\n\t\tif (result.errors) {\n\t\t\tconsole.error(\"[updateSystemSettings] GraphQL errors:\", result.errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn result.data as SystemSettings;\n\t} catch (error) {\n\t\tconsole.error(\"[updateSystemSettings] Error updating system settings:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Initialize system settings with default values if they don't exist\n *\n * @example\n * ```typescript\n * import { initializeSystemSettings } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const settings = await initializeSystemSettings(client, 'system@hotelinking.com');\n * ```\n */\nexport async function initializeSystemSettings<TClient = any>(\n\tclient: TClient,\n\tinitializedBy: string,\n): Promise<SystemSettings | null> {\n\ttry {\n\t\t// Check if settings already exist\n\t\tconst { data: existing } = await (client as any).models.SystemSettings.get({\n\t\t\tkey: SYSTEM_SETTINGS_KEY,\n\t\t});\n\n\t\tif (existing) {\n\t\t\treturn existing as SystemSettings;\n\t\t}\n\n\t\t// Create default settings\n\t\tconst { data, errors } = await (client as any).models.SystemSettings.create({\n\t\t\tkey: SYSTEM_SETTINGS_KEY,\n\t\t\tsoftDeleteRetentionDays: DEFAULT_SOFT_DELETE_RETENTION_DAYS,\n\t\t\tupdatedAt: new Date().toISOString(),\n\t\t\tupdatedBy: initializedBy,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[initializeSystemSettings] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as SystemSettings;\n\t} catch (error) {\n\t\tconsole.error(\n\t\t\t\"[initializeSystemSettings] Error initializing system settings:\",\n\t\t\terror,\n\t\t);\n\t\tthrow error;\n\t}\n}\n","/**\n * Reservation Mutation Functions\n *\n * Provides type-safe mutation functions for creating, updating, and deleting reservations.\n * Includes date validation and status transition rules.\n */\n\nimport {\n\tcheckRestoreEligibility,\n\tDEFAULT_SOFT_DELETE_RETENTION_DAYS,\n} from \"../../queries/systemSettings\";\nimport type { CreateAuditFields, UpdateWithSoftDeleteFields } from \"../common\";\n\n/**\n * Reservation status type\n */\nexport type ReservationStatus = \"confirmed\" | \"checked_in\" | \"checked_out\" | \"cancelled\" | \"no_show\";\n\n/**\n * Valid status transitions for reservations\n * Maps current status -> allowed next statuses\n */\nconst STATUS_TRANSITIONS: Record<ReservationStatus, ReservationStatus[]> = {\n\tconfirmed: [\"checked_in\", \"cancelled\", \"no_show\"],\n\tchecked_in: [\"checked_out\", \"cancelled\"],\n\tchecked_out: [], // Terminal state - no transitions allowed\n\tcancelled: [], // Terminal state - no transitions allowed\n\tno_show: [], // Terminal state - no transitions allowed\n};\n\n/**\n * Validation error class for reservation operations\n */\nexport class ReservationValidationError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"ReservationValidationError\";\n\t}\n}\n\n/**\n * Validate check-in and check-out dates\n * @throws {ReservationValidationError} if dates are invalid\n */\nfunction validateDates(checkIn: string, checkOut: string): void {\n\tconst checkInDate = new Date(checkIn);\n\tconst checkOutDate = new Date(checkOut);\n\n\t// Check if dates are valid\n\tif (isNaN(checkInDate.getTime())) {\n\t\tthrow new ReservationValidationError(\"Invalid check-in date\");\n\t}\n\n\tif (isNaN(checkOutDate.getTime())) {\n\t\tthrow new ReservationValidationError(\"Invalid check-out date\");\n\t}\n\n\t// Check-out must be after check-in\n\tif (checkOutDate <= checkInDate) {\n\t\tthrow new ReservationValidationError(\n\t\t\t\"Check-out date must be after check-in date\"\n\t\t);\n\t}\n\n\t// Calculate minimum stay (at least a few hours)\n\tconst minStayHours = 4;\n\tconst stayDuration = checkOutDate.getTime() - checkInDate.getTime();\n\tconst hoursDiff = stayDuration / (1000 * 60 * 60);\n\n\tif (hoursDiff < minStayHours) {\n\t\tthrow new ReservationValidationError(\n\t\t\t`Minimum stay is ${minStayHours} hours`\n\t\t);\n\t}\n}\n\n/**\n * Validate status transition\n * @throws {ReservationValidationError} if transition is not allowed\n */\nfunction validateStatusTransition(\n\tcurrentStatus: ReservationStatus,\n\tnewStatus: ReservationStatus\n): void {\n\tconst allowedTransitions = STATUS_TRANSITIONS[currentStatus];\n\n\tif (!allowedTransitions.includes(newStatus)) {\n\t\tthrow new ReservationValidationError(\n\t\t\t`Invalid status transition from '${currentStatus}' to '${newStatus}'. ` +\n\t\t\t`Allowed transitions: ${allowedTransitions.length > 0 ? allowedTransitions.join(\", \") : \"none (terminal state)\"}`\n\t\t);\n\t}\n}\n\n/**\n * Input type for creating a reservation\n */\nexport interface CreateReservationInput extends CreateAuditFields {\n\tbrandId: string;\n\tvisitId: string;\n\tconfirmationCode: string;\n\tcheckIn: string;\n\tcheckOut: string;\n\tstatus?: \"confirmed\" | \"checked_in\" | \"checked_out\" | \"cancelled\" | \"no_show\";\n\tsource?: string;\n\tchannel?: string;\n\troomType?: string;\n\troom?: string;\n\ttotalAmount?: number;\n\tcurrency?: string;\n\tnights?: number;\n}\n\n/**\n * Input type for updating a reservation\n */\nexport interface UpdateReservationInput extends UpdateWithSoftDeleteFields {\n\tid: string;\n\tbrandId?: string;\n\tvisitId?: string;\n\tconfirmationCode?: string;\n\tcheckIn?: string;\n\tcheckOut?: string;\n\tstatus?: \"confirmed\" | \"checked_in\" | \"checked_out\" | \"cancelled\" | \"no_show\";\n\tsource?: string;\n\tchannel?: string;\n\troomType?: string;\n\troom?: string;\n\ttotalAmount?: number;\n\tcurrency?: string;\n\tnights?: number;\n}\n\n/**\n * Create a new reservation with date validation\n *\n * @throws {ReservationValidationError} if dates are invalid\n *\n * @example\n * ```typescript\n * import { createReservation } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const reservation = await createReservation(client, {\n * brandId: 'brand-123',\n * visitId: 'visit-456',\n * confirmationCode: 'ABC123',\n * checkIn: '2024-01-01',\n * checkOut: '2024-01-05',\n * status: 'confirmed'\n * });\n * ```\n */\nexport async function createReservation<TClient = any>(\n\tclient: TClient,\n\tinput: CreateReservationInput,\n): Promise<any | null> {\n\ttry {\n\t\t// Validate dates before creating\n\t\tvalidateDates(input.checkIn, input.checkOut);\n\n\t\t// Calculate nights if not provided\n\t\tif (!input.nights) {\n\t\t\tconst checkInDate = new Date(input.checkIn);\n\t\t\tconst checkOutDate = new Date(input.checkOut);\n\t\t\tconst diffTime = checkOutDate.getTime() - checkInDate.getTime();\n\t\t\tconst diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));\n\t\t\tinput.nights = diffDays;\n\t\t}\n\n\t\tconst { data, errors } = await (client as any).models.Reservation.create(input);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[createReservation] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data;\n\t} catch (error) {\n\t\tif (error instanceof ReservationValidationError) {\n\t\t\tconsole.error(\"[createReservation] Validation error:\", error.message);\n\t\t\tthrow error;\n\t\t}\n\t\tconsole.error(\"[createReservation] Error creating reservation:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Update an existing reservation with validation\n *\n * @throws {ReservationValidationError} if dates or status transition is invalid\n *\n * @example\n * ```typescript\n * import { updateReservation } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const reservation = await updateReservation(client, {\n * id: 'reservation-123',\n * status: 'checked_in',\n * room: '201'\n * });\n * ```\n */\nexport async function updateReservation<TClient = any>(\n\tclient: TClient,\n\tinput: UpdateReservationInput,\n): Promise<any | null> {\n\ttry {\n\t\t// If both dates are being updated, validate them\n\t\tif (input.checkIn && input.checkOut) {\n\t\t\tvalidateDates(input.checkIn, input.checkOut);\n\n\t\t\t// Recalculate nights if dates changed\n\t\t\tconst checkInDate = new Date(input.checkIn);\n\t\t\tconst checkOutDate = new Date(input.checkOut);\n\t\t\tconst diffTime = checkOutDate.getTime() - checkInDate.getTime();\n\t\t\tconst diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));\n\t\t\tinput.nights = diffDays;\n\t\t}\n\n\t\t// If status is being updated, validate the transition\n\t\tif (input.status) {\n\t\t\t// Get current reservation to check current status\n\t\t\tconst { data: currentReservation, errors: getErrors } = await (\n\t\t\t\tclient as any\n\t\t\t).models.Reservation.get({ id: input.id });\n\n\t\t\tif (getErrors || !currentReservation) {\n\t\t\t\tconsole.error(\"[updateReservation] Error fetching current reservation:\", getErrors);\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst currentStatus = currentReservation.status as ReservationStatus;\n\t\t\tvalidateStatusTransition(currentStatus, input.status as ReservationStatus);\n\t\t}\n\n\t\tconst { data, errors } = await (client as any).models.Reservation.update(input);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[updateReservation] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data;\n\t} catch (error) {\n\t\tif (error instanceof ReservationValidationError) {\n\t\t\tconsole.error(\"[updateReservation] Validation error:\", error.message);\n\t\t\tthrow error;\n\t\t}\n\t\tconsole.error(\"[updateReservation] Error updating reservation:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Soft delete a reservation (sets deletedAt/deletedBy instead of removing)\n *\n * @example\n * ```typescript\n * import { softDeleteReservation } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * await softDeleteReservation(client, 'reservation-123', 'admin@example.com');\n * ```\n */\nexport async function softDeleteReservation<TClient = any>(\n\tclient: TClient,\n\tid: string,\n\tdeletedBy: string,\n): Promise<boolean> {\n\ttry {\n\t\tconst { errors } = await (client as any).models.Reservation.update({\n\t\t\tid,\n\t\t\tdeletedAt: new Date().toISOString(),\n\t\t\tdeletedBy,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[softDeleteReservation] GraphQL errors:\", errors);\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (error) {\n\t\tconsole.error(\"[softDeleteReservation] Error soft-deleting reservation:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Restore a soft-deleted reservation\n * Checks retention period before allowing restoration\n *\n * @example\n * ```typescript\n * import { restoreReservation } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * await restoreReservation(client, 'reservation-123');\n * // Or with custom retention days:\n * await restoreReservation(client, 'reservation-123', 60);\n * ```\n */\nexport async function restoreReservation<TClient = any>(\n\tclient: TClient,\n\tid: string,\n\tretentionDays: number = DEFAULT_SOFT_DELETE_RETENTION_DAYS,\n): Promise<{ success: boolean; error?: string }> {\n\ttry {\n\t\t// First, get the reservation to check its deletedAt timestamp\n\t\tconst { data: reservation, errors: getErrors } = await (\n\t\t\tclient as any\n\t\t).models.Reservation.get({ id });\n\n\t\tif (getErrors || !reservation) {\n\t\t\tconsole.error(\"[restoreReservation] Error fetching reservation:\", getErrors);\n\t\t\treturn { success: false, error: \"Reservation not found\" };\n\t\t}\n\n\t\t// Check if restoration is allowed based on retention period\n\t\tconst eligibility = checkRestoreEligibility(reservation.deletedAt, retentionDays);\n\n\t\tif (!eligibility.canRestore) {\n\t\t\tconst errorMsg = `Cannot restore reservation. Retention period of ${retentionDays} days has expired. Item was deleted ${eligibility.daysExpired} days ago.`;\n\t\t\tconsole.error(\"[restoreReservation]\", errorMsg);\n\t\t\treturn { success: false, error: errorMsg };\n\t\t}\n\n\t\tconst { errors } = await (client as any).models.Reservation.update({\n\t\t\tid,\n\t\t\tdeletedAt: null,\n\t\t\tdeletedBy: null,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[restoreReservation] GraphQL errors:\", errors);\n\t\t\treturn { success: false, error: \"Failed to restore reservation\" };\n\t\t}\n\n\t\treturn { success: true };\n\t} catch (error) {\n\t\tconsole.error(\"[restoreReservation] Error restoring reservation:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Hard delete a reservation (permanently removes from database)\n * Use with caution - prefer softDeleteReservation for recoverable deletion\n *\n * @example\n * ```typescript\n * import { deleteReservation } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * await deleteReservation(client, 'reservation-123');\n * ```\n */\nexport async function deleteReservation<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<boolean> {\n\ttry {\n\t\tconst { errors } = await (client as any).models.Reservation.delete({ id });\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[deleteReservation] GraphQL errors:\", errors);\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (error) {\n\t\tconsole.error(\"[deleteReservation] Error deleting reservation:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Update reservation status with validation\n *\n * Validates that the status transition is allowed based on current status.\n * Status transition rules:\n * - confirmed → checked_in, cancelled, no_show\n * - checked_in → checked_out, cancelled\n * - checked_out → (terminal state, no transitions)\n * - cancelled → (terminal state, no transitions)\n * - no_show → (terminal state, no transitions)\n *\n * @throws {ReservationValidationError} if status transition is invalid\n *\n * @example\n * ```typescript\n * import { updateReservationStatus } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const reservation = await updateReservationStatus(\n * client,\n * 'reservation-123',\n * 'checked_in'\n * );\n * ```\n */\nexport async function updateReservationStatus<TClient = any>(\n\tclient: TClient,\n\tid: string,\n\tnewStatus: ReservationStatus,\n): Promise<any | null> {\n\ttry {\n\t\t// Get current reservation to check current status\n\t\tconst { data: currentReservation, errors: getErrors } = await (\n\t\t\tclient as any\n\t\t).models.Reservation.get({ id });\n\n\t\tif (getErrors || !currentReservation) {\n\t\t\tconsole.error(\"[updateReservationStatus] Error fetching reservation:\", getErrors);\n\t\t\treturn null;\n\t\t}\n\n\t\tconst currentStatus = currentReservation.status as ReservationStatus;\n\n\t\t// Validate status transition\n\t\tvalidateStatusTransition(currentStatus, newStatus);\n\n\t\t// Perform the update\n\t\tconst { data, errors } = await (client as any).models.Reservation.update({\n\t\t\tid,\n\t\t\tstatus: newStatus,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[updateReservationStatus] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data;\n\t} catch (error) {\n\t\tif (error instanceof ReservationValidationError) {\n\t\t\tconsole.error(\"[updateReservationStatus] Validation error:\", error.message);\n\t\t\tthrow error;\n\t\t}\n\t\tconsole.error(\"[updateReservationStatus] Error updating status:\", error);\n\t\tthrow error;\n\t}\n}\n","/**\n * Contact Mutation Functions\n *\n * Provides type-safe mutation functions for creating, updating, and deleting contacts.\n * Includes Zod validation for input data before mutations.\n */\n\nimport { z } from \"zod\";\nimport type { Contact } from \"@htlkg/core/types\";\nimport {\n\tcheckRestoreEligibility,\n\tDEFAULT_SOFT_DELETE_RETENTION_DAYS,\n} from \"../queries/systemSettings\";\nimport { getContact } from \"../queries/contacts\";\nimport type { CreateAuditFields, UpdateWithSoftDeleteFields } from \"./common\";\n\n// ============================================\n// Added Zod Validation Schemas\n// ============================================\n\n/**\n * Zod schema for creating a contact \n */\nexport const createContactSchema = z.object({\n\tbrandId: z.string().min(1, \"Brand ID is required\"),\n\temail: z.string().email(\"Invalid email address\"),\n\tphone: z.string().optional(),\n\tfirstName: z.string().min(1, \"First name is required\"),\n\tlastName: z.string().min(1, \"Last name is required\"),\n\tlocale: z.string().optional(),\n\tgdprConsent: z.boolean(),\n\tgdprConsentDate: z.string().optional(),\n\tmarketingOptIn: z.boolean().optional(),\n\tpreferences: z.record(z.any()).optional(),\n\ttags: z.array(z.string()).optional(),\n\ttotalVisits: z.number().int().min(0).optional(),\n\tlastVisitDate: z.string().optional(),\n\tfirstVisitDate: z.string().optional(),\n\tlegacyId: z.string().optional(),\n\t// Audit fields\n\tcreatedAt: z.string().optional(),\n\tcreatedBy: z.string().optional(),\n\tupdatedAt: z.string().optional(),\n\tupdatedBy: z.string().optional(),\n});\n\n/**\n * Zod schema for updating a contact\n */\nexport const updateContactSchema = z.object({\n\tid: z.string().min(1, \"Contact ID is required\"),\n\tbrandId: z.string().min(1).optional(),\n\temail: z.string().email(\"Invalid email address\").optional(),\n\tphone: z.string().optional(),\n\tfirstName: z.string().min(1).optional(),\n\tlastName: z.string().min(1).optional(),\n\tlocale: z.string().optional(),\n\tgdprConsent: z.boolean().optional(),\n\tgdprConsentDate: z.string().optional(),\n\tmarketingOptIn: z.boolean().optional(),\n\tpreferences: z.record(z.any()).optional(),\n\ttags: z.array(z.string()).optional(),\n\ttotalVisits: z.number().int().min(0).optional(),\n\tlastVisitDate: z.string().optional(),\n\tfirstVisitDate: z.string().optional(),\n\tlegacyId: z.string().optional(),\n\t// Audit fields\n\tupdatedAt: z.string().optional(),\n\tupdatedBy: z.string().optional(),\n\tdeletedAt: z.string().nullable().optional(),\n\tdeletedBy: z.string().nullable().optional(),\n});\n\n/**\n * Zod schema for merging contacts\n */\nexport const mergeContactsSchema = z.object({\n\tprimaryId: z.string().min(1, \"Primary contact ID is required\"),\n\tduplicateIds: z.array(z.string().min(1)).min(1, \"At least one duplicate ID is required\"),\n});\n\n// ============================================\n// Validation Error Class\n// ============================================\n\n/**\n * Validation error class for contact operations\n */\nexport class ContactValidationError extends Error {\n\tpublic readonly issues: z.ZodIssue[];\n\n\tconstructor(message: string, issues: z.ZodIssue[] = []) {\n\t\tsuper(message);\n\t\tthis.name = \"ContactValidationError\";\n\t\tthis.issues = issues;\n\t}\n}\n\n// ============================================\n// Input Types\n// ============================================\n\n/**\n * Input type for creating a contact\n */\nexport interface CreateContactInput extends CreateAuditFields {\n\tbrandId: string;\n\temail: string;\n\tphone?: string;\n\tfirstName: string;\n\tlastName: string;\n\tlocale?: string;\n\tgdprConsent: boolean;\n\tgdprConsentDate?: string;\n\tmarketingOptIn?: boolean;\n\tpreferences?: Record<string, any>;\n\ttags?: string[];\n\ttotalVisits?: number;\n\tlastVisitDate?: string;\n\tfirstVisitDate?: string;\n\tlegacyId?: string;\n}\n\n/**\n * Input type for updating a contact\n */\nexport interface UpdateContactInput extends UpdateWithSoftDeleteFields {\n\tid: string;\n\tbrandId?: string;\n\temail?: string;\n\tphone?: string;\n\tfirstName?: string;\n\tlastName?: string;\n\tlocale?: string;\n\tgdprConsent?: boolean;\n\tgdprConsentDate?: string;\n\tmarketingOptIn?: boolean;\n\tpreferences?: Record<string, any>;\n\ttags?: string[];\n\ttotalVisits?: number;\n\tlastVisitDate?: string;\n\tfirstVisitDate?: string;\n\tlegacyId?: string;\n}\n\n/**\n * Input type for merging contacts\n */\nexport interface MergeContactsInput {\n\tprimaryId: string;\n\tduplicateIds: string[];\n}\n\n/**\n * Result type for merge operation\n */\nexport interface MergeContactsResult {\n\tsuccess: boolean;\n\tmergedContact?: Contact;\n\tdeletedIds?: string[];\n\terror?: string;\n}\n\n// ============================================\n// Mutation Functions\n// ============================================\n\n/**\n * Create a new contact with Zod validation\n *\n * @throws {ContactValidationError} if input validation fails\n *\n * @example\n * ```typescript\n * import { createContact } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const contact = await createContact(client, {\n * brandId: 'brand-123',\n * email: 'guest@example.com',\n * firstName: 'John',\n * lastName: 'Doe',\n * gdprConsent: true,\n * gdprConsentDate: new Date().toISOString()\n * });\n * ```\n */\nexport async function createContact<TClient = any>(\n\tclient: TClient,\n\tinput: CreateContactInput,\n): Promise<Contact | null> {\n\ttry {\n\t\t// Validate input with Zod\n\t\tconst validationResult = createContactSchema.safeParse(input);\n\n\t\tif (!validationResult.success) {\n\t\t\tconst errorMessage = validationResult.error.issues\n\t\t\t\t.map((issue) => `${issue.path.join(\".\")}: ${issue.message}`)\n\t\t\t\t.join(\", \");\n\t\t\tthrow new ContactValidationError(\n\t\t\t\t`Validation failed: ${errorMessage}`,\n\t\t\t\tvalidationResult.error.issues\n\t\t\t);\n\t\t}\n\n\t\tconst { data, errors } = await (client as any).models.Contact.create(input);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[createContact] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as Contact;\n\t} catch (error) {\n\t\tif (error instanceof ContactValidationError) {\n\t\t\tconsole.error(\"[createContact] Validation error:\", error.message);\n\t\t\tthrow error;\n\t\t}\n\t\tconsole.error(\"[createContact] Error creating contact:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Update an existing contact with Zod validation\n *\n * @throws {ContactValidationError} if input validation fails\n *\n * @example\n * ```typescript\n * import { updateContact } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const contact = await updateContact(client, {\n * id: 'contact-123',\n * firstName: 'Jane',\n * marketingOptIn: true\n * });\n * ```\n */\nexport async function updateContact<TClient = any>(\n\tclient: TClient,\n\tinput: UpdateContactInput,\n): Promise<Contact | null> {\n\ttry {\n\t\t// Validate input with Zod\n\t\tconst validationResult = updateContactSchema.safeParse(input);\n\n\t\tif (!validationResult.success) {\n\t\t\tconst errorMessage = validationResult.error.issues\n\t\t\t\t.map((issue) => `${issue.path.join(\".\")}: ${issue.message}`)\n\t\t\t\t.join(\", \");\n\t\t\tthrow new ContactValidationError(\n\t\t\t\t`Validation failed: ${errorMessage}`,\n\t\t\t\tvalidationResult.error.issues\n\t\t\t);\n\t\t}\n\n\t\tconst { data, errors } = await (client as any).models.Contact.update(input);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[updateContact] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as Contact;\n\t} catch (error) {\n\t\tif (error instanceof ContactValidationError) {\n\t\t\tconsole.error(\"[updateContact] Validation error:\", error.message);\n\t\t\tthrow error;\n\t\t}\n\t\tconsole.error(\"[updateContact] Error updating contact:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Soft delete a contact (sets deletedAt/deletedBy instead of removing)\n *\n * @example\n * ```typescript\n * import { softDeleteContact } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * await softDeleteContact(client, 'contact-123', 'admin@example.com');\n * ```\n */\nexport async function softDeleteContact<TClient = any>(\n\tclient: TClient,\n\tid: string,\n\tdeletedBy: string,\n): Promise<boolean> {\n\ttry {\n\t\tconst { errors } = await (client as any).models.Contact.update({\n\t\t\tid,\n\t\t\tdeletedAt: new Date().toISOString(),\n\t\t\tdeletedBy,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[softDeleteContact] GraphQL errors:\", errors);\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (error) {\n\t\tconsole.error(\"[softDeleteContact] Error soft-deleting contact:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Restore a soft-deleted contact\n * Checks retention period before allowing restoration\n *\n * @example\n * ```typescript\n * import { restoreContact } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * await restoreContact(client, 'contact-123');\n * // Or with custom retention days:\n * await restoreContact(client, 'contact-123', 60);\n * ```\n */\nexport async function restoreContact<TClient = any>(\n\tclient: TClient,\n\tid: string,\n\tretentionDays: number = DEFAULT_SOFT_DELETE_RETENTION_DAYS,\n): Promise<{ success: boolean; error?: string }> {\n\ttry {\n\t\t// First, get the contact to check its deletedAt timestamp\n\t\tconst contact = await getContact(client, id);\n\n\t\tif (!contact) {\n\t\t\tconsole.error(\"[restoreContact] Contact not found\");\n\t\t\treturn { success: false, error: \"Contact not found\" };\n\t\t}\n\n\t\t// Check if restoration is allowed based on retention period\n\t\tconst eligibility = checkRestoreEligibility(\n\t\t\t(contact as any).deletedAt,\n\t\t\tretentionDays\n\t\t);\n\n\t\tif (!eligibility.canRestore) {\n\t\t\tconst errorMsg = `Cannot restore contact. Retention period of ${retentionDays} days has expired. Item was deleted ${eligibility.daysExpired} days ago.`;\n\t\t\tconsole.error(\"[restoreContact]\", errorMsg);\n\t\t\treturn { success: false, error: errorMsg };\n\t\t}\n\n\t\tconst { errors } = await (client as any).models.Contact.update({\n\t\t\tid,\n\t\t\tdeletedAt: null,\n\t\t\tdeletedBy: null,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[restoreContact] GraphQL errors:\", errors);\n\t\t\treturn { success: false, error: \"Failed to restore contact\" };\n\t\t}\n\n\t\treturn { success: true };\n\t} catch (error) {\n\t\tconsole.error(\"[restoreContact] Error restoring contact:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Hard delete a contact (permanently removes from database)\n * Use with caution - prefer softDeleteContact for recoverable deletion\n *\n * @example\n * ```typescript\n * import { deleteContact } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * await deleteContact(client, 'contact-123');\n * ```\n */\nexport async function deleteContact<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<boolean> {\n\ttry {\n\t\tconst { errors } = await (client as any).models.Contact.delete({ id });\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[deleteContact] GraphQL errors:\", errors);\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (error) {\n\t\tconsole.error(\"[deleteContact] Error deleting contact:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Merge duplicate contacts into a primary contact\n *\n * This function:\n * 1. Validates all contact IDs exist\n * 2. Aggregates data from duplicates into the primary contact\n * 3. Soft deletes the duplicate contacts\n * 4. Returns the updated primary contact\n *\n * Merge strategy:\n * - totalVisits: Sum of all contacts\n * - firstVisitDate: Earliest date across all contacts\n * - lastVisitDate: Latest date across all contacts\n * - tags: Merged unique tags from all contacts\n * - preferences: Primary contact preferences take precedence\n * - Other fields: Primary contact values are preserved\n *\n * @throws {ContactValidationError} if input validation fails\n *\n * @example\n * ```typescript\n * import { mergeContacts } from '@htlkg/data/mutations';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const result = await mergeContacts(client, {\n * primaryId: 'contact-primary',\n * duplicateIds: ['contact-dup-1', 'contact-dup-2']\n * }, 'admin@example.com');\n * ```\n */\nexport async function mergeContacts<TClient = any>(\n\tclient: TClient,\n\tinput: MergeContactsInput,\n\tmergedBy: string,\n): Promise<MergeContactsResult> {\n\ttry {\n\t\t// Validate input with Zod\n\t\tconst validationResult = mergeContactsSchema.safeParse(input);\n\n\t\tif (!validationResult.success) {\n\t\t\tconst errorMessage = validationResult.error.issues\n\t\t\t\t.map((issue) => `${issue.path.join(\".\")}: ${issue.message}`)\n\t\t\t\t.join(\", \");\n\t\t\tthrow new ContactValidationError(\n\t\t\t\t`Validation failed: ${errorMessage}`,\n\t\t\t\tvalidationResult.error.issues\n\t\t\t);\n\t\t}\n\n\t\tconst { primaryId, duplicateIds } = input;\n\n\t\t// Fetch primary contact\n\t\tconst primaryContact = await getContact(client, primaryId);\n\t\tif (!primaryContact) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: `Primary contact not found: ${primaryId}`,\n\t\t\t};\n\t\t}\n\n\t\t// Fetch all duplicate contacts\n\t\tconst duplicateContacts: Contact[] = [];\n\t\tfor (const duplicateId of duplicateIds) {\n\t\t\tconst duplicate = await getContact(client, duplicateId);\n\t\t\tif (!duplicate) {\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: `Duplicate contact not found: ${duplicateId}`,\n\t\t\t\t};\n\t\t\t}\n\t\t\tduplicateContacts.push(duplicate);\n\t\t}\n\n\t\t// Aggregate data from duplicates\n\t\tlet totalVisits = primaryContact.totalVisits || 0;\n\t\tlet firstVisitDate = primaryContact.firstVisitDate;\n\t\tlet lastVisitDate = primaryContact.lastVisitDate;\n\t\tconst allTags = new Set<string>(primaryContact.tags || []);\n\n\t\tfor (const duplicate of duplicateContacts) {\n\t\t\t// Sum total visits\n\t\t\ttotalVisits += duplicate.totalVisits || 0;\n\n\t\t\t// Find earliest first visit date\n\t\t\tif (duplicate.firstVisitDate) {\n\t\t\t\tif (!firstVisitDate || duplicate.firstVisitDate < firstVisitDate) {\n\t\t\t\t\tfirstVisitDate = duplicate.firstVisitDate;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Find latest last visit date\n\t\t\tif (duplicate.lastVisitDate) {\n\t\t\t\tif (!lastVisitDate || duplicate.lastVisitDate > lastVisitDate) {\n\t\t\t\t\tlastVisitDate = duplicate.lastVisitDate;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Merge tags\n\t\t\tif (duplicate.tags) {\n\t\t\t\tduplicate.tags.forEach((tag) => allTags.add(tag));\n\t\t\t}\n\t\t}\n\n\t\t// Update primary contact with aggregated data\n\t\tconst updateInput: UpdateContactInput = {\n\t\t\tid: primaryId,\n\t\t\ttotalVisits,\n\t\t\tfirstVisitDate,\n\t\t\tlastVisitDate,\n\t\t\ttags: Array.from(allTags),\n\t\t\tupdatedAt: new Date().toISOString(),\n\t\t\tupdatedBy: mergedBy,\n\t\t};\n\n\t\tconst updatedPrimary = await updateContact(client, updateInput);\n\n\t\tif (!updatedPrimary) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: \"Failed to update primary contact with merged data\",\n\t\t\t};\n\t\t}\n\n\t\t// Soft delete all duplicate contacts\n\t\tconst deletedIds: string[] = [];\n\t\tfor (const duplicateId of duplicateIds) {\n\t\t\tconst deleted = await softDeleteContact(client, duplicateId, mergedBy);\n\t\t\tif (deleted) {\n\t\t\t\tdeletedIds.push(duplicateId);\n\t\t\t} else {\n\t\t\t\tconsole.error(`[mergeContacts] Failed to soft-delete duplicate: ${duplicateId}`);\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tmergedContact: updatedPrimary,\n\t\t\tdeletedIds,\n\t\t};\n\t} catch (error) {\n\t\tif (error instanceof ContactValidationError) {\n\t\t\tconsole.error(\"[mergeContacts] Validation error:\", error.message);\n\t\t\tthrow error;\n\t\t}\n\t\tconsole.error(\"[mergeContacts] Error merging contacts:\", error);\n\t\tthrow error;\n\t}\n}\n","/**\n * Contact Query Functions\n *\n * Provides query functions for fetching contact data from the GraphQL API.\n */\n\nimport type { Contact } from \"@htlkg/core/types\";\n\n/**\n * Get a single contact by ID\n *\n * @example\n * ```typescript\n * import { getContact } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const contact = await getContact(client, 'contact-123');\n * ```\n */\nexport async function getContact<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<Contact | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.Contact.get({ id });\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getContact] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as Contact;\n\t} catch (error) {\n\t\tconsole.error(\"[getContact] Error fetching contact:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List all contacts with optional filtering\n *\n * @example\n * ```typescript\n * import { listContacts } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const contacts = await listContacts(client, {\n * filter: { gdprConsent: { eq: true } },\n * limit: 50\n * });\n * ```\n */\nexport async function listContacts<TClient = any>(\n\tclient: TClient,\n\toptions?: {\n\t\tfilter?: any;\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: Contact[]; nextToken?: string }> {\n\ttry {\n\t\tconst { data, errors, nextToken } = await (\n\t\t\tclient as any\n\t\t).models.Contact.list(options);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[listContacts] GraphQL errors:\", errors);\n\t\t\treturn { items: [], nextToken: undefined };\n\t\t}\n\n\t\treturn {\n\t\t\titems: (data || []) as Contact[],\n\t\t\tnextToken,\n\t\t};\n\t} catch (error) {\n\t\tconsole.error(\"[listContacts] Error fetching contacts:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List contacts by brand ID\n *\n * @example\n * ```typescript\n * import { listContactsByBrand } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const contacts = await listContactsByBrand(client, 'brand-123');\n * ```\n */\nexport async function listContactsByBrand<TClient = any>(\n\tclient: TClient,\n\tbrandId: string,\n\toptions?: {\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: Contact[]; nextToken?: string }> {\n\treturn listContacts(client, {\n\t\tfilter: { brandId: { eq: brandId } },\n\t\t...options,\n\t});\n}\n\n/**\n * Get a contact by email within a brand\n *\n * @example\n * ```typescript\n * import { getContactByEmail } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const contact = await getContactByEmail(client, 'guest@example.com', 'brand-123');\n * ```\n */\nexport async function getContactByEmail<TClient = any>(\n\tclient: TClient,\n\temail: string,\n\tbrandId: string,\n): Promise<Contact | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.Contact.list({\n\t\t\tfilter: {\n\t\t\t\tand: [{ email: { eq: email } }, { brandId: { eq: brandId } }],\n\t\t\t},\n\t\t\tlimit: 1,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getContactByEmail] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data?.[0] as Contact | null;\n\t} catch (error) {\n\t\tconsole.error(\"[getContactByEmail] Error fetching contact:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Get a contact by phone within a brand\n *\n * @example\n * ```typescript\n * import { getContactByPhone } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const contact = await getContactByPhone(client, '+1234567890', 'brand-123');\n * ```\n */\nexport async function getContactByPhone<TClient = any>(\n\tclient: TClient,\n\tphone: string,\n\tbrandId: string,\n): Promise<Contact | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.Contact.list({\n\t\t\tfilter: {\n\t\t\t\tand: [{ phone: { eq: phone } }, { brandId: { eq: brandId } }],\n\t\t\t},\n\t\t\tlimit: 1,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getContactByPhone] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data?.[0] as Contact | null;\n\t} catch (error) {\n\t\tconsole.error(\"[getContactByPhone] Error fetching contact:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Search contacts by query string within a brand\n * Searches across email, firstName, and lastName fields\n *\n * @example\n * ```typescript\n * import { searchContacts } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const contacts = await searchContacts(client, 'john', 'brand-123');\n * ```\n */\nexport async function searchContacts<TClient = any>(\n\tclient: TClient,\n\tquery: string,\n\tbrandId: string,\n\toptions?: {\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: Contact[]; nextToken?: string }> {\n\ttry {\n\t\tconst { data, errors, nextToken } = await (\n\t\t\tclient as any\n\t\t).models.Contact.list({\n\t\t\tfilter: {\n\t\t\t\tand: [\n\t\t\t\t\t{ brandId: { eq: brandId } },\n\t\t\t\t\t{\n\t\t\t\t\t\tor: [\n\t\t\t\t\t\t\t{ email: { contains: query } },\n\t\t\t\t\t\t\t{ firstName: { contains: query } },\n\t\t\t\t\t\t\t{ lastName: { contains: query } },\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t\t...options,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[searchContacts] GraphQL errors:\", errors);\n\t\t\treturn { items: [], nextToken: undefined };\n\t\t}\n\n\t\treturn {\n\t\t\titems: (data || []) as Contact[],\n\t\t\tnextToken,\n\t\t};\n\t} catch (error) {\n\t\tconsole.error(\"[searchContacts] Error searching contacts:\", error);\n\t\tthrow error;\n\t}\n}\n"],"mappings":"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","names":[]}
|
package/dist/queries/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// src/queries/brands.ts
|
|
1
|
+
// src/queries/brands/brands.ts
|
|
2
2
|
async function getBrand(client, id) {
|
|
3
3
|
try {
|
|
4
4
|
const { data, errors } = await client.models.Brand.get({ id });
|
|
@@ -70,7 +70,7 @@ async function listActiveBrands(client, options) {
|
|
|
70
70
|
});
|
|
71
71
|
}
|
|
72
72
|
|
|
73
|
-
// src/queries/accounts.ts
|
|
73
|
+
// src/queries/accounts/accounts.ts
|
|
74
74
|
async function getAccount(client, id) {
|
|
75
75
|
try {
|
|
76
76
|
const { data, errors } = await client.models.Account.get({ id });
|
|
@@ -126,7 +126,7 @@ async function getAccountWithBrands(client, id) {
|
|
|
126
126
|
}
|
|
127
127
|
}
|
|
128
128
|
|
|
129
|
-
// src/queries/users.ts
|
|
129
|
+
// src/queries/users/users.ts
|
|
130
130
|
async function getUser(client, id) {
|
|
131
131
|
try {
|
|
132
132
|
const { data, errors } = await client.models.User.get({ id });
|
|
@@ -203,7 +203,7 @@ async function listActiveUsers(client, options) {
|
|
|
203
203
|
});
|
|
204
204
|
}
|
|
205
205
|
|
|
206
|
-
// src/queries/products.ts
|
|
206
|
+
// src/queries/products/products.ts
|
|
207
207
|
async function getProduct(client, id) {
|
|
208
208
|
try {
|
|
209
209
|
const { data, errors } = await client.models.Product.get({ id });
|
|
@@ -426,7 +426,7 @@ function checkRestoreEligibility(deletedAt, retentionDays) {
|
|
|
426
426
|
};
|
|
427
427
|
}
|
|
428
428
|
|
|
429
|
-
// src/queries/reservations.ts
|
|
429
|
+
// src/queries/reservations/reservations.ts
|
|
430
430
|
async function getReservation2(client, id) {
|
|
431
431
|
try {
|
|
432
432
|
const { data, errors } = await client.models.Reservation.get({ id });
|