@htlkg/data 0.0.21 → 0.0.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/hooks/index.d.ts +601 -94
- package/dist/hooks/index.js +682 -73
- package/dist/hooks/index.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +691 -82
- package/dist/index.js.map +1 -1
- package/dist/mutations/index.js +4 -4
- package/dist/mutations/index.js.map +1 -1
- package/dist/queries/index.js +5 -5
- package/dist/queries/index.js.map +1 -1
- package/package.json +11 -12
- package/src/hooks/accounts/index.ts +2 -0
- package/src/hooks/{useAccounts.ts → accounts/useAccounts.ts} +48 -5
- package/src/hooks/accounts/usePaginatedAccounts.ts +166 -0
- package/src/hooks/brands/index.ts +2 -0
- package/src/hooks/{useBrands.ts → brands/useBrands.ts} +1 -1
- package/src/hooks/brands/usePaginatedBrands.ts +206 -0
- package/src/hooks/createPaginatedDataHook.ts +359 -0
- package/src/hooks/data-hook-errors.property.test.ts +4 -4
- package/src/hooks/data-hook-filters.property.test.ts +4 -4
- package/src/hooks/data-hooks.property.test.ts +4 -4
- package/src/hooks/index.ts +96 -8
- package/src/hooks/productInstances/index.ts +1 -0
- package/src/hooks/{useProductInstances.ts → productInstances/useProductInstances.ts} +9 -6
- package/src/hooks/products/index.ts +1 -0
- package/src/hooks/{useProducts.ts → products/useProducts.ts} +4 -5
- package/src/hooks/reservations/index.ts +2 -0
- package/src/hooks/reservations/usePaginatedReservations.ts +258 -0
- package/src/hooks/{useReservations.ts → reservations/useReservations.ts} +65 -10
- package/src/hooks/users/index.ts +2 -0
- package/src/hooks/users/usePaginatedUsers.ts +213 -0
- package/src/hooks/{useUsers.ts → users/useUsers.ts} +1 -1
- package/src/mutations/accounts/accounts.test.ts +287 -0
- package/src/mutations/{accounts.ts → accounts/accounts.ts} +2 -2
- package/src/mutations/accounts/index.ts +1 -0
- package/src/mutations/brands/brands.test.ts +292 -0
- package/src/mutations/{brands.ts → brands/brands.ts} +2 -2
- package/src/mutations/brands/index.ts +1 -0
- package/src/mutations/reservations/index.ts +1 -0
- package/src/mutations/{reservations.test.ts → reservations/reservations.test.ts} +1 -1
- package/src/mutations/{reservations.ts → reservations/reservations.ts} +2 -2
- package/src/mutations/users/index.ts +1 -0
- package/src/mutations/users/users.test.ts +289 -0
- package/src/mutations/{users.ts → users/users.ts} +2 -2
- package/src/queries/accounts/accounts.test.ts +228 -0
- package/src/queries/accounts/index.ts +1 -0
- package/src/queries/brands/brands.test.ts +288 -0
- package/src/queries/brands/index.ts +1 -0
- package/src/queries/products/index.ts +1 -0
- package/src/queries/products/products.test.ts +347 -0
- package/src/queries/reservations/index.ts +1 -0
- package/src/queries/users/index.ts +1 -0
- package/src/queries/users/users.test.ts +301 -0
- /package/src/queries/{accounts.ts → accounts/accounts.ts} +0 -0
- /package/src/queries/{brands.ts → brands/brands.ts} +0 -0
- /package/src/queries/{products.ts → products/products.ts} +0 -0
- /package/src/queries/{reservations.test.ts → reservations/reservations.test.ts} +0 -0
- /package/src/queries/{reservations.ts → reservations/reservations.ts} +0 -0
- /package/src/queries/{users.ts → users/users.ts} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/queries/brands.ts","../../src/queries/accounts.ts","../../src/queries/users.ts","../../src/queries/products.ts","../../src/client/index.ts","../../src/client/server.ts","../../src/queries/server-helpers.ts","../../src/queries/systemSettings.ts","../../src/queries/reservations.ts","../../src/queries/contacts.ts"],"sourcesContent":["/**\n * Brand Query Functions\n *\n * Provides query functions for fetching brand data from the GraphQL API.\n */\n\nimport type { Brand } from \"@htlkg/core/types\";\n\n/**\n * Get a single brand by ID\n *\n * @example\n * ```typescript\n * import { getBrand } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const brand = await getBrand(client, 'brand-123');\n * ```\n */\nexport async function getBrand<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<Brand | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.Brand.get({ id });\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getBrand] 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(\"[getBrand] Error fetching brand:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List all brands with optional filtering\n *\n * @example\n * ```typescript\n * import { listBrands } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const brands = await listBrands(client, {\n * filter: { status: { eq: 'active' } }\n * });\n * ```\n */\nexport async function listBrands<TClient = any>(\n\tclient: TClient,\n\toptions?: {\n\t\tfilter?: any;\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: Brand[]; nextToken?: string }> {\n\ttry {\n\t\tconst { data, errors, nextToken } = await (client as any).models.Brand.list(\n\t\t\toptions,\n\t\t);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[listBrands] GraphQL errors:\", errors);\n\t\t\treturn { items: [], nextToken: undefined };\n\t\t}\n\n\t\treturn {\n\t\t\titems: (data || []) as Brand[],\n\t\t\tnextToken,\n\t\t};\n\t} catch (error) {\n\t\tconsole.error(\"[listBrands] Error fetching brands:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Get a brand with its product instances\n *\n * @example\n * ```typescript\n * import { getBrandWithProducts } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const brand = await getBrandWithProducts(client, 'brand-123');\n * ```\n */\nexport async function getBrandWithProducts<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<Brand | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.Brand.get(\n\t\t\t{ id },\n\t\t\t{\n\t\t\t\tselectionSet: [\n\t\t\t\t\t\"id\",\n\t\t\t\t\t\"name\",\n\t\t\t\t\t\"accountId\",\n\t\t\t\t\t\"logo\",\n\t\t\t\t\t\"timezone\",\n\t\t\t\t\t\"status\",\n\t\t\t\t\t\"settings\",\n\t\t\t\t\t\"productInstances.*\",\n\t\t\t\t],\n\t\t\t},\n\t\t);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getBrandWithProducts] 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(\"[getBrandWithProducts] Error fetching brand:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List brands by account ID\n *\n * @example\n * ```typescript\n * import { listBrandsByAccount } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const brands = await listBrandsByAccount(client, 'account-123');\n * ```\n */\nexport async function listBrandsByAccount<TClient = any>(\n\tclient: TClient,\n\taccountId: string,\n\toptions?: {\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: Brand[]; nextToken?: string }> {\n\treturn listBrands(client, {\n\t\tfilter: { accountId: { eq: accountId } },\n\t\t...options,\n\t});\n}\n\n/**\n * List active brands\n *\n * @example\n * ```typescript\n * import { listActiveBrands } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const brands = await listActiveBrands(client);\n * ```\n */\nexport async function listActiveBrands<TClient = any>(\n\tclient: TClient,\n\toptions?: {\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: Brand[]; nextToken?: string }> {\n\treturn listBrands(client, {\n\t\tfilter: { status: { eq: \"active\" } },\n\t\t...options,\n\t});\n}\n","/**\n * Account Query Functions\n *\n * Provides query functions for fetching account data from the GraphQL API.\n */\n\nimport type { Account } from \"@htlkg/core/types\";\n\n/**\n * Get a single account by ID\n *\n * @example\n * ```typescript\n * import { getAccount } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const account = await getAccount(client, 'account-123');\n * ```\n */\nexport async function getAccount<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<Account | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.Account.get({ id });\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getAccount] 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(\"[getAccount] Error fetching account:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List all accounts with optional filtering\n *\n * @example\n * ```typescript\n * import { listAccounts } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const accounts = await listAccounts(client);\n * ```\n */\nexport async function listAccounts<TClient = any>(\n\tclient: TClient,\n\toptions?: {\n\t\tfilter?: any;\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: Account[]; nextToken?: string }> {\n\ttry {\n\t\tconst { data, errors, nextToken } = await (\n\t\t\tclient as any\n\t\t).models.Account.list(options);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[listAccounts] GraphQL errors:\", errors);\n\t\t\treturn { items: [], nextToken: undefined };\n\t\t}\n\n\t\treturn {\n\t\t\titems: (data || []) as Account[],\n\t\t\tnextToken,\n\t\t};\n\t} catch (error) {\n\t\tconsole.error(\"[listAccounts] Error fetching accounts:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Get an account with its brands\n *\n * @example\n * ```typescript\n * import { getAccountWithBrands } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const account = await getAccountWithBrands(client, 'account-123');\n * ```\n */\nexport async function getAccountWithBrands<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<Account | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.Account.get(\n\t\t\t{ id },\n\t\t\t{\n\t\t\t\tselectionSet: [\n\t\t\t\t\t\"id\",\n\t\t\t\t\t\"name\",\n\t\t\t\t\t\"logo\",\n\t\t\t\t\t\"subscription\",\n\t\t\t\t\t\"settings\",\n\t\t\t\t\t\"brands.*\",\n\t\t\t\t],\n\t\t\t},\n\t\t);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getAccountWithBrands] 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(\"[getAccountWithBrands] Error fetching account:\", error);\n\t\tthrow error;\n\t}\n}\n","/**\n * User Query Functions\n *\n * Provides query functions for fetching user data from the GraphQL API.\n */\n\nimport type { User } from \"@htlkg/core/types\";\n\n/**\n * Get a single user by ID\n *\n * @example\n * ```typescript\n * import { getUser } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const user = await getUser(client, 'user-123');\n * ```\n */\nexport async function getUser<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<User | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.User.get({ id });\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getUser] 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(\"[getUser] Error fetching user:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Get a user by Cognito ID\n *\n * @example\n * ```typescript\n * import { getUserByCognitoId } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const user = await getUserByCognitoId(client, 'cognito-id-123');\n * ```\n */\nexport async function getUserByCognitoId<TClient = any>(\n\tclient: TClient,\n\tcognitoId: string,\n): Promise<User | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.User.list({\n\t\t\tfilter: { cognitoId: { eq: cognitoId } },\n\t\t\tlimit: 1,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getUserByCognitoId] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data?.[0] as User | null;\n\t} catch (error) {\n\t\tconsole.error(\"[getUserByCognitoId] Error fetching user:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Get a user by email\n *\n * @example\n * ```typescript\n * import { getUserByEmail } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const user = await getUserByEmail(client, 'user@example.com');\n * ```\n */\nexport async function getUserByEmail<TClient = any>(\n\tclient: TClient,\n\temail: string,\n): Promise<User | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.User.list({\n\t\t\tfilter: { email: { eq: email } },\n\t\t\tlimit: 1,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getUserByEmail] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data?.[0] as User | null;\n\t} catch (error) {\n\t\tconsole.error(\"[getUserByEmail] Error fetching user:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List all users with optional filtering\n *\n * @example\n * ```typescript\n * import { listUsers } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const users = await listUsers(client, {\n * filter: { status: { eq: 'active' } }\n * });\n * ```\n */\nexport async function listUsers<TClient = any>(\n\tclient: TClient,\n\toptions?: {\n\t\tfilter?: any;\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: User[]; nextToken?: string }> {\n\ttry {\n\t\tconst { data, errors, nextToken } = await (client as any).models.User.list(\n\t\t\toptions,\n\t\t);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[listUsers] GraphQL errors:\", errors);\n\t\t\treturn { items: [], nextToken: undefined };\n\t\t}\n\n\t\treturn {\n\t\t\titems: (data || []) as User[],\n\t\t\tnextToken,\n\t\t};\n\t} catch (error) {\n\t\tconsole.error(\"[listUsers] Error fetching users:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List users by account ID\n *\n * @example\n * ```typescript\n * import { listUsersByAccount } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const users = await listUsersByAccount(client, 'account-123');\n * ```\n */\nexport async function listUsersByAccount<TClient = any>(\n\tclient: TClient,\n\taccountId: string,\n\toptions?: {\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: User[]; nextToken?: string }> {\n\treturn listUsers(client, {\n\t\tfilter: { accountId: { eq: accountId } },\n\t\t...options,\n\t});\n}\n\n/**\n * List active users\n *\n * @example\n * ```typescript\n * import { listActiveUsers } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const users = await listActiveUsers(client);\n * ```\n */\nexport async function listActiveUsers<TClient = any>(\n\tclient: TClient,\n\toptions?: {\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: User[]; nextToken?: string }> {\n\treturn listUsers(client, {\n\t\tfilter: { status: { eq: \"active\" } },\n\t\t...options,\n\t});\n}\n","/**\n * Product Query Functions\n *\n * Provides query functions for fetching product and product instance data from the GraphQL API.\n */\n\nimport type { Product, ProductInstance } from \"@htlkg/core/types\";\n\n/**\n * Get a single product by ID\n *\n * @example\n * ```typescript\n * import { getProduct } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const product = await getProduct(client, 'product-123');\n * ```\n */\nexport async function getProduct<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<Product | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.Product.get({ id });\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getProduct] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as Product;\n\t} catch (error) {\n\t\tconsole.error(\"[getProduct] Error fetching product:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List all products with optional filtering\n *\n * @example\n * ```typescript\n * import { listProducts } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const products = await listProducts(client, {\n * filter: { isActive: { eq: true } }\n * });\n * ```\n */\nexport async function listProducts<TClient = any>(\n\tclient: TClient,\n\toptions?: {\n\t\tfilter?: any;\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: Product[]; nextToken?: string }> {\n\ttry {\n\t\tconst { data, errors, nextToken } = await (\n\t\t\tclient as any\n\t\t).models.Product.list(options);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[listProducts] GraphQL errors:\", errors);\n\t\t\treturn { items: [], nextToken: undefined };\n\t\t}\n\n\t\treturn {\n\t\t\titems: (data || []) as Product[],\n\t\t\tnextToken,\n\t\t};\n\t} catch (error) {\n\t\tconsole.error(\"[listProducts] Error fetching products:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List active products\n *\n * @example\n * ```typescript\n * import { listActiveProducts } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const products = await listActiveProducts(client);\n * ```\n */\nexport async function listActiveProducts<TClient = any>(\n\tclient: TClient,\n\toptions?: {\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: Product[]; nextToken?: string }> {\n\treturn listProducts(client, {\n\t\tfilter: { isActive: { eq: true } },\n\t\t...options,\n\t});\n}\n\n/**\n * Get a single product instance by ID\n *\n * @example\n * ```typescript\n * import { getProductInstance } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const instance = await getProductInstance(client, 'instance-123');\n * ```\n */\nexport async function getProductInstance<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<ProductInstance | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.ProductInstance.get({\n\t\t\tid,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getProductInstance] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as ProductInstance;\n\t} catch (error) {\n\t\tconsole.error(\"[getProductInstance] Error fetching product instance:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List product instances by brand ID\n *\n * @example\n * ```typescript\n * import { listProductInstancesByBrand } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const instances = await listProductInstancesByBrand(client, 'brand-123');\n * ```\n */\nexport async function listProductInstancesByBrand<TClient = any>(\n\tclient: TClient,\n\tbrandId: string,\n\toptions?: {\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: ProductInstance[]; nextToken?: string }> {\n\ttry {\n\t\tconst { data, errors, nextToken } = await (\n\t\t\tclient as any\n\t\t).models.ProductInstance.list({\n\t\t\tfilter: { brandId: { eq: brandId } },\n\t\t\t...options,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[listProductInstancesByBrand] GraphQL errors:\", errors);\n\t\t\treturn { items: [], nextToken: undefined };\n\t\t}\n\n\t\treturn {\n\t\t\titems: (data || []) as ProductInstance[],\n\t\t\tnextToken,\n\t\t};\n\t} catch (error) {\n\t\tconsole.error(\n\t\t\t\"[listProductInstancesByBrand] Error fetching product instances:\",\n\t\t\terror,\n\t\t);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List product instances by account ID\n *\n * @example\n * ```typescript\n * import { listProductInstancesByAccount } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const instances = await listProductInstancesByAccount(client, 'account-123');\n * ```\n */\nexport async function listProductInstancesByAccount<TClient = any>(\n\tclient: TClient,\n\taccountId: string,\n\toptions?: {\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: ProductInstance[]; nextToken?: string }> {\n\ttry {\n\t\tconst { data, errors, nextToken } = await (\n\t\t\tclient as any\n\t\t).models.ProductInstance.list({\n\t\t\tfilter: { accountId: { eq: accountId } },\n\t\t\t...options,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[listProductInstancesByAccount] GraphQL errors:\", errors);\n\t\t\treturn { items: [], nextToken: undefined };\n\t\t}\n\n\t\treturn {\n\t\t\titems: (data || []) as ProductInstance[],\n\t\t\tnextToken,\n\t\t};\n\t} catch (error) {\n\t\tconsole.error(\n\t\t\t\"[listProductInstancesByAccount] Error fetching product instances:\",\n\t\t\terror,\n\t\t);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List enabled product instances by brand ID\n *\n * @example\n * ```typescript\n * import { listEnabledProductInstancesByBrand } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const instances = await listEnabledProductInstancesByBrand(client, 'brand-123');\n * ```\n */\nexport async function listEnabledProductInstancesByBrand<TClient = any>(\n\tclient: TClient,\n\tbrandId: string,\n\toptions?: {\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: ProductInstance[]; nextToken?: string }> {\n\ttry {\n\t\tconst { data, errors, nextToken } = await (\n\t\t\tclient as any\n\t\t).models.ProductInstance.list({\n\t\t\tfilter: {\n\t\t\t\tbrandId: { eq: brandId },\n\t\t\t\tenabled: { eq: true },\n\t\t\t},\n\t\t\t...options,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\n\t\t\t\t\"[listEnabledProductInstancesByBrand] GraphQL errors:\",\n\t\t\t\terrors,\n\t\t\t);\n\t\t\treturn { items: [], nextToken: undefined };\n\t\t}\n\n\t\treturn {\n\t\t\titems: (data || []) as ProductInstance[],\n\t\t\tnextToken,\n\t\t};\n\t} catch (error) {\n\t\tconsole.error(\n\t\t\t\"[listEnabledProductInstancesByBrand] Error fetching product instances:\",\n\t\t\terror,\n\t\t);\n\t\tthrow error;\n\t}\n}\n","/**\n * GraphQL Client for @htlkg/data\n *\n * Provides both client-side and server-side GraphQL capabilities using AWS Amplify Data.\n * The server-side functions use the Amplify Astro adapter for proper SSR support.\n *\n * For server-side usage, use `Astro.locals.amplifyClient` (zero-config, injected by middleware).\n */\n\nimport { generateClient as generateDataClient } from \"aws-amplify/data\";\nimport { Amplify } from \"aws-amplify\";\nimport type { ResourcesConfig } from \"aws-amplify\";\nimport { generateServerClientUsingCookies } from \"./server\";\n\n// Re-export server-side client generation (used internally by middleware)\nexport { generateServerClientUsingCookies } from \"./server\";\n\n// Re-export proxy functions for authenticated client-side operations\nexport {\n\tmutate,\n\tquery,\n\thasErrors,\n\tgetErrorMessage,\n\ttype Operation,\n\ttype GraphQLResponse,\n\ttype ProxyOptions,\n} from \"./proxy\";\n\n// Re-export type-safe client-side Reservation operations\nexport {\n\tcreateReservation,\n\tupdateReservation,\n\tsoftDeleteReservation,\n\trestoreReservation,\n\tdeleteReservation,\n\tgetReservation,\n\tlistReservations,\n\tupdateReservationStatus,\n\tbulkSoftDeleteReservations,\n\tbulkRestoreReservations,\n\tbulkDeleteReservations,\n\tbulkUpdateReservationStatus,\n\ttype Reservation,\n\ttype ReservationStatus,\n} from \"./reservations\";\n\n/**\n * Type for the server-side Amplify client (for use in type declarations)\n * This represents the client returned by generateServerClientUsingCookies\n */\nexport type AmplifyServerClient<TSchema extends Record<string, unknown> = Record<string, unknown>> =\n\tReturnType<typeof generateServerClientUsingCookies<TSchema>>;\n\n// Singleton client instance for client-side fetching\nlet sharedClientInstance: any = null;\n\n/**\n * Get or create the shared GraphQL client instance (singleton pattern)\n * Use this for client-side fetching to avoid creating multiple client instances.\n *\n * @example\n * ```typescript\n * const client = getSharedClient<Schema>();\n * const { data } = await client.models.Account.list();\n * ```\n */\nexport function getSharedClient<\n\tTSchema extends Record<string, unknown> = Record<string, unknown>,\n>(): ReturnType<typeof generateDataClient<TSchema>> {\n\tif (!sharedClientInstance) {\n\t\tsharedClientInstance = generateDataClient<TSchema>();\n\t}\n\treturn sharedClientInstance;\n}\n\n/**\n * Reset the shared client instance (useful for testing or auth state changes)\n */\nexport function resetSharedClient(): void {\n\tsharedClientInstance = null;\n}\n\n/**\n * Generate a client-side GraphQL client for use in Vue components and browser contexts\n * This is SSR-safe and should be called within a component's setup function or after hydration\n *\n * @example\n * ```typescript\n * import type { Schema } from '@backend/data/resource';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const { data: brands } = await client.models.Brand.list();\n * ```\n */\nexport function generateClient<\n\tTSchema extends Record<string, unknown> = Record<string, unknown>,\n>(): ReturnType<typeof generateDataClient<TSchema>> {\n\treturn generateDataClient<TSchema>();\n}\n\n/**\n * Configuration for Amplify (matches amplify_outputs.json format)\n */\nexport type AstroAmplifyConfig = ResourcesConfig;\n\n/**\n * Authentication mode for server-side GraphQL client\n */\nexport type ServerAuthMode = 'userPool' | 'apiKey';\n\n/**\n * Options for generating a server-side GraphQL client\n */\nexport interface GenerateServerClientOptions {\n\t/** Authentication mode - 'userPool' (default) uses JWT from cookies, 'apiKey' uses API key */\n\tauthMode?: ServerAuthMode;\n}\n\n/**\n * Generate a server-side GraphQL client for use within runWithAmplifyServerContext\n * \n * This function creates a GraphQL client that can be used for server-side data fetching in Astro.\n * It MUST be called within runWithAmplifyServerContext to access JWT tokens from cookies.\n * \n * The client supports two authentication modes:\n * - 'userPool' (default): Uses JWT tokens from cookies (requires runWithAmplifyServerContext)\n * - 'apiKey': Uses API key for public/unauthenticated requests\n *\n * **Important**: \n * - Amplify.configure() must be called once at app startup (e.g., in amplify-server.ts)\n * - This function must be called INSIDE the operation function of runWithAmplifyServerContext\n * - The context automatically provides the token provider that reads JWT tokens from cookies\n *\n * @example\n * ```typescript\n * // In your Astro page\n * import type { Schema } from '../amplify/data/resource';\n * import { generateServerClient } from '@htlkg/data/client';\n * import { createRunWithAmplifyServerContext } from '@htlkg/core/amplify-astro-adapter';\n * import outputs from '../amplify_outputs.json';\n *\n * const runWithAmplifyServerContext = createRunWithAmplifyServerContext({ config: outputs });\n *\n * // Fetch data with authentication\n * const result = await runWithAmplifyServerContext({\n * astroServerContext: {\n * cookies: Astro.cookies,\n * request: Astro.request\n * },\n * operation: async (contextSpec) => {\n * // Generate client INSIDE the operation\n * const client = generateServerClient<Schema>({ authMode: 'userPool' });\n * return await client.models.User.list();\n * }\n * });\n * \n * const users = result.data || [];\n * ```\n * \n * @example Using API key for public data\n * ```typescript\n * const result = await runWithAmplifyServerContext({\n * astroServerContext: {\n * cookies: Astro.cookies,\n * request: Astro.request\n * },\n * operation: async (contextSpec) => {\n * const client = generateServerClient<Schema>({ authMode: 'apiKey' });\n * return await client.models.Brand.list();\n * }\n * });\n * ```\n */\nexport function generateServerClient<\n\tTSchema extends Record<string, unknown> = Record<string, unknown>,\n>(_options?: GenerateServerClientOptions): ReturnType<typeof generateDataClient<TSchema>> {\n\t// Generate the client without authMode parameter\n\t// When called within runWithAmplifyServerContext, it will automatically use the token provider\n\t// from the context (which reads JWT tokens from cookies)\n\t// The authMode should be specified per-operation, not at client creation\n\tconst client = generateDataClient<TSchema>();\n\n\treturn client;\n}\n\n/**\n * Context required for getting a server client in API routes\n */\nexport interface ServerClientContext {\n\tlocals: { amplifyClient?: any; user?: any };\n\tcookies: any;\n\trequest: Request;\n}\n\n/**\n * Get the server client from Astro context\n *\n * Uses locals.amplifyClient if available (set by middleware),\n * otherwise creates a new client using Amplify's global config.\n * No config parameter needed - uses the config set by the middleware.\n *\n * @example\n * ```typescript\n * import { getServerClient } from '@htlkg/data/client';\n *\n * export const POST: APIRoute = async (context) => {\n * const client = getServerClient(context);\n * if (!client) return new Response('Not authenticated', { status: 401 });\n *\n * const result = await client.models.User.list();\n * };\n * ```\n */\nexport function getServerClient<TSchema extends Record<string, unknown> = Record<string, unknown>>(\n\tcontext: ServerClientContext,\n): ReturnType<typeof generateServerClientUsingCookies<TSchema>> | null {\n\t// Try to use client from middleware first\n\tif (context.locals.amplifyClient) {\n\t\treturn context.locals.amplifyClient as ReturnType<typeof generateServerClientUsingCookies<TSchema>>;\n\t}\n\n\t// If no client from middleware and user is authenticated, create one using global Amplify config\n\tif (context.locals.user) {\n\t\ttry {\n\t\t\t// Get config from Amplify (set by middleware)\n\t\t\tconst amplifyConfig = Amplify.getConfig();\n\t\t\tif (amplifyConfig) {\n\t\t\t\treturn generateServerClientUsingCookies<TSchema>({\n\t\t\t\t\tconfig: amplifyConfig,\n\t\t\t\t\tcookies: context.cookies,\n\t\t\t\t\trequest: context.request,\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error('[getServerClient] Failed to get Amplify config:', e);\n\t\t}\n\t}\n\n\t// No authentication available\n\treturn null;\n}\n","/**\n * Server-side data client for Astro\n *\n * Provides a client generator similar to Next.js's generateServerClientUsingCookies\n * using generateClientWithAmplifyInstance for proper server context integration.\n */\n\nimport type { AstroGlobal } from \"astro\";\nimport type { ResourcesConfig } from \"aws-amplify\";\nimport {\n\tCommonPublicClientOptions,\n\tDefaultCommonClientOptions,\n\tV6ClientSSRCookies,\n\tgenerateClientWithAmplifyInstance,\n} from \"aws-amplify/api/internals\";\nimport { getAmplifyServerContext } from \"aws-amplify/adapter-core/internals\";\nimport { createRunWithAmplifyServerContext, createLogger } from \"@htlkg/core/amplify-astro-adapter\";\n\nconst log = createLogger('server-client');\n\ninterface AstroCookiesClientParams {\n\tcookies: AstroGlobal[\"cookies\"];\n\trequest: AstroGlobal[\"request\"];\n\tconfig: ResourcesConfig;\n}\n\n/**\n * Generates a server-side data client for Astro (matches Next.js implementation)\n *\n * This function creates a client that automatically wraps all operations in the Amplify server context,\n * ensuring that authentication tokens from cookies are properly used.\n *\n * @example\n * ```typescript\n * import type { Schema } from '../amplify/data/resource';\n * import { generateServerClientUsingCookies } from '@htlkg/data/client';\n * import { parseAmplifyConfig } from 'aws-amplify/utils';\n * import outputs from '../amplify_outputs.json';\n *\n * const amplifyConfig = parseAmplifyConfig(outputs);\n *\n * const client = generateServerClientUsingCookies<Schema>({\n * config: amplifyConfig,\n * cookies: Astro.cookies,\n * request: Astro.request,\n * });\n *\n * // Use the client directly - operations are automatically wrapped\n * const result = await client.models.User.list({\n * selectionSet: ['id', 'email'],\n * limit: 100,\n * });\n * ```\n */\nexport function generateServerClientUsingCookies<\n\tT extends Record<any, any> = never,\n\tOptions extends CommonPublicClientOptions &\n\t\tAstroCookiesClientParams = DefaultCommonClientOptions &\n\t\tAstroCookiesClientParams,\n>(options: Options): V6ClientSSRCookies<T, Options> {\n\tconst runWithAmplifyServerContext = createRunWithAmplifyServerContext({\n\t\tconfig: options.config,\n\t});\n\n\tconst resourcesConfig = options.config;\n\n\t// This function reference gets passed down to InternalGraphQLAPI.ts.graphql\n\t// where this._graphql is passed in as the `fn` argument\n\t// causing it to always get invoked inside `runWithAmplifyServerContext`\n\tconst getAmplify = (fn: (amplify: any) => Promise<any>) => {\n\t\treturn runWithAmplifyServerContext({\n\t\t\tastroServerContext: {\n\t\t\t\tcookies: options.cookies,\n\t\t\t\trequest: options.request,\n\t\t\t},\n\t\t\toperation: async (contextSpec: any) => {\n\t\t\t\tconst amplifyInstance = getAmplifyServerContext(contextSpec).amplify;\n\t\t\t\t\n\t\t\t\t// Debug logging (only when DEBUG=true)\n\t\t\t\ttry {\n\t\t\t\t\tconst config = amplifyInstance.getConfig();\n\t\t\t\t\tlog.debug('Amplify config from instance:', {\n\t\t\t\t\t\thasAPI: !!config.API,\n\t\t\t\t\t\thasGraphQL: !!config.API?.GraphQL,\n\t\t\t\t\t\tendpoint: config.API?.GraphQL?.endpoint,\n\t\t\t\t\t\tdefaultAuthMode: config.API?.GraphQL?.defaultAuthMode,\n\t\t\t\t\t\tregion: config.API?.GraphQL?.region,\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\tconst session = await amplifyInstance.Auth.fetchAuthSession();\n\t\t\t\t\tlog.debug('Auth session:', {\n\t\t\t\t\t\thasTokens: !!session.tokens,\n\t\t\t\t\t\thasAccessToken: !!session.tokens?.accessToken,\n\t\t\t\t\t\thasIdToken: !!session.tokens?.idToken,\n\t\t\t\t\t\thasCredentials: !!session.credentials,\n\t\t\t\t\t});\n\t\t\t\t} catch (e: any) {\n\t\t\t\t\tlog.debug('Error fetching session:', e.message);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\treturn fn(amplifyInstance);\n\t\t\t},\n\t\t});\n\t};\n\n\tconst {\n\t\tcookies: _cookies,\n\t\trequest: _request,\n\t\tconfig: _config,\n\t\t...params\n\t} = options;\n\n\treturn generateClientWithAmplifyInstance<T, V6ClientSSRCookies<T, Options>>({\n\t\tamplify: getAmplify,\n\t\tconfig: resourcesConfig,\n\t\t...params,\n\t} as any);\n}\n","/**\n * Server-Side Query Helpers\n *\n * Convenience functions for executing server-side queries in Astro pages.\n * These helpers simplify the common pattern of using runWithAmplifyServerContext.\n */\n\nimport type { AstroGlobal } from \"astro\";\nimport { generateServerClient } from \"../client\";\n\n/**\n * Type for the runWithAmplifyServerContext function\n */\ntype RunWithAmplifyServerContext = (options: {\n\tastroServerContext: {\n\t\tcookies: AstroGlobal[\"cookies\"];\n\t\trequest: AstroGlobal[\"request\"];\n\t};\n\toperation: (contextSpec: unknown) => Promise<unknown>;\n}) => Promise<unknown>;\n\n/**\n * Helper to execute server-side queries in Astro pages\n *\n * This function wraps the common pattern of using runWithAmplifyServerContext\n * with generateServerClient, making it easier to fetch data server-side.\n *\n * **Note**: This requires `createRunWithAmplifyServerContext` from `@htlkg/core/amplify-astro-adapter`.\n * If you need more control, use the full pattern directly.\n *\n * @example\n * ```typescript\n * import type { Schema } from '../amplify/data/resource';\n * import { executeServerQuery } from '@htlkg/data/queries/server-helpers';\n * import { createRunWithAmplifyServerContext } from '@htlkg/core/amplify-astro-adapter';\n * import outputs from '../amplify_outputs.json';\n *\n * const runWithAmplifyServerContext = createRunWithAmplifyServerContext({ config: outputs });\n *\n * const users = await executeServerQuery<Schema>(\n * Astro,\n * runWithAmplifyServerContext,\n * async (client) => {\n * const result = await client.models.User.list();\n * return result.data || [];\n * }\n * );\n * ```\n */\nexport async function executeServerQuery<\n\tTSchema extends Record<string, unknown>,\n\tTResult,\n>(\n\tastro: AstroGlobal,\n\trunWithAmplifyServerContext: RunWithAmplifyServerContext,\n\toperation: (client: ReturnType<typeof generateServerClient<TSchema>>) => Promise<TResult>,\n): Promise<TResult> {\n\tconst result = await runWithAmplifyServerContext({\n\t\tastroServerContext: {\n\t\t\tcookies: astro.cookies,\n\t\t\trequest: astro.request,\n\t\t},\n\t\toperation: async (contextSpec: unknown) => {\n\t\t\tconst client = generateServerClient<TSchema>();\n\t\t\treturn await operation(client);\n\t\t},\n\t});\n\treturn result as TResult;\n}\n\n/**\n * Helper to execute server-side queries with API key authentication (public data)\n *\n * Use this for fetching public data that doesn't require user authentication.\n *\n * @example\n * ```typescript\n * import type { Schema } from '../amplify/data/resource';\n * import { executePublicQuery } from '@htlkg/data/queries/server-helpers';\n * import { createRunWithAmplifyServerContext } from '@htlkg/core/amplify-astro-adapter';\n * import outputs from '../amplify_outputs.json';\n *\n * const runWithAmplifyServerContext = createRunWithAmplifyServerContext({ config: outputs });\n *\n * const brands = await executePublicQuery<Schema>(\n * Astro,\n * runWithAmplifyServerContext,\n * async (client) => {\n * const result = await client.models.Brand.list();\n * return result.data || [];\n * }\n * );\n * ```\n */\nexport async function executePublicQuery<\n\tTSchema extends Record<string, unknown>,\n\tTResult,\n>(\n\tastro: AstroGlobal,\n\trunWithAmplifyServerContext: RunWithAmplifyServerContext,\n\toperation: (client: ReturnType<typeof generateServerClient<TSchema>>) => Promise<TResult>,\n): Promise<TResult> {\n\tconst result = await runWithAmplifyServerContext({\n\t\tastroServerContext: {\n\t\t\tcookies: astro.cookies,\n\t\t\trequest: astro.request,\n\t\t},\n\t\toperation: async (_contextSpec: unknown) => {\n\t\t\tconst client = generateServerClient<TSchema>({ authMode: \"apiKey\" });\n\t\t\treturn await operation(client);\n\t\t},\n\t});\n\treturn result as TResult;\n}\n","/**\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 * Reservation Query Functions\n *\n * Provides query functions for fetching reservation data from the GraphQL API.\n */\n\n/**\n * Reservation type for query results\n */\nexport interface Reservation {\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\tcreatedAt?: string;\n\tcreatedBy?: string;\n\tupdatedAt?: string;\n\tupdatedBy?: string;\n\tdeletedAt?: string | null;\n\tdeletedBy?: string | null;\n}\n\n/**\n * Get a single reservation by ID\n *\n * @example\n * ```typescript\n * import { getReservation } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const reservation = await getReservation(client, 'reservation-123');\n * ```\n */\nexport async function getReservation<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<Reservation | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.Reservation.get({ id });\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getReservation] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as Reservation;\n\t} catch (error) {\n\t\tconsole.error(\"[getReservation] Error fetching reservation:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List all reservations with optional filtering and pagination\n *\n * @example\n * ```typescript\n * import { listReservations } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const reservations = await listReservations(client, {\n * filter: { status: { eq: 'confirmed' } },\n * limit: 50\n * });\n * ```\n */\nexport async function listReservations<TClient = any>(\n\tclient: TClient,\n\toptions?: {\n\t\tfilter?: any;\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: Reservation[]; nextToken?: string }> {\n\ttry {\n\t\tconst { data, errors, nextToken } = await (client as any).models.Reservation.list(\n\t\t\toptions,\n\t\t);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[listReservations] GraphQL errors:\", errors);\n\t\t\treturn { items: [], nextToken: undefined };\n\t\t}\n\n\t\treturn {\n\t\t\titems: (data || []) as Reservation[],\n\t\t\tnextToken,\n\t\t};\n\t} catch (error) {\n\t\tconsole.error(\"[listReservations] Error fetching reservations:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List reservations by brand ID\n *\n * @example\n * ```typescript\n * import { listReservationsByBrand } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const reservations = await listReservationsByBrand(client, 'brand-123', {\n * limit: 100\n * });\n * ```\n */\nexport async function listReservationsByBrand<TClient = any>(\n\tclient: TClient,\n\tbrandId: string,\n\toptions?: {\n\t\tfilter?: any;\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: Reservation[]; nextToken?: string }> {\n\tconst filter = options?.filter\n\t\t? { and: [{ brandId: { eq: brandId } }, options.filter] }\n\t\t: { brandId: { eq: brandId } };\n\n\treturn listReservations(client, {\n\t\tfilter,\n\t\tlimit: options?.limit,\n\t\tnextToken: options?.nextToken,\n\t});\n}\n\n/**\n * List reservations by contact/visit ID\n *\n * @example\n * ```typescript\n * import { listReservationsByContact } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const reservations = await listReservationsByContact(client, 'contact-123');\n * ```\n */\nexport async function listReservationsByContact<TClient = any>(\n\tclient: TClient,\n\tcontactId: string,\n\toptions?: {\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: Reservation[]; nextToken?: string }> {\n\treturn listReservations(client, {\n\t\tfilter: { visitId: { eq: contactId } },\n\t\t...options,\n\t});\n}\n\n/**\n * List reservations by date range for a specific brand\n *\n * Filters reservations where check-in date falls within the specified range.\n *\n * @example\n * ```typescript\n * import { listReservationsByDateRange } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const reservations = await listReservationsByDateRange(\n * client,\n * 'brand-123',\n * '2024-01-01',\n * '2024-01-31'\n * );\n * ```\n */\nexport async function listReservationsByDateRange<TClient = any>(\n\tclient: TClient,\n\tbrandId: string,\n\tstartDate: string,\n\tendDate: string,\n\toptions?: {\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: Reservation[]; nextToken?: string }> {\n\treturn listReservations(client, {\n\t\tfilter: {\n\t\t\tand: [\n\t\t\t\t{ brandId: { eq: brandId } },\n\t\t\t\t{ checkIn: { ge: startDate } },\n\t\t\t\t{ checkIn: { le: endDate } },\n\t\t\t],\n\t\t},\n\t\t...options,\n\t});\n}\n\n/**\n * Get a reservation by confirmation code and brand ID\n *\n * Returns the first matching reservation or null if not found.\n *\n * @example\n * ```typescript\n * import { getReservationByConfirmation } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const reservation = await getReservationByConfirmation(\n * client,\n * 'ABC123',\n * 'brand-123'\n * );\n * ```\n */\nexport async function getReservationByConfirmation<TClient = any>(\n\tclient: TClient,\n\tconfirmationCode: string,\n\tbrandId: string,\n): Promise<Reservation | null> {\n\ttry {\n\t\tconst { items } = await listReservations(client, {\n\t\t\tfilter: {\n\t\t\t\tand: [\n\t\t\t\t\t{ confirmationCode: { eq: confirmationCode } },\n\t\t\t\t\t{ brandId: { eq: brandId } },\n\t\t\t\t],\n\t\t\t},\n\t\t\tlimit: 1,\n\t\t});\n\n\t\treturn items.length > 0 ? items[0] : null;\n\t} catch (error) {\n\t\tconsole.error(\"[getReservationByConfirmation] Error fetching reservation:\", error);\n\t\tthrow error;\n\t}\n}\n","/**\n * Contact Query Functions\n *\n * Provides query functions for fetching contact data from the GraphQL API.\n */\n\nimport type { Contact } from \"@htlkg/core/types\";\n\n/**\n * Get a single contact by ID\n *\n * @example\n * ```typescript\n * import { getContact } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const contact = await getContact(client, 'contact-123');\n * ```\n */\nexport async function getContact<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<Contact | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.Contact.get({ id });\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getContact] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as Contact;\n\t} catch (error) {\n\t\tconsole.error(\"[getContact] Error fetching contact:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List all contacts with optional filtering\n *\n * @example\n * ```typescript\n * import { listContacts } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const contacts = await listContacts(client, {\n * filter: { gdprConsent: { eq: true } },\n * limit: 50\n * });\n * ```\n */\nexport async function listContacts<TClient = any>(\n\tclient: TClient,\n\toptions?: {\n\t\tfilter?: any;\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: Contact[]; nextToken?: string }> {\n\ttry {\n\t\tconst { data, errors, nextToken } = await (\n\t\t\tclient as any\n\t\t).models.Contact.list(options);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[listContacts] GraphQL errors:\", errors);\n\t\t\treturn { items: [], nextToken: undefined };\n\t\t}\n\n\t\treturn {\n\t\t\titems: (data || []) as Contact[],\n\t\t\tnextToken,\n\t\t};\n\t} catch (error) {\n\t\tconsole.error(\"[listContacts] Error fetching contacts:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List contacts by brand ID\n *\n * @example\n * ```typescript\n * import { listContactsByBrand } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const contacts = await listContactsByBrand(client, 'brand-123');\n * ```\n */\nexport async function listContactsByBrand<TClient = any>(\n\tclient: TClient,\n\tbrandId: string,\n\toptions?: {\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: Contact[]; nextToken?: string }> {\n\treturn listContacts(client, {\n\t\tfilter: { brandId: { eq: brandId } },\n\t\t...options,\n\t});\n}\n\n/**\n * Get a contact by email within a brand\n *\n * @example\n * ```typescript\n * import { getContactByEmail } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const contact = await getContactByEmail(client, 'guest@example.com', 'brand-123');\n * ```\n */\nexport async function getContactByEmail<TClient = any>(\n\tclient: TClient,\n\temail: string,\n\tbrandId: string,\n): Promise<Contact | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.Contact.list({\n\t\t\tfilter: {\n\t\t\t\tand: [{ email: { eq: email } }, { brandId: { eq: brandId } }],\n\t\t\t},\n\t\t\tlimit: 1,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getContactByEmail] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data?.[0] as Contact | null;\n\t} catch (error) {\n\t\tconsole.error(\"[getContactByEmail] Error fetching contact:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Get a contact by phone within a brand\n *\n * @example\n * ```typescript\n * import { getContactByPhone } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const contact = await getContactByPhone(client, '+1234567890', 'brand-123');\n * ```\n */\nexport async function getContactByPhone<TClient = any>(\n\tclient: TClient,\n\tphone: string,\n\tbrandId: string,\n): Promise<Contact | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.Contact.list({\n\t\t\tfilter: {\n\t\t\t\tand: [{ phone: { eq: phone } }, { brandId: { eq: brandId } }],\n\t\t\t},\n\t\t\tlimit: 1,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getContactByPhone] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data?.[0] as Contact | null;\n\t} catch (error) {\n\t\tconsole.error(\"[getContactByPhone] Error fetching contact:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Search contacts by query string within a brand\n * Searches across email, firstName, and lastName fields\n *\n * @example\n * ```typescript\n * import { searchContacts } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const contacts = await searchContacts(client, 'john', 'brand-123');\n * ```\n */\nexport async function searchContacts<TClient = any>(\n\tclient: TClient,\n\tquery: string,\n\tbrandId: string,\n\toptions?: {\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: Contact[]; nextToken?: string }> {\n\ttry {\n\t\tconst { data, errors, nextToken } = await (\n\t\t\tclient as any\n\t\t).models.Contact.list({\n\t\t\tfilter: {\n\t\t\t\tand: [\n\t\t\t\t\t{ brandId: { eq: brandId } },\n\t\t\t\t\t{\n\t\t\t\t\t\tor: [\n\t\t\t\t\t\t\t{ email: { contains: query } },\n\t\t\t\t\t\t\t{ firstName: { contains: query } },\n\t\t\t\t\t\t\t{ lastName: { contains: query } },\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t\t...options,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[searchContacts] GraphQL errors:\", errors);\n\t\t\treturn { items: [], nextToken: undefined };\n\t\t}\n\n\t\treturn {\n\t\t\titems: (data || []) as Contact[],\n\t\t\tnextToken,\n\t\t};\n\t} catch (error) {\n\t\tconsole.error(\"[searchContacts] Error searching contacts:\", error);\n\t\tthrow error;\n\t}\n}\n"],"mappings":"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","names":["getReservation","listReservations","query"]}
|
|
1
|
+
{"version":3,"sources":["../../src/queries/brands/brands.ts","../../src/queries/accounts/accounts.ts","../../src/queries/users/users.ts","../../src/queries/products/products.ts","../../src/client/index.ts","../../src/client/server.ts","../../src/queries/server-helpers.ts","../../src/queries/systemSettings.ts","../../src/queries/reservations/reservations.ts","../../src/queries/contacts.ts"],"sourcesContent":["/**\n * Brand Query Functions\n *\n * Provides query functions for fetching brand data from the GraphQL API.\n */\n\nimport type { Brand } from \"@htlkg/core/types\";\n\n/**\n * Get a single brand by ID\n *\n * @example\n * ```typescript\n * import { getBrand } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const brand = await getBrand(client, 'brand-123');\n * ```\n */\nexport async function getBrand<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<Brand | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.Brand.get({ id });\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getBrand] 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(\"[getBrand] Error fetching brand:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List all brands with optional filtering\n *\n * @example\n * ```typescript\n * import { listBrands } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const brands = await listBrands(client, {\n * filter: { status: { eq: 'active' } }\n * });\n * ```\n */\nexport async function listBrands<TClient = any>(\n\tclient: TClient,\n\toptions?: {\n\t\tfilter?: any;\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: Brand[]; nextToken?: string }> {\n\ttry {\n\t\tconst { data, errors, nextToken } = await (client as any).models.Brand.list(\n\t\t\toptions,\n\t\t);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[listBrands] GraphQL errors:\", errors);\n\t\t\treturn { items: [], nextToken: undefined };\n\t\t}\n\n\t\treturn {\n\t\t\titems: (data || []) as Brand[],\n\t\t\tnextToken,\n\t\t};\n\t} catch (error) {\n\t\tconsole.error(\"[listBrands] Error fetching brands:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Get a brand with its product instances\n *\n * @example\n * ```typescript\n * import { getBrandWithProducts } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const brand = await getBrandWithProducts(client, 'brand-123');\n * ```\n */\nexport async function getBrandWithProducts<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<Brand | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.Brand.get(\n\t\t\t{ id },\n\t\t\t{\n\t\t\t\tselectionSet: [\n\t\t\t\t\t\"id\",\n\t\t\t\t\t\"name\",\n\t\t\t\t\t\"accountId\",\n\t\t\t\t\t\"logo\",\n\t\t\t\t\t\"timezone\",\n\t\t\t\t\t\"status\",\n\t\t\t\t\t\"settings\",\n\t\t\t\t\t\"productInstances.*\",\n\t\t\t\t],\n\t\t\t},\n\t\t);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getBrandWithProducts] 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(\"[getBrandWithProducts] Error fetching brand:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List brands by account ID\n *\n * @example\n * ```typescript\n * import { listBrandsByAccount } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const brands = await listBrandsByAccount(client, 'account-123');\n * ```\n */\nexport async function listBrandsByAccount<TClient = any>(\n\tclient: TClient,\n\taccountId: string,\n\toptions?: {\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: Brand[]; nextToken?: string }> {\n\treturn listBrands(client, {\n\t\tfilter: { accountId: { eq: accountId } },\n\t\t...options,\n\t});\n}\n\n/**\n * List active brands\n *\n * @example\n * ```typescript\n * import { listActiveBrands } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const brands = await listActiveBrands(client);\n * ```\n */\nexport async function listActiveBrands<TClient = any>(\n\tclient: TClient,\n\toptions?: {\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: Brand[]; nextToken?: string }> {\n\treturn listBrands(client, {\n\t\tfilter: { status: { eq: \"active\" } },\n\t\t...options,\n\t});\n}\n","/**\n * Account Query Functions\n *\n * Provides query functions for fetching account data from the GraphQL API.\n */\n\nimport type { Account } from \"@htlkg/core/types\";\n\n/**\n * Get a single account by ID\n *\n * @example\n * ```typescript\n * import { getAccount } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const account = await getAccount(client, 'account-123');\n * ```\n */\nexport async function getAccount<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<Account | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.Account.get({ id });\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getAccount] 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(\"[getAccount] Error fetching account:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List all accounts with optional filtering\n *\n * @example\n * ```typescript\n * import { listAccounts } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const accounts = await listAccounts(client);\n * ```\n */\nexport async function listAccounts<TClient = any>(\n\tclient: TClient,\n\toptions?: {\n\t\tfilter?: any;\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: Account[]; nextToken?: string }> {\n\ttry {\n\t\tconst { data, errors, nextToken } = await (\n\t\t\tclient as any\n\t\t).models.Account.list(options);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[listAccounts] GraphQL errors:\", errors);\n\t\t\treturn { items: [], nextToken: undefined };\n\t\t}\n\n\t\treturn {\n\t\t\titems: (data || []) as Account[],\n\t\t\tnextToken,\n\t\t};\n\t} catch (error) {\n\t\tconsole.error(\"[listAccounts] Error fetching accounts:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Get an account with its brands\n *\n * @example\n * ```typescript\n * import { getAccountWithBrands } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const account = await getAccountWithBrands(client, 'account-123');\n * ```\n */\nexport async function getAccountWithBrands<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<Account | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.Account.get(\n\t\t\t{ id },\n\t\t\t{\n\t\t\t\tselectionSet: [\n\t\t\t\t\t\"id\",\n\t\t\t\t\t\"name\",\n\t\t\t\t\t\"logo\",\n\t\t\t\t\t\"subscription\",\n\t\t\t\t\t\"settings\",\n\t\t\t\t\t\"brands.*\",\n\t\t\t\t],\n\t\t\t},\n\t\t);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getAccountWithBrands] 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(\"[getAccountWithBrands] Error fetching account:\", error);\n\t\tthrow error;\n\t}\n}\n","/**\n * User Query Functions\n *\n * Provides query functions for fetching user data from the GraphQL API.\n */\n\nimport type { User } from \"@htlkg/core/types\";\n\n/**\n * Get a single user by ID\n *\n * @example\n * ```typescript\n * import { getUser } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const user = await getUser(client, 'user-123');\n * ```\n */\nexport async function getUser<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<User | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.User.get({ id });\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getUser] 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(\"[getUser] Error fetching user:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Get a user by Cognito ID\n *\n * @example\n * ```typescript\n * import { getUserByCognitoId } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const user = await getUserByCognitoId(client, 'cognito-id-123');\n * ```\n */\nexport async function getUserByCognitoId<TClient = any>(\n\tclient: TClient,\n\tcognitoId: string,\n): Promise<User | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.User.list({\n\t\t\tfilter: { cognitoId: { eq: cognitoId } },\n\t\t\tlimit: 1,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getUserByCognitoId] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data?.[0] as User | null;\n\t} catch (error) {\n\t\tconsole.error(\"[getUserByCognitoId] Error fetching user:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Get a user by email\n *\n * @example\n * ```typescript\n * import { getUserByEmail } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const user = await getUserByEmail(client, 'user@example.com');\n * ```\n */\nexport async function getUserByEmail<TClient = any>(\n\tclient: TClient,\n\temail: string,\n): Promise<User | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.User.list({\n\t\t\tfilter: { email: { eq: email } },\n\t\t\tlimit: 1,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getUserByEmail] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data?.[0] as User | null;\n\t} catch (error) {\n\t\tconsole.error(\"[getUserByEmail] Error fetching user:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List all users with optional filtering\n *\n * @example\n * ```typescript\n * import { listUsers } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const users = await listUsers(client, {\n * filter: { status: { eq: 'active' } }\n * });\n * ```\n */\nexport async function listUsers<TClient = any>(\n\tclient: TClient,\n\toptions?: {\n\t\tfilter?: any;\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: User[]; nextToken?: string }> {\n\ttry {\n\t\tconst { data, errors, nextToken } = await (client as any).models.User.list(\n\t\t\toptions,\n\t\t);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[listUsers] GraphQL errors:\", errors);\n\t\t\treturn { items: [], nextToken: undefined };\n\t\t}\n\n\t\treturn {\n\t\t\titems: (data || []) as User[],\n\t\t\tnextToken,\n\t\t};\n\t} catch (error) {\n\t\tconsole.error(\"[listUsers] Error fetching users:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List users by account ID\n *\n * @example\n * ```typescript\n * import { listUsersByAccount } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const users = await listUsersByAccount(client, 'account-123');\n * ```\n */\nexport async function listUsersByAccount<TClient = any>(\n\tclient: TClient,\n\taccountId: string,\n\toptions?: {\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: User[]; nextToken?: string }> {\n\treturn listUsers(client, {\n\t\tfilter: { accountId: { eq: accountId } },\n\t\t...options,\n\t});\n}\n\n/**\n * List active users\n *\n * @example\n * ```typescript\n * import { listActiveUsers } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const users = await listActiveUsers(client);\n * ```\n */\nexport async function listActiveUsers<TClient = any>(\n\tclient: TClient,\n\toptions?: {\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: User[]; nextToken?: string }> {\n\treturn listUsers(client, {\n\t\tfilter: { status: { eq: \"active\" } },\n\t\t...options,\n\t});\n}\n","/**\n * Product Query Functions\n *\n * Provides query functions for fetching product and product instance data from the GraphQL API.\n */\n\nimport type { Product, ProductInstance } from \"@htlkg/core/types\";\n\n/**\n * Get a single product by ID\n *\n * @example\n * ```typescript\n * import { getProduct } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const product = await getProduct(client, 'product-123');\n * ```\n */\nexport async function getProduct<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<Product | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.Product.get({ id });\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getProduct] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as Product;\n\t} catch (error) {\n\t\tconsole.error(\"[getProduct] Error fetching product:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List all products with optional filtering\n *\n * @example\n * ```typescript\n * import { listProducts } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const products = await listProducts(client, {\n * filter: { isActive: { eq: true } }\n * });\n * ```\n */\nexport async function listProducts<TClient = any>(\n\tclient: TClient,\n\toptions?: {\n\t\tfilter?: any;\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: Product[]; nextToken?: string }> {\n\ttry {\n\t\tconst { data, errors, nextToken } = await (\n\t\t\tclient as any\n\t\t).models.Product.list(options);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[listProducts] GraphQL errors:\", errors);\n\t\t\treturn { items: [], nextToken: undefined };\n\t\t}\n\n\t\treturn {\n\t\t\titems: (data || []) as Product[],\n\t\t\tnextToken,\n\t\t};\n\t} catch (error) {\n\t\tconsole.error(\"[listProducts] Error fetching products:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List active products\n *\n * @example\n * ```typescript\n * import { listActiveProducts } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const products = await listActiveProducts(client);\n * ```\n */\nexport async function listActiveProducts<TClient = any>(\n\tclient: TClient,\n\toptions?: {\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: Product[]; nextToken?: string }> {\n\treturn listProducts(client, {\n\t\tfilter: { isActive: { eq: true } },\n\t\t...options,\n\t});\n}\n\n/**\n * Get a single product instance by ID\n *\n * @example\n * ```typescript\n * import { getProductInstance } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const instance = await getProductInstance(client, 'instance-123');\n * ```\n */\nexport async function getProductInstance<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<ProductInstance | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.ProductInstance.get({\n\t\t\tid,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getProductInstance] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as ProductInstance;\n\t} catch (error) {\n\t\tconsole.error(\"[getProductInstance] Error fetching product instance:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List product instances by brand ID\n *\n * @example\n * ```typescript\n * import { listProductInstancesByBrand } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const instances = await listProductInstancesByBrand(client, 'brand-123');\n * ```\n */\nexport async function listProductInstancesByBrand<TClient = any>(\n\tclient: TClient,\n\tbrandId: string,\n\toptions?: {\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: ProductInstance[]; nextToken?: string }> {\n\ttry {\n\t\tconst { data, errors, nextToken } = await (\n\t\t\tclient as any\n\t\t).models.ProductInstance.list({\n\t\t\tfilter: { brandId: { eq: brandId } },\n\t\t\t...options,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[listProductInstancesByBrand] GraphQL errors:\", errors);\n\t\t\treturn { items: [], nextToken: undefined };\n\t\t}\n\n\t\treturn {\n\t\t\titems: (data || []) as ProductInstance[],\n\t\t\tnextToken,\n\t\t};\n\t} catch (error) {\n\t\tconsole.error(\n\t\t\t\"[listProductInstancesByBrand] Error fetching product instances:\",\n\t\t\terror,\n\t\t);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List product instances by account ID\n *\n * @example\n * ```typescript\n * import { listProductInstancesByAccount } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const instances = await listProductInstancesByAccount(client, 'account-123');\n * ```\n */\nexport async function listProductInstancesByAccount<TClient = any>(\n\tclient: TClient,\n\taccountId: string,\n\toptions?: {\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: ProductInstance[]; nextToken?: string }> {\n\ttry {\n\t\tconst { data, errors, nextToken } = await (\n\t\t\tclient as any\n\t\t).models.ProductInstance.list({\n\t\t\tfilter: { accountId: { eq: accountId } },\n\t\t\t...options,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[listProductInstancesByAccount] GraphQL errors:\", errors);\n\t\t\treturn { items: [], nextToken: undefined };\n\t\t}\n\n\t\treturn {\n\t\t\titems: (data || []) as ProductInstance[],\n\t\t\tnextToken,\n\t\t};\n\t} catch (error) {\n\t\tconsole.error(\n\t\t\t\"[listProductInstancesByAccount] Error fetching product instances:\",\n\t\t\terror,\n\t\t);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List enabled product instances by brand ID\n *\n * @example\n * ```typescript\n * import { listEnabledProductInstancesByBrand } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const instances = await listEnabledProductInstancesByBrand(client, 'brand-123');\n * ```\n */\nexport async function listEnabledProductInstancesByBrand<TClient = any>(\n\tclient: TClient,\n\tbrandId: string,\n\toptions?: {\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: ProductInstance[]; nextToken?: string }> {\n\ttry {\n\t\tconst { data, errors, nextToken } = await (\n\t\t\tclient as any\n\t\t).models.ProductInstance.list({\n\t\t\tfilter: {\n\t\t\t\tbrandId: { eq: brandId },\n\t\t\t\tenabled: { eq: true },\n\t\t\t},\n\t\t\t...options,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\n\t\t\t\t\"[listEnabledProductInstancesByBrand] GraphQL errors:\",\n\t\t\t\terrors,\n\t\t\t);\n\t\t\treturn { items: [], nextToken: undefined };\n\t\t}\n\n\t\treturn {\n\t\t\titems: (data || []) as ProductInstance[],\n\t\t\tnextToken,\n\t\t};\n\t} catch (error) {\n\t\tconsole.error(\n\t\t\t\"[listEnabledProductInstancesByBrand] Error fetching product instances:\",\n\t\t\terror,\n\t\t);\n\t\tthrow error;\n\t}\n}\n","/**\n * GraphQL Client for @htlkg/data\n *\n * Provides both client-side and server-side GraphQL capabilities using AWS Amplify Data.\n * The server-side functions use the Amplify Astro adapter for proper SSR support.\n *\n * For server-side usage, use `Astro.locals.amplifyClient` (zero-config, injected by middleware).\n */\n\nimport { generateClient as generateDataClient } from \"aws-amplify/data\";\nimport { Amplify } from \"aws-amplify\";\nimport type { ResourcesConfig } from \"aws-amplify\";\nimport { generateServerClientUsingCookies } from \"./server\";\n\n// Re-export server-side client generation (used internally by middleware)\nexport { generateServerClientUsingCookies } from \"./server\";\n\n// Re-export proxy functions for authenticated client-side operations\nexport {\n\tmutate,\n\tquery,\n\thasErrors,\n\tgetErrorMessage,\n\ttype Operation,\n\ttype GraphQLResponse,\n\ttype ProxyOptions,\n} from \"./proxy\";\n\n// Re-export type-safe client-side Reservation operations\nexport {\n\tcreateReservation,\n\tupdateReservation,\n\tsoftDeleteReservation,\n\trestoreReservation,\n\tdeleteReservation,\n\tgetReservation,\n\tlistReservations,\n\tupdateReservationStatus,\n\tbulkSoftDeleteReservations,\n\tbulkRestoreReservations,\n\tbulkDeleteReservations,\n\tbulkUpdateReservationStatus,\n\ttype Reservation,\n\ttype ReservationStatus,\n} from \"./reservations\";\n\n/**\n * Type for the server-side Amplify client (for use in type declarations)\n * This represents the client returned by generateServerClientUsingCookies\n */\nexport type AmplifyServerClient<TSchema extends Record<string, unknown> = Record<string, unknown>> =\n\tReturnType<typeof generateServerClientUsingCookies<TSchema>>;\n\n// Singleton client instance for client-side fetching\nlet sharedClientInstance: any = null;\n\n/**\n * Get or create the shared GraphQL client instance (singleton pattern)\n * Use this for client-side fetching to avoid creating multiple client instances.\n *\n * @example\n * ```typescript\n * const client = getSharedClient<Schema>();\n * const { data } = await client.models.Account.list();\n * ```\n */\nexport function getSharedClient<\n\tTSchema extends Record<string, unknown> = Record<string, unknown>,\n>(): ReturnType<typeof generateDataClient<TSchema>> {\n\tif (!sharedClientInstance) {\n\t\tsharedClientInstance = generateDataClient<TSchema>();\n\t}\n\treturn sharedClientInstance;\n}\n\n/**\n * Reset the shared client instance (useful for testing or auth state changes)\n */\nexport function resetSharedClient(): void {\n\tsharedClientInstance = null;\n}\n\n/**\n * Generate a client-side GraphQL client for use in Vue components and browser contexts\n * This is SSR-safe and should be called within a component's setup function or after hydration\n *\n * @example\n * ```typescript\n * import type { Schema } from '@backend/data/resource';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const { data: brands } = await client.models.Brand.list();\n * ```\n */\nexport function generateClient<\n\tTSchema extends Record<string, unknown> = Record<string, unknown>,\n>(): ReturnType<typeof generateDataClient<TSchema>> {\n\treturn generateDataClient<TSchema>();\n}\n\n/**\n * Configuration for Amplify (matches amplify_outputs.json format)\n */\nexport type AstroAmplifyConfig = ResourcesConfig;\n\n/**\n * Authentication mode for server-side GraphQL client\n */\nexport type ServerAuthMode = 'userPool' | 'apiKey';\n\n/**\n * Options for generating a server-side GraphQL client\n */\nexport interface GenerateServerClientOptions {\n\t/** Authentication mode - 'userPool' (default) uses JWT from cookies, 'apiKey' uses API key */\n\tauthMode?: ServerAuthMode;\n}\n\n/**\n * Generate a server-side GraphQL client for use within runWithAmplifyServerContext\n * \n * This function creates a GraphQL client that can be used for server-side data fetching in Astro.\n * It MUST be called within runWithAmplifyServerContext to access JWT tokens from cookies.\n * \n * The client supports two authentication modes:\n * - 'userPool' (default): Uses JWT tokens from cookies (requires runWithAmplifyServerContext)\n * - 'apiKey': Uses API key for public/unauthenticated requests\n *\n * **Important**: \n * - Amplify.configure() must be called once at app startup (e.g., in amplify-server.ts)\n * - This function must be called INSIDE the operation function of runWithAmplifyServerContext\n * - The context automatically provides the token provider that reads JWT tokens from cookies\n *\n * @example\n * ```typescript\n * // In your Astro page\n * import type { Schema } from '../amplify/data/resource';\n * import { generateServerClient } from '@htlkg/data/client';\n * import { createRunWithAmplifyServerContext } from '@htlkg/core/amplify-astro-adapter';\n * import outputs from '../amplify_outputs.json';\n *\n * const runWithAmplifyServerContext = createRunWithAmplifyServerContext({ config: outputs });\n *\n * // Fetch data with authentication\n * const result = await runWithAmplifyServerContext({\n * astroServerContext: {\n * cookies: Astro.cookies,\n * request: Astro.request\n * },\n * operation: async (contextSpec) => {\n * // Generate client INSIDE the operation\n * const client = generateServerClient<Schema>({ authMode: 'userPool' });\n * return await client.models.User.list();\n * }\n * });\n * \n * const users = result.data || [];\n * ```\n * \n * @example Using API key for public data\n * ```typescript\n * const result = await runWithAmplifyServerContext({\n * astroServerContext: {\n * cookies: Astro.cookies,\n * request: Astro.request\n * },\n * operation: async (contextSpec) => {\n * const client = generateServerClient<Schema>({ authMode: 'apiKey' });\n * return await client.models.Brand.list();\n * }\n * });\n * ```\n */\nexport function generateServerClient<\n\tTSchema extends Record<string, unknown> = Record<string, unknown>,\n>(_options?: GenerateServerClientOptions): ReturnType<typeof generateDataClient<TSchema>> {\n\t// Generate the client without authMode parameter\n\t// When called within runWithAmplifyServerContext, it will automatically use the token provider\n\t// from the context (which reads JWT tokens from cookies)\n\t// The authMode should be specified per-operation, not at client creation\n\tconst client = generateDataClient<TSchema>();\n\n\treturn client;\n}\n\n/**\n * Context required for getting a server client in API routes\n */\nexport interface ServerClientContext {\n\tlocals: { amplifyClient?: any; user?: any };\n\tcookies: any;\n\trequest: Request;\n}\n\n/**\n * Get the server client from Astro context\n *\n * Uses locals.amplifyClient if available (set by middleware),\n * otherwise creates a new client using Amplify's global config.\n * No config parameter needed - uses the config set by the middleware.\n *\n * @example\n * ```typescript\n * import { getServerClient } from '@htlkg/data/client';\n *\n * export const POST: APIRoute = async (context) => {\n * const client = getServerClient(context);\n * if (!client) return new Response('Not authenticated', { status: 401 });\n *\n * const result = await client.models.User.list();\n * };\n * ```\n */\nexport function getServerClient<TSchema extends Record<string, unknown> = Record<string, unknown>>(\n\tcontext: ServerClientContext,\n): ReturnType<typeof generateServerClientUsingCookies<TSchema>> | null {\n\t// Try to use client from middleware first\n\tif (context.locals.amplifyClient) {\n\t\treturn context.locals.amplifyClient as ReturnType<typeof generateServerClientUsingCookies<TSchema>>;\n\t}\n\n\t// If no client from middleware and user is authenticated, create one using global Amplify config\n\tif (context.locals.user) {\n\t\ttry {\n\t\t\t// Get config from Amplify (set by middleware)\n\t\t\tconst amplifyConfig = Amplify.getConfig();\n\t\t\tif (amplifyConfig) {\n\t\t\t\treturn generateServerClientUsingCookies<TSchema>({\n\t\t\t\t\tconfig: amplifyConfig,\n\t\t\t\t\tcookies: context.cookies,\n\t\t\t\t\trequest: context.request,\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error('[getServerClient] Failed to get Amplify config:', e);\n\t\t}\n\t}\n\n\t// No authentication available\n\treturn null;\n}\n","/**\n * Server-side data client for Astro\n *\n * Provides a client generator similar to Next.js's generateServerClientUsingCookies\n * using generateClientWithAmplifyInstance for proper server context integration.\n */\n\nimport type { AstroGlobal } from \"astro\";\nimport type { ResourcesConfig } from \"aws-amplify\";\nimport {\n\tCommonPublicClientOptions,\n\tDefaultCommonClientOptions,\n\tV6ClientSSRCookies,\n\tgenerateClientWithAmplifyInstance,\n} from \"aws-amplify/api/internals\";\nimport { getAmplifyServerContext } from \"aws-amplify/adapter-core/internals\";\nimport { createRunWithAmplifyServerContext, createLogger } from \"@htlkg/core/amplify-astro-adapter\";\n\nconst log = createLogger('server-client');\n\ninterface AstroCookiesClientParams {\n\tcookies: AstroGlobal[\"cookies\"];\n\trequest: AstroGlobal[\"request\"];\n\tconfig: ResourcesConfig;\n}\n\n/**\n * Generates a server-side data client for Astro (matches Next.js implementation)\n *\n * This function creates a client that automatically wraps all operations in the Amplify server context,\n * ensuring that authentication tokens from cookies are properly used.\n *\n * @example\n * ```typescript\n * import type { Schema } from '../amplify/data/resource';\n * import { generateServerClientUsingCookies } from '@htlkg/data/client';\n * import { parseAmplifyConfig } from 'aws-amplify/utils';\n * import outputs from '../amplify_outputs.json';\n *\n * const amplifyConfig = parseAmplifyConfig(outputs);\n *\n * const client = generateServerClientUsingCookies<Schema>({\n * config: amplifyConfig,\n * cookies: Astro.cookies,\n * request: Astro.request,\n * });\n *\n * // Use the client directly - operations are automatically wrapped\n * const result = await client.models.User.list({\n * selectionSet: ['id', 'email'],\n * limit: 100,\n * });\n * ```\n */\nexport function generateServerClientUsingCookies<\n\tT extends Record<any, any> = never,\n\tOptions extends CommonPublicClientOptions &\n\t\tAstroCookiesClientParams = DefaultCommonClientOptions &\n\t\tAstroCookiesClientParams,\n>(options: Options): V6ClientSSRCookies<T, Options> {\n\tconst runWithAmplifyServerContext = createRunWithAmplifyServerContext({\n\t\tconfig: options.config,\n\t});\n\n\tconst resourcesConfig = options.config;\n\n\t// This function reference gets passed down to InternalGraphQLAPI.ts.graphql\n\t// where this._graphql is passed in as the `fn` argument\n\t// causing it to always get invoked inside `runWithAmplifyServerContext`\n\tconst getAmplify = (fn: (amplify: any) => Promise<any>) => {\n\t\treturn runWithAmplifyServerContext({\n\t\t\tastroServerContext: {\n\t\t\t\tcookies: options.cookies,\n\t\t\t\trequest: options.request,\n\t\t\t},\n\t\t\toperation: async (contextSpec: any) => {\n\t\t\t\tconst amplifyInstance = getAmplifyServerContext(contextSpec).amplify;\n\t\t\t\t\n\t\t\t\t// Debug logging (only when DEBUG=true)\n\t\t\t\ttry {\n\t\t\t\t\tconst config = amplifyInstance.getConfig();\n\t\t\t\t\tlog.debug('Amplify config from instance:', {\n\t\t\t\t\t\thasAPI: !!config.API,\n\t\t\t\t\t\thasGraphQL: !!config.API?.GraphQL,\n\t\t\t\t\t\tendpoint: config.API?.GraphQL?.endpoint,\n\t\t\t\t\t\tdefaultAuthMode: config.API?.GraphQL?.defaultAuthMode,\n\t\t\t\t\t\tregion: config.API?.GraphQL?.region,\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\tconst session = await amplifyInstance.Auth.fetchAuthSession();\n\t\t\t\t\tlog.debug('Auth session:', {\n\t\t\t\t\t\thasTokens: !!session.tokens,\n\t\t\t\t\t\thasAccessToken: !!session.tokens?.accessToken,\n\t\t\t\t\t\thasIdToken: !!session.tokens?.idToken,\n\t\t\t\t\t\thasCredentials: !!session.credentials,\n\t\t\t\t\t});\n\t\t\t\t} catch (e: any) {\n\t\t\t\t\tlog.debug('Error fetching session:', e.message);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\treturn fn(amplifyInstance);\n\t\t\t},\n\t\t});\n\t};\n\n\tconst {\n\t\tcookies: _cookies,\n\t\trequest: _request,\n\t\tconfig: _config,\n\t\t...params\n\t} = options;\n\n\treturn generateClientWithAmplifyInstance<T, V6ClientSSRCookies<T, Options>>({\n\t\tamplify: getAmplify,\n\t\tconfig: resourcesConfig,\n\t\t...params,\n\t} as any);\n}\n","/**\n * Server-Side Query Helpers\n *\n * Convenience functions for executing server-side queries in Astro pages.\n * These helpers simplify the common pattern of using runWithAmplifyServerContext.\n */\n\nimport type { AstroGlobal } from \"astro\";\nimport { generateServerClient } from \"../client\";\n\n/**\n * Type for the runWithAmplifyServerContext function\n */\ntype RunWithAmplifyServerContext = (options: {\n\tastroServerContext: {\n\t\tcookies: AstroGlobal[\"cookies\"];\n\t\trequest: AstroGlobal[\"request\"];\n\t};\n\toperation: (contextSpec: unknown) => Promise<unknown>;\n}) => Promise<unknown>;\n\n/**\n * Helper to execute server-side queries in Astro pages\n *\n * This function wraps the common pattern of using runWithAmplifyServerContext\n * with generateServerClient, making it easier to fetch data server-side.\n *\n * **Note**: This requires `createRunWithAmplifyServerContext` from `@htlkg/core/amplify-astro-adapter`.\n * If you need more control, use the full pattern directly.\n *\n * @example\n * ```typescript\n * import type { Schema } from '../amplify/data/resource';\n * import { executeServerQuery } from '@htlkg/data/queries/server-helpers';\n * import { createRunWithAmplifyServerContext } from '@htlkg/core/amplify-astro-adapter';\n * import outputs from '../amplify_outputs.json';\n *\n * const runWithAmplifyServerContext = createRunWithAmplifyServerContext({ config: outputs });\n *\n * const users = await executeServerQuery<Schema>(\n * Astro,\n * runWithAmplifyServerContext,\n * async (client) => {\n * const result = await client.models.User.list();\n * return result.data || [];\n * }\n * );\n * ```\n */\nexport async function executeServerQuery<\n\tTSchema extends Record<string, unknown>,\n\tTResult,\n>(\n\tastro: AstroGlobal,\n\trunWithAmplifyServerContext: RunWithAmplifyServerContext,\n\toperation: (client: ReturnType<typeof generateServerClient<TSchema>>) => Promise<TResult>,\n): Promise<TResult> {\n\tconst result = await runWithAmplifyServerContext({\n\t\tastroServerContext: {\n\t\t\tcookies: astro.cookies,\n\t\t\trequest: astro.request,\n\t\t},\n\t\toperation: async (contextSpec: unknown) => {\n\t\t\tconst client = generateServerClient<TSchema>();\n\t\t\treturn await operation(client);\n\t\t},\n\t});\n\treturn result as TResult;\n}\n\n/**\n * Helper to execute server-side queries with API key authentication (public data)\n *\n * Use this for fetching public data that doesn't require user authentication.\n *\n * @example\n * ```typescript\n * import type { Schema } from '../amplify/data/resource';\n * import { executePublicQuery } from '@htlkg/data/queries/server-helpers';\n * import { createRunWithAmplifyServerContext } from '@htlkg/core/amplify-astro-adapter';\n * import outputs from '../amplify_outputs.json';\n *\n * const runWithAmplifyServerContext = createRunWithAmplifyServerContext({ config: outputs });\n *\n * const brands = await executePublicQuery<Schema>(\n * Astro,\n * runWithAmplifyServerContext,\n * async (client) => {\n * const result = await client.models.Brand.list();\n * return result.data || [];\n * }\n * );\n * ```\n */\nexport async function executePublicQuery<\n\tTSchema extends Record<string, unknown>,\n\tTResult,\n>(\n\tastro: AstroGlobal,\n\trunWithAmplifyServerContext: RunWithAmplifyServerContext,\n\toperation: (client: ReturnType<typeof generateServerClient<TSchema>>) => Promise<TResult>,\n): Promise<TResult> {\n\tconst result = await runWithAmplifyServerContext({\n\t\tastroServerContext: {\n\t\t\tcookies: astro.cookies,\n\t\t\trequest: astro.request,\n\t\t},\n\t\toperation: async (_contextSpec: unknown) => {\n\t\t\tconst client = generateServerClient<TSchema>({ authMode: \"apiKey\" });\n\t\t\treturn await operation(client);\n\t\t},\n\t});\n\treturn result as TResult;\n}\n","/**\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 * Reservation Query Functions\n *\n * Provides query functions for fetching reservation data from the GraphQL API.\n */\n\n/**\n * Reservation type for query results\n */\nexport interface Reservation {\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\tcreatedAt?: string;\n\tcreatedBy?: string;\n\tupdatedAt?: string;\n\tupdatedBy?: string;\n\tdeletedAt?: string | null;\n\tdeletedBy?: string | null;\n}\n\n/**\n * Get a single reservation by ID\n *\n * @example\n * ```typescript\n * import { getReservation } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const reservation = await getReservation(client, 'reservation-123');\n * ```\n */\nexport async function getReservation<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<Reservation | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.Reservation.get({ id });\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getReservation] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as Reservation;\n\t} catch (error) {\n\t\tconsole.error(\"[getReservation] Error fetching reservation:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List all reservations with optional filtering and pagination\n *\n * @example\n * ```typescript\n * import { listReservations } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const reservations = await listReservations(client, {\n * filter: { status: { eq: 'confirmed' } },\n * limit: 50\n * });\n * ```\n */\nexport async function listReservations<TClient = any>(\n\tclient: TClient,\n\toptions?: {\n\t\tfilter?: any;\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: Reservation[]; nextToken?: string }> {\n\ttry {\n\t\tconst { data, errors, nextToken } = await (client as any).models.Reservation.list(\n\t\t\toptions,\n\t\t);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[listReservations] GraphQL errors:\", errors);\n\t\t\treturn { items: [], nextToken: undefined };\n\t\t}\n\n\t\treturn {\n\t\t\titems: (data || []) as Reservation[],\n\t\t\tnextToken,\n\t\t};\n\t} catch (error) {\n\t\tconsole.error(\"[listReservations] Error fetching reservations:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List reservations by brand ID\n *\n * @example\n * ```typescript\n * import { listReservationsByBrand } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const reservations = await listReservationsByBrand(client, 'brand-123', {\n * limit: 100\n * });\n * ```\n */\nexport async function listReservationsByBrand<TClient = any>(\n\tclient: TClient,\n\tbrandId: string,\n\toptions?: {\n\t\tfilter?: any;\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: Reservation[]; nextToken?: string }> {\n\tconst filter = options?.filter\n\t\t? { and: [{ brandId: { eq: brandId } }, options.filter] }\n\t\t: { brandId: { eq: brandId } };\n\n\treturn listReservations(client, {\n\t\tfilter,\n\t\tlimit: options?.limit,\n\t\tnextToken: options?.nextToken,\n\t});\n}\n\n/**\n * List reservations by contact/visit ID\n *\n * @example\n * ```typescript\n * import { listReservationsByContact } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const reservations = await listReservationsByContact(client, 'contact-123');\n * ```\n */\nexport async function listReservationsByContact<TClient = any>(\n\tclient: TClient,\n\tcontactId: string,\n\toptions?: {\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: Reservation[]; nextToken?: string }> {\n\treturn listReservations(client, {\n\t\tfilter: { visitId: { eq: contactId } },\n\t\t...options,\n\t});\n}\n\n/**\n * List reservations by date range for a specific brand\n *\n * Filters reservations where check-in date falls within the specified range.\n *\n * @example\n * ```typescript\n * import { listReservationsByDateRange } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const reservations = await listReservationsByDateRange(\n * client,\n * 'brand-123',\n * '2024-01-01',\n * '2024-01-31'\n * );\n * ```\n */\nexport async function listReservationsByDateRange<TClient = any>(\n\tclient: TClient,\n\tbrandId: string,\n\tstartDate: string,\n\tendDate: string,\n\toptions?: {\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: Reservation[]; nextToken?: string }> {\n\treturn listReservations(client, {\n\t\tfilter: {\n\t\t\tand: [\n\t\t\t\t{ brandId: { eq: brandId } },\n\t\t\t\t{ checkIn: { ge: startDate } },\n\t\t\t\t{ checkIn: { le: endDate } },\n\t\t\t],\n\t\t},\n\t\t...options,\n\t});\n}\n\n/**\n * Get a reservation by confirmation code and brand ID\n *\n * Returns the first matching reservation or null if not found.\n *\n * @example\n * ```typescript\n * import { getReservationByConfirmation } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const reservation = await getReservationByConfirmation(\n * client,\n * 'ABC123',\n * 'brand-123'\n * );\n * ```\n */\nexport async function getReservationByConfirmation<TClient = any>(\n\tclient: TClient,\n\tconfirmationCode: string,\n\tbrandId: string,\n): Promise<Reservation | null> {\n\ttry {\n\t\tconst { items } = await listReservations(client, {\n\t\t\tfilter: {\n\t\t\t\tand: [\n\t\t\t\t\t{ confirmationCode: { eq: confirmationCode } },\n\t\t\t\t\t{ brandId: { eq: brandId } },\n\t\t\t\t],\n\t\t\t},\n\t\t\tlimit: 1,\n\t\t});\n\n\t\treturn items.length > 0 ? items[0] : null;\n\t} catch (error) {\n\t\tconsole.error(\"[getReservationByConfirmation] Error fetching reservation:\", error);\n\t\tthrow error;\n\t}\n}\n","/**\n * Contact Query Functions\n *\n * Provides query functions for fetching contact data from the GraphQL API.\n */\n\nimport type { Contact } from \"@htlkg/core/types\";\n\n/**\n * Get a single contact by ID\n *\n * @example\n * ```typescript\n * import { getContact } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const contact = await getContact(client, 'contact-123');\n * ```\n */\nexport async function getContact<TClient = any>(\n\tclient: TClient,\n\tid: string,\n): Promise<Contact | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.Contact.get({ id });\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getContact] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data as Contact;\n\t} catch (error) {\n\t\tconsole.error(\"[getContact] Error fetching contact:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List all contacts with optional filtering\n *\n * @example\n * ```typescript\n * import { listContacts } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const contacts = await listContacts(client, {\n * filter: { gdprConsent: { eq: true } },\n * limit: 50\n * });\n * ```\n */\nexport async function listContacts<TClient = any>(\n\tclient: TClient,\n\toptions?: {\n\t\tfilter?: any;\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: Contact[]; nextToken?: string }> {\n\ttry {\n\t\tconst { data, errors, nextToken } = await (\n\t\t\tclient as any\n\t\t).models.Contact.list(options);\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[listContacts] GraphQL errors:\", errors);\n\t\t\treturn { items: [], nextToken: undefined };\n\t\t}\n\n\t\treturn {\n\t\t\titems: (data || []) as Contact[],\n\t\t\tnextToken,\n\t\t};\n\t} catch (error) {\n\t\tconsole.error(\"[listContacts] Error fetching contacts:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * List contacts by brand ID\n *\n * @example\n * ```typescript\n * import { listContactsByBrand } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const contacts = await listContactsByBrand(client, 'brand-123');\n * ```\n */\nexport async function listContactsByBrand<TClient = any>(\n\tclient: TClient,\n\tbrandId: string,\n\toptions?: {\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: Contact[]; nextToken?: string }> {\n\treturn listContacts(client, {\n\t\tfilter: { brandId: { eq: brandId } },\n\t\t...options,\n\t});\n}\n\n/**\n * Get a contact by email within a brand\n *\n * @example\n * ```typescript\n * import { getContactByEmail } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const contact = await getContactByEmail(client, 'guest@example.com', 'brand-123');\n * ```\n */\nexport async function getContactByEmail<TClient = any>(\n\tclient: TClient,\n\temail: string,\n\tbrandId: string,\n): Promise<Contact | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.Contact.list({\n\t\t\tfilter: {\n\t\t\t\tand: [{ email: { eq: email } }, { brandId: { eq: brandId } }],\n\t\t\t},\n\t\t\tlimit: 1,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getContactByEmail] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data?.[0] as Contact | null;\n\t} catch (error) {\n\t\tconsole.error(\"[getContactByEmail] Error fetching contact:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Get a contact by phone within a brand\n *\n * @example\n * ```typescript\n * import { getContactByPhone } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const contact = await getContactByPhone(client, '+1234567890', 'brand-123');\n * ```\n */\nexport async function getContactByPhone<TClient = any>(\n\tclient: TClient,\n\tphone: string,\n\tbrandId: string,\n): Promise<Contact | null> {\n\ttry {\n\t\tconst { data, errors } = await (client as any).models.Contact.list({\n\t\t\tfilter: {\n\t\t\t\tand: [{ phone: { eq: phone } }, { brandId: { eq: brandId } }],\n\t\t\t},\n\t\t\tlimit: 1,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[getContactByPhone] GraphQL errors:\", errors);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data?.[0] as Contact | null;\n\t} catch (error) {\n\t\tconsole.error(\"[getContactByPhone] Error fetching contact:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Search contacts by query string within a brand\n * Searches across email, firstName, and lastName fields\n *\n * @example\n * ```typescript\n * import { searchContacts } from '@htlkg/data/queries';\n * import { generateClient } from '@htlkg/data/client';\n *\n * const client = generateClient<Schema>();\n * const contacts = await searchContacts(client, 'john', 'brand-123');\n * ```\n */\nexport async function searchContacts<TClient = any>(\n\tclient: TClient,\n\tquery: string,\n\tbrandId: string,\n\toptions?: {\n\t\tlimit?: number;\n\t\tnextToken?: string;\n\t},\n): Promise<{ items: Contact[]; nextToken?: string }> {\n\ttry {\n\t\tconst { data, errors, nextToken } = await (\n\t\t\tclient as any\n\t\t).models.Contact.list({\n\t\t\tfilter: {\n\t\t\t\tand: [\n\t\t\t\t\t{ brandId: { eq: brandId } },\n\t\t\t\t\t{\n\t\t\t\t\t\tor: [\n\t\t\t\t\t\t\t{ email: { contains: query } },\n\t\t\t\t\t\t\t{ firstName: { contains: query } },\n\t\t\t\t\t\t\t{ lastName: { contains: query } },\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t\t...options,\n\t\t});\n\n\t\tif (errors) {\n\t\t\tconsole.error(\"[searchContacts] GraphQL errors:\", errors);\n\t\t\treturn { items: [], nextToken: undefined };\n\t\t}\n\n\t\treturn {\n\t\t\titems: (data || []) as Contact[],\n\t\t\tnextToken,\n\t\t};\n\t} catch (error) {\n\t\tconsole.error(\"[searchContacts] Error searching contacts:\", error);\n\t\tthrow error;\n\t}\n}\n"],"mappings":"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","names":["getReservation","listReservations","query"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@htlkg/data",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.22",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": {
|
|
@@ -40,16 +40,6 @@
|
|
|
40
40
|
"src",
|
|
41
41
|
"dist"
|
|
42
42
|
],
|
|
43
|
-
"scripts": {
|
|
44
|
-
"build": "tsup",
|
|
45
|
-
"dev": "tsup --watch",
|
|
46
|
-
"test": "vitest run",
|
|
47
|
-
"test:watch": "vitest",
|
|
48
|
-
"prepublishOnly": "pnpm build",
|
|
49
|
-
"version:patch": "pnpm version patch --no-git-tag-version",
|
|
50
|
-
"version:minor": "pnpm version minor --no-git-tag-version",
|
|
51
|
-
"version:major": "pnpm version major --no-git-tag-version"
|
|
52
|
-
},
|
|
53
43
|
"dependencies": {
|
|
54
44
|
"@aws-amplify/api": "^6.0.0",
|
|
55
45
|
"@htlkg/core": "^0.0.15",
|
|
@@ -68,5 +58,14 @@
|
|
|
68
58
|
"tsup": "^8.0.0",
|
|
69
59
|
"typescript": "^5.9.2",
|
|
70
60
|
"vitest": "^3.2.4"
|
|
61
|
+
},
|
|
62
|
+
"scripts": {
|
|
63
|
+
"build": "tsup",
|
|
64
|
+
"dev": "tsup --watch",
|
|
65
|
+
"test": "vitest run",
|
|
66
|
+
"test:watch": "vitest",
|
|
67
|
+
"version:patch": "pnpm version patch --no-git-tag-version",
|
|
68
|
+
"version:minor": "pnpm version minor --no-git-tag-version",
|
|
69
|
+
"version:major": "pnpm version major --no-git-tag-version"
|
|
71
70
|
}
|
|
72
|
-
}
|
|
71
|
+
}
|
|
@@ -3,11 +3,12 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Vue composable for fetching and managing account data with reactive state.
|
|
5
5
|
* Provides loading states, error handling, and refetch capabilities.
|
|
6
|
+
* Includes brands relationship data for displaying brand info without separate queries.
|
|
6
7
|
*/
|
|
7
8
|
|
|
8
9
|
import type { Ref } from "vue";
|
|
9
10
|
import type { Account } from "@htlkg/core/types";
|
|
10
|
-
import { createDataHook, type BaseHookOptions } from "
|
|
11
|
+
import { createDataHook, type BaseHookOptions } from "../createDataHook";
|
|
11
12
|
|
|
12
13
|
export interface UseAccountsOptions extends BaseHookOptions {
|
|
13
14
|
/** Filter criteria for accounts */
|
|
@@ -18,9 +19,24 @@ export interface UseAccountsOptions extends BaseHookOptions {
|
|
|
18
19
|
autoFetch?: boolean;
|
|
19
20
|
}
|
|
20
21
|
|
|
22
|
+
/** Brand info included with account */
|
|
23
|
+
export interface AccountBrand {
|
|
24
|
+
id: string;
|
|
25
|
+
name: string;
|
|
26
|
+
status?: string;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** Extended account type with brands relationship */
|
|
30
|
+
export type AccountWithBrands = Account & {
|
|
31
|
+
brands: AccountBrand[];
|
|
32
|
+
brandCount: number;
|
|
33
|
+
deletedAt?: string;
|
|
34
|
+
deletedBy?: string;
|
|
35
|
+
};
|
|
36
|
+
|
|
21
37
|
export interface UseAccountsReturn {
|
|
22
|
-
/** Reactive array of accounts */
|
|
23
|
-
accounts: Ref<
|
|
38
|
+
/** Reactive array of accounts with brands */
|
|
39
|
+
accounts: Ref<AccountWithBrands[]>;
|
|
24
40
|
/** Loading state */
|
|
25
41
|
loading: Ref<boolean>;
|
|
26
42
|
/** Error state */
|
|
@@ -29,12 +45,39 @@ export interface UseAccountsReturn {
|
|
|
29
45
|
refetch: () => Promise<void>;
|
|
30
46
|
}
|
|
31
47
|
|
|
48
|
+
/**
|
|
49
|
+
* Transform account data to include brandCount
|
|
50
|
+
*/
|
|
51
|
+
function transformAccount(account: any): AccountWithBrands {
|
|
52
|
+
const brands = account.brands || [];
|
|
53
|
+
return {
|
|
54
|
+
...account,
|
|
55
|
+
brands,
|
|
56
|
+
brandCount: brands.length,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
|
|
32
60
|
/**
|
|
33
61
|
* Internal hook created by factory
|
|
34
62
|
*/
|
|
35
|
-
const useAccountsInternal = createDataHook<
|
|
63
|
+
const useAccountsInternal = createDataHook<AccountWithBrands, UseAccountsOptions>({
|
|
36
64
|
model: "Account",
|
|
37
65
|
dataPropertyName: "accounts",
|
|
66
|
+
// Include brands relationship for brand display
|
|
67
|
+
selectionSet: [
|
|
68
|
+
"id",
|
|
69
|
+
"name",
|
|
70
|
+
"logo",
|
|
71
|
+
"subscription",
|
|
72
|
+
"settings",
|
|
73
|
+
"status",
|
|
74
|
+
"deletedAt",
|
|
75
|
+
"deletedBy",
|
|
76
|
+
"brands.id",
|
|
77
|
+
"brands.name",
|
|
78
|
+
"brands.status",
|
|
79
|
+
],
|
|
80
|
+
transform: transformAccount,
|
|
38
81
|
});
|
|
39
82
|
|
|
40
83
|
/**
|
|
@@ -58,7 +101,7 @@ const useAccountsInternal = createDataHook<Account, UseAccountsOptions>({
|
|
|
58
101
|
export function useAccounts(options: UseAccountsOptions = {}): UseAccountsReturn {
|
|
59
102
|
const result = useAccountsInternal(options);
|
|
60
103
|
return {
|
|
61
|
-
accounts: result.accounts as Ref<
|
|
104
|
+
accounts: result.accounts as Ref<AccountWithBrands[]>,
|
|
62
105
|
loading: result.loading,
|
|
63
106
|
error: result.error,
|
|
64
107
|
refetch: result.refetch,
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Paginated Accounts Hooks
|
|
3
|
+
*
|
|
4
|
+
* Vue composables for fetching accounts with server-side pagination.
|
|
5
|
+
* Provides separate hooks for active and deleted accounts to enable
|
|
6
|
+
* efficient tab-based filtering in large datasets.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { Ref, ComputedRef } from "vue";
|
|
10
|
+
import {
|
|
11
|
+
createPaginatedDataHook,
|
|
12
|
+
ACTIVE_FILTER,
|
|
13
|
+
DELETED_FILTER,
|
|
14
|
+
type PaginatedHookOptions,
|
|
15
|
+
type PaginationState,
|
|
16
|
+
} from "../createPaginatedDataHook";
|
|
17
|
+
import type { AccountWithBrands } from "./useAccounts";
|
|
18
|
+
|
|
19
|
+
export interface UsePaginatedAccountsOptions extends PaginatedHookOptions {
|
|
20
|
+
// Add any account-specific filters here if needed
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface UsePaginatedAccountsReturn {
|
|
24
|
+
/** Reactive array of accounts with brands */
|
|
25
|
+
accounts: Ref<AccountWithBrands[]>;
|
|
26
|
+
/** Loading state (true during any fetch) */
|
|
27
|
+
loading: Ref<boolean>;
|
|
28
|
+
/** Loading state for initial fetch */
|
|
29
|
+
initialLoading: Ref<boolean>;
|
|
30
|
+
/** Loading state for loadMore */
|
|
31
|
+
loadingMore: Ref<boolean>;
|
|
32
|
+
/** Error state */
|
|
33
|
+
error: Ref<Error | null>;
|
|
34
|
+
/** Pagination state */
|
|
35
|
+
pagination: Ref<PaginationState>;
|
|
36
|
+
/** Whether there are more items to load */
|
|
37
|
+
hasMore: ComputedRef<boolean>;
|
|
38
|
+
/** Load next page of data */
|
|
39
|
+
loadMore: () => Promise<void>;
|
|
40
|
+
/** Refetch data (resets to first page) */
|
|
41
|
+
refetch: () => Promise<void>;
|
|
42
|
+
/** Reset data and pagination state */
|
|
43
|
+
reset: () => void;
|
|
44
|
+
/** Update search filter and refetch from server (searches ALL data) */
|
|
45
|
+
setSearchFilter: (filter: any) => Promise<void>;
|
|
46
|
+
/** Current search filter */
|
|
47
|
+
searchFilter: Ref<any>;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Transform account data to include brandCount
|
|
52
|
+
*/
|
|
53
|
+
function transformAccount(account: any): AccountWithBrands {
|
|
54
|
+
const brands = account.brands || [];
|
|
55
|
+
return {
|
|
56
|
+
...account,
|
|
57
|
+
brands,
|
|
58
|
+
brandCount: brands.length,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Selection set for account queries
|
|
64
|
+
*/
|
|
65
|
+
const ACCOUNT_SELECTION_SET = [
|
|
66
|
+
"id",
|
|
67
|
+
"name",
|
|
68
|
+
"logo",
|
|
69
|
+
"subscription",
|
|
70
|
+
"settings",
|
|
71
|
+
"status",
|
|
72
|
+
"deletedAt",
|
|
73
|
+
"deletedBy",
|
|
74
|
+
"brands.id",
|
|
75
|
+
"brands.name",
|
|
76
|
+
"brands.status",
|
|
77
|
+
];
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Internal hook for active accounts
|
|
81
|
+
*/
|
|
82
|
+
const useActiveAccountsInternal = createPaginatedDataHook<AccountWithBrands, UsePaginatedAccountsOptions>({
|
|
83
|
+
model: "Account",
|
|
84
|
+
dataPropertyName: "accounts",
|
|
85
|
+
defaultPageSize: 25,
|
|
86
|
+
selectionSet: ACCOUNT_SELECTION_SET,
|
|
87
|
+
transform: transformAccount,
|
|
88
|
+
baseFilter: ACTIVE_FILTER,
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Internal hook for deleted accounts
|
|
93
|
+
*/
|
|
94
|
+
const useDeletedAccountsInternal = createPaginatedDataHook<AccountWithBrands, UsePaginatedAccountsOptions>({
|
|
95
|
+
model: "Account",
|
|
96
|
+
dataPropertyName: "accounts",
|
|
97
|
+
defaultPageSize: 25,
|
|
98
|
+
selectionSet: ACCOUNT_SELECTION_SET,
|
|
99
|
+
transform: transformAccount,
|
|
100
|
+
baseFilter: DELETED_FILTER,
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Composable for fetching active (non-deleted) accounts with pagination
|
|
105
|
+
*
|
|
106
|
+
* @example
|
|
107
|
+
* ```typescript
|
|
108
|
+
* import { useActiveAccounts } from '@htlkg/data/hooks';
|
|
109
|
+
*
|
|
110
|
+
* const { accounts, loading, hasMore, loadMore, refetch } = useActiveAccounts({
|
|
111
|
+
* pageSize: 25,
|
|
112
|
+
* });
|
|
113
|
+
*
|
|
114
|
+
* // Load more when user scrolls or clicks "Load More"
|
|
115
|
+
* async function onLoadMore() {
|
|
116
|
+
* await loadMore();
|
|
117
|
+
* }
|
|
118
|
+
* ```
|
|
119
|
+
*/
|
|
120
|
+
export function useActiveAccounts(options: UsePaginatedAccountsOptions = {}): UsePaginatedAccountsReturn {
|
|
121
|
+
const result = useActiveAccountsInternal(options);
|
|
122
|
+
return {
|
|
123
|
+
accounts: result.accounts as Ref<AccountWithBrands[]>,
|
|
124
|
+
loading: result.loading,
|
|
125
|
+
initialLoading: result.initialLoading,
|
|
126
|
+
loadingMore: result.loadingMore,
|
|
127
|
+
error: result.error,
|
|
128
|
+
pagination: result.pagination,
|
|
129
|
+
hasMore: result.hasMore,
|
|
130
|
+
loadMore: result.loadMore,
|
|
131
|
+
refetch: result.refetch,
|
|
132
|
+
reset: result.reset,
|
|
133
|
+
setSearchFilter: result.setSearchFilter,
|
|
134
|
+
searchFilter: result.searchFilter,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Composable for fetching deleted accounts with pagination
|
|
140
|
+
*
|
|
141
|
+
* @example
|
|
142
|
+
* ```typescript
|
|
143
|
+
* import { useDeletedAccounts } from '@htlkg/data/hooks';
|
|
144
|
+
*
|
|
145
|
+
* const { accounts, loading, hasMore, loadMore, refetch } = useDeletedAccounts({
|
|
146
|
+
* pageSize: 25,
|
|
147
|
+
* });
|
|
148
|
+
* ```
|
|
149
|
+
*/
|
|
150
|
+
export function useDeletedAccounts(options: UsePaginatedAccountsOptions = {}): UsePaginatedAccountsReturn {
|
|
151
|
+
const result = useDeletedAccountsInternal(options);
|
|
152
|
+
return {
|
|
153
|
+
accounts: result.accounts as Ref<AccountWithBrands[]>,
|
|
154
|
+
loading: result.loading,
|
|
155
|
+
initialLoading: result.initialLoading,
|
|
156
|
+
loadingMore: result.loadingMore,
|
|
157
|
+
error: result.error,
|
|
158
|
+
pagination: result.pagination,
|
|
159
|
+
hasMore: result.hasMore,
|
|
160
|
+
loadMore: result.loadMore,
|
|
161
|
+
refetch: result.refetch,
|
|
162
|
+
reset: result.reset,
|
|
163
|
+
setSearchFilter: result.setSearchFilter,
|
|
164
|
+
searchFilter: result.searchFilter,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
import type { Ref, ComputedRef } from "vue";
|
|
9
9
|
import type { Brand } from "@htlkg/core/types";
|
|
10
|
-
import { createDataHook, type BaseHookOptions } from "
|
|
10
|
+
import { createDataHook, type BaseHookOptions } from "../createDataHook";
|
|
11
11
|
|
|
12
12
|
export interface UseBrandsOptions extends BaseHookOptions {
|
|
13
13
|
/** Filter criteria for brands */
|