45 lines
1.3 KiB
TypeScript
45 lines
1.3 KiB
TypeScript
|
|
import { ITeam, EntityType, IEventBus } from '../../types/CalendarTypes';
|
||
|
|
import { TeamStore } from './TeamStore';
|
||
|
|
import { BaseEntityService } from '../BaseEntityService';
|
||
|
|
import { IndexedDBContext } from '../IndexedDBContext';
|
||
|
|
|
||
|
|
/**
|
||
|
|
* TeamService - CRUD operations for teams in IndexedDB
|
||
|
|
*
|
||
|
|
* Teams define which resources belong together for hierarchical grouping.
|
||
|
|
* Extends BaseEntityService for standard entity operations.
|
||
|
|
*/
|
||
|
|
export class TeamService extends BaseEntityService<ITeam> {
|
||
|
|
readonly storeName = TeamStore.STORE_NAME;
|
||
|
|
readonly entityType: EntityType = 'Team';
|
||
|
|
|
||
|
|
constructor(context: IndexedDBContext, eventBus: IEventBus) {
|
||
|
|
super(context, eventBus);
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Get teams by IDs
|
||
|
|
*/
|
||
|
|
async getByIds(ids: string[]): Promise<ITeam[]> {
|
||
|
|
if (ids.length === 0) return [];
|
||
|
|
const results = await Promise.all(ids.map(id => this.get(id)));
|
||
|
|
return results.filter((t): t is ITeam => t !== null);
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Build reverse lookup: resourceId → teamId
|
||
|
|
*/
|
||
|
|
async buildResourceToTeamMap(): Promise<Record<string, string>> {
|
||
|
|
const teams = await this.getAll();
|
||
|
|
const map: Record<string, string> = {};
|
||
|
|
|
||
|
|
for (const team of teams) {
|
||
|
|
for (const resourceId of team.resourceIds) {
|
||
|
|
map[resourceId] = team.id;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return map;
|
||
|
|
}
|
||
|
|
}
|