Skip to content

Commit e916c5d

Browse files
authored
Merge pull request #981 from HiEventsDev/develop
2 parents 1b02f8f + 040584c commit e916c5d

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

62 files changed

+6129
-269
lines changed

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,7 @@ CLAUDE.md
1313

1414
.vercel
1515
prompts/
16+
17+
18+
/playground/**
19+
/playground/
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace HiEvents\Http\Actions\Admin\FailedJobs;
6+
7+
use HiEvents\DomainObjects\Enums\Role;
8+
use HiEvents\Http\Actions\BaseAction;
9+
use HiEvents\Services\Application\Handlers\Admin\DeleteFailedJobHandler;
10+
use Illuminate\Http\JsonResponse;
11+
12+
class DeleteAllFailedJobsAction extends BaseAction
13+
{
14+
public function __construct(
15+
private readonly DeleteFailedJobHandler $handler,
16+
) {
17+
}
18+
19+
public function __invoke(): JsonResponse
20+
{
21+
$this->minimumAllowedRole(Role::SUPERADMIN);
22+
23+
$count = $this->handler->deleteAll();
24+
25+
return $this->jsonResponse([
26+
'message' => __('Deleted :count failed jobs', ['count' => $count]),
27+
'deleted_count' => $count,
28+
]);
29+
}
30+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace HiEvents\Http\Actions\Admin\FailedJobs;
6+
7+
use HiEvents\DomainObjects\Enums\Role;
8+
use HiEvents\Http\Actions\BaseAction;
9+
use HiEvents\Services\Application\Handlers\Admin\DeleteFailedJobHandler;
10+
use Illuminate\Http\JsonResponse;
11+
12+
class DeleteFailedJobAction extends BaseAction
13+
{
14+
public function __construct(
15+
private readonly DeleteFailedJobHandler $handler,
16+
) {
17+
}
18+
19+
public function __invoke(int $jobId): JsonResponse
20+
{
21+
$this->minimumAllowedRole(Role::SUPERADMIN);
22+
23+
$deleted = $this->handler->handle($jobId);
24+
25+
if (!$deleted) {
26+
return $this->errorResponse(__('Failed job not found'), 404);
27+
}
28+
29+
return $this->deletedResponse();
30+
}
31+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace HiEvents\Http\Actions\Admin\FailedJobs;
6+
7+
use HiEvents\DomainObjects\Enums\Role;
8+
use HiEvents\Http\Actions\BaseAction;
9+
use HiEvents\Http\Resources\Admin\AdminFailedJobResource;
10+
use HiEvents\Services\Application\Handlers\Admin\DTO\GetAllFailedJobsDTO;
11+
use HiEvents\Services\Application\Handlers\Admin\GetAllFailedJobsHandler;
12+
use Illuminate\Http\JsonResponse;
13+
use Illuminate\Http\Request;
14+
15+
class GetAllFailedJobsAction extends BaseAction
16+
{
17+
public function __construct(
18+
private readonly GetAllFailedJobsHandler $handler,
19+
) {
20+
}
21+
22+
public function __invoke(Request $request): JsonResponse
23+
{
24+
$this->minimumAllowedRole(Role::SUPERADMIN);
25+
26+
$jobs = $this->handler->handle(new GetAllFailedJobsDTO(
27+
perPage: min((int)$request->query('per_page', 20), 100),
28+
search: $request->query('search'),
29+
queue: $request->query('queue'),
30+
sortBy: $request->query('sort_by', 'failed_at'),
31+
sortDirection: $request->query('sort_direction', 'desc'),
32+
));
33+
34+
return $this->resourceResponse(
35+
resource: AdminFailedJobResource::class,
36+
data: $jobs
37+
);
38+
}
39+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace HiEvents\Http\Actions\Admin\FailedJobs;
6+
7+
use HiEvents\DomainObjects\Enums\Role;
8+
use HiEvents\Http\Actions\BaseAction;
9+
use HiEvents\Services\Application\Handlers\Admin\RetryFailedJobHandler;
10+
use Illuminate\Http\JsonResponse;
11+
12+
class RetryAllFailedJobsAction extends BaseAction
13+
{
14+
public function __construct(
15+
private readonly RetryFailedJobHandler $handler,
16+
) {
17+
}
18+
19+
public function __invoke(): JsonResponse
20+
{
21+
$this->minimumAllowedRole(Role::SUPERADMIN);
22+
23+
$count = $this->handler->retryAll();
24+
25+
return $this->jsonResponse([
26+
'message' => __('Queued :count jobs for retry', ['count' => $count]),
27+
'retry_count' => $count,
28+
]);
29+
}
30+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace HiEvents\Http\Actions\Admin\FailedJobs;
6+
7+
use HiEvents\DomainObjects\Enums\Role;
8+
use HiEvents\Http\Actions\BaseAction;
9+
use HiEvents\Services\Application\Handlers\Admin\RetryFailedJobHandler;
10+
use Illuminate\Http\JsonResponse;
11+
12+
class RetryFailedJobAction extends BaseAction
13+
{
14+
public function __construct(
15+
private readonly RetryFailedJobHandler $handler,
16+
) {
17+
}
18+
19+
public function __invoke(int $jobId): JsonResponse
20+
{
21+
$this->minimumAllowedRole(Role::SUPERADMIN);
22+
23+
$retried = $this->handler->handle($jobId);
24+
25+
if (!$retried) {
26+
return $this->errorResponse(__('Failed job not found'), 404);
27+
}
28+
29+
return $this->jsonResponse([
30+
'message' => __('Job queued for retry'),
31+
]);
32+
}
33+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace HiEvents\Http\Actions\Admin\Messages;
6+
7+
use HiEvents\DomainObjects\Enums\Role;
8+
use HiEvents\Http\Actions\BaseAction;
9+
use HiEvents\Http\Resources\Admin\AdminMessageResource;
10+
use HiEvents\Services\Application\Handlers\Admin\DTO\GetAllMessagesForAdminDTO;
11+
use HiEvents\Services\Application\Handlers\Admin\GetAllMessagesForAdminHandler;
12+
use Illuminate\Http\JsonResponse;
13+
use Illuminate\Http\Request;
14+
15+
class GetAllMessagesAction extends BaseAction
16+
{
17+
public function __construct(
18+
private readonly GetAllMessagesForAdminHandler $handler,
19+
) {
20+
}
21+
22+
public function __invoke(Request $request): JsonResponse
23+
{
24+
$this->minimumAllowedRole(Role::SUPERADMIN);
25+
26+
$messages = $this->handler->handle(new GetAllMessagesForAdminDTO(
27+
perPage: min((int)$request->query('per_page', 20), 100),
28+
search: $request->query('search'),
29+
status: $request->query('status'),
30+
type: $request->query('type'),
31+
sortBy: $request->query('sort_by', 'created_at'),
32+
sortDirection: $request->query('sort_direction', 'desc'),
33+
));
34+
35+
return $this->resourceResponse(
36+
resource: AdminMessageResource::class,
37+
data: $messages
38+
);
39+
}
40+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace HiEvents\Http\Actions\Admin\Stats;
6+
7+
use HiEvents\DomainObjects\Enums\Role;
8+
use HiEvents\Http\Actions\BaseAction;
9+
use HiEvents\Services\Application\Handlers\Admin\DTO\GetAdminDashboardDataDTO;
10+
use HiEvents\Services\Application\Handlers\Admin\GetAdminDashboardDataHandler;
11+
use Illuminate\Http\JsonResponse;
12+
use Illuminate\Http\Request;
13+
14+
class GetAdminDashboardDataAction extends BaseAction
15+
{
16+
public function __construct(
17+
private readonly GetAdminDashboardDataHandler $handler,
18+
) {
19+
}
20+
21+
public function __invoke(Request $request): JsonResponse
22+
{
23+
$this->minimumAllowedRole(Role::SUPERADMIN);
24+
25+
$data = $this->handler->handle(new GetAdminDashboardDataDTO(
26+
days: min((int)$request->query('days', 14), 90),
27+
limit: min((int)$request->query('limit', 10), 50),
28+
));
29+
30+
return $this->jsonResponse($data->toArray());
31+
}
32+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace HiEvents\Http\Resources\Admin;
6+
7+
use Illuminate\Http\Request;
8+
use Illuminate\Http\Resources\Json\JsonResource;
9+
10+
class AdminFailedJobResource extends JsonResource
11+
{
12+
public function toArray(Request $request): array
13+
{
14+
$payload = json_decode($this->payload, true);
15+
$jobName = $payload['displayName'] ?? 'Unknown';
16+
17+
return [
18+
'id' => $this->id,
19+
'uuid' => $this->uuid,
20+
'connection' => $this->connection,
21+
'queue' => $this->queue,
22+
'job_name' => class_basename($jobName),
23+
'job_name_full' => $jobName,
24+
'payload' => $this->payload,
25+
'exception_summary' => $this->getExceptionSummary(),
26+
'exception' => $this->exception,
27+
'failed_at' => $this->failed_at,
28+
];
29+
}
30+
31+
private function getExceptionSummary(): string
32+
{
33+
$lines = explode("\n", $this->exception);
34+
return $lines[0] ?? 'Unknown error';
35+
}
36+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace HiEvents\Http\Resources\Admin;
6+
7+
use Illuminate\Http\Request;
8+
use Illuminate\Http\Resources\Json\JsonResource;
9+
10+
class AdminMessageResource extends JsonResource
11+
{
12+
public function toArray(Request $request): array
13+
{
14+
return [
15+
'id' => $this->id,
16+
'event_id' => $this->event_id,
17+
'event_title' => $this->event_title,
18+
'account_name' => $this->account_name,
19+
'subject' => $this->subject,
20+
'message' => $this->message,
21+
'type' => $this->type,
22+
'status' => $this->status,
23+
'recipients_count' => (int)$this->recipients_count,
24+
'sent_by' => trim(($this->sent_by_first_name ?? '') . ' ' . ($this->sent_by_last_name ?? '')),
25+
'sent_at' => $this->sent_at,
26+
'created_at' => $this->created_at,
27+
];
28+
}
29+
}

0 commit comments

Comments
 (0)