feat(server): adopt zod DTOs for the assignment body contracts

This commit is contained in:
jubnl
2026-07-26 20:34:06 +02:00
parent 164f5152be
commit 41b51849b7
7 changed files with 153 additions and 73 deletions
@@ -2,6 +2,7 @@ import {
assignmentCreateRequestSchema,
assignmentMoveRequestSchema,
assignmentParticipantsRequestSchema,
assignmentTransportRequestSchema,
} from './assignment.schema';
import { describe, it, expect } from 'vitest';
@@ -15,13 +16,24 @@ describe('assignmentCreateRequestSchema', () => {
});
describe('assignmentMoveRequestSchema', () => {
it('requires new_day_id; order_index optional', () => {
it('requires new_day_id; order_index optional/nullable', () => {
expect(assignmentMoveRequestSchema.safeParse({ new_day_id: 4 }).success).toBe(true);
expect(assignmentMoveRequestSchema.safeParse({ new_day_id: 4, order_index: 0 }).success).toBe(true);
// The client api sends `order_index: null` when no insert position is given.
expect(assignmentMoveRequestSchema.safeParse({ new_day_id: 4, order_index: null }).success).toBe(true);
expect(assignmentMoveRequestSchema.safeParse({}).success).toBe(false);
});
});
describe('assignmentTransportRequestSchema', () => {
it('accepts a mode, an explicit null, and an absent key (legacy `?? null`)', () => {
expect(assignmentTransportRequestSchema.safeParse({ transport_mode: 'cycling' }).success).toBe(true);
expect(assignmentTransportRequestSchema.safeParse({ transport_mode: null }).success).toBe(true);
expect(assignmentTransportRequestSchema.safeParse({}).success).toBe(true);
expect(assignmentTransportRequestSchema.safeParse({ transport_mode: 5 }).success).toBe(false);
});
});
describe('assignmentParticipantsRequestSchema', () => {
it('requires a numeric user_ids array', () => {
expect(assignmentParticipantsRequestSchema.safeParse({ user_ids: [1, 2] }).success).toBe(true);