vendor and env first commit
This commit is contained in:
+108
@@ -0,0 +1,108 @@
|
||||
<?php
|
||||
|
||||
namespace Vanguard\Announcements\Http\Controllers\Api;
|
||||
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
|
||||
use Spatie\QueryBuilder\AllowedFilter;
|
||||
use Spatie\QueryBuilder\AllowedInclude;
|
||||
use Spatie\QueryBuilder\QueryBuilder;
|
||||
use Vanguard\Announcements\Announcement;
|
||||
use Vanguard\Announcements\Events\EmailNotificationRequested;
|
||||
use Vanguard\Announcements\Http\Requests\AnnouncementRequest;
|
||||
use Vanguard\Announcements\Http\Resources\AnnouncementResource;
|
||||
use Vanguard\Announcements\Repositories\AnnouncementsRepository;
|
||||
use Vanguard\Http\Controllers\Api\ApiController;
|
||||
|
||||
/**
|
||||
* Class AnnouncementsController
|
||||
*/
|
||||
class AnnouncementsController extends ApiController
|
||||
{
|
||||
public function __construct(private readonly AnnouncementsRepository $announcements)
|
||||
{
|
||||
$this->middleware('permission:announcements.manage')->except('index', 'show');
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a paginated list of announcements.
|
||||
*
|
||||
* @throws \Illuminate\Validation\ValidationException
|
||||
*/
|
||||
public function index(Request $request): AnonymousResourceCollection
|
||||
{
|
||||
$this->validate($request, ['per_page' => 'numeric|max:50']);
|
||||
|
||||
$announcements = QueryBuilder::for(Announcement::class)
|
||||
->allowedIncludes([
|
||||
AllowedInclude::relationship('user', 'creator'),
|
||||
])
|
||||
->allowedFilters([
|
||||
AllowedFilter::partial('title'),
|
||||
AllowedFilter::partial('body'),
|
||||
AllowedFilter::exact('user', 'user_id'),
|
||||
])
|
||||
->allowedSorts('title', 'created_at')
|
||||
->defaultSort('-created_at')
|
||||
->paginate($request->per_page);
|
||||
|
||||
return AnnouncementResource::collection($announcements);
|
||||
}
|
||||
|
||||
/**
|
||||
* Stores the announcement inside the database.
|
||||
*/
|
||||
public function store(AnnouncementRequest $request): AnnouncementResource
|
||||
{
|
||||
$announcement = $this->announcements->createFor(
|
||||
auth()->user(),
|
||||
$request->title,
|
||||
$request->body
|
||||
);
|
||||
|
||||
if ($request->email_notification) {
|
||||
EmailNotificationRequested::dispatch($announcement);
|
||||
}
|
||||
|
||||
return new AnnouncementResource($announcement);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a single announcement resource.
|
||||
*/
|
||||
public function show($announcementId): AnnouncementResource
|
||||
{
|
||||
$announcement = QueryBuilder::for(Announcement::where('id', $announcementId))
|
||||
->allowedIncludes([
|
||||
AllowedInclude::relationship('user', 'creator'),
|
||||
])
|
||||
->first();
|
||||
|
||||
return new AnnouncementResource($announcement);
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates announcement details.
|
||||
*/
|
||||
public function update(Announcement $announcement, AnnouncementRequest $request): AnnouncementResource
|
||||
{
|
||||
$announcement = $this->announcements->update(
|
||||
$announcement,
|
||||
$request->title,
|
||||
$request->body
|
||||
);
|
||||
|
||||
return new AnnouncementResource($announcement);
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes announcement from the system.
|
||||
*/
|
||||
public function destroy(Announcement $announcement): JsonResponse
|
||||
{
|
||||
$this->announcements->delete($announcement);
|
||||
|
||||
return $this->respondWithSuccess();
|
||||
}
|
||||
}
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
namespace Vanguard\Announcements\Http\Controllers\Api;
|
||||
|
||||
use Vanguard\Http\Controllers\Api\ApiController;
|
||||
|
||||
class ReadAnnouncementsController extends ApiController
|
||||
{
|
||||
/**
|
||||
* Update the timestamp when announcements were last read
|
||||
* by the currently authenticated user.
|
||||
*
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
auth()->user()->forceFill([
|
||||
'announcements_last_read_at' => now(),
|
||||
])->save();
|
||||
|
||||
return $this->respondWithSuccess();
|
||||
}
|
||||
}
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
<?php
|
||||
|
||||
namespace Vanguard\Announcements\Http\Controllers\Web;
|
||||
|
||||
use Illuminate\Contracts\View\View;
|
||||
use Vanguard\Announcements\Repositories\AnnouncementsRepository;
|
||||
use Vanguard\Http\Controllers\Controller;
|
||||
|
||||
class AnnouncementListController extends Controller
|
||||
{
|
||||
public function __construct(private readonly AnnouncementsRepository $announcements)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Displays the plugin index page.
|
||||
*/
|
||||
public function index(): View
|
||||
{
|
||||
$announcements = $this->announcements->paginate(7);
|
||||
$announcements->load('creator');
|
||||
|
||||
return view('announcements::list', compact('announcements'));
|
||||
}
|
||||
}
|
||||
+105
@@ -0,0 +1,105 @@
|
||||
<?php
|
||||
|
||||
namespace Vanguard\Announcements\Http\Controllers\Web;
|
||||
|
||||
use Illuminate\Contracts\View\View;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
use Vanguard\Announcements\Announcement;
|
||||
use Vanguard\Announcements\Events\EmailNotificationRequested;
|
||||
use Vanguard\Announcements\Http\Requests\AnnouncementRequest;
|
||||
use Vanguard\Announcements\Repositories\AnnouncementsRepository;
|
||||
use Vanguard\Http\Controllers\Controller;
|
||||
|
||||
/**
|
||||
* Class AnnouncementsController
|
||||
*/
|
||||
class AnnouncementsController extends Controller
|
||||
{
|
||||
public function __construct(private readonly AnnouncementsRepository $announcements)
|
||||
{
|
||||
$this->middleware('permission:announcements.manage')->except('show');
|
||||
}
|
||||
|
||||
/**
|
||||
* Displays the plugin index page.
|
||||
*/
|
||||
public function index(): View
|
||||
{
|
||||
$announcements = $this->announcements->paginate();
|
||||
$announcements->load('creator');
|
||||
|
||||
return view('announcements::index', compact('announcements'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Shows the create announcement form.
|
||||
*/
|
||||
public function create(): View
|
||||
{
|
||||
return view('announcements::add-edit', ['edit' => false]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Stores the announcement inside the database.
|
||||
*/
|
||||
public function store(AnnouncementRequest $request): RedirectResponse
|
||||
{
|
||||
$announcement = $this->announcements->createFor(
|
||||
auth()->user(),
|
||||
$request->title,
|
||||
$request->body
|
||||
);
|
||||
|
||||
if ($request->email_notification) {
|
||||
EmailNotificationRequested::dispatch($announcement);
|
||||
}
|
||||
|
||||
return redirect()->route('announcements.index')
|
||||
->withSuccess(__('Announcement created successfully.'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders "view announcement" page.
|
||||
*/
|
||||
public function show(Announcement $announcement): View
|
||||
{
|
||||
return view('announcements::show', compact('announcement'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders the form for editing the announcement.
|
||||
*/
|
||||
public function edit(Announcement $announcement): View
|
||||
{
|
||||
return view('announcements::add-edit', [
|
||||
'edit' => true,
|
||||
'announcement' => $announcement,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates announcement details.
|
||||
*/
|
||||
public function update(Announcement $announcement, AnnouncementRequest $request): RedirectResponse
|
||||
{
|
||||
$this->announcements->update(
|
||||
$announcement,
|
||||
$request->title,
|
||||
$request->body
|
||||
);
|
||||
|
||||
return redirect()->route('announcements.index')
|
||||
->withSuccess(__('Announcement updated successfully.'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes announcement from the system.
|
||||
*/
|
||||
public function destroy(Announcement $announcement): RedirectResponse
|
||||
{
|
||||
$this->announcements->delete($announcement);
|
||||
|
||||
return redirect()->route('announcements.index')
|
||||
->withSuccess(__('Announcement deleted successfully.'));
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
<?php
|
||||
|
||||
namespace Vanguard\Announcements\Http\Controllers\Web;
|
||||
|
||||
use Vanguard\Http\Controllers\Controller;
|
||||
|
||||
class ReadAnnouncementsController extends Controller
|
||||
{
|
||||
/**
|
||||
* Update the timestamp when announcements were last read
|
||||
* by the currently authenticated user.
|
||||
*/
|
||||
public function index(): void
|
||||
{
|
||||
auth()->user()->forceFill([
|
||||
'announcements_last_read_at' => now(),
|
||||
])->save();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
namespace Vanguard\Announcements\Http\Requests;
|
||||
|
||||
use Vanguard\Http\Requests\Request;
|
||||
|
||||
class AnnouncementRequest extends Request
|
||||
{
|
||||
/**
|
||||
* Get the validation rules that apply to the request.
|
||||
*/
|
||||
public function rules(): array
|
||||
{
|
||||
return [
|
||||
'title' => 'required|max:150',
|
||||
'body' => 'required|max:1500',
|
||||
'email_notifications' => 'boolean',
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
namespace Vanguard\Announcements\Http\Resources;
|
||||
|
||||
use Illuminate\Http\Resources\Json\JsonResource;
|
||||
use Vanguard\Http\Resources\UserResource;
|
||||
|
||||
class AnnouncementResource extends JsonResource
|
||||
{
|
||||
/**
|
||||
* Transform the resource into an array.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
*/
|
||||
public function toArray($request): array
|
||||
{
|
||||
return [
|
||||
'id' => (int) $this->id,
|
||||
'user_id' => (int) $this->user_id,
|
||||
'title' => $this->title,
|
||||
'body' => $this->body,
|
||||
'parsed_body' => (string) $this->parsed_body,
|
||||
'created_at' => (string) $this->created_at,
|
||||
'updated_at' => (string) $this->updated_at,
|
||||
'user' => new UserResource($this->whenLoaded('creator')),
|
||||
];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user