Covivo/mobicoop

View on GitHub
client/src/MobicoopBundle/Event/Service/EventManager.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php

/**
 * Copyright (c) 2020, MOBICOOP. All rights reserved.
 * This project is dual licensed under AGPL and proprietary licence.
 ***************************
 *    This program 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.
 *
 *    This program 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 this program.  If not, see <gnu.org/licenses>.
 ***************************
 *    Licence MOBICOOP described in the file
 *    LICENSE
 */

namespace Mobicoop\Bundle\MobicoopBundle\Event\Service;

use Mobicoop\Bundle\MobicoopBundle\Api\Service\DataProvider;
use Mobicoop\Bundle\MobicoopBundle\Community\Service\CommunityManager;
use Mobicoop\Bundle\MobicoopBundle\Event\Entity\Event;
use Mobicoop\Bundle\MobicoopBundle\Geography\Entity\Address;
use Mobicoop\Bundle\MobicoopBundle\User\Entity\User;

/**
 * Event management service.
 */
class EventManager
{
    private $dataProvider;
    private $territoryFilter;
    private $communityManager;

    /**
     * Constructor.
     */
    public function __construct(DataProvider $dataProvider, array $territoryFilter, CommunityManager $communityManager)
    {
        $this->dataProvider = $dataProvider;
        $this->dataProvider->setClass(Event::class);
        $this->territoryFilter = $territoryFilter;
        $this->communityManager = $communityManager;
    }

    /**
     * Create an event.
     *
     * @param Event $event The event to create
     * @param mixed $data
     *
     * @return null|Event the event created or null if error
     */
    public function createEvent($data, Event $event, User $user)
    {
        $address = new Address();
        // set the user as a user of the community
        $event->setUser($user);

        // set event address
        $eventAddress = json_decode($data->get('address'), true);
        $address->setLayer(isset($eventAddress['layer']) ? $eventAddress['layer'] : null);
        $address->setAddressCountry(isset($eventAddress['addressCountry']) ? $eventAddress['addressCountry'] : null);
        $address->setAddressLocality(isset($eventAddress['addressLocality']) ? $eventAddress['addressLocality'] : null);
        $address->setCountryCode(isset($eventAddress['countryCode']) ? $eventAddress['countryCode'] : null);
        $address->setCounty(isset($eventAddress['county']) ? $eventAddress['county'] : null);
        $address->setLatitude(isset($eventAddress['latitude']) ? $eventAddress['latitude'] : null);
        $address->setLocalAdmin(isset($eventAddress['localAdmin']) ? $eventAddress['localAdmin'] : null);
        $address->setLongitude(isset($eventAddress['longitude']) ? $eventAddress['longitude'] : null);
        $address->setMacroCounty(isset($eventAddress['macroCounty']) ? $eventAddress['macroCounty'] : null);
        $address->setMacroRegion(isset($eventAddress['macroRegion']) ? $eventAddress['macroRegion'] : null);
        $address->setPostalCode(isset($eventAddress['postalCode']) ? $eventAddress['postalCode'] : null);
        $address->setRegion(isset($eventAddress['region']) ? $eventAddress['region'] : null);
        $address->setStreet(isset($eventAddress['street']) ? $eventAddress['street'] : null);
        $address->setHouseNumber(isset($eventAddress['houseNumber']) ? $eventAddress['houseNumber'] : null);
        $address->setStreetAddress(isset($eventAddress['streetAddress']) ? $eventAddress['streetAddress'] : null);
        $address->setSubLocality(isset($eventAddress['subLocality']) ? $eventAddress['subLocality'] : null);
        $address->setDisplayLabel(isset($eventAddress['displayLabel']) ? $eventAddress['displayLabel'] : null);

        // Set Datetime from data
        $from = null != $data->get('startTime') ? new \DateTime($data->get('startDate').'.'.$data->get('startTime')) : new \DateTime($data->get('startDate'));
        $to = null != $data->get('endTime') ? new \DateTime($data->get('endDate').'.'.$data->get('endTime')) : new \DateTime($data->get('endDate'));
        // Set use time = 1, if user set time
        $flagTime = (null == $data->get('endTime') && null == $data->get('startTime')) ? 0 : 1;
        $event->setUseTime($flagTime);
        $event->setStatus(1);

        // set event infos
        $event->setName($data->get('name'));
        $event->setPrivate(('true' == $data->get('private')) ? true : false);
        $event->setDescription($data->get('description'));
        $event->setFullDescription($data->get('fullDescription'));
        $event->setAddress($address);
        $event->setUrl($data->get('urlEvent'));
        $event->setFromDate($from);
        $event->setToDate($to);
        if (null != json_decode($data->get('community'))) {
            $event->setCommunity($this->communityManager->getCommunity(intval($data->get('community'))));
        }
        $response = $this->dataProvider->post($event);

        // Event is created : we send the email to the owner
        if (201 == $response->getCode()) {
            $this->dataProvider->simplePost('events/'.$response->getValue()->getId().'/valide_create_event');

            return $response->getValue();
        }

        return null;
    }

    /**
     * Get all events which end date happens after a certain date.
     *
     * @param \DateTimeInterface $endDateIsAfter The date after which the end date of events are taken account (usually the current date)
     * @param int                $flag           Flag for know if we want event passed or incoming (0, past, 1 incoming)
     * @param string             $orderBy        Property on which order the results (id or fromDate)
     * @param string             $order          Order type (asc or desc)
     * @param int                $limit          The max number of results
     * @param int                $page           The hydra page
     * @param null|int           $search         Array of search criterias
     *
     * @return null|array the events found or null if not found
     */
    public function getEvents($flag = 1, ?\DateTimeInterface $endDateIsAfter = null, string $orderBy = 'fromDate', string $order = 'asc', int $limit = null, int $page = 1, $search = [], int $communityId = null)
    {
        // we only retrieve the public events, private events are still available directly with the correct url
        $params = ['private' => false];

        $endDate = $endDateIsAfter ? $endDateIsAfter : $now = new \DateTime();
        if (0 == $flag) {
            $params['toDate[strictly_before]'] = $endDate->format('Y-m-d');
        } else {
            $params['toDate[after]'] = $endDate->format('Y-m-d');
        }

        if ('fromDate' == $orderBy) {
            $params['order[fromDate]'] = $order;
        }
        if ('id' == $orderBy) {
            $params['order[id]'] = $order;
        }
        if ($limit) {
            $params['perPage'] = $limit;
        }
        if ($page) {
            $params['page'] = $page;
        }
        if (count($this->territoryFilter) > 0) {
            $params['territory'] = $this->territoryFilter;
        }
        if (count($search) > 0) {
            foreach ($search as $key => $value) {
                $params[$key] = $value;
            }
        }
        if ($communityId) {
            $params['community.id'] = $communityId;
        }

        $response = $this->dataProvider->getCollection($params);
        if ($response->getCode() >= 200 && $response->getCode() <= 300) {
            return $response->getValue();
        }

        return $response->getValue();
    }

    public function getLastEventsCreated(string $orderBy = 'createdDate', string $order = 'desc', int $limit = null, int $page = 1)
    {
        $params["order['.{$orderBy}']"] = $order;
        $params['order[id]'] = $order;
        $params['perPage'] = $limit;
        $params['page'] = $page;
        $params['private'] = false;
        $response = $this->dataProvider->getCollection($params);
        if ($response->getCode() >= 200 && $response->getCode() <= 300) {
            return $response->getValue();
        }

        return $response->getValue();
    }

    /**
     * Get an event.
     *
     * @return null|Event the event found or null if not found
     */
    public function getEvent(int $id)
    {
        $response = $this->dataProvider->getItem($id);
        if ($response->getCode() >= 200 && $response->getCode() <= 300) {
            return $response->getValue();
        }

        return null;
    }

    public function updateEvent($data, Event $event)
    {
        $address = new Address();

        // set event address
        $eventAddress = json_decode($data->get('address'), true);
        $address->setLayer(isset($eventAddress['layer']) ? $eventAddress['layer'] : null);
        $address->setAddressCountry(isset($eventAddress['addressCountry']) ? $eventAddress['addressCountry'] : null);
        $address->setAddressLocality(isset($eventAddress['addressLocality']) ? $eventAddress['addressLocality'] : null);
        $address->setCountryCode(isset($eventAddress['countryCode']) ? $eventAddress['countryCode'] : null);
        $address->setCounty(isset($eventAddress['county']) ? $eventAddress['county'] : null);
        $address->setLatitude(isset($eventAddress['latitude']) ? $eventAddress['latitude'] : null);
        $address->setLocalAdmin(isset($eventAddress['localAdmin']) ? $eventAddress['localAdmin'] : null);
        $address->setLongitude(isset($eventAddress['longitude']) ? $eventAddress['longitude'] : null);
        $address->setMacroCounty(isset($eventAddress['macroCounty']) ? $eventAddress['macroCounty'] : null);
        $address->setMacroRegion(isset($eventAddress['macroRegion']) ? $eventAddress['macroRegion'] : null);
        $address->setPostalCode(isset($eventAddress['postalCode']) ? $eventAddress['postalCode'] : null);
        $address->setRegion(isset($eventAddress['region']) ? $eventAddress['region'] : null);
        $address->setStreet(isset($eventAddress['street']) ? $eventAddress['street'] : null);
        $address->setHouseNumber(isset($eventAddress['houseNumber']) ? $eventAddress['houseNumber'] : null);
        $address->setStreetAddress(isset($eventAddress['streetAddress']) ? $eventAddress['streetAddress'] : null);
        $address->setSubLocality(isset($eventAddress['subLocality']) ? $eventAddress['subLocality'] : null);
        $address->setDisplayLabel(isset($eventAddress['displayLabel']) ? $eventAddress['displayLabel'] : null);

        // Set Datetime from data
        $from = null != $data->get('startTime') ? new \DateTime($data->get('startDate').'.'.$data->get('startTime')) : new \DateTime($data->get('startDate'));
        $to = null != $data->get('endTime') ? new \DateTime($data->get('endDate').'.'.$data->get('endTime')) : new \DateTime($data->get('endDate'));
        // Set use time = 1, if user set time
        $flagTime = (null == $data->get('endTime') && null == $data->get('startTime')) ? 0 : 1;
        $event->setUseTime($flagTime);

        // set event infos
        $event->setName($data->get('name'));
        $event->setPrivate(('true' == $data->get('private')) ? true : false);
        $event->setDescription($data->get('description'));
        $event->setFullDescription($data->get('fullDescription'));
        $event->setAddress($address);
        $event->setUrl($data->get('urlEvent'));
        $event->setFromDate($from);
        $event->setToDate($to);

        $response = $this->dataProvider->put($event);

        return $response->getValue();
    }

    /**
     * Delete an event.
     *
     * @param int $id The id of the event to delete
     *
     * @return bool the result of the deletion
     */
    public function deleteEvent(int $id)
    {
        $response = $this->dataProvider->delete($id);
        if (204 == $response->getCode()) {
            return true;
        }

        return false;
    }

    /**
     * Get the proposals of an event.
     *
     * @throws \ReflectionException
     *
     * @return array|object
     */
    public function getAds(int $id)
    {
        $this->dataProvider->setFormat($this->dataProvider::RETURN_JSON);
        $proposals = $this->dataProvider->getSubCollection($id, 'ad', 'ads');

        return $proposals->getValue();
    }

    /**
     * get  events created by the user.
     */
    public function getCreatedEvents(int $userId)
    {
        $response = $this->dataProvider->getSpecialCollection('created', ['userId' => $userId]);

        return $response->getValue()->getMember();
    }
}