[FE-26] 웹 lib/portal 타입·zod 스키마 확장 (program·운영시간·휴무·슬롯상태)

작업 내용 (설계 의도)

변경 사항

웹 운영 포털이 BE facility 계약을 미러링하도록 web/lib/portal/types.tsweb/lib/portal/schemas.ts에 타입·zod 스키마를 추가한다(응답 파싱은 zod로 — 레포 관례). 단일 파일 병목이라 이 티켓이 두 파일의 신규 정의를 소유한다.

  • 타입: OperatingHours(dayOfWeek/open/close/breaks[]/slotDurationMinutes/capacity), Holiday(date), Program(id/facilityId/name/description/price/capacity/durationMinutes), SlotStatus(‘OPEN’|‘CLOSED’), SlotResponsestatus·programId 필드.
  • zod: OperatingHoursSchema·HolidaySchema·ProgramSchema·(기존 SlotResponseSchema 확장). 등록 폼 입력 검증 스키마(ProgramFormSchema: price≥0, capacity≥1, durationMinutes>0; OperatingHoursFormSchema: open<close).

근거: 20260707-모집-시설상품-소모임예약연동-tdd.md REST 계약, 20260707-...-design-fe-web.md “API 연동 표”.

의존

  • 없음 (wave 1)

다이어그램

클래스 의존

flowchart LR
    Types["lib/portal/types.ts + schemas.ts"] --> OHLib["lib/portal/operatingHours.ts (FE-28)"]
    Types --> PgLib["lib/portal/programs.ts (FE-29)"]
    Types --> SlotLib["lib/portal/slots.ts close/open (FE-30)"]

테스트 케이스

  • ProgramFormSchema가 price=-1을 거부하고 인라인 에러 메시지를 낸다
  • ProgramFormSchema가 capacity=0, durationMinutes=0을 각각 거부한다
  • OperatingHoursFormSchema가 open>=close(오픈>마감)를 거부한다
  • SlotStatus가 ‘OPEN’|‘CLOSED’ 리터럴로 좁혀진다
  • 유효한 program 페이로드를 ProgramSchema.parse가 통과시킨다