complete language service

This commit is contained in:
vahidrezvani 2025-08-23 09:55:30 +03:30
parent f52cd5263e
commit 9eaf8ddfc5
6 changed files with 169 additions and 69 deletions

View File

@ -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 { InjectModel } from '@nestjs/mongoose';
import { Model } from 'mongoose'; import { Model } from 'mongoose';
import { Language } from '../../schemas/language.schema'; import { Language } from '../../schemas/language.schema';
import { CreateLanguageDto, UpdateLanguageDto } from './dto/language.dto'; import { CreateLanguageDto, UpdateLanguageDto } from './dto/language.dto';
import { v4 as uuidv4 } from 'uuid'; import { v4 as uuidv4 } from 'uuid';
import { I18nContext, I18nService } from 'nestjs-i18n';
import i18next from 'i18next'; import i18next from 'i18next';
export interface ApiResponse<T = any> {
success: boolean;
message: string;
data?: T | null;
errors?: any;
}
@Injectable() @Injectable()
export class LanguageService { export class LanguageService {
constructor(@InjectModel(Language.name) private languageModel: Model<Language>, constructor(
@Inject('I18NEXT') private readonly i18n: typeof i18next) {} @InjectModel(Language.name) private languageModel: Model<Language>,
@Inject('I18NEXT') private readonly i18n: typeof i18next
) {}
async create( /** Create Language */
createLanguageDto: CreateLanguageDto,lang:string): Promise<any> { async create(createLanguageDto: CreateLanguageDto, lang: string): Promise<ApiResponse> {
const createdLanguage = new this.languageModel({ try {
...createLanguageDto, const createdLanguage = new this.languageModel({
ID: uuidv4(), ...createLanguageDto,
Status: true, ID: uuidv4(),
createdAt: new Date(), Status: true,
updatedAt: new Date(), createdAt: new Date(),
}); updatedAt: new Date(),
const result = await createdLanguage.save(); });
console.log("language -----------------", await this.i18n.t('created', { lng: lang ,ns: 'language' })) const result = await createdLanguage.save();
console.log("language -------sdadasd----------", lang) const message = await this.i18n.t('created', { lng: lang, ns: 'language' });
return {
success: true, return { success: true, message, data: result };
message: await this.i18n.t('created', { lng:lang }), } catch (error) {
data: result, 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<ApiResponse<Language[]>> {
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<ApiResponse<Language[]>> {
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<ApiResponse<Language>> {
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<ApiResponse<Language>> {
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<ApiResponse<Language>> {
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<ApiResponse<Language>> {
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<Language[]> {
return this.languageModel.find().exec();
}
async findOne(id: string): Promise<Language> {
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<Language> {
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<void> {
const result = await this.languageModel.deleteOne({ ID: id }).exec();
if (result.deletedCount === 0) {
throw new NotFoundException(`Language with ID ${id} not found`);
}
}
}

View File

@ -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 { Types } from 'mongoose';
import { i18nValidationMessage } from 'nestjs-i18n'; import { i18nValidationMessage } from 'nestjs-i18n';
import { IsMongoId } from 'class-validator'; import { IsMongoId } from 'class-validator';
export class CreateShopCategoryDto { export class CreateShopCategoryDto {
@IsString({ message: i18nValidationMessage('validation.isString') }) @IsString({ message: i18nValidationMessage('validation.isString') })
@IsOptional() @IsNotEmpty({ message: i18nValidationMessage('validation.notEmpty') })
@IsOptional() // اگر اجباری است، این را حذف کنید
Name?: string; Name?: string;
@IsString({ message: i18nValidationMessage('validation.isString') }) @IsString({ message: i18nValidationMessage('validation.isString') })
@ -16,10 +17,6 @@ export class CreateShopCategoryDto {
@IsOptional() @IsOptional()
Icon?: string; Icon?: string;
@IsNumber({}, { message: i18nValidationMessage('validation.isNumber') })
@IsOptional()
Level?: number;
@IsMongoId({ message: i18nValidationMessage('validation.isMongoId') }) @IsMongoId({ message: i18nValidationMessage('validation.isMongoId') })
@IsOptional() @IsOptional()
ParentCategory?: Types.ObjectId; ParentCategory?: Types.ObjectId;

View File

@ -0,0 +1,6 @@
export interface ApiResponse<T = any> {
success: boolean; // آیا عملیات موفق بوده یا نه
message: string; // پیام قابل نمایش به کاربر (ترجمه شده)
data?: T | null; // داده بازگشتی (در GET یا CREATE)
errors?: any; // جزئیات خطا (در صورت وجود)
}

View File

@ -1,3 +1,14 @@
{ {
"created": "Language created successfully" "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"
}

View File

@ -1,3 +1,14 @@
{ {
"created": "زبان با موفقیت ایجاد شد" "created": "زبان با موفقیت ایجاد شد",
} "create_error": "خطا در ایجاد زبان رخ داد",
"retrieved_all": "تمام زبان‌ها با موفقیت دریافت شدند",
"retrieved_active": "زبان‌های فعال با موفقیت دریافت شدند",
"retrieved": "زبان با موفقیت دریافت شد",
"retrieve_error": "خطا در دریافت زبان‌ها رخ داد",
"not_found": "زبان مورد نظر پیدا نشد",
"updated": "زبان با موفقیت بروزرسانی شد",
"update_error": "خطا در بروزرسانی زبان رخ داد",
"deleted": "زبان با موفقیت حذف شد",
"delete_error": "خطا در حذف زبان رخ داد",
"status_toggled": "وضعیت زبان با موفقیت تغییر کرد"
}

View File

@ -18,9 +18,6 @@ export class ShopCategory {
@Prop() @Prop()
Icon: string; Icon: string;
@Prop()
Level: number;
@Prop({ type: [{ type: Types.ObjectId, ref: 'Tag' }] }) @Prop({ type: [{ type: Types.ObjectId, ref: 'Tag' }] })
Tags: Types.ObjectId[]; Tags: Types.ObjectId[];