@htlkg/data 0.0.23 → 0.0.25

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/index.d.ts CHANGED
@@ -1,11 +1,11 @@
1
1
  export { AstroAmplifyConfig, GraphQLResponse, Operation, ProxyOptions, generateClient, generateServerClient, getErrorMessage, getSharedClient, hasErrors, mutate, query, resetSharedClient } from './client/index.js';
2
- export { DEFAULT_SOFT_DELETE_RETENTION_DAYS, SYSTEM_SETTINGS_KEY, checkRestoreEligibility, executePublicQuery, executeServerQuery, getAccount, getAccountWithBrands, getBrand, getBrandWithProducts, getContact, getContactByEmail, getContactByPhone, getProduct, getProductInstance, getSoftDeleteRetentionDays, getSystemSettings, getUser, getUserByCognitoId, getUserByEmail, listAccounts, listActiveBrands, listActiveProducts, listActiveUsers, listBrands, listBrandsByAccount, listContacts, listContactsByBrand, listEnabledProductInstancesByBrand, listProductInstancesByAccount, listProductInstancesByBrand, listProducts, listUsers, listUsersByAccount, searchContacts } from './queries/index.js';
2
+ export { DEFAULT_SOFT_DELETE_RETENTION_DAYS, SYSTEM_SETTINGS_KEY, checkRestoreEligibility, executePublicQuery, executeServerQuery, getAccount, getAccountWithBrands, getBrand, getBrandWithProducts, getContact, getContactByEmail, getContactByPhone, getProduct, getProductInstance, getSoftDeleteRetentionDays, getSystemSettings, getUser, getUserByCognitoId, getUserByEmail, listAccounts, listActiveBrands, listActiveProducts, listActiveUsers, listActivityLogs, listActivityLogsByAccount, listActivityLogsByBrand, listBrands, listBrandsByAccount, listContacts, listContactsByBrand, listEnabledProductInstancesByBrand, listProductInstancesByAccount, listProductInstancesByBrand, listProducts, listRecentActivityLogs, listUsers, listUsersByAccount, searchContacts } from './queries/index.js';
3
3
  export { R as Reservation, g as getReservation, d as getReservationByConfirmation, l as listReservations, a as listReservationsByBrand, b as listReservationsByContact, c as listReservationsByDateRange } from './reservations-C0FNm__0.js';
4
4
  export { C as CreateAuditFields, S as SoftDeleteFields, U as UpdateAuditFields, a as UpdateWithSoftDeleteFields } from './common-DSxswsZ3.js';
5
- export { ContactValidationError, CreateAccountInput, CreateBrandInput, CreateContactInput, CreateUserInput, MergeContactsInput, MergeContactsResult, UpdateAccountInput, UpdateBrandInput, UpdateContactInput, UpdateSystemSettingsInput, UpdateUserInput, createAccount, createBrand, createContact, createContactSchema, createUser, deleteAccount, deleteBrand, deleteContact, deleteUser, initializeSystemSettings, mergeContacts, mergeContactsSchema, restoreAccount, restoreBrand, restoreContact, restoreUser, softDeleteAccount, softDeleteBrand, softDeleteContact, softDeleteUser, updateAccount, updateBrand, updateContact, updateContactSchema, updateSystemSettings, updateUser } from './mutations/index.js';
5
+ export { ai as BulkImportContactInput, al as CommunicationPreferences, aj as ContactPreferences, D as ContactValidationError, h as CreateAccountInput, C as CreateBrandInput, H as CreateContactInput, o as CreateUserInput, ag as CustomFieldDefinition, a0 as CustomFieldType, af as CustomFieldTypeValue, M as MergeContactsInput, J as MergeContactsResult, ak as NotificationPreferences, ah as SearchContactInput, i as UpdateAccountInput, U as UpdateBrandInput, I as UpdateContactInput, v as UpdateSystemSettingsInput, p as UpdateUserInput, Z as brandIdSchema, a7 as bulkImportContactSchema, a5 as communicationPreferencesSchema, a3 as contactPreferencesSchema, a as createAccount, c as createBrand, w as createContact, E as createContactSchema, a2 as createCustomFieldValueSchema, j as createUser, a1 as customFieldDefinitionSchema, e as deleteAccount, d as deleteBrand, y as deleteContact, l as deleteUser, K as emailSchema, P as firstNameSchema, ad as formatValidationErrors, ae as getValidationErrorDetails, t as initializeSystemSettings, W as isoDateStringSchema, Q as lastNameSchema, T as localeSchema, B as mergeContacts, G as mergeContactsSchema, a4 as notificationPreferencesSchema, L as optionalEmailSchema, R as optionalFirstNameSchema, X as optionalIsoDateStringSchema, S as optionalLastNameSchema, V as optionalLocaleSchema, O as optionalPhoneSchema, N as phoneSchema, g as restoreAccount, r as restoreBrand, A as restoreContact, n as restoreUser, a6 as searchContactSchema, f as softDeleteAccount, s as softDeleteBrand, z as softDeleteContact, m as softDeleteUser, _ as tagSchema, $ as tagsArraySchema, b as updateAccount, u as updateBrand, x as updateContact, F as updateContactSchema, q as updateSystemSettings, k as updateUser, Y as uuidSchema, aa as validateContactName, ab as validateCreateContact, a8 as validateEmail, a9 as validatePhone, ac as validateUpdateContact } from './index-ZmmFz38a.js';
6
6
  export { C as CreateProductInstanceInput, U as UpdateProductInstanceInput, c as createProductInstance, d as deleteProductInstance, t as toggleProductInstanceEnabled, u as updateProductInstance } from './productInstances-BpQv1oLS.js';
7
7
  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';
8
- export { ACTIVE_FILTER, AccountWithBrands, BaseHookOptions, BrandWithCounts, ContactWithRelations, CreateDataHookOptions, CreatePaginatedDataHookOptions, DELETED_FILTER, DataHookReturn, InferHookReturn, InferPaginatedHookReturn, AccountWithBrands as PaginatedAccountWithBrands, PaginatedDataHookReturn, PaginatedHookOptions, PaginationState, ReservationWithRelations, UseAccountsOptions, UseAccountsReturn, UseBrandsOptions, UseBrandsReturn, UseContactsOptions, UseContactsReturn, UsePaginatedAccountsOptions, UsePaginatedAccountsReturn, UsePaginatedBrandsOptions, UsePaginatedBrandsReturn, UsePaginatedContactsOptions, UsePaginatedContactsReturn, UsePaginatedReservationsOptions, UsePaginatedReservationsReturn, UsePaginatedUsersOptions, UsePaginatedUsersReturn, UseProductInstancesOptions, UseProductInstancesReturn, UseProductsOptions, UseProductsReturn, UseReservationsOptions, UseReservationsReturn, UseUsersOptions, UseUsersReturn, UserWithRelations, createDataHook, createPaginatedDataHook, resetClientInstance, useAccounts, useActiveAccounts, useActiveBrands, useActiveContacts, useActiveReservations, useActiveUsers, useBrands, useContacts, useDeletedAccounts, useDeletedBrands, useDeletedContacts, useDeletedReservations, useDeletedUsers, useProductInstances, useProducts, useReservations, useUsers } from './hooks/index.js';
8
+ export { ACTIVE_FILTER, AccountWithBrands, BaseHookOptions, BrandWithCounts, ContactWithRelations, CreateDataHookOptions, CreatePaginatedDataHookOptions, DELETED_FILTER, DataHookReturn, InferHookReturn, InferPaginatedHookReturn, AccountWithBrands as PaginatedAccountWithBrands, PaginatedDataHookReturn, PaginatedHookOptions, PaginationState, ReservationWithRelations, UseAccountsOptions, UseAccountsReturn, UseActivityLogsOptions, UseActivityLogsReturn, UseBrandsOptions, UseBrandsReturn, UseContactsOptions, UseContactsReturn, UsePaginatedAccountsOptions, UsePaginatedAccountsReturn, UsePaginatedBrandsOptions, UsePaginatedBrandsReturn, UsePaginatedContactsOptions, UsePaginatedContactsReturn, UsePaginatedReservationsOptions, UsePaginatedReservationsReturn, UsePaginatedUsersOptions, UsePaginatedUsersReturn, UseProductInstancesOptions, UseProductInstancesReturn, UseProductsOptions, UseProductsReturn, UseReservationsOptions, UseReservationsReturn, UseUsersOptions, UseUsersReturn, UserWithRelations, createDataHook, createPaginatedDataHook, resetClientInstance, useAccounts, useActiveAccounts, useActiveBrands, useActiveContacts, useActiveReservations, useActiveUsers, useActivityLogs, useBrands, useContacts, useDeletedAccounts, useDeletedBrands, useDeletedContacts, useDeletedReservations, useDeletedUsers, useProductInstances, useProducts, useReservations, useUsers } from './hooks/index.js';
9
9
  export { InferStoreType, ResourceStores, StoreConfig, createResourceStores, createSingleStore, createStore } from './stores/index.js';
10
10
  import 'aws-amplify/data';
11
11
  import 'aws-amplify';
package/dist/index.js CHANGED
@@ -666,6 +666,45 @@ async function searchContacts(client, query2, brandId, options) {
666
666
  }
667
667
  }
668
668
 
669
+ // src/queries/activityLogs.ts
670
+ async function listActivityLogs(client, options) {
671
+ try {
672
+ const { data, errors, nextToken } = await client.models.ActivityLog.list(options);
673
+ if (errors) {
674
+ console.error("[listActivityLogs] GraphQL errors:", errors);
675
+ return { items: [], nextToken: void 0 };
676
+ }
677
+ return {
678
+ items: data || [],
679
+ nextToken
680
+ };
681
+ } catch (error) {
682
+ console.error("[listActivityLogs] Error:", error);
683
+ throw error;
684
+ }
685
+ }
686
+ async function listActivityLogsByAccount(client, accountId, options) {
687
+ return listActivityLogs(client, {
688
+ filter: { accountId: { eq: accountId } },
689
+ ...options
690
+ });
691
+ }
692
+ async function listActivityLogsByBrand(client, brandId, options) {
693
+ return listActivityLogs(client, {
694
+ filter: { brandId: { eq: brandId } },
695
+ ...options
696
+ });
697
+ }
698
+ async function listRecentActivityLogs(client, options) {
699
+ const { items } = await listActivityLogs(client, {
700
+ filter: options?.filter,
701
+ limit: options?.limit || 20
702
+ });
703
+ return items.sort(
704
+ (a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()
705
+ );
706
+ }
707
+
669
708
  // src/mutations/brands/brands.ts
670
709
  async function createBrand(client, input) {
671
710
  try {
@@ -1337,57 +1376,261 @@ async function updateReservationStatus2(client, id, newStatus) {
1337
1376
  }
1338
1377
  }
1339
1378
 
1340
- // src/mutations/contacts.ts
1379
+ // src/validation/contact.schemas.ts
1341
1380
  import { z } from "zod";
1342
- var createContactSchema = z.object({
1343
- brandId: z.string().min(1, "Brand ID is required"),
1344
- email: z.string().email("Invalid email address"),
1345
- phone: z.string().optional(),
1346
- firstName: z.string().min(1, "First name is required"),
1347
- lastName: z.string().min(1, "Last name is required"),
1348
- locale: z.string().optional(),
1349
- gdprConsent: z.boolean(),
1350
- gdprConsentDate: z.string().optional(),
1381
+ var emailSchema = z.string().trim().toLowerCase().email("Invalid email address").max(254, "Email must not exceed 254 characters");
1382
+ var optionalEmailSchema = z.string().trim().toLowerCase().email("Invalid email address").max(254, "Email must not exceed 254 characters").optional();
1383
+ var PHONE_REGEX = /^[\+]?[(]?[0-9]{1,4}[)]?[-\s\.]?[(]?[0-9]{1,3}[)]?[-\s\.]?[0-9]{1,4}[-\s\.]?[0-9]{1,4}[-\s\.]?[0-9]{0,9}$/;
1384
+ var phoneSchema = z.string().trim().min(7, "Phone number must be at least 7 characters").max(20, "Phone number must not exceed 20 characters").regex(PHONE_REGEX, "Invalid phone number format");
1385
+ var optionalPhoneSchema = z.string().trim().optional().refine(
1386
+ (val) => {
1387
+ if (!val || val === "") return true;
1388
+ return PHONE_REGEX.test(val) && val.length >= 7 && val.length <= 20;
1389
+ },
1390
+ { message: "Invalid phone number format" }
1391
+ );
1392
+ var NAME_REGEX = /^[\p{L}\s\-'\.]+$/u;
1393
+ var firstNameSchema = z.string().trim().min(1, "First name is required").max(100, "First name must not exceed 100 characters").regex(NAME_REGEX, "First name contains invalid characters");
1394
+ var lastNameSchema = z.string().trim().min(1, "Last name is required").max(100, "Last name must not exceed 100 characters").regex(NAME_REGEX, "Last name contains invalid characters");
1395
+ var optionalFirstNameSchema = z.string().trim().min(1, "First name cannot be empty if provided").max(100, "First name must not exceed 100 characters").regex(NAME_REGEX, "First name contains invalid characters").optional();
1396
+ var optionalLastNameSchema = z.string().trim().min(1, "Last name cannot be empty if provided").max(100, "Last name must not exceed 100 characters").regex(NAME_REGEX, "Last name contains invalid characters").optional();
1397
+ var LOCALE_REGEX = /^[a-z]{2,3}(-[A-Z][a-z]{3})?(-([A-Z]{2}|[0-9]{3}))?$/;
1398
+ var localeSchema = z.string().regex(LOCALE_REGEX, "Invalid locale format. Use BCP 47 format (e.g., 'en', 'en-US', 'pt-BR')");
1399
+ var optionalLocaleSchema = z.string().regex(LOCALE_REGEX, "Invalid locale format. Use BCP 47 format (e.g., 'en', 'en-US', 'pt-BR')").optional();
1400
+ var ISO_DATE_REGEX = /^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d{1,3})?(Z|[+-]\d{2}:\d{2})?)?$/;
1401
+ var isoDateStringSchema = z.string().refine(
1402
+ (val) => {
1403
+ if (!ISO_DATE_REGEX.test(val)) return false;
1404
+ const date = new Date(val);
1405
+ return !isNaN(date.getTime());
1406
+ },
1407
+ { message: "Invalid date format. Use ISO 8601 format (e.g., '2024-01-15T10:30:00Z')" }
1408
+ );
1409
+ var optionalIsoDateStringSchema = z.string().refine(
1410
+ (val) => {
1411
+ if (!ISO_DATE_REGEX.test(val)) return false;
1412
+ const date = new Date(val);
1413
+ return !isNaN(date.getTime());
1414
+ },
1415
+ { message: "Invalid date format. Use ISO 8601 format (e.g., '2024-01-15T10:30:00Z')" }
1416
+ ).optional();
1417
+ var uuidSchema = z.string().uuid("Invalid UUID format").or(z.string().min(1, "ID is required"));
1418
+ var brandIdSchema = z.string().min(1, "Brand ID is required");
1419
+ var tagSchema = z.string().trim().toLowerCase().min(1, "Tag cannot be empty").max(50, "Tag must not exceed 50 characters");
1420
+ var tagsArraySchema = z.array(tagSchema).max(100, "Cannot have more than 100 tags").optional();
1421
+ var CustomFieldType = {
1422
+ STRING: "string",
1423
+ NUMBER: "number",
1424
+ BOOLEAN: "boolean",
1425
+ DATE: "date",
1426
+ ARRAY: "array",
1427
+ OBJECT: "object"
1428
+ };
1429
+ var customFieldDefinitionSchema = z.object({
1430
+ type: z.enum(["string", "number", "boolean", "date", "array", "object"]),
1431
+ required: z.boolean().optional().default(false),
1432
+ maxLength: z.number().positive().optional(),
1433
+ minLength: z.number().nonnegative().optional(),
1434
+ min: z.number().optional(),
1435
+ max: z.number().optional(),
1436
+ pattern: z.string().optional(),
1437
+ enum: z.array(z.union([z.string(), z.number()])).optional()
1438
+ });
1439
+ function createCustomFieldValueSchema(definition) {
1440
+ let schema;
1441
+ switch (definition.type) {
1442
+ case "string":
1443
+ schema = z.string();
1444
+ if (definition.maxLength) {
1445
+ schema = schema.max(definition.maxLength);
1446
+ }
1447
+ if (definition.minLength) {
1448
+ schema = schema.min(definition.minLength);
1449
+ }
1450
+ if (definition.pattern) {
1451
+ schema = schema.regex(new RegExp(definition.pattern));
1452
+ }
1453
+ if (definition.enum) {
1454
+ schema = z.enum(definition.enum);
1455
+ }
1456
+ break;
1457
+ case "number":
1458
+ schema = z.number();
1459
+ if (definition.min !== void 0) {
1460
+ schema = schema.min(definition.min);
1461
+ }
1462
+ if (definition.max !== void 0) {
1463
+ schema = schema.max(definition.max);
1464
+ }
1465
+ break;
1466
+ case "boolean":
1467
+ schema = z.boolean();
1468
+ break;
1469
+ case "date":
1470
+ schema = isoDateStringSchema;
1471
+ break;
1472
+ case "array":
1473
+ schema = z.array(z.any());
1474
+ break;
1475
+ case "object":
1476
+ schema = z.record(z.any());
1477
+ break;
1478
+ default:
1479
+ schema = z.any();
1480
+ }
1481
+ if (!definition.required) {
1482
+ schema = schema.optional();
1483
+ }
1484
+ return schema;
1485
+ }
1486
+ var contactPreferencesSchema = z.record(
1487
+ z.string(),
1488
+ z.union([
1489
+ z.string(),
1490
+ z.number(),
1491
+ z.boolean(),
1492
+ z.array(z.any()),
1493
+ z.record(z.any()),
1494
+ z.null()
1495
+ ])
1496
+ ).optional().refine(
1497
+ (preferences) => {
1498
+ if (!preferences) return true;
1499
+ if (preferences.theme && !["light", "dark", "system"].includes(preferences.theme)) {
1500
+ return false;
1501
+ }
1502
+ if (preferences.language && typeof preferences.language === "string") {
1503
+ const localeResult = localeSchema.safeParse(preferences.language);
1504
+ if (!localeResult.success) return false;
1505
+ }
1506
+ return true;
1507
+ },
1508
+ {
1509
+ message: "Invalid preferences structure. Check theme (light/dark/system) and language (BCP 47) values."
1510
+ }
1511
+ );
1512
+ var notificationPreferencesSchema = z.object({
1513
+ email: z.boolean().optional().default(true),
1514
+ sms: z.boolean().optional().default(false),
1515
+ push: z.boolean().optional().default(false)
1516
+ });
1517
+ var communicationPreferencesSchema = z.object({
1518
+ preferredChannel: z.enum(["email", "phone", "sms"]).optional().default("email")
1519
+ });
1520
+ var baseContactFieldsSchema = {
1521
+ brandId: brandIdSchema,
1522
+ email: emailSchema,
1523
+ phone: optionalPhoneSchema,
1524
+ firstName: firstNameSchema,
1525
+ lastName: lastNameSchema,
1526
+ locale: optionalLocaleSchema,
1527
+ gdprConsent: z.boolean({
1528
+ required_error: "GDPR consent is required",
1529
+ invalid_type_error: "GDPR consent must be a boolean"
1530
+ }),
1531
+ gdprConsentDate: optionalIsoDateStringSchema,
1351
1532
  marketingOptIn: z.boolean().optional(),
1352
- preferences: z.record(z.any()).optional(),
1353
- tags: z.array(z.string()).optional(),
1354
- totalVisits: z.number().int().min(0).optional(),
1355
- lastVisitDate: z.string().optional(),
1356
- firstVisitDate: z.string().optional(),
1357
- legacyId: z.string().optional(),
1358
- // Audit fields
1359
- createdAt: z.string().optional(),
1533
+ preferences: contactPreferencesSchema,
1534
+ tags: tagsArraySchema,
1535
+ totalVisits: z.number().int().min(0, "Total visits cannot be negative").optional(),
1536
+ lastVisitDate: optionalIsoDateStringSchema,
1537
+ firstVisitDate: optionalIsoDateStringSchema,
1538
+ legacyId: z.string().max(255, "Legacy ID must not exceed 255 characters").optional()
1539
+ };
1540
+ var createAuditFieldsSchema = {
1541
+ createdAt: optionalIsoDateStringSchema,
1360
1542
  createdBy: z.string().optional(),
1361
- updatedAt: z.string().optional(),
1543
+ updatedAt: optionalIsoDateStringSchema,
1362
1544
  updatedBy: z.string().optional()
1545
+ };
1546
+ var updateAuditFieldsSchema = {
1547
+ updatedAt: optionalIsoDateStringSchema,
1548
+ updatedBy: z.string().optional(),
1549
+ deletedAt: z.string().nullable().optional(),
1550
+ deletedBy: z.string().nullable().optional()
1551
+ };
1552
+ var createContactSchema = z.object({
1553
+ ...baseContactFieldsSchema,
1554
+ ...createAuditFieldsSchema
1363
1555
  });
1364
1556
  var updateContactSchema = z.object({
1365
1557
  id: z.string().min(1, "Contact ID is required"),
1366
- brandId: z.string().min(1).optional(),
1367
- email: z.string().email("Invalid email address").optional(),
1368
- phone: z.string().optional(),
1369
- firstName: z.string().min(1).optional(),
1370
- lastName: z.string().min(1).optional(),
1371
- locale: z.string().optional(),
1558
+ brandId: brandIdSchema.optional(),
1559
+ email: optionalEmailSchema,
1560
+ phone: optionalPhoneSchema,
1561
+ firstName: optionalFirstNameSchema,
1562
+ lastName: optionalLastNameSchema,
1563
+ locale: optionalLocaleSchema,
1372
1564
  gdprConsent: z.boolean().optional(),
1373
- gdprConsentDate: z.string().optional(),
1565
+ gdprConsentDate: optionalIsoDateStringSchema,
1374
1566
  marketingOptIn: z.boolean().optional(),
1375
- preferences: z.record(z.any()).optional(),
1376
- tags: z.array(z.string()).optional(),
1377
- totalVisits: z.number().int().min(0).optional(),
1378
- lastVisitDate: z.string().optional(),
1379
- firstVisitDate: z.string().optional(),
1380
- legacyId: z.string().optional(),
1381
- // Audit fields
1382
- updatedAt: z.string().optional(),
1383
- updatedBy: z.string().optional(),
1384
- deletedAt: z.string().nullable().optional(),
1385
- deletedBy: z.string().nullable().optional()
1567
+ preferences: contactPreferencesSchema,
1568
+ tags: tagsArraySchema,
1569
+ totalVisits: z.number().int().min(0, "Total visits cannot be negative").optional(),
1570
+ lastVisitDate: optionalIsoDateStringSchema,
1571
+ firstVisitDate: optionalIsoDateStringSchema,
1572
+ legacyId: z.string().max(255, "Legacy ID must not exceed 255 characters").optional(),
1573
+ ...updateAuditFieldsSchema
1386
1574
  });
1387
1575
  var mergeContactsSchema = z.object({
1388
1576
  primaryId: z.string().min(1, "Primary contact ID is required"),
1389
- duplicateIds: z.array(z.string().min(1)).min(1, "At least one duplicate ID is required")
1577
+ duplicateIds: z.array(z.string().min(1, "Duplicate ID cannot be empty")).min(1, "At least one duplicate ID is required").max(50, "Cannot merge more than 50 contacts at once")
1578
+ });
1579
+ var searchContactSchema = z.object({
1580
+ brandId: brandIdSchema.optional(),
1581
+ email: z.string().optional(),
1582
+ phone: z.string().optional(),
1583
+ firstName: z.string().optional(),
1584
+ lastName: z.string().optional(),
1585
+ search: z.string().max(255, "Search query must not exceed 255 characters").optional(),
1586
+ tags: z.array(z.string()).optional(),
1587
+ gdprConsent: z.boolean().optional(),
1588
+ marketingOptIn: z.boolean().optional(),
1589
+ includeDeleted: z.boolean().optional().default(false),
1590
+ limit: z.number().int().min(1).max(250).optional().default(25),
1591
+ nextToken: z.string().optional()
1390
1592
  });
1593
+ var bulkImportContactSchema = z.object({
1594
+ contacts: z.array(createContactSchema.omit({ createdAt: true, createdBy: true, updatedAt: true, updatedBy: true })).min(1, "At least one contact is required").max(1e3, "Cannot import more than 1000 contacts at once"),
1595
+ skipDuplicates: z.boolean().optional().default(true),
1596
+ updateExisting: z.boolean().optional().default(false)
1597
+ });
1598
+ function validateEmail(email) {
1599
+ return emailSchema.safeParse(email);
1600
+ }
1601
+ function validatePhone(phone) {
1602
+ return phoneSchema.safeParse(phone);
1603
+ }
1604
+ function validateContactName(firstName, lastName) {
1605
+ const firstNameResult = firstNameSchema.safeParse(firstName);
1606
+ const lastNameResult = lastNameSchema.safeParse(lastName);
1607
+ return {
1608
+ firstName: firstNameResult,
1609
+ lastName: lastNameResult,
1610
+ isValid: firstNameResult.success && lastNameResult.success
1611
+ };
1612
+ }
1613
+ function validateCreateContact(input) {
1614
+ return createContactSchema.safeParse(input);
1615
+ }
1616
+ function validateUpdateContact(input) {
1617
+ return updateContactSchema.safeParse(input);
1618
+ }
1619
+ function formatValidationErrors(error) {
1620
+ return error.issues.map((issue) => {
1621
+ const path = issue.path.join(".");
1622
+ return path ? `${path}: ${issue.message}` : issue.message;
1623
+ }).join("; ");
1624
+ }
1625
+ function getValidationErrorDetails(error) {
1626
+ return error.issues.map((issue) => ({
1627
+ path: issue.path.join("."),
1628
+ message: issue.message,
1629
+ code: issue.code
1630
+ }));
1631
+ }
1632
+
1633
+ // src/mutations/contacts.ts
1391
1634
  var ContactValidationError = class extends Error {
1392
1635
  issues;
1393
1636
  constructor(message, issues = []) {
@@ -1400,9 +1643,8 @@ async function createContact(client, input) {
1400
1643
  try {
1401
1644
  const validationResult = createContactSchema.safeParse(input);
1402
1645
  if (!validationResult.success) {
1403
- const errorMessage = validationResult.error.issues.map((issue) => `${issue.path.join(".")}: ${issue.message}`).join(", ");
1404
1646
  throw new ContactValidationError(
1405
- `Validation failed: ${errorMessage}`,
1647
+ `Validation failed: ${formatValidationErrors(validationResult.error)}`,
1406
1648
  validationResult.error.issues
1407
1649
  );
1408
1650
  }
@@ -1425,9 +1667,8 @@ async function updateContact(client, input) {
1425
1667
  try {
1426
1668
  const validationResult = updateContactSchema.safeParse(input);
1427
1669
  if (!validationResult.success) {
1428
- const errorMessage = validationResult.error.issues.map((issue) => `${issue.path.join(".")}: ${issue.message}`).join(", ");
1429
1670
  throw new ContactValidationError(
1430
- `Validation failed: ${errorMessage}`,
1671
+ `Validation failed: ${formatValidationErrors(validationResult.error)}`,
1431
1672
  validationResult.error.issues
1432
1673
  );
1433
1674
  }
@@ -1511,9 +1752,8 @@ async function mergeContacts(client, input, mergedBy) {
1511
1752
  try {
1512
1753
  const validationResult = mergeContactsSchema.safeParse(input);
1513
1754
  if (!validationResult.success) {
1514
- const errorMessage = validationResult.error.issues.map((issue) => `${issue.path.join(".")}: ${issue.message}`).join(", ");
1515
1755
  throw new ContactValidationError(
1516
- `Validation failed: ${errorMessage}`,
1756
+ `Validation failed: ${formatValidationErrors(validationResult.error)}`,
1517
1757
  validationResult.error.issues
1518
1758
  );
1519
1759
  }
@@ -1606,7 +1846,7 @@ function createDataHook(config) {
1606
1846
  defaultLimit,
1607
1847
  selectionSet,
1608
1848
  transform,
1609
- buildFilter: buildFilter11,
1849
+ buildFilter: buildFilter12,
1610
1850
  computedProperties,
1611
1851
  dataPropertyName = "data"
1612
1852
  } = config;
@@ -1616,8 +1856,8 @@ function createDataHook(config) {
1616
1856
  const loading = ref(false);
1617
1857
  const error = ref(null);
1618
1858
  const getFilter = () => {
1619
- if (buildFilter11) {
1620
- return buildFilter11(options);
1859
+ if (buildFilter12) {
1860
+ return buildFilter12(options);
1621
1861
  }
1622
1862
  return baseFilter && Object.keys(baseFilter).length > 0 ? baseFilter : void 0;
1623
1863
  };
@@ -1691,7 +1931,7 @@ function createPaginatedDataHook(config) {
1691
1931
  defaultPageSize = 25,
1692
1932
  selectionSet,
1693
1933
  transform,
1694
- buildFilter: buildFilter11,
1934
+ buildFilter: buildFilter12,
1695
1935
  dataPropertyName = "data",
1696
1936
  baseFilter
1697
1937
  } = config;
@@ -1714,8 +1954,8 @@ function createPaginatedDataHook(config) {
1714
1954
  if (baseFilter) {
1715
1955
  filters.push(baseFilter);
1716
1956
  }
1717
- if (buildFilter11) {
1718
- const customFilter = buildFilter11(options);
1957
+ if (buildFilter12) {
1958
+ const customFilter = buildFilter12(options);
1719
1959
  if (customFilter) {
1720
1960
  filters.push(customFilter);
1721
1961
  }
@@ -1889,9 +2129,14 @@ function buildFilter2(options) {
1889
2129
  return { and: conditions };
1890
2130
  }
1891
2131
  function transformBrand(brand) {
2132
+ const productInstances = brand.productInstances?.items || [];
2133
+ const enabledProductCount = productInstances.filter((p) => p.enabled).length;
2134
+ const totalProductCount = productInstances.length;
1892
2135
  return {
1893
2136
  ...brand,
1894
- accountName: brand.account?.name || ""
2137
+ accountName: brand.account?.name || "",
2138
+ enabledProductCount,
2139
+ totalProductCount
1895
2140
  };
1896
2141
  }
1897
2142
  var BRAND_SELECTION_SET = [
@@ -1904,7 +2149,8 @@ var BRAND_SELECTION_SET = [
1904
2149
  "settings",
1905
2150
  "deletedAt",
1906
2151
  "deletedBy",
1907
- "account.name"
2152
+ "account.name",
2153
+ "productInstances.*"
1908
2154
  ];
1909
2155
  var useActiveBrandsInternal = createPaginatedDataHook({
1910
2156
  model: "Brand",
@@ -2556,9 +2802,6 @@ function buildFilter10(options) {
2556
2802
  if (options.brandId) {
2557
2803
  conditions.push({ brandId: { eq: options.brandId } });
2558
2804
  }
2559
- if (options.accountId) {
2560
- conditions.push({ accountId: { eq: options.accountId } });
2561
- }
2562
2805
  if (options.search) {
2563
2806
  conditions.push({
2564
2807
  or: [
@@ -2606,7 +2849,6 @@ var CONTACT_SELECTION_SET = [
2606
2849
  "lastName",
2607
2850
  "locale",
2608
2851
  "brandId",
2609
- "accountId",
2610
2852
  "gdprConsent",
2611
2853
  "gdprConsentDate",
2612
2854
  "marketingOptIn",
@@ -2676,6 +2918,43 @@ function useDeletedContacts(options = {}) {
2676
2918
  };
2677
2919
  }
2678
2920
 
2921
+ // src/hooks/activityLogs/useActivityLogs.ts
2922
+ function buildFilter11(options) {
2923
+ const conditions = [];
2924
+ if (options.accountId) {
2925
+ conditions.push({ accountId: { eq: options.accountId } });
2926
+ }
2927
+ if (options.brandId) {
2928
+ conditions.push({ brandId: { eq: options.brandId } });
2929
+ }
2930
+ if (options.resourceType) {
2931
+ conditions.push({ resourceType: { eq: options.resourceType } });
2932
+ }
2933
+ if (options.action) {
2934
+ conditions.push({ action: { eq: options.action } });
2935
+ }
2936
+ if (options.filter) {
2937
+ conditions.push(options.filter);
2938
+ }
2939
+ if (conditions.length === 0) return void 0;
2940
+ if (conditions.length === 1) return conditions[0];
2941
+ return { and: conditions };
2942
+ }
2943
+ var useActivityLogsInternal = createDataHook({
2944
+ model: "ActivityLog",
2945
+ dataPropertyName: "activityLogs",
2946
+ buildFilter: buildFilter11
2947
+ });
2948
+ function useActivityLogs(options = {}) {
2949
+ const result = useActivityLogsInternal(options);
2950
+ return {
2951
+ activityLogs: result.activityLogs,
2952
+ loading: result.loading,
2953
+ error: result.error,
2954
+ refetch: result.refetch
2955
+ };
2956
+ }
2957
+
2679
2958
  // ../../node_modules/.pnpm/nanostores@1.1.0/node_modules/nanostores/clean-stores/index.js
2680
2959
  var clean = /* @__PURE__ */ Symbol("clean");
2681
2960
 
@@ -2781,15 +3060,21 @@ function createSingleStore(shared, name, defaultValue) {
2781
3060
  export {
2782
3061
  ACTIVE_FILTER,
2783
3062
  ContactValidationError,
3063
+ CustomFieldType,
2784
3064
  DEFAULT_SOFT_DELETE_RETENTION_DAYS,
2785
3065
  DELETED_FILTER,
2786
3066
  ReservationValidationError,
2787
3067
  SYSTEM_SETTINGS_KEY,
3068
+ brandIdSchema,
3069
+ bulkImportContactSchema,
2788
3070
  checkRestoreEligibility,
3071
+ communicationPreferencesSchema,
3072
+ contactPreferencesSchema,
2789
3073
  createAccount,
2790
3074
  createBrand,
2791
3075
  createContact,
2792
3076
  createContactSchema,
3077
+ createCustomFieldValueSchema,
2793
3078
  createDataHook,
2794
3079
  createPaginatedDataHook,
2795
3080
  createProductInstance,
@@ -2798,14 +3083,18 @@ export {
2798
3083
  createSingleStore,
2799
3084
  createStore,
2800
3085
  createUser,
3086
+ customFieldDefinitionSchema,
2801
3087
  deleteAccount,
2802
3088
  deleteBrand,
2803
3089
  deleteContact,
2804
3090
  deleteProductInstance,
2805
3091
  deleteReservation2 as deleteReservation,
2806
3092
  deleteUser,
3093
+ emailSchema,
2807
3094
  executePublicQuery,
2808
3095
  executeServerQuery,
3096
+ firstNameSchema,
3097
+ formatValidationErrors,
2809
3098
  generateClient,
2810
3099
  generateServerClient,
2811
3100
  getAccount,
@@ -2826,12 +3115,18 @@ export {
2826
3115
  getUser,
2827
3116
  getUserByCognitoId,
2828
3117
  getUserByEmail,
3118
+ getValidationErrorDetails,
2829
3119
  hasErrors,
2830
3120
  initializeSystemSettings,
3121
+ isoDateStringSchema,
3122
+ lastNameSchema,
2831
3123
  listAccounts,
2832
3124
  listActiveBrands,
2833
3125
  listActiveProducts,
2834
3126
  listActiveUsers,
3127
+ listActivityLogs,
3128
+ listActivityLogsByAccount,
3129
+ listActivityLogsByBrand,
2835
3130
  listBrands,
2836
3131
  listBrandsByAccount,
2837
3132
  listContacts,
@@ -2840,15 +3135,25 @@ export {
2840
3135
  listProductInstancesByAccount,
2841
3136
  listProductInstancesByBrand,
2842
3137
  listProducts,
3138
+ listRecentActivityLogs,
2843
3139
  listReservations2 as listReservations,
2844
3140
  listReservationsByBrand,
2845
3141
  listReservationsByContact,
2846
3142
  listReservationsByDateRange,
2847
3143
  listUsers,
2848
3144
  listUsersByAccount,
3145
+ localeSchema,
2849
3146
  mergeContacts,
2850
3147
  mergeContactsSchema,
2851
3148
  mutate,
3149
+ notificationPreferencesSchema,
3150
+ optionalEmailSchema,
3151
+ optionalFirstNameSchema,
3152
+ optionalIsoDateStringSchema,
3153
+ optionalLastNameSchema,
3154
+ optionalLocaleSchema,
3155
+ optionalPhoneSchema,
3156
+ phoneSchema,
2852
3157
  query,
2853
3158
  resetClientInstance,
2854
3159
  resetSharedClient,
@@ -2857,12 +3162,15 @@ export {
2857
3162
  restoreContact,
2858
3163
  restoreReservation2 as restoreReservation,
2859
3164
  restoreUser,
3165
+ searchContactSchema,
2860
3166
  searchContacts,
2861
3167
  softDeleteAccount,
2862
3168
  softDeleteBrand,
2863
3169
  softDeleteContact,
2864
3170
  softDeleteReservation2 as softDeleteReservation,
2865
3171
  softDeleteUser,
3172
+ tagSchema,
3173
+ tagsArraySchema,
2866
3174
  toggleProductInstanceEnabled,
2867
3175
  updateAccount,
2868
3176
  updateBrand,
@@ -2879,6 +3187,7 @@ export {
2879
3187
  useActiveContacts,
2880
3188
  useActiveReservations,
2881
3189
  useActiveUsers,
3190
+ useActivityLogs,
2882
3191
  useBrands,
2883
3192
  useContacts,
2884
3193
  useDeletedAccounts,
@@ -2889,6 +3198,12 @@ export {
2889
3198
  useProductInstances,
2890
3199
  useProducts,
2891
3200
  useReservations,
2892
- useUsers
3201
+ useUsers,
3202
+ uuidSchema,
3203
+ validateContactName,
3204
+ validateCreateContact,
3205
+ validateEmail,
3206
+ validatePhone,
3207
+ validateUpdateContact
2893
3208
  };
2894
3209
  //# sourceMappingURL=index.js.map