From 9eaf8ddfc56fc0e89d0c2ade0de7c5d6413ae323 Mon Sep 17 00:00:00 2001 From: vahidrezvani Date: Sat, 23 Aug 2025 09:55:30 +0330 Subject: [PATCH] complete language service --- .../src/app/language/language.service.ts | 190 ++++++++++++------ .../dto/create-shop-category.dto.ts | 9 +- .../src/interface/responsePatern.ts | 6 + catalog-service/src/locales/en/language.json | 15 +- catalog-service/src/locales/fa/language.json | 15 +- .../src/schemas/shopCategory.schema.ts | 3 - 6 files changed, 169 insertions(+), 69 deletions(-) create mode 100644 catalog-service/src/interface/responsePatern.ts diff --git a/catalog-service/src/app/language/language.service.ts b/catalog-service/src/app/language/language.service.ts index 3116884..9cddfa9 100644 --- a/catalog-service/src/app/language/language.service.ts +++ b/catalog-service/src/app/language/language.service.ts @@ -1,67 +1,145 @@ -import { Inject, Injectable, NotFoundException } from '@nestjs/common'; +import { Inject, Injectable, NotFoundException, InternalServerErrorException } from '@nestjs/common'; import { InjectModel } from '@nestjs/mongoose'; import { Model } from 'mongoose'; import { Language } from '../../schemas/language.schema'; import { CreateLanguageDto, UpdateLanguageDto } from './dto/language.dto'; import { v4 as uuidv4 } from 'uuid'; -import { I18nContext, I18nService } from 'nestjs-i18n'; import i18next from 'i18next'; +export interface ApiResponse { + success: boolean; + message: string; + data?: T | null; + errors?: any; +} + @Injectable() export class LanguageService { - constructor(@InjectModel(Language.name) private languageModel: Model, -@Inject('I18NEXT') private readonly i18n: typeof i18next) {} + constructor( + @InjectModel(Language.name) private languageModel: Model, + @Inject('I18NEXT') private readonly i18n: typeof i18next + ) {} -async create( - createLanguageDto: CreateLanguageDto,lang:string): Promise { - const createdLanguage = new this.languageModel({ - ...createLanguageDto, - ID: uuidv4(), - Status: true, - createdAt: new Date(), - updatedAt: new Date(), - }); - const result = await createdLanguage.save(); - console.log("language -----------------", await this.i18n.t('created', { lng: lang ,ns: 'language' })) - console.log("language -------sdadasd----------", lang) - return { - success: true, - message: await this.i18n.t('created', { lng:lang }), - data: result, - }; + /** Create Language */ + async create(createLanguageDto: CreateLanguageDto, lang: string): Promise { + try { + const createdLanguage = new this.languageModel({ + ...createLanguageDto, + ID: uuidv4(), + Status: true, + createdAt: new Date(), + updatedAt: new Date(), + }); + const result = await createdLanguage.save(); + const message = await this.i18n.t('created', { lng: lang, ns: 'language' }); + + return { success: true, message, data: result }; + } catch (error) { + const message = await this.i18n.t('create_error', { lng: lang, ns: 'language' }); + return { success: false, message, errors: error.message }; + } + } + + /** Find All Languages */ + async findAll(lang: string): Promise> { + try { + const result = await this.languageModel.find().exec(); + const message = await this.i18n.t('retrieved_all', { lng: lang, ns: 'language' }); + return { success: true, message, data: result }; + } catch (error) { + const message = await this.i18n.t('retrieve_error', { lng: lang, ns: 'language' }); + return { success: false, message, errors: error.message }; + } + } + + /** Find Active Languages */ + async findActive(lang: string): Promise> { + try { + const result = await this.languageModel.find({ Status: true }).exec(); + const message = await this.i18n.t('retrieved_active', { lng: lang, ns: 'language' }); + return { success: true, message, data: result }; + } catch (error) { + const message = await this.i18n.t('retrieve_error', { lng: lang, ns: 'language' }); + return { success: false, message, errors: error.message }; + } + } + + /** Toggle Status */ + async toggleStatus(id: string, lang: string): Promise> { + try { + const language = await this.languageModel.findOne({ ID: id }).exec(); + if (!language) { + const message = await this.i18n.t('not_found', { lng: lang, ns: 'language' }); + return { success: false, message, data: null }; + } + + language.Status = !language.Status; + const result = await language.save(); + const message = await this.i18n.t('status_toggled', { lng: lang, ns: 'language' }); + return { success: true, message, data: result }; + } catch (error) { + const message = await this.i18n.t('update_error', { lng: lang, ns: 'language' }); + return { success: false, message, errors: error.message }; + } + } + + /** Find One by ID */ + async findOneWithID(id: string, lang: string): Promise> { + try { + const language = await this.languageModel.findOne({ ID: id }).exec(); + if (!language) { + const message = await this.i18n.t('not_found', { lng: lang, ns: 'language' }); + return { success: false, message, data: null }; + } + const message = await this.i18n.t('retrieved', { lng: lang, ns: 'language' }); + return { success: true, message, data: language }; + } catch (error) { + const message = await this.i18n.t('retrieve_error', { lng: lang, ns: 'language' }); + return { success: false, message, errors: error.message }; + } + } + + /** Find One by _id */ + async findOneWithid(id: string, lang: string): Promise> { + try { + const language = await this.languageModel.findOne({ _id: id }).exec(); + if (!language) { + const message = await this.i18n.t('not_found', { lng: lang, ns: 'language' }); + return { success: false, message, data: null }; + } + const message = await this.i18n.t('retrieved', { lng: lang, ns: 'language' }); + return { success: true, message, data: language }; + } catch (error) { + const message = await this.i18n.t('retrieve_error', { lng: lang, ns: 'language' }); + return { success: false, message, errors: error.message }; + } + } + + /** Update Language */ + async updateLanguage( + id: string, + updateLanguageDto: UpdateLanguageDto, + lang: string + ): Promise> { + try { + const updatedLanguage = await this.languageModel + .findOneAndUpdate( + { ID: id }, + { ...updateLanguageDto, updatedAt: new Date() }, + { new: true } + ) + .exec(); + + if (!updatedLanguage) { + const message = await this.i18n.t('not_found', { lng: lang, ns: 'language' }); + return { success: false, message, data: null }; + } + + const message = await this.i18n.t('updated', { lng: lang, ns: 'language' }); + return { success: true, message, data: updatedLanguage }; + } catch (error) { + const message = await this.i18n.t('update_error', { lng: lang, ns: 'language' }); + return { success: false, message, errors: error.message }; + } + } } - - async findAll(): Promise { - return this.languageModel.find().exec(); - } - - async findOne(id: string): Promise { - const language = await this.languageModel.findOne({ ID: id }).exec(); - if (!language) { - throw new NotFoundException(`Language with ID ${id} not found`); - } - return language; - } - - async update(id: string, updateLanguageDto: UpdateLanguageDto): Promise { - const language = await this.languageModel - .findOneAndUpdate( - { ID: id }, - { ...updateLanguageDto, updatedAt: new Date() }, - { new: true }, - ) - .exec(); - - if (!language) { - throw new NotFoundException(`Language with ID ${id} not found`); - } - return language; - } - - async remove(id: string): Promise { - const result = await this.languageModel.deleteOne({ ID: id }).exec(); - if (result.deletedCount === 0) { - throw new NotFoundException(`Language with ID ${id} not found`); - } - } -} \ No newline at end of file diff --git a/catalog-service/src/app/shop-category/dto/create-shop-category.dto.ts b/catalog-service/src/app/shop-category/dto/create-shop-category.dto.ts index bd042d5..0083b05 100644 --- a/catalog-service/src/app/shop-category/dto/create-shop-category.dto.ts +++ b/catalog-service/src/app/shop-category/dto/create-shop-category.dto.ts @@ -1,11 +1,12 @@ -import { IsString, IsOptional, IsNumber, IsNotEmpty } from 'class-validator'; +import { IsString, IsOptional, IsNumber, Min, Max, IsNotEmpty } from 'class-validator'; import { Types } from 'mongoose'; import { i18nValidationMessage } from 'nestjs-i18n'; import { IsMongoId } from 'class-validator'; export class CreateShopCategoryDto { @IsString({ message: i18nValidationMessage('validation.isString') }) - @IsOptional() + @IsNotEmpty({ message: i18nValidationMessage('validation.notEmpty') }) + @IsOptional() // اگر اجباری است، این را حذف کنید Name?: string; @IsString({ message: i18nValidationMessage('validation.isString') }) @@ -16,10 +17,6 @@ export class CreateShopCategoryDto { @IsOptional() Icon?: string; - @IsNumber({}, { message: i18nValidationMessage('validation.isNumber') }) - @IsOptional() - Level?: number; - @IsMongoId({ message: i18nValidationMessage('validation.isMongoId') }) @IsOptional() ParentCategory?: Types.ObjectId; diff --git a/catalog-service/src/interface/responsePatern.ts b/catalog-service/src/interface/responsePatern.ts new file mode 100644 index 0000000..65f4974 --- /dev/null +++ b/catalog-service/src/interface/responsePatern.ts @@ -0,0 +1,6 @@ +export interface ApiResponse { + success: boolean; // آیا عملیات موفق بوده یا نه + message: string; // پیام قابل نمایش به کاربر (ترجمه شده) + data?: T | null; // داده بازگشتی (در GET یا CREATE) + errors?: any; // جزئیات خطا (در صورت وجود) +} diff --git a/catalog-service/src/locales/en/language.json b/catalog-service/src/locales/en/language.json index 75917df..3656e51 100644 --- a/catalog-service/src/locales/en/language.json +++ b/catalog-service/src/locales/en/language.json @@ -1,3 +1,14 @@ { - "created": "Language created successfully" -} \ No newline at end of file + "created": "Language created successfully", + "create_error": "Error occurred while creating language", + "retrieved_all": "Languages retrieved successfully", + "retrieved_active": "Active languages retrieved successfully", + "retrieved": "Language retrieved successfully", + "retrieve_error": "Error occurred while retrieving language(s)", + "not_found": "Language not found", + "updated": "Language updated successfully", + "update_error": "Error occurred while updating language", + "deleted": "Language deleted successfully", + "delete_error": "Error occurred while deleting language", + "status_toggled": "Language status updated successfully" +} diff --git a/catalog-service/src/locales/fa/language.json b/catalog-service/src/locales/fa/language.json index d7089d7..be8d5b3 100644 --- a/catalog-service/src/locales/fa/language.json +++ b/catalog-service/src/locales/fa/language.json @@ -1,3 +1,14 @@ { - "created": "زبان با موفقیت ایجاد شد" - } \ No newline at end of file + "created": "زبان با موفقیت ایجاد شد", + "create_error": "خطا در ایجاد زبان رخ داد", + "retrieved_all": "تمام زبان‌ها با موفقیت دریافت شدند", + "retrieved_active": "زبان‌های فعال با موفقیت دریافت شدند", + "retrieved": "زبان با موفقیت دریافت شد", + "retrieve_error": "خطا در دریافت زبان‌ها رخ داد", + "not_found": "زبان مورد نظر پیدا نشد", + "updated": "زبان با موفقیت بروزرسانی شد", + "update_error": "خطا در بروزرسانی زبان رخ داد", + "deleted": "زبان با موفقیت حذف شد", + "delete_error": "خطا در حذف زبان رخ داد", + "status_toggled": "وضعیت زبان با موفقیت تغییر کرد" +} diff --git a/catalog-service/src/schemas/shopCategory.schema.ts b/catalog-service/src/schemas/shopCategory.schema.ts index d3e28ba..ed23439 100644 --- a/catalog-service/src/schemas/shopCategory.schema.ts +++ b/catalog-service/src/schemas/shopCategory.schema.ts @@ -18,9 +18,6 @@ export class ShopCategory { @Prop() Icon: string; - @Prop() - Level: number; - @Prop({ type: [{ type: Types.ObjectId, ref: 'Tag' }] }) Tags: Types.ObjectId[];