summaryrefslogtreecommitdiff
path: root/packages/backend/src/models
diff options
context:
space:
mode:
authortamaina <tamaina@hotmail.co.jp>2022-02-27 13:59:10 +0900
committerGitHub <noreply@github.com>2022-02-27 13:59:10 +0900
commite314be5b59dc5b518f114c82a67a8546decb5a80 (patch)
tree269c4befe67f7e6c845ae975695ab4ceb0ba39ff /packages/backend/src/models
parentrefactor: Use ESM (#8358) (diff)
downloadmisskey-e314be5b59dc5b518f114c82a67a8546decb5a80.tar.gz
misskey-e314be5b59dc5b518f114c82a67a8546decb5a80.tar.bz2
misskey-e314be5b59dc5b518f114c82a67a8546decb5a80.zip
Fix avatar/banner proxy (#8346)
* Fix avatar/banner proxy Co-authored-by: mei23 <m@m544.net> * use getAvatarUrl * fix * join avatar and banner to improve performance * join * Update hybrid-timeline.ts * fix Co-authored-by: mei23 <m@m544.net> Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
Diffstat (limited to 'packages/backend/src/models')
-rw-r--r--packages/backend/src/models/entities/meta.ts5
-rw-r--r--packages/backend/src/models/entities/user.ts20
-rw-r--r--packages/backend/src/models/repositories/drive-file.ts8
-rw-r--r--packages/backend/src/models/repositories/note-reaction.ts4
-rw-r--r--packages/backend/src/models/repositories/user.ts32
5 files changed, 30 insertions, 39 deletions
diff --git a/packages/backend/src/models/entities/meta.ts b/packages/backend/src/models/entities/meta.ts
index 4328c8fbf8..0b1e9c85c3 100644
--- a/packages/backend/src/models/entities/meta.ts
+++ b/packages/backend/src/models/entities/meta.ts
@@ -137,11 +137,6 @@ export class Meta {
})
public cacheRemoteFiles: boolean;
- @Column('boolean', {
- default: false,
- })
- public proxyRemoteFiles: boolean;
-
@Column({
...id(),
nullable: true,
diff --git a/packages/backend/src/models/entities/user.ts b/packages/backend/src/models/entities/user.ts
index 3eecde1f17..9d5db10eb3 100644
--- a/packages/backend/src/models/entities/user.ts
+++ b/packages/backend/src/models/entities/user.ts
@@ -106,26 +106,6 @@ export class User {
})
public tags: string[];
- @Column('varchar', {
- length: 512, nullable: true,
- })
- public avatarUrl: string | null;
-
- @Column('varchar', {
- length: 512, nullable: true,
- })
- public bannerUrl: string | null;
-
- @Column('varchar', {
- length: 128, nullable: true,
- })
- public avatarBlurhash: string | null;
-
- @Column('varchar', {
- length: 128, nullable: true,
- })
- public bannerBlurhash: string | null;
-
@Column('boolean', {
default: false,
comment: 'Whether the User is suspended.',
diff --git a/packages/backend/src/models/repositories/drive-file.ts b/packages/backend/src/models/repositories/drive-file.ts
index 27afe435e6..6452632db7 100644
--- a/packages/backend/src/models/repositories/drive-file.ts
+++ b/packages/backend/src/models/repositories/drive-file.ts
@@ -41,7 +41,7 @@ export class DriveFileRepository extends Repository<DriveFile> {
return file.properties;
}
- public getPublicUrl(file: DriveFile, thumbnail = false, meta?: Meta): string | null {
+ public getPublicUrl(file: DriveFile, thumbnail = false): string | null {
// リモートかつメディアプロキシ
if (file.uri != null && file.userHost != null && config.mediaProxy != null) {
return appendQuery(config.mediaProxy, query({
@@ -51,7 +51,7 @@ export class DriveFileRepository extends Repository<DriveFile> {
}
// リモートかつ期限切れはローカルプロキシを試みる
- if (file.uri != null && file.isLink && meta && meta.proxyRemoteFiles) {
+ if (file.uri != null && file.isLink && config.proxyRemoteFiles) {
const key = thumbnail ? file.thumbnailAccessKey : file.webpublicAccessKey;
if (key && !key.match('/')) { // 古いものはここにオブジェクトストレージキーが入ってるので除外
@@ -136,8 +136,8 @@ export class DriveFileRepository extends Repository<DriveFile> {
isSensitive: file.isSensitive,
blurhash: file.blurhash,
properties: opts.self ? file.properties : this.getPublicProperties(file),
- url: opts.self ? file.url : this.getPublicUrl(file, false, meta),
- thumbnailUrl: this.getPublicUrl(file, true, meta),
+ url: opts.self ? file.url : this.getPublicUrl(file, false),
+ thumbnailUrl: this.getPublicUrl(file, true),
comment: file.comment,
folderId: file.folderId,
folder: opts.detail && file.folderId ? DriveFolders.pack(file.folderId, {
diff --git a/packages/backend/src/models/repositories/note-reaction.ts b/packages/backend/src/models/repositories/note-reaction.ts
index e83e753ec8..a212b0d3e9 100644
--- a/packages/backend/src/models/repositories/note-reaction.ts
+++ b/packages/backend/src/models/repositories/note-reaction.ts
@@ -23,10 +23,10 @@ export class NoteReactionRepository extends Repository<NoteReaction> {
return {
id: reaction.id,
createdAt: reaction.createdAt.toISOString(),
- user: await Users.pack(reaction.userId, me),
+ user: await Users.pack(reaction.user ?? reaction.userId, me),
type: convertLegacyReaction(reaction.reaction),
...(opts.withNote ? {
- note: await Notes.pack(reaction.noteId, me),
+ note: await Notes.pack(reaction.note ?? reaction.noteId, me),
} : {}),
};
}
diff --git a/packages/backend/src/models/repositories/user.ts b/packages/backend/src/models/repositories/user.ts
index 478b1ac287..a909ab3ba6 100644
--- a/packages/backend/src/models/repositories/user.ts
+++ b/packages/backend/src/models/repositories/user.ts
@@ -1,7 +1,7 @@
import { EntityRepository, Repository, In, Not } from 'typeorm';
import Ajv from 'ajv';
import { User, ILocalUser, IRemoteUser } from '@/models/entities/user.js';
-import { Notes, NoteUnreads, FollowRequests, Notifications, MessagingMessages, UserNotePinings, Followings, Blockings, Mutings, UserProfiles, UserSecurityKeys, UserGroupJoinings, Pages, Announcements, AnnouncementReads, Antennas, AntennaNotes, ChannelFollowings, Instances } from '../index.js';
+import { Notes, NoteUnreads, FollowRequests, Notifications, MessagingMessages, UserNotePinings, Followings, Blockings, Mutings, UserProfiles, UserSecurityKeys, UserGroupJoinings, Pages, Announcements, AnnouncementReads, Antennas, AntennaNotes, ChannelFollowings, Instances, DriveFiles } from '../index.js';
import config from '@/config/index.js';
import { Packed } from '@/misc/schema.js';
import { awaitAll, Promiseable } from '@/prelude/await-all.js';
@@ -182,13 +182,18 @@ export class UserRepository extends Repository<User> {
}
public getAvatarUrl(user: User): string {
- if (user.avatarUrl) {
- return user.avatarUrl;
+ // TODO: avatarIdがあるがavatarがない(JOINされてない)場合のハンドリング
+ if (user.avatar) {
+ return DriveFiles.getPublicUrl(user.avatar, true) || this.getIdenticonUrl(user.id);
} else {
- return `${config.url}/identicon/${user.id}`;
+ return this.getIdenticonUrl(user.id);
}
}
+ public getIdenticonUrl(userId: User['id']): string {
+ return `${config.url}/identicon/${userId}`;
+ }
+
public async pack<ExpectsMe extends boolean | null = null, D extends boolean = false>(
src: User['id'] | User,
me?: { id: User['id'] } | null | undefined,
@@ -202,7 +207,18 @@ export class UserRepository extends Repository<User> {
includeSecrets: false,
}, options);
- const user = typeof src === 'object' ? src : await this.findOneOrFail(src);
+ let user: User;
+
+ if (typeof src === 'object') {
+ user = src;
+ if (src.avatar === undefined && src.avatarId) src.avatar = await DriveFiles.findOne(src.avatarId) ?? null;
+ if (src.banner === undefined && src.bannerId) src.banner = await DriveFiles.findOne(src.bannerId) ?? null;
+ } else {
+ user = await this.findOneOrFail(src, {
+ relations: ['avatar', 'banner'],
+ });
+ }
+
const meId = me ? me.id : null;
const isMe = meId === user.id;
@@ -232,7 +248,7 @@ export class UserRepository extends Repository<User> {
username: user.username,
host: user.host,
avatarUrl: this.getAvatarUrl(user),
- avatarBlurhash: user.avatarBlurhash,
+ avatarBlurhash: user.avatar?.blurhash || null,
avatarColor: null, // 後方互換性のため
isAdmin: user.isAdmin || falsy,
isModerator: user.isModerator || falsy,
@@ -256,8 +272,8 @@ export class UserRepository extends Repository<User> {
createdAt: user.createdAt.toISOString(),
updatedAt: user.updatedAt ? user.updatedAt.toISOString() : null,
lastFetchedAt: user.lastFetchedAt ? user.lastFetchedAt.toISOString() : null,
- bannerUrl: user.bannerUrl,
- bannerBlurhash: user.bannerBlurhash,
+ bannerUrl: user.banner ? DriveFiles.getPublicUrl(user.banner, false) : null,
+ bannerBlurhash: user.banner?.blurhash || null,
bannerColor: null, // 後方互換性のため
isLocked: user.isLocked,
isSilenced: user.isSilenced || falsy,