83 lines
2.5 KiB
D
83 lines
2.5 KiB
D
|
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);
|
||
|
}
|