From 0c8cee8b4ccee618fc838eaf3aa1dee799020651 Mon Sep 17 00:00:00 2001 From: Vins Date: Wed, 27 Mar 2024 09:31:48 +0100 Subject: [PATCH] WIP --- src/app/api/admin/SubscriptionsController.ts | 47 +++++++++++++++++++ .../migration.sql | 34 ++++++++++++++ src/common/databases/schema.prisma | 22 +++++++++ .../repositories/SubscriptionsRepository.ts | 28 +++++++++++ .../SubscriptionsService.ts.ts | 22 +++++++++ 5 files changed, 153 insertions(+) create mode 100644 src/app/api/admin/SubscriptionsController.ts create mode 100644 src/common/databases/migrations/20240325150228_subscriptions/migration.sql create mode 100644 src/common/repositories/SubscriptionsRepository.ts create mode 100644 src/services/admin/SubscriptionsService/SubscriptionsService.ts.ts diff --git a/src/app/api/admin/SubscriptionsController.ts b/src/app/api/admin/SubscriptionsController.ts new file mode 100644 index 00000000..c3a674b8 --- /dev/null +++ b/src/app/api/admin/SubscriptionsController.ts @@ -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(subscriptionsEntities, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } +} diff --git a/src/common/databases/migrations/20240325150228_subscriptions/migration.sql b/src/common/databases/migrations/20240325150228_subscriptions/migration.sql new file mode 100644 index 00000000..8319eafb --- /dev/null +++ b/src/common/databases/migrations/20240325150228_subscriptions/migration.sql @@ -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; diff --git a/src/common/databases/schema.prisma b/src/common/databases/schema.prisma index 4aad566c..170a228d 100644 --- a/src/common/databases/schema.prisma +++ b/src/common/databases/schema.prisma @@ -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 diff --git a/src/common/repositories/SubscriptionsRepository.ts b/src/common/repositories/SubscriptionsRepository.ts new file mode 100644 index 00000000..7d921c51 --- /dev/null +++ b/src/common/repositories/SubscriptionsRepository.ts @@ -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 }); + } + + +} diff --git a/src/services/admin/SubscriptionsService/SubscriptionsService.ts.ts b/src/services/admin/SubscriptionsService/SubscriptionsService.ts.ts new file mode 100644 index 00000000..a884dc54 --- /dev/null +++ b/src/services/admin/SubscriptionsService/SubscriptionsService.ts.ts @@ -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); + } + + +}