55 lines
1.8 KiB
TypeScript
55 lines
1.8 KiB
TypeScript
import type { TimeEntry, TimeEntryWrite } from './dto/time-entry'
|
|
import type { HydraCollection } from '~/utils/api'
|
|
import { extractHydraMembers } from '~/utils/api'
|
|
|
|
export function useTimeEntryService() {
|
|
const api = useApi()
|
|
|
|
async function getByDateRange(params: {
|
|
after: string
|
|
before: string
|
|
user?: number
|
|
types?: number[]
|
|
}): Promise<TimeEntry[]> {
|
|
const query: Record<string, unknown> = {
|
|
'startedAt[after]': params.after,
|
|
'startedAt[before]': params.before,
|
|
}
|
|
if (params.user) {
|
|
query.user = `/api/users/${params.user}`
|
|
}
|
|
const data = await api.get<HydraCollection<TimeEntry>>('/time_entries', query)
|
|
return extractHydraMembers(data)
|
|
}
|
|
|
|
async function getActive(): Promise<TimeEntry | null> {
|
|
try {
|
|
const data = await api.get<HydraCollection<TimeEntry>>('/time_entries/active', {}, { toast: false })
|
|
const members = extractHydraMembers(data)
|
|
return members[0] ?? null
|
|
} catch {
|
|
return null
|
|
}
|
|
}
|
|
|
|
async function create(payload: TimeEntryWrite): Promise<TimeEntry> {
|
|
return api.post<TimeEntry>('/time_entries', payload as Record<string, unknown>, {
|
|
toastSuccessKey: 'timeEntries.created',
|
|
})
|
|
}
|
|
|
|
async function update(id: number, payload: Partial<TimeEntryWrite>): Promise<TimeEntry> {
|
|
return api.patch<TimeEntry>(`/time_entries/${id}`, payload as Record<string, unknown>, {
|
|
toastSuccessKey: 'timeEntries.updated',
|
|
})
|
|
}
|
|
|
|
async function remove(id: number): Promise<void> {
|
|
await api.delete(`/time_entries/${id}`, {}, {
|
|
toastSuccessKey: 'timeEntries.deleted',
|
|
})
|
|
}
|
|
|
|
return { getByDateRange, getActive, create, update, remove }
|
|
}
|