This commit is contained in:
2023-03-12 15:39:43 +10:00
parent 615abcc8e3
commit c18b740f46
16 changed files with 358 additions and 313 deletions

View File

@@ -2,6 +2,8 @@
namespace App\Conductors; namespace App\Conductors;
use Illuminate\Database\Eloquent\Model;
class SubscriptionConductor extends Conductor class SubscriptionConductor extends Conductor
{ {
/** /**
@@ -9,4 +11,29 @@ class SubscriptionConductor extends Conductor
* @var string * @var string
*/ */
protected $class = '\App\Models\Subscription'; protected $class = '\App\Models\Subscription';
/**
* Return if the current model is updatable.
*
* @param Model $model The model.
* @return boolean Allow updating model.
*/
public static function updatable(Model $model)
{
$user = auth()->user();
return ($user !== null && ((strcasecmp($model->email, $user->email) === 0 && $user->email_verified_at !== null) || $user->has_permission('admin/subscriptions') === true));
}
/**
* Return if the current model is deletable.
*
* @param Model $model The model.
* @return boolean Allow deleting model.
*/
public static function deletable(Model $model)
{
$user = auth()->user();
return ($user !== null && ((strcasecmp($model->email, $user->email) === 0 && $user->email_verified_at !== null) || $user->has_permission('admin/subscriptions') === true));
}
} }

View File

@@ -0,0 +1,30 @@
<?php
namespace App\Filters;
use App\Models\Subscriber;
class SubscriptionFilter extends FilterAbstract
{
/**
* The model class to filter
*
* @var mixed
*/
protected $class = '\App\Models\Subscription';
/**
* Return an array of attributes visible in the results
*
* @param array $attributes Attributes currently visible.
* @param User|null $user Current logged in user or null.
* @return mixed
*/
protected function seeAttributes(array $attributes, mixed $user)
{
if ($user?->hasPermission('admin/users') !== true) {
return ['id', 'email', 'confirmed_at'];
}
}
}

View File

@@ -3,9 +3,9 @@
namespace App\Http\Controllers\Api; namespace App\Http\Controllers\Api;
use App\Enum\HttpResponseCodes; use App\Enum\HttpResponseCodes;
use App\Http\Requests\EventRequest;
use App\Models\Event; use App\Models\Event;
use App\Conductors\EventConductor; use App\Conductors\EventConductor;
use App\Http\Requests\EventRequest;
use Illuminate\Http\Request; use Illuminate\Http\Request;
class EventController extends ApiController class EventController extends ApiController
@@ -22,7 +22,7 @@ class EventController extends ApiController
/** /**
* Display a listing of the resource. * Display a listing of the resource.
* *
* @param Request $request The request. * @param \Illuminate\Http\Request $request The endpoint request.
* @return \Illuminate\Http\Response * @return \Illuminate\Http\Response
*/ */
public function index(Request $request) public function index(Request $request)
@@ -36,14 +36,30 @@ class EventController extends ApiController
} }
/** /**
* Store a newly created resource in storage. * Display the specified resource.
* *
* @param Request $request The request. * @param \Illuminate\Http\Request $request The endpoint request.
* @param \App\Models\Event $event The specified event.
* @return \Illuminate\Http\Response * @return \Illuminate\Http\Response
*/ */
public function store(Request $request) public function show(Request $request, Event $event)
{ {
if(EventConductor::creatable()) { if (EventConductor::viewable($event) === true) {
return $this->respondAsResource(EventConductor::model($request, $event));
}
return $this->respondForbidden();
}
/**
* Store a newly created resource in storage.
*
* @param \App\Http\Requests\EventRequest $request The request.
* @return \Illuminate\Http\Response
*/
public function store(EventRequest $request)
{
if (EventConductor::creatable() === true) {
$event = Event::create($request->all()); $event = Event::create($request->all());
return $this->respondAsResource( return $this->respondAsResource(
EventConductor::model($request, $event), EventConductor::model($request, $event),
@@ -56,38 +72,22 @@ class EventController extends ApiController
} }
/** /**
* Display the specified resource. * Update the specified resource in storage.
* *
* @param Request $request The request. * @param \App\Http\Requests\EventRequest $request The endpoint request.
* @param \App\Models\Event $event The specified event. * @param \App\Models\Event $event The specified event.
* @return \Illuminate\Http\Response * @return \Illuminate\Http\Response
*/ */
public function show(Request $request, Event $event) public function update(EventRequest $request, Event $event)
{ {
if(EventConductor::viewable($event)) { if (EventConductor::updatable($event) === true) {
$event->update($request->all());
return $this->respondAsResource(EventConductor::model($request, $event)); return $this->respondAsResource(EventConductor::model($request, $event));
} }
return $this->respondForbidden(); return $this->respondForbidden();
} }
/**
* Update the specified resource in storage.
*
* @param Request $request The request.
* @param \App\Models\Event $event The specified event.
* @return \Illuminate\Http\Response
*/
public function update(Request $request, Event $event)
{
if(EventConductor::updatable($event)) {
$event->update($request->all());
return $this->respondAsResource(EventConductor::model($request, $event));
} else {
return $this->respondForbidden();
}
}
/** /**
* Remove the specified resource from storage. * Remove the specified resource from storage.
* *
@@ -96,7 +96,7 @@ class EventController extends ApiController
*/ */
public function destroy(Event $event) public function destroy(Event $event)
{ {
if(EventConductor::destroyable($event)) { if (EventConductor::destroyable($event) === true) {
$event->delete(); $event->delete();
return $this->respondNoContent(); return $this->respondNoContent();
} else { } else {

View File

@@ -2,14 +2,12 @@
namespace App\Http\Controllers\Api; namespace App\Http\Controllers\Api;
use App\Conductors\MediaConductor;
use App\Enum\HttpResponseCodes; use App\Enum\HttpResponseCodes;
use App\Filters\MediaFilter; use App\Http\Requests\MediaRequest;
use App\Http\Requests\MediaStoreRequest;
use App\Http\Requests\MediaUpdateRequest;
use App\Models\Media; use App\Models\Media;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Carbon; use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Storage;
use Laravel\Sanctum\PersonalAccessToken; use Laravel\Sanctum\PersonalAccessToken;
class MediaController extends ApiController class MediaController extends ApiController
@@ -26,99 +24,67 @@ class MediaController extends ApiController
/** /**
* Display a listing of the resource. * Display a listing of the resource.
* *
* @param \App\Filters\MediaFilter $filter Created filter object. * @param \Illuminate\Http\Request $request The endpoint request.
* @return \Illuminate\Http\Response * @return \Illuminate\Http\Response
*/ */
public function index(MediaFilter $filter) public function index(Request $request)
{ {
list($collection, $total) = MediaConductor::request($request);
return $this->respondAsResource( return $this->respondAsResource(
$filter->filter(), $collection,
['total' => $filter->foundTotal()] ['total' => $total]
); );
} }
/** /**
* Display the specified resource. * Display the specified resource.
* *
* @param MediaFilter $filter The request filter. * @param \Illuminate\Http\Request $request The endpoint request.
* @param Media $medium The request media. * @param \App\Models\Media $medium The request media.
* @return \Illuminate\Http\Response * @return \Illuminate\Http\Response
*/ */
public function show(MediaFilter $filter, Media $medium) public function show(Request $request, Media $medium)
{ {
return $this->respondAsResource($filter->filter($medium)); if (MediaConductor::viewable($medium) === true) {
return $this->respondAsResource(MediaConductor::model($request, $medium));
}
return $this->respondForbidden();
} }
/** /**
* Store a new media resource * Store a new media resource
* *
* @param MediaStoreRequest $request The uploaded media. * @param \App\Http\Requests\MediaRequest $request The uploaded media.
* @return \Illuminate\Http\Response * @return \Illuminate\Http\Response
*/ */
public function store(MediaStoreRequest $request) public function store(MediaRequest $request)
{ {
$file = $request->file('file'); if (MediaConductor::creatable() === true) {
if ($file === null) { $file = $request->file('file');
return $this->respondWithErrors(['file' => 'The browser did not upload the file correctly to the server.']); if ($file === null) {
} return $this->respondWithErrors(['file' => 'The browser did not upload the file correctly to the server.']);
if ($file->isValid() !== true) {
switch ($file->getError()) {
case UPLOAD_ERR_INI_SIZE:
case UPLOAD_ERR_FORM_SIZE:
return $this->respondTooLarge();
case UPLOAD_ERR_PARTIAL:
return $this->respondWithErrors(['file' => 'The file upload was interrupted.']);
default:
return $this->respondWithErrors(['file' => 'An error occurred uploading the file to the server.']);
} }
}
if ($file->getSize() > Media::maxUploadSize()) { if ($file->isValid() !== true) {
return $this->respondTooLarge(); switch ($file->getError()) {
} case UPLOAD_ERR_INI_SIZE:
case UPLOAD_ERR_FORM_SIZE:
return $this->respondTooLarge();
case UPLOAD_ERR_PARTIAL:
return $this->respondWithErrors(['file' => 'The file upload was interrupted.']);
default:
return $this->respondWithErrors(['file' => 'An error occurred uploading the file to the server.']);
}
}
$title = $file->getClientOriginalName();
$mime = $file->getMimeType();
$fileInfo = Media::store($file, empty($request->input('permission')));
if ($fileInfo === null) {
return $this->respondWithErrors(
['file' => 'The file could not be stored on the server'],
HttpResponseCodes::HTTP_INTERNAL_SERVER_ERROR
);
}
$request->merge([
'title' => $title,
'mime' => $mime,
'name' => $fileInfo['name'],
'size' => filesize($fileInfo['path'])
]);
$media = $request->user()->media()->create($request->all());
return $this->respondAsResource((new MediaFilter($request))->filter($media));
}
/**
* Update the media resource in storage.
*
* @param MediaUpdateRequest $request The update request.
* @param \App\Models\Media $medium The specified media.
* @return \Illuminate\Http\Response
*/
public function update(MediaUpdateRequest $request, Media $medium)
{
if ((new MediaFilter($request))->filter($medium) === null) {
return $this->respondNotFound();
}
$file = $request->file('file');
if ($file !== null) {
if ($file->getSize() > Media::maxUploadSize()) { if ($file->getSize() > Media::maxUploadSize()) {
return $this->respondTooLarge(); return $this->respondTooLarge();
} }
$oldPath = $medium->path(); $title = $file->getClientOriginalName();
$mime = $file->getMimeType();
$fileInfo = Media::store($file, empty($request->input('permission'))); $fileInfo = Media::store($file, empty($request->input('permission')));
if ($fileInfo === null) { if ($fileInfo === null) {
return $this->respondWithErrors( return $this->respondWithErrors(
@@ -127,34 +93,77 @@ class MediaController extends ApiController
); );
} }
if (file_exists($oldPath) === true) {
unlink($oldPath);
}
$request->merge([ $request->merge([
'title' => $file->getClientOriginalName(), 'title' => $title,
'mime' => $file->getMimeType(), 'mime' => $mime,
'name' => $fileInfo['name'], 'name' => $fileInfo['name'],
'size' => filesize($fileInfo['path']) 'size' => filesize($fileInfo['path'])
]); ]);
$media = $request->user()->media()->create($request->all());
return $this->respondAsResource(
MediaConductor::model($request, $media),
null,
HttpResponseCodes::HTTP_CREATED
);
}//end if }//end if
$medium->update($request->all()); return $this->respondForbidden();
return $this->respondWithTransformer($file);
} }
/**
* Update the media resource in storage.
*
* @param \App\Http\Requests\MediaRequest $request The update request.
* @param \App\Models\Media $medium The specified media.
* @return \Illuminate\Http\Response
*/
public function update(MediaRequest $request, Media $medium)
{
if (MediaConductor::updatable($medium) === true) {
$file = $request->file('file');
if ($file !== null) {
if ($file->getSize() > Media::maxUploadSize()) {
return $this->respondTooLarge();
}
$oldPath = $medium->path();
$fileInfo = Media::store($file, empty($request->input('permission')));
if ($fileInfo === null) {
return $this->respondWithErrors(
['file' => 'The file could not be stored on the server'],
HttpResponseCodes::HTTP_INTERNAL_SERVER_ERROR
);
}
if (file_exists($oldPath) === true) {
unlink($oldPath);
}
$request->merge([
'title' => $file->getClientOriginalName(),
'mime' => $file->getMimeType(),
'name' => $fileInfo['name'],
'size' => filesize($fileInfo['path'])
]);
}//end if
$medium->update($request->all());
return $this->respondAsResource(MediaConductor::model($request, $medium));
}//end if
return $this->respondForbidden();
}
/** /**
* Remove the specified resource from storage. * Remove the specified resource from storage.
* *
* @param Request $request Request instance. * @param \App\Models\Media $medium Specified media file.
* @param \App\Models\Media $medium Specified media file.
* @return \Illuminate\Http\Response * @return \Illuminate\Http\Response
*/ */
public function destroy(Request $request, Media $medium) public function destroy(Media $medium)
{ {
if ((new MediaFilter($request))->filter($medium) !== null) { if (MediaConductor::destroyable($medium) === true) {
if (file_exists($medium->path()) === true) { if (file_exists($medium->path()) === true) {
unlink($medium->path()); unlink($medium->path());
} }
@@ -163,14 +172,14 @@ class MediaController extends ApiController
return $this->respondNoContent(); return $this->respondNoContent();
} }
return $this->respondNotFound(); return $this->respondForbidden();
} }
/** /**
* Display the specified resource. * Display the specified resource.
* *
* @param Request $request Request instance. * @param \Illuminate\Http\Request $request The endpoint request.
* @param \App\Models\Media $medium Specified media. * @param \App\Models\Media $medium Specified media.
* @return \Illuminate\Http\Response * @return \Illuminate\Http\Response
*/ */
public function download(Request $request, Media $medium) public function download(Request $request, Media $medium)

View File

@@ -2,10 +2,9 @@
namespace App\Http\Controllers\Api; namespace App\Http\Controllers\Api;
use App\Conductors\PostConductor;
use App\Enum\HttpResponseCodes; use App\Enum\HttpResponseCodes;
use App\Filters\PostFilter; use App\Http\Requests\PostRequest;
use App\Http\Requests\PostStoreRequest;
use App\Http\Requests\PostUpdateRequest;
use App\Models\Post; use App\Models\Post;
use Illuminate\Http\Request; use Illuminate\Http\Request;
@@ -27,56 +26,70 @@ class PostController extends ApiController
/** /**
* Display a listing of the resource. * Display a listing of the resource.
* *
* @param \App\Filters\PostFilter $filter Post filter request. * @param \Illuminate\Http\Request $request The endpoint request.
* @return \Illuminate\Http\Response * @return \Illuminate\Http\Response
*/ */
public function index(PostFilter $filter) public function index(Request $request)
{ {
list($collection, $total) = PostConductor::request($request);
return $this->respondAsResource( return $this->respondAsResource(
$filter->filter(), $collection,
['total' => $filter->foundTotal()] ['total' => $total]
); );
} }
/** /**
* Display the specified resource. * Display the specified resource.
* *
* @param PostFilter $filter The filter request. * @param \Illuminate\Http\Request $request The endpoint request.
* @param \App\Models\Post $post The post model. * @param \App\Models\Post $post The post model.
* @return \Illuminate\Http\Response * @return \Illuminate\Http\Response
*/ */
public function show(PostFilter $filter, Post $post) public function show(Request $request, Post $post)
{ {
return $this->respondAsResource($filter->filter($post)); if (PostConductor::viewable($post) === true) {
return $this->respondAsResource(PostConductor::model($request, $post));
}
return $this->respondForbidden();
} }
/** /**
* Store a newly created resource in storage. * Store a newly created resource in storage.
* *
* @param PostStoreRequest $request The post store request. * @param \App\Http\Requests\PostRequest $request The user request.
* @return \Illuminate\Http\Response * @return \Illuminate\Http\Response
*/ */
public function store(PostStoreRequest $request) public function store(PostRequest $request)
{ {
$post = Post::create($request->all()); if (PostConductor::creatable() === true) {
return $this->respondAsResource( $post = Post::create($request->all());
(new PostFilter($request))->filter($post), return $this->respondAsResource(
null, PostConductor::model($request, $post),
HttpResponseCodes::HTTP_CREATED null,
); HttpResponseCodes::HTTP_CREATED
);
} else {
return $this->respondForbidden();
}
} }
/** /**
* Update the specified resource in storage. * Update the specified resource in storage.
* *
* @param PostUpdateRequest $request The post update request. * @param \App\Http\Requests\PostRequest $request The post update request.
* @param \App\Models\Post $post The specified post. * @param \App\Models\Post $post The specified post.
* @return \Illuminate\Http\Response * @return \Illuminate\Http\Response
*/ */
public function update(PostUpdateRequest $request, Post $post) public function update(PostRequest $request, Post $post)
{ {
$post->update($request->all()); if (PostConductor::updatable($post) === true) {
return $this->respondAsResource((new PostFilter($request))->filter($post)); $post->update($request->all());
return $this->respondAsResource(PostConductor::model($request, $post));
}
return $this->respondForbidden();
} }
/** /**
@@ -87,7 +100,11 @@ class PostController extends ApiController
*/ */
public function destroy(Post $post) public function destroy(Post $post)
{ {
$post->delete(); if (PostConductor::destroyable($post) === true) {
return $this->respondNoContent(); $post->delete();
return $this->respondNoContent();
} else {
return $this->respondForbidden();
}
} }
} }

View File

@@ -2,12 +2,14 @@
namespace App\Http\Controllers\Api; namespace App\Http\Controllers\Api;
use App\Conductors\SubscriptionConductor;
use App\Enum\HttpResponseCodes;
use App\Models\Subscription; use App\Models\Subscription;
use App\Filters\SubscriptionFilter;
use App\Http\Requests\SubscriptionRequest; use App\Http\Requests\SubscriptionRequest;
use App\Jobs\SendEmailJob; use App\Jobs\SendEmailJob;
use App\Mail\SubscriptionConfirm; use App\Mail\SubscriptionConfirm;
use App\Mail\SubscriptionUnsubscribed; use App\Mail\SubscriptionUnsubscribed;
use Illuminate\Http\Request;
class SubscriptionController extends ApiController class SubscriptionController extends ApiController
{ {
@@ -23,58 +25,70 @@ class SubscriptionController extends ApiController
/** /**
* Display a listing of subscribers. * Display a listing of subscribers.
* *
* @param \App\Filters\SubscriptionFilter $filter Filter object. * @param \Illuminate\Http\Request $request The endpoint request.
* @return \Illuminate\Http\Response * @return \Illuminate\Http\Response
*/ */
public function index(SubscriptionFilter $filter) public function index(Request $request)
{ {
$collection = $filter->filter(); list($collection, $total) = SubscriptionConductor::request($request);
return $this->respondAsResource( return $this->respondAsResource(
$collection, $collection,
['total' => $filter->foundTotal()] ['total' => $total]
); );
} }
/**
* Display the specified user.
*
* @param \Illuminate\Http\Request $request The endpoint request.
* @param \App\Models\Subscription $subscription The subscription model.
* @return \Illuminate\Http\Response
*/
public function show(Request $request, Subscription $subscription)
{
if (SubscriptionConductor::viewable($subscription) === true) {
return $this->respondAsResource(SubscriptionConductor::model($request, $subscription));
}
return $this->respondForbidden();
}
/** /**
* Store a subscriber email in the database. * Store a subscriber email in the database.
* *
* @param SubscriptionRequest $request The subscriber update request. * @param \App\Http\Requests\SubscriptionRequest $request The subscriber update request.
* @return \Illuminate\Http\Response * @return \Illuminate\Http\Response
*/ */
public function store(SubscriptionRequest $request) public function store(SubscriptionRequest $request)
{ {
if (Subscription::where('email', $request->email)->first() !== null) { if (SubscriptionConductor::creatable() === true) {
return $this->respondWithErrors(['email' => 'This email address has already subscribed']); Subscription::create($request->all());
dispatch((new SendEmailJob($request->email, new SubscriptionConfirm($request->email))))->onQueue('mail');
return $this->respondCreated();
} else {
return $this->respondForbidden();
} }
Subscription::create($request->all());
dispatch((new SendEmailJob($request->email, new SubscriptionConfirm($request->email))))->onQueue('mail');
return $this->respondCreated();
}
/**
* Display the specified user.
*
* @param SubscriptionFilter $filter The subscription filter.
* @param Subscription $subscription The subscription model.
* @return \Illuminate\Http\Response
*/
public function show(SubscriptionFilter $filter, Subscription $subscription)
{
return $this->respondAsResource($filter->filter($subscription));
} }
/** /**
* Update the specified resource in storage. * Update the specified resource in storage.
* *
* @param SubscriptionRequest $request The subscription update request. * @param \App\Http\Requests\SubscriptionRequest $request The subscription update request.
* @param Subscription $subscription The specified subscription. * @param \App\Models\Subscription $subscription The specified subscription.
* @return \Illuminate\Http\Response * @return \Illuminate\Http\Response
*/ */
public function update(SubscriptionRequest $request, Subscription $subscription) public function update(SubscriptionRequest $request, Subscription $subscription)
{ {
// if (EventConductor::updatable($event) === true) {
// $event->update($request->all());
// return $this->respondAsResource(EventConductor::model($request, $event));
// }
// return $this->respondForbidden();
// $input = []; // $input = [];
// $updatable = ['username', 'first_name', 'last_name', 'email', 'phone', 'password']; // $updatable = ['username', 'first_name', 'last_name', 'email', 'phone', 'password'];
@@ -103,14 +117,12 @@ class SubscriptionController extends ApiController
*/ */
public function destroy(Subscription $subscription) public function destroy(Subscription $subscription)
{ {
// if ($user->hasPermission('admin/user') === false) { if (SubscriptionConductor::destroyable($subscription) === true) {
// return $this->respondForbidden(); $subscription->delete();
// } return $this->respondNoContent();
} else {
$email = $subscription->email; return $this->respondForbidden();
}
$subscription->delete();
return $this->respondNoContent();
} }
/** /**

View File

@@ -49,7 +49,7 @@ class UserController extends ApiController
/** /**
* Display a listing of the resource. * Display a listing of the resource.
* *
* @param Request $request The request. * @param \Illuminate\Http\Request $request The endpoint request.
* @return \Illuminate\Http\Response * @return \Illuminate\Http\Response
*/ */
public function index(Request $request) public function index(Request $request)
@@ -65,12 +65,12 @@ class UserController extends ApiController
/** /**
* Store a newly created user in the database. * Store a newly created user in the database.
* *
* @param Request $request The request. * @param \App\Http\Requests\UserStoreRequest $request The endpoint request.
* @return \Illuminate\Http\Response * @return \Illuminate\Http\Response
*/ */
public function store(Request $request) public function store(UserStoreRequest $request)
{ {
if(UserConductor::creatable()) { if (UserConductor::creatable() === true) {
$user = User::create($request->all()); $user = User::create($request->all());
return $this->respondAsResource(UserConductor::model($request, $user), [], HttpResponseCodes::HTTP_CREATED); return $this->respondAsResource(UserConductor::model($request, $user), [], HttpResponseCodes::HTTP_CREATED);
} else { } else {
@@ -78,18 +78,16 @@ class UserController extends ApiController
} }
} }
/** /**
* Display the specified user. * Display the specified user.
* *
* @param UserFilter $filter The user filter. * @param \Illuminate\Http\Request $request The endpoint request.
* @param User $user The user model. * @param \App\Models\User $user The user model.
* @return \Illuminate\Http\Response * @return \Illuminate\Http\Response
*/ */
// public function show(UserFilter $filter, User $user)
public function show(Request $request, User $user) public function show(Request $request, User $user)
{ {
if(UserConductor::viewable($user)) { if (UserConductor::viewable($user) === true) {
return $this->respondAsResource(UserConductor::model($request, $user)); return $this->respondAsResource(UserConductor::model($request, $user));
} }
@@ -99,13 +97,13 @@ class UserController extends ApiController
/** /**
* Update the specified resource in storage. * Update the specified resource in storage.
* *
* @param UserUpdateRequest $request The user update request. * @param \App\Http\Requests\UserUpdateRequest $request The user update request.
* @param User $user The specified user. * @param \App\Models\User $user The specified user.
* @return \Illuminate\Http\Response * @return \Illuminate\Http\Response
*/ */
public function update(UserUpdateRequest $request, User $user) public function update(UserUpdateRequest $request, User $user)
{ {
if(UserConductor::updatable($user)) { if (UserConductor::updatable($user) === true) {
$input = []; $input = [];
$updatable = ['username', 'first_name', 'last_name', 'email', 'phone', 'password']; $updatable = ['username', 'first_name', 'last_name', 'email', 'phone', 'password'];
@@ -124,16 +122,15 @@ class UserController extends ApiController
} }
} }
/** /**
* Remove the user from the database. * Remove the user from the database.
* *
* @param User $user The specified user. * @param \App\Models\User $user The specified user.
* @return \Illuminate\Http\Response * @return \Illuminate\Http\Response
*/ */
public function destroy(User $user) public function destroy(User $user)
{ {
if(UserConductor::destroyable($user)) { if (UserConductor::destroyable($user) === true) {
$user->delete(); $user->delete();
return $this->respondNoContent(); return $this->respondNoContent();
} }
@@ -144,7 +141,7 @@ class UserController extends ApiController
/** /**
* Register a new user * Register a new user
* *
* @param UserRegisterRequest $request The register user request. * @param \App\Http\Requests\UserRegisterRequest $request The register user request.
* @return \Illuminate\Http\Response * @return \Illuminate\Http\Response
*/ */
public function register(UserRegisterRequest $request) public function register(UserRegisterRequest $request)
@@ -178,7 +175,7 @@ class UserController extends ApiController
/** /**
* Sends an email with all the usernames registered at that address * Sends an email with all the usernames registered at that address
* *
* @param UserForgotUsernameRequest $request The forgot username request. * @param \App\Http\Requests\UserForgotUsernameRequest $request The forgot username request.
* @return \Illuminate\Http\Response * @return \Illuminate\Http\Response
*/ */
public function forgotUsername(UserForgotUsernameRequest $request) public function forgotUsername(UserForgotUsernameRequest $request)
@@ -198,7 +195,7 @@ class UserController extends ApiController
/** /**
* Generates a new reset password code * Generates a new reset password code
* *
* @param UserForgotPasswordRequest $request The reset password request. * @param \App\Http\Requests\UserForgotPasswordRequest $request The reset password request.
* @return \Illuminate\Http\Response * @return \Illuminate\Http\Response
*/ */
public function forgotPassword(UserForgotPasswordRequest $request) public function forgotPassword(UserForgotPasswordRequest $request)
@@ -220,7 +217,7 @@ class UserController extends ApiController
/** /**
* Resets a user password * Resets a user password
* *
* @param UserResetPasswordRequest $request The reset password request. * @param \App\Http\Requests\UserResetPasswordRequest $request The reset password request.
* @return \Illuminate\Http\Response * @return \Illuminate\Http\Response
*/ */
public function resetPassword(UserResetPasswordRequest $request) public function resetPassword(UserResetPasswordRequest $request)
@@ -254,7 +251,7 @@ class UserController extends ApiController
/** /**
* Verify an email code * Verify an email code
* *
* @param UserVerifyEmailRequest $request The verify email request. * @param \App\Http\Requests\UserVerifyEmailRequest $request The verify email request.
* @return \Illuminate\Http\Response * @return \Illuminate\Http\Response
*/ */
public function verifyEmail(UserVerifyEmailRequest $request) public function verifyEmail(UserVerifyEmailRequest $request)
@@ -292,7 +289,7 @@ class UserController extends ApiController
/** /**
* Resend a new verify email * Resend a new verify email
* *
* @param UserResendVerifyEmailRequest $request The resend verify email request. * @param \App\Http\Requests\UserResendVerifyEmailRequest $request The resend verify email request.
* @return \Illuminate\Http\Response * @return \Illuminate\Http\Response
*/ */
public function resendVerifyEmail(UserResendVerifyEmailRequest $request) public function resendVerifyEmail(UserResendVerifyEmailRequest $request)
@@ -319,7 +316,7 @@ class UserController extends ApiController
/** /**
* Resend verification email * Resend verification email
* *
* @param UserResendVerifyEmailRequest $request The resend user request. * @param \App\Http\Requests\UserResendVerifyEmailRequest $request The resend user request.
* @return \Illuminate\Http\Response * @return \Illuminate\Http\Response
*/ */
public function resendVerifyEmailCode(UserResendVerifyEmailRequest $request) public function resendVerifyEmailCode(UserResendVerifyEmailRequest $request)

View File

@@ -14,10 +14,12 @@ class BaseRequest extends FormRequest
*/ */
public function authorize() public function authorize()
{ {
if (method_exists($this, 'postAuthorize') === true && request()->isMethod('post') === true) { if (request()->isMethod('post') === true && method_exists($this, 'postAuthorize') === true) {
return $this->postAuthorize(); return $this->postAuthorize();
} elseif (method_exists($this, 'putAuthorize') === true && request()->isMethod('put') === true) { } elseif ((request()->isMethod('put') === true || request()->isMethod('patch') === true) && method_exists($this, 'putAuthorize') === true) {
return $this->putAuthorize(); return $this->putAuthorize();
} elseif (request()->isMethod('delete') === true && method_exists($this, 'destroyAuthorize') === true) {
return $this->deleteAuthorize();
} }
return true; return true;
@@ -38,7 +40,7 @@ class BaseRequest extends FormRequest
if (method_exists($this, 'postRules') === true && request()->isMethod('post') === true) { if (method_exists($this, 'postRules') === true && request()->isMethod('post') === true) {
$rules = $this->mergeRules($rules, $this->postRules()); $rules = $this->mergeRules($rules, $this->postRules());
} elseif (method_exists($this, 'putRules') === true && request()->isMethod('put') === true) { } elseif (method_exists($this, 'putRules') === true && (request()->isMethod('put') === true || request()->isMethod('patch') === true)) {
$rules = $this->mergeRules($rules, $this->postRules()); $rules = $this->mergeRules($rules, $this->postRules());
} elseif (method_exists($this, 'destroyRules') === true && request()->isMethod('delete') === true) { } elseif (method_exists($this, 'destroyRules') === true && request()->isMethod('delete') === true) {
$rules = $this->mergeRules($rules, $this->destroyRules()); $rules = $this->mergeRules($rules, $this->destroyRules());

View File

@@ -5,28 +5,8 @@ namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest; use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule; use Illuminate\Validation\Rule;
class EventRequest extends BaseRequest class EventStoreRequest extends BaseRequest
{ {
/**
* Determine if the user is authorized to make this request.
*
* @return boolean
*/
public function postAuthorize()
{
return $this->user()?->hasPermission('admin/events');
}
/**
* Determine if the user is authorized to make this request.
*
* @return boolean
*/
public function putAuthorize()
{
return $this->user()?->hasPermission('admin/events');
}
/** /**
* Apply the base rules to this request * Apply the base rules to this request
* *

View File

@@ -0,0 +1,8 @@
<?php
namespace App\Http\Requests;
class MediaRequest extends BaseRequest
{
/* empty */
}

View File

@@ -1,20 +0,0 @@
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class MediaStoreRequest extends FormRequest
{
/**
* Get the validation rules that apply to the request.
*
* @return array<string, mixed>
*/
public function rules()
{
return [
//
];
}
}

View File

@@ -1,20 +0,0 @@
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class MediaUpdateRequest extends FormRequest
{
/**
* Get the validation rules that apply to the request.
*
* @return array<string, mixed>
*/
public function rules()
{
return [
//
];
}
}

View File

@@ -0,0 +1,42 @@
<?php
namespace App\Http\Requests;
use Illuminate\Validation\Rule;
class PostRequest extends BaseRequest
{
/**
* Get the validation rules that apply to POST requests.
*
* @return array<string, mixed>
*/
public function postRules()
{
return [
'slug' => 'string|min:6|unique:posts',
'title' => 'string|min:6|max:255',
'publish_at' => 'date',
'user_id' => 'uuid|exists:users,id',
];
}
/**
* Get the validation rules that apply to PUT request.
*
* @return array<string, mixed>
*/
public function putRules()
{
return [
'slug' => [
'string',
'min:6',
Rule::unique('posts')->ignoreModel($this->post),
],
'title' => 'string|min:6|max:255',
'publish_at' => 'date',
'user_id' => 'uuid|exists:users,id',
];
}
}

View File

@@ -1,23 +0,0 @@
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class PostStoreRequest extends FormRequest
{
/**
* Get the validation rules that apply to the request.
*
* @return array<string, mixed>
*/
public function rules()
{
return [
'slug' => 'string|min:6|unique:posts',
'title' => 'string|min:6|max:255',
'publish_at' => 'date',
'user_id' => 'uuid|exists:users,id',
];
}
}

View File

@@ -1,28 +0,0 @@
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
class PostUpdateRequest extends FormRequest
{
/**
* Get the validation rules that apply to the request.
*
* @return array<string, mixed>
*/
public function rules()
{
return [
'slug' => [
'string',
'min:6',
Rule::unique('posts')->ignoreModel($this->post),
],
'title' => 'string|min:6|max:255',
'publish_at' => 'date',
'user_id' => 'uuid|exists:users,id',
];
}
}

View File

@@ -14,7 +14,7 @@ class SubscriptionRequest extends BaseRequest
public function postRules() public function postRules()
{ {
return [ return [
'email' => 'required|email', 'email' => 'required|email|unique:subscriptions',
'captcha_token' => [new Recaptcha()], 'captcha_token' => [new Recaptcha()],
]; ];
} }
@@ -31,4 +31,16 @@ class SubscriptionRequest extends BaseRequest
'captcha_token' => [new Recaptcha()], 'captcha_token' => [new Recaptcha()],
]; ];
} }
/**
* Get the custom error messages.
*
* @return array
*/
public function messages()
{
return [
'email.unique' => 'This email address has already subscribed',
];
}
} }