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 "membership.h"
0011 
0012 #include "contactgroupmembership.h"
0013 #include "domainmembership.h"
0014 #include "fieldmetadata.h"
0015 #include "peopleservice.h"
0016 
0017 #include <QJsonArray>
0018 #include <QJsonObject>
0019 #include <QJsonValue>
0020 #include <QSharedData>
0021 
0022 #include <algorithm>
0023 
0024 namespace KGAPI2::People
0025 {
0026 
0027 struct MembershipDefinition
0028 {
0029     FieldMetadata metadata;
0030     ContactGroupMembership contactGroupMembership;
0031     DomainMembership domainMembership;
0032 };
0033 
0034 class Membership::Private : public QSharedData
0035 {
0036 public:
0037     explicit Private() = default;
0038     Private(const Private &) = default;
0039     Private(Private &&) noexcept = delete;
0040     Private &operator=(const Private &) = delete;
0041     Private &operator=(Private &&) noexcept = delete;
0042     ~Private() = default;
0043 
0044     bool operator==(const Private &other) const
0045     {
0046         return domainMembership == other.domainMembership && contactGroupMembership == other.contactGroupMembership && metadata == other.metadata;
0047     }
0048 
0049     bool operator!=(const Private &other) const
0050     {
0051         return !(*this == other);
0052     }
0053 
0054     DomainMembership domainMembership{};
0055     ContactGroupMembership contactGroupMembership{};
0056     FieldMetadata metadata{};
0057 };
0058 
0059 Membership::Membership()
0060     : d(new Private)
0061 {
0062 }
0063 
0064 Membership::Membership(const MembershipDefinition &definition)
0065     : d(new Private)
0066 {
0067     d->metadata = definition.metadata;
0068     d->contactGroupMembership = definition.contactGroupMembership;
0069     d->domainMembership = definition.domainMembership;
0070 }
0071 
0072 Membership::Membership(const Membership &) = default;
0073 Membership::Membership(Membership &&) noexcept = default;
0074 Membership &Membership::operator=(const Membership &) = default;
0075 Membership &Membership::operator=(Membership &&) noexcept = default;
0076 Membership::~Membership() = default;
0077 
0078 bool Membership::operator==(const Membership &other) const
0079 {
0080     return *d == *other.d;
0081 }
0082 
0083 bool Membership::operator!=(const Membership &other) const
0084 {
0085     return !(*this == other);
0086 }
0087 
0088 DomainMembership Membership::domainMembership() const
0089 {
0090     return d->domainMembership;
0091 }
0092 ContactGroupMembership Membership::contactGroupMembership() const
0093 {
0094     return d->contactGroupMembership;
0095 }
0096 
0097 void Membership::setContactGroupMembership(const ContactGroupMembership &value)
0098 {
0099     d->contactGroupMembership = value;
0100 }
0101 FieldMetadata Membership::metadata() const
0102 {
0103     return d->metadata;
0104 }
0105 
0106 void Membership::setMetadata(const FieldMetadata &value)
0107 {
0108     d->metadata = value;
0109 }
0110 
0111 Membership Membership::fromJSON(const QJsonObject &obj)
0112 {
0113     if(obj.isEmpty()) {
0114         return Membership();
0115     }
0116 
0117     MembershipDefinition definition;
0118 
0119     const auto metadata = obj.value(QStringLiteral("metadata")).toObject();
0120     definition.metadata = FieldMetadata::fromJSON(metadata);
0121 
0122     const auto contactGroupMembership = obj.value(QStringLiteral("contactGroupMembership")).toObject();
0123     definition.contactGroupMembership = ContactGroupMembership::fromJSON(contactGroupMembership);
0124 
0125     const auto domainMembership = obj.value(QStringLiteral("domainMembership")).toObject();
0126     definition.domainMembership = DomainMembership::fromJSON(domainMembership);
0127 
0128     return Membership(definition);
0129 }
0130 
0131 QList<Membership> Membership::fromJSONArray(const QJsonArray &data)
0132 {
0133     QList<Membership> memberships;
0134 
0135     for(const auto &membership : data) {
0136         if(membership.isObject()) {
0137             const auto objectifiedMembership = membership.toObject();
0138             memberships.append(fromJSON(objectifiedMembership));
0139         }
0140     }
0141 
0142     return memberships;
0143 }
0144 
0145 QJsonValue Membership::toJSON() const
0146 {
0147     QJsonObject obj;
0148 
0149     if (!d->contactGroupMembership.contactGroupResourceName().isEmpty()) {
0150         PeopleUtils::addValueToJsonObjectIfValid(obj, "contactGroupMembership", d->contactGroupMembership.toJSON());
0151     } else if (d->domainMembership.inViewerDomain()) {
0152         PeopleUtils::addValueToJsonObjectIfValid(obj, "domainMembership", d->domainMembership.toJSON());
0153     }
0154     // Skip, field metadata is only useful for receiving -> PeopleUtils::addValueToJsonObjectIfValid(obj, "metadata", d->metadata.toJSON());
0155     return obj;
0156 }
0157 
0158 } // namespace KGAPI2::People