File indexing completed on 2024-05-12 05:22:26

0001 /*
0002  * SPDX-FileCopyrightText: 2021 Daniel Vrátil <dvratil@kde.org>
0003  * SPDX-FileCopyrightText: 2022 Claudio Cambra <claudio.cambra@kde.org>
0004  *
0005  * SPDX-License-Identifier: LGPL-2.1-only
0006  * SPDX-License-Identifier: LGPL-3.0-only
0007  * SPDX-License-Identifier: LicenseRef-KDE-Accepted-LGPL
0008  */
0009 
0010 #include "event.h"
0011 
0012 #include "fieldmetadata.h"
0013 #include "peopleservice.h"
0014 
0015 #include <QJsonArray>
0016 #include <QJsonObject>
0017 #include <QJsonValue>
0018 #include <QSharedData>
0019 
0020 #include <algorithm>
0021 
0022 namespace KGAPI2::People
0023 {
0024 class Event::Private : public QSharedData
0025 {
0026 public:
0027     explicit Private() = default;
0028     Private(const Private &) = default;
0029     Private(Private &&) noexcept = delete;
0030     Private &operator=(const Private &) = delete;
0031     Private &operator=(Private &&) noexcept = delete;
0032     ~Private() = default;
0033 
0034     bool operator==(const Private &other) const
0035     {
0036         return metadata == other.metadata && date == other.date && type == other.type && formattedType == other.formattedType;
0037     }
0038 
0039     bool operator!=(const Private &other) const
0040     {
0041         return !(*this == other);
0042     }
0043 
0044     FieldMetadata metadata{};
0045     QDate date{};
0046     QString type{};
0047     QString formattedType{};
0048 };
0049 
0050 Event::Event()
0051     : d(new Private)
0052 {
0053 }
0054 
0055 Event::Event(const Event &) = default;
0056 Event::Event(Event &&) noexcept = default;
0057 Event &Event::operator=(const Event &) = default;
0058 Event &Event::operator=(Event &&) noexcept = default;
0059 Event::~Event() = default;
0060 
0061 bool Event::operator==(const Event &other) const
0062 {
0063     return *d == *other.d;
0064 }
0065 
0066 bool Event::operator!=(const Event &other) const
0067 {
0068     return !(*this == other);
0069 }
0070 
0071 FieldMetadata Event::metadata() const
0072 {
0073     return d->metadata;
0074 }
0075 
0076 void Event::setMetadata(const FieldMetadata &value)
0077 {
0078     d->metadata = value;
0079 }
0080 QDate Event::date() const
0081 {
0082     return d->date;
0083 }
0084 
0085 void Event::setDate(const QDate &value)
0086 {
0087     d->date = value;
0088 }
0089 QString Event::type() const
0090 {
0091     return d->type;
0092 }
0093 
0094 void Event::setType(const QString &value)
0095 {
0096     d->type = value;
0097 }
0098 QString Event::formattedType() const
0099 {
0100     return d->formattedType;
0101 }
0102 
0103 Event Event::fromJSON(const QJsonObject &obj)
0104 {
0105     Event event;
0106 
0107     if(!obj.isEmpty()) {
0108         const auto metadata = obj.value(QStringLiteral("metadata")).toObject();
0109         event.d->metadata = FieldMetadata::fromJSON(metadata);
0110 
0111         const auto jsonDate = obj.value(QStringLiteral("date")).toObject();
0112         const auto year = jsonDate.value(QStringLiteral("year")).toInt();
0113         const auto month = jsonDate.value(QStringLiteral("month")).toInt();
0114         const auto day = jsonDate.value(QStringLiteral("day")).toInt();
0115         event.d->date = QDate(year, month, day);
0116 
0117         event.d->type = obj.value(QStringLiteral("type")).toString();
0118         event.d->formattedType = obj.value(QStringLiteral("formattedType")).toString();
0119     }
0120 
0121     return event;
0122 }
0123 
0124 QList<Event> Event::fromJSONArray(const QJsonArray &data)
0125 {
0126     QList<Event> events;
0127 
0128     for(const auto &event : data) {
0129         if(event.isObject()) {
0130             const auto objectifiedEvent = event.toObject();
0131             events.append(fromJSON(objectifiedEvent));
0132         }
0133     }
0134 
0135     return events;
0136 }
0137 
0138 QJsonValue Event::toJSON() const
0139 {
0140     // Skip field metadata as is only useful for receiving
0141     // formattedType is output only
0142     QJsonObject obj {
0143         { QStringLiteral("date"), QJsonObject {
0144             { QStringLiteral("year"), d->date.year() },
0145             { QStringLiteral("month"), d->date.month() },
0146             { QStringLiteral("day"), d->date.day() }
0147         } }
0148     };
0149 
0150     PeopleUtils::addValueToJsonObjectIfValid(obj, "type", d->type);
0151 
0152     return obj;
0153 }
0154 
0155 } // namespace KGAPI2::People