services refactor
This commit is contained in:
50
apps/website/lib/view-models/SponsorSponsorshipsViewModel.ts
Normal file
50
apps/website/lib/view-models/SponsorSponsorshipsViewModel.ts
Normal file
@@ -0,0 +1,50 @@
|
||||
import type { SponsorSponsorshipsDto } from '../dtos';
|
||||
import { SponsorshipDetailViewModel } from './SponsorshipDetailViewModel';
|
||||
|
||||
/**
|
||||
* Sponsor Sponsorships View Model
|
||||
*
|
||||
* View model for sponsor sponsorships data with UI-specific transformations.
|
||||
*/
|
||||
export class SponsorSponsorshipsViewModel {
|
||||
sponsorId: string;
|
||||
sponsorName: string;
|
||||
sponsorships: SponsorshipDetailViewModel[];
|
||||
|
||||
constructor(dto: SponsorSponsorshipsDto) {
|
||||
this.sponsorId = dto.sponsorId;
|
||||
this.sponsorName = dto.sponsorName;
|
||||
this.sponsorships = dto.sponsorships.map(s => new SponsorshipDetailViewModel(s));
|
||||
}
|
||||
|
||||
/** UI-specific: Total sponsorships count */
|
||||
get totalCount(): number {
|
||||
return this.sponsorships.length;
|
||||
}
|
||||
|
||||
/** UI-specific: Active sponsorships */
|
||||
get activeSponsorships(): SponsorshipDetailViewModel[] {
|
||||
return this.sponsorships.filter(s => s.status === 'active');
|
||||
}
|
||||
|
||||
/** UI-specific: Active count */
|
||||
get activeCount(): number {
|
||||
return this.activeSponsorships.length;
|
||||
}
|
||||
|
||||
/** UI-specific: Has sponsorships */
|
||||
get hasSponsorships(): boolean {
|
||||
return this.sponsorships.length > 0;
|
||||
}
|
||||
|
||||
/** UI-specific: Total investment */
|
||||
get totalInvestment(): number {
|
||||
return this.sponsorships.reduce((sum, s) => sum + s.amount, 0);
|
||||
}
|
||||
|
||||
/** UI-specific: Formatted total investment */
|
||||
get formattedTotalInvestment(): string {
|
||||
const firstCurrency = this.sponsorships[0]?.currency || 'USD';
|
||||
return `${firstCurrency} ${this.totalInvestment.toLocaleString()}`;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user