/** * Generated by orval v8.5.3 🍺 * Do not edit manually. * Api * TeaBoy OS API specification * OpenAPI spec version: 0.1.0 */ export interface HealthStatus { status: string; } export interface ErrorResponse { error: string; } export interface SuccessResponse { success: boolean; } export interface RegisterBody { username: string; email: string; password: string; /** @nullable */ displayNameAr?: string | null; /** @nullable */ displayNameEn?: string | null; preferredLanguage?: string; } export interface LoginBody { username: string; password: string; } export interface ForgotPasswordBody { /** Username or email */ identifier: string; } export interface ForgotPasswordResponse { success: boolean; } export interface ResetPasswordBody { token: string; /** @minLength 6 */ newPassword: string; } export interface VerifyResetTokenBody { token: string; } export interface AdminResetLinkResponse { resetUrl: string; expiresAt: string; } export interface VerifyResetTokenResponse { valid: boolean; } export interface UpdateLanguageBody { language: string; } /** * Per-user home-screen clock style preference */ export type ClockStyle = (typeof ClockStyle)[keyof typeof ClockStyle]; export const ClockStyle = { full: "full", digital: "digital", "digital-no-seconds": "digital-no-seconds", analog: "analog", minimal: "minimal", } as const; export interface UpdateClockStyleBody { /** Clock style; pass null to clear and use the default */ clockStyle: ClockStyle | null; } export interface UpdateClockHour12Body { /** * Whether to use 12-hour (AM/PM) clock format; null clears and uses the default (24-hour) * @nullable */ clockHour12: boolean | null; } export interface AuthUser { id: number; username: string; email: string; /** @nullable */ displayNameAr?: string | null; /** @nullable */ displayNameEn?: string | null; preferredLanguage: string; clockStyle?: ClockStyle | null; /** @nullable */ clockHour12?: boolean | null; /** @nullable */ avatarUrl?: string | null; isActive: boolean; roles: string[]; createdAt: string; } export interface UserProfile { id: number; username: string; email: string; /** @nullable */ displayNameAr?: string | null; /** @nullable */ displayNameEn?: string | null; preferredLanguage: string; clockStyle?: ClockStyle | null; /** @nullable */ clockHour12?: boolean | null; /** @nullable */ avatarUrl?: string | null; isActive: boolean; roles: string[]; createdAt: string; } export interface UpdateUserBody { /** @nullable */ displayNameAr?: string | null; /** @nullable */ displayNameEn?: string | null; isActive?: boolean; preferredLanguage?: string; } export interface App { id: number; slug: string; nameAr: string; nameEn: string; /** @nullable */ descriptionAr?: string | null; /** @nullable */ descriptionEn?: string | null; iconName: string; route: string; color: string; isActive: boolean; isSystem: boolean; sortOrder: number; createdAt: string; updatedAt: string; } export interface CreateAppBody { slug: string; nameAr: string; nameEn: string; /** @nullable */ descriptionAr?: string | null; /** @nullable */ descriptionEn?: string | null; iconName: string; route: string; color: string; isActive?: boolean; isSystem?: boolean; sortOrder?: number; } export interface UpdateAppBody { nameAr?: string; nameEn?: string; /** @nullable */ descriptionAr?: string | null; /** @nullable */ descriptionEn?: string | null; iconName?: string; route?: string; color?: string; isActive?: boolean; sortOrder?: number; } export interface Service { id: number; /** @nullable */ categoryId?: number | null; nameAr: string; nameEn: string; /** @nullable */ descriptionAr?: string | null; /** @nullable */ descriptionEn?: string | null; /** @nullable */ imageUrl?: string | null; /** @nullable */ price?: string | null; isAvailable: boolean; sortOrder: number; createdAt: string; updatedAt: string; } export interface CreateServiceBody { /** @nullable */ categoryId?: number | null; nameAr: string; nameEn: string; /** @nullable */ descriptionAr?: string | null; /** @nullable */ descriptionEn?: string | null; /** @nullable */ imageUrl?: string | null; /** @nullable */ price?: string | null; isAvailable?: boolean; sortOrder?: number; } export interface UpdateServiceBody { /** @nullable */ categoryId?: number | null; nameAr?: string; nameEn?: string; /** @nullable */ descriptionAr?: string | null; /** @nullable */ descriptionEn?: string | null; /** @nullable */ imageUrl?: string | null; /** @nullable */ price?: string | null; isAvailable?: boolean; sortOrder?: number; } export interface ServiceCategory { id: number; nameAr: string; nameEn: string; sortOrder: number; createdAt: string; } export interface ServiceOrderUser { id: number; username: string; /** @nullable */ displayNameAr?: string | null; /** @nullable */ displayNameEn?: string | null; /** @nullable */ avatarUrl?: string | null; } export interface ServiceOrderService { id: number; nameAr: string; nameEn: string; /** @nullable */ imageUrl?: string | null; } export type ServiceOrderStatus = (typeof ServiceOrderStatus)[keyof typeof ServiceOrderStatus]; export const ServiceOrderStatus = { pending: "pending", claimed: "claimed", delivered: "delivered", received: "received", cancelled: "cancelled", } as const; export interface ServiceOrder { id: number; serviceId: number; requestedBy: number; /** @nullable */ assignedTo?: number | null; quantity: number; /** @nullable */ notes?: string | null; status: ServiceOrderStatus; createdAt: string; /** @nullable */ claimedAt?: string | null; /** @nullable */ deliveredAt?: string | null; /** @nullable */ receivedAt?: string | null; /** @nullable */ cancelledAt?: string | null; service: ServiceOrderService; requester?: ServiceOrderUser | null; assignee?: ServiceOrderUser | null; } export interface CreateServiceOrderBody { serviceId: number; /** * @minimum 1 * @maximum 50 */ quantity?: number; /** * @maxLength 500 * @nullable */ notes?: string | null; } export type UpdateServiceOrderStatusBodyStatus = (typeof UpdateServiceOrderStatusBodyStatus)[keyof typeof UpdateServiceOrderStatusBodyStatus]; export const UpdateServiceOrderStatusBodyStatus = { claimed: "claimed", delivered: "delivered", cancelled: "cancelled", } as const; export interface UpdateServiceOrderStatusBody { status: UpdateServiceOrderStatusBodyStatus; } export interface ParticipantInfo { id: number; username: string; /** @nullable */ displayNameAr?: string | null; /** @nullable */ displayNameEn?: string | null; /** @nullable */ avatarUrl?: string | null; isAdmin: boolean; } export type MessageWithSenderKind = (typeof MessageWithSenderKind)[keyof typeof MessageWithSenderKind]; export const MessageWithSenderKind = { user: "user", group_renamed: "group_renamed", members_added: "members_added", member_removed: "member_removed", member_left: "member_left", admin_promoted: "admin_promoted", } as const; export type MessageWithSenderMeta = { [key: string]: unknown } | null; export interface MessageWithSender { id: number; conversationId: number; senderId: number; content: string; kind: MessageWithSenderKind; meta?: MessageWithSenderMeta; sender: ParticipantInfo; createdAt: string; updatedAt: string; } export interface ConversationWithDetails { id: number; /** @nullable */ nameAr?: string | null; /** @nullable */ nameEn?: string | null; /** @nullable */ avatarUrl?: string | null; isGroup: boolean; createdBy: number; participants: ParticipantInfo[]; lastMessage?: MessageWithSender | null; unreadCount: number; isMuted: boolean; isArchived: boolean; createdAt: string; updatedAt: string; } export interface CreateConversationBody { participantIds: number[]; /** @nullable */ nameAr?: string | null; /** @nullable */ nameEn?: string | null; /** @nullable */ avatarUrl?: string | null; isGroup?: boolean; } export interface UpdateConversationBody { /** @nullable */ avatarUrl?: string | null; /** @nullable */ nameAr?: string | null; /** @nullable */ nameEn?: string | null; } export interface UpdateConversationStateBody { isMuted?: boolean; isArchived?: boolean; } export interface AddParticipantsBody { userIds: number[]; } export interface SendMessageBody { content: string; } export interface Notification { id: number; userId: number; titleAr: string; titleEn: string; /** @nullable */ bodyAr?: string | null; /** @nullable */ bodyEn?: string | null; type: string; isRead: boolean; /** @nullable */ relatedId?: number | null; /** @nullable */ relatedType?: string | null; createdAt: string; } export interface AppSettings { siteNameAr: string; siteNameEn: string; registrationOpen: boolean; footerTextAr: string; footerTextEn: string; updatedAt?: string; } export interface UpdateMyAppOrderBody { /** App IDs in the desired display order */ order: number[]; } export interface UpdateAppSettingsBody { /** * @minLength 1 * @maxLength 200 */ siteNameAr?: string; /** * @minLength 1 * @maxLength 200 */ siteNameEn?: string; registrationOpen?: boolean; /** * @minLength 1 * @maxLength 300 */ footerTextAr?: string; /** * @minLength 1 * @maxLength 300 */ footerTextEn?: string; } export interface RequestUploadUrlBody { /** @minLength 1 */ name: string; /** @minimum 1 */ size: number; /** @minLength 1 */ contentType: string; } export interface RequestUploadUrlResponse { uploadURL: string; objectPath: string; metadata?: RequestUploadUrlBody; } export interface HomeStats { totalApps: number; totalServices: number; unreadNotifications: number; unreadMessages: number; totalUsers: number; } export type AdminStatsRange = (typeof AdminStatsRange)[keyof typeof AdminStatsRange]; export const AdminStatsRange = { "7d": "7d", "30d": "30d", "90d": "90d", custom: "custom", } as const; export type AdminStatsSignupsByDayItem = { date: string; count: number; }; export type AdminStatsAppOpensByDayItem = { date: string; count: number; }; export type AdminStatsServicesCreatedByDayItem = { date: string; count: number; }; export interface TopAppItem { appId: number; slug: string; nameAr: string; nameEn: string; iconName: string; color: string; count: number; } export interface TopUserItem { userId: number; username: string; /** @nullable */ displayNameAr?: string | null; /** @nullable */ displayNameEn?: string | null; /** @nullable */ avatarUrl?: string | null; count: number; } export interface AdminStats { range: AdminStatsRange; rangeDays: number; /** Start date (YYYY-MM-DD UTC) of the selected window */ rangeFrom?: string; /** End date (YYYY-MM-DD UTC) of the selected window */ rangeTo?: string; newUsersInRange: number; newUsersPrevRange: number; activeServices: number; inactiveServices: number; signupsByDay: AdminStatsSignupsByDayItem[]; appOpensByDay: AdminStatsAppOpensByDayItem[]; appOpensInRange: number; appOpensPrevRange: number; servicesCreatedByDay: AdminStatsServicesCreatedByDayItem[]; servicesCreatedInRange: number; topApps: TopAppItem[]; mostActiveUsers: TopUserItem[]; } export interface AppOpenByAppEntry { id: number; createdAt: string; userId: number; username: string; /** @nullable */ displayNameAr?: string | null; /** @nullable */ displayNameEn?: string | null; /** @nullable */ avatarUrl?: string | null; } export type AdminAppOpensByAppRange = (typeof AdminAppOpensByAppRange)[keyof typeof AdminAppOpensByAppRange]; export const AdminAppOpensByAppRange = { "7d": "7d", "30d": "30d", "90d": "90d", custom: "custom", } as const; export interface AdminAppOpensByApp { appId: number; slug: string; nameAr: string; nameEn: string; iconName: string; color: string; range: AdminAppOpensByAppRange; rangeDays: number; rangeFrom: string; rangeTo: string; totalCount: number; limit: number; offset: number; /** @nullable */ nextOffset: number | null; opens: AppOpenByAppEntry[]; } export interface AppOpenByUserEntry { id: number; createdAt: string; appId: number; slug: string; nameAr: string; nameEn: string; iconName: string; color: string; } export type AdminAppOpensByUserRange = (typeof AdminAppOpensByUserRange)[keyof typeof AdminAppOpensByUserRange]; export const AdminAppOpensByUserRange = { "7d": "7d", "30d": "30d", "90d": "90d", custom: "custom", } as const; export interface AdminAppOpensByUser { userId: number; username: string; /** @nullable */ displayNameAr?: string | null; /** @nullable */ displayNameEn?: string | null; /** @nullable */ avatarUrl?: string | null; range: AdminAppOpensByUserRange; rangeDays: number; rangeFrom: string; rangeTo: string; totalCount: number; limit: number; offset: number; /** @nullable */ nextOffset: number | null; opens: AppOpenByUserEntry[]; } export type LeaveConversationBody = { /** When the leaver is the only admin, optionally name a specific remaining member to promote. Omit (or send null) to keep the automatic behavior of promoting the longest-tenured member. */ successorId?: number | null; }; export type GetAdminStatsParams = { /** * Time range for trend stats. Use "custom" with from/to. */ range?: GetAdminStatsRange; /** * Start date (inclusive, YYYY-MM-DD UTC) when range=custom */ from?: string; /** * End date (inclusive, YYYY-MM-DD UTC) when range=custom */ to?: string; }; export type GetAdminStatsRange = (typeof GetAdminStatsRange)[keyof typeof GetAdminStatsRange]; export const GetAdminStatsRange = { "7d": "7d", "30d": "30d", "90d": "90d", custom: "custom", } as const; export type GetAdminAppOpensByAppParams = { range?: GetAdminAppOpensByAppRange; from?: string; to?: string; /** * @minimum 1 * @maximum 200 */ limit?: number; /** * @minimum 0 */ offset?: number; }; export type GetAdminAppOpensByAppRange = (typeof GetAdminAppOpensByAppRange)[keyof typeof GetAdminAppOpensByAppRange]; export const GetAdminAppOpensByAppRange = { "7d": "7d", "30d": "30d", "90d": "90d", custom: "custom", } as const; export type GetAdminAppOpensByUserParams = { range?: GetAdminAppOpensByUserRange; from?: string; to?: string; /** * @minimum 1 * @maximum 200 */ limit?: number; /** * @minimum 0 */ offset?: number; }; export type GetAdminAppOpensByUserRange = (typeof GetAdminAppOpensByUserRange)[keyof typeof GetAdminAppOpensByUserRange]; export const GetAdminAppOpensByUserRange = { "7d": "7d", "30d": "30d", "90d": "90d", custom: "custom", } as const;