feat: 完成源晶权限与经验系统并优化 me/admin 交互

这个提交包含在:
cryptocommuniums-afk
2026-02-23 20:02:46 +08:00
父节点 2b6def2560
当前提交 43cbd38bac
修改 104 个文件,包含 13348 行新增776 行删除

查看文件

@@ -0,0 +1,41 @@
#include <catch2/catch_test_macros.hpp>
#include "csp/db/sqlite_db.h"
#include "csp/services/auth_service.h"
#include "csp/services/experience_service.h"
TEST_CASE("experience only increases on rating gains") {
auto db = csp::db::SqliteDb::OpenMemory();
csp::db::ApplyMigrations(db);
csp::db::SeedDemoData(db);
csp::services::AuthService auth(db);
const auto user = auth.Register("xp_user", "password123");
csp::services::ExperienceService xp(db);
const auto s0 = xp.GetSummary(user.user_id);
REQUIRE(s0.user_id == user.user_id);
REQUIRE(s0.experience >= 0);
const int base_exp = s0.experience;
db.Exec("UPDATE users SET rating=rating+10 WHERE id=" +
std::to_string(user.user_id));
const auto s1 = xp.GetSummary(user.user_id);
REQUIRE(s1.experience == base_exp + 10);
db.Exec("UPDATE users SET rating=rating-4 WHERE id=" +
std::to_string(user.user_id));
const auto s2 = xp.GetSummary(user.user_id);
REQUIRE(s2.experience == base_exp + 10);
db.Exec("UPDATE users SET rating=rating+3 WHERE id=" +
std::to_string(user.user_id));
const auto s3 = xp.GetSummary(user.user_id);
REQUIRE(s3.experience == base_exp + 13);
const auto rows = xp.ListHistory(user.user_id, 20);
REQUIRE(rows.size() >= 2);
REQUIRE(rows[0].xp_delta == 3);
REQUIRE(rows[1].xp_delta == 10);
}