lecoffre-back/src/common/repositories/SubscriptionsRepository.ts
2024-03-28 15:26:48 +01:00

142 lines
3.2 KiB
TypeScript

import Database from "@Common/databases/database";
import BaseRepository from "@Repositories/BaseRepository";
import { Service } from "typedi";
import { ESubscriptionType, Prisma, Subscriptions } from "@prisma/client";
import { Subscription } from "le-coffre-resources/dist/Admin";
@Service()
export default class SubscriptionsRepository extends BaseRepository {
constructor(private database: Database) {
super();
}
protected get model() {
return this.database.getClient().subscriptions;
}
protected get instanceDb() {
return this.database.getClient();
}
/**
* @description : Find many subscriptions
*/
public async findMany(query: Prisma.SubscriptionsFindManyArgs) {
query.take = Math.min(query.take || this.defaultFetchRows, this.maxFetchRows);
if (!query.include) return this.model.findMany({ ...query });
return this.model.findMany({ ...query });
}
/**
* @description : find unique subscription
*/
public async findOneByUid(uid: string, query?: Prisma.SubscriptionsInclude): Promise<Subscriptions | null> {
return this.model.findUnique({
where: {
uid: uid,
},
include: query,
});
}
/**
* @description : Create a subscription
*/
public async create(subscription: Subscription): Promise<Subscriptions> {
if(subscription.type === "STANDARD")
{
const createArgs: Prisma.SubscriptionsCreateArgs = {
data: {
start_date: subscription.start_date,
end_date: subscription.end_date,
type: ESubscriptionType.STANDARD,
nb_seats: subscription.nb_seats!,
priceId: subscription.priceId,
office: {
connect: {
uid: subscription.office!.uid,
},
},
seats: {
create: subscription.seats!.map(seat => ({
user: {
connect: {
uid: seat.user!.uid,
},
},
})),
},
},
};
return this.model.create(createArgs);
}
else
{
const createArgs: Prisma.SubscriptionsCreateArgs = {
data: {
start_date: subscription.start_date,
end_date: subscription.end_date,
type: ESubscriptionType.UNLIMITED,
nb_seats: 0,
priceId: subscription.priceId,
office: {
connect: {
uid: subscription.office!.uid,
},
},
},
};
return this.model.create(createArgs);
}
}
/**
* @description : update given subscription
*/
public async update(uid: string, subscription: Subscription): Promise<Subscriptions> {
if(subscription.type === "STANDARD")
{
const updateArgs: Prisma.SubscriptionsUpdateArgs = {
where: {
uid: uid,
},
data: {
end_date: subscription.end_date,
type: ESubscriptionType.STANDARD,
nb_seats: subscription.nb_seats!,
seats: {
deleteMany: {},
create: subscription.seats!.map(seat => ({
user: {
connect: {
uid: seat.user!.uid,
},
},
})),
}
},
};
return this.model.update(updateArgs);
}
else
{
const updateArgs: Prisma.SubscriptionsUpdateArgs = {
where: {
uid: uid,
},
data: {
end_date: subscription.end_date,
type: ESubscriptionType.UNLIMITED,
nb_seats: 0,
seats: {
deleteMany: {},
},
},
};
return this.model.update(updateArgs);
}
}
}