FEAT-1: add typed gerbils/lookups API + useApi/useMutation hooks

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-05 23:52:39 +02:00
parent e04b69ce49
commit f162ef4fed
4 changed files with 159 additions and 1 deletions

View File

@@ -62,5 +62,7 @@ export const api = {
export const resources = {
gerbils: '/gerbils',
litters: '/litters',
breeders: '/breeders',
contacts: '/contacts',
enclosures: '/enclosures',
colorVarieties: '/color-varieties',
} as const

View File

@@ -0,0 +1,24 @@
/** Typed API functions for the Tiere (Rennmäuse) resource. */
import { api, resources } from './client'
import { toQueryString, type GridifyQuery } from './gridify'
import type { CreateGerbil, Gerbil, Paged, UpdateGerbil } from './types'
export function listGerbils(query: GridifyQuery): Promise<Paged<Gerbil>> {
return api.get<Paged<Gerbil>>(`${resources.gerbils}${toQueryString(query)}`)
}
export function getGerbil(id: string): Promise<Gerbil> {
return api.get<Gerbil>(`${resources.gerbils}/${id}`)
}
export function createGerbil(body: CreateGerbil): Promise<Gerbil> {
return api.post<Gerbil>(resources.gerbils, body)
}
export function updateGerbil(id: string, body: UpdateGerbil): Promise<Gerbil> {
return api.put<Gerbil>(`${resources.gerbils}/${id}`, body)
}
export function deleteGerbil(id: string): Promise<void> {
return api.delete(`${resources.gerbils}/${id}`)
}

View File

@@ -0,0 +1,34 @@
/**
* Lookup resources used to populate form dropdowns (Farbschlag, Becken,
* Kontakte, Würfe). These endpoints are Gridify-paged like the rest; for
* dropdowns we request a large page and read `.items`.
*/
import { api, resources } from './client'
import { toQueryString } from './gridify'
import type { ColorVariety, Contact, Enclosure, Litter, Paged } from './types'
const ALL = toQueryString({ page: 1, pageSize: 1000, orderBy: 'name' })
export async function listColorVarieties(): Promise<ColorVariety[]> {
const paged = await api.get<Paged<ColorVariety>>(
`${resources.colorVarieties}${toQueryString({ page: 1, pageSize: 1000, orderBy: 'sortOrder' })}`,
)
return paged.items
}
export async function listEnclosures(): Promise<Enclosure[]> {
const paged = await api.get<Paged<Enclosure>>(`${resources.enclosures}${ALL}`)
return paged.items
}
export async function listContacts(): Promise<Contact[]> {
const paged = await api.get<Paged<Contact>>(`${resources.contacts}${ALL}`)
return paged.items
}
export async function listLitters(): Promise<Litter[]> {
const paged = await api.get<Paged<Litter>>(
`${resources.litters}${toQueryString({ page: 1, pageSize: 1000, orderBy: 'date desc' })}`,
)
return paged.items
}