~aleteoryx/muditaos

4ddf3ce952be37e61dcc3cd03ad167c9a0a4b8d6 — Lukasz Mastalerz 2 years ago 0d14727
[CP-889] Add extended information about number duplications

Changed a way of returning information to Center about number
duplications
M doc/os_api/endpoints/pure/contacts_endpoint.md => doc/os_api/endpoints/pure/contacts_endpoint.md +4 -2
@@ 225,7 225,9 @@ Parameters:
```json
{
  "body": {
    "id": 76
    "duplicatedNumbers": [
      "123456789"
    ]
  },
  "endpoint": 7,
  "status": 409,


@@ 235,7 237,7 @@ Parameters:

Parameters:

- *id*  - id of duplicated contact
- *duplicatedNumbers*  - list of duplicated numbers

### Update a contact


M module-db/Interface/ContactRecord.cpp => module-db/Interface/ContactRecord.cpp +10 -9
@@ 622,12 622,15 @@ auto ContactRecordInterface::addQuery(const std::shared_ptr<db::Query> &query) -
    }
    auto result = false;

    auto duplicateCheckResult = verifyDuplicate(addQuery->rec);
    if (!duplicateCheckResult) {
    auto duplicates = verifyDuplicate(addQuery->rec);
    if (duplicates.empty()) {
        result = ContactRecordInterface::Add(addQuery->rec);
    }
    else {
        addQuery->rec.ID = DB_ID_NONE;
    }

    auto response = std::make_unique<db::query::ContactAddResult>(result, addQuery->rec.ID, duplicateCheckResult);
    auto response = std::make_unique<db::query::ContactAddResult>(result, addQuery->rec.ID, duplicates);
    response->setRequestQuery(query);
    response->setRecordID(addQuery->rec.ID);
    return response;


@@ 1519,19 1522,17 @@ auto ContactRecordInterface::CheckContactsListDuplicates(std::vector<ContactReco
    return {unique, duplicates};
}

auto ContactRecordInterface::verifyDuplicate(ContactRecord &record) -> bool
auto ContactRecordInterface::verifyDuplicate(ContactRecord &record) -> std::vector<utils::PhoneNumber::View>
{
    auto isDuplicate = false;
    std::vector<utils::PhoneNumber::View> duplicates = {};
    for (const auto &number : record.numbers) {
        auto matchResult = MatchByNumber(number.number);
        if (!matchResult.has_value() || matchResult.value().contact.isTemporary()) {
            continue;
        }
        isDuplicate = true;
        record.ID   = matchResult.value().contactId;
        break;
        duplicates.push_back(number.number);
    }
    return isDuplicate;
    return duplicates;
}

auto ContactRecordInterface::verifyTemporary(ContactRecord &record) -> bool

M module-db/Interface/ContactRecord.hpp => module-db/Interface/ContactRecord.hpp +1 -1
@@ 248,7 248,7 @@ class ContactRecordInterface : public RecordInterface<ContactRecord, ContactReco
     * @param record single contact record to be verified
     * @return true if contact can be considered as a duplicate in DB
     */
    auto verifyDuplicate(ContactRecord &record) -> bool;
    auto verifyDuplicate(ContactRecord &record) -> std::vector<utils::PhoneNumber::View>;

    /**
     * @brief Verify if single contact record can be considered as an existing temporary contact in DB

M module-db/queries/phonebook/QueryContactAdd.cpp => module-db/queries/phonebook/QueryContactAdd.cpp +4 -2
@@ 11,8 11,10 @@ using namespace db::query;
ContactAdd::ContactAdd(const ContactRecord &rec) : Query(Query::Type::Create), rec(rec)
{}

ContactAddResult::ContactAddResult(bool result, unsigned int id, bool duplicated)
    : result(result), duplicated(duplicated), id(id)
ContactAddResult::ContactAddResult(bool result,
                                   unsigned int id,
                                   const std::vector<utils::PhoneNumber::View> &duplicates)
    : result(result), duplicates(duplicates), id(id)
{}

[[nodiscard]] auto ContactAdd::debugInfo() const -> std::string

M module-db/queries/phonebook/QueryContactAdd.hpp => module-db/queries/phonebook/QueryContactAdd.hpp +9 -5
@@ 1,4 1,4 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once


@@ 24,14 24,18 @@ namespace db::query
    class ContactAddResult : public QueryResult
    {
      public:
        ContactAddResult(bool result, unsigned int id, bool duplicated = false);
        ContactAddResult(bool result, unsigned int id, const std::vector<utils::PhoneNumber::View> &duplicates);
        [[nodiscard]] auto getResult() const noexcept -> bool
        {
            return result;
        }
        [[nodiscard]] auto isDuplicated() const noexcept -> bool
        [[nodiscard]] auto hasDuplicates() const noexcept -> bool
        {
            return duplicated;
            return !duplicates.empty();
        }
        [[nodiscard]] auto getDuplicates() const noexcept -> std::vector<utils::PhoneNumber::View>
        {
            return duplicates;
        }
        [[nodiscard]] auto getID() const noexcept -> unsigned int
        {


@@ 41,7 45,7 @@ namespace db::query

      private:
        bool result;
        bool duplicated;
        std::vector<utils::PhoneNumber::View> duplicates;
        unsigned int id;
    };


M module-db/tests/ContactsRecord_tests.cpp => module-db/tests/ContactsRecord_tests.cpp +2 -2
@@ 695,7 695,7 @@ TEST_CASE("Check if new contact record can be recognised as a duplicate in DB")
            ContactRecord::Number("600123451", "+48600123451", ContactNumberType::HOME),
        });

        REQUIRE(records.verifyDuplicate(noDuplicateContactRecord) == false);
        REQUIRE(records.verifyDuplicate(noDuplicateContactRecord).empty());
    }

    SECTION("Duplicate")


@@ 708,7 708,7 @@ TEST_CASE("Check if new contact record can be recognised as a duplicate in DB")
            ContactRecord::Number("600123456", "+48600123456", ContactNumberType::HOME),
        });

        REQUIRE(records.verifyDuplicate(duplicateContactRecord) == true);
        REQUIRE(!records.verifyDuplicate(duplicateContactRecord).empty());
    }
}


M products/PurePhone/services/desktop/endpoints/contacts/ContactHelper.cpp => products/PurePhone/services/desktop/endpoints/contacts/ContactHelper.cpp +16 -7
@@ 172,17 172,26 @@ namespace sdesktop::endpoints
            [](db::QueryResult *result, Context context) {
                if (auto contactResult = dynamic_cast<db::query::ContactAddResult *>(result)) {

                    context.setResponseBody(
                        json11::Json::object({{json::contacts::id, static_cast<int>(contactResult->getID())}}));
                    if (contactResult->getResult()) {
                        context.setResponseStatus(http::Code::OK);
                    }
                    else if (contactResult->isDuplicated()) {
                    if (contactResult->hasDuplicates()) {
                        auto numberDuplicates = json11::Json::array();
                        for (const auto &number : contactResult->getDuplicates()) {
                            numberDuplicates.emplace_back(number.getEntered().c_str());
                        }
                        context.setResponseBody(
                            json11::Json::object({{json::contacts::duplicateNumbers, numberDuplicates}}));
                        context.setResponseStatus(http::Code::Conflict);
                    }
                    else {
                        context.setResponseStatus(http::Code::InternalServerError);
                        context.setResponseBody(
                            json11::Json::object({{json::contacts::id, static_cast<int>(contactResult->getID())}}));
                        if (contactResult->getResult()) {
                            context.setResponseStatus(http::Code::OK);
                        }
                        else {
                            context.setResponseStatus(http::Code::InternalServerError);
                        }
                    }

                    putToSendQueue(context.createSimpleResponse());

                    return true;

M products/PurePhone/services/desktop/endpoints/include/endpoints/contacts/ContactHelper.hpp => products/PurePhone/services/desktop/endpoints/include/endpoints/contacts/ContactHelper.hpp +16 -15
@@ 32,21 32,22 @@ namespace sdesktop::endpoints

    namespace json::contacts
    {
        inline constexpr auto limit           = "limit";
        inline constexpr auto offset          = "offset";
        inline constexpr auto primaryName     = "priName";
        inline constexpr auto alternativeName = "altName";
        inline constexpr auto address         = "address";
        inline constexpr auto note            = "note";
        inline constexpr auto mail            = "email";
        inline constexpr auto id              = "id";
        inline constexpr auto numbers         = "numbers";
        inline constexpr auto numbersIDs      = "numbersIDs";
        inline constexpr auto isBlocked       = "blocked";
        inline constexpr auto isFavourite     = "favourite";
        inline constexpr auto isICE           = "ice";
        inline constexpr auto speedDial       = "speedDial";
        inline constexpr auto count           = "count";
        inline constexpr auto limit            = "limit";
        inline constexpr auto offset           = "offset";
        inline constexpr auto primaryName      = "priName";
        inline constexpr auto alternativeName  = "altName";
        inline constexpr auto address          = "address";
        inline constexpr auto note             = "note";
        inline constexpr auto mail             = "email";
        inline constexpr auto id               = "id";
        inline constexpr auto numbers          = "numbers";
        inline constexpr auto numbersIDs       = "numbersIDs";
        inline constexpr auto isBlocked        = "blocked";
        inline constexpr auto isFavourite      = "favourite";
        inline constexpr auto isICE            = "ice";
        inline constexpr auto speedDial        = "speedDial";
        inline constexpr auto count            = "count";
        inline constexpr auto duplicateNumbers = "duplicateNumbers";

    } // namespace json::contacts


M pure_changelog.md => pure_changelog.md +1 -0
@@ 20,6 20,7 @@
* Optimized E-Ink energy consumption
* Changed volume popup timeout to match phone modes popup
* Information about device memory is now sent to MC in floating points numbers
* Changed a way of returning information to Center about number duplications

### Fixed