Added Feedback section.
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
<?php declare(strict_types=1);
|
||||
|
||||
namespace App\Services\Admin\Project;
|
||||
|
||||
use App\Dto\Builder\ProjectFeedback as ProjectFeedbackBuilderDto;
|
||||
use App\Dto\QuerySettingsDto;
|
||||
use App\Models\ProjectFeedback;
|
||||
use App\Models\User;
|
||||
use App\Repositories\ProjectFeedbackRepository;
|
||||
use App\Repositories\ProjectRepository;
|
||||
use App\ServiceResults\ServiceResultArray;
|
||||
use App\ServiceResults\ServiceResultError;
|
||||
use App\Services\Service;
|
||||
|
||||
final class FeedbackService extends Service
|
||||
{
|
||||
public function __construct(
|
||||
private readonly ProjectFeedbackRepository $projectFeedbackRepository,
|
||||
private readonly ProjectRepository $projectRepository,
|
||||
) { }
|
||||
|
||||
public function index(ProjectFeedbackBuilderDto $projectFeedbackBuilderDto, QuerySettingsDto $querySettingsDto, User $user): ServiceResultError | ServiceResultArray
|
||||
{
|
||||
if ($user->cannot('viewAny', ProjectFeedback::class)) {
|
||||
return $this->errFobidden(__('Access is denied'));
|
||||
}
|
||||
|
||||
$feedbacks = $this->projectFeedbackRepository->getFeedbacks(
|
||||
$projectFeedbackBuilderDto,
|
||||
$querySettingsDto->getQueryWith()
|
||||
)->pagination(
|
||||
$querySettingsDto->getLimit(),
|
||||
$querySettingsDto->getPage()
|
||||
);
|
||||
|
||||
return $this->result([
|
||||
'feedbacks' => $feedbacks,
|
||||
]);
|
||||
}
|
||||
|
||||
public function project(int $projectId, ProjectFeedbackBuilderDto $projectFeedbackBuilderDto, QuerySettingsDto $querySettingsDto, User $user): ServiceResultError | ServiceResultArray
|
||||
{
|
||||
$project = $this->projectRepository->getProjectById($projectId);
|
||||
if (\is_null($project)) {
|
||||
return $this->errNotFound(__('Not Found'));
|
||||
}
|
||||
|
||||
if ($user->cannot('viewAny', ProjectFeedback::class)) {
|
||||
return $this->errFobidden(__('Access is denied'));
|
||||
}
|
||||
|
||||
$feedbacks = $this->projectFeedbackRepository->getFeedbacksByProject(
|
||||
$project,
|
||||
$projectFeedbackBuilderDto,
|
||||
$querySettingsDto->getQueryWith()
|
||||
)->pagination(
|
||||
$querySettingsDto->getLimit(),
|
||||
$querySettingsDto->getPage()
|
||||
);
|
||||
|
||||
return $this->result([
|
||||
'project' => $project,
|
||||
'feedbacks' => $feedbacks,
|
||||
]);
|
||||
}
|
||||
}
|
@@ -0,0 +1,15 @@
|
||||
<?php declare(strict_types=1);
|
||||
|
||||
namespace App\Services\ProjectFeedback;
|
||||
|
||||
use App\Dto\Builder\ProjectFeedback as ProjectFeedbackBuilderDto;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Database\Eloquent\Relations\Relation;
|
||||
|
||||
final readonly class BuilderCommand
|
||||
{
|
||||
public function execute(Relation | Builder $query, ProjectFeedbackBuilderDto $projectFeedbackBuilderDto): Relation | Builder
|
||||
{
|
||||
return $query;
|
||||
}
|
||||
}
|
@@ -0,0 +1,15 @@
|
||||
<?php declare(strict_types=1);
|
||||
|
||||
namespace App\Services\ProjectFeedback;
|
||||
|
||||
use App\Models\Project;
|
||||
use App\Models\ProjectFeedback;
|
||||
|
||||
final readonly class ProjectFeedbackCommandHandler
|
||||
{
|
||||
public function handleStore(Project $project, array $data): ProjectFeedback
|
||||
{
|
||||
$feedback = $project->feedbacks()->create($data);
|
||||
return $feedback;
|
||||
}
|
||||
}
|
53
app/application/app/Services/Site/FeedbackService.php
Normal file
53
app/application/app/Services/Site/FeedbackService.php
Normal file
@@ -0,0 +1,53 @@
|
||||
<?php declare(strict_types=1);
|
||||
|
||||
namespace App\Services\Site;
|
||||
|
||||
use App\Dto\Service\Site\Feedback\Send;
|
||||
use App\Models\Project;
|
||||
use App\Models\User;
|
||||
use App\ServiceResults\ServiceResultError;
|
||||
use App\ServiceResults\ServiceResultSuccess;
|
||||
use App\Services\ProjectFeedback\ProjectFeedbackCommandHandler;
|
||||
use App\Services\Service;
|
||||
use App\Services\WebsiteTranslations;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
final class FeedbackService extends Service
|
||||
{
|
||||
public function __construct(
|
||||
private readonly ProjectFeedbackCommandHandler $feedbackCommandHandler,
|
||||
) { }
|
||||
|
||||
public function send(Send $send, Project $project, WebsiteTranslations $websiteTranslations, ?User $user = null): ServiceResultError | ServiceResultSuccess
|
||||
{
|
||||
try {
|
||||
DB::transaction(function () use ($send, $project, $user) {
|
||||
$data = $this->getDataFeedback($send);
|
||||
$data['user_id'] = $user?->id;
|
||||
$this->feedbackCommandHandler->handleStore($project, $data);
|
||||
});
|
||||
} catch (\Throwable $e) {
|
||||
report($e);
|
||||
return $this->errService($websiteTranslations->translate('Server Error'));
|
||||
}
|
||||
|
||||
return $this->ok($websiteTranslations->translate('site.Message sent successfully'));
|
||||
}
|
||||
|
||||
private function getDataFeedback(Send $send): array
|
||||
{
|
||||
$name = $send->getName();
|
||||
if ($name !== null) {
|
||||
$name = strip_tags($name);
|
||||
}
|
||||
$message = $send->getMessage();
|
||||
$message = strip_tags($message, ['<b>', '<strong>', '<p>', '<br>', '<ul>', '<li>', '<ol>', '<table>', '<tr>', '<td>', '<th>', '<i>',]);
|
||||
return [
|
||||
'name' => $name,
|
||||
'email' => $send->getEmail(),
|
||||
'message' => $message,
|
||||
'ip' => $send->getHttpUserData()->getClientIp(),
|
||||
'user_agent' => $send->getHttpUserData()->getUserAgent(),
|
||||
];
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user