44 lines
1.3 KiB
TypeScript
44 lines
1.3 KiB
TypeScript
export const LEAGUE_DESCRIPTION_CONSTRAINTS = {
|
|
minLength: 20,
|
|
maxLength: 1000,
|
|
recommendedMinLength: 50,
|
|
} as const;
|
|
|
|
export const LEAGUE_NAME_CONSTRAINTS = {
|
|
minLength: 3,
|
|
maxLength: 64,
|
|
pattern: /^[a-zA-Z0-9].*$/, // Must start with alphanumeric
|
|
forbiddenPatterns: [
|
|
/^\s/, // No leading whitespace
|
|
/\s$/, // No trailing whitespace
|
|
/\s{2,}/, // No multiple consecutive spaces
|
|
],
|
|
} as const;
|
|
|
|
export type LeagueVisibilityType = 'ranked' | 'unranked';
|
|
|
|
export interface LeagueVisibilityConstraints {
|
|
readonly minDrivers: number;
|
|
readonly isPubliclyVisible: boolean;
|
|
readonly affectsRatings: boolean;
|
|
readonly requiresApproval: boolean;
|
|
}
|
|
|
|
export const VISIBILITY_CONSTRAINTS: Record<LeagueVisibilityType, LeagueVisibilityConstraints> = {
|
|
ranked: {
|
|
minDrivers: 10,
|
|
isPubliclyVisible: true,
|
|
affectsRatings: true,
|
|
requiresApproval: false, // Anyone can join public leagues
|
|
},
|
|
unranked: {
|
|
minDrivers: 2,
|
|
isPubliclyVisible: false,
|
|
affectsRatings: false,
|
|
requiresApproval: true, // Private leagues require invite/approval
|
|
},
|
|
};
|
|
|
|
// Export constants for validation
|
|
export const MIN_RANKED_LEAGUE_DRIVERS = VISIBILITY_CONSTRAINTS.ranked.minDrivers;
|
|
export const MIN_UNRANKED_LEAGUE_DRIVERS = VISIBILITY_CONSTRAINTS.unranked.minDrivers; |