diff options
-rw-r--r-- | app/Model/User.php | 26 | ||||
-rw-r--r-- | tests/units/UserTest.php | 15 |
2 files changed, 35 insertions, 6 deletions
diff --git a/app/Model/User.php b/app/Model/User.php index 59015087..0d5b346b 100644 --- a/app/Model/User.php +++ b/app/Model/User.php @@ -292,15 +292,29 @@ class User extends Base */ public function remove($user_id) { - $this->db->startTransaction(); + return $this->db->transaction(function ($db) use ($user_id) { - // All tasks assigned to this user will be unassigned - $this->db->table(Task::TABLE)->eq('owner_id', $user_id)->update(array('owner_id' => 0)); - $result = $this->db->table(self::TABLE)->eq('id', $user_id)->remove(); + // All assigned tasks are now unassigned + if (! $db->table(Task::TABLE)->eq('owner_id', $user_id)->update(array('owner_id' => 0))) { + return false; + } - $this->db->closeTransaction(); + // All private projects are removed + $project_ids = $db->table(Project::TABLE) + ->eq('is_private', 1) + ->eq(ProjectPermission::TABLE.'.user_id', $user_id) + ->join(ProjectPermission::TABLE, 'project_id', 'id') + ->findAllByColumn(Project::TABLE.'.id'); - return $result; + if (! empty($project_ids)) { + $db->table(Project::TABLE)->in('id', $project_ids)->remove(); + } + + // Finally remove the user + if (! $db->table(self::TABLE)->eq('id', $user_id)->remove()) { + return false; + } + }); } /** diff --git a/tests/units/UserTest.php b/tests/units/UserTest.php index 6e535a35..c4094ea2 100644 --- a/tests/units/UserTest.php +++ b/tests/units/UserTest.php @@ -141,5 +141,20 @@ class UserTest extends Base $task = $tf->getById(1); $this->assertEquals(1, $task['id']); $this->assertEquals(0, $task['owner_id']); + + // Make sure that private projects are also removed + $user_id1 = $u->create(array('username' => 'toto1', 'password' => '123456', 'name' => 'Toto')); + $user_id2 = $u->create(array('username' => 'toto2', 'password' => '123456', 'name' => 'Toto')); + $this->assertNotFalse($user_id1); + $this->assertNotFalse($user_id2); + $this->assertEquals(2, $p->create(array('name' => 'Private project #1', 'is_private' => 1), $user_id1, true)); + $this->assertEquals(3, $p->create(array('name' => 'Private project #2', 'is_private' => 1), $user_id2, true)); + + $this->assertTrue($u->remove($user_id1)); + + $this->assertNotEmpty($p->getById(1)); + $this->assertNotEmpty($p->getById(3)); + + $this->assertEmpty($p->getById(2)); } } |