TTime/frontend/src/API/API.ts

585 lines
16 KiB
TypeScript
Raw Normal View History

2024-03-17 15:31:15 +01:00
import {
NewWeeklyReport,
NewUser,
User,
Project,
NewProject,
2024-03-20 18:35:02 +01:00
UserProjectMember,
2024-03-20 14:00:00 +01:00
WeeklyReport,
StrNameChange,
2024-03-21 03:36:57 +01:00
NewProjMember,
2024-03-17 15:31:15 +01:00
} from "../Types/goTypes";
2024-03-13 17:06:26 +01:00
/**
* Response object returned by API methods.
*/
2024-03-17 19:18:03 +01:00
export interface APIResponse<T> {
/** Indicates whether the API call was successful */
2024-03-16 17:42:28 +01:00
success: boolean;
/** Optional message providing additional information or error description */
2024-03-16 17:42:28 +01:00
message?: string;
/** Optional data returned by the API method */
2024-03-16 17:42:28 +01:00
data?: T;
}
/**
* Interface defining methods that an instance of the API must implement.
*/
2024-03-13 17:06:26 +01:00
interface API {
/**
* Register a new user
* @param {NewUser} user The user object to be registered
* @returns {Promise<APIResponse<User>>} A promise containing the API response with the user data.
*/
2024-03-16 17:42:28 +01:00
registerUser(user: NewUser): Promise<APIResponse<User>>;
/**
* Removes a user.
* @param {string} username The username of the user to be removed.
* @param {string} token The authentication token.
* @returns {Promise<APIResponse<User>>} A promise containing the API response with the removed user data.
*/
2024-03-16 17:42:28 +01:00
removeUser(username: string, token: string): Promise<APIResponse<User>>;
2024-03-28 12:06:59 +01:00
/**
* Check if user is project manager.
* @param {string} username The username of the user.
* @param {string} projectName The name of the project.
* @param {string} token The authentication token.
* @returns {Promise<APIResponse<boolean>>} A promise containing the API response indicating if the user is a project manager.
*/
checkIfProjectManager(
projectName: string,
token: string,
): Promise<APIResponse<boolean>>;
/** Logs in a user with the provided credentials.
* @param {NewUser} NewUser The user object containing username and password.
* @returns {Promise<APIResponse<string>>} A promise resolving to an API response with a token.
*/
2024-03-17 22:20:34 +01:00
login(NewUser: NewUser): Promise<APIResponse<string>>;
/**
* Renew the token
* @param {string} token The current authentication token.
* @returns {Promise<APIResponse<string>>} A promise resolving to an API response with a renewed token.
*/
2024-03-17 22:20:34 +01:00
renewToken(token: string): Promise<APIResponse<string>>;
2024-03-19 19:45:56 +01:00
/** Promote user to admin */
/** Creates a new project.
* @param {NewProject} project The project object containing name and description.
* @param {string} token The authentication token.
* @returns {Promise<APIResponse<Project>>} A promise resolving to an API response with the created project.
*/
2024-03-16 17:42:28 +01:00
createProject(
project: NewProject,
token: string,
): Promise<APIResponse<Project>>;
/** Submits a weekly report
* @param {NewWeeklyReport} weeklyReport The weekly report object.
* @param {string} token The authentication token.
* @returns {Promise<APIResponse<NewWeeklyReport>>} A promise resolving to an API response with the submitted report.
*/
submitWeeklyReport(
weeklyReport: NewWeeklyReport,
token: string,
2024-03-21 18:05:41 +01:00
): Promise<APIResponse<string>>;
/** Gets a weekly report for a specific user, project and week
* @param {string} projectName The name of the project.
* @param {string} week The week number.
* @param {string} token The authentication token.
* @returns {Promise<APIResponse<WeeklyReport>>} A promise resolving to an API response with the retrieved report.
*/
2024-03-17 22:20:34 +01:00
getWeeklyReport(
projectName: string,
2024-03-17 22:27:21 +01:00
week: string,
token: string,
2024-03-20 14:00:00 +01:00
): Promise<APIResponse<WeeklyReport>>;
/**
* Returns all the weekly reports for a user in a particular project
* The username is derived from the token
* @param {string} projectName The name of the project
* @param {string} token The token of the user
* @returns {APIResponse<WeeklyReport[]>} A list of weekly reports
*/
getWeeklyReportsForUser(
2024-03-19 19:45:56 +01:00
projectName: string,
token: string,
2024-03-20 14:00:00 +01:00
): Promise<APIResponse<WeeklyReport[]>>;
/** Gets all the projects of a user
* @param {string} token - The authentication token.
* @returns {Promise<APIResponse<Project[]>>} A promise containing the API response with the user's projects.
*/
2024-03-19 00:27:35 +01:00
getUserProjects(token: string): Promise<APIResponse<Project[]>>;
/** Gets a project by its id.
* @param {number} id The id of the project to retrieve.
* @returns {Promise<APIResponse<Project>>} A promise resolving to an API response containing the project data.
*/
getProject(id: number): Promise<APIResponse<Project>>;
/** Gets a list of all users.
* @param {string} token The authentication token of the requesting user.
* @returns {Promise<APIResponse<string[]>>} A promise resolving to an API response containing the list of users.
*/
2024-03-20 00:10:24 +01:00
getAllUsers(token: string): Promise<APIResponse<string[]>>;
/** Gets all users in a project from name*/
getAllUsersProject(
projectName: string,
token: string,
2024-03-20 18:35:02 +01:00
): Promise<APIResponse<UserProjectMember[]>>;
/**
* Changes the username of a user in the database.
* @param {StrNameChange} data The object containing the previous and new username.
* @param {string} token The authentication token.
* @returns {Promise<APIResponse<void>>} A promise resolving to an API response.
*/
changeUserName(
data: StrNameChange,
token: string,
): Promise<APIResponse<void>>;
2024-03-21 03:36:57 +01:00
addUserToProject(
user: NewProjMember,
token: string,
): Promise<APIResponse<NewProjMember>>;
removeProject(
projectName: string,
token: string,
): Promise<APIResponse<string>>;
2024-03-13 17:06:26 +01:00
}
/** An instance of the API */
2024-03-13 17:06:26 +01:00
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: " + response.status,
};
2024-03-16 17:42:28 +01:00
} else {
// const data = (await response.json()) as User; // The API does not currently return the user
return { success: true };
2024-03-16 17:42:28 +01:00
}
} catch (e) {
return {
success: false,
message: "Unknown error while registering user",
};
2024-03-16 17:42:28 +01:00
}
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 {
2024-03-20 00:10:24 +01:00
const response = await fetch(`/api/userdelete/${username}`, {
2024-03-28 12:38:12 +01:00
method: "DELETE",
2024-03-16 17:42:28 +01:00
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + token,
},
body: JSON.stringify(username),
});
if (!response.ok) {
2024-03-28 12:38:12 +01:00
return { success: false, message: "Could not remove user" };
2024-03-16 17:42:28 +01:00
} else {
2024-03-28 12:38:12 +01:00
return { success: true };
2024-03-16 17:42:28 +01:00
}
} 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-28 12:06:59 +01:00
async checkIfProjectManager(
projectName: string,
token: string,
): Promise<APIResponse<boolean>> {
try {
const response = await fetch(
`/api/checkIfProjectManager/${projectName}`,
2024-03-28 12:06:59 +01:00
{
method: "GET",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + token,
},
},
);
if (!response.ok) {
return {
success: false,
message: "Failed to check if project manager",
};
} else {
const data = (await response.json()) as boolean;
return { success: true, data };
}
} catch (e) {
return { success: false, message: "Failed to check if project manager" };
}
},
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-21 03:36:57 +01:00
async addUserToProject(
user: NewProjMember,
token: string,
): Promise<APIResponse<NewProjMember>> {
try {
const response = await fetch("/api/addUserToProject", {
2024-03-28 00:57:16 +01:00
method: "PUT",
2024-03-21 03:36:57 +01:00
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + token,
},
body: JSON.stringify(user),
});
if (!response.ok) {
return { success: false, message: "Failed to add member" };
} else {
return { success: true, message: "Added member" };
}
} catch (e) {
return { success: false, message: "Failed to add member" };
}
},
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
},
2024-03-19 00:26:17 +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,
2024-03-19 00:20:08 +01:00
message: "API fucked",
});
}
},
2024-03-17 14:43:09 +01:00
async submitWeeklyReport(
weeklyReport: NewWeeklyReport,
token: string,
2024-03-21 18:05:41 +01:00
): Promise<APIResponse<string>> {
try {
2024-03-17 16:11:03 +01:00
const response = await fetch("/api/submitWeeklyReport", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + token,
},
body: JSON.stringify(weeklyReport),
2024-03-17 16:11:03 +01:00
});
if (!response.ok) {
return {
success: false,
message: "Failed to submit weekly report",
};
}
2024-03-21 18:05:41 +01:00
const data = await response.text();
return { success: true, message: data };
} catch (e) {
2024-03-17 16:11:03 +01:00
return {
success: false,
message: "Failed to submit weekly report",
2024-03-17 16:11:03 +01:00
};
}
},
2024-03-17 14:43:09 +01:00
async getWeeklyReport(
projectName: string,
week: string,
token: string,
2024-03-20 14:00:00 +01:00
): Promise<APIResponse<WeeklyReport>> {
try {
2024-03-20 22:02:34 +01:00
const response = await fetch(
`/api/getWeeklyReport?projectName=${projectName}&week=${week}`,
{
method: "GET",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + token,
},
},
2024-03-20 22:02:34 +01:00
);
if (!response.ok) {
return { success: false, message: "Failed to get weekly report" };
} else {
2024-03-20 14:00:00 +01:00
const data = (await response.json()) as WeeklyReport;
return { success: true, data };
}
} catch (e) {
return { success: false, message: "Failed to get weekly report" };
}
},
async getWeeklyReportsForUser(
2024-03-20 14:00:00 +01:00
projectName: string,
2024-03-20 14:02:34 +01:00
token: string,
2024-03-20 14:00:00 +01:00
): Promise<APIResponse<WeeklyReport[]>> {
try {
const response = await fetch(`/api/getWeeklyReportsUser/${projectName}`, {
method: "GET",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + token,
},
});
if (!response.ok) {
2024-03-19 19:45:56 +01:00
return {
success: false,
2024-03-20 17:19:09 +01:00
message:
"Failed to get weekly reports for project: Response code " +
response.status,
2024-03-19 19:45:56 +01:00
};
} else {
2024-03-20 14:00:00 +01:00
const data = (await response.json()) as WeeklyReport[];
return { success: true, data };
}
} catch (e) {
2024-03-19 19:45:56 +01:00
return {
success: false,
2024-03-20 17:19:09 +01:00
message: "Failed to get weekly reports for project, unknown error",
2024-03-19 19:45:56 +01:00
};
}
},
async login(NewUser: NewUser): Promise<APIResponse<string>> {
2024-03-17 14:43:09 +01:00
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 { token: string }; // Update the type of 'data'
return { success: true, data: data.token };
2024-03-17 14:43:09 +01:00
}
} catch (e) {
return Promise.resolve({ success: false, message: "Failed to login" });
}
},
async getProject(id: number): Promise<APIResponse<Project>> {
try {
const response = await fetch(`/api/project/${id}`, {
method: "GET",
});
if (!response.ok) {
return {
success: false,
message: "Failed to get project: Response code " + response.status,
};
} else {
const data = (await response.json()) as Project;
return { success: true, data };
}
// The code below is garbage but satisfies the linter
// This needs fixing, do not copy this pattern
} catch (e: unknown) {
return {
success: false,
message: "Failed to get project: " + (e as Error).toString(),
};
}
},
2024-03-20 00:10:24 +01:00
async getAllUsers(token: string): Promise<APIResponse<string[]>> {
try {
const response = await fetch("/api/users/all", {
method: "GET",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + token,
},
});
if (!response.ok) {
return Promise.resolve({
success: false,
message: "Failed to get users",
});
} else {
const data = (await response.json()) as string[];
return Promise.resolve({ success: true, data });
}
} catch (e) {
return Promise.resolve({
success: false,
message: "API is not ok",
});
}
},
//Gets all users in a project
async getAllUsersProject(
projectName: string,
token: string,
2024-03-20 18:35:02 +01:00
): Promise<APIResponse<UserProjectMember[]>> {
try {
const response = await fetch(`/api/getUsersProject/${projectName}`, {
method: "GET",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + token,
},
});
if (!response.ok) {
return Promise.resolve({
success: false,
message: "Failed to get users",
});
} else {
2024-03-20 18:35:02 +01:00
const data = (await response.json()) as UserProjectMember[];
return Promise.resolve({ success: true, data });
}
} catch (e) {
return Promise.resolve({
success: false,
message: "API is not ok",
});
}
},
async changeUserName(
data: StrNameChange,
token: string,
): Promise<APIResponse<void>> {
try {
const response = await fetch("/api/changeUserName", {
method: "PUT",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + token,
},
body: JSON.stringify(data),
});
if (!response.ok) {
return { success: false, message: "Failed to change username" };
} else {
return { success: true };
}
} catch (e) {
return { success: false, message: "Failed to change username" };
}
},
async removeProject(
projectName: string,
token: string,
): Promise<APIResponse<string>> {
try {
const response = await fetch(`/api/projectdelete/${projectName}`, {
method: "DELETE",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + token,
},
});
if (!response.ok) {
return Promise.resolve({
success: false,
message: "Failed to remove project",
});
} else {
const data = await response.text();
return Promise.resolve({ success: true, message: data });
}
} catch (e) {
return Promise.resolve({
success: false,
message: "Failed to remove project",
});
}
},
2024-03-13 17:06:26 +01:00
};