Files
notebrook-notes/frontend/src/api.ts
2024-09-03 14:50:33 +02:00

103 lines
3.5 KiB
TypeScript

import { IChannel } from "./model/channel";
import { IChannelList } from "./model/channel-list";
import { IMessage } from "./model/message";
import { IUnsentMessage } from "./model/unsent-message";
import { state } from "./state";
export const API = {
token: "",
path: "http://localhost:3000",
async request(method: string, path: string, body?: any) {
if (!API.token) {
throw new Error("API token was not set.");
}
return fetch(`${API.path}/${path}`, {
method,
headers: {
"Content-Type": "application/json",
"Authorization": API.token
},
body: JSON.stringify(body),
});
},
async checkToken() {
const response = await API.request("GET", "check-token");
if (response.status !== 200) {
throw new Error("Invalid token in request");
}
},
async getChannels() {
const response = await API.request("GET", "channels");
const json = await response.json();
return json.channels as IChannel[];
},
async getChannel(id: string) {
const response = await API.request("GET", `channels/${id}`);
const json = await response.json();
return json.channel as IChannel;
},
async createChannel(name: string) {
const response = await API.request("POST", "channels", { name });
const json = await response.json();
return json as IChannel;
},
async deleteChannel(id: string) {
await API.request("DELETE", `channels/${id}`);
},
async getMessages(channelId: string) {
const response = await API.request("GET", `channels/${channelId}/messages`);
const json = await response.json();
return json.messages as IMessage[];
},
async createMessage(channelId: string, content: string) {
const response = await API.request("POST", `channels/${channelId}/messages`, { content });
const json = await response.json();
return json as IMessage;
},
async deleteMessage(channelId: string, messageId: string) {
await API.request("DELETE", `channels/${channelId}/messages/${messageId}`);
},
async uploadFile(channelId: string, messageId: string, file: File | Blob) {
const formData = new FormData();
formData.append("file", file);
const response = await fetch(`${API.path}/channels/${channelId}/messages/${messageId}/files`, {
method: "POST",
headers: {
"Authorization": API.token
},
body: formData,
});
const json = await response.json();
return json;
},
async mergeChannels(channelId: string, targetChannelId: string) {
await API.request("PUT", `channels/${channelId}/merge`, { targetChannelId });
},
async search(query: string, channelId?: string) {
const queryPath = channelId ? `search?query=${encodeURIComponent(query)}&channelId=${channelId}` : `search?query=${encodeURIComponent(query)}`;
const response = await API.request("GET", queryPath);
const json = await response.json();
return json.results as IMessage[];
},
async getFiles(channelId: string, messageId: string) {
const response = await API.request("GET", `channels/${channelId}/messages/${messageId}/files`);
const json = await response.json();
return json.files as string[];
}
}