Skip to content
Snippets Groups Projects
InstanceAction.php 11.9 KiB
Newer Older
  • Learn to ignore specific revisions
  • François Agneray's avatar
    François Agneray committed
    <?php
    
    /*
     * This file is part of Anis Server.
     *
     * (c) Laboratoire d'Astrophysique de Marseille / CNRS
     *
     * For the full copyright and license information, please view the LICENSE
     * file that was distributed with this source code.
     */
    declare(strict_types=1);
    
    namespace App\Action;
    
    
    use Psr\Http\Message\ServerRequestInterface;
    use Psr\Http\Message\ResponseInterface;
    
    François Agneray's avatar
    François Agneray committed
    use Slim\Exception\HttpBadRequestException;
    use Slim\Exception\HttpNotFoundException;
    use App\Entity\Instance;
    
    /**
     * @author François Agneray <francois.agneray@lam.fr>
     * @package App\Action
     */
    final class InstanceAction extends AbstractAction
    {
        /**
         * `GET` Returns the instance found
         * `PUT` Full update the instance and returns the new version
         * `DELETE` Delete the instance found and return a confirmation message
         *
         * @param  ServerRequestInterface $request  PSR-7 This object represents the HTTP request
         * @param  ResponseInterface      $response PSR-7 This object represents the HTTP response
         * @param  string[]               $args     This table contains information transmitted in the URL (see routes.php)
         *
         * @return ResponseInterface
         */
    
        public function __invoke(
            ServerRequestInterface $request,
            ResponseInterface $response,
            array $args
        ): ResponseInterface {
    
    François Agneray's avatar
    François Agneray committed
            if ($request->getMethod() === OPTIONS) {
                return $response->withHeader('Access-Control-Allow-Methods', 'GET, PUT, DELETE, OPTIONS');
            }
    
            // Search the correct instance with primary key
            $instance = $this->em->find('App\Entity\Instance', $args['name']);
    
            // If instance is not found 404
            if (is_null($instance)) {
                throw new HttpNotFoundException(
                    $request,
                    'Instance with name ' . $args['name'] . ' is not found'
                );
            }
    
            if ($request->getMethod() === GET) {
                $payload = json_encode($instance);
            }
    
            if ($request->getMethod() === PUT) {
                $parsedBody = $request->getParsedBody();
    
    
                // To work this action needs information to update instance
                $fields = array(
                    'label',
                    'description',
                    'scientific_manager',
                    'instrument',
                    'wavelength_domain',
                    'display',
                    'data_path',
                    'files_path',
                    'public',
                    'portal_logo',
                    'design_color',
                    'design_background_color',
                    'design_logo',
                    'design_favicon',
    
    François Agneray's avatar
    François Agneray committed
                    'navbar_background_color',
                    'navbar_border_bottom_color',
                    'navbar_color_href',
    
    François Agneray's avatar
    François Agneray committed
                    'navbar_font_family',
                    'navbar_sign_in_btn_color',
                    'navbar_user_btn_color',
    
    François Agneray's avatar
    François Agneray committed
                    'footer_background_color',
                    'footer_border_top_color',
                    'footer_text_color',
    
                    'footer_logos',
    
                    'family_border_color',
                    'family_header_background_color',
                    'family_title_color',
                    'family_title_bold',
    
                    'family_background_color',
    
                    'progress_bar_title',
    
    François Agneray's avatar
    François Agneray committed
                    'progress_bar_title_color',
    
                    'progress_bar_subtitle',
    
    François Agneray's avatar
    François Agneray committed
                    'progress_bar_subtitle_color',
    
                    'progress_bar_step_dataset_title',
                    'progress_bar_step_criteria_title',
                    'progress_bar_step_output_title',
                    'progress_bar_step_result_title',
    
                    'progress_bar_color',
                    'progress_bar_active_color',
                    'progress_bar_circle_color',
    
    François Agneray's avatar
    François Agneray committed
                    'progress_bar_circle_icon_color',
                    'progress_bar_circle_icon_active_color',
    
                    'progress_bar_text_color',
    
    François Agneray's avatar
    François Agneray committed
                    'result_header_background_color',
                    'result_header_text_color',
                    'result_header_btn_color',
                    'result_header_btn_hover_color',
                    'result_header_btn_text_color',
    
    François Agneray's avatar
    François Agneray committed
                    'result_datatable_bordered',
                    'result_datatable_border_color',
                    'result_datatable_header_background_color',
                    'result_datatable_header_text_color',
                    'result_datatable_rows_background_color',
                    'result_datatable_rows_text_color',
                    'result_datatable_sorted_color',
                    'result_datatable_sorted_active_color',
                    'result_datatable_link_color',
                    'result_datatable_link_hover_color',
                    'result_datatable_rows_selected_color',
    
                    'samp_enabled',
                    'back_to_portal',
    
    François Agneray's avatar
    François Agneray committed
                    'user_menu_enabled',
    
                    'search_by_criteria_allowed',
                    'search_by_criteria_label',
                    'search_multiple_allowed',
                    'search_multiple_label',
                    'search_multiple_all_datasets_selected',
                    'documentation_allowed',
                    'documentation_label'
                );
    
    
    François Agneray's avatar
    François Agneray committed
                // If mandatories empty fields 400
    
                foreach ($fields as $a) {
                    if (!array_key_exists($a, $parsedBody)) {
    
    François Agneray's avatar
    François Agneray committed
                        throw new HttpBadRequestException(
                            $request,
                            'Param ' . $a . ' needed to edit the instance'
                        );
                    }
                }
    
                $this->editInstance($instance, $parsedBody);
                $payload = json_encode($instance);
            }
    
            if ($request->getMethod() === DELETE) {
                $name = $instance->getName();
                $this->em->remove($instance);
                $this->em->flush();
                $payload = json_encode(array('message' => 'Instance with name ' . $name . ' is removed!'));
            }
    
            $response->getBody()->write($payload);
            return $response;
        }
    
        /**
         * Update instance object with setters
         *
         * @param Instance $instance   The instance to update
         * @param array    $parsedBody Contains the new values ​​of the instance sent by the user
         */
        private function editInstance(Instance $instance, array $parsedBody): void
        {
            $instance->setLabel($parsedBody['label']);
    
    François Agneray's avatar
    François Agneray committed
            $instance->setDescription($parsedBody['description']);
    
            $instance->setScientificManager($parsedBody['scientific_manager']);
            $instance->setInstrument($parsedBody['instrument']);
            $instance->setWavelengthDomain($parsedBody['wavelength_domain']);
    
    François Agneray's avatar
    François Agneray committed
            $instance->setDisplay($parsedBody['display']);
    
            $instance->setDataPath($parsedBody['data_path']);
    
            $instance->setFilesPath($parsedBody['files_path']);
    
    François Agneray's avatar
    François Agneray committed
            $instance->setPublic($parsedBody['public']);
    
    François Agneray's avatar
    François Agneray committed
            $instance->setPortalLogo($parsedBody['portal_logo']);
    
    François Agneray's avatar
    François Agneray committed
            $instance->setDesignColor($parsedBody['design_color']);
            $instance->setDesignBackgroundColor($parsedBody['design_background_color']);
            $instance->setDesignLogo($parsedBody['design_logo']);
            $instance->setDesignFavicon($parsedBody['design_favicon']);
    
    François Agneray's avatar
    François Agneray committed
            $instance->setNavbarBackgroundColor($parsedBody['navbar_background_color']);
            $instance->setNavbarBorderBottomColor($parsedBody['navbar_border_bottom_color']);
            $instance->setNavbarColorHref($parsedBody['navbar_color_href']);
    
    François Agneray's avatar
    François Agneray committed
            $instance->setNavbarFontFamily($parsedBody['navbar_font_family']);
            $instance->setNavbarSignInBtnColor($parsedBody['navbar_sign_in_btn_color']);
            $instance->setNavbarUserBtnColor($parsedBody['navbar_user_btn_color']);
    
    François Agneray's avatar
    François Agneray committed
            $instance->setFooterBackgroundColor($parsedBody['footer_background_color']);
            $instance->setFooterBorderTopColor($parsedBody['footer_border_top_color']);
            $instance->setFooterTextColor($parsedBody['footer_text_color']);
    
            $instance->setFooterLogos($parsedBody['footer_logos']);
    
            $instance->setFamilyBorderColor($parsedBody['family_border_color']);
            $instance->setFamilyHeaderBackgroundColor($parsedBody['family_header_background_color']);
            $instance->setFamilyTitleColor($parsedBody['family_title_color']);
            $instance->setFamilyTitleBold($parsedBody['family_title_bold']);
    
            $instance->setFamilyBackgroundColor($parsedBody['family_background_color']);
    
            $instance->setFamilyColor($parsedBody['family_color']);
    
            $instance->setProgressBarTitle($parsedBody['progress_bar_title']);
    
    François Agneray's avatar
    François Agneray committed
            $instance->setProgressBarTitleColor($parsedBody['progress_bar_title_color']);
    
            $instance->setProgressBarSubtitle($parsedBody['progress_bar_subtitle']);
    
    François Agneray's avatar
    François Agneray committed
            $instance->setProgressBarSubtitleColor($parsedBody['progress_bar_subtitle_color']);
    
            $instance->setProgressBarStepDatasetTitle($parsedBody['progress_bar_step_dataset_title']);
            $instance->setProgressBarStepCriteriaTitle($parsedBody['progress_bar_step_criteria_title']);
            $instance->setProgressBarStepOutputTitle($parsedBody['progress_bar_step_output_title']);
            $instance->setProgressBarStepResultTitle($parsedBody['progress_bar_step_result_title']);
    
            $instance->setProgressBarColor($parsedBody['progress_bar_color']);
            $instance->setProgressBarActiveColor($parsedBody['progress_bar_active_color']);
            $instance->setProgressBarCircleColor($parsedBody['progress_bar_circle_color']);
    
    François Agneray's avatar
    François Agneray committed
            $instance->setProgressBarCircleIconColor($parsedBody['progress_bar_circle_icon_color']);
            $instance->setProgressBarCircleIconActiveColor($parsedBody['progress_bar_circle_icon_active_color']);
    
            $instance->setProgressBarTextColor($parsedBody['progress_bar_text_color']);
    
    François Agneray's avatar
    François Agneray committed
            $instance->setResultHeaderBackgroundColor($parsedBody['result_header_background_color']);
            $instance->setResultHeaderTextColor($parsedBody['result_header_text_color']);
            $instance->setResultHeaderBtnColor($parsedBody['result_header_btn_color']);
            $instance->setResultHeaderBtnHoverColor($parsedBody['result_header_btn_hover_color']);
            $instance->setResultHeaderBtnTextColor($parsedBody['result_header_btn_text_color']);
    
    François Agneray's avatar
    François Agneray committed
            $instance->setResultDatatableBordered($parsedBody['result_datatable_bordered']);
            $instance->setResultDatatableBorderColor($parsedBody['result_datatable_border_color']);
            $instance->setResultDatatableHeaderBackgroundColor($parsedBody['result_datatable_header_background_color']);
            $instance->setResultDatatableHeaderTextColor($parsedBody['result_datatable_header_text_color']);
            $instance->setResultDatatableRowsBackgroundColor($parsedBody['result_datatable_rows_background_color']);
            $instance->setResultDatatableRowsTextColor($parsedBody['result_datatable_rows_text_color']);
            $instance->setResultDatatableSortedColor($parsedBody['result_datatable_sorted_color']);
            $instance->setResultDatatableSortedActiveColor($parsedBody['result_datatable_sorted_active_color']);
            $instance->setResultDatatableLinkColor($parsedBody['result_datatable_link_color']);
            $instance->setResultDatatableLinkHoverColor($parsedBody['result_datatable_link_hover_color']);
            $instance->setResultDatatableRowsSelectedColor($parsedBody['result_datatable_rows_selected_color']);
    
    François Agneray's avatar
    François Agneray committed
            $instance->setSampEnabled($parsedBody['samp_enabled']);
    
    François Agneray's avatar
    François Agneray committed
            $instance->setUserMenuEnabled($parsedBody['user_menu_enabled']);
    
            $instance->setBackToPortal($parsedBody['back_to_portal']);
    
    François Agneray's avatar
    François Agneray committed
            $instance->setSearchByCriteriaAllowed($parsedBody['search_by_criteria_allowed']);
            $instance->setSearchByCriteriaLabel($parsedBody['search_by_criteria_label']);
            $instance->setSearchMultipleAllowed($parsedBody['search_multiple_allowed']);
            $instance->setSearchMultipleLabel($parsedBody['search_multiple_label']);
            $instance->setSearchMultipleAllDatasetsSelected($parsedBody['search_multiple_all_datasets_selected']);
            $instance->setDocumentationAllowed($parsedBody['documentation_allowed']);
            $instance->setDocumentationLabel($parsedBody['documentation_label']);
    
    François Agneray's avatar
    François Agneray committed
    
    
    François Agneray's avatar
    François Agneray committed
            $this->em->flush();
        }
    }