Skip to content
Snippets Groups Projects
team.ts 5.92 KiB
Newer Older
import { apiRoot } from 'config';

import { getAuthHeader } from './auth';
import { User } from './user';
import { Project } from './project';
import { Work } from './work';

export interface Team {
    id: string;
    name: string;
    role?: string;
}

export interface TeamRole {
    id: string;
    name: string;
}

export interface TeamMember extends User {
    role: TeamRole;
}

type TeamProject = Exclude<Project, 'teams'>;

export async function getTeams(): Promise<Team[]> {
    try {
        const response = await fetch(`${apiRoot}/team/`, { headers: getAuthHeader() });
        if (response.ok) {
            return (await response.json()).teams;
        } else {
            throw new Error("Failed to get teams");
        }
    } catch (e) {
        throw e;
    }
}

export async function getTeam(uuid: string): Promise<Team> {
    try {
        const response = await fetch(`${apiRoot}/team/${uuid}`, { headers: getAuthHeader() });
        if (response.ok) {
            return (await response.json()).team;
        } else {
            throw new Error("Failed to get team");
        }
    } catch (e) {
        throw e;
    }
}

export async function getTeamMembers(uuid: string): Promise<TeamMember[]> {
    try {
        const response = await fetch(`${apiRoot}/team/${uuid}/members`, { headers: getAuthHeader() });
        if (response.ok) {
            return (await response.json()).members;
        } else {
            throw new Error("Failed to get team members");
        }
    } catch (e) {
        throw e;
    }
}

export async function getTeamRoles(uuid: string): Promise<TeamRole[]> {
    try {
        const response = await fetch(`${apiRoot}/team/${uuid}/roles`, { headers: getAuthHeader() });
        if (response.ok) {
            return (await response.json()).roles;
        } else {
            throw new Error("Failed to get team roles");
        }
    } catch (e) {
        throw e;
    }
}

export async function getTeamProjects(uuid: string): Promise<TeamProject[]> {
    try {
        const response = await fetch(`${apiRoot}/team/${uuid}/projects`, { headers: getAuthHeader() });
        if (response.ok) {
            return (await response.json()).projects;
        } else {
            throw new Error("Failed to get team projects");
        }
    } catch (e) {
        throw e;
    }
}

export async function getTeamWork(uuid: string): Promise<Work[]> {
    try {
        const response = await fetch(`${apiRoot}/team/${uuid}/work`, { headers: getAuthHeader() });
        if (response.ok) {
            return (await response.json()).work;
        } else {
            throw new Error("Failed to get team work");
        }
    } catch (e) {
        throw e;
    }
}

export async function createTeam(name: string): Promise<string> {
    try {
        const response = await fetch(`${apiRoot}/team/`, {
            method: 'POST',
            headers: {
                ...getAuthHeader(),
                'Content-Type': 'application/json',
            },
            body: JSON.stringify({
                name: name,
            }),
        });
        if (response.ok) {
            return (await response.json()).id;
        } else {
            throw new Error("Failed to create team");
        }
    } catch (e) {
        throw e;
    }
}

export async function removeTeamMember(team: string, user: string) {
    try {
        const response = await fetch(`${apiRoot}/team/${team}/members/${user}`, {
            method: 'DELETE',
            headers: getAuthHeader(),
        });
        if (!response.ok) {
            throw new Error("Failed to create team");
        }
    } catch (e) {
        throw e;
    }
}

export async function createTeamRole(team: string, name: string): Promise<TeamRole> {
    try {
        const response = await fetch(`${apiRoot}/team/${team}/roles`, {
            method: 'POST',
            headers: {
                ...getAuthHeader(),
                'Content-Type': 'application/json',
            },
            body: JSON.stringify({
                name: name,
            }),
        });
        if (response.ok) {
            return (await response.json()).role;
        } else {
            throw new Error("Failed to create team role");
        }
    } catch (e) {
        throw e;
    }
}

export async function deleteTeamRole(team: string, role: string) {
    try {
        const response = await fetch(`${apiRoot}/team/${team}/roles/${role}`, {
            method: 'DELETE',
            headers: getAuthHeader(),
        });
        if (!response.ok) {
            throw new Error("Failed to delete team role");
        }
    } catch (e) {
        throw e;
    }
}

export async function addTeamMember(team: string, member: { user: string, role: string }) {
    try {
        const response = await fetch(`${apiRoot}/team/${team}/members`, {
            method: 'POST',
            headers: {
                ...getAuthHeader(),
                'Content-Type': 'application/json',
            },
            body: JSON.stringify(member),
        });
        if (!response.ok) {
            throw new Error("Failed to add team member");
        }
    } catch (e) {
        throw e;
    }
}

export async function updateTeamMember(team: string, member: { user: string, role: string }) {
    try {
        const response = await fetch(`${apiRoot}/team/${team}/members`, {
            method: 'PUT',
            headers: {
                ...getAuthHeader(),
                'Content-Type': 'application/json',
            },
            body: JSON.stringify(member),
        });
        if (!response.ok) {
            throw new Error("Failed to update team member");
        }
    } catch (e) {
        throw e;
    }
}

export async function leaveTeam(team: string) {
    try {
        const response = await fetch(`${apiRoot}/team/${team}`, {
            method: 'DELETE',
            headers: getAuthHeader(),
        });
        if (!response.ok) {
            throw new Error("Failed to leave team");
        }
    } catch (e) {
        throw e;
    }
}