Everyone gets... ONE vote!

This commit is contained in:
2026-07-21 16:58:44 +10:00
parent 7e9271db72
commit 5d5982c2dc
3 changed files with 46 additions and 13 deletions

View File

@@ -8,7 +8,7 @@ async function like(id) {
}); });
if (result.status === 401) { if (result.status === 401) {
alert("you need to login before you like a post"); window.location.href = "/login";
return; return;
} }

View File

@@ -2,6 +2,7 @@
#include <iomanip> #include <iomanip>
#include <iostream> #include <iostream>
#include <fstream> #include <fstream>
#include <ostream>
#include <sqlite3.h> #include <sqlite3.h>
#include <stdexcept> #include <stdexcept>
#include <sstream> #include <sstream>
@@ -53,6 +54,11 @@ Database::Database(const std::string& path) {
userid INTEGER NOT NULL, userid INTEGER NOT NULL,
expiry INTEGER NOT NULL expiry INTEGER NOT NULL
); );
CREATE TABLE IF NOT EXISTS likes (
postid INTEGER NOT NULL,
userid INTEGER NOT NULL
);
)"; )";
char* errmsg = nullptr; char* errmsg = nullptr;
@@ -183,13 +189,9 @@ void Database::addPost(const Post& post) {
} }
void Database::addLike(uint64_t postId, uint64_t userId) { void Database::addLike(uint64_t postId, uint64_t userId) {
// check if the post has already been liked
std::stringstream sql; std::stringstream sql;
sql << R"( sql << "SELECT * FROM likes WHERE postid = " << postId << " AND userId = " << userId << ";";
UPDATE posts
SET likes = COALESCE(likes, 0) + 1
WHERE id =
)";
sql << postId << ";";
std::string sqlstr = sql.str(); std::string sqlstr = sql.str();
sqlite3_stmt* stmt; sqlite3_stmt* stmt;
@@ -198,11 +200,38 @@ void Database::addLike(uint64_t postId, uint64_t userId) {
} }
if (sqlite3_step(stmt) != SQLITE_DONE) { if (sqlite3_step(stmt) != SQLITE_DONE) {
throw std::runtime_error("sqlite3 error: " + std::string(sqlite3_errmsg(db))); sqlite3_finalize(stmt);
throw std::runtime_error("you lowkey already liked the post");
} }
sqlite3_finalize(stmt); sqlite3_finalize(stmt);
// add like to the post
sql.str("");
sql.clear();
sql << "UPDATE posts SET likes = COALESCE(likes, 0) + 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);
// add like to the likes table
sql.str("");
sql.clear();
sql << "INSERT INTO likes (postid, userid) VALUES (" << postId << ", " << 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);
} }

View File

@@ -282,14 +282,18 @@ int main() {
svr.Post("/like", [&database, &data_mutex](const httplib::Request& request, httplib::Response& response) { svr.Post("/like", [&database, &data_mutex](const httplib::Request& request, httplib::Response& response) {
try { try {
std::string username = request.form.get_field("username");
std::string password = request.form.get_field("password");
std::string post = request.form.get_field("post"); std::string post = request.form.get_field("post");
std::lock_guard<std::mutex> lock(data_mutex); std::lock_guard<std::mutex> lock(data_mutex);
std::optional<User> user = getLoggedInUser(request, database);
if (!user.has_value()) {
response.status = 401;
response.set_content("i dunno that user", "text/plain");
return;
}
uint64_t postNum = std::stoull(post); uint64_t postNum = std::stoull(post);
database.addLike(postNum, 0); database.addLike(postNum, user->id);
} catch (const std::runtime_error& e) { } catch (const std::runtime_error& e) {
response.status = 500; response.status = 500;
response.set_content("<p>there was an error :( it is: " + std::string(e.what()) + "</p>", "text/html"); response.set_content("<p>there was an error :( it is: " + std::string(e.what()) + "</p>", "text/html");