From d53a4964ae3dad8527205dec2e82cc733a4c2814 Mon Sep 17 00:00:00 2001 From: Peter Papp Date: Tue, 24 Aug 2021 13:29:45 +0200 Subject: [PATCH] it_accept_team_folder_invite --- .../TeamFoldersInvitationFactory.php | 32 ++++++++++++ ..._create_team_folders_invitations_table.php | 3 ++ ...92726_create_team_folder_members_table.php | 34 +++++++++++++ routes/teams.php | 3 ++ src/App/Users/Models/User.php | 2 +- .../AcceptTeamFolderInvitationController.php | 34 +++++++++++++ .../Controllers/TeamFoldersController.php | 12 +++-- .../Teams/Models/TeamFoldersInvitation.php | 6 +++ tests/Domain/Teams/TeamsTest.php | 51 ++++++++++++++++--- 9 files changed, 165 insertions(+), 12 deletions(-) create mode 100644 database/factories/TeamFoldersInvitationFactory.php create mode 100644 database/migrations/2021_08_24_092726_create_team_folder_members_table.php create mode 100644 src/Domain/Teams/Controllers/AcceptTeamFolderInvitationController.php diff --git a/database/factories/TeamFoldersInvitationFactory.php b/database/factories/TeamFoldersInvitationFactory.php new file mode 100644 index 00000000..4132cd7a --- /dev/null +++ b/database/factories/TeamFoldersInvitationFactory.php @@ -0,0 +1,32 @@ + $this->faker->uuid, + 'folder_id' => $this->faker->uuid, + 'email' => $this->faker->email, + 'permission' => $this->faker->randomElement(['can-edit', 'can-view', 'can-view-and-download']), + 'status' => $this->faker->randomElement(['pending', 'accepted', 'rejected']), + ]; + } +} diff --git a/database/migrations/2021_08_24_080638_create_team_folders_invitations_table.php b/database/migrations/2021_08_24_080638_create_team_folders_invitations_table.php index 88d7d368..ddc06c1b 100644 --- a/database/migrations/2021_08_24_080638_create_team_folders_invitations_table.php +++ b/database/migrations/2021_08_24_080638_create_team_folders_invitations_table.php @@ -17,8 +17,11 @@ class CreateTeamFoldersInvitationsTable extends Migration $table->uuid('id')->primary(); $table->uuid('folder_id'); $table->text('email'); + $table->enum('permission', ['can-edit', 'can-view', 'can-view-and-download']); $table->enum('status', ['pending', 'accepted', 'rejected'])->default('pending'); $table->timestamps(); + $table->charset = 'utf8mb4'; + $table->collation = 'utf8mb4_unicode_ci'; }); } diff --git a/database/migrations/2021_08_24_092726_create_team_folder_members_table.php b/database/migrations/2021_08_24_092726_create_team_folder_members_table.php new file mode 100644 index 00000000..0c7da85c --- /dev/null +++ b/database/migrations/2021_08_24_092726_create_team_folder_members_table.php @@ -0,0 +1,34 @@ +uuid('folder_id'); + $table->uuid('member_id'); + $table->string('permission'); + $table->charset = 'utf8mb4'; + $table->collation = 'utf8mb4_unicode_ci'; + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('team_folder_members'); + } +} diff --git a/routes/teams.php b/routes/teams.php index 2c64c477..c98c0ce5 100644 --- a/routes/teams.php +++ b/routes/teams.php @@ -1,5 +1,8 @@ email) + ->firstOrFail(); + + $invitation->update([ + 'status' => 'accepted', + ]); + + DB::table('team_folder_members') + ->insert([ + 'folder_id' => $invitation->folder_id, + 'member_id' => $user->id, + 'permission' => 'can-edit', + ]); + + return response('Done', 201); + } +} \ No newline at end of file diff --git a/src/Domain/Teams/Controllers/TeamFoldersController.php b/src/Domain/Teams/Controllers/TeamFoldersController.php index 3052aa71..b793c9a0 100644 --- a/src/Domain/Teams/Controllers/TeamFoldersController.php +++ b/src/Domain/Teams/Controllers/TeamFoldersController.php @@ -1,10 +1,11 @@ members) - ->each(function ($email) use ($teamFolder) { + ->each(function ($member) use ($teamFolder) { // Create invitation $invitation = TeamFoldersInvitation::create([ - 'folder_id' => $teamFolder->id, - 'email' => $email, + 'permission' => $member['permission'], + 'email' => $member['email'], + 'folder_id' => $teamFolder->id, ]); // Invite user - Notification::route('mail', $email) + Notification::route('mail', $member['email']) ->notify(new InvitationIntoTeamFolder($teamFolder, $invitation)); }); diff --git a/src/Domain/Teams/Models/TeamFoldersInvitation.php b/src/Domain/Teams/Models/TeamFoldersInvitation.php index 5a8f58be..aec53e25 100644 --- a/src/Domain/Teams/Models/TeamFoldersInvitation.php +++ b/src/Domain/Teams/Models/TeamFoldersInvitation.php @@ -3,6 +3,7 @@ namespace Domain\Teams\Models; use Illuminate\Support\Str; use Illuminate\Database\Eloquent\Model; +use Database\Factories\TeamFoldersInvitationFactory; use Illuminate\Database\Eloquent\Factories\HasFactory; /** @@ -28,6 +29,11 @@ class TeamFoldersInvitation extends Model protected $keyType = 'string'; + protected static function newFactory(): TeamFoldersInvitationFactory + { + return TeamFoldersInvitationFactory::new(); + } + protected static function boot() { parent::boot(); diff --git a/tests/Domain/Teams/TeamsTest.php b/tests/Domain/Teams/TeamsTest.php index 978ac1f7..032d6cc6 100644 --- a/tests/Domain/Teams/TeamsTest.php +++ b/tests/Domain/Teams/TeamsTest.php @@ -1,6 +1,9 @@ post('/api/teams/team-folders', [ 'name' => 'Company Project', 'members' => [ - 'john@internal.com', - 'jane@external.com', + [ + 'email' => 'john@internal.com', + 'permission' => 'can-edit', + ], + [ + 'email' => 'jane@external.com', + 'permission' => 'can-view', + ], ], ]) ->assertCreated() @@ -66,16 +74,47 @@ class TeamsTest extends TestCase } /** - * + * @test */ - public function member_accept_team_folder_invite() + public function it_accept_team_folder_invite() { + $member = User::factory(User::class) + ->create([ + 'email' => 'john@internal.com', + ]); + + $folder = Folder::factory() + ->create(); + + $invitation = TeamFoldersInvitation::factory() + ->create([ + 'folder_id' => $folder->id, + 'email' => $member->email, + 'status' => 'pending', + 'permission' => 'can-edit', + ]); + + $this + ->actingAs($member) + ->postJson("/api/teams/invitations/{$invitation->id}") + ->assertCreated(); + + $this + ->assertDatabaseHas('team_folder_members', [ + 'folder_id' => $folder->id, + 'member_id' => $member->id, + 'permission' => 'can-edit', + ]) + ->assertDatabaseHas('team_folders_invitations', [ + 'folder_id' => $folder->id, + 'status' => 'accepted', + ]); } /** * */ - public function member_reject_team_folder_invite() + public function it_reject_team_folder_invite() { }