RenaiApp/src/main/modules/serialization/serializers/work-serializer.ts

83 lines
3.4 KiB
TypeScript

import { injectable } from 'inversify';
import { Copy } from '../../../entities/library/copy';
import { Transformation } from '../../../entities/library/transformation';
import { WorkAuthor } from '../../../entities/library/work-author';
import { WorkCharacter } from '../../../entities/library/work-character';
import { WorkName } from '../../../entities/library/work-name';
import { WorkTag } from '../../../entities/library/work-tag';
import { World } from '../../../entities/library/world';
import { getDeserializedEntitiesPromise } from '../get-deserialized';
import { serializeEntitiesPromise } from '../serialize-entity-promise.js';
import { Serializer } from '../serializer.js';
@injectable()
export class WorkSerializer extends Serializer<WorkEntityInterface, WorkSerializedInterface> {
public async serialize(entity: WorkEntityInterface): Promise<WorkSerializedInterface> {
const [
languages,
collectionParts,
copies,
names,
transformationOf,
transformedBy,
workAuthors,
workCharacters,
workTags,
worlds,
] = await Promise.all([
serializeEntitiesPromise(entity.languages),
serializeEntitiesPromise(entity.collectionParts),
serializeEntitiesPromise(entity.copies),
serializeEntitiesPromise(entity.names),
serializeEntitiesPromise(entity.transformationOf),
serializeEntitiesPromise(entity.transformedBy),
serializeEntitiesPromise(entity.workAuthors),
serializeEntitiesPromise(entity.workCharacters),
serializeEntitiesPromise(entity.workTags),
serializeEntitiesPromise(entity.worlds),
]);
return {
id: entity.id,
isCanonical: entity.isCanonical,
nameCanonical: entity.nameCanonical,
rating: entity.rating,
releaseDate: entity.releaseDate,
languages,
collectionParts,
copies,
names,
transformationOf,
transformedBy,
workAuthors,
workCharacters,
workTags,
worlds,
};
}
public deserialize(partial: Partial<WorkSerializedInterface>): Partial<WorkEntityInterface> {
return {
...(partial.id ? { id: partial.id } : {}),
...(partial.nameCanonical ? { nameCanonical: partial.nameCanonical } : {}),
...(partial.rating ? { rating: partial.rating } : {}),
...(partial.releaseDate ? { releaseDate: partial.releaseDate } : {}),
...(partial.isCanonical ? { isCanonical: partial.isCanonical } : {}),
...(partial.copies ? { copies: getDeserializedEntitiesPromise(partial.copies, Copy) } : {}),
...(partial.names ? { names: getDeserializedEntitiesPromise(partial.names, WorkName) } : {}),
...(partial.transformationOf
? { transformationOf: getDeserializedEntitiesPromise(partial.transformationOf, Transformation) }
: {}),
...(partial.transformedBy
? { transformedBy: getDeserializedEntitiesPromise(partial.transformedBy, Transformation) }
: {}),
...(partial.workAuthors ? { workAuthors: getDeserializedEntitiesPromise(partial.workAuthors, WorkAuthor) } : {}),
...(partial.workCharacters
? { workCharacters: getDeserializedEntitiesPromise(partial.workCharacters, WorkCharacter) }
: {}),
...(partial.workTags ? { workTags: getDeserializedEntitiesPromise(partial.workTags, WorkTag) } : {}),
...(partial.worlds ? { worlds: getDeserializedEntitiesPromise(partial.worlds, World) } : {}),
};
}
}