@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.
- package/dist/client/index.d.ts +257 -1
- package/dist/client/index.js +59 -1
- package/dist/client/index.js.map +1 -1
- package/dist/common-DSxswsZ3.d.ts +40 -0
- package/dist/hooks/index.d.ts +75 -9
- package/dist/hooks/index.js +135 -35
- package/dist/hooks/index.js.map +1 -1
- package/dist/index.d.ts +6 -3
- package/dist/index.js +355 -15
- package/dist/index.js.map +1 -1
- package/dist/mutations/index.d.ts +17 -12
- package/dist/mutations/index.js +204 -2
- package/dist/mutations/index.js.map +1 -1
- package/dist/{productInstances-3LDgCZSO.d.ts → productInstances-BpQv1oLS.d.ts} +3 -7
- package/dist/queries/index.d.ts +3 -0
- package/dist/queries/index.js +82 -0
- package/dist/queries/index.js.map +1 -1
- package/dist/reservations-C0FNm__0.d.ts +154 -0
- package/dist/reservations-CdDfkcZ_.d.ts +172 -0
- package/package.json +3 -3
- package/src/client/index.ts +18 -0
- package/src/client/reservations.ts +336 -0
- package/src/hooks/createDataHook.test.ts +534 -0
- package/src/hooks/createDataHook.ts +20 -13
- package/src/hooks/index.ts +1 -0
- package/src/hooks/useReservations.ts +145 -0
- package/src/mutations/accounts.ts +5 -2
- package/src/mutations/brands.ts +5 -4
- package/src/mutations/common.ts +41 -0
- package/src/mutations/index.ts +22 -0
- package/src/mutations/productInstances/productInstances.test.ts +3 -3
- package/src/mutations/productInstances/productInstances.ts +7 -9
- package/src/mutations/reservations.test.ts +459 -0
- package/src/mutations/reservations.ts +452 -0
- package/src/mutations/users.ts +5 -4
- package/src/queries/index.ts +11 -0
- package/src/queries/reservations.test.ts +374 -0
- 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-
|
|
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 };
|
package/dist/mutations/index.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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":[]}
|