File size: 2,482 Bytes
cd6f98e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import type { z } from "zod";

import { env } from "../env/client.mjs";

function getHeaders(accessToken: string | undefined, organizationId: string | undefined) {
  return {
    "Content-Type": "application/json",
    Authorization: `Bearer ${accessToken || ""}`,
    ...(organizationId ? { "X-Organization-Id": organizationId } : {}),
  };
}

export const get = async <T extends z.ZodTypeAny>(
  path: string,
  schema: T,
  accessToken?: string,
  organizationId?: string
): Promise<z.infer<T>> => {
  const response = await fetch(`${env.NEXT_PUBLIC_BACKEND_URL}${path}`, {
    method: "GET",
    headers: getHeaders(accessToken, organizationId),
  });

  if (!response.ok) {
    throw new Error("Request failed");
  }

  // eslint-disable-next-line @typescript-eslint/no-unsafe-return
  return schema.parse(await response.json());
};

export const post = async <T extends z.ZodTypeAny>(
  path: string,
  schema: T,
  body: unknown,
  accessToken?: string,
  organizationId?: string
): Promise<z.infer<T>> => {
  const response = await fetch(`${env.NEXT_PUBLIC_BACKEND_URL}${path}`, {
    body: JSON.stringify(body),
    method: "POST",
    headers: getHeaders(accessToken, organizationId),
  });

  if (!response.ok) {
    throw new Error("Request failed");
  }

  // eslint-disable-next-line @typescript-eslint/no-unsafe-return
  return schema.parse(await response.json());
};

export const put = async <T extends z.ZodTypeAny>(
  path: string,
  schema: T,
  body: unknown,
  accessToken?: string,
  organizationId?: string
): Promise<z.infer<T>> => {
  const response = await fetch(`${env.NEXT_PUBLIC_BACKEND_URL}${path}`, {
    body: JSON.stringify(body),
    method: "PUT",
    headers: getHeaders(accessToken, organizationId),
  });

  if (!response.ok) {
    throw new Error(response.statusText);
  }

  // eslint-disable-next-line @typescript-eslint/no-unsafe-return
  return schema.parse(await response.json());
};

export const delete_ = async <T extends z.ZodTypeAny>(
  path: string,
  schema: T,
  body: unknown,
  accessToken?: string,
  organizationId?: string
): Promise<z.infer<T>> => {
  const response = await fetch(`${env.NEXT_PUBLIC_BACKEND_URL}${path}`, {
    body: JSON.stringify(body),
    method: "DELETE",
    headers: getHeaders(accessToken, organizationId),
  });

  if (!response.ok) {
    throw new Error(response.statusText);
  }

  // eslint-disable-next-line @typescript-eslint/no-unsafe-return
  return schema.parse(await response.json());
};