71 lines
2.5 KiB
TypeScript
71 lines
2.5 KiB
TypeScript
|
import {
|
||
|
EditableEntityRepository,
|
||
|
EditableEntityRepositoryInterface,
|
||
|
RelatedRepositoryUpdaters,
|
||
|
UpdatePartialFillers,
|
||
|
} from './editable-entity-repository';
|
||
|
|
||
|
export interface MultiNamedEntityRepositoryInterface<
|
||
|
Serialized extends MultiNamedInterface,
|
||
|
NameSerialized extends NameSerializedInterface,
|
||
|
> extends EditableEntityRepositoryInterface<Serialized> {
|
||
|
/**
|
||
|
* adds a name to a multi-named entity
|
||
|
*
|
||
|
* indirectly calls the subscribers of this entity by creating the name
|
||
|
* via the name repository which updates this related repository
|
||
|
*
|
||
|
* @param id - the ID of the multi-named entity
|
||
|
* @param name - the name to add
|
||
|
*/
|
||
|
addName(id: number, name: string): Promise<NameSerialized>;
|
||
|
|
||
|
/**
|
||
|
* removes a name from a multi-named entity
|
||
|
*
|
||
|
* indirectly calls the subscribers of this entity by deleting the name
|
||
|
* via the name repository which updates this related repository
|
||
|
*
|
||
|
* @param id - the ID of the multi-named entity
|
||
|
* @param nameId - the ID of the name to delete
|
||
|
*/
|
||
|
removeName(id: number, nameId: number): Promise<void>;
|
||
|
}
|
||
|
|
||
|
export class MultiNamedEntityRepository<
|
||
|
Serialized extends MultiNamedInterface,
|
||
|
NameSerialized extends NameSerializedInterface,
|
||
|
>
|
||
|
extends EditableEntityRepository<Serialized>
|
||
|
implements MultiNamedEntityRepositoryInterface<Serialized, NameSerialized>
|
||
|
{
|
||
|
private readonly nameRepositoryPromise: Promise<EditableEntityRepositoryInterface<NameSerialized>>;
|
||
|
|
||
|
public constructor(
|
||
|
apiRead: (identifier: number) => Promise<Serialized>,
|
||
|
apiCreate: (partial: Partial<Serialized>) => Promise<Serialized>,
|
||
|
apiUpdate: (identifier: number, partial: Partial<Serialized>) => Promise<Serialized>,
|
||
|
apiDelete: (identifier: number) => Promise<void>,
|
||
|
updatePartialFillers: UpdatePartialFillers<Serialized>,
|
||
|
relatedRepositoryUpdaters: RelatedRepositoryUpdaters<Serialized>,
|
||
|
nameRepositoryPromise: Promise<EditableEntityRepositoryInterface<NameSerialized>>,
|
||
|
) {
|
||
|
super(apiRead, apiCreate, apiUpdate, apiDelete, updatePartialFillers, relatedRepositoryUpdaters);
|
||
|
this.nameRepositoryPromise = nameRepositoryPromise;
|
||
|
}
|
||
|
|
||
|
public async addName(id: number, name: string): Promise<NameSerialized> {
|
||
|
const nameRepository = await this.nameRepositoryPromise;
|
||
|
// @ts-ignore - yoo, help
|
||
|
return nameRepository.create({
|
||
|
name: name,
|
||
|
entity: id,
|
||
|
});
|
||
|
}
|
||
|
|
||
|
public async removeName(id: number, nameId: number): Promise<void> {
|
||
|
const nameRepository = await this.nameRepositoryPromise;
|
||
|
return nameRepository.delete(nameId);
|
||
|
}
|
||
|
}
|