Using transactions where it needed

This commit is contained in:
2024-02-13 23:10:43 +03:00
parent 9097e6cc4f
commit e003a87ba2
2 changed files with 54 additions and 51 deletions

View File

@@ -1,70 +1,66 @@
import { HttpException, HttpStatus, Injectable, Logger } from '@nestjs/common'; import { HttpException, HttpStatus, Injectable, Logger } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Admin } from 'libs/database/admin.entity'; import { Admin } from 'libs/database/admin.entity';
import { Image } from 'libs/database/image.entity'; import { Image } from 'libs/database/image.entity';
import { Post } from 'libs/database/post.entity'; import { Post } from 'libs/database/post.entity';
import { Repository } from 'typeorm'; import { DataSource, EntityManager } from 'typeorm';
import { IAddImage } from './image.dto'; import { IAddImage } from './image.dto';
@Injectable() @Injectable()
export class ImageService { export class ImageService {
private readonly logger: Logger = new Logger(ImageService.name); private readonly logger: Logger = new Logger(ImageService.name);
constructor( constructor(private dataSource: DataSource) {}
@InjectRepository(Image) private imageRepository: Repository<Image>,
@InjectRepository(Post) private postRepository: Repository<Post>,
@InjectRepository(Admin) private adminRepository: Repository<Admin>,
) {}
async add(data: IAddImage) { async add(data: IAddImage) {
try { try {
this.logger.log(`[image.add] data: ${JSON.stringify(data)}`);
let created_new = false; let created_new = false;
if (data.media_group_id) { await this.dataSource.transaction(async (manager: EntityManager) => {
let post = await this.postRepository.findOne({ where: { media_group_id: data.media_group_id } }); this.logger.log(`[image.add] data: ${JSON.stringify(data)}`);
if (post) { if (data.media_group_id) {
await this.imageRepository.save({ let post = await manager.findOne(Post, { where: { media_group_id: data.media_group_id } });
post: post, if (post) {
file_id: data.file_id, await manager.save(Image, {
has_spoiler: data.has_spoiler, post: post,
message_id: data.message_id, file_id: data.file_id,
}); has_spoiler: data.has_spoiler,
if (data.post_text) { message_id: data.message_id,
post.text = data.post_text; });
post.message_entities = data.message_entities; if (data.post_text) {
post = await this.postRepository.save(post); post.text = data.post_text;
post.message_entities = data.message_entities;
post = await manager.save(Post, post);
}
} else {
const user = await manager.findOne(Admin, { where: { user: { id: data.from_user_id } }, relations: { user: true } });
post = await manager.save(Post, {
media_group_id: data.media_group_id,
text: data.post_text,
message_entities: data.message_entities,
timestamp: new Date(),
from_user: user,
});
created_new = true;
await manager.save(Image, {
post: post,
file_id: data.file_id,
has_spoiler: data.has_spoiler,
message_id: data.message_id,
});
} }
} else { } else {
const user = await this.adminRepository.findOne({ where: { user: { id: data.from_user_id } }, relations: { user: true } }); const user = await manager.findOne(Admin, { where: { user: { id: data.from_user_id } }, relations: { user: true } });
post = await this.postRepository.save({ const post = await manager.save(Post, {
media_group_id: data.media_group_id,
text: data.post_text, text: data.post_text,
message_entities: data.message_entities, message_entities: data.message_entities,
timestamp: new Date(), timestamp: new Date(),
from_user: user, from_user: user,
}); });
created_new = true; await manager.save(Image, {
await this.imageRepository.save({
post: post, post: post,
file_id: data.file_id, file_id: data.file_id,
has_spoiler: data.has_spoiler, has_spoiler: data.has_spoiler,
message_id: data.message_id, message_id: data.message_id,
}); });
this.logger.log('Created post');
} }
} else { });
const user = await this.adminRepository.findOne({ where: { user: { id: data.from_user_id } }, relations: { user: true } });
const post = await this.postRepository.save({
text: data.post_text,
message_entities: data.message_entities,
timestamp: new Date(),
from_user: user,
});
await this.imageRepository.save({
post: post,
file_id: data.file_id,
has_spoiler: data.has_spoiler,
message_id: data.message_id,
});
}
return { status: 'ok', created: created_new }; return { status: 'ok', created: created_new };
} catch (error) { } catch (error) {
this.logger.debug(`[image.add] error: ${JSON.stringify(error)}`); this.logger.debug(`[image.add] error: ${JSON.stringify(error)}`);

View File

@@ -1,9 +1,9 @@
import { HttpException, HttpStatus, Injectable, Logger } from '@nestjs/common'; import { HttpException, HttpStatus, Inject, Injectable, Logger } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm'; import { InjectRepository } from '@nestjs/typeorm';
import { Admin } from 'libs/database/admin.entity'; import { Admin } from 'libs/database/admin.entity';
import { Post } from 'libs/database/post.entity'; import { Post } from 'libs/database/post.entity';
import { EGetAll } from 'libs/enums/getAll.enum'; import { EGetAll } from 'libs/enums/getAll.enum';
import { Repository } from 'typeorm'; import { DataSource, EntityManager, Repository } from 'typeorm';
import { ICreatePost, IEditPost } from './post.dto'; import { ICreatePost, IEditPost } from './post.dto';
@Injectable() @Injectable()
@@ -12,18 +12,22 @@ export class PostService {
constructor( constructor(
@InjectRepository(Post) private postRepository: Repository<Post>, @InjectRepository(Post) private postRepository: Repository<Post>,
@InjectRepository(Admin) private adminRepository: Repository<Admin>, @InjectRepository(Admin) private adminRepository: Repository<Admin>,
@Inject(DataSource) private dataSource: DataSource,
) {} ) {}
async newPost(data: ICreatePost) { async newPost(data: ICreatePost) {
try { try {
this.logger.log(`[post.newPost] data: ${JSON.stringify(data)}`); this.logger.log(`[post.newPost] data: ${JSON.stringify(data)}`);
let result: Post = null;
const user = await this.adminRepository.findOne({ where: { user: { id: data.from_user_id } }, relations: { user: true } }); const user = await this.adminRepository.findOne({ where: { user: { id: data.from_user_id } }, relations: { user: true } });
const result = await this.postRepository.save({ await this.dataSource.transaction(async (manager: EntityManager) => {
text: data.text, result = await manager.save(Post, {
media_group_id: data.media_group_id, text: data.text,
from_user: user, media_group_id: data.media_group_id,
timestamp: new Date(), from_user: user,
message_entities: data.message_entities, timestamp: new Date(),
message_entities: data.message_entities,
});
}); });
this.logger.log(`Created new post: ${result.uuid}`); this.logger.log(`Created new post: ${result.uuid}`);
return result; return result;
@@ -113,7 +117,10 @@ export class PostService {
async getByMediaGroup(mediaGroupId: string) { async getByMediaGroup(mediaGroupId: string) {
try { try {
this.logger.log(`[post.getByMediaGroup] data: ${mediaGroupId}`); this.logger.log(`[post.getByMediaGroup] data: ${mediaGroupId}`);
const post = await this.postRepository.findOne({ where: { media_group_id: mediaGroupId } }); let post: Post = null;
await this.dataSource.transaction(async (manager: EntityManager) => {
post = await manager.findOne(Post, { where: { media_group_id: mediaGroupId } });
});
if (!post) throw new Error("Can't find post"); if (!post) throw new Error("Can't find post");
return post; return post;
} catch (error) { } catch (error) {