. // }}} namespace Plugin\Cover\Controller; use App\Core\DB\DB; use App\Core\Form; use function App\Core\I18n\_m; use App\Entity\Cover as CoverEntity; use App\Util\Common; use App\Util\Exception\ClientException; use App\Util\Exception\RedirectException; use App\Util\Exception\ServerException; use Component\Media\Attachment; use Component\Media\Attachment as M; use Symfony\Component\Form\Extension\Core\Type\FileType; use Symfony\Component\Form\Extension\Core\Type\HiddenType; use Symfony\Component\Form\Extension\Core\Type\SubmitType; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Validator\Constraints\File as F; /** * Cover controller * * @package GNUsocial * @category CoverPlugin * * @author Daniel Brandao * @copyright 2020 Free Software Foundation, Inc http://www.fsf.org * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ class Cover { /** * Display and handle the cover edit page, where a user can add or * edit their cover image * * @param Request $request * * @throws ClientException Invalid form * @throws ServerException Invalid file type * * @return array template */ public static function coverSettings(Request $request) { $user = Common::user(); $actor_id = $user->getId(); $form = Form::create([ ['cover', FileType::class, ['label' => _m('Cover'), 'help' => _m('You can upload your personal cover. The maximum file size is 2MB.'), 'constraints' => [ new F([ 'maxSize' => '2048k', 'mimeTypes' => [ 'image/gif', 'image/png', 'image/jpeg', 'image/bmp', 'image/webp', ], 'maxSizeMessage' => 'Image exceeded maximum size', 'mimeTypesMessage' => 'Please upload a valid image', ]), ], ]], ['hidden', HiddenType::class, []], ['save', SubmitType::class, ['label' => _m('Submit')]], ]); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { $data = $form->getData(); if (isset($data['cover'])) { $sfile = $data['cover']; } else { throw new ClientException('Invalid form'); } if (explode('/',$sfile->getMimeType())[0] != 'image') { throw new ServerException('Invalid file type'); } $file = Attachment::validateAndStoreFile($sfile, Common::config('cover', 'dir'), $title = null, $is_local = true, $use_unique = $actor_id); $old_file = null; $cover = DB::find('cover', ['gsactor_id' => $actor_id]); // Must get old id before inserting another one if ($cover != null) { $old_file = $cover->delete(); DB::remove($cover); } DB::persist($file); // Can only get new id after inserting DB::flush(); $cover = CoverEntity::create(['gsactor_id' => $actor_id, 'file_id' => $file->getId()]); DB::persist($cover); DB::flush(); // Only delete files if the commit went through if ($old_file != null) { @unlink($old_file); } throw new RedirectException(); } $removeForm = null; $cover = DB::find('cover', ['gsactor_id' => $actor_id]); if ($cover != null) { $form2 = Form::create([ ['remove', SubmitType::class, ['label' => _m('Remove')]], ]); $form2->handleRequest($request); if ($form2->isSubmitted() && $form2->isValid()) { $old_file = $cover->delete(); DB::remove($cover); DB::flush(); @unlink($old_file); throw new RedirectException(); } $removeForm = $form2->createView(); } return ['_template' => 'cover/cover.html.twig', 'form' => $form->createView(), 'remove_form' => $removeForm]; } /** * get user cover * * @return mixed cover file */ public function cover() { $cover = DB::find('cover', ['gsactor_id' => Common::user()->getId()]); if ($cover == null) { return new Response('Cover not found',Response::HTTP_NOT_FOUND); } $file = $cover->getFile(); if ($file == null) { return new Response('Cover File not found',Response::HTTP_NOT_FOUND); } return M::sendFile($cover->getFilePath(), $file->getMimetype(), $file->getTitle()); } }