Added Feedback section.

This commit is contained in:
2024-04-23 19:30:56 +05:00
parent 491249c8d8
commit 8c353a49b7
44 changed files with 1050 additions and 0 deletions

View File

@@ -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,
]);
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View 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(),
];
}
}