The page about the project has been revived.

This commit is contained in:
2024-04-18 19:41:31 +05:00
parent 63ea5dac92
commit 24e0cf0eea
42 changed files with 1126 additions and 6 deletions

View File

@@ -5,6 +5,7 @@ namespace App\Services\Admin;
use App\Dto\Builder\Project as ProjectBuilderDto;
use App\Dto\QuerySettingsDto;
use App\Dto\Service\Admin\Project\StoreUpdate;
use App\Enums\CacheTag;
use App\Enums\Morph;
use App\Models\Project;
use App\Models\ProjectLanguage;
@@ -14,6 +15,7 @@ use App\ServiceResults\ServiceResultArray;
use App\ServiceResults\ServiceResultError;
use App\ServiceResults\ServiceResultSuccess;
use App\ServiceResults\StoreUpdateResult;
use App\Services\ClearCacheCommandHandler;
use App\Services\Project\ProjectCommandHandler;
use App\Services\ProjectLanguage\ModelSyncCommand;
use App\Services\Role\CreateAdminRoleForProjectCommand;
@@ -29,6 +31,7 @@ final class ProjectService extends Service
private readonly CreateAdminRoleForProjectCommand $createAdminRoleForProjectCommand,
private readonly ModelSyncCommand $languageModelSyncCommand,
private readonly StorageService $storageService,
private readonly ClearCacheCommandHandler $clearCacheCommandHandler,
) { }
public function index(ProjectBuilderDto $projectBuilderDto, QuerySettingsDto $querySettingsDto, User $user): ServiceResultError | ServiceResultArray
@@ -130,6 +133,7 @@ final class ProjectService extends Service
return $project;
});
$this->clearCacheCommandHandler->byTag(CacheTag::Project);
} catch (\Throwable $e) {
report($e);
return $this->errService(__('Server Error'));
@@ -172,6 +176,7 @@ final class ProjectService extends Service
return $project;
});
$this->clearCacheCommandHandler->byTag(CacheTag::Project);
} catch (\Throwable $e) {
report($e);
return $this->errService(__('Server Error'));
@@ -196,6 +201,7 @@ final class ProjectService extends Service
DB::transaction(function () use ($project) {
$this->projectCommandHandler->handleDestroy($project);
});
$this->clearCacheCommandHandler->byTag(CacheTag::Project);
} catch (\Throwable $e) {
report($e);
return $this->errService(__('Server Error'));

View File

@@ -0,0 +1,13 @@
<?php declare(strict_types=1);
namespace App\Services;
use App\Enums\CacheTag;
final readonly class ClearCacheCommandHandler
{
public function byTag(CacheTag $tag)
{
$tag->getCache()->flush();
}
}

View File

@@ -10,6 +10,10 @@ final readonly class BuilderCommand
{
public function execute(Relation | Builder $query, ProjectBuilderDto $projectBuilderDto): Relation | Builder
{
if ($projectBuilderDto->isPublic() !== null) {
$query->where('is_public', $projectBuilderDto->isPublic());
}
return $query;
}
}

View File

@@ -2,12 +2,16 @@
namespace App\Services;
use App\Models\Project;
use App\Models\ProjectLanguage;
use App\ServiceResults\ServiceResultArray;
use App\ServiceResults\ServiceResultError;
use App\ServiceResults\ServiceResultSuccess;
use App\ServiceResults\Site\PagePossibleWithoutTranslation;
use App\ServiceResults\StoreUpdateResult;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\Cache;
abstract class Service
{
@@ -56,6 +60,11 @@ abstract class Service
return new ServiceResultArray(data: $data);
}
final protected function resultSitePage(Project $project, ProjectLanguage $language, array $data, bool $isTranslation): PagePossibleWithoutTranslation
{
return new PagePossibleWithoutTranslation($project, $language, $data, $isTranslation);
}
final protected function error(int $code, string $message, array $errors = []): ServiceResultError
{
return new ServiceResultError(

View File

@@ -0,0 +1,73 @@
<?php declare(strict_types=1);
namespace App\Services\Site;
use App\Models\Project;
use App\Models\User;
use App\Dto\Builder\Project as ProjectBuilderDto;
use App\Repositories\ProjectContentRepository;
use App\Repositories\ProjectLanguageRepository;
use App\Repositories\ProjectLinkRepository;
use App\Repositories\ProjectRepository;
use App\ServiceResults\ServiceResultArray;
use App\ServiceResults\ServiceResultError;
use App\ServiceResults\Site\PagePossibleWithoutTranslation;
use App\Services\Service;
final class ProjectService extends Service
{
public function __construct(
private readonly ProjectRepository $projectRepository,
private readonly ProjectLanguageRepository $projectLanguageRepository,
private readonly ProjectContentRepository $projectContentRepository,
private readonly ProjectLinkRepository $projectLinkRepository,
) { }
public function getProjects(?User $user, array $with): ServiceResultError | ServiceResultArray
{
$isPublic = null;
if (\is_null($user) || $user->cannot('viewAny', Project::class)) {
$isPublic = true;
}
$projectBuilderDto = new ProjectBuilderDto(
isPublic: $isPublic,
);
$projects = $this->projectRepository->getProjects($projectBuilderDto, $with);
return $this->result([
'projects' => $projects->all(),
]);
}
public function getAbout(string $projectCode, ?string $languageCode, ?User $user = null): ServiceResultError | PagePossibleWithoutTranslation
{
$project = $this->projectRepository->getProjectByCode($projectCode);
if (\is_null($project)) {
return $this->errNotFound('Project not found');
}
return $this->getAboutByProject($project, $languageCode, $user);
}
public function getAboutByProject(Project $project, ?string $languageCode, ?User $user = null): ServiceResultError | PagePossibleWithoutTranslation
{
if (
$project->is_public === false
&& ( $user === null || $user->cannot('view', $project) )
) {
return $this->errFobidden(__('Access is denied'));
}
$language = $this->projectLanguageRepository->getProjectLanguageByCodeOrDefault($project, $languageCode);
if (!$language) {
return $this->errNotFound(__('Language not found'));
}
$data = [
'project' => $project,
'language' => $language,
'content' => $this->projectContentRepository->getContentByLanguageId($project->id, $language->id),
'links' => $this->projectLinkRepository->getLinksByProject($project, $language->id),
];
return $this->resultSitePage($project, $language, $data, \is_null($data['content']));
}
}