import { injectable } from 'inversify'; import { CharacterTag } from '../../../entities/library/character-tag'; import { InteractionTag } from '../../../entities/library/interaction-tag'; import { Work } from '../../../entities/library/work'; import { WorkCharacterName } from '../../../entities/library/work-character-name'; import { WorldCharacter } from '../../../entities/library/world-character'; import { getDeserializedEntitiesPromise } from '../get-deserialized'; import { serializeEntitiesPromise } from '../serialize-entity-promise'; import { Serializer } from '../serializer'; @injectable() export class WorkCharacterSerializer extends Serializer< WorkCharacterEntityInterface, WorkCharacterSerializedInterface > { public async serialize(entity: WorkCharacterEntityInterface): Promise { const [names, characterTags, interactedBy, works, interactWith, worldCharacters] = await Promise.all([ serializeEntitiesPromise(entity.names), serializeEntitiesPromise(entity.characterTags), serializeEntitiesPromise(entity.interactedBy), serializeEntitiesPromise(entity.works), serializeEntitiesPromise(entity.interactWith), serializeEntitiesPromise(entity.worldCharacters), ]); return { id: entity.id, nameCanonical: entity.nameCanonical, names, characterTags, interactedBy, works, interactWith, worldCharacters, }; } public deserialize(partial: Partial): Partial { return { ...(partial.id ? { id: partial.id } : {}), ...(partial.nameCanonical ? { nameCanonical: partial.nameCanonical } : {}), ...(partial.names ? { names: getDeserializedEntitiesPromise(partial.names, WorkCharacterName) } : {}), ...(partial.works ? { works: getDeserializedEntitiesPromise(partial.works, Work) } : {}), ...(partial.characterTags ? { characterTags: getDeserializedEntitiesPromise(partial.characterTags, CharacterTag) } : {}), ...(partial.worldCharacters ? { worldCharacters: getDeserializedEntitiesPromise(partial.worldCharacters, WorldCharacter) } : {}), ...(partial.interactedBy ? { interactedBy: getDeserializedEntitiesPromise(partial.interactedBy, InteractionTag) } : {}), ...(partial.interactWith ? { interactWith: getDeserializedEntitiesPromise(partial.interactWith, InteractionTag) } : {}), }; } }