From 38357c96865027957be16db7b2c386ee85e25b51 Mon Sep 17 00:00:00 2001 From: rrandomsky Date: Thu, 16 Nov 2023 14:56:50 +0100 Subject: [PATCH] [CP-2156] Fixed no response when editing a contact to have the same number as another Fixed no response on Center side when editing a contact to have the same number as another contact in phonebook. Added a duplicate number to the response body. --- .../endpoints/pure/contacts_endpoint.md | 20 ++++++++++----- module-db/Interface/ContactRecord.cpp | 25 ++++++++++++++----- module-db/Interface/ContactRecord.hpp | 5 ++-- .../queries/phonebook/QueryContactUpdate.cpp | 7 ++++-- .../queries/phonebook/QueryContactUpdate.hpp | 18 +++++++++++-- .../endpoints/contacts/ContactHelper.cpp | 18 ++++++++++--- pure_changelog.md | 10 ++++++++ 7 files changed, 81 insertions(+), 22 deletions(-) diff --git a/doc/os_api/endpoints/pure/contacts_endpoint.md b/doc/os_api/endpoints/pure/contacts_endpoint.md index f6992b099fb3f3ebf5f0388620880d0486c68374..96812dc367e1bf7cd139de9530910463b84ae636 100644 --- a/doc/os_api/endpoints/pure/contacts_endpoint.md +++ b/doc/os_api/endpoints/pure/contacts_endpoint.md @@ -276,12 +276,20 @@ Parameters: } ``` -Warning: -In the current implementation, there is no duplicate detection while updating contact. -Example: -We have contact A with number 123 and contact B with number 456. -Contact A is updated with a new number - 456. Number 456 is silently unattached from contact B and assigned to contact -A. Finally, we have contact A with number 456 and contact B with no number. +**Response Payload Structure when contact is matched as a duplicate** + +```json +{ + "body": { + "duplicatedNumbers": [ + "123456789" + ] + }, + "endpoint": 7, + "status": 409, + "uuid": 123 +} +``` ### Delete a contact diff --git a/module-db/Interface/ContactRecord.cpp b/module-db/Interface/ContactRecord.cpp index d62eba1d08fe749e1fdbfa847b3fafa2da29564d..2960e182759635e3e926903fb67314c5f00d4dee 100644 --- a/module-db/Interface/ContactRecord.cpp +++ b/module-db/Interface/ContactRecord.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2024, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "ContactRecord.hpp" @@ -657,9 +657,20 @@ auto ContactRecordInterface::addQuery(const std::shared_ptr &query) - auto ContactRecordInterface::updateQuery(const std::shared_ptr &query) -> const std::unique_ptr { - auto updateQuery = static_cast(query.get()); - auto result = ContactRecordInterface::Update(updateQuery->rec); - auto response = std::make_unique(result); + auto updateQuery = dynamic_cast(query.get()); + if (updateQuery == nullptr) { + LOG_ERROR("Dynamic casting db::query::ContactUpdate has failed!"); + return std::unique_ptr(); + } + auto result = false; + + // Checking for duplicates along with omitting this contact in the DB in the search + auto duplicates = verifyDuplicate(updateQuery->rec, updateQuery->rec.ID); + if (duplicates.empty()) { + result = ContactRecordInterface::Update(updateQuery->rec); + } + + auto response = std::make_unique(result, updateQuery->rec.ID, duplicates); response->setRequestQuery(query); response->setRecordID(updateQuery->rec.ID); return response; @@ -1540,11 +1551,13 @@ auto ContactRecordInterface::CheckContactsListDuplicates(std::vector std::vector +auto ContactRecordInterface::verifyDuplicate(ContactRecord &record, const std::uint32_t contactIDToIgnore) + -> std::vector { std::vector duplicates = {}; for (const auto &number : record.numbers) { - auto matchResult = MatchByNumber(number.number); + auto matchResult = MatchByNumber( + number.number, CreateTempContact::False, utils::PhoneNumber::Match::POSSIBLE, contactIDToIgnore); if (!matchResult.has_value() || matchResult.value().contact.isTemporary()) { continue; } diff --git a/module-db/Interface/ContactRecord.hpp b/module-db/Interface/ContactRecord.hpp index 6aceb1c37a7577b74241625fdbe6c642ae2c1535..e17f5732978fef530a16fa7fd6c29bc0e9032e54 100644 --- a/module-db/Interface/ContactRecord.hpp +++ b/module-db/Interface/ContactRecord.hpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2024, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once @@ -250,7 +250,8 @@ class ContactRecordInterface : public RecordInterface std::vector; + auto verifyDuplicate(ContactRecord &record, const std::uint32_t contactIDToIgnore = 0u) + -> std::vector; /** * @brief Verify if single contact record can be considered as an existing temporary contact in DB diff --git a/module-db/queries/phonebook/QueryContactUpdate.cpp b/module-db/queries/phonebook/QueryContactUpdate.cpp index 17a646102387cdc0f7a0aa237f199f9f4191c3ce..43101a85f06906dcc6d6f9217da43c456f705d40 100644 --- a/module-db/queries/phonebook/QueryContactUpdate.cpp +++ b/module-db/queries/phonebook/QueryContactUpdate.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2024, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "QueryContactUpdate.hpp" @@ -11,7 +11,10 @@ using namespace db::query; ContactUpdate::ContactUpdate(const ContactRecord &rec) : Query(Query::Type::Update), rec(std::move(rec)) {} -ContactUpdateResult::ContactUpdateResult(bool result) : result(result) +ContactUpdateResult::ContactUpdateResult(bool result, + std::uint32_t id, + const std::vector &duplicates) + : result(result), duplicates(duplicates), id(id) {} [[nodiscard]] auto ContactUpdate::debugInfo() const -> std::string diff --git a/module-db/queries/phonebook/QueryContactUpdate.hpp b/module-db/queries/phonebook/QueryContactUpdate.hpp index 50e215d5881c91de246728ace5ee45ad29cba12b..1a70734bd97eee8c87bfed4238aaa30ffd71beb6 100644 --- a/module-db/queries/phonebook/QueryContactUpdate.hpp +++ b/module-db/queries/phonebook/QueryContactUpdate.hpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2024, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once @@ -24,15 +24,29 @@ namespace db::query class ContactUpdateResult : public QueryResult { public: - ContactUpdateResult(bool result); + ContactUpdateResult(bool result, std::uint32_t id, const std::vector &duplicates); auto getResult() -> bool { return result; } + [[nodiscard]] auto hasDuplicates() const noexcept -> bool + { + return !duplicates.empty(); + } + [[nodiscard]] auto getDuplicates() const noexcept -> std::vector + { + return duplicates; + } + [[nodiscard]] auto getID() const noexcept -> std::uint32_t + { + return id; + } [[nodiscard]] auto debugInfo() const -> std::string override; private: bool result; + std::vector duplicates; + std::uint32_t id; }; }; // namespace db::query diff --git a/products/PurePhone/services/desktop/endpoints/contacts/ContactHelper.cpp b/products/PurePhone/services/desktop/endpoints/contacts/ContactHelper.cpp index 00120a9e1585fea9f9a6c5660197e1c8351795c6..cc08fc3b5c659106ccae6d35270872b168215bc4 100644 --- a/products/PurePhone/services/desktop/endpoints/contacts/ContactHelper.cpp +++ b/products/PurePhone/services/desktop/endpoints/contacts/ContactHelper.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2024, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include @@ -244,9 +244,19 @@ namespace sdesktop::endpoints auto listener = std::make_unique( [](db::QueryResult *result, Context context) { if (auto contactResult = dynamic_cast(result)) { - - context.setResponseStatus(contactResult->getResult() ? http::Code::NoContent - : http::Code::InternalServerError); + 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(contactResult->getResult() ? http::Code::NoContent + : http::Code::InternalServerError); + } putToSendQueue(context.createSimpleResponse()); return true; diff --git a/pure_changelog.md b/pure_changelog.md index 18ba6902e69d8cd2dc4a24aa6fda972846abce9c..7831daf5b716b0d8f577d60f1dfa4004bdf2ff72 100644 --- a/pure_changelog.md +++ b/pure_changelog.md @@ -1,5 +1,15 @@ # MuditaOS changelog - PurePhone +## Unreleased + +### Fixed +Fixed no response when editing a contact via Center to have the same number as another + +### Added + +### Changed / Improved + + ## [1.11.0 2023-12-15] ### Added