90 lines
2.2 KiB
TypeScript
90 lines
2.2 KiB
TypeScript
export interface SignupFormData {
|
|
displayName: string;
|
|
email: string;
|
|
password: string;
|
|
confirmPassword: string;
|
|
}
|
|
|
|
export interface SignupValidationErrors {
|
|
displayName?: string;
|
|
email?: string;
|
|
password?: string;
|
|
confirmPassword?: string;
|
|
}
|
|
|
|
/**
|
|
* SignupCommandModel
|
|
*
|
|
* Encapsulates signup form state, client-side validation, and
|
|
* prepares data for submission to the AuthService.
|
|
*/
|
|
export class SignupCommandModel {
|
|
private _displayName: string;
|
|
private _email: string;
|
|
private _password: string;
|
|
private _confirmPassword: string;
|
|
|
|
constructor(initial: SignupFormData) {
|
|
this._displayName = initial.displayName;
|
|
this._email = initial.email;
|
|
this._password = initial.password;
|
|
this._confirmPassword = initial.confirmPassword;
|
|
}
|
|
|
|
get displayName(): string {
|
|
return this._displayName;
|
|
}
|
|
|
|
get email(): string {
|
|
return this._email;
|
|
}
|
|
|
|
get password(): string {
|
|
return this._password;
|
|
}
|
|
|
|
get confirmPassword(): string {
|
|
return this._confirmPassword;
|
|
}
|
|
|
|
/** Basic client-side validation for signup form */
|
|
validate(): SignupValidationErrors {
|
|
const errors: SignupValidationErrors = {};
|
|
|
|
if (!this._displayName.trim()) {
|
|
errors.displayName = 'Display name is required';
|
|
} else if (this._displayName.trim().length < 3) {
|
|
errors.displayName = 'Display name must be at least 3 characters';
|
|
}
|
|
|
|
if (!this._email.trim()) {
|
|
errors.email = 'Email is required';
|
|
} else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(this._email)) {
|
|
errors.email = 'Invalid email format';
|
|
}
|
|
|
|
if (!this._password) {
|
|
errors.password = 'Password is required';
|
|
} else if (this._password.length < 8) {
|
|
errors.password = 'Password must be at least 8 characters';
|
|
}
|
|
|
|
if (!this._confirmPassword) {
|
|
errors.confirmPassword = 'Please confirm your password';
|
|
} else if (this._password !== this._confirmPassword) {
|
|
errors.confirmPassword = 'Passwords do not match';
|
|
}
|
|
|
|
return errors;
|
|
}
|
|
|
|
/** Convert to API SignupParams DTO */
|
|
toRequestDto(): { email: string; password: string; displayName: string } {
|
|
return {
|
|
email: this._email,
|
|
password: this._password,
|
|
displayName: this._displayName,
|
|
};
|
|
}
|
|
}
|