fix: bug in repositry of subscriptions
This commit is contained in:
@@ -4,11 +4,9 @@ export abstract class BaseEntity {
|
|||||||
@PrimaryGeneratedColumn("uuid")
|
@PrimaryGeneratedColumn("uuid")
|
||||||
id: string;
|
id: string;
|
||||||
|
|
||||||
@CreateDateColumn({
|
@CreateDateColumn({ type: "timestamptz" })
|
||||||
type: "timestamptz",
|
|
||||||
})
|
|
||||||
createdAt: Date;
|
createdAt: Date;
|
||||||
|
|
||||||
@UpdateDateColumn()
|
@UpdateDateColumn({ type: "timestamptz" })
|
||||||
updatedAt: Date;
|
updatedAt: Date;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -270,3 +270,15 @@ export const enum NotificationMessage {
|
|||||||
LOGIN_MESSAGE = "یک لاگین به حساب کاربری شما صورت گرفت",
|
LOGIN_MESSAGE = "یک لاگین به حساب کاربری شما صورت گرفت",
|
||||||
NOTIFICATION_NOT_FOUND_OR_ACCESS_DENIED = "اعلان یافت نشد یا دسترسی غیرمجاز است",
|
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 { AuthGuards } from "../../common/decorators/auth-guard.decorator";
|
||||||
import { Pagination } from "../../common/decorators/pagination.decorator";
|
import { Pagination } from "../../common/decorators/pagination.decorator";
|
||||||
import { Roles } from "../../common/decorators/roles.decorator";
|
import { Roles } from "../../common/decorators/roles.decorator";
|
||||||
import { UserDec } from "../../common/decorators/user.decorator";
|
|
||||||
import { ParamDto } from "../../common/DTO/param.dto";
|
import { ParamDto } from "../../common/DTO/param.dto";
|
||||||
import { User } from "../users/entities/user.entity";
|
|
||||||
import { RoleEnum } from "../users/enums/role.enum";
|
import { RoleEnum } from "../users/enums/role.enum";
|
||||||
|
|
||||||
@Controller("services")
|
@Controller("services")
|
||||||
@@ -79,11 +77,11 @@ export class DanakServicesController {
|
|||||||
return this.danakServicesService.toggleServiceStatus(paramDto);
|
return this.danakServicesService.toggleServiceStatus(paramDto);
|
||||||
}
|
}
|
||||||
|
|
||||||
@AuthGuards()
|
// @AuthGuards()
|
||||||
@Roles(RoleEnum.USER)
|
// @Roles(RoleEnum.USER)
|
||||||
@ApiOperation({ summary: "get all user purchased danak services" })
|
// @ApiOperation({ summary: "get all user purchased danak services" })
|
||||||
@Get("user-services")
|
// @Get("user-services")
|
||||||
getUserServices(@UserDec() user: User) {
|
// getUserServices(@UserDec() user: User) {
|
||||||
return this.danakServicesService.getUserServices(user.id);
|
// return this.danakServicesService.getUserServices(user.id);
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -79,15 +79,15 @@ export class DanakServicesService {
|
|||||||
}
|
}
|
||||||
/******************************************** */
|
/******************************************** */
|
||||||
|
|
||||||
async getUserServices(userId: string) {
|
// async getUserServices(userId: string) {
|
||||||
const userServices = await this.danakServicesRepository.find({
|
// const userServices = await this.danakServicesRepository.find({
|
||||||
where: { users: { id: userId } },
|
// where: { users: { id: userId } },
|
||||||
});
|
// });
|
||||||
|
|
||||||
return {
|
// return {
|
||||||
userServices,
|
// userServices,
|
||||||
};
|
// };
|
||||||
}
|
// }
|
||||||
/******************************************** */
|
/******************************************** */
|
||||||
|
|
||||||
async toggleCategoryStatus(paramDto: ParamDto) {
|
async toggleCategoryStatus(paramDto: ParamDto) {
|
||||||
|
|||||||
@@ -6,17 +6,13 @@ import { NotificationType } from "../enums/notification-type.enum";
|
|||||||
|
|
||||||
@Entity()
|
@Entity()
|
||||||
export class Notification extends BaseEntity {
|
export class Notification extends BaseEntity {
|
||||||
@Column({ type: "varchar", length: 250 })
|
@Column({ type: "varchar", length: 250, nullable: false })
|
||||||
title: string;
|
title: string;
|
||||||
|
|
||||||
@Column({ type: "text" })
|
@Column({ type: "text", nullable: false })
|
||||||
message: string;
|
message: string;
|
||||||
|
|
||||||
@Column({
|
@Column({ type: "enum", enum: NotificationType, default: NotificationType.LOGIN })
|
||||||
type: "enum",
|
|
||||||
enum: NotificationType,
|
|
||||||
default: NotificationType.LOGIN,
|
|
||||||
})
|
|
||||||
type: NotificationType;
|
type: NotificationType;
|
||||||
|
|
||||||
@Column({ type: "boolean", default: false })
|
@Column({ type: "boolean", default: false })
|
||||||
|
|||||||
@@ -5,7 +5,10 @@ import { SearchNotificationQueryDto } from "./DTO/search-notification-query.dto"
|
|||||||
import { NotificationsService } from "./providers/notifications.service";
|
import { NotificationsService } from "./providers/notifications.service";
|
||||||
import { AuthGuards } from "../../common/decorators/auth-guard.decorator";
|
import { AuthGuards } from "../../common/decorators/auth-guard.decorator";
|
||||||
import { Pagination } from "../../common/decorators/pagination.decorator";
|
import { Pagination } from "../../common/decorators/pagination.decorator";
|
||||||
|
import { Roles } from "../../common/decorators/roles.decorator";
|
||||||
import { UserDec } from "../../common/decorators/user.decorator";
|
import { UserDec } from "../../common/decorators/user.decorator";
|
||||||
|
import { ParamDto } from "../../common/DTO/param.dto";
|
||||||
|
import { RoleEnum } from "../users/enums/role.enum";
|
||||||
|
|
||||||
@Controller("notifications")
|
@Controller("notifications")
|
||||||
@ApiTags("Notifications")
|
@ApiTags("Notifications")
|
||||||
@@ -17,6 +20,7 @@ export class NotificationController {
|
|||||||
@ApiOperation({ summary: "all notifications by user" })
|
@ApiOperation({ summary: "all notifications by user" })
|
||||||
@Pagination()
|
@Pagination()
|
||||||
@AuthGuards()
|
@AuthGuards()
|
||||||
|
@Roles(RoleEnum.USER)
|
||||||
@Get()
|
@Get()
|
||||||
getAllNotifications(@UserDec("id") userId: string, @Query() queryDto: SearchNotificationQueryDto) {
|
getAllNotifications(@UserDec("id") userId: string, @Query() queryDto: SearchNotificationQueryDto) {
|
||||||
console.log(userId);
|
console.log(userId);
|
||||||
@@ -27,9 +31,10 @@ export class NotificationController {
|
|||||||
|
|
||||||
@ApiOperation({ summary: "mark user notification as read" })
|
@ApiOperation({ summary: "mark user notification as read" })
|
||||||
@AuthGuards()
|
@AuthGuards()
|
||||||
|
@Roles(RoleEnum.USER)
|
||||||
@Patch(":id/read")
|
@Patch(":id/read")
|
||||||
markAsRead(@Param("id") id: string, @UserDec("id") userId: string) {
|
markAsRead(@Param() paramDto: ParamDto, @UserDec("id") userId: string) {
|
||||||
return this.notificationService.markAsRead(id, userId);
|
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 { Column, Entity, ManyToOne } from "typeorm";
|
||||||
|
|
||||||
import { BaseEntity } from "../../../common/entities/base.entity";
|
import { BaseEntity } from "../../../common/entities/base.entity";
|
||||||
|
import { DecimalTransformer } from "../../../common/transformers/decimal.transformer";
|
||||||
import { DanakService } from "../../danak-services/entities/danak-service.entity";
|
import { DanakService } from "../../danak-services/entities/danak-service.entity";
|
||||||
|
|
||||||
@Entity()
|
@Entity()
|
||||||
export class SubscriptionPlan extends BaseEntity {
|
export class SubscriptionPlan extends BaseEntity {
|
||||||
@Column({ type: "varchar", length: 100, nullable: false })
|
@Column({ type: "varchar", length: 150, nullable: false })
|
||||||
name: string;
|
name: string;
|
||||||
|
|
||||||
@Column({ type: "int", nullable: false })
|
@Column({ type: "int", nullable: false })
|
||||||
duration: number;
|
duration: number;
|
||||||
|
|
||||||
@Column({ type: "decimal", precision: 10, scale: 2, nullable: false })
|
@Column({ type: "decimal", precision: 16, scale: 2, nullable: false, transformer: new DecimalTransformer() })
|
||||||
price: number;
|
price: Decimal;
|
||||||
|
//
|
||||||
@Column({ type: "boolean", default: true })
|
@Column({ type: "boolean", default: true })
|
||||||
isActive: boolean;
|
isActive: boolean;
|
||||||
|
|
||||||
|
|||||||
@@ -12,12 +12,12 @@ export class UserSubscription extends BaseEntity {
|
|||||||
@ManyToOne(() => SubscriptionPlan, { nullable: false, onDelete: "CASCADE" })
|
@ManyToOne(() => SubscriptionPlan, { nullable: false, onDelete: "CASCADE" })
|
||||||
plan: SubscriptionPlan;
|
plan: SubscriptionPlan;
|
||||||
|
|
||||||
@Column({ type: "timestamp", nullable: false }) // When the subscription started
|
@Column({ type: "timestamp", nullable: false })
|
||||||
startDate: Date;
|
startDate: Date;
|
||||||
|
|
||||||
@Column({ type: "timestamp", nullable: false }) // When it expires
|
@Column({ type: "timestamp", nullable: false })
|
||||||
endDate: Date;
|
endDate: Date;
|
||||||
|
|
||||||
@Column({ type: "boolean", default: false }) // Whether the user canceled it
|
@Column({ type: "boolean", default: false })
|
||||||
isCanceled: boolean;
|
isCanceled: boolean;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,13 @@
|
|||||||
import { Injectable } from "@nestjs/common";
|
import { Injectable } from "@nestjs/common";
|
||||||
|
|
||||||
|
import { CreateSubscriptionPlanDto } from "../DTO/create-subscription.dto";
|
||||||
|
import { SubscriptionsPlanRepository } from "../repositories/subscriptions.repository";
|
||||||
|
|
||||||
@Injectable()
|
@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";
|
import { SubscriptionPlan } from "../entities/subscription.entity";
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class SubscriptionsRepository extends Repository<SubscriptionPlan> {
|
export class SubscriptionsPlanRepository extends Repository<SubscriptionPlan> {
|
||||||
constructor(@InjectRepository(SubscriptionPlan) subscriptionPlanRepository: Repository<SubscriptionPlan>) {
|
constructor(@InjectRepository(SubscriptionPlan) subscriptionPlanRepository: Repository<SubscriptionPlan>) {
|
||||||
super(subscriptionPlanRepository.target, subscriptionPlanRepository.manager, subscriptionPlanRepository.queryRunner);
|
super(subscriptionPlanRepository.target, subscriptionPlanRepository.manager, subscriptionPlanRepository.queryRunner);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,9 +2,11 @@ import { Injectable } from "@nestjs/common";
|
|||||||
import { InjectRepository } from "@nestjs/typeorm";
|
import { InjectRepository } from "@nestjs/typeorm";
|
||||||
import { Repository } from "typeorm";
|
import { Repository } from "typeorm";
|
||||||
|
|
||||||
|
import { UserSubscription } from "../entities/user-subscription.entity";
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class UserSubscriptionsRepository extends Repository<UserSubscriptionsRepository> {
|
export class UserSubscriptionsRepository extends Repository<UserSubscription> {
|
||||||
constructor(@InjectRepository(UserSubscriptionsRepository) userSubscriptionsRepository: Repository<UserSubscriptionsRepository>) {
|
constructor(@InjectRepository(UserSubscription) userSubscriptionsRepository: Repository<UserSubscription>) {
|
||||||
super(userSubscriptionsRepository.target, userSubscriptionsRepository.manager, userSubscriptionsRepository.queryRunner);
|
super(userSubscriptionsRepository.target, userSubscriptionsRepository.manager, userSubscriptionsRepository.queryRunner);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,20 @@
|
|||||||
import { Controller } from "@nestjs/common";
|
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")
|
@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 { SubscriptionPlan } from "./entities/subscription.entity";
|
||||||
import { UserSubscription } from "./entities/user-subscription.entity";
|
import { UserSubscription } from "./entities/user-subscription.entity";
|
||||||
import { SubscriptionsService } from "./providers/subscriptions.service";
|
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 { UserSubscriptionsRepository } from "./repositories/user-subscriptions.repository";
|
||||||
import { SubscriptionsController } from "./subscriptions.controller";
|
import { SubscriptionsController } from "./subscriptions.controller";
|
||||||
|
|
||||||
@Module({
|
@Module({
|
||||||
imports: [TypeOrmModule.forFeature([SubscriptionPlan, UserSubscription])],
|
imports: [TypeOrmModule.forFeature([SubscriptionPlan, UserSubscription])],
|
||||||
providers: [SubscriptionsService, SubscriptionsRepository, UserSubscriptionsRepository],
|
providers: [SubscriptionsService, SubscriptionsPlanRepository, UserSubscriptionsRepository],
|
||||||
controllers: [SubscriptionsController],
|
controllers: [SubscriptionsController],
|
||||||
exports: [SubscriptionsService],
|
exports: [SubscriptionsService],
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user