@htlkg/data 0.0.18 → 0.0.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/dist/client/index.d.ts +257 -1
  2. package/dist/client/index.js +59 -1
  3. package/dist/client/index.js.map +1 -1
  4. package/dist/common-DSxswsZ3.d.ts +40 -0
  5. package/dist/hooks/index.d.ts +75 -9
  6. package/dist/hooks/index.js +135 -35
  7. package/dist/hooks/index.js.map +1 -1
  8. package/dist/index.d.ts +6 -3
  9. package/dist/index.js +355 -15
  10. package/dist/index.js.map +1 -1
  11. package/dist/mutations/index.d.ts +17 -12
  12. package/dist/mutations/index.js +204 -2
  13. package/dist/mutations/index.js.map +1 -1
  14. package/dist/{productInstances-3LDgCZSO.d.ts → productInstances-BpQv1oLS.d.ts} +3 -7
  15. package/dist/queries/index.d.ts +3 -0
  16. package/dist/queries/index.js +82 -0
  17. package/dist/queries/index.js.map +1 -1
  18. package/dist/reservations-C0FNm__0.d.ts +154 -0
  19. package/dist/reservations-CdDfkcZ_.d.ts +172 -0
  20. package/package.json +3 -3
  21. package/src/client/index.ts +18 -0
  22. package/src/client/reservations.ts +336 -0
  23. package/src/hooks/createDataHook.test.ts +534 -0
  24. package/src/hooks/createDataHook.ts +20 -13
  25. package/src/hooks/index.ts +1 -0
  26. package/src/hooks/useReservations.ts +145 -0
  27. package/src/mutations/accounts.ts +5 -2
  28. package/src/mutations/brands.ts +5 -4
  29. package/src/mutations/common.ts +41 -0
  30. package/src/mutations/index.ts +22 -0
  31. package/src/mutations/productInstances/productInstances.test.ts +3 -3
  32. package/src/mutations/productInstances/productInstances.ts +7 -9
  33. package/src/mutations/reservations.test.ts +459 -0
  34. package/src/mutations/reservations.ts +452 -0
  35. package/src/mutations/users.ts +5 -4
  36. package/src/queries/index.ts +11 -0
  37. package/src/queries/reservations.test.ts +374 -0
  38. package/src/queries/reservations.ts +247 -0
@@ -1,5 +1,8 @@
1
+ import { C as CreateAuditFields, a as UpdateWithSoftDeleteFields } from '../common-DSxswsZ3.js';
2
+ export { S as SoftDeleteFields, U as UpdateAuditFields } from '../common-DSxswsZ3.js';
1
3
  import { Brand, Account, User, SystemSettings } from '@htlkg/core/types';
2
- export { C as CreateProductInstanceInput, U as UpdateProductInstanceInput, c as createProductInstance, d as deleteProductInstance, t as toggleProductInstanceEnabled, u as updateProductInstance } from '../productInstances-3LDgCZSO.js';
4
+ export { C as CreateProductInstanceInput, U as UpdateProductInstanceInput, c as createProductInstance, d as deleteProductInstance, t as toggleProductInstanceEnabled, u as updateProductInstance } from '../productInstances-BpQv1oLS.js';
5
+ export { C as CreateReservationInput, b as ReservationStatus, R as ReservationValidationError, U as UpdateReservationInput, c as createReservation, d as deleteReservation, r as restoreReservation, s as softDeleteReservation, u as updateReservation, a as updateReservationStatus } from '../reservations-CdDfkcZ_.js';
3
6
 
4
7
  /**
5
8
  * Brand Mutation Functions
@@ -10,23 +13,23 @@ export { C as CreateProductInstanceInput, U as UpdateProductInstanceInput, c as
10
13
  /**
11
14
  * Input type for creating a brand
12
15
  */
13
- interface CreateBrandInput {
16
+ interface CreateBrandInput extends CreateAuditFields {
14
17
  accountId: string;
15
18
  name: string;
16
19
  logo?: string;
17
20
  timezone?: string;
18
- status?: "active" | "inactive" | "maintenance" | "suspended";
21
+ status?: "active" | "inactive" | "maintenance" | "suspended" | "deleted";
19
22
  settings?: Record<string, any>;
20
23
  }
21
24
  /**
22
25
  * Input type for updating a brand
23
26
  */
24
- interface UpdateBrandInput {
27
+ interface UpdateBrandInput extends UpdateWithSoftDeleteFields {
25
28
  id: string;
26
29
  name?: string;
27
30
  logo?: string;
28
31
  timezone?: string;
29
- status?: "active" | "inactive" | "maintenance" | "suspended";
32
+ status?: "active" | "inactive" | "maintenance" | "suspended" | "deleted";
30
33
  settings?: Record<string, any>;
31
34
  }
32
35
  /**
@@ -120,21 +123,23 @@ declare function deleteBrand<TClient = any>(client: TClient, id: string): Promis
120
123
  /**
121
124
  * Input type for creating an account
122
125
  */
123
- interface CreateAccountInput {
126
+ interface CreateAccountInput extends CreateAuditFields {
124
127
  name: string;
125
128
  logo?: string;
126
129
  subscription?: Record<string, any>;
127
130
  settings?: Record<string, any>;
131
+ status?: "active" | "inactive" | "deleted";
128
132
  }
129
133
  /**
130
134
  * Input type for updating an account
131
135
  */
132
- interface UpdateAccountInput {
136
+ interface UpdateAccountInput extends UpdateWithSoftDeleteFields {
133
137
  id: string;
134
138
  name?: string;
135
139
  logo?: string;
136
140
  subscription?: Record<string, any>;
137
141
  settings?: Record<string, any>;
142
+ status?: "active" | "inactive" | "deleted";
138
143
  }
139
144
  /**
140
145
  * Create a new account
@@ -224,26 +229,26 @@ declare function deleteAccount<TClient = any>(client: TClient, id: string): Prom
224
229
  /**
225
230
  * Input type for creating a user
226
231
  */
227
- interface CreateUserInput {
232
+ interface CreateUserInput extends CreateAuditFields {
228
233
  cognitoId: string;
229
234
  email: string;
230
235
  accountId: string;
231
236
  brandIds?: string[];
232
237
  roles?: string[];
233
238
  permissions?: Record<string, any>;
234
- status?: "active" | "inactive" | "pending" | "suspended";
239
+ status?: "active" | "inactive" | "pending" | "suspended" | "deleted";
235
240
  }
236
241
  /**
237
242
  * Input type for updating a user
238
243
  */
239
- interface UpdateUserInput {
244
+ interface UpdateUserInput extends UpdateWithSoftDeleteFields {
240
245
  id: string;
241
246
  email?: string;
242
247
  brandIds?: string[];
243
248
  roles?: string[];
244
249
  permissions?: Record<string, any>;
245
250
  lastLogin?: string;
246
- status?: "active" | "inactive" | "pending" | "suspended";
251
+ status?: "active" | "inactive" | "pending" | "suspended" | "deleted";
247
252
  }
248
253
  /**
249
254
  * Create a new user
@@ -372,4 +377,4 @@ declare function updateSystemSettings<TClient = any>(client: TClient, input: Upd
372
377
  */
373
378
  declare function initializeSystemSettings<TClient = any>(client: TClient, initializedBy: string): Promise<SystemSettings | null>;
374
379
 
375
- export { type CreateAccountInput, type CreateBrandInput, type CreateUserInput, type UpdateAccountInput, type UpdateBrandInput, type UpdateSystemSettingsInput, type UpdateUserInput, createAccount, createBrand, createUser, deleteAccount, deleteBrand, deleteUser, initializeSystemSettings, restoreAccount, restoreBrand, restoreUser, softDeleteAccount, softDeleteBrand, softDeleteUser, updateAccount, updateBrand, updateSystemSettings, updateUser };
380
+ export { type CreateAccountInput, CreateAuditFields, type CreateBrandInput, type CreateUserInput, type UpdateAccountInput, type UpdateBrandInput, type UpdateSystemSettingsInput, type UpdateUserInput, UpdateWithSoftDeleteFields, createAccount, createBrand, createUser, deleteAccount, deleteBrand, deleteUser, initializeSystemSettings, restoreAccount, restoreBrand, restoreUser, softDeleteAccount, softDeleteBrand, softDeleteUser, updateAccount, updateBrand, updateSystemSettings, updateUser };
@@ -314,6 +314,7 @@ async function getUserIdentifier(fallback = "system") {
314
314
  async function createProductInstance(client, input) {
315
315
  try {
316
316
  const userIdentifier = input.createdBy || input.updatedBy || await getUserIdentifier();
317
+ const timestamp = input.createdAt || getCurrentTimestamp();
317
318
  const createInput = {
318
319
  productId: input.productId,
319
320
  productName: input.productName,
@@ -321,8 +322,9 @@ async function createProductInstance(client, input) {
321
322
  accountId: input.accountId,
322
323
  enabled: input.enabled,
323
324
  version: input.version,
325
+ createdAt: timestamp,
324
326
  createdBy: userIdentifier,
325
- lastUpdated: input.lastUpdated || getCurrentTimestamp(),
327
+ updatedAt: input.updatedAt || timestamp,
326
328
  updatedBy: userIdentifier
327
329
  };
328
330
  if (input.config) {
@@ -358,7 +360,7 @@ async function updateProductInstance(client, input) {
358
360
  try {
359
361
  const updateInput = {
360
362
  ...input,
361
- lastUpdated: input.lastUpdated || getCurrentTimestamp(),
363
+ updatedAt: input.updatedAt || getCurrentTimestamp(),
362
364
  updatedBy: input.updatedBy || await getUserIdentifier()
363
365
  };
364
366
  if (input.config) {
@@ -507,26 +509,226 @@ async function initializeSystemSettings(client, initializedBy) {
507
509
  throw error;
508
510
  }
509
511
  }
512
+
513
+ // src/mutations/reservations.ts
514
+ var STATUS_TRANSITIONS = {
515
+ confirmed: ["checked_in", "cancelled", "no_show"],
516
+ checked_in: ["checked_out", "cancelled"],
517
+ checked_out: [],
518
+ // Terminal state - no transitions allowed
519
+ cancelled: [],
520
+ // Terminal state - no transitions allowed
521
+ no_show: []
522
+ // Terminal state - no transitions allowed
523
+ };
524
+ var ReservationValidationError = class extends Error {
525
+ constructor(message) {
526
+ super(message);
527
+ this.name = "ReservationValidationError";
528
+ }
529
+ };
530
+ function validateDates(checkIn, checkOut) {
531
+ const checkInDate = new Date(checkIn);
532
+ const checkOutDate = new Date(checkOut);
533
+ if (isNaN(checkInDate.getTime())) {
534
+ throw new ReservationValidationError("Invalid check-in date");
535
+ }
536
+ if (isNaN(checkOutDate.getTime())) {
537
+ throw new ReservationValidationError("Invalid check-out date");
538
+ }
539
+ if (checkOutDate <= checkInDate) {
540
+ throw new ReservationValidationError(
541
+ "Check-out date must be after check-in date"
542
+ );
543
+ }
544
+ const minStayHours = 4;
545
+ const stayDuration = checkOutDate.getTime() - checkInDate.getTime();
546
+ const hoursDiff = stayDuration / (1e3 * 60 * 60);
547
+ if (hoursDiff < minStayHours) {
548
+ throw new ReservationValidationError(
549
+ `Minimum stay is ${minStayHours} hours`
550
+ );
551
+ }
552
+ }
553
+ function validateStatusTransition(currentStatus, newStatus) {
554
+ const allowedTransitions = STATUS_TRANSITIONS[currentStatus];
555
+ if (!allowedTransitions.includes(newStatus)) {
556
+ throw new ReservationValidationError(
557
+ `Invalid status transition from '${currentStatus}' to '${newStatus}'. Allowed transitions: ${allowedTransitions.length > 0 ? allowedTransitions.join(", ") : "none (terminal state)"}`
558
+ );
559
+ }
560
+ }
561
+ async function createReservation(client, input) {
562
+ try {
563
+ validateDates(input.checkIn, input.checkOut);
564
+ if (!input.nights) {
565
+ const checkInDate = new Date(input.checkIn);
566
+ const checkOutDate = new Date(input.checkOut);
567
+ const diffTime = checkOutDate.getTime() - checkInDate.getTime();
568
+ const diffDays = Math.ceil(diffTime / (1e3 * 60 * 60 * 24));
569
+ input.nights = diffDays;
570
+ }
571
+ const { data, errors } = await client.models.Reservation.create(input);
572
+ if (errors) {
573
+ console.error("[createReservation] GraphQL errors:", errors);
574
+ return null;
575
+ }
576
+ return data;
577
+ } catch (error) {
578
+ if (error instanceof ReservationValidationError) {
579
+ console.error("[createReservation] Validation error:", error.message);
580
+ throw error;
581
+ }
582
+ console.error("[createReservation] Error creating reservation:", error);
583
+ throw error;
584
+ }
585
+ }
586
+ async function updateReservation(client, input) {
587
+ try {
588
+ if (input.checkIn && input.checkOut) {
589
+ validateDates(input.checkIn, input.checkOut);
590
+ const checkInDate = new Date(input.checkIn);
591
+ const checkOutDate = new Date(input.checkOut);
592
+ const diffTime = checkOutDate.getTime() - checkInDate.getTime();
593
+ const diffDays = Math.ceil(diffTime / (1e3 * 60 * 60 * 24));
594
+ input.nights = diffDays;
595
+ }
596
+ if (input.status) {
597
+ const { data: currentReservation, errors: getErrors } = await client.models.Reservation.get({ id: input.id });
598
+ if (getErrors || !currentReservation) {
599
+ console.error("[updateReservation] Error fetching current reservation:", getErrors);
600
+ return null;
601
+ }
602
+ const currentStatus = currentReservation.status;
603
+ validateStatusTransition(currentStatus, input.status);
604
+ }
605
+ const { data, errors } = await client.models.Reservation.update(input);
606
+ if (errors) {
607
+ console.error("[updateReservation] GraphQL errors:", errors);
608
+ return null;
609
+ }
610
+ return data;
611
+ } catch (error) {
612
+ if (error instanceof ReservationValidationError) {
613
+ console.error("[updateReservation] Validation error:", error.message);
614
+ throw error;
615
+ }
616
+ console.error("[updateReservation] Error updating reservation:", error);
617
+ throw error;
618
+ }
619
+ }
620
+ async function softDeleteReservation(client, id, deletedBy) {
621
+ try {
622
+ const { errors } = await client.models.Reservation.update({
623
+ id,
624
+ deletedAt: (/* @__PURE__ */ new Date()).toISOString(),
625
+ deletedBy
626
+ });
627
+ if (errors) {
628
+ console.error("[softDeleteReservation] GraphQL errors:", errors);
629
+ return false;
630
+ }
631
+ return true;
632
+ } catch (error) {
633
+ console.error("[softDeleteReservation] Error soft-deleting reservation:", error);
634
+ throw error;
635
+ }
636
+ }
637
+ async function restoreReservation(client, id, retentionDays = DEFAULT_SOFT_DELETE_RETENTION_DAYS) {
638
+ try {
639
+ const { data: reservation, errors: getErrors } = await client.models.Reservation.get({ id });
640
+ if (getErrors || !reservation) {
641
+ console.error("[restoreReservation] Error fetching reservation:", getErrors);
642
+ return { success: false, error: "Reservation not found" };
643
+ }
644
+ const eligibility = checkRestoreEligibility(reservation.deletedAt, retentionDays);
645
+ if (!eligibility.canRestore) {
646
+ const errorMsg = `Cannot restore reservation. Retention period of ${retentionDays} days has expired. Item was deleted ${eligibility.daysExpired} days ago.`;
647
+ console.error("[restoreReservation]", errorMsg);
648
+ return { success: false, error: errorMsg };
649
+ }
650
+ const { errors } = await client.models.Reservation.update({
651
+ id,
652
+ deletedAt: null,
653
+ deletedBy: null
654
+ });
655
+ if (errors) {
656
+ console.error("[restoreReservation] GraphQL errors:", errors);
657
+ return { success: false, error: "Failed to restore reservation" };
658
+ }
659
+ return { success: true };
660
+ } catch (error) {
661
+ console.error("[restoreReservation] Error restoring reservation:", error);
662
+ throw error;
663
+ }
664
+ }
665
+ async function deleteReservation(client, id) {
666
+ try {
667
+ const { errors } = await client.models.Reservation.delete({ id });
668
+ if (errors) {
669
+ console.error("[deleteReservation] GraphQL errors:", errors);
670
+ return false;
671
+ }
672
+ return true;
673
+ } catch (error) {
674
+ console.error("[deleteReservation] Error deleting reservation:", error);
675
+ throw error;
676
+ }
677
+ }
678
+ async function updateReservationStatus(client, id, newStatus) {
679
+ try {
680
+ const { data: currentReservation, errors: getErrors } = await client.models.Reservation.get({ id });
681
+ if (getErrors || !currentReservation) {
682
+ console.error("[updateReservationStatus] Error fetching reservation:", getErrors);
683
+ return null;
684
+ }
685
+ const currentStatus = currentReservation.status;
686
+ validateStatusTransition(currentStatus, newStatus);
687
+ const { data, errors } = await client.models.Reservation.update({
688
+ id,
689
+ status: newStatus
690
+ });
691
+ if (errors) {
692
+ console.error("[updateReservationStatus] GraphQL errors:", errors);
693
+ return null;
694
+ }
695
+ return data;
696
+ } catch (error) {
697
+ if (error instanceof ReservationValidationError) {
698
+ console.error("[updateReservationStatus] Validation error:", error.message);
699
+ throw error;
700
+ }
701
+ console.error("[updateReservationStatus] Error updating status:", error);
702
+ throw error;
703
+ }
704
+ }
510
705
  export {
706
+ ReservationValidationError,
511
707
  createAccount,
512
708
  createBrand,
513
709
  createProductInstance,
710
+ createReservation,
514
711
  createUser,
515
712
  deleteAccount,
516
713
  deleteBrand,
517
714
  deleteProductInstance,
715
+ deleteReservation,
518
716
  deleteUser,
519
717
  initializeSystemSettings,
520
718
  restoreAccount,
521
719
  restoreBrand,
720
+ restoreReservation,
522
721
  restoreUser,
523
722
  softDeleteAccount,
524
723
  softDeleteBrand,
724
+ softDeleteReservation,
525
725
  softDeleteUser,
526
726
  toggleProductInstanceEnabled,
527
727
  updateAccount,
528
728
  updateBrand,
529
729
  updateProductInstance,
730
+ updateReservation,
731
+ updateReservationStatus,
530
732
  updateSystemSettings,
531
733
  updateUser
532
734
  };
@@ -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"],"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\";\n\n/**\n * Input type for creating a brand\n */\nexport interface CreateBrandInput {\n\taccountId: string;\n\tname: string;\n\tlogo?: string;\n\ttimezone?: string;\n\tstatus?: \"active\" | \"inactive\" | \"maintenance\" | \"suspended\";\n\tsettings?: Record<string, any>;\n}\n\n/**\n * Input type for updating a brand\n */\nexport interface UpdateBrandInput {\n\tid: string;\n\tname?: string;\n\tlogo?: string;\n\ttimezone?: string;\n\tstatus?: \"active\" | \"inactive\" | \"maintenance\" | \"suspended\";\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\";\n\n/**\n * Input type for creating an account\n */\nexport interface CreateAccountInput {\n\tname: string;\n\tlogo?: string;\n\tsubscription?: Record<string, any>;\n\tsettings?: Record<string, any>;\n}\n\n/**\n * Input type for updating an account\n */\nexport interface UpdateAccountInput {\n\tid: string;\n\tname?: string;\n\tlogo?: string;\n\tsubscription?: Record<string, any>;\n\tsettings?: Record<string, any>;\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\";\n\n/**\n * Input type for creating a user\n */\nexport interface CreateUserInput {\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\";\n}\n\n/**\n * Input type for updating a user\n */\nexport interface UpdateUserInput {\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\";\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\";\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 {\n\tproductId: string;\n\tbrandId: string;\n\taccountId: string;\n\tproductName: string;\n\tenabled: boolean;\n\tconfig?: Record<string, any>;\n\tversion?: string;\n\tcreatedBy?: string;\n\tlastUpdated?: string;\n\tupdatedBy?: string;\n}\n\n/**\n * Input type for updating a product instance\n */\nexport interface UpdateProductInstanceInput {\n\tid: string;\n\tenabled?: boolean;\n\tconfig?: Record<string, any>;\n\tversion?: string;\n\tlastUpdated?: string;\n\tupdatedBy?: 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 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\tcreatedBy: userIdentifier,\n\t\t\tlastUpdated: input.lastUpdated || getCurrentTimestamp(),\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\tlastUpdated: input.lastUpdated || 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"],"mappings":"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","names":[]}
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"],"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"],"mappings":"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","names":[]}