205 lines
7.2 KiB
PHP
205 lines
7.2 KiB
PHP
<?php
|
|
|
|
namespace App\Libraries;
|
|
|
|
use Google\Client;
|
|
use Google\Service\Calendar;
|
|
use Google\Service\Calendar\Event;
|
|
|
|
class GoogleCalendarService
|
|
{
|
|
protected $client;
|
|
protected $service;
|
|
|
|
public function __construct()
|
|
{
|
|
$appName = getenv('GOOGLE_OAUTH_APP_NAME');
|
|
$clientID = getenv('GOOGLE_OAUTH_CLIENT_ID');
|
|
$clientSecret = getenv('GOOGLE_OAUTH_CLIENT_SECRET');
|
|
$redirectUri = getenv('GOOGLE_OAUTH_REDIRECT_URI');
|
|
$scopes = getenv('GOOGLE_OAUTH_SCOPES');
|
|
|
|
$scopesArray = explode(',', $scopes);
|
|
|
|
$this->client = new Client();
|
|
$this->client->setApplicationName($appName);
|
|
$this->client->setClientId($clientID);
|
|
$this->client->setClientSecret($clientSecret);
|
|
$this->client->setRedirectUri($redirectUri);
|
|
$this->client->addScope($scopesArray);
|
|
$this->client->setPrompt('consent');
|
|
$this->client->setAccessType('offline');
|
|
|
|
$accessToken = session()->get('access_token');
|
|
$refreshToken = session()->get('refresh_token'); // Session-la irunthu refresh token-a edukkurom
|
|
|
|
if ($accessToken) {
|
|
$this->client->setAccessToken($accessToken);
|
|
|
|
if ($this->client->isAccessTokenExpired()) {
|
|
if ($refreshToken) {
|
|
// Ippo session-la iruntha refresh token-a vechu puthu access token vaangurom
|
|
$newToken = $this->client->fetchAccessTokenWithRefreshToken($refreshToken);
|
|
|
|
// Romba mukkiyam: Puthu token-la refresh token thirumba varaathu,
|
|
// so pazhaya refresh token-aiye namma retain pannanum.
|
|
if (!isset($newToken['refresh_token'])) {
|
|
$newToken['refresh_token'] = $refreshToken;
|
|
}
|
|
|
|
session()->set('access_token', $newToken);
|
|
$this->client->setAccessToken($newToken);
|
|
} else {
|
|
// Refresh token illana, user marubadiyum login panna sollanum
|
|
return redirect()->to('/google-login');
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public function isReady()
|
|
{
|
|
return $token = session()->get('access_token') && !$this->client->isAccessTokenExpired();
|
|
}
|
|
|
|
public function createEventForOrganizerOnly(array $data)
|
|
{
|
|
$this->service = new Calendar($this->client);
|
|
|
|
// Date kuda '10:00' add panrathu safe
|
|
$meeting_start = preg_match('/^\d{4}-\d{2}-\d{2}$/', $data['meeting_date']) ? $data['meeting_date'] . ' 10:00:00' : $data['meeting_date'];
|
|
|
|
$event = new Event([
|
|
'summary' => $data['summary'],
|
|
'description' => $data['description'] ?? '',
|
|
'start' => [
|
|
'dateTime' => date('c', strtotime($meeting_start)), // Ippo 10 AM-nu fix aagidum
|
|
'timeZone' => 'Asia/Kolkata',
|
|
],
|
|
'end' => [
|
|
'dateTime' => date('c', strtotime($meeting_start . ' +30 minutes')),
|
|
'timeZone' => 'Asia/Kolkata',
|
|
],
|
|
'reminders' => [
|
|
'useDefault' => false,
|
|
'overrides' => [
|
|
['method' => 'email', 'minutes' => 1440], // Munthuna naal 10 AM
|
|
['method' => 'popup', 'minutes' => 60], // Event annaki 9 AM
|
|
],
|
|
],
|
|
]);
|
|
|
|
return $this->service->events->insert('primary', $event);
|
|
}
|
|
|
|
public function createEvent(array $data)
|
|
{
|
|
$this->service = new Calendar($this->client);
|
|
$responses = [];
|
|
|
|
try {
|
|
|
|
$meetingStartRaw = (preg_match('/^\d{4}-\d{2}-\d{2}$/', $data['meeting_date']))
|
|
? $data['meeting_date'] . ' 10:00:00'
|
|
: $data['meeting_date'];
|
|
|
|
$startTime = date('c', strtotime($meetingStartRaw));
|
|
$endTime = date('c', strtotime(date('Y-m-d', strtotime($meetingStartRaw)) . ' 23:59:59'));
|
|
|
|
// 2. Prepare Attendees
|
|
$attendees = [];
|
|
if (!empty($data['emails']) && is_array($data['emails'])) {
|
|
foreach ($data['emails'] as $email) {
|
|
$attendees[] = ['email' => $email];
|
|
}
|
|
}
|
|
|
|
// 3. Define the Event
|
|
$event = new Event([
|
|
'summary' => $data['summary'],
|
|
'description' => $data['description'] ?? '',
|
|
'start' => ['dateTime' => $startTime, 'timeZone' => 'Asia/Kolkata'],
|
|
'end' => ['dateTime' => $endTime, 'timeZone' => 'Asia/Kolkata'],
|
|
'attendees' => $attendees,
|
|
'reminders' => [
|
|
'useDefault' => false,
|
|
'overrides' => [
|
|
['method' => 'email', 'minutes' => 1440],
|
|
['method' => 'popup', 'minutes' => 60],
|
|
],
|
|
],
|
|
]);
|
|
|
|
$optParams = ['sendUpdates' => 'all'];
|
|
|
|
$calendarId = 'primary';
|
|
$result = $this->service->events->insert($calendarId, $event, $optParams);
|
|
|
|
$responses['status'] = 'success';
|
|
$responses['event_id'] = $result->getId();
|
|
$responses['raw_response'] = $result;
|
|
|
|
} catch (\Exception $e) {
|
|
|
|
$error_data = [
|
|
'error' => $e->getMessage(),
|
|
'data' => $data,
|
|
'trace' => $e->getTraceAsString()
|
|
];
|
|
|
|
// Log only on failure
|
|
log_message('error', 'Google Calendar Event Creation Failed' . json_encode($error_data ?? []));
|
|
|
|
$responses['status'] = 'error';
|
|
$responses['message'] = $e->getMessage();
|
|
$responses['error_data'] = $error_data;
|
|
}
|
|
|
|
return $responses;
|
|
}
|
|
|
|
public function createStaffEvent(array $data)
|
|
{
|
|
$results = [];
|
|
|
|
$meetingStartRaw = (preg_match('/^\d{4}-\d{2}-\d{2}$/', $data['meeting_date']))
|
|
? $data['meeting_date'] . ' 10:00:00'
|
|
: $data['meeting_date'];
|
|
|
|
$startTime = date('c', strtotime($meetingStartRaw));
|
|
$endTime = date('c', strtotime(date('Y-m-d', strtotime($meetingStartRaw)) . ' 23:59:59'));
|
|
|
|
|
|
// Event Object create panrom (Common for all staff)
|
|
$event = new Event([
|
|
'summary' => $data['summary'],
|
|
'description' => $data['description'] ?? '',
|
|
'start' => ['dateTime' => $startTime, 'timeZone' => 'Asia/Kolkata'],
|
|
'end' => ['dateTime' => $endTime, 'timeZone' => 'Asia/Kolkata'],
|
|
'reminders' => [
|
|
'useDefault' => false,
|
|
'overrides' => [
|
|
['method' => 'email', 'minutes' => 1440],
|
|
['method' => 'popup', 'minutes' => 60],
|
|
],
|
|
],
|
|
]);
|
|
|
|
// Loop through each staff email in the array
|
|
foreach ($data['emails'] as $email) {
|
|
try {
|
|
|
|
$this->client->setSubject($email);
|
|
|
|
$staffService = new Calendar($this->client);
|
|
|
|
$results[$email] = $staffService->events->insert('primary', $event);
|
|
|
|
} catch (\Exception $e) {
|
|
$results[$email] = 'Error: ' . $e->getMessage();
|
|
}
|
|
}
|
|
|
|
return $results;
|
|
}
|
|
} |