RenaiApp/src/main/modules/entity-api/update-controller.ts

282 lines
12 KiB
TypeScript

import type { EntityTarget } from 'typeorm';
import type { QueryDeepPartialEntity } from 'typeorm/query-builder/QueryPartialEntity';
import { container, Service } from '../../core/container';
import { getRepository } from '../../core/database';
import { Author } from '../../entities/library/author';
import { AuthorName } from '../../entities/library/author-name';
import { AuthorRole } from '../../entities/library/author-role';
import { AuthorRoleName } from '../../entities/library/author-role-name';
import { CharacterTag } from '../../entities/library/character-tag';
import { Collection } from '../../entities/library/collection';
import { CollectionName } from '../../entities/library/collection-name';
import { CollectionPart } from '../../entities/library/collection-part';
import { Copy } from '../../entities/library/copy';
import { InteractionTag } from '../../entities/library/interaction-tag';
import { Site } from '../../entities/library/site';
import { SiteName } from '../../entities/library/site-name';
import { Source } from '../../entities/library/source';
import { Tag } from '../../entities/library/tag';
import { TagName } from '../../entities/library/tag-name';
import { Transformation } from '../../entities/library/transformation';
import { TransformationType } from '../../entities/library/transformation-type';
import { TransformationTypeName } from '../../entities/library/transformation-type-name';
import { Work } from '../../entities/library/work';
import { WorkAuthor } from '../../entities/library/work-author';
import { WorkCharacter } from '../../entities/library/work-character';
import { WorkCharacterName } from '../../entities/library/work-character-name';
import { WorkName } from '../../entities/library/work-name';
import { WorkTag } from '../../entities/library/work-tag';
import { World } from '../../entities/library/world';
import { WorldCharacter } from '../../entities/library/world-character';
import { WorldCharacterName } from '../../entities/library/world-character-name';
import { WorldName } from '../../entities/library/world-name';
import { ipcServer } from '../ipc/ipc-server';
import type { Serializer } from '../serialization/serializer';
type UpdateSerializedType = {
[IpcChannel.ENTITY_UPDATE_AUTHOR]: AuthorSerializedInterface;
[IpcChannel.ENTITY_UPDATE_AUTHOR_NAME]: AuthorNameSerializedInterface;
[IpcChannel.ENTITY_UPDATE_AUTHOR_ROLE]: AuthorRoleSerializedInterface;
[IpcChannel.ENTITY_UPDATE_AUTHOR_ROLE_NAME]: AuthorRoleNameSerializedInterface;
[IpcChannel.ENTITY_UPDATE_CHARACTER_TAG]: CharacterTagSerializedInterface;
[IpcChannel.ENTITY_UPDATE_COLLECTION]: CollectionSerializedInterface;
[IpcChannel.ENTITY_UPDATE_COLLECTION_NAME]: CollectionNameSerializedInterface;
[IpcChannel.ENTITY_UPDATE_COLLECTION_PART]: CollectionPartSerializedInterface;
[IpcChannel.ENTITY_UPDATE_COPY]: CopySerializedInterface;
[IpcChannel.ENTITY_UPDATE_INTERACTION_TAG]: InteractionTagSerializedInterface;
[IpcChannel.ENTITY_UPDATE_SITE]: SiteSerializedInterface;
[IpcChannel.ENTITY_UPDATE_SITE_NAME]: SiteNameSerializedInterface;
[IpcChannel.ENTITY_UPDATE_SOURCE]: SourceSerializedInterface;
[IpcChannel.ENTITY_UPDATE_TAG]: TagSerializedInterface;
[IpcChannel.ENTITY_UPDATE_TAG_NAME]: TagNameSerializedInterface;
[IpcChannel.ENTITY_UPDATE_TRANSFORMATION]: TransformationSerializedInterface;
[IpcChannel.ENTITY_UPDATE_TRANSFORMATION_TYPE]: TransformationTypeSerializedInterface;
[IpcChannel.ENTITY_UPDATE_TRANSFORMATION_TYPE_NAME]: TransformationTypeNameSerializedInterface;
[IpcChannel.ENTITY_UPDATE_WORK_AUTHOR]: WorkAuthorSerializedInterface;
[IpcChannel.ENTITY_UPDATE_WORK_CHARACTER]: WorkCharacterSerializedInterface;
[IpcChannel.ENTITY_UPDATE_WORK_CHARACTER_NAME]: WorkCharacterNameSerializedInterface;
[IpcChannel.ENTITY_UPDATE_WORK]: WorkSerializedInterface;
[IpcChannel.ENTITY_UPDATE_WORK_NAME]: WorkNameSerializedInterface;
[IpcChannel.ENTITY_UPDATE_WORK_TAG]: WorkTagSerializedInterface;
[IpcChannel.ENTITY_UPDATE_WORLD]: WorldSerializedInterface;
[IpcChannel.ENTITY_UPDATE_WORLD_NAME]: WorldNameSerializedInterface;
[IpcChannel.ENTITY_UPDATE_WORLD_CHARACTER]: WorldCharacterSerializedInterface;
[IpcChannel.ENTITY_UPDATE_WORLD_CHARACTER_NAME]: WorldCharacterNameSerializedInterface;
};
type UpdateEntityType = {
[IpcChannel.ENTITY_UPDATE_AUTHOR]: Author;
[IpcChannel.ENTITY_UPDATE_AUTHOR_NAME]: AuthorName;
[IpcChannel.ENTITY_UPDATE_AUTHOR_ROLE]: AuthorRole;
[IpcChannel.ENTITY_UPDATE_AUTHOR_ROLE_NAME]: AuthorRoleName;
[IpcChannel.ENTITY_UPDATE_CHARACTER_TAG]: CharacterTag;
[IpcChannel.ENTITY_UPDATE_COLLECTION]: Collection;
[IpcChannel.ENTITY_UPDATE_COLLECTION_NAME]: CollectionName;
[IpcChannel.ENTITY_UPDATE_COLLECTION_PART]: CollectionPart;
[IpcChannel.ENTITY_UPDATE_COPY]: Copy;
[IpcChannel.ENTITY_UPDATE_INTERACTION_TAG]: InteractionTag;
[IpcChannel.ENTITY_UPDATE_SITE]: Site;
[IpcChannel.ENTITY_UPDATE_SITE_NAME]: SiteName;
[IpcChannel.ENTITY_UPDATE_SOURCE]: Source;
[IpcChannel.ENTITY_UPDATE_TAG]: Tag;
[IpcChannel.ENTITY_UPDATE_TAG_NAME]: TagName;
[IpcChannel.ENTITY_UPDATE_TRANSFORMATION]: Transformation;
[IpcChannel.ENTITY_UPDATE_TRANSFORMATION_TYPE]: TransformationType;
[IpcChannel.ENTITY_UPDATE_TRANSFORMATION_TYPE_NAME]: TransformationTypeName;
[IpcChannel.ENTITY_UPDATE_WORK_AUTHOR]: WorkAuthor;
[IpcChannel.ENTITY_UPDATE_WORK_CHARACTER]: WorkCharacter;
[IpcChannel.ENTITY_UPDATE_WORK_CHARACTER_NAME]: WorkCharacterName;
[IpcChannel.ENTITY_UPDATE_WORK]: Work;
[IpcChannel.ENTITY_UPDATE_WORK_NAME]: WorkName;
[IpcChannel.ENTITY_UPDATE_WORK_TAG]: WorkTag;
[IpcChannel.ENTITY_UPDATE_WORLD]: World;
[IpcChannel.ENTITY_UPDATE_WORLD_NAME]: WorldName;
[IpcChannel.ENTITY_UPDATE_WORLD_CHARACTER]: WorldCharacter;
[IpcChannel.ENTITY_UPDATE_WORLD_CHARACTER_NAME]: WorldCharacterName;
};
async function update<T extends keyof UpdateSerializedType>(
id: number,
partial: Partial<UpdateSerializedType[T]>,
entityTarget: EntityTarget<UpdateEntityType[T]>,
serializer: Serializer<UpdateEntityType[T], UpdateSerializedType[T]>,
): Promise<UpdateSerializedType[T]> {
const repository = await getRepository(entityTarget);
await repository.update(id, serializer.deserialize(partial) as QueryDeepPartialEntity<UpdateEntityType[T]>);
const entity = await repository.findOneOrFail(id);
return serializer.serialize(entity);
}
ipcServer.answer(IpcChannel.ENTITY_UPDATE_AUTHOR, async ({ id, partial }) =>
update<IpcChannel.ENTITY_UPDATE_AUTHOR>(id, partial, Author, container.get(Service.AUTHOR_SERIALIZER)),
);
ipcServer.answer(IpcChannel.ENTITY_UPDATE_AUTHOR_NAME, async ({ id, partial }) =>
update<IpcChannel.ENTITY_UPDATE_AUTHOR_NAME>(id, partial, AuthorName, container.get(Service.AUTHOR_NAME_SERIALIZER)),
);
ipcServer.answer(IpcChannel.ENTITY_UPDATE_AUTHOR_ROLE, async ({ id, partial }) =>
update<IpcChannel.ENTITY_UPDATE_AUTHOR_ROLE>(id, partial, AuthorRole, container.get(Service.AUTHOR_ROLE_SERIALIZER)),
);
ipcServer.answer(IpcChannel.ENTITY_UPDATE_AUTHOR_ROLE_NAME, async ({ id, partial }) =>
update<IpcChannel.ENTITY_UPDATE_AUTHOR_ROLE_NAME>(
id,
partial,
AuthorRoleName,
container.get(Service.AUTHOR_ROLE_NAME_SERIALIZER),
),
);
ipcServer.answer(IpcChannel.ENTITY_UPDATE_CHARACTER_TAG, async ({ id, partial }) =>
update<IpcChannel.ENTITY_UPDATE_CHARACTER_TAG>(
id,
partial,
CharacterTag,
container.get(Service.CHARACTER_TAG_SERIALIZER),
),
);
ipcServer.answer(IpcChannel.ENTITY_UPDATE_COLLECTION, async ({ id, partial }) =>
update<IpcChannel.ENTITY_UPDATE_COLLECTION>(id, partial, Collection, container.get(Service.COLLECTION_SERIALIZER)),
);
ipcServer.answer(IpcChannel.ENTITY_UPDATE_COLLECTION_NAME, async ({ id, partial }) =>
update<IpcChannel.ENTITY_UPDATE_COLLECTION_NAME>(
id,
partial,
CollectionName,
container.get(Service.COLLECTION_NAME_SERIALIZER),
),
);
ipcServer.answer(IpcChannel.ENTITY_UPDATE_COLLECTION_PART, async ({ id, partial }) =>
update<IpcChannel.ENTITY_UPDATE_COLLECTION_PART>(
id,
partial,
CollectionPart,
container.get(Service.COLLECTION_PART_SERIALIZER),
),
);
ipcServer.answer(IpcChannel.ENTITY_UPDATE_COPY, async ({ id, partial }) =>
update<IpcChannel.ENTITY_UPDATE_COPY>(id, partial, Copy, container.get(Service.COPY_SERIALIZER)),
);
ipcServer.answer(IpcChannel.ENTITY_UPDATE_INTERACTION_TAG, async ({ id, partial }) =>
update<IpcChannel.ENTITY_UPDATE_INTERACTION_TAG>(
id,
partial,
InteractionTag,
container.get(Service.INTERACTION_TAG_SERIALIZER),
),
);
ipcServer.answer(IpcChannel.ENTITY_UPDATE_SITE, async ({ id, partial }) =>
update<IpcChannel.ENTITY_UPDATE_SITE>(id, partial, Site, container.get(Service.SITE_SERIALIZER)),
);
ipcServer.answer(IpcChannel.ENTITY_UPDATE_SITE_NAME, async ({ id, partial }) =>
update<IpcChannel.ENTITY_UPDATE_SITE_NAME>(id, partial, SiteName, container.get(Service.SITE_NAME_SERIALIZER)),
);
ipcServer.answer(IpcChannel.ENTITY_UPDATE_SOURCE, async ({ id, partial }) =>
update<IpcChannel.ENTITY_UPDATE_SOURCE>(id, partial, Source, container.get(Service.SOURCE_SERIALIZER)),
);
ipcServer.answer(IpcChannel.ENTITY_UPDATE_TAG, async ({ id, partial }) =>
update<IpcChannel.ENTITY_UPDATE_TAG>(id, partial, Tag, container.get(Service.TAG_SERIALIZER)),
);
ipcServer.answer(IpcChannel.ENTITY_UPDATE_TAG_NAME, async ({ id, partial }) =>
update<IpcChannel.ENTITY_UPDATE_TAG_NAME>(id, partial, TagName, container.get(Service.TAG_NAME_SERIALIZER)),
);
ipcServer.answer(IpcChannel.ENTITY_UPDATE_TRANSFORMATION, async ({ id, partial }) =>
update<IpcChannel.ENTITY_UPDATE_TRANSFORMATION>(
id,
partial,
Transformation,
container.get(Service.TRANSFORMATION_SERIALIZER),
),
);
ipcServer.answer(IpcChannel.ENTITY_UPDATE_TRANSFORMATION_TYPE, async ({ id, partial }) =>
update<IpcChannel.ENTITY_UPDATE_TRANSFORMATION_TYPE>(
id,
partial,
TransformationType,
container.get(Service.TRANSFORMATION_TYPE_SERIALIZER),
),
);
ipcServer.answer(IpcChannel.ENTITY_UPDATE_TRANSFORMATION_TYPE_NAME, async ({ id, partial }) =>
update<IpcChannel.ENTITY_UPDATE_TRANSFORMATION_TYPE_NAME>(
id,
partial,
TransformationTypeName,
container.get(Service.TRANSFORMATION_TYPE_NAME_SERIALIZER),
),
);
ipcServer.answer(IpcChannel.ENTITY_UPDATE_WORK_AUTHOR, async ({ id, partial }) =>
update<IpcChannel.ENTITY_UPDATE_WORK_AUTHOR>(id, partial, WorkAuthor, container.get(Service.WORK_AUTHOR_SERIALIZER)),
);
ipcServer.answer(IpcChannel.ENTITY_UPDATE_WORK_CHARACTER, async ({ id, partial }) =>
update<IpcChannel.ENTITY_UPDATE_WORK_CHARACTER>(
id,
partial,
WorkCharacter,
container.get(Service.WORK_CHARACTER_SERIALIZER),
),
);
ipcServer.answer(IpcChannel.ENTITY_UPDATE_WORK_CHARACTER_NAME, async ({ id, partial }) =>
update<IpcChannel.ENTITY_UPDATE_WORK_CHARACTER_NAME>(
id,
partial,
WorkCharacterName,
container.get(Service.WORK_CHARACTER_NAME_SERIALIZER),
),
);
ipcServer.answer(IpcChannel.ENTITY_UPDATE_WORK, async ({ id, partial }) =>
update<IpcChannel.ENTITY_UPDATE_WORK>(id, partial, Work, container.get(Service.WORK_SERIALIZER)),
);
ipcServer.answer(IpcChannel.ENTITY_UPDATE_WORK_NAME, async ({ id, partial }) =>
update<IpcChannel.ENTITY_UPDATE_WORK_NAME>(id, partial, WorkName, container.get(Service.WORK_NAME_SERIALIZER)),
);
ipcServer.answer(IpcChannel.ENTITY_UPDATE_WORK_TAG, async ({ id, partial }) =>
update<IpcChannel.ENTITY_UPDATE_WORK_TAG>(id, partial, WorkTag, container.get(Service.WORK_TAG_SERIALIZER)),
);
ipcServer.answer(IpcChannel.ENTITY_UPDATE_WORLD, async ({ id, partial }) =>
update<IpcChannel.ENTITY_UPDATE_WORLD>(id, partial, World, container.get(Service.WORLD_SERIALIZER)),
);
ipcServer.answer(IpcChannel.ENTITY_UPDATE_WORLD_NAME, async ({ id, partial }) =>
update<IpcChannel.ENTITY_UPDATE_WORLD_NAME>(id, partial, WorldName, container.get(Service.WORLD_NAME_SERIALIZER)),
);
ipcServer.answer(IpcChannel.ENTITY_UPDATE_WORLD_CHARACTER, async ({ id, partial }) =>
update<IpcChannel.ENTITY_UPDATE_WORLD_CHARACTER>(
id,
partial,
WorldCharacter,
container.get(Service.WORLD_CHARACTER_SERIALIZER),
),
);
ipcServer.answer(IpcChannel.ENTITY_UPDATE_WORLD_CHARACTER_NAME, async ({ id, partial }) =>
update<IpcChannel.ENTITY_UPDATE_WORLD_CHARACTER_NAME>(
id,
partial,
WorldCharacterName,
container.get(Service.WORLD_CHARACTER_NAME_SERIALIZER),
),
);