lecoffre-back/src/common/repositories/DeedsRepository.ts
2023-07-06 14:18:41 +02:00

109 lines
2.5 KiB
TypeScript

import Database from "@Common/databases/database";
import BaseRepository from "@Repositories/BaseRepository";
import { Service } from "typedi";
import { Deeds, Prisma } from "@prisma/client";
import { Deed } from "le-coffre-resources/dist/Notary";
@Service()
export default class DeedsRepository extends BaseRepository {
constructor(private database: Database) {
super();
}
protected get model() {
return this.database.getClient().deeds;
}
protected get instanceDb() {
return this.database.getClient();
}
/**
* @description : Find many users
*/
public async findMany(query: Prisma.DeedsFindManyArgs) {
query.take = Math.min(query.take || this.defaultFetchRows, this.maxFetchRows);
return this.model.findMany(query);
}
/**
* @description : Create a deed based on a deed type
*/
public async create(deed: Deed): Promise<Deeds> {
const createArgs: Prisma.DeedsCreateArgs = {
data: {
deed_type: {
connect: {
uid: deed.deed_type!.uid,
},
},
},
};
const deedTypeWithDocumentTypes = await this.instanceDb.deedTypes.findUniqueOrThrow({
where: {
uid: deed.deed_type!.uid,
},
include: { document_types: true },
});
if (deedTypeWithDocumentTypes.archived_at) throw new Error("deed type is archived");
if (deedTypeWithDocumentTypes.document_types) {
createArgs.data.document_types = {
connect: deedTypeWithDocumentTypes.document_types.map((documentType) => ({
uid: documentType.uid,
})),
};
}
return this.model.create({ ...createArgs, include: { document_types: true } });
}
/**
* @description : Update data of a deed type
*/
public async update(uid: string, deed: Deed): Promise<Deeds> {
const updateArgs: Prisma.DeedsUpdateArgs = {
where: {
uid: uid,
},
data: {
document_types: {
set: deed.document_types?.map((documentType) => ({
uid: documentType.uid!,
})),
},
},
include: {
document_types: true,
},
};
return this.model.update({ ...updateArgs, include: { document_types: true } });
}
/**
* @description : Find unique deed
*/
public async findOneByUid(uid: string, query?: Prisma.DeedsInclude): Promise<Deeds | null> {
return this.model.findUnique({
where: {
uid: uid,
},
include: query,
});
}
/**
* @description : Find unique deed
*/
public async findOneByUidWithOffice(uid: string) {
return this.model.findUnique({
where: {
uid: uid,
},
include: {
deed_type: { include: { office: true } },
document_types: { include: { office: true } },
},
});
}
}