import {z} from 'zod' export type CreateApiGoalsGoalIdUnpublishArgs = {goal_id: string}; export type CreateApiGoalsGoalIdUnpublishOptions = {baseUrl: string, fetch?: typeof fetch | undefined}; export const goalDate = z.object({date: z.string(), precision: z.enum(["day", "month", "quarter", "season"]).optional()}); export const goalAnchorPayload = z.object({kind: z.enum(["event", "route"]), id: z.string(), name: z.string(), date: z.string().nullable().optional(), date_month: z.string().nullable().optional(), city: z.string().nullable().optional(), country: z.string().nullable().optional(), website_url: z.string().nullable().optional(), short_link: z.string().nullable().optional(), distance: z.string().nullable().optional(), distance_km: z.number().nullable().optional()}); export const goalRoleEvidence = z.object({kind: z.enum(["said", "candidate"]), text: z.string().min(1), candidate: z.string().min(1).nullable().optional(), chosen_by: z.string().min(1).nullable().optional()}); export const goalEvent = z.object({name: z.string().min(1), when: goalDate.nullable().optional(), id: z.string().min(1).nullable().optional(), role: z.enum(["main", "rehearsal", "training"]).nullable().optional(), role_from: goalRoleEvidence.nullable().optional()}); export const goalWeekCommitment = z.object({name: z.string().min(1), detail: z.string().min(1)}); export const goalComingFrom = z.object({event: z.string().min(1), felt: z.string().nullable().optional(), felt_summary: z.string().nullable().optional(), lesson: z.string().nullable().optional(), lesson_summary: z.string().nullable().optional()}); export const goalFactorLines = z.object({name: z.string().min(1), asks_line: z.string().min(1).nullable().optional(), standing_line: z.string().min(1).nullable().optional()}); export const goalPage = z.object({why: z.string().nullable().optional(), why_summary: z.string().nullable().optional(), journey: z.string().nullable().optional(), sport: z.string().nullable().optional(), week: z.array(goalWeekCommitment).optional(), life: z.array(z.string()).optional(), history: goalComingFrom.nullable().optional(), honest_subtitle: z.string().nullable().optional(), factor_lines: z.array(goalFactorLines).optional()}); export const goalCheckpointPayload = z.object({name: z.string().min(1).nullable().optional(), measure: z.string().min(1), by: goalDate, on_miss: z.string().min(1), anchor: goalAnchorPayload.nullable().optional()}); export const goalCandidate = z.object({name: z.string().min(1), demands: z.string().min(1), label: z.string().min(1).nullable().optional(), tags: z.array(z.string()).optional(), target: goalDate.nullable().optional(), recommended: z.boolean().optional(), chosen: z.boolean().optional()}); export const goalFallbackPayload = z.object({when: z.string().min(1), then: z.string().min(1), athlete_quote: z.string().nullable().optional()}); export const goalShareRevision = z.object({published_at: z.string(), name: z.string(), target_date: z.string(), target_precision: z.enum(["day", "month", "quarter", "season"])}); export const goalSharePage = z.object({name: z.string(), line: z.string().nullable().optional(), locale: z.string(), kind: z.enum(["destination", "practice"]), sport: z.string().nullable().optional(), set_at: z.string(), target: goalDate, anchor_kind: z.enum(["event", "route"]).nullable().optional(), anchor: goalAnchorPayload.nullable().optional(), factors: z.array(z.record(z.string(), z.unknown())).optional(), events: z.array(goalEvent).optional(), page: goalPage.nullable().optional(), page_expected_until: z.string().nullable().optional(), checkpoints: z.array(goalCheckpointPayload).optional(), alternatives: z.array(goalCandidate).optional(), offered_goals: z.array(goalCandidate).nullable().optional(), fallbacks: z.array(goalFallbackPayload).optional(), revisions: z.array(goalShareRevision).optional(), share_id: z.string(), slug: z.string(), target_date: z.string(), target_precision: z.enum(["day", "month", "quarter", "season"])}); 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 }; /** * Unpublish Goal * * POST /goals/{goal_id}/unpublish */ export const createApiGoalsGoalIdUnpublish = async (args: CreateApiGoalsGoalIdUnpublishArgs, options: CreateApiGoalsGoalIdUnpublishOptions) => { const {baseUrl, fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") const url = `${baseUrl.replace(/\/+$/, '')}/goals/${encodeURIComponent(String(args.goal_id))}/unpublish${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(goalSharePage, await res.json()) };