fix: bug in repositry of subscriptions

This commit is contained in:
mahyargdz
2025-02-08 16:24:54 +03:30
parent ab3f3f8eaf
commit bc96f62782
14 changed files with 110 additions and 44 deletions
+2 -4
View File
@@ -4,11 +4,9 @@ export abstract class BaseEntity {
@PrimaryGeneratedColumn("uuid")
id: string;
@CreateDateColumn({
type: "timestamptz",
})
@CreateDateColumn({ type: "timestamptz" })
createdAt: Date;
@UpdateDateColumn()
@UpdateDateColumn({ type: "timestamptz" })
updatedAt: Date;
}
+12
View File
@@ -270,3 +270,15 @@ export const enum NotificationMessage {
LOGIN_MESSAGE = "یک لاگین به حساب کاربری شما صورت گرفت",
NOTIFICATION_NOT_FOUND_OR_ACCESS_DENIED = "اعلان یافت نشد یا دسترسی غیرمجاز است",
}
export const enum SubscriptionMessage {
DURATION_SHOULD_BE_INT = "مدت زمان باید یک عدد صحیح باشد",
DURATION_REQUIRED = "مدت زمان مورد نیاز است",
PRICE_REQUIRED = "قیمت مورد نیاز است",
PRICE_SHOULD_BE_INT = "قیمت باید یک عدد صحیح باشد",
NAME_REQUIRED = "نام مورد نیاز است",
NAME_SHOULD_BE_STRING = "نام باید یک رشته باشد",
NAME_LENGTH = "نام باید بین ۳ تا ۱۰۰ کاراکتر باشد",
IS_ACTIVE_REQUIRED = "وضعیت فعال بودن مورد نیاز است",
IS_ACTIVE_SHOULD_BE_BOOLEAN = "وضعیت فعال بودن باید یک بولین باشد",
}
@@ -9,9 +9,7 @@ import { DanakServicesService } from "./providers/danak-services.service";
import { AuthGuards } from "../../common/decorators/auth-guard.decorator";
import { Pagination } from "../../common/decorators/pagination.decorator";
import { Roles } from "../../common/decorators/roles.decorator";
import { UserDec } from "../../common/decorators/user.decorator";
import { ParamDto } from "../../common/DTO/param.dto";
import { User } from "../users/entities/user.entity";
import { RoleEnum } from "../users/enums/role.enum";
@Controller("services")
@@ -79,11 +77,11 @@ export class DanakServicesController {
return this.danakServicesService.toggleServiceStatus(paramDto);
}
@AuthGuards()
@Roles(RoleEnum.USER)
@ApiOperation({ summary: "get all user purchased danak services" })
@Get("user-services")
getUserServices(@UserDec() user: User) {
return this.danakServicesService.getUserServices(user.id);
}
// @AuthGuards()
// @Roles(RoleEnum.USER)
// @ApiOperation({ summary: "get all user purchased danak services" })
// @Get("user-services")
// getUserServices(@UserDec() user: User) {
// return this.danakServicesService.getUserServices(user.id);
// }
}
@@ -79,15 +79,15 @@ export class DanakServicesService {
}
/******************************************** */
async getUserServices(userId: string) {
const userServices = await this.danakServicesRepository.find({
where: { users: { id: userId } },
});
// async getUserServices(userId: string) {
// const userServices = await this.danakServicesRepository.find({
// where: { users: { id: userId } },
// });
return {
userServices,
};
}
// return {
// userServices,
// };
// }
/******************************************** */
async toggleCategoryStatus(paramDto: ParamDto) {
@@ -6,17 +6,13 @@ import { NotificationType } from "../enums/notification-type.enum";
@Entity()
export class Notification extends BaseEntity {
@Column({ type: "varchar", length: 250 })
@Column({ type: "varchar", length: 250, nullable: false })
title: string;
@Column({ type: "text" })
@Column({ type: "text", nullable: false })
message: string;
@Column({
type: "enum",
enum: NotificationType,
default: NotificationType.LOGIN,
})
@Column({ type: "enum", enum: NotificationType, default: NotificationType.LOGIN })
type: NotificationType;
@Column({ type: "boolean", default: false })
@@ -5,7 +5,10 @@ import { SearchNotificationQueryDto } from "./DTO/search-notification-query.dto"
import { NotificationsService } from "./providers/notifications.service";
import { AuthGuards } from "../../common/decorators/auth-guard.decorator";
import { Pagination } from "../../common/decorators/pagination.decorator";
import { Roles } from "../../common/decorators/roles.decorator";
import { UserDec } from "../../common/decorators/user.decorator";
import { ParamDto } from "../../common/DTO/param.dto";
import { RoleEnum } from "../users/enums/role.enum";
@Controller("notifications")
@ApiTags("Notifications")
@@ -17,6 +20,7 @@ export class NotificationController {
@ApiOperation({ summary: "all notifications by user" })
@Pagination()
@AuthGuards()
@Roles(RoleEnum.USER)
@Get()
getAllNotifications(@UserDec("id") userId: string, @Query() queryDto: SearchNotificationQueryDto) {
console.log(userId);
@@ -27,9 +31,10 @@ export class NotificationController {
@ApiOperation({ summary: "mark user notification as read" })
@AuthGuards()
@Roles(RoleEnum.USER)
@Patch(":id/read")
markAsRead(@Param("id") id: string, @UserDec("id") userId: string) {
return this.notificationService.markAsRead(id, userId);
markAsRead(@Param() paramDto: ParamDto, @UserDec("id") userId: string) {
return this.notificationService.markAsRead(paramDto.id, userId);
}
//********************* */
@@ -0,0 +1,27 @@
import { ApiProperty } from "@nestjs/swagger";
import { IsBoolean, IsInt, IsNotEmpty, IsString, Length } from "class-validator";
import { SubscriptionMessage } from "../../../common/enums/message.enum";
export class CreateSubscriptionPlanDto {
@IsNotEmpty({ message: SubscriptionMessage.NAME_REQUIRED })
@IsString({ message: SubscriptionMessage.NAME_SHOULD_BE_STRING })
@Length(3, 100, { message: SubscriptionMessage.NAME_LENGTH })
@ApiProperty({ description: "the name of the subscription plan", example: "یک ماهه" })
name: string;
@IsNotEmpty({ message: SubscriptionMessage.DURATION_REQUIRED })
@IsInt({ message: SubscriptionMessage.DURATION_SHOULD_BE_INT })
@ApiProperty({ description: "the duration of the subscription plan in days", example: 30 })
duration: number;
@IsNotEmpty({ message: SubscriptionMessage.PRICE_REQUIRED })
@IsInt({ message: SubscriptionMessage.PRICE_SHOULD_BE_INT })
@ApiProperty({ description: "the price of the subscription plan", example: 10_000_000 })
price: number;
@IsNotEmpty({ message: SubscriptionMessage.IS_ACTIVE_REQUIRED })
@IsBoolean({ message: SubscriptionMessage.IS_ACTIVE_SHOULD_BE_BOOLEAN })
@ApiProperty({ description: "the status of the subscription plan", example: true })
isActive: boolean;
}
@@ -1,19 +1,22 @@
// eslint-disable-next-line import/no-named-as-default
import Decimal from "decimal.js";
import { Column, Entity, ManyToOne } from "typeorm";
import { BaseEntity } from "../../../common/entities/base.entity";
import { DecimalTransformer } from "../../../common/transformers/decimal.transformer";
import { DanakService } from "../../danak-services/entities/danak-service.entity";
@Entity()
export class SubscriptionPlan extends BaseEntity {
@Column({ type: "varchar", length: 100, nullable: false })
@Column({ type: "varchar", length: 150, nullable: false })
name: string;
@Column({ type: "int", nullable: false })
duration: number;
@Column({ type: "decimal", precision: 10, scale: 2, nullable: false })
price: number;
@Column({ type: "decimal", precision: 16, scale: 2, nullable: false, transformer: new DecimalTransformer() })
price: Decimal;
//
@Column({ type: "boolean", default: true })
isActive: boolean;
@@ -12,12 +12,12 @@ export class UserSubscription extends BaseEntity {
@ManyToOne(() => SubscriptionPlan, { nullable: false, onDelete: "CASCADE" })
plan: SubscriptionPlan;
@Column({ type: "timestamp", nullable: false }) // When the subscription started
@Column({ type: "timestamp", nullable: false })
startDate: Date;
@Column({ type: "timestamp", nullable: false }) // When it expires
@Column({ type: "timestamp", nullable: false })
endDate: Date;
@Column({ type: "boolean", default: false }) // Whether the user canceled it
@Column({ type: "boolean", default: false })
isCanceled: boolean;
}
@@ -1,4 +1,13 @@
import { Injectable } from "@nestjs/common";
import { CreateSubscriptionPlanDto } from "../DTO/create-subscription.dto";
import { SubscriptionsPlanRepository } from "../repositories/subscriptions.repository";
@Injectable()
export class SubscriptionsService {}
export class SubscriptionsService {
constructor(private readonly subscriptionsPlanRepository: SubscriptionsPlanRepository) {}
async createSubscriptionsPlan(createDto: CreateSubscriptionPlanDto) {
console.log(this.subscriptionsPlanRepository, createDto);
}
}
@@ -5,7 +5,7 @@ import { Repository } from "typeorm";
import { SubscriptionPlan } from "../entities/subscription.entity";
@Injectable()
export class SubscriptionsRepository extends Repository<SubscriptionPlan> {
export class SubscriptionsPlanRepository extends Repository<SubscriptionPlan> {
constructor(@InjectRepository(SubscriptionPlan) subscriptionPlanRepository: Repository<SubscriptionPlan>) {
super(subscriptionPlanRepository.target, subscriptionPlanRepository.manager, subscriptionPlanRepository.queryRunner);
}
@@ -2,9 +2,11 @@ import { Injectable } from "@nestjs/common";
import { InjectRepository } from "@nestjs/typeorm";
import { Repository } from "typeorm";
import { UserSubscription } from "../entities/user-subscription.entity";
@Injectable()
export class UserSubscriptionsRepository extends Repository<UserSubscriptionsRepository> {
constructor(@InjectRepository(UserSubscriptionsRepository) userSubscriptionsRepository: Repository<UserSubscriptionsRepository>) {
export class UserSubscriptionsRepository extends Repository<UserSubscription> {
constructor(@InjectRepository(UserSubscription) userSubscriptionsRepository: Repository<UserSubscription>) {
super(userSubscriptionsRepository.target, userSubscriptionsRepository.manager, userSubscriptionsRepository.queryRunner);
}
}
@@ -1,4 +1,20 @@
import { Controller } from "@nestjs/common";
import { ApiOperation } from "@nestjs/swagger";
import { SubscriptionsService } from "./providers/subscriptions.service";
import { AuthGuards } from "../../common/decorators/auth-guard.decorator";
import { Roles } from "../../common/decorators/roles.decorator";
import { RoleEnum } from "../users/enums/role.enum";
@Controller("subscriptions")
export class SubscriptionsController {}
export class SubscriptionsController {
constructor(private readonly subscriptionService: SubscriptionsService) {}
@ApiOperation({ summary: "Create a subscription plan" })
@AuthGuards()
@Roles(RoleEnum.ADMIN)
createSubscription() {
console.log(this.subscriptionService);
// return this.subscriptionService.createSubscriptionsPlan();
}
}
@@ -4,13 +4,13 @@ import { TypeOrmModule } from "@nestjs/typeorm";
import { SubscriptionPlan } from "./entities/subscription.entity";
import { UserSubscription } from "./entities/user-subscription.entity";
import { SubscriptionsService } from "./providers/subscriptions.service";
import { SubscriptionsRepository } from "./repositories/subscriptions.repository";
import { SubscriptionsPlanRepository } from "./repositories/subscriptions.repository";
import { UserSubscriptionsRepository } from "./repositories/user-subscriptions.repository";
import { SubscriptionsController } from "./subscriptions.controller";
@Module({
imports: [TypeOrmModule.forFeature([SubscriptionPlan, UserSubscription])],
providers: [SubscriptionsService, SubscriptionsRepository, UserSubscriptionsRepository],
providers: [SubscriptionsService, SubscriptionsPlanRepository, UserSubscriptionsRepository],
controllers: [SubscriptionsController],
exports: [SubscriptionsService],
})