Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
102 changes: 102 additions & 0 deletions app/Http/Api/Controllers/AuthorController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
<?php

namespace App\Http\Api\Controllers;

use App\Http\Api\Requests\AuthorListRequest;
use App\Http\Api\Requests\StoreAuthorRequest;
use App\Http\Api\Requests\UpdateAuthorRequest;
use App\Http\Api\Resources\AuthorResource;
use App\Http\Controllers\Controller;
use App\Models\Author;
use App\Repositories\Parameters\FindAuthorParameters;
use App\Repositories\AuthorRepository;
use App\Repositories\Parameters\StoreAuthorParameters;
use App\Repositories\Parameters\UpdateAuthorParameters;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
use Symfony\Component\HttpFoundation\Response as HttpFoundationResponse;
use Throwable;

class AuthorController extends Controller
{
public function index(AuthorListRequest $request): AnonymousResourceCollection
{
$data = $request->validated();

$parameters = new FindAuthorParameters(
name: $data['name'] ?? null,
sort: $data['sort'] ?? null,
page: $data['page'] ?? null,
perPage: $data['perPage'] ?? null,
withSongsCount: true
);

$repository = app(AuthorRepository::class);

$authors = $repository->find($parameters);

return AuthorResource::collection($authors);
}

public function show(Author $author): AuthorResource
{
$author->loadCount('songs');

return new AuthorResource($author);
}

public function store(StoreAuthorRequest $request): AuthorResource
{
$data = $request->validated();

$parameters = new StoreAuthorParameters(
name: $data['name'],
foundationYear: $data['foundation_year'],
website: $data['website'] ?? null
);

$repository = app(AuthorRepository::class);

try {
$author = $repository->store($parameters);
} catch (Throwable $exception) {
abort(HttpFoundationResponse::HTTP_INTERNAL_SERVER_ERROR, $exception->getMessage());
}

return new AuthorResource($author);
}

public function update(UpdateAuthorRequest $request, Author $author): AuthorResource
{
$data = $request->validated();

$parameters = new UpdateAuthorParameters(
name: $data['name'] ?? null,
foundationYear: $data['foundation_year'] ?? null,
website: $data['website'] ?? null
);

$repository = app(AuthorRepository::class);

try {
$author = $repository->update($author, $parameters);
} catch (Throwable $exception) {
abort(HttpFoundationResponse::HTTP_INTERNAL_SERVER_ERROR, $exception->getMessage());
}

return new AuthorResource($author);
}

public function delete(Author $author): JsonResponse
{
$repository = app(AuthorRepository::class);

try {
$repository->delete($author);
} catch (Throwable $exception) {
abort(HttpFoundationResponse::HTTP_INTERNAL_SERVER_ERROR, $exception->getMessage());
}

return response()->json(['message' => __('messages.deleted_successfully')]);
}
}
111 changes: 111 additions & 0 deletions app/Http/Api/Controllers/SongController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
<?php

namespace App\Http\Api\Controllers;

use App\Http\Api\Requests\StoreSongRequest;
use App\Http\Api\Requests\UpdateSongRequest;
use App\Http\Api\Resources\SongResource;
use App\Http\Controllers\Controller;
use App\Http\Api\Requests\SongListRequest;
use App\Models\Song;
use App\Repositories\Parameters\FindSongParameters;
use App\Repositories\Parameters\StoreSongParameters;
use App\Repositories\Parameters\UpdateSongParameters;
use App\Repositories\SongRepository;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
use Symfony\Component\HttpFoundation\Response as HttpFoundationResponse;
use Throwable;

class SongController extends Controller
{
public function index(SongListRequest $request): AnonymousResourceCollection
{
$data = $request->validated();

$parameters = new FindSongParameters(
title: $data['title'] ?? null,
authorId: $data['author_id'] ?? null,
albumId: $data['album_id'] ?? null,
sort: $data['sort'] ?? null,
page: $data['page'] ?? 1,
perPage: $data['per_page'] ?? 10,
withGenre: true
);

$repository = app(SongRepository::class);

$songs = $repository->find($parameters);

return SongResource::collection($songs);
}

public function show(Song $song): SongResource
{
$song->load('genre');

return new SongResource($song);
}

public function store(StoreSongRequest $request): SongResource
{
$data = $request->validated();

$parameters = new StoreSongParameters(
title: $data['title'],
durationInSeconds: $data['duration_in_seconds'],
authorId: $data['author_id'],
albumId: $data['album_id'],
genreId: $data['genre_id']
);

$repository = app(SongRepository::class);

try {
$song = $repository->store($parameters);
} catch (Throwable $exception) {
abort(HttpFoundationResponse::HTTP_INTERNAL_SERVER_ERROR, $exception->getMessage());
}

return new SongResource($song);
}

public function update(UpdateSongRequest $request, Song $song): SongResource
{
$data = $request->validated();

$parameters = new UpdateSongParameters(
title: $data['title'] ?? null,
durationInSeconds: $data['duration_in_seconds'] ?? null,
authorId: $data['author_id'] ?? null,
albumId: $data['album_id'] ?? null,
genreId: $data['genre_id'] ?? null
);

$repository = app(SongRepository::class);

try {
$song = $repository->update(
song: $song,
parameters: $parameters
);
} catch (Throwable $exception) {
abort(HttpFoundationResponse::HTTP_INTERNAL_SERVER_ERROR, $exception->getMessage());
}

return new SongResource($song);
}

public function delete(Song $song): JsonResponse
{
$repository = app(SongRepository::class);

try {
$repository->delete($song);
} catch (Throwable $exception) {
abort(HttpFoundationResponse::HTTP_INTERNAL_SERVER_ERROR, $exception->getMessage());
}

return response()->json(['message' => __('messages.deleted_successfully')]);
}
}
34 changes: 34 additions & 0 deletions app/Http/Api/Requests/AuthorListRequest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<?php

namespace App\Http\Api\Requests;

use Illuminate\Foundation\Http\FormRequest;

class AuthorListRequest extends FormRequest
{
public function rules(): array
{
return [
'name' => [
'sometimes',
'string',
],
'sort' => [
'sometimes',
'string',
'in:songs_count,foundation_year',
],
'page' => [
'sometimes',
'integer',
'min:1',
],
'per_page' => [
'sometimes',
'integer',
'min:10',
'max:25',
],
];
}
}
46 changes: 46 additions & 0 deletions app/Http/Api/Requests/SongListRequest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
<?php

namespace App\Http\Api\Requests;

use App\Models\Album;
use App\Models\Author;
use Illuminate\Foundation\Http\FormRequest;

class SongListRequest extends FormRequest
{
public function rules(): array
{
return [
'title' => [
'sometimes',
'string',
],
'author_id' => [
'sometimes',
'integer',
'exists:' . Author::class . ',id',
],
'album_id' => [
'sometimes',
'integer',
'exists:' . Album::class . ',id',
],
'sort' => [
'sometimes',
'string',
'in:title,duration_in_seconds,genre_id',
],
'page' => [
'sometimes',
'integer',
'min:1',
],
'per_page' => [
'sometimes',
'integer',
'min:10',
'max:25',
],
];
}
}
29 changes: 29 additions & 0 deletions app/Http/Api/Requests/StoreAuthorRequest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

namespace App\Http\Api\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Carbon;

class StoreAuthorRequest extends FormRequest
{
public function rules(): array
{
return [
'name' => [
'required',
'string',
],
'foundation_year' => [
'required',
'integer',
'min:1700',
'max:' . Carbon::now()->year,
],
'website' => [
'sometimes',
'url'
],
];
}
}
41 changes: 41 additions & 0 deletions app/Http/Api/Requests/StoreSongRequest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
<?php

namespace App\Http\Api\Requests;

use App\Models\Album;
use App\Models\Author;
use App\Models\Genre;
use Illuminate\Foundation\Http\FormRequest;

class StoreSongRequest extends FormRequest
{
public function rules(): array
{
return [
'title' => [
'required',
'string',
],
'duration_in_seconds' => [
'required',
'integer',
'min:1'
],
'author_id' => [
'required',
'integer',
'exists:' . Author::class . ',id',
],
'album_id' => [
'required',
'integer',
'exists:' . Album::class . ',id',
],
'genre_id' => [
'required',
'integer',
'exists:' . Genre::class . ',id',
],
];
}
}
29 changes: 29 additions & 0 deletions app/Http/Api/Requests/UpdateAuthorRequest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

namespace App\Http\Api\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Carbon;

class UpdateAuthorRequest extends FormRequest
{
public function rules(): array
{
return [
'name' => [
'sometimes',
'string',
],
'foundation_year' => [
'sometimes',
'integer',
'min:1700',
'max:' . Carbon::now()->year,
],
'website' => [
'sometimes',
'url'
],
];
}
}
Loading