46 lines
1.1 KiB
TypeScript
46 lines
1.1 KiB
TypeScript
|
|
/**
|
||
|
|
* In-Memory Mission Repository
|
||
|
|
*
|
||
|
|
* Adapter: Implements MissionRepository using a Map.
|
||
|
|
* Purpose: Testing, development, CI/CD pipelines.
|
||
|
|
* NOT for production.
|
||
|
|
*/
|
||
|
|
|
||
|
|
import {
|
||
|
|
Mission,
|
||
|
|
MissionId,
|
||
|
|
SessionId,
|
||
|
|
} from '@landvex/domain';
|
||
|
|
import { MissionRepository } from '../repositories/repository-interfaces';
|
||
|
|
|
||
|
|
export class InMemoryMissionRepository implements MissionRepository {
|
||
|
|
private missions = new Map<string, Mission>();
|
||
|
|
|
||
|
|
async save(mission: Mission): Promise<void> {
|
||
|
|
this.missions.set(mission.id, mission);
|
||
|
|
}
|
||
|
|
|
||
|
|
async findById(id: MissionId): Promise<Mission | null> {
|
||
|
|
return this.missions.get(id) ?? null;
|
||
|
|
}
|
||
|
|
|
||
|
|
async findBySession(sessionId: SessionId): Promise<Mission[]> {
|
||
|
|
return Array.from(this.missions.values())
|
||
|
|
.filter(m => m.sessionId === sessionId)
|
||
|
|
.sort((a, b) => a.sequenceNumber - b.sequenceNumber);
|
||
|
|
}
|
||
|
|
|
||
|
|
async findActive(): Promise<Mission[]> {
|
||
|
|
return Array.from(this.missions.values())
|
||
|
|
.filter(m => m.status === 'created' || m.status === 'uploading' || m.status === 'processing');
|
||
|
|
}
|
||
|
|
|
||
|
|
clear(): void {
|
||
|
|
this.missions.clear();
|
||
|
|
}
|
||
|
|
|
||
|
|
count(): number {
|
||
|
|
return this.missions.size;
|
||
|
|
}
|
||
|
|
}
|