import { BaseAPI, route } from "../base"; import { parseDate } from "../base/base-api"; import type { ItemAttachmentUpdate, ItemCreate, ItemOut, ItemPatch, ItemPath, ItemSummary, ItemUpdate, MaintenanceEntry, MaintenanceEntryCreate, MaintenanceEntryWithDetails, } from "../types/data-contracts"; import type { AttachmentTypes, ItemSummaryPaginationResult } from "../types/non-generated"; import type { MaintenanceFilters } from "./maintenance.ts"; import type { Requests } from "~~/lib/requests"; export type ItemsQuery = { orderBy?: string; includeArchived?: boolean; page?: number; pageSize?: number; locations?: string[]; labels?: string[]; negateLabels?: boolean; onlyWithoutPhoto?: boolean; onlyWithPhoto?: boolean; parentIds?: string[]; q?: string; fields?: string[]; }; export class AttachmentsAPI extends BaseAPI { add(id: string, file: File | Blob, filename: string, type: AttachmentTypes | null = null, primary?: boolean) { const formData = new FormData(); formData.append("file", file); if (type) { formData.append("type", type); } formData.append("name", filename); if (primary !== undefined) { formData.append("primary", primary.toString()); } return this.http.post({ url: route(`/items/${id}/attachments`), data: formData, }); } delete(id: string, attachmentId: string) { return this.http.delete({ url: route(`/items/${id}/attachments/${attachmentId}`) }); } update(id: string, attachmentId: string, data: ItemAttachmentUpdate) { return this.http.put({ url: route(`/items/${id}/attachments/${attachmentId}`), body: data, }); } } export class FieldsAPI extends BaseAPI { getAll() { return this.http.get({ url: route("/items/fields") }); } getAllValues(field: string) { return this.http.get({ url: route(`/items/fields/values`, { field }) }); } } export class ItemMaintenanceAPI extends BaseAPI { getLog(itemId: string, filters: MaintenanceFilters = {}) { return this.http.get({ url: route(`/items/${itemId}/maintenance`, { status: filters.status?.toString() }), }); } create(itemId: string, data: MaintenanceEntryCreate) { return this.http.post({ url: route(`/items/${itemId}/maintenance`), body: data, }); } } export class ItemsApi extends BaseAPI { attachments: AttachmentsAPI; maintenance: ItemMaintenanceAPI; fields: FieldsAPI; constructor(http: Requests, token: string) { super(http, token); this.fields = new FieldsAPI(http); this.attachments = new AttachmentsAPI(http); this.maintenance = new ItemMaintenanceAPI(http); } fullpath(id: string) { return this.http.get({ url: route(`/items/${id}/path`) }); } getAll(q: ItemsQuery = {}) { return this.http.get>({ url: route("/items", q) }); } create(item: ItemCreate) { return this.http.post({ url: route("/items"), body: item }); } async get(id: string) { const payload = await this.http.get({ url: route(`/items/${id}`) }); if (!payload.data) { return payload; } // Parse Date Types payload.data = parseDate(payload.data, ["purchaseTime", "soldTime", "warrantyExpires"]); return payload; } delete(id: string) { return this.http.delete({ url: route(`/items/${id}`) }); } async update(id: string, item: ItemUpdate) { const payload = await this.http.put({ url: route(`/items/${id}`), body: this.dropFields(item), }); if (!payload.data) { return payload; } payload.data = parseDate(payload.data, ["purchaseTime", "soldTime", "warrantyExpires"]); return payload; } async patch(id: string, item: ItemPatch) { const resp = await this.http.patch({ url: route(`/items/${id}`), body: this.dropFields(item), }); if (!resp.data) { return resp; } resp.data = parseDate(resp.data, ["purchaseTime", "soldTime", "warrantyExpires"]); return resp; } duplicate( id: string, options: { copyMaintenance?: boolean; copyAttachments?: boolean; copyCustomFields?: boolean; copyPrefix?: string; } = {} ) { return this.http.post({ url: route(`/items/${id}/duplicate`), body: { copyMaintenance: options.copyMaintenance, copyAttachments: options.copyAttachments, copyCustomFields: options.copyCustomFields, copyPrefix: options.copyPrefix, }, }); } import(file: File | Blob) { const formData = new FormData(); formData.append("csv", file); return this.http.post({ url: route("/items/import"), data: formData, }); } exportURL() { return route("/items/export"); } }