milestone 18: collapse duplicated infrastructure into shared listener core, crud list helper, resource shells, transport race, name and line helpers, ui modules
This commit is contained in:
@@ -61,10 +61,7 @@ pub fn applyUpdate(
|
||||
id: i64,
|
||||
edit: clients_repo.ClientEdit,
|
||||
) ?Failure {
|
||||
const database = switch (mutations.configDb(state)) {
|
||||
.database => |value| value,
|
||||
.fail => |failure| return failure,
|
||||
};
|
||||
const database = mutations.requireConfigDb(state) catch return mutations.no_config_db;
|
||||
|
||||
state.config_lock.lockUncancelable(io);
|
||||
const written = clients_repo.updateClient(database, id, edit);
|
||||
@@ -75,10 +72,7 @@ pub fn applyUpdate(
|
||||
}
|
||||
|
||||
pub fn applyDelete(state: *server.WebState, io: std.Io, id: i64) ?Failure {
|
||||
const database = switch (mutations.configDb(state)) {
|
||||
.database => |value| value,
|
||||
.fail => |failure| return failure,
|
||||
};
|
||||
const database = mutations.requireConfigDb(state) catch return mutations.no_config_db;
|
||||
|
||||
state.config_lock.lockUncancelable(io);
|
||||
const written = clients_repo.deleteClient(database, id);
|
||||
@@ -94,10 +88,7 @@ pub fn applyReplacePrefixes(
|
||||
arena: Allocator,
|
||||
items: []const clients_repo.ClientPrefixInput,
|
||||
) error{OutOfMemory}!?Failure {
|
||||
const database = switch (mutations.configDb(state)) {
|
||||
.database => |value| value,
|
||||
.fail => |failure| return failure,
|
||||
};
|
||||
const database = mutations.requireConfigDb(state) catch return mutations.no_config_db;
|
||||
|
||||
// Canonical duplicates are the same UNIQUE collision the database would
|
||||
// report for identical text, so they answer 409 (ruling 9) before the
|
||||
@@ -152,32 +143,33 @@ fn checkPrefixSet(
|
||||
// routes
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
pub fn list(state: *server.WebState, io: std.Io, request: *Request) HandlerError!void {
|
||||
_ = io;
|
||||
const database = switch (mutations.configDb(state)) {
|
||||
.database => |value| value,
|
||||
.fail => |failure| return mutations.respondFailure(request, failure, "listing clients"),
|
||||
};
|
||||
const resource = mutations.Resource(.{
|
||||
.Row = clients_repo.ClientRow,
|
||||
.list = clients_repo.listClientRows,
|
||||
.get = clients_repo.getClient,
|
||||
.remove = applyDelete,
|
||||
.label = "a client",
|
||||
.plural = "clients",
|
||||
.envelope = "clients",
|
||||
});
|
||||
|
||||
const rows = clients_repo.listClientRows(database, request.arena) catch |err|
|
||||
return mutations.respondFailure(request, .{ .internal = err }, "listing clients");
|
||||
pub const list = resource.list;
|
||||
pub const get = resource.get;
|
||||
pub const remove = resource.remove;
|
||||
|
||||
return http_util.respondJson(request, .ok, .{ .clients = rows.items }, &.{});
|
||||
}
|
||||
/// The prefixes are one list resource with no `/{id}` route: the whole set is
|
||||
/// read and replaced (ruling 9), so there is nothing to get or delete by id.
|
||||
const prefixes_resource = mutations.Resource(.{
|
||||
.Row = clients_repo.ClientPrefixRow,
|
||||
.list = clients_repo.listClientPrefixRows,
|
||||
.get = null,
|
||||
.remove = null,
|
||||
.label = "a client prefix",
|
||||
.plural = "client prefixes",
|
||||
.envelope = "client_prefixes",
|
||||
});
|
||||
|
||||
pub fn get(state: *server.WebState, io: std.Io, request: *Request) HandlerError!void {
|
||||
_ = io;
|
||||
const database = switch (mutations.configDb(state)) {
|
||||
.database => |value| value,
|
||||
.fail => |failure| return mutations.respondFailure(request, failure, "reading a client"),
|
||||
};
|
||||
|
||||
const row = clients_repo.getClient(database, request.arena, request.id.?) catch |err|
|
||||
return mutations.respondFailure(request, .{ .internal = err }, "reading a client");
|
||||
const found = row orelse return mutations.respondFailure(request, .not_found, "");
|
||||
|
||||
return http_util.respondJson(request, .ok, found, &.{});
|
||||
}
|
||||
pub const listPrefixes = prefixes_resource.list;
|
||||
|
||||
pub fn update(state: *server.WebState, io: std.Io, request: *Request) HandlerError!void {
|
||||
const parsed = http_util.parseBody(ClientBody, request) catch |err|
|
||||
@@ -199,26 +191,6 @@ pub fn update(state: *server.WebState, io: std.Io, request: *Request) HandlerErr
|
||||
return http_util.respondJson(request, .ok, found, &.{});
|
||||
}
|
||||
|
||||
pub fn remove(state: *server.WebState, io: std.Io, request: *Request) HandlerError!void {
|
||||
if (applyDelete(state, io, request.id.?)) |failure| {
|
||||
return mutations.respondFailure(request, failure, "deleting a client");
|
||||
}
|
||||
return http_util.respondEmpty(request, .no_content);
|
||||
}
|
||||
|
||||
pub fn listPrefixes(state: *server.WebState, io: std.Io, request: *Request) HandlerError!void {
|
||||
_ = io;
|
||||
const database = switch (mutations.configDb(state)) {
|
||||
.database => |value| value,
|
||||
.fail => |failure| return mutations.respondFailure(request, failure, "listing client prefixes"),
|
||||
};
|
||||
|
||||
const rows = clients_repo.listClientPrefixRows(database, request.arena) catch |err|
|
||||
return mutations.respondFailure(request, .{ .internal = err }, "listing client prefixes");
|
||||
|
||||
return http_util.respondJson(request, .ok, .{ .client_prefixes = rows.items }, &.{});
|
||||
}
|
||||
|
||||
pub fn putPrefixes(state: *server.WebState, io: std.Io, request: *Request) HandlerError!void {
|
||||
const parsed = http_util.parseBody(PrefixesBody, request) catch |err|
|
||||
return mutations.respondBadBody(request, err);
|
||||
|
||||
Reference in New Issue
Block a user