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