fix: bug in repositry of subscriptions
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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],
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user