import {z} from 'zod' export type GetApiPublicCommunitiesSubdomainQuestsArgs = {subdomain: string, 'x-api-key': string}; export type GetApiPublicCommunitiesSubdomainQuestsOptions = {baseUrl?: string | undefined, fetch?: typeof fetch | undefined}; export const getApiPublicCommunitiesSubdomainQuestsResponse = z.array(z.object({description: z.object({type: z.string().optional(), text: z.string().optional(), attrs: z.record(z.string(), z.unknown()).optional(), marks: z.array(z.object({type: z.string(), attrs: z.object({href: z.string().optional(), target: z.enum(["_blank", "_parent", "_self", "_top"]).optional(), class: z.string().nullable().optional()}).and(z.record(z.string(), z.unknown())).optional()}).and(z.record(z.string(), z.unknown()))).optional(), content: z.unknown()}).and(z.record(z.string(), z.unknown())).nullable(), id: z.string(), name: z.string(), deleted: z.boolean().optional(), communityId: z.string().optional(), categoryId: z.string().optional(), createdAt: z.string().optional(), updatedAt: z.string().optional(), archived: z.boolean().nullable(), autoValidate: z.boolean().optional(), conditionOperator: z.enum(["AND", "OR"]).nullable(), conditions: z.array(z.object({type: z.enum(["level", "role", "nft", "quest", "date"]), value: z.union([z.string(), z.number()]), operator: z.enum(["=", ">", "<", ">=", "<=", "!=", "isCompleted", "isNotCompleted"])})), published: z.boolean(), recurrence: z.enum(["daily", "weekly", "monthly", "once"]), retryAfter: z.number().nullable(), rewards: z.array(z.object({type: z.enum(["xp", "role", "other"]), operator: z.enum(["=", ">", "<", ">=", "<=", "!=", "isCompleted", "isNotCompleted"]).optional(), value: z.union([z.string(), z.number()]), chain: z.enum(["polygon", "ethereum"]).optional(), collection: z.string().optional(), contractAddress: z.string().optional()})).nullable(), tasks: z.array(z.union([z.object({id: z.string().optional(), metadata: z.unknown(), type: z.literal("api"), settings: z.object({title: z.string().optional(), description: z.string().optional(), endpoint: z.string(), apiKey: z.string().optional(), identifications: z.array(z.enum(["email", "twitter", "discord", "wallet", "zealy-connect"])), network: z.enum(["eth-mainnet", "opt-mainnet", "arb-mainnet", "polygon-mainnet", "base-mainnet", "sol-mainnet", "bnb-mainnet", "linea-mainnet", "avalanche-mainnet", "fantom-mainnet", "cronos-mainnet", "palm-mainnet", "gnosis-mainnet", "chiliz-mainnet", "moonbeam-mainnet", "polygonzkevm-mainnet", "zksync-mainnet", "ton-mainnet"]).optional(), redirectUrl: z.string().optional()})}), z.object({id: z.string().optional(), metadata: z.unknown(), type: z.literal("text"), settings: z.union([z.object({title: z.string().optional(), description: z.string().optional(), autoValidated: z.literal(false)}), z.object({title: z.string().optional(), description: z.string().optional(), autoValidated: z.literal(true), correctAnswer: z.string().optional()})])}), z.object({id: z.string().optional(), metadata: z.unknown(), type: z.literal("discord"), settings: z.object({inviteUrl: z.string()})}), z.object({id: z.string().optional(), metadata: z.unknown(), type: z.literal("url"), settings: z.union([z.object({title: z.string().optional(), description: z.string().optional(), autoValidated: z.literal(false)}), z.object({title: z.string().optional(), description: z.string().optional(), autoValidated: z.literal(true), correctAnswer: z.union([z.literal(""), z.string()])})])}), z.object({id: z.string().optional(), metadata: z.unknown(), type: z.literal("telegram"), settings: z.object({inviteUrl: z.union([z.string(), z.string()])})}), z.object({id: z.string().optional(), metadata: z.unknown(), type: z.literal("invites"), settings: z.object({})}), z.object({id: z.string().optional(), metadata: z.unknown(), type: z.literal("quiz"), settings: z.object({title: z.string().optional(), description: z.string().optional(), multipleSelection: z.boolean().optional(), shuffleOptionsOrder: z.boolean().optional(), verticalAlignement: z.boolean().optional(), withImage: z.literal(false).optional(), options: z.array(z.object({label: z.string(), correctAnswer: z.boolean().optional()}))})}), z.object({id: z.string().optional(), metadata: z.unknown(), type: z.literal("visitLink"), settings: z.object({linkUrl: z.string()})}), z.object({id: z.string().optional(), metadata: z.unknown(), type: z.literal("file"), settings: z.union([z.object({restrictFileType: z.literal(false), autoValidated: z.boolean().optional()}), z.object({restrictFileType: z.literal(true), fileTypes: z.array(z.enum(["document", "presentation", "spreadsheet", "drawing", "pdf", "image", "video", "audio", "archive"])), autoValidated: z.boolean().optional()})])}), z.object({id: z.string().optional(), metadata: z.unknown(), type: z.literal("date"), settings: z.union([z.object({title: z.string().optional(), description: z.string().optional(), autoValidated: z.literal(false)}), z.object({title: z.string().optional(), description: z.string().optional(), autoValidated: z.literal(true), correctAnswer: z.string().optional()})])}), z.object({id: z.string().optional(), metadata: z.unknown(), type: z.literal("number"), settings: z.union([z.object({title: z.string().optional(), description: z.string().optional(), autoValidated: z.literal(false)}), z.object({title: z.string().optional(), description: z.string().optional(), autoValidated: z.literal(true), correctAnswer: z.union([z.number(), z.unknown()]).optional()})])}), z.object({id: z.string().optional(), metadata: z.unknown(), type: z.literal("poll"), settings: z.object({title: z.string().optional(), description: z.string().optional(), multipleSelection: z.boolean().optional(), shuffleOptionsOrder: z.boolean().optional(), verticalAlignement: z.boolean().optional(), autoValidated: z.boolean().optional(), otherOption: z.boolean().optional(), withImage: z.literal(false).optional(), options: z.array(z.object({label: z.string()}))})}), z.object({id: z.string().optional(), metadata: z.unknown(), type: z.literal("opinion"), settings: z.union([z.object({title: z.string().optional(), description: z.string().optional(), scaleType: z.literal("numerical"), step: z.object({start: z.number().int().gte(-10), end: z.number().int().lte(100)}), label: z.object({start: z.string().optional(), end: z.string().optional(), middle: z.string().optional()}).optional()}), z.object({title: z.string().optional(), description: z.string().optional(), scaleType: z.literal("stars")})])}), z.object({id: z.string().optional(), metadata: z.unknown(), type: z.literal("twitterFollow"), settings: z.object({username: z.string()})}), z.object({id: z.string().optional(), metadata: z.unknown(), type: z.literal("twitterSpace"), settings: z.object({spaceUrl: z.string(), password: z.string().optional()})}), z.object({id: z.string().optional(), metadata: z.unknown(), type: z.literal("tweetReact"), settings: z.object({actions: z.array(z.enum(["like", "retweet", "reply"])), tweetUrl: z.string()})}), z.object({id: z.string().optional(), metadata: z.unknown(), type: z.literal("tweet"), settings: z.object({defaultTweet: z.string().optional(), tweetWords: z.array(z.string())})}), z.object({id: z.string().optional(), metadata: z.unknown(), type: z.literal("tiktok"), settings: z.object({descriptionWords: z.array(z.string()), minViewCount: z.number().int().gte(0).nullable()})})])), claimLimit: z.number().nullable().optional(), claimCounter: z.number().nullable().optional()})); 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 }; /** * List quests in a community * * GET /public/communities/{subdomain}/quests */ export const getApiPublicCommunitiesSubdomainQuests = async (args: GetApiPublicCommunitiesSubdomainQuestsArgs, options?: GetApiPublicCommunitiesSubdomainQuestsOptions) => { const {baseUrl = "https://api-v2.zealy.io", fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args['x-api-key'] != null) headers.set("x-api-key", String(args['x-api-key'])) const url = `${baseUrl.replace(/\/+$/, '')}/public/communities/${encodeURIComponent(String(args.subdomain))}/quests${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(getApiPublicCommunitiesSubdomainQuestsResponse, await res.json()) };