48 lines
1.5 KiB
TypeScript
48 lines
1.5 KiB
TypeScript
/**
|
|
* Infrastructure: InMemorySponsorAccountRepository
|
|
*
|
|
* In-memory implementation of ISponsorAccountRepository for development/testing.
|
|
*/
|
|
|
|
import type { ISponsorAccountRepository } from '../../domain/repositories/ISponsorAccountRepository';
|
|
import type { SponsorAccount } from '../../domain/entities/SponsorAccount';
|
|
import type { UserId } from '../../domain/value-objects/UserId';
|
|
|
|
export class InMemorySponsorAccountRepository implements ISponsorAccountRepository {
|
|
private accounts: Map<string, SponsorAccount> = new Map();
|
|
|
|
async save(account: SponsorAccount): Promise<void> {
|
|
this.accounts.set(account.getId().value, account);
|
|
}
|
|
|
|
async findById(id: UserId): Promise<SponsorAccount | null> {
|
|
return this.accounts.get(id.value) ?? null;
|
|
}
|
|
|
|
async findBySponsorId(sponsorId: string): Promise<SponsorAccount | null> {
|
|
return Array.from(this.accounts.values()).find(
|
|
a => a.getSponsorId() === sponsorId
|
|
) ?? null;
|
|
}
|
|
|
|
async findByEmail(email: string): Promise<SponsorAccount | null> {
|
|
const normalizedEmail = email.toLowerCase().trim();
|
|
return Array.from(this.accounts.values()).find(
|
|
a => a.getEmail().toLowerCase() === normalizedEmail
|
|
) ?? null;
|
|
}
|
|
|
|
async delete(id: UserId): Promise<void> {
|
|
this.accounts.delete(id.value);
|
|
}
|
|
|
|
// Helper for testing
|
|
clear(): void {
|
|
this.accounts.clear();
|
|
}
|
|
|
|
// Helper for seeding demo data
|
|
seed(accounts: SponsorAccount[]): void {
|
|
accounts.forEach(a => this.accounts.set(a.getId().value, a));
|
|
}
|
|
} |