nhance/app/Libraries/GoogleCalendarService.php
2026-02-21 15:29:37 +05:30

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;
}
}