Skip to content

Commit

Permalink
Add a list of dictionary words for the user (#3)
Browse files Browse the repository at this point in the history
* Dictionary CRUD

* Fix phpstan

* DictionaryWord CRUD

* WIP

* Fix phpstan

* WIP

* Fix test namespace

* Add a list of dictionary words for the user

* fix phpstan
  • Loading branch information
mako321 committed Mar 6, 2024
1 parent 7601f62 commit 6c24145
Show file tree
Hide file tree
Showing 27 changed files with 630 additions and 28 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?php

use EscolaLms\Dictionaries\Models\Dictionary;
use EscolaLms\Dictionaries\Models\User;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
public function up(): void
{
Schema::create('dictionary_user', function (Blueprint $table) {
$table->foreignIdFor(Dictionary::class)->constrained()->cascadeOnDelete();
$table->foreignIdFor(User::class)->constrained()->cascadeOnDelete();
$table->dateTime('end_date')->nullable();
});
}

public function down(): void
{
Schema::dropIfExists('dictionary_word_user');
}
};
2 changes: 0 additions & 2 deletions database/seeders/DictionariesPermissionSeeder.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,12 @@ class DictionariesPermissionSeeder extends Seeder
{
public function run(): void
{
$student = Role::findOrCreate('student', 'api');
$admin = Role::findOrCreate('admin', 'api');

foreach (DictionariesPermissionEnum::getValues() as $permission) {
Permission::findOrCreate($permission, 'api');
}

$admin->givePermissionTo(DictionariesPermissionEnum::getAdminPermissions());
$student->givePermissionTo(DictionariesPermissionEnum::getStudentPermissions());
}
}
4 changes: 4 additions & 0 deletions src/Dtos/DictionaryWordCriteriaDto.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@ public static function instantiateFromRequest(Request $request): self
{
$criteria = new Collection();

if ($request->route('slug')) {
$criteria->push(new HasCriterion('dictionary', fn ($query) => $query->where('slug', $request->route('slug'))));
}

if ($request->get('word')) {
$criteria->push(new LikeCriterion('word', $request->get('word')));
}
Expand Down
11 changes: 0 additions & 11 deletions src/Enums/DictionariesPermissionEnum.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,6 @@ class DictionariesPermissionEnum extends BasicEnum
public const DICTIONARY_WORD_UPDATE = 'dictionary-word_update';
public const DICTIONARY_WORD_DELETE = 'dictionary-word_delete';

public const DICTIONARY_LIST_SELF = 'dictionary_list-self';
public const DICTIONARY_READ_SELF = 'dictionary_read-self';

public static function getAdminPermissions(): array
{
return [
Expand All @@ -36,12 +33,4 @@ public static function getAdminPermissions(): array
self::DICTIONARY_WORD_DELETE,
];
}

public static function getStudentPermissions(): array
{
return [
self::DICTIONARY_LIST_SELF,
self::DICTIONARY_READ_SELF,
];
}
}
3 changes: 3 additions & 0 deletions src/EscolaLmsDictionariesServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
use EscolaLms\Auth\EscolaLmsAuthServiceProvider;
use EscolaLms\Categories\EscolaLmsCategoriesServiceProvider;
use EscolaLms\Dictionaries\Providers\AuthServiceProvider;
use EscolaLms\Dictionaries\Repositories\CategoryRepository;
use EscolaLms\Dictionaries\Repositories\Contracts\CategoryRepositoryContract;
use EscolaLms\Dictionaries\Repositories\Contracts\DictionaryRepositoryContract;
use EscolaLms\Dictionaries\Repositories\Contracts\DictionaryWordRepositoryContract;
use EscolaLms\Dictionaries\Repositories\DictionaryRepository;
Expand All @@ -26,6 +28,7 @@ class EscolaLmsDictionariesServiceProvider extends ServiceProvider
];

public const REPOSITORIES = [
CategoryRepositoryContract::class => CategoryRepository::class,
DictionaryRepositoryContract::class => DictionaryRepository::class,
DictionaryWordRepositoryContract::class => DictionaryWordRepository::class,
];
Expand Down
10 changes: 5 additions & 5 deletions src/Http/Controllers/DictionaryWordAdminApiController.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@

use EscolaLms\Core\Http\Controllers\EscolaLmsBaseController;
use EscolaLms\Dictionaries\Http\Controllers\Swagger\DictionaryWordAdminApiControllerSwagger;
use EscolaLms\Dictionaries\Http\Requests\DictionaryWord\CreateDictionaryWordRequest;
use EscolaLms\Dictionaries\Http\Requests\DictionaryWord\DeleteDictionaryWordRequest;
use EscolaLms\Dictionaries\Http\Requests\DictionaryWord\ListDictionaryWordRequest;
use EscolaLms\Dictionaries\Http\Requests\DictionaryWord\ReadDictionaryWordRequest;
use EscolaLms\Dictionaries\Http\Requests\DictionaryWord\UpdateDictionaryWordRequest;
use EscolaLms\Dictionaries\Http\Requests\DictionaryWord\Admin\CreateDictionaryWordRequest;
use EscolaLms\Dictionaries\Http\Requests\DictionaryWord\Admin\DeleteDictionaryWordRequest;
use EscolaLms\Dictionaries\Http\Requests\DictionaryWord\Admin\ListDictionaryWordRequest;
use EscolaLms\Dictionaries\Http\Requests\DictionaryWord\Admin\ReadDictionaryWordRequest;
use EscolaLms\Dictionaries\Http\Requests\DictionaryWord\Admin\UpdateDictionaryWordRequest;
use EscolaLms\Dictionaries\Http\Resources\DictionaryWordResource;
use EscolaLms\Dictionaries\Http\Resources\DictionaryWordSimpleResource;
use EscolaLms\Dictionaries\Services\Contracts\DictionaryWordServiceContract;
Expand Down
33 changes: 33 additions & 0 deletions src/Http/Controllers/DictionaryWordApiController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<?php

namespace EscolaLms\Dictionaries\Http\Controllers;

use EscolaLms\Core\Http\Controllers\EscolaLmsBaseController;
use EscolaLms\Dictionaries\Http\Controllers\Swagger\DictionaryWordApiControllerSwagger;
use EscolaLms\Dictionaries\Http\Requests\DictionaryWord\ListDictionaryWordRequest;
use EscolaLms\Dictionaries\Http\Resources\CategorySimpleResource;
use EscolaLms\Dictionaries\Http\Resources\DictionaryWordSimpleResource;
use EscolaLms\Dictionaries\Services\Contracts\DictionaryWordServiceContract;
use Illuminate\Http\JsonResponse;

class DictionaryWordApiController extends EscolaLmsBaseController implements DictionaryWordApiControllerSwagger
{

public function __construct(private readonly DictionaryWordServiceContract $dictionaryWordService)
{
}

public function index(ListDictionaryWordRequest $request): JsonResponse
{
$results = $this->dictionaryWordService->list($request->getCriteria(), $request->getPage(), $request->getOrder());

return $this->sendResponseForResource(DictionaryWordSimpleResource::collection($results));
}

public function categories(ListDictionaryWordRequest $request): JsonResponse
{
$result = $this->dictionaryWordService->categories($request->getCriteria());

return $this->sendResponseForResource(CategorySimpleResource::collection($result));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@

namespace EscolaLms\Dictionaries\Http\Controllers\Swagger;

use EscolaLms\Dictionaries\Http\Requests\DictionaryWord\CreateDictionaryWordRequest;
use EscolaLms\Dictionaries\Http\Requests\DictionaryWord\DeleteDictionaryWordRequest;
use EscolaLms\Dictionaries\Http\Requests\DictionaryWord\ListDictionaryWordRequest;
use EscolaLms\Dictionaries\Http\Requests\DictionaryWord\ReadDictionaryWordRequest;
use EscolaLms\Dictionaries\Http\Requests\DictionaryWord\UpdateDictionaryWordRequest;
use EscolaLms\Dictionaries\Http\Requests\DictionaryWord\Admin\CreateDictionaryWordRequest;
use EscolaLms\Dictionaries\Http\Requests\DictionaryWord\Admin\DeleteDictionaryWordRequest;
use EscolaLms\Dictionaries\Http\Requests\DictionaryWord\Admin\ListDictionaryWordRequest;
use EscolaLms\Dictionaries\Http\Requests\DictionaryWord\Admin\ReadDictionaryWordRequest;
use EscolaLms\Dictionaries\Http\Requests\DictionaryWord\Admin\UpdateDictionaryWordRequest;
use Illuminate\Http\JsonResponse;

interface DictionaryWordAdminApiControllerSwagger
Expand Down
125 changes: 125 additions & 0 deletions src/Http/Controllers/Swagger/DictionaryWordApiControllerSwagger.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
<?php

namespace EscolaLms\Dictionaries\Http\Controllers\Swagger;

use EscolaLms\Dictionaries\Http\Requests\DictionaryWord\ListDictionaryWordRequest;
use Illuminate\Http\JsonResponse;

interface DictionaryWordApiControllerSwagger
{
/**
* @OA\Get(
* path="/api/dictionaries/{slug}/words",
* summary="Get a listing of the Dictionary Word",
* tags={"Dictionaries"},
* @OA\Parameter(
* name="slug",
* required=true,
* in="path",
* @OA\Schema(
* type="string",
* ),
* ),
* @OA\Parameter(
* name="word",
* description="word %LIKE%",
* required=false,
* in="query",
* @OA\Schema(
* type="string",
* ),
* ),
* @OA\Parameter(
* name="category_ids[]",
* required=false,
* in="query",
* @OA\Schema(
* type="array",
* @OA\Items(type="number")
* ),
* ),
* @OA\Response(
* response=200,
* description="successful operation",
* @OA\MediaType(
* mediaType="application/json",
* @OA\Schema(
* type="object",
* @OA\Property(
* property="success",
* type="boolean"
* ),
* @OA\Property(
* property="data",
* type="array",
* @OA\Items(ref="#/components/schemas/DictionaryWordSimpleResource")
* ),
* @OA\Property(
* property="message",
* type="string"
* )
* )
* )
* )
* )
*/
public function index(ListDictionaryWordRequest $request): JsonResponse;

/**
* @OA\Get(
* path="/api/dictionaries/{slug}/words/categories",
* summary="Get the categories used in the dictionary for a given slug",
* tags={"Dictionaries"},
* @OA\Parameter(
* name="slug",
* required=true,
* in="path",
* @OA\Schema(
* type="string",
* ),
* ),
* @OA\Parameter(
* name="word",
* description="word %LIKE%",
* required=false,
* in="query",
* @OA\Schema(
* type="string",
* ),
* ),
* @OA\Parameter(
* name="category_ids[]",
* required=false,
* in="query",
* @OA\Schema(
* type="array",
* @OA\Items(type="number")
* ),
* ),
* @OA\Response(
* response=200,
* description="successful operation",
* @OA\MediaType(
* mediaType="application/json",
* @OA\Schema(
* type="object",
* @OA\Property(
* property="success",
* type="boolean"
* ),
* @OA\Property(
* property="data",
* type="array",
* @OA\Items(ref="#/components/schemas/DictionaryWordCategorySimpleResource")
* ),
* @OA\Property(
* property="message",
* type="string"
* )
* )
* )
* )
* )
*/
public function categories(ListDictionaryWordRequest $request): JsonResponse;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
<?php

namespace EscolaLms\Dictionaries\Http\Requests\DictionaryWord\Admin;

use EscolaLms\Dictionaries\Dtos\DictionaryWordDto;
use EscolaLms\Dictionaries\Models\DictionaryWord;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Facades\Gate;

/**
* @OA\Schema(
* schema="CreateDictionaryWordRequest",
* required={"word", "dictionary_id"},
* @OA\Property(
* property="word",
* type="string"
* ),
* @OA\Property(
* property="dictionary_id",
* type="integer"
* ),
* @OA\Property(
* property="description",
* type="string"
* ),
* @OA\Property(
* property="data",
* type="object"
* ),
* @OA\Property(
* property="categories",
* description="categories",
* type="array",
* @OA\Items(
* type="integer",
* )
* ),
* )
*
*/
class CreateDictionaryWordRequest extends FormRequest
{
public function authorize(): bool
{
return Gate::allows('create', DictionaryWord::class);
}

public function rules(): array
{
return [
'word' => ['required', 'string', 'max:255'],
'dictionary_id' => ['required', 'integer', 'exists:dictionaries,id'],
'description' => ['nullable', 'string'],
'data' => ['nullable', 'array'],
'categories' => ['nullable', 'array'],
'categories.*' => ['integer', 'exists:categories,id'],
];
}


public function toDto(): DictionaryWordDto
{
return DictionaryWordDto::instantiateFromRequest($this);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?php

namespace EscolaLms\Dictionaries\Http\Requests\DictionaryWord\Admin;

use EscolaLms\Dictionaries\Models\DictionaryWord;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Facades\Gate;

class DeleteDictionaryWordRequest extends FormRequest
{
public function authorize(): bool
{
return Gate::allows('delete', $this->getDictionaryWord());
}

public function getDictionaryWord(): DictionaryWord
{
return DictionaryWord::findOrFail($this->route('id'));
}
}

0 comments on commit 6c24145

Please sign in to comment.