website refactor

This commit is contained in:
2026-01-17 01:04:36 +01:00
parent 8ba46e96a6
commit 75ffe0798e
40 changed files with 267 additions and 321 deletions

View File

@@ -5,8 +5,8 @@ import { ForgotPasswordViewData } from '@/lib/builders/view-data/types/ForgotPas
import { AuthPageService } from '@/lib/services/auth/AuthPageService';
import { SearchParamParser } from '@/lib/routing/search-params/SearchParamParser';
export class ForgotPasswordPageQuery implements PageQuery<ForgotPasswordViewData, URLSearchParams> {
async execute(searchParams: URLSearchParams): Promise<Result<ForgotPasswordViewData, string>> {
export class ForgotPasswordPageQuery implements PageQuery<ForgotPasswordViewData, URLSearchParams | Record<string, string | string[] | undefined>> {
async execute(searchParams: URLSearchParams | Record<string, string | string[] | undefined>): Promise<Result<ForgotPasswordViewData, string>> {
// Parse and validate search parameters
const parsedResult = SearchParamParser.parseAuth(searchParams);
if (parsedResult.isErr()) {
@@ -33,7 +33,7 @@ export class ForgotPasswordPageQuery implements PageQuery<ForgotPasswordViewData
}
// Static factory method for convenience
static async execute(searchParams: URLSearchParams): Promise<Result<ForgotPasswordViewData, string>> {
static async execute(searchParams: URLSearchParams | Record<string, string | string[] | undefined>): Promise<Result<ForgotPasswordViewData, string>> {
const query = new ForgotPasswordPageQuery();
return query.execute(searchParams);
}

View File

@@ -5,8 +5,8 @@ import { LoginViewData } from '@/lib/builders/view-data/types/LoginViewData';
import { AuthPageService } from '@/lib/services/auth/AuthPageService';
import { SearchParamParser } from '@/lib/routing/search-params/SearchParamParser';
export class LoginPageQuery implements PageQuery<LoginViewData, URLSearchParams> {
async execute(searchParams: URLSearchParams): Promise<Result<LoginViewData, string>> {
export class LoginPageQuery implements PageQuery<LoginViewData, URLSearchParams | Record<string, string | string[] | undefined>> {
async execute(searchParams: URLSearchParams | Record<string, string | string[] | undefined>): Promise<Result<LoginViewData, string>> {
// Parse and validate search parameters
const parsedResult = SearchParamParser.parseAuth(searchParams);
if (parsedResult.isErr()) {
@@ -33,7 +33,7 @@ export class LoginPageQuery implements PageQuery<LoginViewData, URLSearchParams>
}
// Static factory method for convenience
static async execute(searchParams: URLSearchParams): Promise<Result<LoginViewData, string>> {
static async execute(searchParams: URLSearchParams | Record<string, string | string[] | undefined>): Promise<Result<LoginViewData, string>> {
const query = new LoginPageQuery();
return query.execute(searchParams);
}

View File

@@ -5,8 +5,8 @@ import { ResetPasswordViewData } from '@/lib/builders/view-data/types/ResetPassw
import { AuthPageService } from '@/lib/services/auth/AuthPageService';
import { SearchParamParser } from '@/lib/routing/search-params/SearchParamParser';
export class ResetPasswordPageQuery implements PageQuery<ResetPasswordViewData, URLSearchParams> {
async execute(searchParams: URLSearchParams): Promise<Result<ResetPasswordViewData, string>> {
export class ResetPasswordPageQuery implements PageQuery<ResetPasswordViewData, URLSearchParams | Record<string, string | string[] | undefined>> {
async execute(searchParams: URLSearchParams | Record<string, string | string[] | undefined>): Promise<Result<ResetPasswordViewData, string>> {
// Parse and validate search parameters
const parsedResult = SearchParamParser.parseAuth(searchParams);
if (parsedResult.isErr()) {
@@ -33,7 +33,7 @@ export class ResetPasswordPageQuery implements PageQuery<ResetPasswordViewData,
}
// Static factory method for convenience
static async execute(searchParams: URLSearchParams): Promise<Result<ResetPasswordViewData, string>> {
static async execute(searchParams: URLSearchParams | Record<string, string | string[] | undefined>): Promise<Result<ResetPasswordViewData, string>> {
const query = new ResetPasswordPageQuery();
return query.execute(searchParams);
}

View File

@@ -5,8 +5,8 @@ import { PageQuery } from '@/lib/contracts/page-queries/PageQuery';
import { AuthPageService } from '@/lib/services/auth/AuthPageService';
import { SearchParamParser } from '@/lib/routing/search-params/SearchParamParser';
export class SignupPageQuery implements PageQuery<SignupViewData, URLSearchParams> {
async execute(searchParams: URLSearchParams): Promise<Result<SignupViewData, string>> {
export class SignupPageQuery implements PageQuery<SignupViewData, URLSearchParams | Record<string, string | string[] | undefined>> {
async execute(searchParams: URLSearchParams | Record<string, string | string[] | undefined>): Promise<Result<SignupViewData, string>> {
// Parse and validate search parameters
const parsedResult = SearchParamParser.parseAuth(searchParams);
if (parsedResult.isErr()) {
@@ -33,7 +33,7 @@ export class SignupPageQuery implements PageQuery<SignupViewData, URLSearchParam
}
// Static factory method for convenience
static async execute(searchParams: URLSearchParams): Promise<Result<SignupViewData, string>> {
static async execute(searchParams: URLSearchParams | Record<string, string | string[] | undefined>): Promise<Result<SignupViewData, string>> {
const query = new SignupPageQuery();
return query.execute(searchParams);
}

View File

@@ -42,11 +42,22 @@ export interface ParsedWizardParams {
}
export class SearchParamParser {
private static getParam(params: URLSearchParams | Record<string, string | string[] | undefined>, key: string): string | null {
if (params instanceof URLSearchParams) {
return params.get(key);
}
const value = params[key];
if (Array.isArray(value)) {
return value[0] ?? null;
}
return value ?? null;
}
// Parse auth parameters
static parseAuth(params: URLSearchParams): Result<ParsedAuthParams, string> {
static parseAuth(params: URLSearchParams | Record<string, string | string[] | undefined>): Result<ParsedAuthParams, string> {
const errors: string[] = [];
const returnTo = params.get('returnTo');
const returnTo = this.getParam(params, 'returnTo');
if (returnTo !== null) {
const validation = SearchParamValidators.validateReturnTo(returnTo);
if (!validation.isValid) {
@@ -54,7 +65,7 @@ export class SearchParamParser {
}
}
const token = params.get('token');
const token = this.getParam(params, 'token');
if (token !== null) {
const validation = SearchParamValidators.validateToken(token);
if (!validation.isValid) {
@@ -62,7 +73,7 @@ export class SearchParamParser {
}
}
const email = params.get('email');
const email = this.getParam(params, 'email');
if (email !== null) {
const validation = SearchParamValidators.validateEmail(email);
if (!validation.isValid) {
@@ -75,19 +86,19 @@ export class SearchParamParser {
}
return Result.ok({
returnTo: params.get('returnTo'),
token: params.get('token'),
email: params.get('email'),
error: params.get('error'),
message: params.get('message'),
returnTo: this.getParam(params, 'returnTo'),
token: this.getParam(params, 'token'),
email: this.getParam(params, 'email'),
error: this.getParam(params, 'error'),
message: this.getParam(params, 'message'),
});
}
// Parse sponsor parameters
static parseSponsor(params: URLSearchParams): Result<ParsedSponsorParams, string> {
static parseSponsor(params: URLSearchParams | Record<string, string | string[] | undefined>): Result<ParsedSponsorParams, string> {
const errors: string[] = [];
const type = params.get('type');
const type = this.getParam(params, 'type');
if (type !== null) {
const validation = SearchParamValidators.validateCampaignType(type);
if (!validation.isValid) {
@@ -100,17 +111,17 @@ export class SearchParamParser {
}
return Result.ok({
type: params.get('type'),
campaignId: params.get('campaignId'),
type: this.getParam(params, 'type'),
campaignId: this.getParam(params, 'campaignId'),
});
}
// Parse pagination parameters
static parsePagination(params: URLSearchParams): Result<ParsedPaginationParams, string> {
static parsePagination(params: URLSearchParams | Record<string, string | string[] | undefined>): Result<ParsedPaginationParams, string> {
const result: ParsedPaginationParams = {};
const errors: string[] = [];
const page = params.get('page');
const page = this.getParam(params, 'page');
if (page !== null) {
const validation = SearchParamValidators.validatePage(page);
if (!validation.isValid) {
@@ -120,7 +131,7 @@ export class SearchParamParser {
}
}
const limit = params.get('limit');
const limit = this.getParam(params, 'limit');
if (limit !== null) {
const validation = SearchParamValidators.validateLimit(limit);
if (!validation.isValid) {
@@ -130,7 +141,7 @@ export class SearchParamParser {
}
}
const offset = params.get('offset');
const offset = this.getParam(params, 'offset');
if (offset !== null) {
const num = parseInt(offset);
if (!isNaN(num)) {
@@ -146,10 +157,10 @@ export class SearchParamParser {
}
// Parse sorting parameters
static parseSorting(params: URLSearchParams): Result<ParsedSortingParams, string> {
static parseSorting(params: URLSearchParams | Record<string, string | string[] | undefined>): Result<ParsedSortingParams, string> {
const errors: string[] = [];
const order = params.get('order');
const order = this.getParam(params, 'order');
if (order !== null) {
const validation = SearchParamValidators.validateOrder(order);
if (!validation.isValid) {
@@ -162,29 +173,29 @@ export class SearchParamParser {
}
return Result.ok({
sortBy: params.get('sortBy'),
order: (params.get('order') as 'asc' | 'desc') || undefined,
sortBy: this.getParam(params, 'sortBy'),
order: (this.getParam(params, 'order') as 'asc' | 'desc') || undefined,
});
}
// Parse filter parameters
static parseFilters(params: URLSearchParams): Result<ParsedFilterParams, string> {
static parseFilters(params: URLSearchParams | Record<string, string | string[] | undefined>): Result<ParsedFilterParams, string> {
return Result.ok({
status: params.get('status'),
role: params.get('role'),
tier: params.get('tier'),
status: this.getParam(params, 'status'),
role: this.getParam(params, 'role'),
tier: this.getParam(params, 'tier'),
});
}
// Parse wizard parameters
static parseWizard(params: URLSearchParams): Result<ParsedWizardParams, string> {
static parseWizard(params: URLSearchParams | Record<string, string | string[] | undefined>): Result<ParsedWizardParams, string> {
return Result.ok({
step: params.get('step'),
step: this.getParam(params, 'step'),
});
}
// Parse all parameters at once
static parseAll(params: URLSearchParams): Result<
static parseAll(params: URLSearchParams | Record<string, string | string[] | undefined>): Result<
{
auth: ParsedAuthParams;
sponsor: ParsedSponsorParams;