fix: user profile images not working in beta timeline (#20203)

* fix user icons in album view

* revert updateUsersV1 change

* fix: UserDto merge issues

* fix: update user entity

* revert what I thought were merge issues

turns out drift cant figure out when it needs to gen a file...

* fix removed line

* handle defaults for older servers

* feat: checkpoint migrations

* fix: use parenthesis instead of brackets

* Update 1753800911775-ProfileImageCheckpointRemoval.ts

* fix: sync stream updateUsersV1
This commit is contained in:
Brandon Wees
2025-07-30 11:09:28 -05:00
committed by GitHub
parent da5deffd03
commit 097e132fba
29 changed files with 7069 additions and 282 deletions

View File

@@ -357,7 +357,7 @@ export const columns = {
],
syncAlbumUser: ['album_user.albumsId as albumId', 'album_user.usersId as userId', 'album_user.role'],
syncStack: ['stack.id', 'stack.createdAt', 'stack.updatedAt', 'stack.primaryAssetId', 'stack.ownerId'],
syncUser: ['id', 'name', 'email', 'avatarColor', 'deletedAt', 'updateId'],
syncUser: ['id', 'name', 'email', 'avatarColor', 'deletedAt', 'updateId', 'profileImagePath', 'profileChangedAt'],
stack: ['stack.id', 'stack.primaryAssetId', 'ownerId'],
syncAssetExif: [
'asset_exif.assetId',

View File

@@ -62,6 +62,8 @@ export class SyncUserV1 {
@ValidateEnum({ enum: UserAvatarColor, name: 'UserAvatarColor', nullable: true })
avatarColor!: UserAvatarColor | null;
deletedAt!: Date | null;
hasProfileImage!: boolean;
profileChangedAt!: Date;
}
@ExtraModel()
@@ -74,8 +76,6 @@ export class SyncAuthUserV1 extends SyncUserV1 {
quotaSizeInBytes!: number | null;
@ApiProperty({ type: 'integer' })
quotaUsageInBytes!: number;
hasProfileImage!: boolean;
profileChangedAt!: Date;
}
@ExtraModel()

View File

@@ -452,14 +452,14 @@ select
"avatarColor",
"deletedAt",
"updateId",
"profileImagePath",
"profileChangedAt",
"isAdmin",
"pinCode",
"oauthId",
"storageLabel",
"quotaSizeInBytes",
"quotaUsageInBytes",
"profileImagePath",
"profileChangedAt"
"quotaUsageInBytes"
from
"user"
where
@@ -896,7 +896,9 @@ select
"email",
"avatarColor",
"deletedAt",
"updateId"
"updateId",
"profileImagePath",
"profileChangedAt"
from
"user"
where

View File

@@ -375,16 +375,7 @@ class AuthUserSync extends BaseSync {
return this.db
.selectFrom('user')
.select(columns.syncUser)
.select([
'isAdmin',
'pinCode',
'oauthId',
'storageLabel',
'quotaSizeInBytes',
'quotaUsageInBytes',
'profileImagePath',
'profileChangedAt',
])
.select(['isAdmin', 'pinCode', 'oauthId', 'storageLabel', 'quotaSizeInBytes', 'quotaUsageInBytes'])
.$call(this.upsertTableFilters(ack))
.stream();
}

View File

@@ -0,0 +1,25 @@
import { Kysely, sql } from 'kysely';
export async function up(db: Kysely<any>): Promise<void> {
await sql`DELETE FROM session_sync_checkpoint
WHERE type IN (
'UserV1',
'AssetV1',
'PartnerAssetV1',
'PartnerAssetBackfillV1',
'AlbumAssetV1',
'AlbumAssetBackfillV1'
)`.execute(db);
}
export async function down(db: Kysely<any>): Promise<void> {
await sql`DELETE FROM session_sync_checkpoint
WHERE type IN (
'UserV1',
'AssetV1',
'PartnerAssetV1',
'PartnerAssetBackfillV1',
'AlbumAssetV1',
'AlbumAssetBackfillV1'
)`.execute(db);
}

View File

@@ -188,8 +188,8 @@ export class SyncService extends BaseService {
const upsertType = SyncEntityType.UserV1;
const upserts = this.syncRepository.user.getUpserts(checkpointMap[upsertType]);
for await (const { updateId, ...data } of upserts) {
send(response, { type: upsertType, ids: [updateId], data });
for await (const { updateId, profileImagePath, ...data } of upserts) {
send(response, { type: upsertType, ids: [updateId], data: { ...data, hasProfileImage: !!profileImagePath } });
}
}