feat(shared): make collab note optional fields nullable in the request contracts

This commit is contained in:
jubnl
2026-07-27 00:27:06 +02:00
parent f69731b72b
commit 470e4dc92c
2 changed files with 42 additions and 8 deletions
+30
View File
@@ -1,5 +1,6 @@
import {
collabNoteCreateRequestSchema,
collabNoteUpdateRequestSchema,
collabPollCreateRequestSchema,
collabPollVoteRequestSchema,
collabMessageCreateRequestSchema,
@@ -14,6 +15,35 @@ describe('collabNoteCreateRequestSchema', () => {
expect(collabNoteCreateRequestSchema.safeParse({ title: '' }).success).toBe(false);
expect(collabNoteCreateRequestSchema.safeParse({}).success).toBe(false);
});
it('accepts explicit null for the optional fields (desktop null-clearing)', () => {
expect(
collabNoteCreateRequestSchema.safeParse({
title: 'Idea',
content: 'Body',
category: null,
color: '#6366f1',
website: null,
}).success,
).toBe(true);
});
});
describe('collabNoteUpdateRequestSchema', () => {
it('accepts explicit null for the optional fields (desktop null-clearing)', () => {
expect(
collabNoteUpdateRequestSchema.safeParse({
title: 'Idea',
content: null,
category: null,
color: null,
website: null,
pinned: 1,
}).success,
).toBe(true);
expect(collabNoteUpdateRequestSchema.safeParse({ pinned: true }).success).toBe(true);
expect(collabNoteUpdateRequestSchema.safeParse({ title: null }).success).toBe(false);
});
});
describe('collabPollCreateRequestSchema', () => {
+12 -8
View File
@@ -13,20 +13,24 @@ import { z } from 'zod';
export const collabNoteCreateRequestSchema = z.object({
title: z.string().min(1),
content: z.string().optional(),
category: z.string().optional(),
color: z.string().optional(),
website: z.string().optional(),
// The desktop notes form clears optional fields by sending explicit null
// (the service coerces falsy to its defaults), so they are all nullable.
content: z.string().nullable().optional(),
category: z.string().nullable().optional(),
color: z.string().nullable().optional(),
website: z.string().nullable().optional(),
});
export type CollabNoteCreateRequest = z.infer<typeof collabNoteCreateRequestSchema>;
export const collabNoteUpdateRequestSchema = z.object({
title: z.string().optional(),
content: z.string().optional(),
category: z.string().optional(),
color: z.string().optional(),
// Same null-clearing protocol as create (the desktop form resends the whole
// note object, with cleared fields as explicit null).
content: z.string().nullable().optional(),
category: z.string().nullable().optional(),
color: z.string().nullable().optional(),
pinned: z.union([z.boolean(), z.number()]).optional(),
website: z.string().optional(),
website: z.string().nullable().optional(),
});
export type CollabNoteUpdateRequest = z.infer<typeof collabNoteUpdateRequestSchema>;