| 
									
										
										
										
											2020-11-24 16:47:07 +00:00
										 |  |  | <?php | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // {{{ License
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // This file is part of GNU social - https://www.gnu.org/software/social
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // GNU social is free software: you can redistribute it and/or modify
 | 
					
						
							|  |  |  | // it under the terms of the GNU Affero General Public License as published by
 | 
					
						
							|  |  |  | // the Free Software Foundation, either version 3 of the License, or
 | 
					
						
							|  |  |  | // (at your option) any later version.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // GNU social is distributed in the hope that it will be useful,
 | 
					
						
							|  |  |  | // but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					
						
							|  |  |  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
					
						
							|  |  |  | // GNU Affero General Public License for more details.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // You should have received a copy of the GNU Affero General Public License
 | 
					
						
							|  |  |  | // along with GNU social.  If not, see <http://www.gnu.org/licenses/>.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // }}}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace Plugin\Cover\Controller; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-25 21:43:55 +00:00
										 |  |  | use App\Core\DB\DB; | 
					
						
							| 
									
										
										
										
											2020-11-24 16:47:07 +00:00
										 |  |  | use App\Core\Form; | 
					
						
							|  |  |  | use function App\Core\I18n\_m; | 
					
						
							| 
									
										
										
										
											2020-11-25 21:43:55 +00:00
										 |  |  | use App\Entity\Cover as CoverEntity; | 
					
						
							|  |  |  | use App\Util\Common; | 
					
						
							|  |  |  | use App\Util\Exception\ClientException; | 
					
						
							| 
									
										
										
										
											2020-11-29 16:54:29 +00:00
										 |  |  | use App\Util\Exception\ServerException; | 
					
						
							| 
									
										
										
										
											2020-11-25 21:43:55 +00:00
										 |  |  | use Component\Media\Media; | 
					
						
							| 
									
										
										
										
											2020-11-27 22:25:37 +00:00
										 |  |  | use Component\Media\Media as M; | 
					
						
							| 
									
										
										
										
											2020-11-24 16:47:07 +00:00
										 |  |  | 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; | 
					
						
							| 
									
										
										
										
											2020-11-29 18:15:01 +00:00
										 |  |  | use Symfony\Component\HttpFoundation\Response; | 
					
						
							| 
									
										
										
										
											2020-11-29 16:54:29 +00:00
										 |  |  | use Symfony\Component\Validator\Constraints\File as F; | 
					
						
							| 
									
										
										
										
											2020-11-24 16:47:07 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-29 16:54:29 +00:00
										 |  |  | /** | 
					
						
							|  |  |  |  * Cover controller | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @package  GNUsocial | 
					
						
							|  |  |  |  * @category CoverPlugin | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @author    Daniel Brandao <up201705812@fe.up.pt> | 
					
						
							|  |  |  |  * @copyright 2020 Free Software Foundation, Inc http://www.fsf.org | 
					
						
							|  |  |  |  * @license   https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2020-11-24 16:47:07 +00:00
										 |  |  | class Cover | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2020-11-25 21:43:55 +00:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2020-11-29 16:54:29 +00:00
										 |  |  |      * 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 | 
					
						
							| 
									
										
										
										
											2020-11-25 21:43:55 +00:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-11-27 22:25:37 +00:00
										 |  |  |     public function coverSettings(Request $request) | 
					
						
							| 
									
										
										
										
											2020-11-24 16:47:07 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         $form = Form::create([ | 
					
						
							| 
									
										
										
										
											2020-11-29 16:54:29 +00:00
										 |  |  |             ['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', | 
					
						
							|  |  |  |                     ]), ], ]], | 
					
						
							| 
									
										
										
										
											2020-11-24 16:47:07 +00:00
										 |  |  |             ['hidden', HiddenType::class, []], | 
					
						
							|  |  |  |             ['save',   SubmitType::class, ['label' => _m('Submit')]], | 
					
						
							|  |  |  |         ]); | 
					
						
							| 
									
										
										
										
											2020-11-25 21:43:55 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $form->handleRequest($request); | 
					
						
							|  |  |  |         if ($form->isSubmitted() && $form->isValid()) { | 
					
						
							|  |  |  |             $data = $form->getData(); | 
					
						
							|  |  |  |             if (isset($data['cover'])) { | 
					
						
							|  |  |  |                 $sfile = $data['cover']; | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |                 throw new ClientException('Invalid form'); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2020-11-29 16:54:29 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |             if (explode('/',$sfile->getMimeType())[0] != 'image') { | 
					
						
							|  |  |  |                 throw new ServerException('Invalid file type'); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2020-11-25 21:43:55 +00:00
										 |  |  |             $user     = Common::user(); | 
					
						
							|  |  |  |             $actor_id = $user->getId(); | 
					
						
							|  |  |  |             $file     = Media::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) { | 
					
						
							| 
									
										
										
										
											2020-11-27 22:25:37 +00:00
										 |  |  |                 $old_file = $cover->delete(); | 
					
						
							|  |  |  |                 DB::remove($cover); | 
					
						
							| 
									
										
										
										
											2020-11-25 21:43:55 +00:00
										 |  |  |             } | 
					
						
							|  |  |  |             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); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-25 22:10:56 +00:00
										 |  |  |         return ['_template' => 'cover/cover.html.twig', 'form' => $form->createView()]; | 
					
						
							| 
									
										
										
										
											2020-11-24 16:47:07 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2020-11-27 22:25:37 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-29 16:54:29 +00:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * get user cover | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return mixed cover file | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-11-27 22:25:37 +00:00
										 |  |  |     public function cover() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $cover = DB::find('cover', ['gsactor_id' => Common::user()->getId()]); | 
					
						
							| 
									
										
										
										
											2020-11-29 18:15:01 +00:00
										 |  |  |         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); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2020-11-27 22:25:37 +00:00
										 |  |  |         return M::sendFile($cover->getFilePath(), $file->getMimetype(), $file->getTitle()); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2020-11-24 16:47:07 +00:00
										 |  |  | } |