93 lines
3.1 KiB
TypeScript
93 lines
3.1 KiB
TypeScript
import { z } from 'zod'
|
|
|
|
export const adminPaymentStatusSchema = z.enum(['active', 'no_plan', 'expired'])
|
|
|
|
export const adminComplexListItemSchema = z.object({
|
|
id: z.string(),
|
|
complexName: z.string(),
|
|
complexSlug: z.string(),
|
|
city: z.string().nullable(),
|
|
planCode: z.string().nullable(),
|
|
planName: z.string().nullable(),
|
|
userCount: z.number().int().nonnegative(),
|
|
courtCount: z.number().int().nonnegative(),
|
|
avgBookingsPerDay: z.number().nonnegative(),
|
|
paymentStatus: adminPaymentStatusSchema,
|
|
})
|
|
|
|
export const adminComplexStatsSchema = z.object({
|
|
id: z.string(),
|
|
complexName: z.string(),
|
|
complexSlug: z.string(),
|
|
city: z.string().nullable(),
|
|
adminEmail: z.string(),
|
|
planCode: z.string().nullable(),
|
|
planName: z.string().nullable(),
|
|
userCount: z.number().int().nonnegative(),
|
|
courtCount: z.number().int().nonnegative(),
|
|
totalBookings: z.number().int().nonnegative(),
|
|
avgBookingsPerDay: z.number().nonnegative(),
|
|
bookingsByStatus: z.object({
|
|
confirmed: z.number().int().nonnegative(),
|
|
cancelled: z.number().int().nonnegative(),
|
|
completed: z.number().int().nonnegative(),
|
|
noshow: z.number().int().nonnegative(),
|
|
}),
|
|
paymentStatus: adminPaymentStatusSchema,
|
|
})
|
|
|
|
export const adminCreatePlanSchema = z.object({
|
|
code: z.string().trim().min(1).max(10),
|
|
name: z.string().trim().min(1).max(30),
|
|
price: z.number().nonnegative(),
|
|
rules: z.any(),
|
|
})
|
|
|
|
export const adminUpdatePlanSchema = z.object({
|
|
name: z.string().trim().min(1).max(30).optional(),
|
|
price: z.number().nonnegative().optional(),
|
|
rules: z.any().optional(),
|
|
})
|
|
|
|
export const adminUserSchema = z.object({
|
|
id: z.string(),
|
|
name: z.string(),
|
|
email: z.string(),
|
|
role: z.string(),
|
|
banned: z.boolean(),
|
|
bannedAt: z.string().datetime().nullable(),
|
|
banReason: z.string().nullable(),
|
|
createdAt: z.string().datetime(),
|
|
complexCount: z.number().int().nonnegative(),
|
|
activeSessions: z.number().int().nonnegative(),
|
|
})
|
|
|
|
export const adminBlockUserSchema = z.object({
|
|
banReason: z.string().max(500).optional(),
|
|
})
|
|
|
|
export const adminGlobalStatsSchema = z.object({
|
|
totalComplexes: z.number().int().nonnegative(),
|
|
totalUsers: z.number().int().nonnegative(),
|
|
totalCourts: z.number().int().nonnegative(),
|
|
totalBookings: z.number().int().nonnegative(),
|
|
})
|
|
|
|
export const adminUserSessionSchema = z.object({
|
|
id: z.string(),
|
|
createdAt: z.string().datetime(),
|
|
expiresAt: z.string().datetime(),
|
|
ipAddress: z.string().nullable(),
|
|
userAgent: z.string().nullable(),
|
|
})
|
|
|
|
export type AdminComplexListItem = z.infer<typeof adminComplexListItemSchema>
|
|
export type AdminComplexStats = z.infer<typeof adminComplexStatsSchema>
|
|
export type AdminCreatePlanInput = z.infer<typeof adminCreatePlanSchema>
|
|
export type AdminUpdatePlanInput = z.infer<typeof adminUpdatePlanSchema>
|
|
export type AdminUser = z.infer<typeof adminUserSchema>
|
|
export type AdminBlockUserInput = z.infer<typeof adminBlockUserSchema>
|
|
export type AdminGlobalStats = z.infer<typeof adminGlobalStatsSchema>
|
|
export type AdminPaymentStatus = z.infer<typeof adminPaymentStatusSchema>
|
|
export type AdminUserSession = z.infer<typeof adminUserSessionSchema>
|