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

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 "profilemetadata.h"
0011 #include "peopleservice.h"
0012 
0013 #include <QJsonArray>
0014 #include <QJsonObject>
0015 #include <QJsonValue>
0016 #include <QSharedData>
0017 
0018 #include <algorithm>
0019 
0020 namespace KGAPI2::People
0021 {
0022 class ProfileMetadata::Private : public QSharedData
0023 {
0024 public:
0025     explicit Private() = default;
0026     Private(const Private &) = default;
0027     Private(Private &&) noexcept = delete;
0028     Private &operator=(const Private &) = delete;
0029     Private &operator=(Private &&) noexcept = delete;
0030     ~Private() = default;
0031 
0032     bool operator==(const Private &other) const
0033     {
0034         return userTypes == other.userTypes && objectType == other.objectType;
0035     }
0036 
0037     bool operator!=(const Private &other) const
0038     {
0039         return !(*this == other);
0040     }
0041 
0042     QList<ProfileMetadata::UserTypes> userTypes{};
0043     ProfileMetadata::ObjectType objectType{};
0044 };
0045 
0046 ProfileMetadata::ProfileMetadata()
0047     : d(new Private)
0048 {
0049 }
0050 
0051 ProfileMetadata::ProfileMetadata(const ProfileMetadata &) = default;
0052 ProfileMetadata::ProfileMetadata(ProfileMetadata &&) noexcept = default;
0053 ProfileMetadata &ProfileMetadata::operator=(const ProfileMetadata &) = default;
0054 ProfileMetadata &ProfileMetadata::operator=(ProfileMetadata &&) noexcept = default;
0055 ProfileMetadata::~ProfileMetadata() = default;
0056 
0057 bool ProfileMetadata::operator==(const ProfileMetadata &other) const
0058 {
0059     return *d == *other.d;
0060 }
0061 
0062 bool ProfileMetadata::operator!=(const ProfileMetadata &other) const
0063 {
0064     return !(*this == other);
0065 }
0066 
0067 QList<ProfileMetadata::UserTypes> ProfileMetadata::userTypes() const
0068 {
0069     return d->userTypes;
0070 }
0071 ProfileMetadata::ProfileMetadata::ObjectType ProfileMetadata::objectType() const
0072 {
0073     return d->objectType;
0074 }
0075 
0076 ProfileMetadata ProfileMetadata::fromJSON(const QJsonObject &obj)
0077 {
0078     ProfileMetadata profileMetadata;
0079 
0080     if(!obj.isEmpty()) {
0081         const auto objectTypeEnumString = obj.value(QStringLiteral("objectType"));
0082         if (objectTypeEnumString == QLatin1StringView("PERSON")) {
0083             profileMetadata.d->objectType = ObjectType::PERSON;
0084         } else if (objectTypeEnumString == QLatin1StringView("PAGE")) {
0085             profileMetadata.d->objectType = ObjectType::PAGE;
0086         } else {
0087             profileMetadata.d->objectType = ObjectType::OBJECT_TYPE_UNSPECIFIED;
0088         }
0089 
0090         if(obj.value(QStringLiteral("userTypes")).isArray()) {
0091             const auto userTypesJsonArray = obj.value(QStringLiteral("userTypes")).toArray();
0092 
0093             for (const auto &userType : userTypesJsonArray) {
0094                 if(userType == obj.value(QStringLiteral("GOOGLE_USER"))) {
0095                     profileMetadata.d->userTypes.append(UserTypes::GOOGLE_USER);
0096                 } else if(userType == obj.value(QStringLiteral("GPLUS_USER"))) {
0097                     profileMetadata.d->userTypes.append(UserTypes::GPLUS_USER);
0098                 } else if(userType == obj.value(QStringLiteral("GOOGLE_APPS_USER"))) {
0099                     profileMetadata.d->userTypes.append(UserTypes::GOOGLE_APPS_USER);
0100                 } else {
0101                     profileMetadata.d->userTypes.append(UserTypes::USER_TYPE_UNKNOWN);
0102                 }
0103             }
0104         } else {
0105             profileMetadata.d->userTypes.append(UserTypes::USER_TYPE_UNKNOWN);
0106         }
0107     }
0108 
0109     return profileMetadata;
0110 }
0111 
0112 QJsonValue ProfileMetadata::toJSON() const
0113 {
0114     QJsonObject obj;
0115 
0116     {
0117         QJsonArray arr;
0118         std::transform(d->userTypes.cbegin(), d->userTypes.cend(), std::back_inserter(arr), [](const auto &val) {
0119             switch (val) {
0120             default:
0121             case UserTypes::USER_TYPE_UNKNOWN:
0122                 return QStringLiteral("USER_TYPE_UNKNOWN");
0123             case UserTypes::GOOGLE_USER:
0124                 return QStringLiteral("GOOGLE_USER");
0125             case UserTypes::GPLUS_USER:
0126                 return QStringLiteral("GPLUS_USER");
0127             case UserTypes::GOOGLE_APPS_USER:
0128                 return QStringLiteral("GOOGLE_APPS_USER");
0129             }
0130         });
0131         if (!arr.isEmpty()) {
0132             PeopleUtils::addValueToJsonObjectIfValid(obj, "userTypes", std::move(arr));
0133         }
0134     }
0135     switch (d->objectType) {
0136     case ObjectType::OBJECT_TYPE_UNSPECIFIED:
0137         PeopleUtils::addValueToJsonObjectIfValid(obj, "objectType", QStringLiteral("OBJECT_TYPE_UNSPECIFIED"));
0138         break;
0139     case ObjectType::PERSON:
0140         PeopleUtils::addValueToJsonObjectIfValid(obj, "objectType", QStringLiteral("PERSON"));
0141         break;
0142     case ObjectType::PAGE:
0143         PeopleUtils::addValueToJsonObjectIfValid(obj, "objectType", QStringLiteral("PAGE"));
0144         break;
0145     }
0146     return obj;
0147 }
0148 
0149 } // namespace KGAPI2::People