From 37b8e0044521f349519ada777f89f83f67ef4a87 Mon Sep 17 00:00:00 2001 From: Matin Date: Tue, 25 Feb 2025 09:10:13 +0330 Subject: [PATCH] chore: dashboard report, admin route decorator and guard --- src/common/decorators/admin.decorator.ts | 4 +++ src/common/decorators/auth-guard.decorator.ts | 3 ++- src/modules/auth/guards/admin.guard.ts | 25 +++++++++++++++++++ .../dashboards/dashboard.controller.ts | 4 +++ .../providers/subscriptions.service.ts | 13 +++++----- 5 files changed, 41 insertions(+), 8 deletions(-) create mode 100644 src/common/decorators/admin.decorator.ts create mode 100644 src/modules/auth/guards/admin.guard.ts diff --git a/src/common/decorators/admin.decorator.ts b/src/common/decorators/admin.decorator.ts new file mode 100644 index 0000000..f6982d6 --- /dev/null +++ b/src/common/decorators/admin.decorator.ts @@ -0,0 +1,4 @@ +export const ADMIN_ROUTE = "shouldAdmin"; +import { SetMetadata } from "@nestjs/common"; + +export const AdminRoute = (isAdminRoute: boolean = true) => SetMetadata(ADMIN_ROUTE, isAdminRoute); diff --git a/src/common/decorators/auth-guard.decorator.ts b/src/common/decorators/auth-guard.decorator.ts index a738282..d87fb3a 100644 --- a/src/common/decorators/auth-guard.decorator.ts +++ b/src/common/decorators/auth-guard.decorator.ts @@ -1,10 +1,11 @@ import { UseGuards, applyDecorators } from "@nestjs/common"; import { ApiBearerAuth } from "@nestjs/swagger"; +import { AdminRouteGuard } from "../../modules/auth/guards/admin.guard"; import { JwtAuthGuard } from "../../modules/auth/guards/auth.guard"; import { PermissionsGuard } from "../../modules/auth/guards/permission.guard"; // import { RoleGuard } from "../../modules/auth/guards/role.guard"; export function AuthGuards() { - return applyDecorators(UseGuards(JwtAuthGuard, PermissionsGuard), ApiBearerAuth("authorization")); + return applyDecorators(UseGuards(JwtAuthGuard, PermissionsGuard, AdminRouteGuard), ApiBearerAuth("authorization")); } diff --git a/src/modules/auth/guards/admin.guard.ts b/src/modules/auth/guards/admin.guard.ts new file mode 100644 index 0000000..2504471 --- /dev/null +++ b/src/modules/auth/guards/admin.guard.ts @@ -0,0 +1,25 @@ +import { CanActivate, ExecutionContext, ForbiddenException, Injectable } from "@nestjs/common"; +import { Reflector } from "@nestjs/core"; +import { FastifyRequest } from "fastify"; + +import { ADMIN_ROUTE } from "../../../common/decorators/admin.decorator"; +import { AuthMessage } from "../../../common/enums/message.enum"; + +@Injectable() +export class AdminRouteGuard implements CanActivate { + constructor(private reflector: Reflector) {} + + canActivate(context: ExecutionContext): boolean { + const requiredAdmin = this.reflector.getAllAndOverride(ADMIN_ROUTE, [context.getHandler(), context.getClass()]); + if (!requiredAdmin) return true; + + const req = context.switchToHttp().getRequest(); + const user = req.user; + + if (!user) throw new ForbiddenException(AuthMessage.UNAUTHORIZED_ACCESS); + + if (!user.isAdmin) throw new ForbiddenException(AuthMessage.UNAUTHORIZED_ACCESS); + + return true; + } +} diff --git a/src/modules/dashboards/dashboard.controller.ts b/src/modules/dashboards/dashboard.controller.ts index 5ed73ed..83826cb 100644 --- a/src/modules/dashboards/dashboard.controller.ts +++ b/src/modules/dashboards/dashboard.controller.ts @@ -1,8 +1,12 @@ import { Controller, Get } from "@nestjs/common"; import { DashboardService } from "./providers/dashboard.service"; +import { AdminRoute } from "../../common/decorators/admin.decorator"; +import { AuthGuards } from "../../common/decorators/auth-guard.decorator"; @Controller("dashboards") +@AuthGuards() +@AdminRoute() export class DashboardController { constructor(private readonly dashboardService: DashboardService) {} diff --git a/src/modules/subscriptions/providers/subscriptions.service.ts b/src/modules/subscriptions/providers/subscriptions.service.ts index d768ff3..4fe90e1 100644 --- a/src/modules/subscriptions/providers/subscriptions.service.ts +++ b/src/modules/subscriptions/providers/subscriptions.service.ts @@ -1,4 +1,5 @@ import { BadRequestException, Injectable } from "@nestjs/common"; +import dayjs from "dayjs"; // eslint-disable-next-line import/no-named-as-default import Decimal from "decimal.js"; import { DataSource, In } from "typeorm"; @@ -371,12 +372,10 @@ export class SubscriptionsService { } async getPlansSalesCountByDaysInWeek() { - const now = new Date(); - const daysSinceStart = now.getDay(); // Remove the +1 and % 7 - const startOfWeek = new Date(now); - startOfWeek.setDate(now.getDate() - daysSinceStart); - const endOfWeek = new Date(startOfWeek); - endOfWeek.setDate(startOfWeek.getDate() + 6); + const startOfWeek = dayjs().startOf("week").toDate(); + const endOfWeek = dayjs().endOf("week").toDate(); + + console.log(startOfWeek, endOfWeek); const sales = await this.userSubscriptionsRepository .createQueryBuilder("userSubscription") @@ -392,7 +391,7 @@ export class SubscriptionsService { const salesByDay = Array(7).fill(0); sales.forEach((sale) => { - const day = new Date(sale.date).getDay(); // Remove the +1 and % 7 + const day = (dayjs(sale.date).day() + 1) % 7; salesByDay[day] = parseInt(sale.count); });