70 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			70 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| 
								 | 
							
								<?php
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								declare(strict_types = 1);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace Component\Posting\Controller;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								use App\Core;
							 | 
						||
| 
								 | 
							
								use App\Core\Controller;
							 | 
						||
| 
								 | 
							
								use App\Core\Event;
							 | 
						||
| 
								 | 
							
								use function App\Core\I18n\_m;
							 | 
						||
| 
								 | 
							
								use App\Core\VisibilityScope;
							 | 
						||
| 
								 | 
							
								use App\Util\Common;
							 | 
						||
| 
								 | 
							
								use App\Util\Exception\ClientException;
							 | 
						||
| 
								 | 
							
								use Component\Posting\Form;
							 | 
						||
| 
								 | 
							
								use Symfony\Component\HttpFoundation\File\Exception\FormSizeFileException;
							 | 
						||
| 
								 | 
							
								use Symfony\Component\HttpFoundation\RedirectResponse;
							 | 
						||
| 
								 | 
							
								use Symfony\Component\HttpFoundation\Request;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class Posting extends Controller
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    public function onPost(Request $request): RedirectResponse
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $actor = Common::actor();
							 | 
						||
| 
								 | 
							
								        $form  = Form\Posting::create($request);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $form->handleRequest($request);
							 | 
						||
| 
								 | 
							
								        if ($form->isSubmitted()) {
							 | 
						||
| 
								 | 
							
								            try {
							 | 
						||
| 
								 | 
							
								                if ($form->isValid()) {
							 | 
						||
| 
								 | 
							
								                    $data = $form->getData();
							 | 
						||
| 
								 | 
							
								                    Event::handle('PostingModifyData', [$request, $actor, &$data, $form]);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                    if (empty($data['content']) && empty($data['attachments'])) {
							 | 
						||
| 
								 | 
							
								                        // TODO Display error: At least one of `content` and `attachments` must be provided
							 | 
						||
| 
								 | 
							
								                        throw new ClientException(_m('You must enter content or provide at least one attachment to post a note.'));
							 | 
						||
| 
								 | 
							
								                    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                    if (\is_null(VisibilityScope::tryFrom($data['visibility']))) {
							 | 
						||
| 
								 | 
							
								                        throw new ClientException(_m('You have selected an impossible visibility.'));
							 | 
						||
| 
								 | 
							
								                    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                    $extra_args = [];
							 | 
						||
| 
								 | 
							
								                    Event::handle('AddExtraArgsToNoteContent', [$request, $actor, $data, &$extra_args, $form]);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                    if (\array_key_exists('in', $data) && $data['in'] !== 'public') {
							 | 
						||
| 
								 | 
							
								                        $target = $data['in'];
							 | 
						||
| 
								 | 
							
								                    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                    \Component\Posting\Posting::storeLocalNote(
							 | 
						||
| 
								 | 
							
								                        actor: $actor,
							 | 
						||
| 
								 | 
							
								                        content: $data['content'],
							 | 
						||
| 
								 | 
							
								                        content_type: $data['content_type'],
							 | 
						||
| 
								 | 
							
								                        locale: $data['language'],
							 | 
						||
| 
								 | 
							
								                        scope: VisibilityScope::from($data['visibility']),
							 | 
						||
| 
								 | 
							
								                        targets: isset($target) ? [$target] : [],
							 | 
						||
| 
								 | 
							
								                        reply_to: $data['reply_to_id'],
							 | 
						||
| 
								 | 
							
								                        attachments: $data['attachments'],
							 | 
						||
| 
								 | 
							
								                        process_note_content_extra_args: $extra_args,
							 | 
						||
| 
								 | 
							
								                    );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                    return Core\Form::forceRedirect($form, $request);
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            } catch (FormSizeFileException $e) {
							 | 
						||
| 
								 | 
							
								                throw new ClientException(_m('Invalid file size given'), previous: $e);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        throw new ClientException(_m('Invalid form submission'));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |