chore: add danak services and admin login

This commit is contained in:
mahyargdz
2025-01-25 16:52:54 +03:30
parent 8af72264e7
commit 6da4b5114c
35 changed files with 505 additions and 34 deletions
@@ -0,0 +1,23 @@
import { ApiProperty, ApiPropertyOptional } from "@nestjs/swagger";
import { IsNotEmpty, IsOptional, IsString, IsUUID, IsUrl, Length } from "class-validator";
import { CategoryMessage } from "../../../common/enums/message.enum";
export class CreateCategoryDto {
@IsNotEmpty({ message: CategoryMessage.TITLE_REQUIRED })
@IsString({ message: CategoryMessage.TITLE_STRING })
@Length(3, 50, { message: CategoryMessage.TITLE_LENGTH })
@ApiProperty({ description: "Category title", example: "business" })
title: string;
@IsNotEmpty({ message: CategoryMessage.ICON_REQUIRED })
@IsUrl({ protocols: ["http", "https"], require_protocol: true }, { message: CategoryMessage.ICON_SHOULD_BE_URL })
@ApiProperty({ description: "Category icon", example: "https://example.com/icon.png" })
icon: string;
@IsOptional()
@IsNotEmpty({ message: CategoryMessage.PARENT_ID_REQUIRED })
@IsUUID("4", { message: CategoryMessage.PARENT_ID_SHOULD_BE_UUID })
@ApiPropertyOptional({ description: "Parent category id", example: "8b1e8b1e-8b1e-8b1e-8b1e-8b1e8b1e8b1e" })
parentId?: string;
}
@@ -0,0 +1,18 @@
import { Body, Controller, Post } from "@nestjs/common";
import { ApiOperation, ApiTags } from "@nestjs/swagger";
import { CreateCategoryDto } from "./DTO/create-category.dto";
import { DanakServicesService } from "./providers/danak-services.service";
import { AuthGuards } from "../../common/decorators/auth-guard.decorator";
@Controller("services")
@ApiTags("Danak-Services")
export class DanakServicesController {
constructor(private readonly danakServicesService: DanakServicesService) {}
@AuthGuards()
@ApiOperation({ summary: "Create a new service category" })
@Post("category")
createCategory(@Body() createDto: CreateCategoryDto) {
return this.danakServicesService.createCategory(createDto);
}
}
@@ -0,0 +1,19 @@
import { Module } from "@nestjs/common";
import { TypeOrmModule } from "@nestjs/typeorm";
import { DanakServicesController } from "./danak-services.controller";
import { DanakServiceCategory } from "./entities/danak-service-category.entity";
import { DanakServiceImage } from "./entities/danak-service-image.entity";
import { DanakService } from "./entities/danak-service.entity";
import { DanakServicesService } from "./providers/danak-services.service";
import { DanakServicesCategoryRepository } from "./repositories/danak-services-category.repository";
import { DanakServicesImageRepository } from "./repositories/danak-services-image.repository";
import { DanakServicesRepository } from "./repositories/danak-services.repository";
@Module({
imports: [TypeOrmModule.forFeature([DanakService, DanakServiceImage, DanakServiceCategory])],
providers: [DanakServicesService, DanakServicesRepository, DanakServicesCategoryRepository, DanakServicesImageRepository],
controllers: [DanakServicesController],
exports: [DanakServicesService, TypeOrmModule],
})
export class DanakServicesModule {}
@@ -0,0 +1,26 @@
import { Column, Entity, JoinColumn, ManyToOne, OneToMany } from "typeorm";
import { DanakService } from "./danak-service.entity";
import { BaseEntity } from "../../../common/entities/base.entity";
@Entity()
export class DanakServiceCategory extends BaseEntity {
@Column({ type: "varchar", length: 100, nullable: false, unique: true })
title: string;
@Column({ type: "varchar", length: 150, nullable: false })
icon: string;
@ManyToOne(() => DanakServiceCategory, (category) => category.children)
@JoinColumn({ name: "parentId" })
parent: DanakServiceCategory;
@OneToMany(() => DanakServiceCategory, (category) => category.parent)
children: DanakServiceCategory[];
@Column({ nullable: true })
parentId: string;
@OneToMany(() => DanakService, (danakService) => danakService.category)
danakService: DanakService[];
}
@@ -0,0 +1,13 @@
import { Column, Entity, ManyToOne } from "typeorm";
import { DanakService } from "./danak-service.entity";
import { BaseEntity } from "../../../common/entities/base.entity";
@Entity()
export class DanakServiceImage extends BaseEntity {
@Column({ type: "varchar", length: 255, nullable: false })
imageUrl: string;
@ManyToOne(() => DanakService, (danakService) => danakService.images, { nullable: false, onDelete: "CASCADE" })
danakService: DanakService;
}
@@ -0,0 +1,52 @@
import { Column, Entity, ManyToOne, OneToMany } from "typeorm";
import { DanakServiceCategory } from "./danak-service-category.entity";
import { DanakServiceImage } from "./danak-service-image.entity";
import { BaseEntity } from "../../../common/entities/base.entity";
import { ServiceStatus } from "../enums/service-status.enum";
import { ServicesLanguage } from "../enums/services-language.enum";
@Entity()
export class DanakService extends BaseEntity {
@Column({ type: "varchar", length: 255, nullable: false })
name: string;
@Column({ type: "text", nullable: false })
description: string;
@Column({ type: "varchar", length: 255, nullable: false })
author: string;
@Column({ type: "timestamp", nullable: false, default: () => "CURRENT_TIMESTAMP" })
createDate: Date;
@Column({ type: "int", nullable: false, default: 0 })
userCount: number;
@Column({ type: "enum", enum: ServicesLanguage, nullable: false })
serviceLanguage: ServicesLanguage;
@Column({ type: "varchar", length: 150, nullable: false })
softwareLanguage: string;
@Column({ type: "text", nullable: false })
metaDescription: string;
@Column({ type: "enum", enum: ServiceStatus, nullable: false, default: ServiceStatus.IN_ACTIVE })
status: ServiceStatus;
@Column({ type: "varchar", length: 255, nullable: false })
link: string;
@Column({ type: "varchar", length: 255, nullable: false })
icon: string;
@OneToMany(() => DanakServiceImage, (danakServiceImage) => danakServiceImage.danakService, { eager: true })
images: DanakServiceImage[];
@ManyToOne(() => DanakServiceCategory, (danakServiceCategory) => danakServiceCategory.danakService, {
nullable: false,
onDelete: "RESTRICT",
})
category: DanakServiceCategory;
}
@@ -0,0 +1,4 @@
export enum ServiceStatus {
ACTIVE = "ACTIVE",
IN_ACTIVE = "IN_ACTIVE",
}
@@ -0,0 +1,5 @@
export enum ServicesLanguage {
ENGLISH = "en",
GERMAN = "de",
PERSIAN = "fa",
}
@@ -0,0 +1,24 @@
import { BadRequestException, Injectable, Logger } from "@nestjs/common";
import { CategoryMessage, CommonMessage } from "../../../common/enums/message.enum";
import { CreateCategoryDto } from "../DTO/create-category.dto";
import { DanakServicesCategoryRepository } from "../repositories/danak-services-category.repository";
@Injectable()
export class DanakServicesService {
private readonly logger = new Logger(DanakServicesService.name);
constructor(private readonly danakServicesCategoryRepository: DanakServicesCategoryRepository) {}
/********** */
async createCategory(createDto: CreateCategoryDto) {
this.logger.log(`Creating a new category with title: ${createDto.title}`);
const existCategory = await this.danakServicesCategoryRepository.findOneBy({ title: createDto.title });
if (existCategory) throw new BadRequestException(CategoryMessage.TITLE_EXIST);
const category = this.danakServicesCategoryRepository.create(createDto);
await this.danakServicesCategoryRepository.save(category);
return {
message: CommonMessage.CREATED,
category,
};
}
/********** */
}
@@ -0,0 +1,12 @@
import { Injectable } from "@nestjs/common";
import { InjectRepository } from "@nestjs/typeorm";
import { Repository } from "typeorm";
import { DanakServiceCategory } from "../entities/danak-service-category.entity";
@Injectable()
export class DanakServicesCategoryRepository extends Repository<DanakServiceCategory> {
constructor(@InjectRepository(DanakServiceCategory) danakServicesCategoryRepository: Repository<DanakServiceCategory>) {
super(danakServicesCategoryRepository.target, danakServicesCategoryRepository.manager, danakServicesCategoryRepository.queryRunner);
}
}
@@ -0,0 +1,12 @@
import { Injectable } from "@nestjs/common";
import { InjectRepository } from "@nestjs/typeorm";
import { Repository } from "typeorm";
import { DanakServiceImage } from "../entities/danak-service-image.entity";
@Injectable()
export class DanakServicesImageRepository extends Repository<DanakServiceImage> {
constructor(@InjectRepository(DanakServiceImage) danakServicesImageRepository: Repository<DanakServiceImage>) {
super(danakServicesImageRepository.target, danakServicesImageRepository.manager, danakServicesImageRepository.queryRunner);
}
}
@@ -0,0 +1,12 @@
import { Injectable } from "@nestjs/common";
import { InjectRepository } from "@nestjs/typeorm";
import { Repository } from "typeorm";
import { DanakService } from "../entities/danak-service.entity";
@Injectable()
export class DanakServicesRepository extends Repository<DanakService> {
constructor(@InjectRepository(DanakService) danakServicesRepository: Repository<DanakService>) {
super(danakServicesRepository.target, danakServicesRepository.manager, danakServicesRepository.queryRunner);
}
}