This commit is contained in:
Vins 2024-03-27 09:31:48 +01:00
parent 1bcb1dca6f
commit 0c8cee8b4c
5 changed files with 153 additions and 0 deletions

View File

@ -0,0 +1,47 @@
import { Controller, Get } from "@ControllerPattern/index";
import { Response, Request } from "express";
import ApiController from "@Common/system/controller-pattern/ApiController";
import { Service } from "typedi";
import authHandler from "@App/middlewares/AuthHandler";
import roleHandler from "@App/middlewares/RolesHandler";
import ruleHandler from "@App/middlewares/RulesHandler";
import { Prisma } from "@prisma/client";
import SubscriptionsService from "@Services/admin/SubscriptionsService/SubscriptionsService.ts";
@Controller()
@Service()
export default class SubscriptionsController extends ApiController {
constructor(private subscriptionsService: SubscriptionsService) {
super();
}
/**
* @description Get all subscriptions
*/
@Get("/api/v1/admin/subscriptions", [authHandler, roleHandler, ruleHandler])
protected async get(req: Request, response: Response) {
try {
//get query
let query: Prisma.SubscriptionsFindManyArgs = {};
if (req.query["q"]) {
query = JSON.parse(req.query["q"] as string);
if (query.where?.uid) {
this.httpBadRequest(response, "You can't filter by uid");
return;
}
}
//call service to get prisma entity
const subscriptionsEntities = await this.subscriptionsService.get(query);
//Hydrate ressource with prisma entity
// const subscriptions = Subscription.hydrateArray<Subscription>(subscriptionsEntities, { strategy: "excludeAll" });
//success
this.httpSuccess(response);
} catch (error) {
this.httpInternalError(response, error);
return;
}
}
}

View File

@ -0,0 +1,34 @@
-- CreateTable
CREATE TABLE "subscriptions" (
"uid" TEXT NOT NULL,
"start_date" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
"end_date" TIMESTAMP(3),
"nb_seats" INTEGER NOT NULL,
"office_uid" VARCHAR(255) NOT NULL,
CONSTRAINT "subscriptions_pkey" PRIMARY KEY ("uid")
);
-- CreateTable
CREATE TABLE "seats" (
"uid" TEXT NOT NULL,
"subscription_uid" VARCHAR(255) NOT NULL,
"user_uid" VARCHAR(255) NOT NULL,
CONSTRAINT "seats_pkey" PRIMARY KEY ("uid")
);
-- CreateIndex
CREATE UNIQUE INDEX "subscriptions_uid_key" ON "subscriptions"("uid");
-- CreateIndex
CREATE UNIQUE INDEX "seats_uid_key" ON "seats"("uid");
-- AddForeignKey
ALTER TABLE "subscriptions" ADD CONSTRAINT "subscriptions_office_uid_fkey" FOREIGN KEY ("office_uid") REFERENCES "offices"("uid") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "seats" ADD CONSTRAINT "seats_subscription_uid_fkey" FOREIGN KEY ("subscription_uid") REFERENCES "subscriptions"("uid") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "seats" ADD CONSTRAINT "seats_user_uid_fkey" FOREIGN KEY ("user_uid") REFERENCES "users"("uid") ON DELETE CASCADE ON UPDATE CASCADE;

View File

@ -68,6 +68,7 @@ model Users {
appointment Appointments[]
votes Votes[]
user_notifications UserNotifications[]
seats Seats[]
@@map("users")
}
@ -108,6 +109,7 @@ model Offices {
office_folders OfficeFolders[]
document_types DocumentTypes[]
office_roles OfficeRoles[]
subscriptions Subscriptions[]
@@map("offices")
}
@ -375,6 +377,26 @@ model TotpCodes {
@@map("totp_codes")
}
model Subscriptions {
uid String @id @unique @default(uuid())
start_date DateTime? @default(now())
end_date DateTime?
nb_seats Int
office Offices @relation(fields: [office_uid], references: [uid], onDelete: Cascade)
office_uid String @db.VarChar(255)
seats Seats[]
@@map("subscriptions")
}
model Seats {
uid String @id @unique @default(uuid())
subscription Subscriptions @relation(fields: [subscription_uid], references: [uid], onDelete: Cascade)
subscription_uid String @db.VarChar(255)
user Users @relation(fields: [user_uid], references: [uid], onDelete: Cascade)
user_uid String @db.VarChar(255)
@@map("seats")
}
enum TotpCodesReasons {
LOGIN
RESET_PASSWORD

View File

@ -0,0 +1,28 @@
import Database from "@Common/databases/database";
import BaseRepository from "@Repositories/BaseRepository";
import { Service } from "typedi";
import { Prisma } from "@prisma/client";
@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 totp codes
*/
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 });
}
}

View File

@ -0,0 +1,22 @@
import BaseService from "@Services/BaseService";
import "reflect-metadata";
import { Service } from "typedi";
import { Prisma } from "@prisma/client";
import SubscriptionsRepository from "@Repositories/SubscriptionsRepository";
@Service()
export default class SubscriptionsService extends BaseService {
constructor(private subscriptionsRepository: SubscriptionsRepository) {
super();
}
/**
* @description : Get all subscriptions
* @throws {Error} If subscriptions cannot be get
*/
public get(query: Prisma.SubscriptionsFindManyArgs) {
return this.subscriptionsRepository.findMany(query);
}
}