import {z} from 'zod' export type GetApiApiUserProjectsOptions = {baseUrl?: string | undefined, ApiKeyAuthentication?: string | undefined, fetch?: typeof fetch | undefined}; export const staffInfo = z.object({isStaff: z.boolean(), hasSudoRights: z.boolean(), companyName: z.string().optional()}); export const permission = z.enum(["admin:infra:datasetVersioning:queue:write", "admin:infra:disallowedEmailDomains:read", "admin:infra:disallowedEmailDomains:write", "admin:infra:featureFlags:read", "admin:infra:featureFlags:write", "admin:infra:config:read", "admin:infra:config:write", "admin:infra:migrations:read", "admin:infra:migrations:write", "admin:metrics:read", "admin:metrics:write", "admin:oauth:read", "admin:oauth:write", "admin:organizations:extensions:write", "admin:organizations:read", "admin:organizations:write", "admin:organizations:members:write", "admin:projects:members:write", "admin:projects:read", "admin:projects:write", "admin:trashbin:write", "admin:trials:read", "admin:trials:write", "admin:users:permissions:write", "admin:users:read", "admin:users:signupApprovals:read", "admin:users:signupApprovals:write", "admin:users:write", "admin:jobs:read", "admin:emails:verification:code:read", "admin:sso:read", "admin:sso:domainIdps:write", "admin:vlm:model:read", "admin:vlm:model:write", "projects:limits:write", "projects:training:keras:write", "projects:data:versioning:write", "users:emails:read", "whitelabels:read", "whitelabels:write", "test:data:write", "test:users:read", "test:users:write"]); export const userTierEnum = z.enum(["free", "community-plus", "professional", "enterprise"]); export const projectCollaborator = z.object({id: z.number().int(), username: z.string(), name: z.string(), email: z.string(), photo: z.string().optional(), created: z.string(), lastSeen: z.string().optional(), staffInfo: staffInfo, pending: z.boolean(), jobTitle: z.string().optional(), permissions: z.array(permission).optional(), companyName: z.string().optional(), activated: z.boolean(), mfaConfigured: z.boolean(), stripeCustomerId: z.string().optional(), hasPendingPayments: z.boolean().optional(), tier: userTierEnum.optional(), idps: z.array(z.string()).optional(), isOwner: z.boolean()}); export const projectLabelingMethod = z.enum(["single_label", "object_detection", "label_map"]); export const publicProjectLicense = z.enum(["Apache-2.0", "BSD-3-Clause", "BSD-3-Clause-Clear"]); export const projectTierEnum = z.enum(["free", "community-plus", "professional", "enterprise"]); export const project = z.object({id: z.number().int(), name: z.string(), description: z.string(), created: z.string(), owner: z.string(), lastAccessed: z.string().optional(), lastModified: z.string().optional(), lastModificationDetails: z.string().optional(), logo: z.string().optional(), ownerUserId: z.number().int().optional(), ownerOrganizationId: z.number().int().optional(), ownerAvatar: z.string().optional(), ownerIsDeveloperProfile: z.boolean(), developerProfileUserId: z.number().int().optional(), collaborators: z.array(projectCollaborator), labelingMethod: projectLabelingMethod, metadata: z.object({}), dataExplorerScreenshot: z.string().optional(), isEnterpriseProject: z.boolean(), whitelabelId: z.number().int().nullable(), whitelabelName: z.string().optional(), tags: z.array(z.string()).optional(), category: z.enum(["Accelerometer", "Audio", "Images", "Keyword spotting", "Object detection", "Other"]).optional(), license: publicProjectLicense.optional(), tier: projectTierEnum, hasPublicVersion: z.boolean(), isPublic: z.boolean(), allowsLivePublicAccess: z.boolean(), indPauseProcessingSamples: z.boolean(), publicProjectListed: z.boolean(), deletedDate: z.string().optional(), fullDeletionDate: z.string().optional(), scheduledFullDeletionDate: z.string().optional()}); export const getUserProjectsResponse = z.object({success: z.boolean(), error: z.string().optional(), projects: z.array(project)}); 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 }; /** * Get current user projects * * GET /api/user/projects * * Also accepts auth: JWTAuthentication, JWTHttpHeaderAuthentication, OAuth2 */ export const getApiApiUserProjects = async (options?: GetApiApiUserProjectsOptions) => { const {baseUrl = "https://studio.edgeimpulse.com/v1", fetch: fetchFn = fetch, ApiKeyAuthentication} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (ApiKeyAuthentication !== undefined) headers.set("x-api-key", ApiKeyAuthentication) const url = `${baseUrl.replace(/\/+$/, '')}/api/user/projects${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(getUserProjectsResponse, await res.json()) };