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 "emailaddress.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 <KContacts/Email>
0021 
0022 #include <algorithm>
0023 
0024 namespace KGAPI2::People
0025 {
0026 class EmailAddress::Private : public QSharedData
0027 {
0028 public:
0029     explicit Private() = default;
0030     Private(const Private &) = default;
0031     Private(Private &&) noexcept = delete;
0032     Private &operator=(const Private &) = delete;
0033     Private &operator=(Private &&) noexcept = delete;
0034     ~Private() = default;
0035 
0036     bool operator==(const Private &other) const
0037     {
0038         return value == other.value && metadata == other.metadata && type == other.type && displayName == other.displayName
0039             && formattedType == other.formattedType;
0040     }
0041 
0042     bool operator!=(const Private &other) const
0043     {
0044         return !(*this == other);
0045     }
0046 
0047     QString value{};
0048     FieldMetadata metadata{};
0049     QString type{};
0050     QString displayName{};
0051     QString formattedType{};
0052 };
0053 
0054 EmailAddress::EmailAddress()
0055     : d(new Private)
0056 {
0057 }
0058 
0059 EmailAddress::EmailAddress(const EmailAddress &) = default;
0060 EmailAddress::EmailAddress(EmailAddress &&) noexcept = default;
0061 EmailAddress &EmailAddress::operator=(const EmailAddress &) = default;
0062 EmailAddress &EmailAddress::operator=(EmailAddress &&) noexcept = default;
0063 EmailAddress::~EmailAddress() = default;
0064 
0065 bool EmailAddress::operator==(const EmailAddress &other) const
0066 {
0067     return *d == *other.d;
0068 }
0069 
0070 bool EmailAddress::operator!=(const EmailAddress &other) const
0071 {
0072     return !(*this == other);
0073 }
0074 
0075 QString EmailAddress::value() const
0076 {
0077     return d->value;
0078 }
0079 
0080 void EmailAddress::setValue(const QString &value)
0081 {
0082     d->value = value;
0083 }
0084 FieldMetadata EmailAddress::metadata() const
0085 {
0086     return d->metadata;
0087 }
0088 
0089 void EmailAddress::setMetadata(const FieldMetadata &value)
0090 {
0091     d->metadata = value;
0092 }
0093 QString EmailAddress::type() const
0094 {
0095     return d->type;
0096 }
0097 
0098 void EmailAddress::setType(const QString &value)
0099 {
0100     d->type = value;
0101 }
0102 QString EmailAddress::displayName() const
0103 {
0104     return d->displayName;
0105 }
0106 
0107 void EmailAddress::setDisplayName(const QString &value)
0108 {
0109     d->displayName = value;
0110 }
0111 QString EmailAddress::formattedType() const
0112 {
0113     return d->formattedType;
0114 }
0115 
0116 EmailAddress EmailAddress::fromJSON(const QJsonObject &obj)
0117 {
0118     EmailAddress emailAddress;
0119 
0120     if(!obj.isEmpty()) {
0121         const auto metadata = obj.value(QStringLiteral("metadata")).toObject();
0122         emailAddress.d->metadata = FieldMetadata::fromJSON(metadata);
0123         emailAddress.d->value = obj.value(QStringLiteral("value")).toString();
0124         emailAddress.d->type = obj.value(QStringLiteral("type")).toString();
0125         emailAddress.d->formattedType = obj.value(QStringLiteral("formattedType")).toString();
0126         emailAddress.d->displayName = obj.value(QStringLiteral("displayName")).toString();
0127     }
0128 
0129     return emailAddress;
0130 }
0131 
0132 QList<EmailAddress> EmailAddress::fromJSONArray(const QJsonArray &data)
0133 {
0134     QList<EmailAddress> emailAddresses;
0135 
0136     for(const auto &emailAddress : data) {
0137         if(emailAddress.isObject()) {
0138             const auto objectifiedEmailAddress = emailAddress.toObject();
0139             emailAddresses.append(fromJSON(objectifiedEmailAddress));
0140         }
0141     }
0142 
0143     return emailAddresses;
0144 }
0145 
0146 
0147 QJsonValue EmailAddress::toJSON() const
0148 {
0149     QJsonObject obj;
0150 
0151     PeopleUtils::addValueToJsonObjectIfValid(obj, "value", d->value);
0152     // Skip, field metadata is only useful for receiving -> PeopleUtils::addValueToJsonObjectIfValid(obj, "metadata", d->metadata.toJSON());
0153     PeopleUtils::addValueToJsonObjectIfValid(obj, "type", d->type);
0154     PeopleUtils::addValueToJsonObjectIfValid(obj, "displayName", d->displayName);
0155     // Output only -> PeopleUtils::addValueToJsonObjectIfValid(obj, "formattedType", d->formattedType);
0156     return obj;
0157 }
0158 
0159 KContacts::Email EmailAddress::toKContactsEmail() const
0160 {
0161     KContacts::Email convertedEmail;
0162     convertedEmail.setEmail(value());
0163 
0164     const auto emailType = type();
0165 
0166     if(QString::compare(emailType, QStringLiteral("home"), Qt::CaseInsensitive)) {
0167         convertedEmail.setType(KContacts::Email::Home);
0168     } else if(QString::compare(emailType, QStringLiteral("work"), Qt::CaseInsensitive)) {
0169         convertedEmail.setType(KContacts::Email::Work);
0170     } else if(QString::compare(emailType, QStringLiteral("other"), Qt::CaseInsensitive)) {
0171         convertedEmail.setType(KContacts::Email::Other);
0172     }
0173 
0174     return convertedEmail;
0175 }
0176 
0177 EmailAddress EmailAddress::fromKContactsEmail(const KContacts::Email &email)
0178 {
0179     EmailAddress convertedEmail;
0180     convertedEmail.setValue(email.mail());
0181 
0182     switch(email.type()) {
0183     case KContacts::Email::Home:
0184         convertedEmail.setType(QStringLiteral("home"));
0185         break;
0186     case KContacts::Email::Work:
0187         convertedEmail.setType(QStringLiteral("work"));
0188         break;
0189     case KContacts::Email::Other:
0190     default:
0191         convertedEmail.setType(QStringLiteral("other"));
0192         break;
0193     }
0194 
0195     return convertedEmail;
0196 }
0197 
0198 QList<EmailAddress> EmailAddress::fromKContactsEmailList(const QList<KContacts::Email> &emailList)
0199 {
0200     QList<EmailAddress> convertedEmails;
0201     std::transform(emailList.cbegin(),
0202                    emailList.cend(),
0203                    std::back_inserter(convertedEmails),
0204                    [](const KContacts::Email &email) {
0205                        return EmailAddress::fromKContactsEmail(email);
0206                    });
0207     return convertedEmails;
0208 }
0209 
0210 } // namespace KGAPI2::People