Files
TX/lib/api-client-react/src/generated/api.schemas.ts
T

845 lines
17 KiB
TypeScript
Raw Normal View History

2026-04-18 02:00:09 +00:00
/**
* Generated by orval v8.5.3 🍺
* Do not edit manually.
* Api
* Tx OS API specification
2026-04-18 02:00:09 +00:00
* 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 CreateUserBody {
username: string;
email: string;
password: string;
/** @nullable */
displayNameAr?: string | null;
/** @nullable */
displayNameEn?: string | null;
preferredLanguage?: string;
/** Initial group memberships in addition to the auto-assigned Everyone group. */
groupIds?: number[];
}
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 GroupSummary {
id: number;
name: string;
/** @nullable */
descriptionAr?: string | null;
/** @nullable */
descriptionEn?: string | 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[];
groups: GroupSummary[];
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[];
groups: GroupSummary[];
createdAt: string;
}
export interface UpdateUserBody {
/** @nullable */
displayNameAr?: string | null;
/** @nullable */
displayNameEn?: string | null;
isActive?: boolean;
preferredLanguage?: string;
/** If provided, replaces the user's group memberships */
groupIds?: number[];
}
export interface AddUserRoleBody {
/** @minLength 1 */
roleName: string;
}
export interface Role {
id: number;
name: string;
/** @nullable */
descriptionAr?: string | null;
/** @nullable */
descriptionEn?: string | null;
createdAt: string;
}
export interface Group {
id: number;
name: string;
/** @nullable */
descriptionAr?: string | null;
/** @nullable */
descriptionEn?: string | null;
isSystem: boolean;
memberCount: number;
appCount: number;
roleCount: number;
createdAt: string;
}
export interface GroupDetail {
id: number;
name: string;
/** @nullable */
descriptionAr?: string | null;
/** @nullable */
descriptionEn?: string | null;
isSystem: boolean;
appIds: number[];
roleIds: number[];
userIds: number[];
createdAt: string;
}
export interface CreateGroupBody {
/** @minLength 1 */
name: string;
/** @nullable */
descriptionAr?: string | null;
/** @nullable */
descriptionEn?: string | null;
appIds?: number[];
roleIds?: number[];
userIds?: number[];
}
export interface UpdateGroupBody {
/** @minLength 1 */
name?: string;
/** @nullable */
descriptionAr?: string | null;
/** @nullable */
descriptionEn?: string | null;
appIds?: number[];
roleIds?: number[];
userIds?: number[];
}
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",
received: "received",
preparing: "preparing",
completed: "completed",
cancelled: "cancelled",
} as const;
export interface ServiceOrder {
id: number;
serviceId: number;
userId: number;
/** @nullable */
assignedTo?: number | null;
/** @nullable */
notes?: string | null;
status: ServiceOrderStatus;
createdAt: string;
updatedAt: string;
service: ServiceOrderService;
requester?: ServiceOrderUser | null;
assignee?: ServiceOrderUser | null;
}
export interface CreateServiceOrderBody {
serviceId: number;
/**
* @maxLength 500
* @nullable
*/
notes?: string | null;
}
export type UpdateServiceOrderStatusBodyStatus =
(typeof UpdateServiceOrderStatusBodyStatus)[keyof typeof UpdateServiceOrderStatusBodyStatus];
export const UpdateServiceOrderStatusBodyStatus = {
pending: "pending",
received: "received",
preparing: "preparing",
completed: "completed",
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;
2026-04-20 11:33:06 +00:00
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;
2026-04-20 11:33:06 +00:00
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;
}
2026-04-20 12:16:55 +00:00
export type AdminStatsRange =
(typeof AdminStatsRange)[keyof typeof AdminStatsRange];
export const AdminStatsRange = {
"7d": "7d",
"30d": "30d",
"90d": "90d",
custom: "custom",
} as const;
2026-04-20 12:16:55 +00:00
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;
}
2026-04-20 12:16:55 +00:00
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;
2026-04-20 12:16:55 +00:00
activeServices: number;
inactiveServices: number;
signupsByDay: AdminStatsSignupsByDayItem[];
appOpensByDay: AdminStatsAppOpensByDayItem[];
appOpensInRange: number;
appOpensPrevRange: number;
servicesCreatedByDay: AdminStatsServicesCreatedByDayItem[];
servicesCreatedInRange: number;
topApps: TopAppItem[];
mostActiveUsers: TopUserItem[];
2026-04-20 12:16:55 +00:00
}
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 ListUsersParams = {
/**
* Free-text search across username, email, and display names
*/
q?: string;
/**
* Filter to users that belong to the given group
*/
groupId?: number;
/**
* Filter by active/disabled state
*/
status?: ListUsersStatus;
};
export type ListUsersStatus =
(typeof ListUsersStatus)[keyof typeof ListUsersStatus];
export const ListUsersStatus = {
active: "active",
disabled: "disabled",
} as const;
export type ListGroupsParams = {
q?: string;
};
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;