diff --git a/server/migrations/0000_initial.ts b/server/migrations/0000_initial.ts index 5bbfc84585e6fe110969d91daf1733e0d036aeef..e247adb7cbe4cce5c1e6179e91908e97d631cbff 100644 --- a/server/migrations/0000_initial.ts +++ b/server/migrations/0000_initial.ts @@ -32,6 +32,7 @@ export async function up(database: Knex): Promise<void> { table.text('text').notNullable(); table.string('color').notNullable(); table.enum('status', [ 'open', 'closed', 'suspended' ]).notNullable(); + table.date('deadline'); }) .createTable('team_projects', table => { table.uuid('project_id').notNullable().references('projects.id'); @@ -65,6 +66,7 @@ export async function up(database: Knex): Promise<void> { table.uuid('task_id').notNullable().references('tasks.id'); table.primary(['user_id', 'task_id']); table.integer('time').notNullable(); + table.boolean('finished').notNullable(); }) .createTable('comments', table => { table.uuid('id').notNullable().primary(); diff --git a/server/src/v1/project.ts b/server/src/v1/project.ts index 370eef80ba61f7c44fdf6b95349fee1417e5971f..a576904110219fd52a45f1c00b07b88914de103b 100644 --- a/server/src/v1/project.ts +++ b/server/src/v1/project.ts @@ -112,6 +112,7 @@ project.get('/:uuid/tasks', async (req, res) => { requirement_time: 'task_requirements.time', assigned_user: 'task_assignees.user_id', assigned_time: 'task_assignees.time', + assigned_finished: 'task_assignees.finished', dependentcy: 'task_dependencies.requires_id', }) .where({ @@ -168,7 +169,6 @@ project.get('/:uuid/assigned', async (req, res) => { }); } } catch (e) { - console.log(e); res.status(400).json({ status: 'error', message: 'failed to get assignees', @@ -221,6 +221,7 @@ interface AddProjectBody { name: string; text: string; color: string; + deadline?: string; token: Token; } @@ -258,8 +259,9 @@ project.post('/', async (req, res) => { name: req.body.name, text: req.body.text, color: req.body.color, + deadline: req.body.deadline ? new Date(req.body.deadline) : null, status: 'open', - }); + }) await transaction('team_projects').insert( team_ids.map(team_id => ({ project_id: project_id, diff --git a/server/src/v1/task.ts b/server/src/v1/task.ts index 89d3f948cafb5577b08a48b05f0b31109c1f433b..3662b6e65532c6114d1f04d34d9f1f9f5e92407b 100644 --- a/server/src/v1/task.ts +++ b/server/src/v1/task.ts @@ -14,6 +14,7 @@ interface TaskRequirement { interface TaskAssignment { user: string; time: number; + finished: boolean; } export interface Task { @@ -68,6 +69,7 @@ export function generateFromFlatResult(results: any[]): Task[] { grouped_tasks[row.id].assigned.push({ user: row.assigned_user, time: row.assigned_time, + finished: row.assigned_finished, }); } } @@ -112,6 +114,7 @@ task.get('/', async (req, res) => { requirement_time: 'task_requirements.time', assigned_user: 'task_assignees.user_id', assigned_time: 'task_assignees.time', + assigned_finished: 'task_assignees.finished', dependentcy: 'task_dependencies.requires_id', }) .where({ @@ -151,6 +154,7 @@ task.get('/:status(open|closed|suspended)', async (req, res) => { requirement_time: 'task_requirements.time', assigned_user: 'task_assignees.user_id', assigned_time: 'task_assignees.time', + assigned_finished: 'task_assignees.finished', dependentcy: 'task_dependencies.requires_id', }) .where({ @@ -192,6 +196,7 @@ task.get('/possible', async (req, res) => { requirement_time: 'task_requirements.time', assigned_user: 'task_assignees.user_id', assigned_time: 'task_assignees.time', + assigned_finished: 'task_assignees.finished', dependentcy: 'task_dependencies.requires_id', dependentcy_status: 'require.status', }) @@ -204,7 +209,6 @@ task.get('/possible', async (req, res) => { tasks: generateFromFlatResult(tasks), }); } catch (e) { - console.log(e); res.status(400).json({ status: 'error', message: 'failed get tasks', @@ -324,6 +328,7 @@ task.get('/:uuid', async (req, res) => { .select({ user: 'task_assignees.user_id', time: 'task_assignees.time', + finished: 'task_assignees.finished', }) .where({ 'task_assignees.task_id': id, @@ -350,6 +355,7 @@ task.get('/:uuid', async (req, res) => { assigned: assigned.map(row => ({ user: row.user, time: row.time, + finished: row.finished, })), dependentcies: dependentcies.map(row => row.id), requirements: requirements.map(row => ({ @@ -456,6 +462,7 @@ task.post('/', async (req, res) => { task_id: task_id, user_id: assigned.user, time: assigned.time, + finished: assigned.finished ?? false, })) ); } @@ -598,6 +605,7 @@ task.put('/:uuid', async (req, res) => { task_id: task_id, user_id: assigned.user, time: assigned.time, + finished: assigned.finished ?? false, })) ); } diff --git a/server/src/v1/team.ts b/server/src/v1/team.ts index 4fa91366611ebca56c96bfaf5b38618ba96cd06a..e012eec1efab9dcb5721af6195c07a4d0c9ed565 100644 --- a/server/src/v1/team.ts +++ b/server/src/v1/team.ts @@ -123,7 +123,6 @@ team.get('/:uuid/', async (req, res) => { }); } } catch (e) { - console.log(e); res.status(400).json({ status: 'error', message: 'failed get team', @@ -186,6 +185,55 @@ team.get('/:uuid/members', async (req, res) => { } }); +team.delete('/:teamid/members/:userid', async (req, res) => { + try { + const team_id = req.params.teamid; + const user_id = req.params.userid; + if (validate(team_id) && validate(user_id)) { + const team = await database('team_members') + .select({ id: 'team_members.team_id' }) + .where({ + 'team_members.user_id': req.body.token.id, + 'team_members.team_id': team_id, + }); + if (team.length === 1) { + const deleted = await database('team_members') + .delete() + .where({ + 'team_members.user_id': user_id, + 'team_members.team_id': team_id, + }); + if (deleted >= 1) { + res.status(200).json({ + status: 'success', + }); + } else { + res.status(404).json({ + status: 'error', + message: 'role not found', + }); + } + } else { + res.status(404).json({ + status: 'error', + message: 'team not found', + }); + } + } else { + res.status(400).json({ + status: 'error', + message: 'malformed uuid', + }); + } + } catch (e) { + res.status(400).json({ + status: 'error', + message: 'failed remove members', + }); + } +}); + + team.get('/:uuid/roles', async (req, res) => { try { const id = req.params.uuid; @@ -399,7 +447,7 @@ team.delete('/:teamid/roles/:roleid', async (req, res) => { } catch (e) { res.status(400).json({ status: 'error', - message: 'failed to add role', + message: 'failed to delete role', }); } }); @@ -521,24 +569,22 @@ team.delete('/:uuid/', async (req, res) => { try { const id = req.params.uuid; if (validate(id)) { - await database.transaction(async transaction => { - const deleted = await transaction('team_members') - .delete() - .where({ - 'team_members.user_id': req.body.token.id, - 'team_members.team_id': id, - }); - if (deleted >= 1) { - res.status(200).json({ - status: 'success', - }); - } else { - res.status(404).json({ - status: 'error', - message: 'team not found', - }); - } - }); + const deleted = await database('team_members') + .delete() + .where({ + 'team_members.user_id': req.body.token.id, + 'team_members.team_id': id, + }); + if (deleted >= 1) { + res.status(200).json({ + status: 'success', + }); + } else { + res.status(404).json({ + status: 'error', + message: 'team not found', + }); + } } else { res.status(400).json({ status: 'error', diff --git a/server/src/v1/user.ts b/server/src/v1/user.ts index 4136116ed5cf1253a6b1169ba42ae362a6b9472c..d4ffdbb1ad808dea9837e4c1ca925b865b8fe818 100644 --- a/server/src/v1/user.ts +++ b/server/src/v1/user.ts @@ -91,10 +91,12 @@ user.get('/tasks', async (req, res) => { requirement_time: 'task_requirements.time', assigned_user: 'task_assignees.user_id', assigned_time: 'task_assignees.time', + assigned_finished: 'task_assignees.finished', dependentcy: 'task_dependencies.requires_id', }) .where({ 'ut.user_id': req.body.token.id, + 'task_assignees.finished': false, }); res.status(200).json({ status: 'success',