144 lines
3.4 KiB
TypeScript
144 lines
3.4 KiB
TypeScript
// base-api.service.ts
|
|
import type { TableState } from "~/components/core/data-table";
|
|
import { removeUndefinedValues } from "~/features/remove-falsy-values";
|
|
import { mapTableStateToPaginationQueryDSL } from "~/features/table";
|
|
import { handleError, handleSuccess } from ".";
|
|
import axios from "../lib/axios";
|
|
import type { DeepPartial } from "react-hook-form";
|
|
|
|
export class BaseApiService<T extends { id: number }> {
|
|
constructor(protected readonly resourceUrl: string) {}
|
|
|
|
async index(values?: DeepPartial<TableState<T>> | undefined) {
|
|
const params = values
|
|
? mapTableStateToPaginationQueryDSL(values as TableState<T>)
|
|
: {};
|
|
|
|
const response = await axios({
|
|
url: this.resourceUrl,
|
|
params: params,
|
|
// withCredentials: true,
|
|
method: "GET",
|
|
});
|
|
|
|
return response.data;
|
|
}
|
|
|
|
async get(id: T["id"]) {
|
|
const response = await axios({
|
|
url: this.resourceUrl + "/" + id,
|
|
// withCredentials: true,
|
|
method: "GET",
|
|
});
|
|
|
|
return response.data;
|
|
}
|
|
|
|
async create(values: Partial<Omit<T, "id" | "created_at" | "updated_at">>) {
|
|
try {
|
|
const newData = removeUndefinedValues(values);
|
|
const { data } = await axios({
|
|
url: this.resourceUrl,
|
|
// withCredentials: true,
|
|
method: "POST",
|
|
data: newData,
|
|
});
|
|
|
|
handleSuccess(data, this.resourceUrl);
|
|
return data;
|
|
} catch (error) {
|
|
handleError(error);
|
|
}
|
|
}
|
|
|
|
async update(id: T["id"], values: Partial<T>) {
|
|
try {
|
|
const cleaned = removeUndefinedValues(values);
|
|
const { data } = await axios({
|
|
url: `${this.resourceUrl}/${id}`,
|
|
// withCredentials: true,
|
|
method: "PUT",
|
|
data: cleaned,
|
|
});
|
|
|
|
handleSuccess(data, this.resourceUrl);
|
|
|
|
return data;
|
|
} catch (error) {
|
|
handleError(error);
|
|
}
|
|
}
|
|
|
|
async delete(entity: T) {
|
|
try {
|
|
const { data } = await axios({
|
|
url: `${this.resourceUrl}/${entity.id}`,
|
|
// withCredentials: true,
|
|
method: "DELETE",
|
|
});
|
|
|
|
handleSuccess(data, this.resourceUrl);
|
|
return data;
|
|
} catch (error) {
|
|
handleError(error);
|
|
}
|
|
}
|
|
|
|
async bulkDelete(entities: T[]) {
|
|
const ids = entities.map((e) => e.id);
|
|
try {
|
|
const { data } = await axios({
|
|
url: `${this.resourceUrl}/bulk-delete`,
|
|
// withCredentials: true,
|
|
method: "DELETE",
|
|
data: { ids },
|
|
});
|
|
|
|
handleSuccess(data, this.resourceUrl);
|
|
|
|
return data;
|
|
} catch (error) {
|
|
handleError(error);
|
|
}
|
|
}
|
|
|
|
async bulkUpdate(entities: T[]) {
|
|
try {
|
|
const { data } = await axios({
|
|
url: `${this.resourceUrl}/bulk-update`,
|
|
// withCredentials: true,
|
|
method: "PUT",
|
|
data: entities,
|
|
});
|
|
|
|
handleSuccess(data, this.resourceUrl);
|
|
|
|
return data;
|
|
} catch (error) {
|
|
handleError(error);
|
|
}
|
|
}
|
|
|
|
// Optional: override this in subclass if needed
|
|
async customAction(
|
|
id: number,
|
|
endpoint: string,
|
|
payload?: Record<string, any>,
|
|
method?: string
|
|
) {
|
|
try {
|
|
const { data } = await axios({
|
|
url: `${this.resourceUrl}/${endpoint}/${id}`,
|
|
method: method || "POST",
|
|
data: removeUndefinedValues(payload || {}),
|
|
// withCredentials: true,
|
|
});
|
|
|
|
handleSuccess(data, this.resourceUrl);
|
|
return data;
|
|
} catch (error) {
|
|
handleError(error);
|
|
}
|
|
}
|
|
}
|