forked from FoundKeyGang/FoundKey
トランザクションを使用してアンケートレコードの挿入に失敗した場合に投稿レコードの挿入もなかったことにするように
This commit is contained in:
parent
2b6389b4dc
commit
4198246351
3 changed files with 40 additions and 16 deletions
|
@ -214,6 +214,14 @@ export class Note {
|
||||||
})
|
})
|
||||||
public renoteUserHost: string | null;
|
public renoteUserHost: string | null;
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
|
constructor(data: Partial<Note>) {
|
||||||
|
if (data == null) return;
|
||||||
|
|
||||||
|
for (const [k, v] of Object.entries(data)) {
|
||||||
|
(this as any)[k] = v;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export type IMentionedRemoteUsers = {
|
export type IMentionedRemoteUsers = {
|
||||||
|
|
|
@ -53,6 +53,14 @@ export class Poll {
|
||||||
})
|
})
|
||||||
public userHost: string | null;
|
public userHost: string | null;
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
|
constructor(data: Partial<Poll>) {
|
||||||
|
if (data == null) return;
|
||||||
|
|
||||||
|
for (const [k, v] of Object.entries(data)) {
|
||||||
|
(this as any)[k] = v;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export type IPoll = {
|
export type IPoll = {
|
||||||
|
|
|
@ -17,10 +17,10 @@ import extractMentions from '../../misc/extract-mentions';
|
||||||
import extractEmojis from '../../misc/extract-emojis';
|
import extractEmojis from '../../misc/extract-emojis';
|
||||||
import extractHashtags from '../../misc/extract-hashtags';
|
import extractHashtags from '../../misc/extract-hashtags';
|
||||||
import { Note } from '../../models/entities/note';
|
import { Note } from '../../models/entities/note';
|
||||||
import { Mutings, Users, NoteWatchings, Followings, Notes, Instances, Polls, UserProfiles } from '../../models';
|
import { Mutings, Users, NoteWatchings, Followings, Notes, Instances, UserProfiles } from '../../models';
|
||||||
import { DriveFile } from '../../models/entities/drive-file';
|
import { DriveFile } from '../../models/entities/drive-file';
|
||||||
import { App } from '../../models/entities/app';
|
import { App } from '../../models/entities/app';
|
||||||
import { Not } from 'typeorm';
|
import { Not, getConnection } from 'typeorm';
|
||||||
import { User, ILocalUser, IRemoteUser } from '../../models/entities/user';
|
import { User, ILocalUser, IRemoteUser } from '../../models/entities/user';
|
||||||
import { genId } from '../../misc/gen-id';
|
import { genId } from '../../misc/gen-id';
|
||||||
import { notesChart, perUserNotesChart, activeUsersChart, instanceChart } from '../chart';
|
import { notesChart, perUserNotesChart, activeUsersChart, instanceChart } from '../chart';
|
||||||
|
@ -349,7 +349,7 @@ async function publish(user: User, note: Note, reply: Note, renote: Note, noteAc
|
||||||
}
|
}
|
||||||
|
|
||||||
async function insertNote(user: User, data: Option, tags: string[], emojis: string[], mentionedUsers: User[]) {
|
async function insertNote(user: User, data: Option, tags: string[], emojis: string[], mentionedUsers: User[]) {
|
||||||
const insert: Partial<Note> = {
|
const insert = new Note({
|
||||||
id: genId(data.createdAt),
|
id: genId(data.createdAt),
|
||||||
createdAt: data.createdAt,
|
createdAt: data.createdAt,
|
||||||
fileIds: data.files ? data.files.map(file => file.id) : [],
|
fileIds: data.files ? data.files.map(file => file.id) : [],
|
||||||
|
@ -381,7 +381,7 @@ async function insertNote(user: User, data: Option, tags: string[], emojis: stri
|
||||||
renoteUserId: data.renote ? data.renote.userId : null,
|
renoteUserId: data.renote ? data.renote.userId : null,
|
||||||
renoteUserHost: data.renote ? data.renote.userHost : null,
|
renoteUserHost: data.renote ? data.renote.userHost : null,
|
||||||
userHost: user.host,
|
userHost: user.host,
|
||||||
};
|
});
|
||||||
|
|
||||||
if (data.uri != null) insert.uri = data.uri;
|
if (data.uri != null) insert.uri = data.uri;
|
||||||
|
|
||||||
|
@ -397,19 +397,27 @@ async function insertNote(user: User, data: Option, tags: string[], emojis: stri
|
||||||
|
|
||||||
// 投稿を作成
|
// 投稿を作成
|
||||||
try {
|
try {
|
||||||
const note = await Notes.save(insert);
|
let note: Note;
|
||||||
|
if (insert.hasPoll) {
|
||||||
|
// Start transaction
|
||||||
|
await getConnection().transaction(async transactionalEntityManager => {
|
||||||
|
note = await transactionalEntityManager.save(insert);
|
||||||
|
|
||||||
if (note.hasPoll) {
|
const poll = new Poll({
|
||||||
await Polls.save({
|
noteId: note.id,
|
||||||
noteId: note.id,
|
choices: data.poll.choices,
|
||||||
choices: data.poll.choices,
|
expiresAt: data.poll.expiresAt,
|
||||||
expiresAt: data.poll.expiresAt,
|
multiple: data.poll.multiple,
|
||||||
multiple: data.poll.multiple,
|
votes: new Array(data.poll.choices.length).fill(0),
|
||||||
votes: new Array(data.poll.choices.length).fill(0),
|
noteVisibility: note.visibility,
|
||||||
noteVisibility: note.visibility,
|
userId: user.id,
|
||||||
userId: user.id,
|
userHost: user.host
|
||||||
userHost: user.host
|
});
|
||||||
} as Poll);
|
|
||||||
|
await transactionalEntityManager.save(poll);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
note = await Notes.save(insert);
|
||||||
}
|
}
|
||||||
|
|
||||||
return note;
|
return note;
|
||||||
|
|
Loading…
Reference in a new issue