From 8669c67636567a411920c0eee4626bab6a346438 Mon Sep 17 00:00:00 2001
From: Roland Bernard <rolbernard@unibz.it>
Date: Mon, 3 May 2021 19:26:13 +0200
Subject: [PATCH] Added more API paths

---
 server/migrations/0000_initial.ts |  2 +
 server/src/v1/project.ts          |  6 ++-
 server/src/v1/task.ts             | 10 +++-
 server/src/v1/team.ts             | 86 ++++++++++++++++++++++++-------
 server/src/v1/user.ts             |  2 +
 5 files changed, 83 insertions(+), 23 deletions(-)

diff --git a/server/migrations/0000_initial.ts b/server/migrations/0000_initial.ts
index 5bbfc84..e247adb 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 370eef8..a576904 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 89d3f94..3662b6e 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 4fa9136..e012eec 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 4136116..d4ffdbb 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',
-- 
GitLab