vendor and env first commit

This commit is contained in:
2025-03-28 08:52:46 +01:00
parent f8388bc81b
commit 8f26283832
10976 changed files with 1349952 additions and 2 deletions
@@ -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();
}
}
@@ -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();
}
}
@@ -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'));
}
}
@@ -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.'));
}
}
@@ -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')),
];
}
}