From b1099cc38a0b3baa33101b45433c3bb44e6082d4 Mon Sep 17 00:00:00 2001 From: vahidrezvani Date: Sat, 23 Aug 2025 16:05:21 +0330 Subject: [PATCH] start for tag Module --- catalog-service/src/app/app.module.ts | 2 + .../shop-category-document.service.ts | 301 ++++++++++++------ .../src/app/tag/tag.controller.spec.ts | 18 ++ catalog-service/src/app/tag/tag.controller.ts | 4 + catalog-service/src/app/tag/tag.module.ts | 9 + .../src/app/tag/tag.service.spec.ts | 18 ++ catalog-service/src/app/tag/tag.service.ts | 4 + catalog-service/src/schemas/tag.schema.ts | 0 8 files changed, 257 insertions(+), 99 deletions(-) create mode 100644 catalog-service/src/app/tag/tag.controller.spec.ts create mode 100644 catalog-service/src/app/tag/tag.controller.ts create mode 100644 catalog-service/src/app/tag/tag.module.ts create mode 100644 catalog-service/src/app/tag/tag.service.spec.ts create mode 100644 catalog-service/src/app/tag/tag.service.ts create mode 100644 catalog-service/src/schemas/tag.schema.ts diff --git a/catalog-service/src/app/app.module.ts b/catalog-service/src/app/app.module.ts index b4440d8..ee52a30 100644 --- a/catalog-service/src/app/app.module.ts +++ b/catalog-service/src/app/app.module.ts @@ -11,6 +11,7 @@ import { AppService } from './app.service'; import { LanguageController } from './language/language.controller'; import { I18nextModule } from './i18next/i18next.module'; import { ShopCategoryDocumentModule } from './shop-category-document/shop-category-document.module'; +import { TagModule } from './tag/tag.module'; @Module({ imports: [ @@ -30,6 +31,7 @@ import { ShopCategoryDocumentModule } from './shop-category-document/shop-catego LanguageModule, I18nextModule, ShopCategoryDocumentModule, + TagModule, ], controllers: [AppController, LanguageController], providers: [AppService], diff --git a/catalog-service/src/app/shop-category-document/shop-category-document.service.ts b/catalog-service/src/app/shop-category-document/shop-category-document.service.ts index 434b78e..c4259f6 100644 --- a/catalog-service/src/app/shop-category-document/shop-category-document.service.ts +++ b/catalog-service/src/app/shop-category-document/shop-category-document.service.ts @@ -1,7 +1,10 @@ import { forwardRef, Inject, Injectable } from '@nestjs/common'; import { InjectModel } from '@nestjs/mongoose'; import { ShopCategoryDoc } from '../../schemas/shopCategory.schema'; -import { ShopCategoryDocument, ShopCategoryDocumentSchema } from '../../schemas/shopCategoryDocument'; +import { + ShopCategoryDocument, + ShopCategoryDocumentSchema, +} from '../../schemas/shopCategoryDocument'; import { Model } from 'mongoose'; import { v4 as uuidv4 } from 'uuid'; import { I18nService } from 'nestjs-i18n'; @@ -13,117 +16,217 @@ import { ShopCategoryService } from '../shop-category/shop-category.service'; @Injectable() export class ShopCategoryDocumentService { + constructor( + @InjectModel(ShopCategoryDocument.name) + private shopCategoryDocumentModel: Model, + private readonly languageService: LanguageService, + @Inject(forwardRef(() => ShopCategoryService)) + private readonly shopCategoryService: ShopCategoryService, + @Inject('I18NEXT') private readonly i18n: typeof i18next + ) {} - constructor(@InjectModel(ShopCategoryDocument.name) private shopCategoryDocumentModel: Model, - private readonly languageService: LanguageService, - @Inject(forwardRef(() => ShopCategoryService)) private readonly shopCategoryService: ShopCategoryService, - @Inject('I18NEXT') private readonly i18n: typeof i18next) { } + async create( + createShopCategoryDocumentDto: CreateShopCategoryDocumentDto, + lang: string + ): Promise { + try { + // بررسی زبان + const language = await this.languageService.findOneWithID( + createShopCategoryDocumentDto.Language, + lang + ); - async create( - createShopCategoryDocumentDto: CreateShopCategoryDocumentDto, - lang: string - ): Promise { - try { - // بررسی زبان - const language = await this.languageService.findOneWithID( - createShopCategoryDocumentDto.Language, - lang - ); + if (!language.success) { + return { + success: false, + message: await this.i18n.t('not_found', { + lng: lang, + ns: 'shopCategoryDocument', + }), + data: null, + }; + } - if (!language.success) { - return { - success: false, - message: await this.i18n.t('not_found', { lng: lang, ns: 'shopCategoryDocument' }), - data: null - }; - } + const shopCategory = await this.shopCategoryService.findOne( + createShopCategoryDocumentDto.ShopCategory, + lang + ); + if (!shopCategory.success) { + return { + success: false, + message: await this.i18n.t('not_found', { + lng: lang, + ns: 'shopCategoryDocument', + }), + data: null, + }; + } + const createdDoc = new this.shopCategoryDocumentModel({ + Name: createShopCategoryDocumentDto.Name, + Description: createShopCategoryDocumentDto.Description, + Language: language.data._id, + ID: uuidv4(), + Status: true, + Tags: [], + ShopCategory: shopCategory.data._id, + createdAt: new Date(), + updatedAt: new Date(), + }); - const shopCategory = await this.shopCategoryService.findOne(createShopCategoryDocumentDto.ShopCategory, lang) - if (!shopCategory.success) { - return { - success: false, - message: await this.i18n.t('not_found', { lng: lang, ns: 'shopCategoryDocument' }), - data: null - }; - } - const createdDoc = new this.shopCategoryDocumentModel({ - Name: createShopCategoryDocumentDto.Name, - Description: createShopCategoryDocumentDto.Description, - Language: language.data._id, - ID: uuidv4(), - Status: true, - Tags: [], - ShopCategory: shopCategory.data._id, - createdAt: new Date(), - updatedAt: new Date(), - }); + const result = await createdDoc.save(); - const result = await createdDoc.save(); + const message = await this.i18n.t('created', { + lng: lang, + ns: 'shopCategoryDocument', + }); - const message = await this.i18n.t('created', { lng: lang, ns: 'shopCategoryDocument' }); - - return { success: true, message, data: result }; - } catch (error) { - const message = await this.i18n.t('create_error', { lng: lang, ns: 'shopCategoryDocument' }); - return { success: false, message, errors: error.message }; - } + return { success: true, message, data: result }; + } catch (error) { + const message = await this.i18n.t('create_error', { + lng: lang, + ns: 'shopCategoryDocument', + }); + return { success: false, message, errors: error.message }; } - async update( - id: string, - updateShopCategoryDocumentDto: UpdateShopCategoryDocumentDto, - lang: string - ): Promise { - try { + } - const existingDoc = await this.shopCategoryDocumentModel.findOne({ ID: id }).exec(); - if (!existingDoc) { - const message = await this.i18n.t('not_found', { lng: lang, ns: 'shopCategoryDocument' }); - return { success: false, message, data: null }; - } + async update( + id: string, + updateShopCategoryDocumentDto: UpdateShopCategoryDocumentDto, + lang: string + ): Promise { + try { + const existingDoc = await this.shopCategoryDocumentModel + .findOne({ ID: id }) + .exec(); + if (!existingDoc) { + const message = await this.i18n.t('not_found', { + lng: lang, + ns: 'shopCategoryDocument', + }); + return { success: false, message, data: null }; + } - if (updateShopCategoryDocumentDto.Language) { - const language = await this.languageService.findOneWithID(updateShopCategoryDocumentDto.Language, 'en'); - if (!language.success) { - const message = await this.i18n.t('not_found', { lng: lang, ns: 'shopCategoryDocument' }); - return { success: false, message, data: null }; - } - updateShopCategoryDocumentDto.Language = language.data._id; - } - - // آپدیت فیلدها - Object.assign(existingDoc, updateShopCategoryDocumentDto, { updatedAt: new Date() }); - - const updatedDoc = await existingDoc.save(); - - const message = await this.i18n.t('updated', { lng: lang, ns: 'shopCategoryDocument' }); - return { success: true, message, data: updatedDoc }; - } catch (error) { - const message = await this.i18n.t('update_error', { lng: lang, ns: 'shopCategoryDocument' }); - return { success: false, message, errors: error.message }; + if (updateShopCategoryDocumentDto.Language) { + const language = await this.languageService.findOneWithID( + updateShopCategoryDocumentDto.Language, + 'en' + ); + if (!language.success) { + const message = await this.i18n.t('not_found', { + lng: lang, + ns: 'shopCategoryDocument', + }); + return { success: false, message, data: null }; } - } - async toggleStatus( - id: string, - lang: string - ): Promise { - try { - const existingDoc = await this.shopCategoryDocumentModel.findOne({ ID: id }).exec(); - if (!existingDoc) { - const message = await this.i18n.t('not_found', { lng: lang, ns: 'shopCategoryDocument' }); - return { success: false, message, data: null }; - } - existingDoc.Status = !existingDoc.Status; - existingDoc.updatedAt = new Date(); + updateShopCategoryDocumentDto.Language = language.data._id; + } - const updatedDoc = await existingDoc.save(); + // آپدیت فیلدها + Object.assign(existingDoc, updateShopCategoryDocumentDto, { + updatedAt: new Date(), + }); - const message = await this.i18n.t('status_toggled', { lng: lang, ns: 'shopCategoryDocument' }); - return { success: true, message, data: updatedDoc }; - } catch (error) { - const message = await this.i18n.t('update_error', { lng: lang, ns: 'shopCategoryDocument' }); - return { success: false, message, errors: error.message }; - } + const updatedDoc = await existingDoc.save(); + + const message = await this.i18n.t('updated', { + lng: lang, + ns: 'shopCategoryDocument', + }); + return { success: true, message, data: updatedDoc }; + } catch (error) { + const message = await this.i18n.t('update_error', { + lng: lang, + ns: 'shopCategoryDocument', + }); + return { success: false, message, errors: error.message }; } + } + + async toggleStatus(id: string, lang: string): Promise { + try { + const existingDoc = await this.shopCategoryDocumentModel + .findOne({ ID: id }) + .exec(); + if (!existingDoc) { + const message = await this.i18n.t('not_found', { + lng: lang, + ns: 'shopCategoryDocument', + }); + return { success: false, message, data: null }; + } + existingDoc.Status = !existingDoc.Status; + existingDoc.updatedAt = new Date(); + + const updatedDoc = await existingDoc.save(); + + const message = await this.i18n.t('status_toggled', { + lng: lang, + ns: 'shopCategoryDocument', + }); + return { success: true, message, data: updatedDoc }; + } catch (error) { + const message = await this.i18n.t('update_error', { + lng: lang, + ns: 'shopCategoryDocument', + }); + return { success: false, message, errors: error.message }; + } + } + + async findAll(lang: string): Promise { + try { + const documents = await this.shopCategoryDocumentModel + .find() + .populate('Tags') + .populate('ShopCategory') + .populate('Language') + .exec(); + + const message = await this.i18n.t('retrieved_all', { + lng: lang, + ns: 'shopCategoryDocument', + }); + return { success: true, message, data: documents }; + } catch (error) { + const message = await this.i18n.t('retrieve_error', { + lng: lang, + ns: 'shopCategoryDocument', + }); + return { success: false, message, errors: error.message }; + } + } + + async findOne(id: string, lang: string): Promise { + try { + const document = await this.shopCategoryDocumentModel + .findOne({ ID: id }) + .populate('Tags') + .populate('ShopCategory') + .populate('Language') + .exec(); + + if (!document) { + const message = await this.i18n.t('not_found', { + lng: lang, + ns: 'shopCategoryDocument', + }); + return { success: false, message, data: null }; + } + + const message = await this.i18n.t('retrieved', { + lng: lang, + ns: 'shopCategoryDocument', + }); + return { success: true, message, data: document }; + } catch (error) { + const message = await this.i18n.t('retrieve_error', { + lng: lang, + ns: 'shopCategoryDocument', + }); + return { success: false, message, errors: error.message }; + } + } } diff --git a/catalog-service/src/app/tag/tag.controller.spec.ts b/catalog-service/src/app/tag/tag.controller.spec.ts new file mode 100644 index 0000000..3ac7b0a --- /dev/null +++ b/catalog-service/src/app/tag/tag.controller.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { TagController } from './tag.controller'; + +describe('TagController', () => { + let controller: TagController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [TagController], + }).compile(); + + controller = module.get(TagController); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); +}); diff --git a/catalog-service/src/app/tag/tag.controller.ts b/catalog-service/src/app/tag/tag.controller.ts new file mode 100644 index 0000000..2f004c5 --- /dev/null +++ b/catalog-service/src/app/tag/tag.controller.ts @@ -0,0 +1,4 @@ +import { Controller } from '@nestjs/common'; + +@Controller('tag') +export class TagController {} diff --git a/catalog-service/src/app/tag/tag.module.ts b/catalog-service/src/app/tag/tag.module.ts new file mode 100644 index 0000000..4882f20 --- /dev/null +++ b/catalog-service/src/app/tag/tag.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { TagController } from './tag.controller'; +import { TagService } from './tag.service'; + +@Module({ + controllers: [TagController], + providers: [TagService], +}) +export class TagModule {} diff --git a/catalog-service/src/app/tag/tag.service.spec.ts b/catalog-service/src/app/tag/tag.service.spec.ts new file mode 100644 index 0000000..eedee15 --- /dev/null +++ b/catalog-service/src/app/tag/tag.service.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { TagService } from './tag.service'; + +describe('TagService', () => { + let service: TagService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [TagService], + }).compile(); + + service = module.get(TagService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/catalog-service/src/app/tag/tag.service.ts b/catalog-service/src/app/tag/tag.service.ts new file mode 100644 index 0000000..bb728fe --- /dev/null +++ b/catalog-service/src/app/tag/tag.service.ts @@ -0,0 +1,4 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class TagService {} diff --git a/catalog-service/src/schemas/tag.schema.ts b/catalog-service/src/schemas/tag.schema.ts new file mode 100644 index 0000000..e69de29