TTime/frontend/src/API/API.ts

220 lines
5.7 KiB
TypeScript
Raw Normal View History

2024-03-17 15:31:15 +01:00
import {
NewWeeklyReport,
NewUser,
User,
Project,
NewProject,
} from "../Types/goTypes";
2024-03-13 17:06:26 +01:00
2024-03-16 17:42:28 +01:00
// This type of pattern should be hard to misuse
interface APIResponse<T> {
success: boolean;
message?: string;
data?: T;
}
// Note that all protected routes also require a token
2024-03-13 17:06:26 +01:00
// Defines all the methods that an instance of the API must implement
interface API {
/** Register a new user */
2024-03-16 17:42:28 +01:00
registerUser(user: NewUser): Promise<APIResponse<User>>;
2024-03-13 17:06:26 +01:00
/** Remove a user */
2024-03-16 17:42:28 +01:00
removeUser(username: string, token: string): Promise<APIResponse<User>>;
2024-03-13 17:52:56 +01:00
/** Create a project */
2024-03-16 17:42:28 +01:00
createProject(
project: NewProject,
token: string,
): Promise<APIResponse<Project>>;
/** Submit a weekly report */
submitWeeklyReport(
project: NewWeeklyReport,
token: string,
): Promise<APIResponse<Project>>;
2024-03-13 20:56:47 +01:00
/** Renew the token */
2024-03-16 17:42:28 +01:00
renewToken(token: string): Promise<APIResponse<string>>;
/** Gets all the projects of a user*/
getUserProjects(
username: string,
token: string,
): Promise<APIResponse<Project[]>>;
2024-03-17 14:43:09 +01:00
/** Login */
login(NewUser: NewUser): Promise<APIResponse<JSON>>;
2024-03-13 17:06:26 +01:00
}
// Export an instance of the API
export const api: API = {
2024-03-16 17:42:28 +01:00
async registerUser(user: NewUser): Promise<APIResponse<User>> {
try {
const response = await fetch("/api/register", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(user),
});
if (!response.ok) {
return { success: false, message: "Failed to register user" };
} else {
const data = (await response.json()) as User;
return { success: true, data };
}
} catch (e) {
return { success: false, message: "Failed to register user" };
}
2024-03-13 17:06:26 +01:00
},
2024-03-16 17:42:28 +01:00
async removeUser(
username: string,
token: string,
2024-03-16 17:42:28 +01:00
): Promise<APIResponse<User>> {
try {
const response = await fetch("/api/userdelete", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + token,
},
body: JSON.stringify(username),
});
if (!response.ok) {
return { success: false, message: "Failed to remove user" };
} else {
const data = (await response.json()) as User;
return { success: true, data };
}
} catch (e) {
return { success: false, message: "Failed to remove user" };
}
2024-03-13 17:06:26 +01:00
},
2024-03-13 17:52:56 +01:00
2024-03-16 17:42:28 +01:00
async createProject(
project: NewProject,
token: string,
2024-03-16 17:42:28 +01:00
): Promise<APIResponse<Project>> {
try {
const response = await fetch("/api/project", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + token,
},
body: JSON.stringify(project),
});
if (!response.ok) {
return { success: false, message: "Failed to create project" };
} else {
const data = (await response.json()) as Project;
return { success: true, data };
}
} catch (e) {
return { success: false, message: "Failed to create project" };
}
2024-03-13 17:52:56 +01:00
},
2024-03-13 20:56:47 +01:00
2024-03-16 17:42:28 +01:00
async renewToken(token: string): Promise<APIResponse<string>> {
try {
const response = await fetch("/api/loginrenew", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + token,
},
});
if (!response.ok) {
return { success: false, message: "Failed to renew token" };
} else {
const data = (await response.json()) as string;
return { success: true, data };
}
} catch (e) {
return { success: false, message: "Failed to renew token" };
}
2024-03-13 20:56:47 +01:00
},
async getUserProjects(token: string): Promise<APIResponse<Project[]>> {
try {
const response = await fetch("/api/getUserProjects", {
method: "GET",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + token,
},
});
if (!response.ok) {
return Promise.resolve({
success: false,
message: "Failed to get user projects",
});
} else {
const data = (await response.json()) as Project[];
return Promise.resolve({ success: true, data });
}
} catch (e) {
return Promise.resolve({
success: false,
message: "Failed to get user projects",
});
}
},
2024-03-17 14:43:09 +01:00
async submitWeeklyReport(
project: NewWeeklyReport,
token: string,
): Promise<APIResponse<Project>> {
try {
return fetch("/api/submitWeeklyReport", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + token,
},
body: JSON.stringify(project),
})
.then((response) => {
if (!response.ok) {
return {
success: false,
message: "Failed to submit weekly report",
};
} else {
return response.json();
}
})
.then((data: Project) => {
return { success: true, data };
});
} catch (e) {
return Promise.resolve({
success: false,
message: "Failed to submit weekly report",
});
}
},
2024-03-17 14:43:09 +01:00
async login(NewUser: NewUser): Promise<APIResponse<JSON>> {
try {
const response = await fetch("/api/login", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(NewUser),
});
if (!response.ok) {
return { success: false, message: "Failed to login" };
} else {
const data = (await response.json()) as JSON;
return { success: true, data };
2024-03-17 14:43:09 +01:00
}
} catch (e) {
return Promise.resolve({ success: false, message: "Failed to login" });
}
},
2024-03-13 17:06:26 +01:00
};