From 4eaa02d25f83eff38cecd6db1724c8626dc3af2e Mon Sep 17 00:00:00 2001 From: syuilo Date: Sun, 22 Oct 2023 13:02:24 +0900 Subject: enhance: improve avatar decoration --- packages/backend/src/core/entities/UserEntityService.ts | 8 +++++--- packages/backend/src/models/User.ts | 12 ++++++++---- packages/backend/src/models/json-schema/user.ts | 8 ++++++++ packages/backend/src/server/api/endpoints/i/update.ts | 14 ++++++++++++-- 4 files changed, 33 insertions(+), 9 deletions(-) (limited to 'packages/backend/src') diff --git a/packages/backend/src/core/entities/UserEntityService.ts b/packages/backend/src/core/entities/UserEntityService.ts index 66facce4c2..09a7e579f0 100644 --- a/packages/backend/src/core/entities/UserEntityService.ts +++ b/packages/backend/src/core/entities/UserEntityService.ts @@ -338,9 +338,11 @@ export class UserEntityService implements OnModuleInit { host: user.host, avatarUrl: user.avatarUrl ?? this.getIdenticonUrl(user), avatarBlurhash: user.avatarBlurhash, - avatarDecorations: user.avatarDecorations.length > 0 ? this.avatarDecorationService.getAll().then(decorations => decorations.filter(decoration => user.avatarDecorations.includes(decoration.id)).map(decoration => ({ - id: decoration.id, - url: decoration.url, + avatarDecorations: user.avatarDecorations.length > 0 ? this.avatarDecorationService.getAll().then(decorations => user.avatarDecorations.filter(ud => decorations.some(d => d.id === ud.id)).map(ud => ({ + id: ud.id, + angle: ud.angle || undefined, + flipH: ud.flipH || undefined, + url: decorations.find(d => d.id === ud.id)!.url, }))) : [], isBot: user.isBot, isCat: user.isCat, diff --git a/packages/backend/src/models/User.ts b/packages/backend/src/models/User.ts index c98426a7b6..c3762fcd3e 100644 --- a/packages/backend/src/models/User.ts +++ b/packages/backend/src/models/User.ts @@ -138,10 +138,14 @@ export class MiUser { }) public bannerBlurhash: string | null; - @Column('varchar', { - length: 512, array: true, default: '{}', - }) - public avatarDecorations: string[]; + @Column('jsonb', { + default: [], + }) + public avatarDecorations: { + id: string; + angle: number; + flipH: boolean; + }[]; @Index() @Column('varchar', { diff --git a/packages/backend/src/models/json-schema/user.ts b/packages/backend/src/models/json-schema/user.ts index bf283fbeb2..75f3286eff 100644 --- a/packages/backend/src/models/json-schema/user.ts +++ b/packages/backend/src/models/json-schema/user.ts @@ -54,6 +54,14 @@ export const packedUserLiteSchema = { format: 'url', nullable: false, optional: false, }, + angle: { + type: 'number', + nullable: false, optional: true, + }, + flipH: { + type: 'boolean', + nullable: false, optional: true, + }, }, }, }, diff --git a/packages/backend/src/server/api/endpoints/i/update.ts b/packages/backend/src/server/api/endpoints/i/update.ts index 79ead57a66..b03381a3f3 100644 --- a/packages/backend/src/server/api/endpoints/i/update.ts +++ b/packages/backend/src/server/api/endpoints/i/update.ts @@ -133,7 +133,13 @@ export const paramDef = { lang: { type: 'string', enum: [null, ...Object.keys(langmap)] as string[], nullable: true }, avatarId: { type: 'string', format: 'misskey:id', nullable: true }, avatarDecorations: { type: 'array', maxItems: 1, items: { - type: 'string', + type: 'object', + properties: { + id: { type: 'string', format: 'misskey:id' }, + angle: { type: 'number', nullable: true, maximum: 0.5, minimum: -0.5 }, + flipH: { type: 'boolean', nullable: true }, + }, + required: ['id'], } }, bannerId: { type: 'string', format: 'misskey:id', nullable: true }, fields: { @@ -309,7 +315,11 @@ export default class extends Endpoint { // eslint- .filter(d => d.roleIdsThatCanBeUsedThisDecoration.filter(roleId => allRoles.some(r => r.id === roleId)).length === 0 || myRoles.some(r => d.roleIdsThatCanBeUsedThisDecoration.includes(r.id))) .map(d => d.id); - updates.avatarDecorations = ps.avatarDecorations.filter(id => decorationIds.includes(id)); + updates.avatarDecorations = ps.avatarDecorations.filter(d => decorationIds.includes(d.id)).map(d => ({ + id: d.id, + angle: d.angle ?? 0, + flipH: d.flipH ?? false, + })); } if (ps.pinnedPageId) { -- cgit v1.2.3-freya