add content

This commit is contained in:
liuyi 2025-05-19 14:14:07 +08:00
parent 6386c3f1b3
commit c2f263ae82
3 changed files with 60 additions and 0 deletions

View File

@ -0,0 +1,11 @@
import { Repository } from 'typeorm';
import { PostEntity } from '@/modules/content/entities/post.entity';
import { CustomRepository } from '@/modules/database/decorators/repository.decorator';
@CustomRepository(PostEntity)
export class PostRepository extends Repository<PostEntity> {
buildBaseQB() {
return this.createQueryBuilder('post');
}
}

View File

@ -0,0 +1,23 @@
import sanitizeHtml from 'sanitize-html';
import { deepMerge } from '@/modules/core/helpers';
export class SanitizeService {
protected config: sanitizeHtml.IOptions = {};
constructor() {
this.config = {
allowedTags: sanitizeHtml.defaults.allowedTags.concat(['img', 'code']),
allowedAttributes: {
...sanitizeHtml.defaults.allowedAttributes,
'*': ['class', 'style', 'height', 'width'],
},
parser: {
lowerCaseTags: true,
},
};
}
sanitize(body: string, options: sanitizeHtml.IOptions = {}) {
return sanitizeHtml(body, deepMerge(this.config, options ?? {}, 'replace'));
}
}

View File

@ -0,0 +1,26 @@
import { DataSource, EventSubscriber } from 'typeorm';
import { PostBodyType } from '@/modules/content/constants';
import { PostEntity } from '@/modules/content/entities/post.entity';
import { PostRepository } from '@/modules/content/repositories/post.repository';
import { SanitizeService } from '@/modules/content/services/SanitizeService';
@EventSubscriber()
export class PostSubscriber {
constructor(
protected dataSource: DataSource,
protected sanitizeService: SanitizeService,
protected postRepository: PostRepository,
) {
dataSource.subscribers.push(this);
}
listenTo() {
return PostEntity;
}
async afterLoad(entity: PostEntity) {
if (entity.type === PostBodyType.HTML) {
entity.body = this.sanitizeService.sanitize(entity.body);
}
}
}