import {z} from 'zod' export type BadgeAssertionOrderBy = 'Time_Created_Asc' | 'Time_Created_Desc' | 'Name_Asc' | 'Name_Desc'; export type GetApiV1BadgeAssertionArgs = {recipient_id?: number | undefined, badge_id?: number | undefined, provider_id?: number | undefined, recipient_email?: string | undefined, order_by?: BadgeAssertionOrderBy | undefined, keyword?: string | undefined, status?: string | undefined, paginated?: boolean | undefined, page?: number | undefined, size?: number | undefined, 'X-Access-Token'?: (string | null) | undefined}; export type GetApiV1BadgeAssertionOptions = {baseUrl: string, OAuth2PasswordBearer?: string | undefined, fetch?: typeof fetch | undefined}; export const sourceType = z.enum(["Internal", "Credly", "Open_University", "Imported"]); export const userStatus = z.enum(["Active", "Suspended", "Deleted"]); export const userVisibility = z.enum(["Public", "Private"]); export const userDetailLight = z.object({id: z.number().int(), status: userStatus.optional(), visibility: userVisibility.optional(), firstname: z.string().nullable(), lastname: z.string().nullable(), avatar_url: z.string().nullable().optional(), avatar_url_2x: z.string().nullable().optional(), avatar_url_original: z.string().nullable().optional(), time_created: z.string().optional(), time_updated: z.string().nullable().optional(), noindex_enabled: z.boolean().nullable().optional()}); export const providerStatus = z.enum(["Active", "Suspended", "Deleted"]); export const providerType = z.enum(["Learning_Provider", "Training_Provider", "Awarding_Body", "Employer", "Local_Authority", "University", "College", "Charity", "Department", "Project", "Other"]); export const communityStatus = z.enum(["Active", "Suspended", "Deleted"]); export const communityType = z.enum(["City", "Region", "Local_Authority", "Membership_Organisation", "Awarding_Body", "Partnership", "Corporate", "Association", "University", "College", "Charity", "Other"]); export const communityLight = z.object({id: z.number().int(), status: communityStatus.optional(), type: communityType.nullable().optional(), name: z.string().nullable().optional(), short_name: z.string().max(12).nullable().optional(), is_verified: z.boolean().nullable().optional(), image_url: z.string().nullable().optional(), image_url_2x: z.string().nullable().optional(), image_url_original: z.string().nullable().optional(), linkedin_organisation_id: z.number().int().nullable().optional(), social_handle_linkedin: z.string().nullable().optional(), social_handle_twitter: z.string().nullable().optional(), social_handle_facebook: z.string().nullable().optional(), social_handle_instagram: z.string().nullable().optional(), url: z.string().nullable().optional()}); export const providerLight = z.object({id: z.number().int(), status: providerStatus.optional(), type: providerType.nullable().optional(), name: z.string().nullable().optional(), short_name: z.string().max(12).nullable().optional(), external_url: z.string().nullable().optional(), is_verified: z.boolean().nullable().optional(), verification_text: z.string().nullable().optional(), verification_url: z.string().nullable().optional(), is_demo: z.boolean().nullable().optional(), open_access: z.boolean().optional(), community_id: z.number().int().nullable().optional(), community: communityLight.nullable(), image_url: z.string().nullable().optional(), banner_url: z.string().nullable().optional(), image_url_2x: z.string().nullable().optional(), banner_url_2x: z.string().nullable().optional(), image_url_original: z.string().nullable().optional(), banner_url_original: z.string().nullable().optional(), qa_community_id: z.number().int().nullable().optional(), linkedin_organisation_id: z.number().int().nullable().optional(), social_handle_linkedin: z.string().nullable().optional(), social_handle_twitter: z.string().nullable().optional(), social_handle_facebook: z.string().nullable().optional(), social_handle_instagram: z.string().nullable().optional(), url: z.string().nullable().optional()}); export const badgeStatus = z.enum(["Initialising", "Draft", "Awaiting_Approval", "Published", "Deleted", "Expired"]); export const badgeType = z.enum(["Experience", "Learning", "Validation", "Certification", "Attendance", "Work_Experience", "Volunteering", "Job", "Apprenticeship", "Course", "Internship", "Workshop", "Campaigning", "Activism", "Other", "Informal_Learning", "Training", "Certified", "Qualification", "Membership"]); export const language = z.enum(["Arabic_Modern_Standard", "Bengali", "Bulgarian", "Chinese_Cantonese", "Chinese_Mandarin", "Chinese_Simplified", "Chinese_Traditional", "Croatian", "Czech", "Dutch", "English", "French", "German", "Greek", "Hungarian", "Irish_Gaeilge", "Italian", "Kurdish_Kurmanji", "Kurdish_Sorani", "Latvian", "Lithuanian", "Pashto", "Persian", "Polish", "Portuguese", "Punjabi", "Romanian", "Scottish_Gaelic_Gaidhlig", "Slovak", "Somali", "Spanish", "Tigrinya", "Turkish", "Ukrainian", "Urdu", "Welsh_Cymraeg"]); export const recipientType = z.enum(["User", "Organisation"]); export const badgeCost = z.enum(["Free", "Paid", "Other"]); export const badgeLevel = z.enum(["Foundational", "Intermediate", "Advanced", "Other", "Explore", "Deepen", "Apply", "Teach", "Lead"]); export const timeToEarn = z.enum(["Hours", "Days", "Weeks", "Months", "Years", "Other"]); export const participationType = z.enum(["Online", "Hybrid", "In_Person"]); export const qualificationType = z.enum(["Award", "Certificate", "Diploma"]); export const qualificationFramework = z.enum(["RQF", "CQFW", "SCQF", "EQF", "QFEmirates"]); export const badgeGrade = z.enum(["Pass", "Merit", "Distinction", "Distinction*"]); export const sectorSubjectAreaEmbedded = z.object({id: z.number().int(), code: z.string(), name: z.string(), tier_1_name: z.string().nullable().optional(), image_label: z.string().nullable().optional()}); export const collectionLight = z.object({id: z.number().int(), name: z.string().nullable().optional(), badge_issuer_id: z.number().int().nullable().optional()}); export const badgeLight = z.object({id: z.number().int(), status: badgeStatus.optional(), name: z.string().nullable().optional(), type: badgeType.nullable().optional(), language: language.nullable().optional(), provider_ids: z.array(z.number().int()).nullable().optional(), community_ids: z.array(z.number().int()).nullable().optional(), recipient_type: recipientType.nullable().optional(), description: z.string().nullable().optional(), issuer_id: z.number().int().nullable().optional(), image_url: z.string().nullable().optional(), image_url_2x: z.string().nullable().optional(), image_url_original: z.string().nullable().optional(), source: sourceType.nullable().optional(), earn_url: z.string().nullable().optional(), external_url: z.string().nullable().optional(), information_url: z.string().nullable().optional(), latitude: z.number().nullable().optional(), longitude: z.number().nullable().optional(), city: z.string().nullable().optional(), country: z.string().nullable().optional(), address: z.string().nullable().optional(), available_to_all: z.boolean().nullable().optional(), availability: z.string().nullable().optional(), end_date: z.string().nullable().optional(), cost: badgeCost.nullable().optional(), level: badgeLevel.nullable().optional(), time_to_earn: timeToEarn.nullable().optional(), participation_type: participationType.nullable().optional(), qa_locked: z.boolean().nullable().optional(), job_titles: z.array(z.string()).nullable().optional(), specialized_occupations: z.array(z.string()).nullable().optional(), title_names: z.array(z.string()).nullable().optional(), is_demo: z.boolean().nullable().optional(), ranking: z.number().int().nullable().optional(), time_created: z.string().optional(), time_updated: z.string().nullable().optional(), time_submitted: z.string().nullable().optional(), time_published: z.string().nullable().optional(), quality_assured_at: z.string().nullable().optional(), time_issued: z.string().nullable().optional(), created_by_id: z.number().int().nullable().optional(), submitted_by_id: z.number().int().nullable().optional(), published_by_id: z.number().int().nullable().optional(), updated_by_id: z.number().int().nullable().optional(), interacted_with: z.boolean().nullable().optional(), featured: z.boolean().optional(), ai_generated: z.boolean().optional(), certificates_enabled: z.boolean().optional(), qualification_code: z.string().nullable().optional(), credits_available: z.number().nullable().optional(), credits_unit: z.string().nullable().optional(), qualification_type: qualificationType.nullable().optional(), qualification_framework: qualificationFramework.nullable().optional(), qualification_level: z.string().nullable().optional(), grade: badgeGrade.nullable().optional(), field_of_study_id: z.number().int().nullable().optional(), field_of_study: sectorSubjectAreaEmbedded.nullable().optional(), url: z.string().optional(), collections: z.array(collectionLight).nullable().optional(), display_level: z.string().nullable()}); export const badgeAssertionStatus = z.enum(["Pending", "Claimed", "Expired", "Revoked", "Deleted", "Failed", "Complained"]); export const issuingMethod = z.enum(["Email", "Activity", "Autobadge", "Bulk", "API", "Pushed", "Migrated", "QR", "Library_Card", "Riddle", "Typeform", "Zoho_Forms", "Tally", "Imported", "Pathway"]); export const changeRequestField = z.enum(["recipient_firstname", "recipient_lastname", "recipient_organisation", "extend_expiry"]); export const changeRequestStatus = z.enum(["requested", "approved", "rejected"]); export const badgeAssertionChangeRequestItem = z.object({field: changeRequestField, value: z.string().nullable().optional(), status: changeRequestStatus.optional(), reason: z.string().nullable().optional()}); export const badgeAssertionChangeRequest = z.object({id: z.string(), changes: z.array(badgeAssertionChangeRequestItem), note: z.string().nullable().optional(), time_created: z.string(), last_reminded_at: z.string().nullable().optional(), reminder_count: z.number().int().nullable().optional()}); export const badgeAssertionLight = z.object({id: z.number().int(), recipient_email: z.string().nullable().optional(), recipient_firstname: z.string().nullable().optional(), recipient_lastname: z.string().nullable().optional(), recipient_organisation: z.string().nullable().optional(), recipient_id: z.number().int().nullable().optional(), end_date: z.string().nullable().optional(), image_url: z.string().nullable().optional(), image_url_2x: z.string().nullable().optional(), image_url_original: z.string().nullable().optional(), source: sourceType.nullable().optional(), badge_issuer_id: z.number().int().nullable().optional(), provider_id: z.number().int().nullable().optional(), issue_date: z.string().nullable().optional(), time_verified: z.string().nullable().optional(), time_claimed: z.string().nullable().optional(), recipient: userDetailLight.nullable().optional(), provider: providerLight.nullable().optional(), badge: badgeLight.nullable().optional(), status: badgeAssertionStatus.optional(), issuing_method: issuingMethod.optional(), time_created: z.string().optional(), time_updated: z.string().nullable().optional(), created_by_id: z.number().int().nullable().optional(), updated_by_id: z.number().int().nullable().optional(), revocation_reason: z.string().nullable().optional(), url: z.string().nullable().optional(), badge_id: z.number().int().nullable().optional(), reminder_emails_sent: z.number().int().nullable().optional(), change_request: z.array(badgeAssertionChangeRequest).nullable().optional(), restorable_until: z.string().nullable().optional(), grade: badgeGrade.nullable().optional(), credits_earned: z.number().nullable().optional()}); export const badgeAssertionLightPublic = z.object({id: z.number().int(), recipient_firstname: z.string().nullable().optional(), recipient_lastname: z.string().nullable().optional(), recipient_organisation: z.string().nullable().optional(), recipient_id: z.number().int().nullable().optional(), end_date: z.string().nullable().optional(), image_url: z.string().nullable().optional(), image_url_2x: z.string().nullable().optional(), image_url_original: z.string().nullable().optional(), source: sourceType.nullable().optional(), badge_issuer_id: z.number().int().nullable().optional(), provider_id: z.number().int().nullable().optional(), issue_date: z.string().nullable().optional(), time_verified: z.string().nullable().optional(), time_claimed: z.string().nullable().optional(), recipient: userDetailLight.nullable().optional(), provider: providerLight.nullable().optional(), badge: badgeLight.nullable().optional(), status: badgeAssertionStatus.optional(), issuing_method: issuingMethod.optional(), time_created: z.string().optional(), time_updated: z.string().nullable().optional(), revocation_reason: z.string().nullable().optional(), url: z.string().nullable().optional(), badge_id: z.number().int().nullable().optional(), restorable_until: z.string().nullable().optional(), grade: badgeGrade.nullable().optional(), credits_earned: z.number().nullable().optional()}); export const pageUnionBadgeAssertionLightBadgeAssertionLightPublic = z.object({items: z.array(z.union([badgeAssertionLight, badgeAssertionLightPublic])), total: z.number().int().gte(0), page: z.number().int().gte(1), size: z.number().int().gte(1), pages: z.number().int().gte(0)}); export const getApiV1BadgeAssertionResponse = z.union([pageUnionBadgeAssertionLightBadgeAssertionLightPublic, z.array(z.union([badgeAssertionLight, badgeAssertionLightPublic]))]); 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 }; /** * Read Badge Assertions * * GET /v1/badge_assertion/ */ export const getApiV1BadgeAssertion = async (args: GetApiV1BadgeAssertionArgs, options: GetApiV1BadgeAssertionOptions) => { const {baseUrl, fetch: fetchFn = fetch, OAuth2PasswordBearer} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.recipient_id != null) query.append("recipient_id", String(args.recipient_id)) if (args.badge_id != null) query.append("badge_id", String(args.badge_id)) if (args.provider_id != null) query.append("provider_id", String(args.provider_id)) if (args.recipient_email != null) query.append("recipient_email", String(args.recipient_email)) if (args.order_by != null) query.append("order_by", String(args.order_by)) if (args.keyword != null) query.append("keyword", String(args.keyword)) if (args.status != null) query.append("status", String(args.status)) if (args.paginated != null) query.append("paginated", String(args.paginated)) if (args.page != null) query.append("page", String(args.page)) if (args.size != null) query.append("size", String(args.size)) if (args['X-Access-Token'] != null) headers.set("X-Access-Token", String(args['X-Access-Token'])) if (OAuth2PasswordBearer !== undefined) headers.set('authorization', `Bearer ${OAuth2PasswordBearer}`) const url = `${baseUrl.replace(/\/+$/, '')}/v1/badge_assertion/${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(getApiV1BadgeAssertionResponse, await res.json()) };