diff --git a/app/Controllers/TestingController.php b/app/Controllers/TestingController.php index 7cfc5ab2..66957ea8 100644 --- a/app/Controllers/TestingController.php +++ b/app/Controllers/TestingController.php @@ -990,16 +990,24 @@ class TestingController extends BaseController // 🔐 Move this to .env in real projects $METABASE_SECRET_KEY = getenv('METABASE_SECRET_KEY'); - $policy_id = $this->request->getGet('client_policy'); + $database_id = (int)$this->request->getGet('database_id') ?? 2; + $policy_id = $this->request->getGet('client_policy') ?? null; + $tpa_url = 'https://nsights.nhanceindia.in/public/dashboard/4babf324-6c1e-4c5a-adbb-1c80a0f545b1'; $policy_id = $policy_id ? $policy_id : 4687; $payload = [ 'resource' => [ // 'dashboard' => 1 - 'dashboard' => 2 + 'dashboard' => $database_id ], - 'params' => (object)['client_policy' => $policy_id], // MUST be object for Metabase 'exp' => time() + (10 * 60) // 10 minutes ]; + + if(!empty($policy_id)){ + $payload['params'] = (object)['client_policy' => $policy_id]; // MUST be object for Metabase + }else{ + $payload['params'] = (object)[]; // MUST be object for Metabase + } + // dd($payload); $token = JWT::encode($payload, $METABASE_SECRET_KEY, 'HS256'); @@ -1025,6 +1033,31 @@ class TestingController extends BaseController ]); } + public function testingquerys1(){ + } + public function testingquerys() + { + $calendar = new \App\Libraries\GoogleCalendarService(); + + // Check if user is authenticated without passing tokens manually + if (!$calendar->isReady()) { + return $this->respond(['status' => 'failed', 'code' => '404' , 'message' => 'Google Access Token Expired'], 200); + } + + $data = [ + 'summary' => 'Client Follow up', + 'meeting_date' => '2026-02-22 10:00:00', + 'description' => 'Visit Client place', + 'emails' => ['surendarsuri30@gmail.com', 'vitvelz@gmail.com', 'venbalap2026@gmail.com', 'gowthamceline46@gmail.com'] + ]; + + try { + $response = $calendar->createEvent($data); + return $this->respond(['status' => 'success', 'code' => '200' , 'message' => 'Follow-up Saved', 'response' => $response], 200); + } catch (\Exception $e) { + return $this->respond(['status' => 'failed', 'code' => '500' , 'message' => 'Error: ' . $e->getMessage()], 200); + } + } } diff --git a/app/Libraries/GoogleCalendarService.php b/app/Libraries/GoogleCalendarService.php new file mode 100644 index 00000000..8076a260 --- /dev/null +++ b/app/Libraries/GoogleCalendarService.php @@ -0,0 +1,205 @@ +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; + } +} \ No newline at end of file