Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 92f406cf authored by AVINASH GUSAIN's avatar AVINASH GUSAIN
Browse files

added background job

parent 2cd87fe1
Loading
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -45,7 +45,7 @@ use OCP\L10N\IFactory as L10NFactory;
use OCP\Defaults;
use OCP\ILogger;
use OCP\IUserManager;

use \OCP\BackgroundJob\IJobList;

class Application extends App implements IBootstrap {

@@ -75,6 +75,7 @@ class Application extends App implements IBootstrap {
				$c->get(ILogger::class),
				$c->get(IUserManager::class),
				$c->get(L10NFactory::class),
				$c->get(IJobList::class),
            );
        });

@@ -99,6 +100,7 @@ class Application extends App implements IBootstrap {
				$c->get(ILogger::class),
				$c->get(IUserManager::class),
				$c->get(L10NFactory::class),
				$c->get(IJobList::class),
            );
        });

+236 −0
Original line number Diff line number Diff line
<?php

declare(strict_types=1);

/**
 * Calendar App
 *
 * @copyright 2021 Anna Larch <anna.larch@gmx.net>
 *
 * @author Anna Larch <anna.larch@gmx.net>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or any later version.
 *
 * This library 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 library.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

namespace OCA\Calendar\BackgroundJob;


use OCP\AppFramework\Utility\ITimeFactory;
use OCP\BackgroundJob\QueuedJob ;
use OCP\ILogger;
use Psr\Log\LoggerInterface;
use OCP\IDBConnection;
use OCP\Defaults;
use OCP\Mail\IMailer;
use OCP\IL10N;
use OCP\IUserManager;
use OCP\IUser;

class SendInviteResponseMailJob extends QueuedJob  {
	/** @var ILogger */
	private $logger;

	public function __construct(ITimeFactory $time,
									IDBConnection $db,
									IManager $calendarManager,
									IMailer $mailer,
									IL10N $l10n,
									Defaults $defaults,
									IUserManager $iusermanager,
									IFactory $languageFactory,
									LoggerInterface $logger) {
		parent::__construct($time);
		$this->db = $db;
		$this->logger = $logger;
		$this->calendarManager = $calendarManager;
		$this->mailer = $mailer;
		$this->l10n = $l10n;
		$this->defaults = $defaults;
		$this->iusermanager = $iusermanager;
		$this->languageFactory = $languageFactory;

	}

	private function getMailAttributes(
		string $methodName,
		array $translationData
	) {
		$meetingTitle = $this->l10n->t(
			self::translations[$methodName]["meeting_title"],
			$translationData["summary"]
		);
		$meetingBody = $this->l10n->t(
			self::translations[$methodName]["meeting_body"],
			[
				$translationData["attendee_name"],
				$translationData["summary"],
				$translationData["event_date"],
			]
		);
		$meetingHead = $this->l10n->t(
			self::translations[$methodName]["meeting_head"]
		);
		return [
			"meeting_title" => $meetingTitle,
			"meeting_body" => $meetingBody,
			"meeting_head" => $meetingHead,
		];
	}
	private function extract_emails_from($string)
	{
		$matches = [];
		$found = preg_match("/mailto:(.*)/i", $string, $matches);
		if ($found === 1) {
			return $matches[1];
		}
		return "";
	}
	protected function run($arguments) {
		print_r($arguments);
		$token = $arguments['token'];
		//$outdated = $this->service->sendInviteResponseMail($argument);
		$queryCalendarInvitations = $this->db->getQueryBuilder();
			$queryCalendarInvitations
				->select("id", "uid", "attendee", "organizer")
				->from("calendar_invitations")
				->where(
					$queryCalendarInvitations
						->expr()
						->eq(
							"token",
							$queryCalendarInvitations->createNamedParameter(
								$token
							)
						)
				);
			$stmt = $queryCalendarInvitations->execute();
			$row = $stmt->fetch(\PDO::FETCH_ASSOC);
			$uid = $row["uid"];
			$sender = $this->extract_emails_from($row["attendee"]);
			$recipient = $this->extract_emails_from($row["organizer"]);
			$userdata = $this->iusermanager->getByEmail($recipient);
			if (count($userdata) > 0) {
				$username = $userdata[0]->getUID();
				$principaluri = "principals/users/" . $username;
				$queryCalendarObjects = $this->db->getQueryBuilder();
				$queryCalendarObjects
					->select("co.id", "co.calendardata")
					->from("calendarobjects", "co")
					->innerJoin(
						"co",
						"calendars",
						"c",
						$queryCalendarObjects
							->expr()
							->eq("co.calendarid", "c.id")
					)
					->where(
						$queryCalendarObjects
							->expr()
							->eq(
								"c.principaluri",
								$queryCalendarObjects->createNamedParameter(
									$principaluri
								)
							)
					)
					->andWhere(
						$queryCalendarObjects
							->expr()
							->eq(
								"co.uid",
								$queryCalendarObjects->createNamedParameter(
									$uid
								)
							)
					);
				$stmt2 = $queryCalendarObjects->execute();

				if ($row2 = $stmt2->fetch(\PDO::FETCH_ASSOC)) {
					$vObject = Reader::read($row2["calendardata"]);

					foreach ($vObject->VEVENT->ATTENDEE as $attendee1) {
						$attendee = $this->extract_emails_from($attendee1);

						if ($attendee == $sender) {
							$attendeeName = empty($attendee1["CN"])
								? $sender
								: $attendee1["CN"];
							break;
						}
					}
					$organizerName = empty($vObject->VEVENT->ORGANIZER["CN"])
						? $recipient
						: $vObject->VEVENT->ORGANIZER["CN"];

					$SUMMARY = $vObject->VEVENT->SUMMARY;
					$datestart = (string) $vObject->VEVENT->DTSTART;
					if (str_contains($datestart, "T")) {
						$eventdate = date("F d, Y h:i", strtotime($datestart));
					} else {
						$eventdate = date("F d, Y", strtotime($datestart));
					}
					$translationData = [
						"summary" => $SUMMARY,
						"attendee_name" => $attendeeName,
						"event_date" => $eventdate,
					];
					$translations = $this->getMailAttributes(
						$methodName,
						$translationData
					);

					$data = [
						"attendee_name" => (string) $sender ?: $defaultVal,
						"invitee_name" => (string) $recipient ?: $defaultVal,
						"meeting_title" =>
							(string) $translations["meeting_title"] ?:
							$defaultVal,
					];
					$method = "reply";
					$emailTemplate = $this->mailer->createEMailTemplate(
						"dav.calendarInvite." . $method,
						$data
					);
					$emailTemplate->setSubject(
						$this->l10n->t($translations["meeting_title"], [
							$SUMMARY,
						])
					);
					$emailTemplate->addHeader();
					$emailTemplate->addHeading($translations["meeting_head"]);
					$emailTemplate->addBodyText(
						htmlspecialchars($translations["meeting_body"]),
						$translations["meeting_body"]
					);
					$emailTemplate->addFooter();
					try {
						$fromEMail = Util::getDefaultEmailAddress('invitations-noreply');
						$fromName = $this->l10n->t('%1$s via %2$s', [$attendeeName, $this->defaults->getName()]);
						$message = $this->mailer->createMessage();
						$message->setTo([$recipient => $organizerName]);
						$message->setFrom([$fromEMail => $fromName]);
						$message->setReplyTo([$sender => $attendeeName]);
						$message->useTemplate($emailTemplate);
						$this->mailer->send($message);
					} catch (\Exception $e) {
						// Log the exception and continue
						$this->logger->logException($e);
					}
				}
			$this->logger->info('Found and deleted ' . $outdated . ' outdated booking confirmations.');
		}
	}
}
 No newline at end of file
+9 −164
Original line number Diff line number Diff line
@@ -19,10 +19,12 @@ use OCP\IUserManager;
use OCP\IUser;
use OCP\L10N\IFactory;
use OCP\Util;

use OCA\Calendar\BackgroundJob\SendInviteResponseMailJob;
use \OCP\BackgroundJob\IJobList;
class InvitationMiddleware extends Middleware
{
	private $request;
	private $jobList;
	/** @var IManager */
	private $calendarManager;
	private const translations = [
@@ -54,7 +56,8 @@ class InvitationMiddleware extends Middleware
		Defaults $defaults,
		ILogger $logger,
		IUserManager $iusermanager,
		IFactory $languageFactory
		IFactory $languageFactory,
		IJobList $jobList
	) {
		$this->request = $request;
		$this->config = $config;
@@ -66,41 +69,9 @@ class InvitationMiddleware extends Middleware
		$this->logger = $logger;
		$this->iusermanager = $iusermanager;
		$this->languageFactory = $languageFactory;
		$this->jobList = $jobList;
	}
	private function getMailAttributes(
		string $methodName,
		array $translationData
	) {
		$meetingTitle = $this->l10n->t(
			self::translations[$methodName]["meeting_title"],
			$translationData["summary"]
		);
		$meetingBody = $this->l10n->t(
			self::translations[$methodName]["meeting_body"],
			[
				$translationData["attendee_name"],
				$translationData["summary"],
				$translationData["event_date"],
			]
		);
		$meetingHead = $this->l10n->t(
			self::translations[$methodName]["meeting_head"]
		);
		return [
			"meeting_title" => $meetingTitle,
			"meeting_body" => $meetingBody,
			"meeting_head" => $meetingHead,
		];
	}
	private function extract_emails_from($string)
	{
		$matches = [];
		$found = preg_match("/mailto:(.*)/i", $string, $matches);
		if ($found === 1) {
			return $matches[1];
		}
		return "";
	}

	public function afterController(
		$controller,
		$methodName,
@@ -115,137 +86,11 @@ class InvitationMiddleware extends Middleware
				$response->getTemplateName() == "schedule-response-success")
		) {
			$token = $this->request->getParam("token");
			$queryCalendarInvitations = $this->db->getQueryBuilder();
			$queryCalendarInvitations
				->select("id", "uid", "attendee", "organizer")
				->from("calendar_invitations")
				->where(
					$queryCalendarInvitations
						->expr()
						->eq(
							"token",
							$queryCalendarInvitations->createNamedParameter(
								$token
							)
						)
				);
			$stmt = $queryCalendarInvitations->execute();
			$row = $stmt->fetch(\PDO::FETCH_ASSOC);
			$uid = $row["uid"];
			$sender = $this->extract_emails_from($row["attendee"]);
			$recipient = $this->extract_emails_from($row["organizer"]);
			$userdata = $this->iusermanager->getByEmail($recipient);
			if (count($userdata) > 0) {
				$username = $userdata[0]->getUID();
				$principaluri = "principals/users/" . $username;
				$queryCalendarObjects = $this->db->getQueryBuilder();
				$queryCalendarObjects
					->select("co.id", "co.calendardata")
					->from("calendarobjects", "co")
					->innerJoin(
						"co",
						"calendars",
						"c",
						$queryCalendarObjects
							->expr()
							->eq("co.calendarid", "c.id")
					)
					->where(
						$queryCalendarObjects
							->expr()
							->eq(
								"c.principaluri",
								$queryCalendarObjects->createNamedParameter(
									$principaluri
								)
							)
					)
					->andWhere(
						$queryCalendarObjects
							->expr()
							->eq(
								"co.uid",
								$queryCalendarObjects->createNamedParameter(
									$uid
								)
							)
					);
				$stmt2 = $queryCalendarObjects->execute();

				if ($row2 = $stmt2->fetch(\PDO::FETCH_ASSOC)) {
					$vObject = Reader::read($row2["calendardata"]);
			$this->jobList->add(SendInviteResponseMailJob::class, ['token' => $token]);

					foreach ($vObject->VEVENT->ATTENDEE as $attendee1) {
						$attendee = $this->extract_emails_from($attendee1);

						if ($attendee == $sender) {
							$attendeeName = empty($attendee1["CN"])
								? $sender
								: $attendee1["CN"];
							break;
						}
		}
					$organizerName = empty($vObject->VEVENT->ORGANIZER["CN"])
						? $recipient
						: $vObject->VEVENT->ORGANIZER["CN"];

					$SUMMARY = $vObject->VEVENT->SUMMARY;
					$datestart = (string) $vObject->VEVENT->DTSTART;
					if (str_contains($datestart, "T")) {
						$eventdate = date("F d, Y h:i", strtotime($datestart));
					} else {
						$eventdate = date("F d, Y", strtotime($datestart));
					}
					$translationData = [
						"summary" => $SUMMARY,
						"attendee_name" => $attendeeName,
						"event_date" => $eventdate,
					];
					$translations = $this->getMailAttributes(
						$methodName,
						$translationData
					);

					$data = [
						"attendee_name" => (string) $sender ?: $defaultVal,
						"invitee_name" => (string) $recipient ?: $defaultVal,
						"meeting_title" =>
							(string) $translations["meeting_title"] ?:
							$defaultVal,
					];
					$method = "reply";
					$emailTemplate = $this->mailer->createEMailTemplate(
						"dav.calendarInvite." . $method,
						$data
					);
					$emailTemplate->setSubject(
						$this->l10n->t($translations["meeting_title"], [
							$SUMMARY,
						])
					);
					$emailTemplate->addHeader();
					$emailTemplate->addHeading($translations["meeting_head"]);
					$emailTemplate->addBodyText(
						htmlspecialchars($translations["meeting_body"]),
						$translations["meeting_body"]
					);
					$emailTemplate->addFooter();
					try {
						$fromEMail = Util::getDefaultEmailAddress('invitations-noreply');
						$fromName = $this->l10n->t('%1$s via %2$s', [$attendeeName, $this->defaults->getName()]);
						$message = $this->mailer->createMessage();
						$message->setTo([$recipient => $organizerName]);
						$message->setFrom([$fromEMail => $fromName]);
						$message->setReplyTo([$sender => $attendeeName]);
						$message->useTemplate($emailTemplate);
						$this->mailer->send($message);
					} catch (\Exception $e) {
						// Log the exception and continue
						$this->logger->logException($e);
					}
				}
			}
		}

		return $response;
	}