apiv1-client.ts 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import urljoin from 'url-join';
  2. import axios from '~/utils/axios';
  3. const apiv1Root = '/_api';
  4. class Apiv1ErrorHandler extends Error {
  5. code;
  6. data;
  7. constructor(message = '', code = '', data = '') {
  8. super();
  9. this.message = message;
  10. this.code = code;
  11. this.data = data;
  12. }
  13. }
  14. export async function apiRequest<T>(
  15. method: string,
  16. path: string,
  17. params: unknown,
  18. ): Promise<T> {
  19. const res = await axios[method](urljoin(apiv1Root, path), params);
  20. if (res.data.ok) {
  21. return res.data;
  22. }
  23. // Return error code if code is exist
  24. if (res.data.code != null) {
  25. const error = new Apiv1ErrorHandler(
  26. res.data.error,
  27. res.data.code,
  28. res.data.data,
  29. );
  30. throw error;
  31. }
  32. throw new Error(res.data.error);
  33. }
  34. export async function apiGet<T>(
  35. path: string,
  36. params: unknown = {},
  37. ): Promise<T> {
  38. return apiRequest<T>('get', path, { params });
  39. }
  40. export async function apiPost<T>(
  41. path: string,
  42. params: unknown = {},
  43. ): Promise<T> {
  44. return apiRequest<T>('post', path, params);
  45. }
  46. export async function apiPostForm<T>(
  47. path: string,
  48. formData: FormData,
  49. ): Promise<T> {
  50. return apiRequest<T>('postForm', path, formData);
  51. }
  52. export async function apiDelete<T>(
  53. path: string,
  54. params: unknown = {},
  55. ): Promise<T> {
  56. return apiRequest<T>('delete', path, { data: params });
  57. }