~aleteoryx/muditaos

7637eb0d2915583fad49f70a273c14e90dc9381d — Piotr Tański 4 years ago 2605ca9
[EGD-7907] Fixed contact editing

A contact could be removed during update process.
2 files changed, 16 insertions(+), 12 deletions(-)

M module-db/Interface/ContactRecord.cpp
M module-db/tests/ContactsRecord_tests.cpp
M module-db/Interface/ContactRecord.cpp => module-db/Interface/ContactRecord.cpp +5 -5
@@ 170,7 170,7 @@ auto ContactRecordInterface::Update(const ContactRecord &rec) -> bool
    bool ret          = false;
    bool recordExists = [&]() {
        auto record = contactDB->contacts.getById(contact.ID);
        return record.ID != DB_ID_NONE;
        return record.isValid();
    }();
    if (recordExists) {
        ret = contactDB->contacts.update(row);


@@ 651,10 651,13 @@ auto ContactRecordInterface::splitNumberIDs(const std::string &numberIDs) -> con

auto ContactRecordInterface::joinNumberIDs(const std::vector<std::uint32_t> &numberIDs) -> std::string
{
    if (numberIDs.empty()) {
        return {};
    }

    std::ostringstream outStream;
    std::ostream_iterator<std::uint32_t> outIterator(outStream, " ");
    std::copy(std::begin(numberIDs), std::end(numberIDs), outIterator);

    return outStream.str();
}



@@ 678,9 681,6 @@ auto ContactRecordInterface::unbindNumber(std::uint32_t contactId, std::uint32_t
    // unbind number from contact
    auto numberIDs = splitNumberIDs(contactRecord.numbersID);
    numberIDs.erase(std::remove(std::begin(numberIDs), std::end(numberIDs), numberId), std::end(numberIDs));
    if (numberIDs.empty()) {
        return contactDB->contacts.removeById(contactId);
    }
    contactRecord.numbersID = joinNumberIDs(numberIDs);
    return contactDB->contacts.update(contactRecord);
}

M module-db/tests/ContactsRecord_tests.cpp => module-db/tests/ContactsRecord_tests.cpp +11 -7
@@ 380,20 380,24 @@ TEST_CASE("Contact record numbers update")
        REQUIRE(contactDB.number.count() == 4);

        auto validationRecord = records.GetByIdWithTemporary(1);
        REQUIRE(validationRecord.ID == DB_ID_NONE);
        REQUIRE(validationRecord.ID != DB_ID_NONE);
        REQUIRE(validationRecord.numbers[0].number.getEntered() == numbers[2]);
        REQUIRE(validationRecord.numbers[1].number.getEntered() == numbers[3]);

        validationRecord = records.GetByIdWithTemporary(2);
        REQUIRE(validationRecord.ID != DB_ID_NONE);
        REQUIRE(validationRecord.numbers[0].number.getEntered() == numbers[0]);
        // numbers[3] was previously assigned to it, but it's re-assigned to recordID=2 above.
        REQUIRE(validationRecord.numbers.empty());

        // A temporary contact for number[0] (which was previously assigned to recordID=1) has been created.
        validationRecord = records.GetByIdWithTemporary(3);
        REQUIRE(validationRecord.ID != DB_ID_NONE);
        REQUIRE(validationRecord.numbers[0].number.getEntered() == numbers[1]);
        REQUIRE(validationRecord.numbers[0].number.getEntered() == numbers[0]);

        validationRecord = records.GetByID(4);
        REQUIRE(validationRecord.numbers.size() == 2);
        REQUIRE(validationRecord.numbers[0].number.getEntered() == numbers[2]);
        REQUIRE(validationRecord.numbers[1].number.getEntered() == numbers[3]);
        // A temporary contact for number[1] (which was previously assigned to recordID=1) has been created.
        validationRecord = records.GetByIdWithTemporary(4);
        REQUIRE(validationRecord.ID != DB_ID_NONE);
        REQUIRE(validationRecord.numbers[0].number.getEntered() == numbers[1]);
    }

    Database::deinitialize();