@opentiny/tiny-toolkit-pro
Version:
TinyPro Vue:开箱即用、前后端分离的 Vue 后台管理模板
191 lines (183 loc) • 4.9 kB
text/typescript
import { HttpException, HttpStatus, Injectable } from '@nestjs/common';
import { CreateI18Dto } from './dto/create-i18.dto';
import { UpdateI18Dto } from './dto/update-i18.dto';
import { InjectRepository } from '@nestjs/typeorm';
import { I18, Lang } from '@app/models';
import { In, Like, Repository } from 'typeorm';
import { paginate } from 'nestjs-typeorm-paginate';
import { I18nTranslations } from '../.generate/i18n.generated';
import { I18nContext, I18nService } from 'nestjs-i18n';
()
export class I18Service {
private readonly COUNT_CACHE = 'i18::count::cache';
constructor(
(I18) private readonly i18: Repository<I18>,
(Lang) private readonly lang: Repository<Lang>,
private readonly i18n: I18nService<I18nTranslations>
) {}
async getFormat(lang: string) {
const data = await this.lang.find({
where: {
name: lang === '' ? undefined : lang,
},
relations: ['i18'],
});
const ret: Record<string, Record<string, string>> = {};
for (let i = 0; i < data.length; i++) {
const { name, i18 } = data[i];
ret[name] = {};
for (let i = 0; i < i18.length; i++) {
const i18Item = i18[i];
ret[name][i18Item.key] = i18Item.content;
}
}
return ret;
}
async create(createI18Dto: CreateI18Dto) {
const { key, content, lang } = createI18Dto;
const i18 = this.i18.create();
const langRecord = await this.lang.findOne({
where: {
id: lang,
},
});
if (!langRecord) {
throw new HttpException(
this.i18n.t('exception.lang.notExists', {
args: { lang },
lang: I18nContext.current().lang,
}),
HttpStatus.NOT_FOUND
);
}
const i18Item = await this.i18.findOne({
where: {
key,
lang: langRecord,
},
});
if (i18Item) {
throw new HttpException(
this.i18n.t('exception.i18.exists', {
lang: I18nContext.current().lang,
}),
HttpStatus.BAD_REQUEST
);
}
i18.content = content;
i18.key = key;
i18.lang = langRecord;
const items = await this.i18.save(i18);
return items;
}
async has(key: string, langId: number) {
return this.i18.findOne({
where: {
key,
lang: {
id: langId,
},
},
});
}
async findAll(
page?: number,
limit?: number,
all?: boolean,
lang?: number[],
content?: string,
key?: string
) {
let count = 0;
if (all) {
count = await this.i18.count();
}
const where = {
lang: lang && lang.length ? { id: In(lang) } : undefined,
content: content ? Like(content) : undefined,
key: key ? Like(key) : undefined,
};
if (page && limit) {
return paginate<I18>(
this.i18,
{
limit,
page,
},
{
relations: ['lang'],
loadEagerRelations: true,
where,
}
);
} else {
return paginate(
this.i18,
{
limit: all ? count || process.env.PAGITION_LIMIT : limit,
page: Number.isNaN(page) ? process.env.PAGITION_PAGE : page,
},
{
relations: ['lang'],
loadEagerRelations: true,
where,
}
);
}
}
async findOne(id: number) {
const [item] = await this.i18.find({
where: {
id,
},
loadEagerRelations: true,
relations: ['lang'],
});
if (!item) {
throw new HttpException(
this.i18n.t('exception.i18.notExists', {
lang: I18nContext.current().lang,
}),
HttpStatus.NOT_FOUND
);
}
return item;
}
async update(id: number, updateI18Dto: UpdateI18Dto) {
const item = await this.findOne(id);
item.content = updateI18Dto.content;
item.key = updateI18Dto.key;
const lang = await this.lang.findOne({
where: {
id: updateI18Dto.lang,
},
});
if (!lang) {
throw new HttpException(
this.i18n.t('exception.lang.notExists', {
lang: I18nContext.current().lang,
}),
HttpStatus.NOT_FOUND
);
}
item.lang = lang;
return await this.i18.save(item);
}
async remove(id: number) {
const item = await this.findOne(id);
await this.i18.remove(item);
return item;
}
async batchRemove(ids: number[]) {
const result = []
for (const id of ids) {
try {
const item = await this.remove(id);
result.push(item);
} catch (error) {
console.log(`删除词条 ${id} 时出错`, error);
}
}
return result;
}
}