File indexing completed on 2024-04-28 13:44:15

0001 /*
0002  * SPDX-FileCopyrightText: 2020 Dimitris Kardarakos <dimkard@posteo.net>
0003  *
0004  * SPDX-License-Identifier: GPL-3.0-or-later
0005  */
0006 
0007 #include "eventcontroller.h"
0008 #include "calendarcontroller.h"
0009 #include "localcalendar.h"
0010 #include "settingscontroller.h"
0011 #include <QDebug>
0012 #include <KCalendarCore/Event>
0013 #include <KLocalizedString>
0014 
0015 EventController::EventController(QObject *parent) : QObject {parent}, m_cal_controller {new CalendarController}, m_settings_controller {new SettingsController {this}}
0016 {}
0017 
0018 CalendarController *EventController::calendarController()
0019 {
0020     return m_cal_controller;
0021 }
0022 
0023 void EventController::setCalendarController(CalendarController *const controller)
0024 {
0025     m_cal_controller = controller;
0026     Q_EMIT calendarControllerChanged();
0027 }
0028 
0029 void EventController::remove(LocalCalendar *calendar, const QVariantMap &eventData)
0030 {
0031     if (calendar == nullptr) {
0032         qDebug() << "There is no calendar to delete event from";
0033 
0034         return;
0035     }
0036 
0037     qDebug() << "Deleting event from calendar " << calendar->calendarId();
0038 
0039     auto memoryCalendar = calendar->memorycalendar();
0040     auto uid = eventData["uid"].toString();
0041     auto event = memoryCalendar->event(uid);
0042     memoryCalendar->deleteEvent(event);
0043 
0044     auto deleted {false};
0045     if (m_cal_controller != nullptr) {
0046         deleted = m_cal_controller->save(calendar->calendarId());
0047         Q_EMIT calendar->eventsChanged();
0048     }
0049 
0050     qDebug() << "Event deleted: " << deleted;
0051 }
0052 
0053 QVariantMap EventController::addEdit(LocalCalendar *calendar, const QVariantMap &eventData)
0054 {
0055     if (calendar == nullptr) {
0056         return { {"status", NoCalendarExists}, {"message", i18n("Error during event creation") } };
0057     }
0058 
0059     auto eventCheckResult = eventCheck(calendar, eventData);
0060 
0061     if (eventCheckResult["result"].toInt() == Exists) {
0062         return {
0063             {"status", NoCalendarExists}, {"message", i18n("Already in favorites")}
0064         };
0065     }
0066 
0067     qDebug() << "\naddEdit:\tCreating event to calendar " << calendar->calendarId();
0068 
0069     auto memoryCalendar = calendar->memorycalendar();
0070     auto uid = eventData["uid"].toString();
0071     auto event = memoryCalendar->event(uid);
0072 
0073     if (event == nullptr) {
0074         event = KCalendarCore::Event::Ptr {new KCalendarCore::Event {}};
0075     }
0076 
0077     event->setUid(uid);
0078     event->setDtStart(eventData["startDate"].toDateTime().toTimeZone(QTimeZone::utc()));
0079     event->setDtEnd(eventData["endDate"].toDateTime().toTimeZone(QTimeZone::utc()));
0080     event->setDescription(eventData["description"].toString());
0081     event->setCategories(eventData["categories"].toString());
0082     event->setSummary(eventData["summary"].toString());
0083     event->setAllDay(eventData["allDay"].toBool());
0084     event->setLocation(eventData["location"].toString());
0085     event->setUrl(eventData["url"].toString());
0086 
0087     event->clearAlarms();
0088 
0089     auto newAlarm = event->newAlarm();
0090     newAlarm->setStartOffset(KCalendarCore::Duration(-60 * m_settings_controller->remindBeforeStart(), KCalendarCore::Duration::Type::Seconds));
0091     newAlarm->setType(KCalendarCore::Alarm::Type::Display);
0092     newAlarm->setEnabled(true);
0093     auto alarmText = (event->summary()).isEmpty() ? event->description() : event->summary();
0094 
0095     if (!event->location().isEmpty()) {
0096         alarmText.append((QString {"\n%1"}).arg(event->location()));
0097     }
0098 
0099     newAlarm->setText(alarmText);
0100     memoryCalendar->addEvent(event);
0101 
0102     auto merged {false};
0103 
0104     if (m_cal_controller != nullptr) {
0105         merged = m_cal_controller->save(calendar->calendarId());
0106         Q_EMIT calendar->eventsChanged();
0107     }
0108 
0109     qDebug() << "addEdit:\tEvent added/updated: " << merged;
0110 
0111     return {
0112         { "status", eventCheckResult["result"] },
0113         { "message", (eventCheckResult["result"] == NotExistsButOverlaps) ? i18n("Talk added to favorites, but it overlaps with existing ones:\n%1", eventCheckResult["events"].toString()) : i18n("Talk added to favorites") }
0114     };
0115 
0116 }
0117 
0118 QVariantMap EventController::eventCheck(LocalCalendar *calendar, const QVariantMap &event)
0119 {
0120     QVariantMap response {
0121         { "result", QVariant {NotExistsNotOverlapping} },
0122         { "events", QString {} }
0123     };
0124 
0125     auto memoryCalendar = calendar->memorycalendar();
0126     QStringList overlappingEvents {};
0127 
0128     auto eventStart = event["startDate"].toDateTime();
0129     auto eventEnd = event["endDate"].toDateTime();
0130     auto eventUid = event["uid"].toString();
0131 
0132     // If the event-to-check has no valid start or end date, assume that there is no overlap
0133     if (!(eventStart.isValid()) || !(eventEnd.isValid())) {
0134         return response;
0135     }
0136 
0137     auto existingEvents = memoryCalendar->rawEventsForDate(eventStart.date(), memoryCalendar->timeZone());
0138 
0139     for (const auto &e : existingEvents) {
0140         if ((eventStart < e->dtEnd()) && (eventEnd > e->dtStart())) {
0141             overlappingEvents.append(e->summary());
0142         }
0143 
0144         if (!(eventUid.isEmpty()) && e->uid() == eventUid) {
0145             response["result"] = QVariant {Exists};
0146             return response;
0147         }
0148     }
0149 
0150     if (!(overlappingEvents.isEmpty())) {
0151         response["result"] = QVariant {NotExistsButOverlaps};
0152         response["events"] = overlappingEvents.join("\n");
0153     }
0154 
0155     return response;
0156 }
0157 
0158 #include "moc_eventcontroller.cpp"