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

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 "nickname.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 Nickname::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 value == other.value && type == other.type && metadata == other.metadata;
0037     }
0038 
0039     bool operator!=(const Private &other) const
0040     {
0041         return !(*this == other);
0042     }
0043 
0044     QString value{};
0045     Nickname::Type type{};
0046     FieldMetadata metadata{};
0047 };
0048 
0049 Nickname::Nickname()
0050     : d(new Private)
0051 {
0052 }
0053 
0054 Nickname::Nickname(const Nickname &) = default;
0055 Nickname::Nickname(Nickname &&) noexcept = default;
0056 Nickname &Nickname::operator=(const Nickname &) = default;
0057 Nickname &Nickname::operator=(Nickname &&) noexcept = default;
0058 Nickname::~Nickname() = default;
0059 
0060 bool Nickname::operator==(const Nickname &other) const
0061 {
0062     return *d == *other.d;
0063 }
0064 
0065 bool Nickname::operator!=(const Nickname &other) const
0066 {
0067     return !(*this == other);
0068 }
0069 
0070 QString Nickname::value() const
0071 {
0072     return d->value;
0073 }
0074 
0075 void Nickname::setValue(const QString &value)
0076 {
0077     d->value = value;
0078 }
0079 Nickname::Nickname::Type Nickname::type() const
0080 {
0081     return d->type;
0082 }
0083 
0084 void Nickname::setType(Nickname::Type value)
0085 {
0086     d->type = value;
0087 }
0088 FieldMetadata Nickname::metadata() const
0089 {
0090     return d->metadata;
0091 }
0092 
0093 void Nickname::setMetadata(const FieldMetadata &value)
0094 {
0095     d->metadata = value;
0096 }
0097 
0098 Nickname Nickname::fromJSON(const QJsonObject &obj)
0099 {
0100     Nickname nickname;
0101 
0102     if(!obj.isEmpty()) {
0103         const auto metadata = obj.value(QStringLiteral("metadata")).toObject();
0104         nickname.setMetadata(FieldMetadata::fromJSON(metadata));
0105         nickname.setValue(obj.value(QStringLiteral("value")).toString());
0106 
0107         const auto type = obj.value(QStringLiteral("type")).toString();
0108         if (type == QLatin1StringView("MAIDEN_NAME")) {
0109             nickname.setType(Nickname::Type::MAIDEN_NAME);
0110         } else if (type == QLatin1StringView("INITIALS")) {
0111             nickname.setType(Nickname::Type::INITIALS);
0112         } else if (type == QLatin1StringView("GPLUS")) {
0113             nickname.setType(Nickname::Type::GPLUS);
0114         } else if (type == QLatin1StringView("OTHER_NAME")) {
0115             nickname.setType(Nickname::Type::OTHER_NAME);
0116         } else if (type == QLatin1StringView("ALTERNATE_NAME")) {
0117             nickname.setType(Nickname::Type::ALTERNATE_NAME);
0118         } else if (type == QLatin1StringView("SHORT_NAME")) {
0119             nickname.setType(Nickname::Type::SHORT_NAME);
0120         } else {
0121             nickname.setType(Nickname::Type::DEFAULT);
0122         }
0123     }
0124 
0125     return nickname;
0126 }
0127 
0128 QList<Nickname> Nickname::fromJSONArray(const QJsonArray &data)
0129 {
0130     QList<Nickname> nicknames;
0131 
0132     for(const auto &nickname : data) {
0133         if(nickname.isObject()) {
0134             const auto objectifiedNickname = nickname.toObject();
0135             nicknames.append(fromJSON(objectifiedNickname));
0136         }
0137     }
0138 
0139     return nicknames;
0140 }
0141 
0142 QJsonValue Nickname::toJSON() const
0143 {
0144     QJsonObject obj;
0145 
0146     PeopleUtils::addValueToJsonObjectIfValid(obj, "value", d->value);
0147     switch (d->type) {
0148     case Type::DEFAULT:
0149         PeopleUtils::addValueToJsonObjectIfValid(obj, "type", QStringLiteral("DEFAULT"));
0150         break;
0151     case Type::MAIDEN_NAME:
0152         PeopleUtils::addValueToJsonObjectIfValid(obj, "type", QStringLiteral("MAIDEN_NAME"));
0153         break;
0154     case Type::INITIALS:
0155         PeopleUtils::addValueToJsonObjectIfValid(obj, "type", QStringLiteral("INITIALS"));
0156         break;
0157     case Type::GPLUS:
0158         PeopleUtils::addValueToJsonObjectIfValid(obj, "type", QStringLiteral("GPLUS"));
0159         break;
0160     case Type::OTHER_NAME:
0161         PeopleUtils::addValueToJsonObjectIfValid(obj, "type", QStringLiteral("OTHER_NAME"));
0162         break;
0163     case Type::ALTERNATE_NAME:
0164         PeopleUtils::addValueToJsonObjectIfValid(obj, "type", QStringLiteral("ALTERNATE_NAME"));
0165         break;
0166     case Type::SHORT_NAME:
0167         PeopleUtils::addValueToJsonObjectIfValid(obj, "type", QStringLiteral("SHORT_NAME"));
0168         break;
0169     }
0170     // Skip, field metadata is only useful for receiving -> PeopleUtils::addValueToJsonObjectIfValid(obj, "metadata", d->metadata.toJSON());
0171     return obj;
0172 }
0173 
0174 } // namespace KGAPI2::People