From 46538a3052038233e6b3229837e14af30436e114 Mon Sep 17 00:00:00 2001 From: Devesh Kolte Date: Tue, 7 Jul 2026 19:08:40 +0530 Subject: [PATCH] fix(server): store null instead of empty string for person name --- server/src/database.ts | 2 +- server/src/dtos/person.dto.ts | 4 ++-- ...3430865849-ConvertPersonNameEmptyStringToNull.ts | 13 +++++++++++++ server/src/schema/tables/person.table.ts | 4 ++-- 4 files changed, 18 insertions(+), 5 deletions(-) create mode 100644 server/src/schema/migrations/1783430865849-ConvertPersonNameEmptyStringToNull.ts diff --git a/server/src/database.ts b/server/src/database.ts index 1770b9d720..8eb1d43849 100644 --- a/server/src/database.ts +++ b/server/src/database.ts @@ -246,7 +246,7 @@ export type Person = { updatedAt: Date; updateId: string; isFavorite: boolean; - name: string; + name: string | null; birthDate: Date | null; color: string | null; faceAssetId: string | null; diff --git a/server/src/dtos/person.dto.ts b/server/src/dtos/person.dto.ts index fa56ded176..e0070a5a0b 100644 --- a/server/src/dtos/person.dto.ts +++ b/server/src/dtos/person.dto.ts @@ -14,7 +14,7 @@ import z from 'zod'; const PersonCreateSchema = z .object({ - name: z.string().optional().describe('Person name'), + name: z.string().nullish().transform((val) => (val === '' ? null : val)).describe('Person name'), birthDate: z .string() .meta({ format: 'date' }) @@ -61,7 +61,7 @@ const PersonSearchSchema = z export const PersonResponseSchema = z .object({ id: z.uuidv4().describe('Person ID'), - name: z.string().describe('Person name'), + name: z.string().nullable().describe('Person name'), // TODO: use `isoDateToDate` when using `ZodSerializerDto` on the controllers. birthDate: z.string().meta({ format: 'date' }).describe('Person date of birth').nullable(), thumbnailPath: z.string().describe('Thumbnail path'), diff --git a/server/src/schema/migrations/1783430865849-ConvertPersonNameEmptyStringToNull.ts b/server/src/schema/migrations/1783430865849-ConvertPersonNameEmptyStringToNull.ts new file mode 100644 index 0000000000..6cd10b72ed --- /dev/null +++ b/server/src/schema/migrations/1783430865849-ConvertPersonNameEmptyStringToNull.ts @@ -0,0 +1,13 @@ +import { Kysely, sql } from 'kysely'; + +export async function up(db: Kysely): Promise { + await sql`ALTER TABLE "person" ALTER COLUMN "name" DROP NOT NULL;`.execute(db); + await sql`ALTER TABLE "person" ALTER COLUMN "name" SET DEFAULT NULL;`.execute(db); + await sql`UPDATE "person" SET "name" = NULL WHERE "name" = '';`.execute(db); +} + +export async function down(): Promise { + await sql`UPDATE "person" SET "name" = '' WHERE "name" IS NULL;`.execute(db); + await sql`ALTER TABLE "person" ALTER COLUMN "name" SET DEFAULT '';`.execute(db); + await sql`ALTER TABLE "person" ALTER COLUMN "name" SET NOT NULL;`.execute(db); +} diff --git a/server/src/schema/tables/person.table.ts b/server/src/schema/tables/person.table.ts index 35447acfd0..ca3629b87c 100644 --- a/server/src/schema/tables/person.table.ts +++ b/server/src/schema/tables/person.table.ts @@ -43,8 +43,8 @@ export class PersonTable { @ForeignKeyColumn(() => UserTable, { onDelete: 'CASCADE', onUpdate: 'CASCADE', nullable: false }) ownerId!: string; - @Column({ default: '' }) - name!: Generated; + @Column({ nullable: true, default: null }) + name!: string | null; @Column({ default: '' }) thumbnailPath!: Generated;