chore: add danak services and admin login
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user