From 84163f6c8cfe75efc9613684c7d9a93391f6e0b2 Mon Sep 17 00:00:00 2001 From: morteza-mortezai Date: Sat, 15 Nov 2025 09:14:32 +0330 Subject: [PATCH] up --- src/modules/foods/dto/create-category.dto.ts | 3 +-- src/modules/foods/entities/category.entity.ts | 10 +++++----- src/modules/foods/entities/food.entity.ts | 2 +- src/modules/foods/food.module.ts | 4 ++++ src/modules/foods/providers/category.service.ts | 4 ++-- src/modules/foods/providers/food.service.ts | 12 ++++++------ src/modules/foods/repositories/food.repository.ts | 12 ++++++------ 7 files changed, 25 insertions(+), 22 deletions(-) diff --git a/src/modules/foods/dto/create-category.dto.ts b/src/modules/foods/dto/create-category.dto.ts index 669595c..8336446 100644 --- a/src/modules/foods/dto/create-category.dto.ts +++ b/src/modules/foods/dto/create-category.dto.ts @@ -3,10 +3,9 @@ import { ApiPropertyOptional } from '@nestjs/swagger'; import { Type } from 'class-transformer'; export class CreateCategoryDto { - @IsOptional() @IsString() @ApiPropertyOptional({ example: 'Beverages' }) - title?: string; + title!: string; @IsOptional() @IsBoolean() diff --git a/src/modules/foods/entities/category.entity.ts b/src/modules/foods/entities/category.entity.ts index 342f985..7b9f598 100644 --- a/src/modules/foods/entities/category.entity.ts +++ b/src/modules/foods/entities/category.entity.ts @@ -1,14 +1,14 @@ import { Entity, Property, ManyToMany, Collection } from '@mikro-orm/core'; -import { Foods } from './food.entity'; +import { Food } from './food.entity'; import { BaseEntity } from '../../../common/entities/base.entity'; @Entity({ tableName: 'categories' }) export class Category extends BaseEntity { - @Property({ nullable: true }) - title?: string; + @Property() + title!: string; - @ManyToMany(() => Foods, food => food.categories) - foods = new Collection(this); + @ManyToMany(() => Food, food => food.categories) + foods = new Collection(this); @Property({ default: true }) isActive: boolean = true; diff --git a/src/modules/foods/entities/food.entity.ts b/src/modules/foods/entities/food.entity.ts index 917d1ef..c45f1a0 100644 --- a/src/modules/foods/entities/food.entity.ts +++ b/src/modules/foods/entities/food.entity.ts @@ -3,7 +3,7 @@ import { Category } from './category.entity'; import { BaseEntity } from '../../../common/entities/base.entity'; @Entity({ tableName: 'foods' }) -export class Foods extends BaseEntity { +export class Food extends BaseEntity { @ManyToMany(() => Category) categories = new Collection(this); diff --git a/src/modules/foods/food.module.ts b/src/modules/foods/food.module.ts index cf699be..efe765a 100644 --- a/src/modules/foods/food.module.ts +++ b/src/modules/foods/food.module.ts @@ -5,8 +5,12 @@ import { CategorysController } from './controllers/categorys.controller'; import { CategoryService } from './providers/category.service'; import { FoodRepository } from './repositories/food.repository'; import { CategoryRepository } from './repositories/category.repository'; +import { MikroOrmModule } from '@mikro-orm/nestjs'; +import { Category } from './entities/category.entity'; +import { Food } from './entities/food.entity'; @Module({ + imports: [MikroOrmModule.forFeature([Food, Category])], controllers: [FoodController, CategorysController], providers: [FoodService, CategoryService, FoodRepository, CategoryRepository], exports: [FoodRepository, CategoryRepository], diff --git a/src/modules/foods/providers/category.service.ts b/src/modules/foods/providers/category.service.ts index 3eb308a..6f92d73 100644 --- a/src/modules/foods/providers/category.service.ts +++ b/src/modules/foods/providers/category.service.ts @@ -15,12 +15,12 @@ export class CategoryService { ) {} async create(dto: CreateCategoryDto): Promise { - const data = { + const data: RequiredEntityData = { title: dto.title, isActive: dto.isActive ?? true, restId: dto.restId, avatarUrl: dto.avatarUrl, - } as RequiredEntityData; + }; const category = this.categoryRepository.create(data); await this.em.persistAndFlush(category); diff --git a/src/modules/foods/providers/food.service.ts b/src/modules/foods/providers/food.service.ts index 8e24935..9fecb7d 100644 --- a/src/modules/foods/providers/food.service.ts +++ b/src/modules/foods/providers/food.service.ts @@ -5,7 +5,7 @@ import { FoodRepository } from '../repositories/food.repository'; import { CategoryRepository } from '../repositories/category.repository'; import { EntityManager } from '@mikro-orm/postgresql'; import { RequiredEntityData } from '@mikro-orm/core'; -import { Foods } from '../entities/food.entity'; +import { Food } from '../entities/food.entity'; import { FoodMessage } from 'src/common/enums/message.enum'; @Injectable() @@ -16,11 +16,11 @@ export class FoodService { private readonly em: EntityManager, ) {} - async create(createFoodDto: CreateFoodDto): Promise { + async create(createFoodDto: CreateFoodDto): Promise { const { categoryIds, ...rest } = createFoodDto; // prepare data with defaults for required fields so repository.create typing is satisfied - const data: RequiredEntityData = { + const data: RequiredEntityData = { // boolean/day flags sat: rest.sat ?? false, sun: rest.sun ?? false, @@ -45,7 +45,7 @@ export class FoodService { points: rest.points ?? 0, prepareTime: rest.prepareTime ?? 0, images: rest.images ?? undefined, - } as RequiredEntityData; + } as RequiredEntityData; const food = this.foodRepository.create(data); @@ -67,7 +67,7 @@ export class FoodService { return this.foodRepository.findOne({ id }, { populate: ['categories'] }); } - async update(id: string, dto: Partial): Promise { + async update(id: string, dto: Partial): Promise { const food = await this.foodRepository.findOne({ id }); if (!food) { @@ -77,7 +77,7 @@ export class FoodService { const { categoryIds, ...rest } = dto; // assign scalar fields - this.em.assign(food, rest as Partial); + this.em.assign(food, rest as Partial); // attach new categories if provided (adds, does not attempt to preserve/remove existing ones) if (Array.isArray(categoryIds) && categoryIds.length) { diff --git a/src/modules/foods/repositories/food.repository.ts b/src/modules/foods/repositories/food.repository.ts index dc0458d..380657f 100644 --- a/src/modules/foods/repositories/food.repository.ts +++ b/src/modules/foods/repositories/food.repository.ts @@ -1,7 +1,7 @@ import { Injectable } from '@nestjs/common'; import { EntityManager, EntityRepository } from '@mikro-orm/postgresql'; import { FilterQuery } from '@mikro-orm/core'; -import { Foods } from '../entities/food.entity'; +import { Food } from '../entities/food.entity'; import { PaginatedResult } from 'src/common/interfaces/pagination.interface'; type FindFoodsOpts = { @@ -15,20 +15,20 @@ type FindFoodsOpts = { }; @Injectable() -export class FoodRepository extends EntityRepository { +export class FoodRepository extends EntityRepository { constructor(readonly em: EntityManager) { - super(em, Foods); + super(em, Food); } /** * Find foods with pagination and optional filters. * Supports: search (title/content), categoryId, isActive, ordering. */ - async findAllPaginated(opts: FindFoodsOpts = {}): Promise> { + async findAllPaginated(opts: FindFoodsOpts = {}): Promise> { const { page = 1, limit = 10, search, orderBy = 'createdAt', order = 'desc', categoryId, isActive } = opts; const offset = (page - 1) * limit; - const where: FilterQuery = {}; + const where: FilterQuery = {}; if (typeof isActive === 'boolean') { where.isActive = isActive; @@ -41,7 +41,7 @@ export class FoodRepository extends EntityRepository { if (categoryId) { // filter by related categories (typed via FilterQuery) - Object.assign(where, { categories: { id: categoryId } } as unknown as FilterQuery); + Object.assign(where, { categories: { id: categoryId } } as unknown as FilterQuery); } const [data, total] = await this.findAndCount(where, {