feat(server): visibility column (#17939)

* feat: private view

* pr feedback

* sql generation

* feat: visibility column

* fix: set visibility value as the same as the still part after unlinked live photos

* fix: test

* pr feedback
This commit is contained in:
Alex
2025-05-06 12:12:48 -05:00
committed by GitHub
parent 016d7a6ceb
commit d33ce13561
90 changed files with 1137 additions and 867 deletions

View File

@@ -1,3 +1,4 @@
import { AssetVisibility } from 'src/enum';
import { asset_face_source_type, assets_status_enum } from 'src/schema/enums';
import {
assets_delete_audit,
@@ -45,7 +46,12 @@ import { UserAuditTable } from 'src/schema/tables/user-audit.table';
import { UserMetadataTable } from 'src/schema/tables/user-metadata.table';
import { UserTable } from 'src/schema/tables/user.table';
import { VersionHistoryTable } from 'src/schema/tables/version-history.table';
import { ConfigurationParameter, Database, Extensions } from 'src/sql-tools';
import { ConfigurationParameter, Database, Extensions, registerEnum } from 'src/sql-tools';
export const asset_visibility_enum = registerEnum({
name: 'asset_visibility_enum',
values: Object.values(AssetVisibility),
});
@Extensions(['uuid-ossp', 'unaccent', 'cube', 'earthdistance', 'pg_trgm', 'plpgsql'])
@ConfigurationParameter({ name: 'search_path', value: () => '"$user", public, vectors', scope: 'database' })

View File

@@ -0,0 +1,37 @@
import { Kysely, sql } from 'kysely';
export async function up(db: Kysely<any>): Promise<void> {
await sql`CREATE TYPE "asset_visibility_enum" AS ENUM ('archive','timeline','hidden');`.execute(db);
await sql`ALTER TABLE "assets"
ADD "visibility" asset_visibility_enum NOT NULL DEFAULT 'timeline';`.execute(db);
await sql`
UPDATE "assets"
SET "visibility" = CASE
WHEN "isArchived" THEN 'archive'::asset_visibility_enum
WHEN "isVisible" THEN 'timeline'::asset_visibility_enum
ELSE 'hidden'::asset_visibility_enum
END;
`.execute(db);
await sql`ALTER TABLE "assets" DROP COLUMN "isVisible";`.execute(db);
await sql`ALTER TABLE "assets" DROP COLUMN "isArchived";`.execute(db);
}
export async function down(db: Kysely<any>): Promise<void> {
await sql`ALTER TABLE "assets" ADD COLUMN "isArchived" BOOLEAN NOT NULL DEFAULT FALSE;`.execute(db);
await sql`ALTER TABLE "assets" ADD COLUMN "isVisible" BOOLEAN NOT NULL DEFAULT TRUE;`.execute(db);
await sql`
UPDATE "assets"
SET
"isArchived" = ("visibility" = 'archive'::asset_visibility_enum),
"isVisible" = CASE
WHEN "visibility" = 'timeline'::asset_visibility_enum THEN TRUE
WHEN "visibility" = 'archive'::asset_visibility_enum THEN TRUE
ELSE FALSE
END;
`.execute(db);
await sql`ALTER TABLE "assets" DROP COLUMN "visibility";`.execute(db);
await sql`DROP TYPE "asset_visibility_enum";`.execute(db);
}

View File

@@ -1,5 +1,6 @@
import { UpdatedAtTrigger, UpdateIdColumn } from 'src/decorators';
import { AssetStatus, AssetType } from 'src/enum';
import { AssetStatus, AssetType, AssetVisibility } from 'src/enum';
import { asset_visibility_enum } from 'src/schema';
import { assets_status_enum } from 'src/schema/enums';
import { assets_delete_audit } from 'src/schema/functions';
import { LibraryTable } from 'src/schema/tables/library.table';
@@ -95,9 +96,6 @@ export class AssetTable {
@Column({ type: 'bytea', index: true })
checksum!: Buffer; // sha1 checksum
@Column({ type: 'boolean', default: true })
isVisible!: boolean;
@ForeignKeyColumn(() => AssetTable, { nullable: true, onUpdate: 'CASCADE', onDelete: 'SET NULL' })
livePhotoVideoId!: string | null;
@@ -107,9 +105,6 @@ export class AssetTable {
@CreateDateColumn()
createdAt!: Date;
@Column({ type: 'boolean', default: false })
isArchived!: boolean;
@Column({ index: true })
originalFileName!: string;
@@ -145,4 +140,7 @@ export class AssetTable {
@UpdateIdColumn({ indexName: 'IDX_assets_update_id' })
updateId?: string;
@Column({ enum: asset_visibility_enum, default: AssetVisibility.TIMELINE })
visibility!: AssetVisibility;
}