- Added admin page to upload and manage media. - Fixed /setup route. - Updated dockerfiles to support admin media. - Improved deploy docs.
This commit is contained in:
@@ -46,6 +46,9 @@ class SomniaDashboardController extends AbstractDashboardController
|
||||
yield MenuItem::linkToCrud('Bed Types', 'fas fa-bed', BedType::class);
|
||||
yield MenuItem::linkToRoute('Bed Type - category', 'fas fa-bed', 'admin_roomCategoryBedType');
|
||||
|
||||
yield MenuItem::Section('Resources');
|
||||
yield MenuItem::linkToRoute('Photos', 'fas fa-image', 'admin_photos');
|
||||
|
||||
yield MenuItem::Section('App Management');
|
||||
yield MenuItem::linkToCrud('Config Vars', 'fas fa-gear', ConfigVariable::class);
|
||||
yield MenuItem::linkToCrud('Users', 'fas fa-user', User::class)
|
||||
|
||||
@@ -0,0 +1,119 @@
|
||||
<?php
|
||||
|
||||
namespace App\Controller;
|
||||
|
||||
use App\Service\FileUploaderService;
|
||||
use EasyCorp\Bundle\EasyAdminBundle\Router\AdminUrlGenerator;
|
||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||
use Symfony\Component\Asset\PathPackage;
|
||||
use Symfony\Component\Asset\VersionStrategy\EmptyVersionStrategy;
|
||||
use Symfony\Component\Form\Extension\Core\Type\FileType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
|
||||
use Symfony\Component\HttpFoundation\File\UploadedFile;
|
||||
use Symfony\Component\HttpFoundation\JsonResponse;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
use Symfony\Component\HttpKernel\Exception\HttpException;
|
||||
use Symfony\Component\Routing\Attribute\Route;
|
||||
use Symfony\Component\Security\Http\Attribute\IsGranted;
|
||||
use Symfony\Component\Validator\Constraints\File;
|
||||
|
||||
#[IsGranted("ROLE_ADMIN")]
|
||||
class PhotoManagerAdminController extends AbstractController
|
||||
{
|
||||
|
||||
private AdminUrlGenerator $adminUrlGenerator;
|
||||
private FileUploaderService $fileUploader;
|
||||
|
||||
public function __construct(
|
||||
AdminUrlGenerator $adminUrlGenerator,
|
||||
FileUploaderService $fu
|
||||
) {
|
||||
$this->adminUrlGenerator = $adminUrlGenerator;
|
||||
$this->fileUploader = $fu;
|
||||
}
|
||||
|
||||
|
||||
#[Route('/admin/photos', name: 'admin_photos')]
|
||||
public function index(): Response
|
||||
{
|
||||
$fileData = [];
|
||||
|
||||
$dir = $this->fileUploader->getTargetDirectory();
|
||||
$pathPackage = new PathPackage($dir, new EmptyVersionStrategy());
|
||||
|
||||
foreach (glob($dir . '*.*') as $file) {
|
||||
$filename = basename($file);
|
||||
$fileData[] = [
|
||||
"filename" => $filename,
|
||||
"url" => $pathPackage->getUrl($filename),
|
||||
];
|
||||
}
|
||||
|
||||
//return new JsonResponse(["dir" => $dir, "response" => $fileData]);
|
||||
|
||||
return $this->render('admin/photo_manager/index.html.twig', [
|
||||
'photoList' => $fileData,
|
||||
]);
|
||||
}
|
||||
|
||||
#[Route('/admin/photos/upload', name: 'admin_photos_upload')]
|
||||
public function uploadPhoto(
|
||||
Request $request
|
||||
): Response {
|
||||
|
||||
$form = $this->createFormBuilder()
|
||||
->add('file', FileType::class, [
|
||||
'mapped' => false,
|
||||
'required' => false,
|
||||
'constraints' => [
|
||||
new File([
|
||||
'maxSize' => '2048k',
|
||||
'mimeTypes' => [
|
||||
'image/jpeg',
|
||||
'image/png',
|
||||
'image/svg+xml',
|
||||
'image/webp',
|
||||
],
|
||||
'mimeTypesMessage' => 'Please upload a valid image!',
|
||||
])
|
||||
],
|
||||
])
|
||||
->add('submit', SubmitType::class)
|
||||
->getForm();
|
||||
|
||||
$form->handleRequest($request);
|
||||
|
||||
if ($form->isSubmitted() && $form->isValid()) {
|
||||
/** @var UploadedFile $uploadedPhoto */
|
||||
$uploadedPhoto = $form->get('file')->getData();
|
||||
|
||||
if ($uploadedPhoto) {
|
||||
$filename = $this->fileUploader->upload($uploadedPhoto);
|
||||
}
|
||||
|
||||
$url = $this->adminUrlGenerator->setRoute('admin_photos')->generateUrl();
|
||||
return $this->redirect($url);
|
||||
}
|
||||
|
||||
return $this->render('admin/adminEdit.html.twig', [
|
||||
'form' => $form,
|
||||
'ElementName' => "Photo",
|
||||
'ElementType' => "New Photo",
|
||||
]);
|
||||
}
|
||||
|
||||
#[Route('/admin/photos/remove/{filename}', name: 'admin_photos_remove')]
|
||||
public function remove(string $filename): Response
|
||||
{
|
||||
$filePath = $this->fileUploader->getTargetDirectory() . $filename;
|
||||
$deleted = $this->fileUploader->deleteFile($filePath);
|
||||
|
||||
if (!$deleted) {
|
||||
throw new HttpException("404", "File can't be deleted");
|
||||
}
|
||||
|
||||
$url = $this->adminUrlGenerator->setRoute('admin_photos')->generateUrl();
|
||||
return $this->redirect($url);
|
||||
}
|
||||
}
|
||||
@@ -4,6 +4,7 @@ namespace App\Controller;
|
||||
|
||||
use App\Entity\User;
|
||||
use App\Entity\ConfigVariable;
|
||||
use App\Enum\ConfigSectionType;
|
||||
use Doctrine\ORM\EntityManagerInterface;
|
||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
@@ -53,7 +54,7 @@ class SecurityController extends AbstractController
|
||||
$var_setup = new ConfigVariable();
|
||||
$var_setup->setKey("SETUP_STATUS");
|
||||
$var_setup->setValue("1");
|
||||
$var_setup->setSection("SYSTEM");
|
||||
$var_setup->setSection(ConfigSectionType::Internal);
|
||||
$entityManager->persist($var_setup);
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
<?php
|
||||
|
||||
namespace App\Service;
|
||||
|
||||
use Symfony\Component\HttpFoundation\File\Exception\FileException;
|
||||
use Symfony\Component\HttpFoundation\File\UploadedFile;
|
||||
use Symfony\Component\String\Slugger\SluggerInterface;
|
||||
|
||||
class FileUploaderService
|
||||
{
|
||||
public function __construct(
|
||||
private string $targetDirectory,
|
||||
private SluggerInterface $slugger,
|
||||
) {}
|
||||
|
||||
public function upload(UploadedFile $file): string
|
||||
{
|
||||
$originalFilename = pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME);
|
||||
$safeFilename = $this->slugger->slug($originalFilename);
|
||||
$fileName = $safeFilename . '-' . uniqid() . '.' . $file->guessExtension();
|
||||
|
||||
try {
|
||||
$file->move($this->getTargetDirectory(), $fileName);
|
||||
} catch (FileException $e) {
|
||||
// ... handle exception if something happens during file upload
|
||||
}
|
||||
|
||||
return $fileName;
|
||||
}
|
||||
|
||||
public function deleteFile(string $filepath): bool
|
||||
{
|
||||
if (!$filepath || !is_file($filepath)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$deleted = unlink($filepath);
|
||||
|
||||
return $deleted;
|
||||
}
|
||||
|
||||
public function getTargetDirectory(): string
|
||||
{
|
||||
return $this->targetDirectory;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user