add service
This commit is contained in:
parent
cbb3a6e7de
commit
388ab50718
89
src/modules/content/services/category.service.ts
Normal file
89
src/modules/content/services/category.service.ts
Normal file
@ -0,0 +1,89 @@
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { isNil, omit } from 'lodash';
|
||||
import { EntityNotFoundError } from 'typeorm';
|
||||
|
||||
import { CreateCategoryDto, QueryCategoryDto } from '@/modules/content/dtos/category.dto';
|
||||
import { CategoryEntity } from '@/modules/content/entities/CategoryEntity';
|
||||
import { CategoryRepository } from '@/modules/content/repositories/category.repository';
|
||||
import { treePaginate } from '@/modules/database/utils';
|
||||
|
||||
@Injectable()
|
||||
export class CategoryService {
|
||||
constructor(protected repository: CategoryRepository) {}
|
||||
|
||||
async findTrees() {
|
||||
return this.repository.findTrees();
|
||||
}
|
||||
|
||||
async paginate(options?: QueryCategoryDto) {
|
||||
const tree = await this.findTrees();
|
||||
const data = await this.repository.toFlatTrees(tree);
|
||||
return treePaginate(options, data);
|
||||
}
|
||||
|
||||
async detail(id: string) {
|
||||
return this.repository.findOneByOrFail({ where: { id }, relations: ['parent'] });
|
||||
}
|
||||
|
||||
async create(data: CreateCategoryDto) {
|
||||
const item = await this.repository.save({
|
||||
...data,
|
||||
parent: await this.getParent(undefined, data.parent),
|
||||
});
|
||||
return this.detail(item.id);
|
||||
}
|
||||
|
||||
async update(data: UpdateCategoryDto) {
|
||||
await this.repository.update(data.id, omit(data, ['id', 'parent']));
|
||||
const item = await this.repository.findOneByOrFail({
|
||||
where: { id: data.id },
|
||||
relations: ['parent'],
|
||||
});
|
||||
const parent = await this.getParent(item.parent?.id, data.parent);
|
||||
const shouldUpdateParent =
|
||||
(!isNil(item.parent) && !isNil(parent) && item.parent.id !== parent.id) ||
|
||||
(!isNil(item.parent) && !isNil(parent)) ||
|
||||
(!isNil(item.parent) && isNil(parent));
|
||||
|
||||
if (shouldUpdateParent && parent !== undefined) {
|
||||
item.parent = parent;
|
||||
await this.repository.save(item, { reload: true });
|
||||
}
|
||||
return item;
|
||||
}
|
||||
|
||||
async delete(id: string) {
|
||||
const item = await this.repository.findOneByOrFail({
|
||||
where: { id },
|
||||
relations: ['parent', 'children'],
|
||||
});
|
||||
if (!isNil(item.children) && item.children.length > 0) {
|
||||
const childrenCategories = [...item.children].map((c) => {
|
||||
c.parent = item.parent;
|
||||
return item;
|
||||
});
|
||||
await this.repository.save(childrenCategories, { reload: true });
|
||||
}
|
||||
return this.repository.remove(item);
|
||||
}
|
||||
|
||||
async getParent(current?: string, parentId?: string) {
|
||||
if (current === parentId) {
|
||||
return undefined;
|
||||
}
|
||||
let parent: CategoryEntity | undefined;
|
||||
if (parentId !== undefined) {
|
||||
if (parentId === null) {
|
||||
return null;
|
||||
}
|
||||
parent = await this.repository.findOne({ where: { id: parentId } });
|
||||
if (!parent) {
|
||||
throw new EntityNotFoundError(
|
||||
CategoryEntity,
|
||||
`Parent category with id ${parentId} not exists!`,
|
||||
);
|
||||
}
|
||||
}
|
||||
return parent;
|
||||
}
|
||||
}
|
35
src/modules/content/services/tag.service.ts
Normal file
35
src/modules/content/services/tag.service.ts
Normal file
@ -0,0 +1,35 @@
|
||||
import { omit } from 'lodash';
|
||||
|
||||
import { CreateTagDto, QueryTagDto } from '@/modules/content/dtos/tag.dto';
|
||||
import { TagRepository } from '@/modules/content/repositories/tag.repository';
|
||||
import { paginate } from '@/modules/database/utils';
|
||||
|
||||
export class TagService {
|
||||
constructor(protected repository: TagRepository) {}
|
||||
|
||||
async paginate(options: QueryTagDto) {
|
||||
const qb = this.repository.buildBaseQB();
|
||||
return paginate(qb, options);
|
||||
}
|
||||
|
||||
async detail(id: string) {
|
||||
const qb = this.repository.buildBaseQB();
|
||||
qb.where(`tag.id = :id`, { id });
|
||||
return qb.getOneOrFail();
|
||||
}
|
||||
|
||||
async create(data: CreateTagDto) {
|
||||
const item = await this.repository.save(data);
|
||||
return this.detail(item.id);
|
||||
}
|
||||
|
||||
async update(data: UpdateTagDto) {
|
||||
await this.repository.update(data.id, omit(data, ['id']));
|
||||
return this.detail(data.id);
|
||||
}
|
||||
|
||||
async delete(id: string) {
|
||||
const item = this.repository.findOneByOrFail({ id });
|
||||
return this.repository.remove(item);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user