52 lines
1.4 KiB
TypeScript
52 lines
1.4 KiB
TypeScript
import { RacingDomainValidationError } from '../errors/RacingDomainError';
|
|
|
|
export class LeagueSocialLinks {
|
|
readonly discordUrl: string | undefined;
|
|
readonly youtubeUrl: string | undefined;
|
|
readonly websiteUrl: string | undefined;
|
|
|
|
private constructor(props: {
|
|
discordUrl?: string;
|
|
youtubeUrl?: string;
|
|
websiteUrl?: string;
|
|
}) {
|
|
this.discordUrl = props.discordUrl;
|
|
this.youtubeUrl = props.youtubeUrl;
|
|
this.websiteUrl = props.websiteUrl;
|
|
}
|
|
|
|
static create(props: {
|
|
discordUrl?: string;
|
|
youtubeUrl?: string;
|
|
websiteUrl?: string;
|
|
}): LeagueSocialLinks {
|
|
// Basic validation, e.g., if provided, must be valid URL
|
|
if (props.discordUrl && !this.isValidUrl(props.discordUrl)) {
|
|
throw new RacingDomainValidationError('Invalid Discord URL');
|
|
}
|
|
if (props.youtubeUrl && !this.isValidUrl(props.youtubeUrl)) {
|
|
throw new RacingDomainValidationError('Invalid YouTube URL');
|
|
}
|
|
if (props.websiteUrl && !this.isValidUrl(props.websiteUrl)) {
|
|
throw new RacingDomainValidationError('Invalid website URL');
|
|
}
|
|
return new LeagueSocialLinks(props);
|
|
}
|
|
|
|
private static isValidUrl(url: string): boolean {
|
|
try {
|
|
new URL(url);
|
|
return true;
|
|
} catch {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
equals(other: LeagueSocialLinks): boolean {
|
|
return (
|
|
this.discordUrl === other.discordUrl &&
|
|
this.youtubeUrl === other.youtubeUrl &&
|
|
this.websiteUrl === other.websiteUrl
|
|
);
|
|
}
|
|
} |