Files
gridpilot.gg/packages/demo-infrastructure/media/InMemoryAvatarGenerationRepository.ts
2025-12-08 23:52:36 +01:00

47 lines
1.5 KiB
TypeScript

import type {
IAvatarGenerationRepository
} from '@gridpilot/media';
import {
AvatarGenerationRequest,
type AvatarGenerationRequestProps
} from '@gridpilot/media';
/**
* In-memory implementation of IAvatarGenerationRepository.
*
* For demo/development purposes. In production, this would use a database.
*/
export class InMemoryAvatarGenerationRepository implements IAvatarGenerationRepository {
private readonly requests = new Map<string, AvatarGenerationRequestProps>();
async save(request: AvatarGenerationRequest): Promise<void> {
this.requests.set(request.id, request.toProps());
}
async findById(id: string): Promise<AvatarGenerationRequest | null> {
const props = this.requests.get(id);
if (!props) {
return null;
}
return AvatarGenerationRequest.reconstitute(props);
}
async findByUserId(userId: string): Promise<AvatarGenerationRequest[]> {
const results: AvatarGenerationRequest[] = [];
for (const props of this.requests.values()) {
if (props.userId === userId) {
results.push(AvatarGenerationRequest.reconstitute(props));
}
}
return results.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());
}
async findLatestByUserId(userId: string): Promise<AvatarGenerationRequest | null> {
const userRequests = await this.findByUserId(userId);
return userRequests.length > 0 ? userRequests[0] : null;
}
async delete(id: string): Promise<void> {
this.requests.delete(id);
}
}