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

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 "address.h"
0011 
0012 #include "fieldmetadata.h"
0013 #include "peopleservice.h"
0014 
0015 #include <QJsonValue>
0016 #include <QSharedData>
0017 
0018 #include <algorithm>
0019 
0020 namespace KGAPI2::People
0021 {
0022 class Address::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 formattedType == other.formattedType && city == other.city && metadata == other.metadata && countryCode == other.countryCode
0035             && postalCode == other.postalCode && poBox == other.poBox && type == other.type && formattedValue == other.formattedValue
0036             && extendedAddress == other.extendedAddress && region == other.region && streetAddress == other.streetAddress && country == other.country;
0037     }
0038 
0039     bool operator!=(const Private &other) const
0040     {
0041         return !(*this == other);
0042     }
0043 
0044     QString formattedType{};
0045     QString city{};
0046     FieldMetadata metadata{};
0047     QString countryCode{};
0048     QString postalCode{};
0049     QString poBox{};
0050     QString type{};
0051     QString formattedValue{};
0052     QString extendedAddress{};
0053     QString region{};
0054     QString streetAddress{};
0055     QString country{};
0056 };
0057 
0058 Address::Address()
0059     : d(new Private)
0060 {
0061 }
0062 
0063 Address::Address(const Address &) = default;
0064 Address::Address(Address &&) noexcept = default;
0065 Address &Address::operator=(const Address &) = default;
0066 Address &Address::operator=(Address &&) noexcept = default;
0067 Address::~Address() = default;
0068 
0069 bool Address::operator==(const Address &other) const
0070 {
0071     return *d == *other.d;
0072 }
0073 
0074 bool Address::operator!=(const Address &other) const
0075 {
0076     return !(*this == other);
0077 }
0078 
0079 QString Address::formattedType() const
0080 {
0081     return d->formattedType;
0082 }
0083 QString Address::city() const
0084 {
0085     return d->city;
0086 }
0087 
0088 void Address::setCity(const QString &value)
0089 {
0090     d->city = value;
0091 }
0092 FieldMetadata Address::metadata() const
0093 {
0094     return d->metadata;
0095 }
0096 
0097 void Address::setMetadata(const FieldMetadata &value)
0098 {
0099     d->metadata = value;
0100 }
0101 QString Address::countryCode() const
0102 {
0103     return d->countryCode;
0104 }
0105 
0106 void Address::setCountryCode(const QString &value)
0107 {
0108     d->countryCode = value;
0109 }
0110 QString Address::postalCode() const
0111 {
0112     return d->postalCode;
0113 }
0114 
0115 void Address::setPostalCode(const QString &value)
0116 {
0117     d->postalCode = value;
0118 }
0119 QString Address::poBox() const
0120 {
0121     return d->poBox;
0122 }
0123 
0124 void Address::setPoBox(const QString &value)
0125 {
0126     d->poBox = value;
0127 }
0128 QString Address::type() const
0129 {
0130     return d->type;
0131 }
0132 
0133 void Address::setType(const QString &value)
0134 {
0135     d->type = value;
0136 }
0137 QString Address::formattedValue() const
0138 {
0139     return d->formattedValue;
0140 }
0141 
0142 void Address::setFormattedValue(const QString &value)
0143 {
0144     d->formattedValue = value;
0145 }
0146 QString Address::extendedAddress() const
0147 {
0148     return d->extendedAddress;
0149 }
0150 
0151 void Address::setExtendedAddress(const QString &value)
0152 {
0153     d->extendedAddress = value;
0154 }
0155 QString Address::region() const
0156 {
0157     return d->region;
0158 }
0159 
0160 void Address::setRegion(const QString &value)
0161 {
0162     d->region = value;
0163 }
0164 QString Address::streetAddress() const
0165 {
0166     return d->streetAddress;
0167 }
0168 
0169 void Address::setStreetAddress(const QString &value)
0170 {
0171     d->streetAddress = value;
0172 }
0173 QString Address::country() const
0174 {
0175     return d->country;
0176 }
0177 
0178 void Address::setCountry(const QString &value)
0179 {
0180     d->country = value;
0181 }
0182 
0183 Address Address::fromJSON(const QJsonObject &obj)
0184 {
0185     Address address;
0186 
0187     if(!obj.isEmpty()) {
0188         address.setMetadata(FieldMetadata::fromJSON(obj.value(QStringLiteral("metadata")).toObject()));
0189         address.setFormattedValue(obj.value(QStringLiteral("formattedValue")).toString());
0190         address.setType(obj.value(QStringLiteral("type")).toString());
0191         address.setPoBox(obj.value(QStringLiteral("poBox")).toString());
0192         address.setStreetAddress(obj.value(QStringLiteral("streetAddress")).toString());
0193         address.setExtendedAddress(obj.value(QStringLiteral("extendedAddress")).toString());
0194         address.setCity(obj.value(QStringLiteral("city")).toString());
0195         address.setRegion(obj.value(QStringLiteral("region")).toString());
0196         address.setPostalCode(obj.value(QStringLiteral("postalCode")).toString());
0197         address.setCountry(obj.value(QStringLiteral("country")).toString());
0198         address.setCountryCode(obj.value(QStringLiteral("countryCode")).toString());
0199     }
0200 
0201     return address;
0202 }
0203 
0204 QList<Address> Address::fromJSONArray(const QJsonArray &data)
0205 {
0206     QList<People::Address> addresses;
0207 
0208     for(const auto &address : data) {
0209         if(address.isObject()) {
0210             const auto objectifiedAddress = address.toObject();
0211             addresses.append(fromJSON(objectifiedAddress));
0212         }
0213     }
0214 
0215     return addresses;
0216 }
0217 
0218 QJsonValue Address::toJSON() const
0219 {
0220     QJsonObject obj;
0221 
0222     // Output only -> PeopleUtils::addValueToJsonObjectIfValid(obj, "formattedType", d->formattedType);
0223     PeopleUtils::addValueToJsonObjectIfValid(obj, "city", d->city);
0224     // Skip, field metadata is only useful for receiving -> PeopleUtils::addValueToJsonObjectIfValid(obj, "metadata", d->metadata.toJSON());
0225     PeopleUtils::addValueToJsonObjectIfValid(obj, "countryCode", d->countryCode);
0226     PeopleUtils::addValueToJsonObjectIfValid(obj, "postalCode", d->postalCode);
0227     PeopleUtils::addValueToJsonObjectIfValid(obj, "poBox", d->poBox);
0228     PeopleUtils::addValueToJsonObjectIfValid(obj, "type", d->type);
0229     PeopleUtils::addValueToJsonObjectIfValid(obj, "formattedValue", d->formattedValue);
0230     PeopleUtils::addValueToJsonObjectIfValid(obj, "extendedAddress", d->extendedAddress);
0231     PeopleUtils::addValueToJsonObjectIfValid(obj, "region", d->region);
0232     PeopleUtils::addValueToJsonObjectIfValid(obj, "streetAddress", d->streetAddress);
0233     PeopleUtils::addValueToJsonObjectIfValid(obj, "country", d->country);
0234     return obj;
0235 }
0236 
0237 } // namespace KGAPI2::People