diff --git a/README.md b/README.md index 59b2779179e3..596fdbd6b79f 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,8 @@ - 二要素認証のバックアップコードを保存するように促すダイアログを表示するように - カスタムフォント機能 - 絵文字を登録したユーザーがアカウントを消去しても継続して絵文字の使用ができるように +- アバターデコレーションを登録したユーザーがアカウントを消去しても継続して使用ができるように +- アバターデコレーションをmisskeyUI上から登録できるように ## Special Thanks - [Misskey](https://github.com/misskey-dev/misskey) diff --git a/packages/backend/src/server/api/endpoints/admin/avatar-decorations/create.ts b/packages/backend/src/server/api/endpoints/admin/avatar-decorations/create.ts index fd213098188d..5e52d8e2b52a 100644 --- a/packages/backend/src/server/api/endpoints/admin/avatar-decorations/create.ts +++ b/packages/backend/src/server/api/endpoints/admin/avatar-decorations/create.ts @@ -6,6 +6,7 @@ import { Injectable } from '@nestjs/common'; import { Endpoint } from '@/server/api/endpoint-base.js'; import { AvatarDecorationService } from '@/core/AvatarDecorationService.js'; +import { DriveService } from '@/core/DriveService.js'; export const meta = { tags: ['admin'], @@ -32,12 +33,19 @@ export const paramDef = { export default class extends Endpoint { // eslint-disable-line import/no-default-export constructor( private avatarDecorationService: AvatarDecorationService, + private driveService: DriveService, ) { super(meta, paramDef, async (ps, me) => { + // システムユーザーとして再アップロード + const sysFileData = await this.driveService.uploadFromUrl({ + url: ps.url, + user: null, + force: true, + }); await this.avatarDecorationService.create({ name: ps.name, description: ps.description, - url: ps.url, + url: sysFileData.url, roleIdsThatCanBeUsedThisDecoration: ps.roleIdsThatCanBeUsedThisDecoration, }, me); }); diff --git a/packages/backend/src/server/api/endpoints/admin/avatar-decorations/update.ts b/packages/backend/src/server/api/endpoints/admin/avatar-decorations/update.ts index 34b3b5a11f50..9f12901d948a 100644 --- a/packages/backend/src/server/api/endpoints/admin/avatar-decorations/update.ts +++ b/packages/backend/src/server/api/endpoints/admin/avatar-decorations/update.ts @@ -7,6 +7,7 @@ import { Inject, Injectable } from '@nestjs/common'; import { Endpoint } from '@/server/api/endpoint-base.js'; import { DI } from '@/di-symbols.js'; import { AvatarDecorationService } from '@/core/AvatarDecorationService.js'; +import { DriveService } from '@/core/DriveService.js'; import { ApiError } from '../../../error.js'; export const meta = { @@ -38,12 +39,24 @@ export const paramDef = { export default class extends Endpoint { // eslint-disable-line import/no-default-export constructor( private avatarDecorationService: AvatarDecorationService, + private driveService: DriveService, ) { super(meta, paramDef, async (ps, me) => { + let fileUrl = ps.url; + // URLに変更があるか + if (typeof ps.url !== 'undefined' || typeof ps.url === 'string' ) { + // システムユーザーとして再アップロード + const sysFileData = await this.driveService.uploadFromUrl({ + url: ps.url, + user: null, + force: true, + }); + fileUrl = sysFileData.url; + } await this.avatarDecorationService.update(ps.id, { name: ps.name, description: ps.description, - url: ps.url, + url: fileUrl, roleIdsThatCanBeUsedThisDecoration: ps.roleIdsThatCanBeUsedThisDecoration, }, me); }); diff --git a/packages/frontend/src/pages/avatar-decorations.vue b/packages/frontend/src/pages/avatar-decorations.vue index ad9ec3c4eece..fd87793d022b 100644 --- a/packages/frontend/src/pages/avatar-decorations.vue +++ b/packages/frontend/src/pages/avatar-decorations.vue @@ -13,6 +13,7 @@ SPDX-License-Identifier: AGPL-3.0-only
+ {{ i18n.ts.selectFile }} @@ -44,9 +45,17 @@ import { misskeyApi } from '@/scripts/misskey-api.js'; import { i18n } from '@/i18n.js'; import { definePageMetadata } from '@/scripts/page-metadata.js'; import MkFolder from '@/components/MkFolder.vue'; +import { selectFile } from '@/scripts/select-file.js'; const avatarDecorations = ref([]); +// ファイル選択 +async function selectImage(decoration, ev) { + let file = await selectFile(ev.currentTarget ?? ev.target, null); + decoration.name = file.name.replace(/\.(.+)$/, ''); + decoration.url = file.url; +} + function add() { avatarDecorations.value.unshift({ _id: Math.random().toString(36),