Completed
Push — master ( bd294a...021b8c )
by Freek
02:01
created

src/Event.php (1 issue)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
3
namespace Spatie\GoogleCalendar;
4
5
use Carbon\Carbon;
6
use DateTime;
7
use Google_Service_Calendar_Event;
8
use Google_Service_Calendar_EventDateTime;
9
use Illuminate\Support\Collection;
10
11
class Event
12
{
13
    /** @var Google_Service_Calendar_Event */
14
    public $googleEvent;
15
16
    /** @var int */
17
    protected $calendarId;
18
19
    public static function createFromGoogleCalendarEvent(Google_Service_Calendar_Event $googleEvent, $calendarId)
20
    {
21
        $event = new static();
22
23
        $event->googleEvent = $googleEvent;
24
25
        $event->calendarId = $calendarId;
26
27
        return $event;
28
    }
29
30
    public static function create(array $properties, string $calendarId = null)
31
    {
32
        $event = new static();
33
34
        $event->calendarId = static::getGoogleCalendar($calendarId)->getCalendarId();
35
36
        foreach ($properties as $name => $value) {
37
            $event->$name = $value;
38
        }
39
40
        return $event->save();
41
    }
42
43
    public function __construct()
44
    {
45
        $this->googleEvent = new Google_Service_Calendar_Event();
46
    }
47
48
    /**
49
     * @param string $name
50
     *
51
     * @return mixed
52
     */
53
    public function __get($name)
54
    {
55
        $name = $this->translateFieldName($name);
56
57
        if ($name === 'sortDate') {
58
            return $this->getSortDate();
59
        }
60
61
        $value = array_get($this->googleEvent, $name);
62
63
        if (in_array($name, ['start.date', 'end.date']) && $value) {
64
            $value = Carbon::createFromFormat('Y-m-d', $value);
65
        }
66
67
        if (in_array($name, ['start.dateTime', 'end.dateTime']) && $value) {
68
            $value = Carbon::createFromFormat(DateTime::RFC3339, $value);
69
        }
70
71
        return $value;
72
    }
73
74
    public function __set($name, $value)
75
    {
76
        $name = $this->translateFieldName($name);
77
78
        if (in_array($name, ['start.date', 'end.date', 'start.dateTime', 'end.dateTime'])) {
79
            $this->setDateProperty($name, $value);
80
81
            return;
82
        }
83
84
        array_set($this->googleEvent, $name, $value);
85
    }
86
87
    public function exists() : bool
88
    {
89
        return $this->id != '';
90
    }
91
92
    public function isAllDayEvent() : bool
93
    {
94
        return is_null($this->googleEvent['start']['dateTime']);
95
    }
96
97
    /**
98
     * @param \Carbon\Carbon|null $startDateTime
99
     * @param \Carbon\Carbon|null $endDateTime
100
     * @param array               $queryParameters
101
     * @param string|null         $calendarId
102
     *
103
     * @return \Illuminate\Support\Collection
104
     */
105
    public static function get(Carbon $startDateTime = null, Carbon $endDateTime = null, array $queryParameters = [], string $calendarId = null) : Collection
106
    {
107
        $googleCalendar = self::getGoogleCalendar($calendarId);
108
109
        $googleEvents = $googleCalendar->listEvents($startDateTime, $endDateTime, $queryParameters);
110
111
        return collect($googleEvents)
112
            ->map(function (Google_Service_Calendar_Event $event) use ($calendarId) {
113
                return Event::createFromGoogleCalendarEvent($event, $calendarId);
114
            })
115
            ->sortBy(function (Event $event) {
116
                return $event->sortDate;
117
            })
118
            ->values();
119
    }
120
121
    /**
122
     * @param string $eventId
123
     * @param string $calendarId
124
     *
125
     * @return \Spatie\GoogleCalendar\Event
126
     */
127
    public static function find($eventId, $calendarId = null) : Event
128
    {
129
        $googleCalendar = self::getGoogleCalendar($calendarId);
130
131
        $googleEvent = $googleCalendar->getEvent($eventId);
132
133
        return self::createFromGoogleCalendarEvent($googleEvent, $calendarId);
134
    }
135
136
    public function save() : Event
137
    {
138
        $method = $this->exists() ? 'updateEvent' : 'insertEvent';
139
140
        $googleCalendar = $this->getGoogleCalendar();
141
142
        $googleEvent = $googleCalendar->$method($this);
143
144
        return self::createFromGoogleCalendarEvent($googleEvent, $googleCalendar->getCalendarId());
145
    }
146
147
    /**
148
     * @param string $eventId
149
     *
150
     * @return mixed
151
     */
152
    public function delete(string $eventId = null)
153
    {
154
        return $this->getGoogleCalendar($this->calendarId)->deleteEvent($eventId ?? $this->id);
155
    }
156
157
    /**
158
     * @param string $calendarId
159
     *
160
     * @return \Spatie\GoogleCalendar\GoogleCalendar
161
     */
162
    protected static function getGoogleCalendar($calendarId = null) : GoogleCalendar
163
    {
164
        $calendarId = $calendarId ?? config('laravel-google-calendar.calendar_id');
165
166
        return GoogleCalendarFactory::createForCalendarId($calendarId);
167
    }
168
169
    /**
170
     * @param string         $name
171
     * @param \Carbon\Carbon $date
172
     */
173
    protected function setDateProperty(string $name, Carbon $date)
174
    {
175
        $eventDateTime = new Google_Service_Calendar_EventDateTime();
176
177
        if (in_array($name, ['start.date', 'end.date'])) {
178
            $eventDateTime->setDate($date->format('Y-m-d'));
179
        }
180
181
        if (in_array($name, ['start.dateTime', 'end.dateTime'])) {
182
            $eventDateTime->setDateTime($date->format(DateTime::RFC3339));
183
        }
184
185
        if (starts_with($name, 'start')) {
186
            $this->googleEvent->setStart($eventDateTime);
187
        }
188
189
        if (starts_with($name, 'end')) {
190
            $this->googleEvent->setEnd($eventDateTime);
191
        }
192
    }
193
194
    protected function translateFieldName(string $name) : string
195
    {
196
        $translations = [
197
            'name' => 'summary',
198
            'startDate' => 'start.date',
199
            'endDate' => 'end.date',
200
            'startDateTime' => 'start.dateTime',
201
            'endDateTime' => 'end.dateTime',
202
        ];
203
204
        return $translations[$name] ?? $name;
205
    }
206
207
    public function getSortDate()
208
    {
209
        if ($this->startDate) {
210
            return $this->startDate;
211
        }
212
213
        if ($this->startDateTime) {
0 ignored issues
show
The property startDateTime does not exist on object<Spatie\GoogleCalendar\Event>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
214
            return $this->startDateTime;
215
        }
216
217
        return;
218
    }
219
}
220