1f23e65c0b
Replaces all user-facing instances of "TeaBoy" with "Tx" across the application, including titles, locale files, database settings, seed data, and API documentation. Also updates internal storage keys and session secrets to remove the old branding. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 77cfe984-2c65-4152-bb7a-0df28274fe66 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: 07b19cb0-11b5-4be9-8932-ae4820eb73b8 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/c3c252e4-c83d-40ca-9fff-99a3ea60701e/77cfe984-2c65-4152-bb7a-0df28274fe66/HxTkDPZ Replit-Helium-Checkpoint-Created: true
845 lines
17 KiB
TypeScript
845 lines
17 KiB
TypeScript
/**
|
|
* Generated by orval v8.5.3 🍺
|
|
* Do not edit manually.
|
|
* Api
|
|
* Tx 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 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;
|
|
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 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;
|