Skip to content

Commit

Permalink
Added assignable users endpoint (#55)
Browse files Browse the repository at this point in the history
* Added assignable users endpoint

* Update composer.json
  • Loading branch information
daVitekPL committed Mar 30, 2023
1 parent 9cc7aab commit 93cdda1
Show file tree
Hide file tree
Showing 6 changed files with 100 additions and 2 deletions.
5 changes: 4 additions & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,10 @@
},
"config": {
"preferred-install": "dist",
"sort-packages": true
"sort-packages": true,
"allow-plugins": {
"php-http/discovery": true
}
},
"minimum-stability": "dev",
"prefer-stable": true
Expand Down
27 changes: 27 additions & 0 deletions src/Http/Controllers/Swagger/WebinarSwagger.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
use EscolaLms\Webinar\Http\Requests\StoreWebinarRequest;
use EscolaLms\Webinar\Http\Requests\UpdateWebinarRequest;
use EscolaLms\Webinar\Http\Requests\ListWebinarsRequest;
use EscolaLms\Webinar\Http\Requests\WebinarAssignableUserListRequest;
use Illuminate\Http\JsonResponse;

interface WebinarSwagger
Expand Down Expand Up @@ -276,4 +277,30 @@ public function update(int $id, UpdateWebinarRequest $updateWebinarRequest): Jso
* )
*/
public function destroy(int $id): JsonResponse;

/**
* @OA\Get(
* tags={"Admin Webinars"},
* path="/api/admin/webinars/users/assignable",
* description="Get users assignable to webinars",
* security={
* {"passport": {}},
* },
* @OA\Response(
* response=200,
* description="successful operation",
* @OA\MediaType(
* mediaType="application/json",
* ),
* ),
* @OA\Response(
* response=422,
* description="Bad request",
* @OA\MediaType(
* mediaType="application/json"
* )
* )
* )
*/
public function assignableUsers(WebinarAssignableUserListRequest $request): JsonResponse;
}
16 changes: 15 additions & 1 deletion src/Http/Controllers/WebinarController.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,25 +2,32 @@

namespace EscolaLms\Webinar\Http\Controllers;

use EscolaLms\Auth\Http\Resources\UserFullResource;
use EscolaLms\Auth\Services\Contracts\UserServiceContract;
use EscolaLms\Webinar\Enum\WebinarPermissionsEnum;
use EscolaLms\Webinar\Http\Requests\StoreWebinarRequest;
use EscolaLms\Webinar\Http\Requests\UpdateWebinarRequest;
use EscolaLms\Webinar\Dto\WebinarDto;
use EscolaLms\Webinar\Enum\ConstantEnum;
use EscolaLms\Webinar\Http\Controllers\Swagger\WebinarSwagger;
use EscolaLms\Core\Http\Controllers\EscolaLmsBaseController;
use EscolaLms\Webinar\Http\Requests\ListWebinarsRequest;
use EscolaLms\Webinar\Http\Requests\WebinarAssignableUserListRequest;
use EscolaLms\Webinar\Http\Resources\WebinarSimpleResource;
use EscolaLms\Webinar\Services\Contracts\WebinarServiceContract;
use Illuminate\Http\JsonResponse;

class WebinarController extends EscolaLmsBaseController implements WebinarSwagger
{
private WebinarServiceContract $webinarServiceContract;
private UserServiceContract $userService;

public function __construct(
WebinarServiceContract $webinarServiceContract
WebinarServiceContract $webinarServiceContract,
UserServiceContract $userService
) {
$this->webinarServiceContract = $webinarServiceContract;
$this->userService = $userService;
}

public function index(ListWebinarsRequest $listWebinarsRequest): JsonResponse
Expand Down Expand Up @@ -73,4 +80,11 @@ public function destroy(int $id): JsonResponse
$this->webinarServiceContract->delete($id);
return $this->sendSuccess(__('Webinar deleted successfully'));
}

public function assignableUsers(WebinarAssignableUserListRequest $request): JsonResponse
{
$result = $this->userService
->assignableUsers(WebinarPermissionsEnum::WEBINAR_CREATE, $request->get('per_page'), $request->get('page'));
return $this->sendResponseForResource(UserFullResource::collection($result), __('Users assignable to webinar'));
}
}
21 changes: 21 additions & 0 deletions src/Http/Requests/WebinarAssignableUserListRequest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?php

namespace EscolaLms\Webinar\Http\Requests;

use EscolaLms\Webinar\Enum\WebinarPermissionsEnum;
use EscolaLms\Webinar\Models\Webinar;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Facades\Gate;

class WebinarAssignableUserListRequest extends FormRequest
{
public function authorize(): bool
{
return Gate::allows(WebinarPermissionsEnum::WEBINAR_CREATE, Webinar::class);
}

public function rules(): array
{
return [];
}
}
1 change: 1 addition & 0 deletions src/routes.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
Route::group(['middleware' => ['auth:api'], 'prefix' => 'api/admin'], function () {
Route::post('webinars/{id}', [WebinarController::class, 'update']);
Route::resource('webinars', WebinarController::class);
Route::get('webinars/users/assignable', [WebinarController::class, 'assignableUsers']);
});

// user endpoints
Expand Down
32 changes: 32 additions & 0 deletions tests/APIs/WebinarApiTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace EscolaLms\Webinar\Tests\APIs;

use EscolaLms\Core\Tests\CreatesUsers;
use EscolaLms\Tags\Models\Tag;
use EscolaLms\Webinar\Database\Seeders\WebinarsPermissionSeeder;
use EscolaLms\Webinar\Models\Webinar;
Expand All @@ -14,6 +15,7 @@

class WebinarApiTest extends TestCase
{
use CreatesUsers;
use DatabaseTransactions;
private Webinar $webinar;

Expand Down Expand Up @@ -99,4 +101,34 @@ public function testYtUnAuthorizedException(): void
$this->response->assertStatus(400);
$this->response->assertJsonFragment(['code' => 400,]);
}

public function testWebinarAssignableUsersUnauthorized(): void
{
$this->response = $this
->json('GET', '/api/admin/webinars/users/assignable')
->assertUnauthorized();
}

public function testWebinarAssignableUsers(): void
{
$admin = $this->makeAdmin();
$student = $this->makeStudent();
$this->response = $this
->actingAs($this->user, 'api')
->json('GET', '/api/admin/webinars/users/assignable')
->assertOk()
->assertJsonCount(2, 'data')
->assertJsonMissing([
'id' => $student->getKey(),
'email' => $student->email,
])
->assertJsonFragment([
'id' => $admin->getKey(),
'email' => $admin->email,
])
->assertJsonFragment([
'id' => $this->user->getKey(),
'email' => $this->user->email,
]);
}
}

0 comments on commit 93cdda1

Please sign in to comment.