diff --git a/routes/teams.php b/routes/teams.php index e78b53d1..78f0b87f 100644 --- a/routes/teams.php +++ b/routes/teams.php @@ -1,5 +1,6 @@ only('destroy', 'update'); +Route::post('/team-folders/convert/{folder}', ConvertFolderIntoTeamFolderController::class); Route::apiResource('/team-folders', TeamFoldersController::class); diff --git a/src/Domain/Teams/Actions/InviteMembersIntoTeamFolderAction.php b/src/Domain/Teams/Actions/InviteMembersIntoTeamFolderAction.php new file mode 100644 index 00000000..af4b1a59 --- /dev/null +++ b/src/Domain/Teams/Actions/InviteMembersIntoTeamFolderAction.php @@ -0,0 +1,32 @@ +each(function ($member) use ($folder) { + + // Create invitation + $invitation = TeamFoldersInvitation::create([ + 'permission' => $member['permission'], + 'email' => $member['email'], + 'folder_id' => $folder->id, + ]); + + // Invite user + Notification::route('mail', $member['email']) + ->notify(new InvitationIntoTeamFolder($folder, $invitation)); + }); + } +} \ No newline at end of file diff --git a/src/Domain/Teams/Controllers/ConvertFolderIntoTeamFolderController.php b/src/Domain/Teams/Controllers/ConvertFolderIntoTeamFolderController.php new file mode 100644 index 00000000..a1482420 --- /dev/null +++ b/src/Domain/Teams/Controllers/ConvertFolderIntoTeamFolderController.php @@ -0,0 +1,30 @@ +update(['team_folder' => 1]); + + // Invite team members + ($this->inviteMembers)($request->input('members'), $folder); + + return response($folder, 201); + } +} \ No newline at end of file diff --git a/src/Domain/Teams/Controllers/TeamFoldersController.php b/src/Domain/Teams/Controllers/TeamFoldersController.php index b793c9a0..77721eae 100644 --- a/src/Domain/Teams/Controllers/TeamFoldersController.php +++ b/src/Domain/Teams/Controllers/TeamFoldersController.php @@ -2,42 +2,33 @@ namespace Domain\Teams\Controllers; +use Domain\Teams\Actions\InviteMembersIntoTeamFolderAction; use Illuminate\Http\Request; use Illuminate\Http\Response; use Domain\Folders\Models\Folder; use App\Http\Controllers\Controller; use Domain\Teams\DTO\CreateTeamFolderData; -use Illuminate\Support\Facades\Notification; -use Domain\Teams\Models\TeamFoldersInvitation; -use Domain\Teams\Notifications\InvitationIntoTeamFolder; class TeamFoldersController extends Controller { - public function store(Request $request): Response - { + public function __construct( + public InviteMembersIntoTeamFolderAction $inviteMembers, + ) {} + + public function store( + Request $request, + ): Response { $data = CreateTeamFolderData::fromRequest($request); - $teamFolder = Folder::create([ + $folder = Folder::create([ 'user_id' => $request->user()->id, 'name' => $data->name, 'team_folder' => 1, ]); - collect($data->members) - ->each(function ($member) use ($teamFolder) { + // Invite team members + ($this->inviteMembers)($data->members, $folder); - // Create invitation - $invitation = TeamFoldersInvitation::create([ - 'permission' => $member['permission'], - 'email' => $member['email'], - 'folder_id' => $teamFolder->id, - ]); - - // Invite user - Notification::route('mail', $member['email']) - ->notify(new InvitationIntoTeamFolder($teamFolder, $invitation)); - }); - - return response($teamFolder, 201); + return response($folder, 201); } } diff --git a/tests/Domain/Teams/TeamsTest.php b/tests/Domain/Teams/TeamsTest.php index e3cb199f..105259d1 100644 --- a/tests/Domain/Teams/TeamsTest.php +++ b/tests/Domain/Teams/TeamsTest.php @@ -60,17 +60,43 @@ class TeamsTest extends TestCase } /** - * + * @test */ - public function it_convert_team_folder() + public function it_convert_folder_into_team_folder() { - } + $user = User::factory() + ->create(); - /** - * - */ - public function it_add_member_into_team_folder() - { + $folder = Folder::factory() + ->create([ + 'user_id' => $user->id, + ]); + + $this + ->actingAs($user) + ->post("/api/teams/team-folders/convert/{$folder->id}", [ + 'members' => [ + [ + 'email' => 'john@internal.com', + 'permission' => 'can-edit', + ], + [ + 'email' => 'jane@external.com', + 'permission' => 'can-view', + ], + ], + ]) + ->assertCreated() + ->assertJsonFragment([ + 'name' => $folder->name, + ]); + + $this->assertDatabaseHas('folders', [ + 'id' => $folder->id, + 'team_folder' => 1, + ]); + + Notification::assertTimesSent(2, InvitationIntoTeamFolder::class); } /** @@ -143,11 +169,18 @@ class TeamsTest extends TestCase 'status' => 'rejected', ]) ->assertDatabaseMissing('team_folder_members', [ - 'folder_id' => $folder->id, - 'member_id' => $member->id, + 'folder_id' => $folder->id, + 'member_id' => $member->id, ]); } + /** + * + */ + public function it_add_member_into_team_folder() + { + } + /** * */