diff --git a/server/src/db.cpp b/server/src/db.cpp index aa5fe94..161389f 100644 --- a/server/src/db.cpp +++ b/server/src/db.cpp @@ -200,8 +200,36 @@ void Database::addLike(uint64_t postId, uint64_t userId) { } if (sqlite3_step(stmt) != SQLITE_DONE) { + // the user has UNLIKED something??? impossible sqlite3_finalize(stmt); - throw std::runtime_error("you lowkey already liked the post"); + // get rid of their like, how sad + sql.str(""); + sql.clear(); + sql << "UPDATE posts SET likes = COALESCE(likes, 1) - 1 WHERE id = " << postId << ";"; + sqlstr = sql.str(); + + if (sqlite3_prepare_v2(db, sqlstr.c_str(), -1, &stmt, nullptr) != SQLITE_OK) { + throw std::runtime_error("sqlite3 error: " + std::string(sqlite3_errmsg(db))); + } + if (sqlite3_step(stmt) != SQLITE_DONE) { + throw std::runtime_error("sqlite3 error: " + std::string(sqlite3_errmsg(db))); + } + sqlite3_finalize(stmt); + + // remove like from the likes table :( + sql.str(""); + sql.clear(); + sql << "DELETE FROM likes WHERE postid = " << postId << " AND userid = " << userId << ";"; + sqlstr = sql.str(); + + if (sqlite3_prepare_v2(db, sqlstr.c_str(), -1, &stmt, nullptr) != SQLITE_OK) { + throw std::runtime_error("sqlite3 error: " + std::string(sqlite3_errmsg(db))); + } + if (sqlite3_step(stmt) != SQLITE_DONE) { + throw std::runtime_error("sqlite3 error: " + std::string(sqlite3_errmsg(db))); + } + sqlite3_finalize(stmt); + return; } sqlite3_finalize(stmt);