feat: add daily tasks and fix /admin139 admin entry

这个提交包含在:
Codex CLI
2026-02-15 12:51:42 +08:00
父节点 e2ab522b78
当前提交 ad29a9f62d
修改 13 个文件,包含 1200 行新增30 行删除

查看文件

@@ -10,6 +10,10 @@ class MeController : public drogon::HttpController<MeController> {
public:
METHOD_LIST_BEGIN
ADD_METHOD_TO(MeController::profile, "/api/v1/me", drogon::Get);
ADD_METHOD_TO(MeController::listRedeemItems, "/api/v1/me/redeem/items", drogon::Get);
ADD_METHOD_TO(MeController::listRedeemRecords, "/api/v1/me/redeem/records", drogon::Get);
ADD_METHOD_TO(MeController::createRedeemRecord, "/api/v1/me/redeem/records", drogon::Post);
ADD_METHOD_TO(MeController::listDailyTasks, "/api/v1/me/daily-tasks", drogon::Get);
ADD_METHOD_TO(MeController::listWrongBook, "/api/v1/me/wrong-book", drogon::Get);
ADD_METHOD_TO(MeController::upsertWrongBookNote, "/api/v1/me/wrong-book/{1}", drogon::Patch);
ADD_METHOD_TO(MeController::deleteWrongBookItem, "/api/v1/me/wrong-book/{1}", drogon::Delete);
@@ -18,6 +22,18 @@ class MeController : public drogon::HttpController<MeController> {
void profile(const drogon::HttpRequestPtr& req,
std::function<void(const drogon::HttpResponsePtr&)>&& cb);
void listRedeemItems(const drogon::HttpRequestPtr& req,
std::function<void(const drogon::HttpResponsePtr&)>&& cb);
void listRedeemRecords(const drogon::HttpRequestPtr& req,
std::function<void(const drogon::HttpResponsePtr&)>&& cb);
void createRedeemRecord(const drogon::HttpRequestPtr& req,
std::function<void(const drogon::HttpResponsePtr&)>&& cb);
void listDailyTasks(const drogon::HttpRequestPtr& req,
std::function<void(const drogon::HttpResponsePtr&)>&& cb);
void listWrongBook(const drogon::HttpRequestPtr& req,
std::function<void(const drogon::HttpResponsePtr&)>&& cb);

查看文件

@@ -0,0 +1,40 @@
#pragma once
#include "csp/db/sqlite_db.h"
#include <cstdint>
#include <string>
#include <vector>
namespace csp::services {
struct DailyTaskItem {
std::string code;
std::string title;
std::string description;
int reward = 1;
bool completed = false;
int64_t completed_at = 0;
};
class DailyTaskService {
public:
static constexpr const char* kTaskLoginCheckin = "login_checkin";
static constexpr const char* kTaskDailySubmit = "daily_submit";
static constexpr const char* kTaskFirstAc = "first_ac";
static constexpr const char* kTaskCodeQuality = "code_quality";
explicit DailyTaskService(db::SqliteDb& db) : db_(db) {}
std::string CurrentDayKey() const;
std::vector<DailyTaskItem> ListTodayTasks(int64_t user_id) const;
// Returns true when the task is completed for the first time today
// (and reward is granted), false when already completed.
bool CompleteTaskIfFirstToday(int64_t user_id, const std::string& task_code);
private:
db::SqliteDb& db_;
};
} // namespace csp::services