2025-10-03 16:37:52 +09:00
|
|
|
/**
|
|
|
|
|
* Auth Domain - Schemas
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
import { z } from "zod";
|
|
|
|
|
|
2025-10-07 17:38:39 +09:00
|
|
|
import { emailSchema, nameSchema, passwordSchema, phoneSchema } from "../common/schema";
|
|
|
|
|
import { addressSchema } from "../customer/schema";
|
2025-10-03 16:37:52 +09:00
|
|
|
|
|
|
|
|
const genderEnum = z.enum(["male", "female", "other"]);
|
|
|
|
|
|
|
|
|
|
export const loginRequestSchema = z.object({
|
|
|
|
|
email: emailSchema,
|
|
|
|
|
password: z.string().min(1, "Password is required"),
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
export const signupRequestSchema = z.object({
|
|
|
|
|
email: emailSchema,
|
|
|
|
|
password: passwordSchema,
|
2025-10-07 17:38:39 +09:00
|
|
|
firstname: nameSchema,
|
|
|
|
|
lastname: nameSchema,
|
|
|
|
|
companyname: z.string().optional(),
|
|
|
|
|
phonenumber: phoneSchema,
|
2025-10-03 16:37:52 +09:00
|
|
|
sfNumber: z.string().min(6, "Customer number must be at least 6 characters"),
|
|
|
|
|
address: addressSchema.optional(),
|
|
|
|
|
nationality: z.string().optional(),
|
|
|
|
|
dateOfBirth: z.string().optional(),
|
|
|
|
|
gender: genderEnum.optional(),
|
|
|
|
|
acceptTerms: z.boolean(),
|
|
|
|
|
marketingConsent: z.boolean().optional(),
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
export const passwordResetRequestSchema = z.object({ email: emailSchema });
|
|
|
|
|
|
|
|
|
|
export const passwordResetSchema = z.object({
|
|
|
|
|
token: z.string().min(1, "Reset token is required"),
|
|
|
|
|
password: passwordSchema,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
export const setPasswordRequestSchema = z.object({
|
|
|
|
|
email: emailSchema,
|
|
|
|
|
password: passwordSchema,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
export const changePasswordRequestSchema = z.object({
|
|
|
|
|
currentPassword: z.string().min(1, "Current password is required"),
|
|
|
|
|
newPassword: passwordSchema,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
export const linkWhmcsRequestSchema = z.object({
|
|
|
|
|
email: emailSchema,
|
|
|
|
|
password: z.string().min(1, "Password is required"),
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
export const validateSignupRequestSchema = z.object({
|
|
|
|
|
sfNumber: z.string().min(1, "Customer number is required"),
|
|
|
|
|
});
|
|
|
|
|
|
2025-10-07 17:38:39 +09:00
|
|
|
/**
|
|
|
|
|
* Schema for updating customer profile in WHMCS (single source of truth)
|
|
|
|
|
* All fields optional - only send what needs to be updated
|
|
|
|
|
* Can update profile fields and/or address fields in a single request
|
|
|
|
|
*/
|
|
|
|
|
export const updateCustomerProfileRequestSchema = z.object({
|
|
|
|
|
// Basic profile
|
|
|
|
|
firstname: nameSchema.optional(),
|
|
|
|
|
lastname: nameSchema.optional(),
|
|
|
|
|
companyname: z.string().max(100).optional(),
|
|
|
|
|
phonenumber: phoneSchema.optional(),
|
|
|
|
|
|
|
|
|
|
// Address (optional fields for partial updates)
|
|
|
|
|
address1: z.string().max(200).optional(),
|
|
|
|
|
address2: z.string().max(200).optional(),
|
|
|
|
|
city: z.string().max(100).optional(),
|
|
|
|
|
state: z.string().max(100).optional(),
|
|
|
|
|
postcode: z.string().max(20).optional(),
|
|
|
|
|
country: z.string().length(2).optional(), // ISO country code
|
|
|
|
|
|
|
|
|
|
// Additional
|
|
|
|
|
language: z.string().max(10).optional(),
|
2025-10-03 17:33:39 +09:00
|
|
|
});
|
|
|
|
|
|
2025-10-03 16:37:52 +09:00
|
|
|
export const accountStatusRequestSchema = z.object({
|
|
|
|
|
email: emailSchema,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
export const ssoLinkRequestSchema = z.object({
|
|
|
|
|
destination: z.string().optional(),
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
export const checkPasswordNeededRequestSchema = z.object({
|
|
|
|
|
email: emailSchema,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
export const refreshTokenRequestSchema = z.object({
|
|
|
|
|
refreshToken: z.string().min(1, "Refresh token is required").optional(),
|
|
|
|
|
deviceId: z.string().optional(),
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
export const authTokensSchema = z.object({
|
|
|
|
|
accessToken: z.string().min(1, "Access token is required"),
|
|
|
|
|
refreshToken: z.string().min(1, "Refresh token is required"),
|
|
|
|
|
expiresAt: z.string().min(1, "Access token expiry required"),
|
|
|
|
|
refreshExpiresAt: z.string().min(1, "Refresh token expiry required"),
|
|
|
|
|
tokenType: z.literal("Bearer"),
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
export const authResponseSchema = z.object({
|
|
|
|
|
user: z.unknown(),
|
|
|
|
|
tokens: authTokensSchema,
|
|
|
|
|
});
|
|
|
|
|
|