teacher-tools/api/source/api_modules/announcement.d

83 lines
2.5 KiB
D
Raw Normal View History

2025-01-29 19:29:59 +00:00
module api_modules.announcement;
import handy_httpd;
import handy_httpd.handlers.path_handler;
import slf4d;
import ddbc;
import db;
import data_utils;
import api_modules.auth : getAdminUserOrThrow;
struct Announcement {
const ulong id;
const string type;
const string message;
static Announcement parse(DataSetReader r) {
return Announcement(
r.getUlong(1),
r.getString(2),
r.getString(3)
);
}
}
void registerApiEndpoints(PathHandler handler) {
handler.addMapping(Method.GET, "api/announcement", &getAnnouncementsEndpoint);
handler.addMapping(Method.POST, "api/announcement", &createAnnouncementAdminEndpoint);
handler.addMapping(Method.DELETE, "api/announcement/:id:ulong", &deleteAnnouncementAdminEndpoint);
}
void getAnnouncementsEndpoint(ref HttpRequestContext ctx) {
Connection conn = getDb();
scope(exit) conn.close();
const announcements = findAll(
conn,
"SELECT * FROM announcement ORDER BY id DESC",
&Announcement.parse
);
writeJsonBody(ctx, announcements);
}
void createAnnouncementAdminEndpoint(ref HttpRequestContext ctx) {
Connection conn = getDb();
scope(exit) conn.close();
auto user = getAdminUserOrThrow(ctx, conn);
struct Payload {
string type;
string message;
}
Payload payload = readJsonPayload!(Payload)(ctx);
if (payload.type is null || (payload.type != "INFO" && payload.type != "ERROR")) {
ctx.response.status = HttpStatus.BAD_REQUEST;
ctx.response.writeBodyString("Invalid type.");
return;
}
if (payload.message is null || payload.message.length < 1 || payload.message.length > 2000) {
ctx.response.status = HttpStatus.BAD_REQUEST;
ctx.response.writeBodyString("Invalid message.");
return;
}
ulong id = insertOne(
conn,
"INSERT INTO announcement (type, message) VALUES (?, ?) RETURNING id",
payload.type, payload.message
);
const announcement = findOne(
conn,
"SELECT * FROM announcement WHERE id = ?",
&Announcement.parse,
id
).orElseThrow();
writeJsonBody(ctx, announcement);
}
void deleteAnnouncementAdminEndpoint(ref HttpRequestContext ctx) {
Connection conn = getDb();
scope(exit) conn.close();
auto user = getAdminUserOrThrow(ctx, conn);
ulong id = ctx.request.getPathParamAs!ulong("id");
update(conn, "DELETE FROM announcement WHERE id = ?", id);
}