import {z} from 'zod' export type TokenType = 'attribute' | 'custom_attribute' | 'event_attribute' | 'custom_event_attribute' | 'operator' | 'number' | 'date' | 'string' | 'boolean' | 'list' | 'variable' | 'function' | 'virtual_currency' | 'store'; export type Token = {type: TokenType, value: unknown}; export type Expression = {tokens?: Array | undefined, name?: string | undefined, variables?: Array | undefined}; export type LoyaltyItemCreateUpdate = {id: string, count?: (number | null) | undefined, sku?: string | undefined, quantity_expression?: Expression | undefined}; export type LoyaltyTierCreateUpdate = {id?: string | undefined, name: string, points: number, image_url: string | '', items: Array}; export type UpdateApiV1LoyaltyLoyaltySettingsIdTiersArgs = {loyalty_settings_id: string, body: Array}; export type UpdateApiV1LoyaltyLoyaltySettingsIdTiersOptions = {baseUrl?: string | undefined, HTTPBearer?: string | undefined, fetch?: typeof fetch | undefined}; export const highlightItem = z.object({image_url: z.string().optional(), name: z.string().optional(), description: z.string().optional()}); export const highlights = z.object({title: z.string().optional(), description: z.string().optional(), items: z.array(highlightItem)}); export const durationUnit = z.enum(["day", "hour", "minute"]); export const itemDisplayOptions = z.object({duration_largest_unit: durationUnit.optional(), stack_duration: z.boolean().optional()}); export const currency = z.enum(["USD", "EUR", "AED", "AFN", "ALL", "AMD", "ANG", "AOA", "ARS", "AUD", "AWG", "AZN", "BAM", "BBD", "BDT", "BGN", "BHD", "BIF", "BMD", "BND", "BOB", "BRL", "BSD", "BTN", "BWP", "BYN", "BZD", "CAD", "CDF", "CHF", "CLP", "CNY", "COP", "CRC", "CUP", "CVE", "CZK", "DJF", "DKK", "DOP", "DZD", "EGP", "ERN", "ETB", "FJD", "FKP", "GBP", "GEL", "GHS", "GIP", "GMD", "GNF", "GTQ", "GYD", "HKD", "HNL", "HTG", "HUF", "IDR", "ILS", "INR", "IQD", "IRR", "ISK", "JMD", "JOD", "JPY", "KES", "KGS", "KHR", "KMF", "KPW", "KRW", "KWD", "KYD", "KZT", "LAK", "LBP", "LKR", "LRD", "LSL", "LYD", "MAD", "MDL", "MGA", "MKD", "MMK", "MNT", "MOP", "MRU", "MUR", "MVR", "MWK", "MXN", "MYR", "MZN", "NAD", "NGN", "NIO", "NOK", "NPR", "NZD", "OMR", "PAB", "PEN", "PGK", "PHP", "PKR", "PLN", "PYG", "QAR", "RON", "RSD", "RUB", "RWF", "SAR", "SBD", "SCR", "SDG", "SEK", "SGD", "SHP", "SLE", "SOS", "SRD", "SSP", "STN", "SVC", "SYP", "SZL", "THB", "TJS", "TMT", "TND", "TOP", "TRY", "TTD", "TWD", "TZS", "UAH", "UGX", "UYU", "UZS", "VED", "VES", "VND", "VUV", "WST", "XAF", "XCD", "XCG", "XOF", "XPF", "YER", "ZAR", "ZMW", "ZWG", "ZWL", "RP", "VC"]); export const itemType = z.enum(["item", "currency", "bundle", "lootbox", "subscription", "virtual_currency", "piggy_bank", "pick_one", "rolling"]); export const itemViewOption = z.enum(["default", "skeleton"]); export const nestedItemViewType = z.literal("separated"); export const tokenType = z.enum(["attribute", "custom_attribute", "event_attribute", "custom_event_attribute", "operator", "number", "date", "string", "boolean", "list", "variable", "function", "virtual_currency", "store"]); export const token = z.object({type: tokenType, value: z.unknown()}); export const expression: z.ZodType = z.object({tokens: z.array(token).optional(), name: z.string().optional(), variables: z.array(z.lazy(() => expression)).optional()}); export const nestedItem = z.object({id: z.string().max(32).optional(), count: z.number().int().optional(), sku: z.string().optional(), is_featured: z.boolean().optional(), meta: z.record(z.string(), z.unknown()).optional(), image_url: z.string().min(1).max(65536).optional(), view_type: nestedItemViewType.optional(), quantity_expression: expression.optional(), is_bonus_target: z.boolean().optional()}); export const itemPropertyRelationData = z.object({value: z.union([z.number(), z.number().int(), z.string()]).optional()}); export const itemPropertyConfigRange = z.object({property_type: z.literal("range").optional(), max: z.number().int(), min: z.number().int().optional()}); export const itemPropertyConfigNumber = z.object({property_type: z.literal("number").optional()}); export const itemPropertyConfigString = z.object({property_type: z.literal("string").optional()}); export const itemPropertyRead = z.object({name: z.string().max(255), description: z.string().max(512).optional(), icon_url: z.union([z.string().min(1).max(65536), z.literal("")]).optional(), config: z.discriminatedUnion("property_type", [itemPropertyConfigRange, itemPropertyConfigNumber, itemPropertyConfigString]), id: z.string().max(32)}); export const itemPropertyRelationRead = z.object({property_id: z.string().max(32), data: itemPropertyRelationData.optional(), position: z.number().int(), id: z.string().max(32), item_id: z.string().max(32), item_property: itemPropertyRead}); export const itemSource = z.enum(["order", "bonus", "bundle", "coupon", "lootbox", "free_item", "liveops", "daily_reward", "loyalty_reward", "progression_program", "rolling_offer", "pick_one_offer"]); export const itemRarityRead = z.object({name: z.string().max(255), color_background_badge: z.string().optional(), id: z.string().max(32)}); export const nestedItemsChoiceGroup = z.object({key: z.string().min(1).max(32), items: z.array(nestedItem)}); export const nestedItemsChoices = z.object({groups: z.array(nestedItemsChoiceGroup), slots: z.array(z.string().min(1).max(32))}); export const loyaltyItem = z.object({name: z.string().max(255), description: z.string().max(512).nullable().optional(), highlights: highlights.optional(), display_options: itemDisplayOptions.optional(), price: z.number().int().optional(), price_point: z.number().int().gt(0).lte(5000000).optional(), price_template_id: z.string().max(32).optional(), reward_points_price: z.number().int().optional(), currency: currency, sku: z.string().max(255), image_url: z.union([z.string().min(1).max(65536), z.literal("")]).optional(), image_url_apple: z.string().min(1).max(65536).optional(), icon_url: z.union([z.string().min(1).max(65536), z.literal("")]).optional(), icon_url_apple: z.string().min(1).max(65536).optional(), image_url_featured: z.union([z.string().min(1).max(65536), z.literal("")]).optional(), image_url_featured_apple: z.string().min(1).max(65536).optional(), background_image_url: z.union([z.string().min(1).max(65536), z.literal("")]).optional(), background_image_url_apple: z.string().min(1).max(65536).optional(), background_image_color: z.string().optional(), featured_card_background_image_url: z.union([z.string().min(1).max(65536), z.literal("")]).optional(), featured_card_background_image_url_apple: z.string().min(1).max(65536).optional(), type: itemType, view_option: itemViewOption.optional(), quantity: z.number().int().gte(1).lte(1000000000000000000).optional(), is_stackable: z.boolean(), is_currency: z.boolean(), position: z.number().int().optional(), categories: z.array(z.string()).optional(), duration: z.number().int().optional(), enable_reward_points_redemption: z.boolean().optional(), nested_items: z.array(nestedItem).optional(), id: z.string().max(32), properties: z.array(itemPropertyRelationRead).optional(), source: itemSource.optional(), rarity_id: z.string().max(32).optional(), item_rarity: itemRarityRead.optional(), discount_percent: z.number().int().gte(0).lte(100).optional(), bonus_percent: z.number().int().gte(0).optional(), is_custom: z.boolean().optional(), created_at: z.number(), modified_at: z.number().optional(), archived_at: z.number().optional(), price_minor_unit: z.number().int().optional(), price_decimal: z.number().optional(), fallback_item_id: z.string().max(32).optional(), fallback_item_quantity: z.number().int().optional(), meta: z.record(z.string(), z.unknown()).optional(), nested_items_choices: nestedItemsChoices.optional(), count: z.number().int().gt(0).optional(), quantity_expression: expression.optional()}); export const loyaltyTier = z.object({name: z.string().max(255), points: z.number().int(), image_url: z.union([z.string().min(1).max(65536), z.literal("")]), id: z.string().max(32), items: z.array(loyaltyItem)}); export const updateApiV1LoyaltyLoyaltySettingsIdTiersResponse = z.array(loyaltyTier); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Update Loyalty Tiers * * PUT /v1/loyalty/{loyalty_settings_id}/tiers */ export const updateApiV1LoyaltyLoyaltySettingsIdTiers = async (args: UpdateApiV1LoyaltyLoyaltySettingsIdTiersArgs, options?: UpdateApiV1LoyaltyLoyaltySettingsIdTiersOptions) => { const {baseUrl = "https://api.aghanim.com/s2s", fetch: fetchFn = fetch, HTTPBearer} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (HTTPBearer !== undefined) headers.set('authorization', `Bearer ${HTTPBearer}`) const url = `${baseUrl.replace(/\/+$/, '')}/v1/loyalty/${encodeURIComponent(String(args.loyalty_settings_id))}/tiers${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "PUT", headers, body: JSON.stringify(args.body)}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(updateApiV1LoyaltyLoyaltySettingsIdTiersResponse, await res.json()) };