summaryrefslogtreecommitdiff
path: root/packages/backend/src/queue/processors/db
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2022-01-13 00:47:40 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2022-01-13 00:47:40 +0900
commit7e5e763584acd80b1baef6af2d20621c89fa0af9 (patch)
tree6063b24d2c6588dbb6e7411c868d2cd8e1b0ed48 /packages/backend/src/queue/processors/db
parentfeat: multiple emojis editing (diff)
downloadsharkey-7e5e763584acd80b1baef6af2d20621c89fa0af9.tar.gz
sharkey-7e5e763584acd80b1baef6af2d20621c89fa0af9.tar.bz2
sharkey-7e5e763584acd80b1baef6af2d20621c89fa0af9.zip
feat: emojis import
Diffstat (limited to 'packages/backend/src/queue/processors/db')
-rw-r--r--packages/backend/src/queue/processors/db/export-custom-emojis.ts12
-rw-r--r--packages/backend/src/queue/processors/db/import-custom-emojis.ts84
-rw-r--r--packages/backend/src/queue/processors/db/index.ts2
3 files changed, 94 insertions, 4 deletions
diff --git a/packages/backend/src/queue/processors/db/export-custom-emojis.ts b/packages/backend/src/queue/processors/db/export-custom-emojis.ts
index 3930b9d6d4..a420866dcf 100644
--- a/packages/backend/src/queue/processors/db/export-custom-emojis.ts
+++ b/packages/backend/src/queue/processors/db/export-custom-emojis.ts
@@ -52,7 +52,7 @@ export async function exportCustomEmojis(job: Bull.Job, done: () => void): Promi
});
};
- await writeMeta(`{"metaVersion":1,"emojis":[`);
+ await writeMeta(`{"metaVersion":2,"emojis":[`);
const customEmojis = await Emojis.find({
where: {
@@ -64,9 +64,9 @@ export async function exportCustomEmojis(job: Bull.Job, done: () => void): Promi
});
for (const emoji of customEmojis) {
- const exportId = ulid().toLowerCase();
const ext = mime.extension(emoji.type);
- const emojiPath = path + '/' + exportId + (ext ? '.' + ext : '');
+ const fileName = emoji.name + (ext ? '.' + ext : '');
+ const emojiPath = path + '/' + fileName;
fs.writeFileSync(emojiPath, '', 'binary');
let downloaded = false;
@@ -77,8 +77,12 @@ export async function exportCustomEmojis(job: Bull.Job, done: () => void): Promi
logger.error(e);
}
+ if (!downloaded) {
+ fs.unlinkSync(emojiPath);
+ }
+
const content = JSON.stringify({
- id: exportId,
+ fileName: fileName,
downloaded: downloaded,
emoji: emoji,
});
diff --git a/packages/backend/src/queue/processors/db/import-custom-emojis.ts b/packages/backend/src/queue/processors/db/import-custom-emojis.ts
new file mode 100644
index 0000000000..eb386bbb42
--- /dev/null
+++ b/packages/backend/src/queue/processors/db/import-custom-emojis.ts
@@ -0,0 +1,84 @@
+import * as Bull from 'bull';
+import * as tmp from 'tmp';
+import * as fs from 'fs';
+const unzipper = require('unzipper');
+import { getConnection } from 'typeorm';
+
+import { queueLogger } from '../../logger';
+import { downloadUrl } from '@/misc/download-url';
+import { DriveFiles, Emojis } from '@/models/index';
+import { DbUserImportJobData } from '@/queue/types';
+import addFile from '@/services/drive/add-file';
+import { genId } from '@/misc/gen-id';
+
+const logger = queueLogger.createSubLogger('import-custom-emojis');
+
+// TODO: 名前衝突時の動作を選べるようにする
+export async function importCustomEmojis(job: Bull.Job<DbUserImportJobData>, done: any): Promise<void> {
+ logger.info(`Importing custom emojis ...`);
+
+ const file = await DriveFiles.findOne({
+ id: job.data.fileId,
+ });
+ if (file == null) {
+ done();
+ return;
+ }
+
+ // Create temp dir
+ const [path, cleanup] = await new Promise<[string, () => void]>((res, rej) => {
+ tmp.dir((e, path, cleanup) => {
+ if (e) return rej(e);
+ res([path, cleanup]);
+ });
+ });
+
+ logger.info(`Temp dir is ${path}`);
+
+ const destPath = path + '/emojis.zip';
+
+ try {
+ fs.writeFileSync(destPath, '', 'binary');
+ await downloadUrl(file.url, destPath);
+ } catch (e) { // TODO: 何度か再試行
+ logger.error(e);
+ throw e;
+ }
+
+ const outputPath = path + '/emojis';
+ const unzipStream = fs.createReadStream(destPath);
+ const extractor = unzipper.Extract({ path: outputPath });
+ extractor.on('close', async () => {
+ const metaRaw = fs.readFileSync(outputPath + '/meta.json', 'utf-8');
+ const meta = JSON.parse(metaRaw);
+
+ for (const record of meta.emojis) {
+ if (!record.downloaded) continue;
+ const emojiInfo = record.emoji;
+ const emojiPath = outputPath + '/' + record.fileName;
+ await Emojis.delete({
+ name: emojiInfo.name,
+ });
+ const driveFile = await addFile(null, emojiPath, record.fileName, null, null, true);
+ const emoji = await Emojis.insert({
+ id: genId(),
+ updatedAt: new Date(),
+ name: emojiInfo.name,
+ category: emojiInfo.category,
+ host: null,
+ aliases: emojiInfo.aliases,
+ url: driveFile.url,
+ type: driveFile.type,
+ }).then(x => Emojis.findOneOrFail(x.identifiers[0]));
+ }
+
+ await getConnection().queryResultCache!.remove(['meta_emojis']);
+
+ cleanup();
+
+ logger.succ('Imported');
+ done();
+ });
+ unzipStream.pipe(extractor);
+ logger.succ(`Unzipping to ${outputPath}`);
+}
diff --git a/packages/backend/src/queue/processors/db/index.ts b/packages/backend/src/queue/processors/db/index.ts
index 1542f401ef..5fffa378f5 100644
--- a/packages/backend/src/queue/processors/db/index.ts
+++ b/packages/backend/src/queue/processors/db/index.ts
@@ -12,6 +12,7 @@ import { importUserLists } from './import-user-lists';
import { deleteAccount } from './delete-account';
import { importMuting } from './import-muting';
import { importBlocking } from './import-blocking';
+import { importCustomEmojis } from './import-custom-emojis';
const jobs = {
deleteDriveFiles,
@@ -25,6 +26,7 @@ const jobs = {
importMuting,
importBlocking,
importUserLists,
+ importCustomEmojis,
deleteAccount,
} as Record<string, Bull.ProcessCallbackFunction<DbJobData> | Bull.ProcessPromiseFunction<DbJobData>>;