// // Created by quentin on 8/4/22. // #include "accountData.h" #include AccountData::AccountData(const std::string &file) : Data(file) { account = AccountData::createObject(); } AccountData::AccountData(const std::string &file, const std::string &name) : Data(file) { std::string json = R"({"name":")" + name + R"(","payments":[],"earnings":[]})"; document.Parse(json.c_str()); account = AccountData::createObject(); std::cout << "Created account " << name << std::endl; } Account AccountData::createObject() { if (isJsonCorrect()) { std::string name = document["name"].GetString(); std::list payments; for (auto &domPayment : document["payments"].GetArray()) { Receipt receipt(domPayment["receipt"]["file"].GetString()); double value = domPayment["value"].GetDouble(); std::time_t date = domPayment["date"].GetInt64(); std::tm tmTime{}; std::memcpy(&tmTime, std::localtime(&date), sizeof(struct tm)); payments.emplace_back(value, receipt, tmTime); } std::list earnings; for (auto &domEarning : document["earnings"].GetArray()) { double value = domEarning["value"].GetDouble(); std::time_t date = domEarning["date"].GetInt64(); std::tm tmTime{}; std::memcpy(&tmTime, std::localtime(&date), sizeof(struct tm)); earnings.emplace_back(value, tmTime); } return Account(payments, earnings, name); } std::string strAnswer; bool answer; while (true) { std::cout << "Account " + getFilePath() + " Is malformed, would you like to remove it? (Y/n): "; std::cin >> strAnswer; std::transform(strAnswer.begin(), strAnswer.end(), strAnswer.begin(), ::toupper); if (strAnswer == "Y" || strAnswer == "YES") { answer = true; break; } if (strAnswer == "N" || strAnswer == "NO") { answer = false; break; } std::cout << "Sorry, answer " + strAnswer + " not understood." << std::endl; } return Account(); } bool AccountData::isJsonCorrect() { if (document.IsObject() && document.HasMember("name") && document["name"].IsString() && document.HasMember("payments") && document["payments"].IsArray() && document.HasMember("earnings") && document["earnings"].IsArray()) { for (auto &domPayment : document["payments"].GetArray()) { if (!(domPayment.IsObject() && domPayment.HasMember("receipt") && domPayment["receipt"].IsObject() && domPayment["receipt"].HasMember("file") && domPayment["receipt"]["file"].IsString() && domPayment.HasMember("value") && domPayment["value"].IsDouble() && domPayment.HasMember("date") && domPayment["date"].IsInt64())) { return false; } } for (auto &domEarning : document["earnings"].GetArray()) { if (!(domEarning.IsObject() && domEarning.HasMember("value") && domEarning["value"].IsDouble() && domEarning.HasMember("date") && domEarning["date"].IsInt64())) { return false; } } return true; } return false; } Account *AccountData::getAccount() { return &account; } AccountData::AccountData() : Data("/dev/null") {}