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:
+31
-91
@@ -94,10 +94,7 @@ pub fn applyCreateRecord(
|
||||
arena: Allocator,
|
||||
item: model.LocalRecord,
|
||||
) error{OutOfMemory}!Created {
|
||||
const database = switch (mutations.configDb(state)) {
|
||||
.database => |value| value,
|
||||
.fail => |failure| return .{ .fail = failure },
|
||||
};
|
||||
const database = mutations.requireConfigDb(state) catch return .{ .fail = mutations.no_config_db };
|
||||
if (try mutations.checkLocalRecord(arena, item)) |problem| return .{ .fail = .{ .invalid = problem } };
|
||||
|
||||
state.config_lock.lockUncancelable(io);
|
||||
@@ -116,10 +113,7 @@ pub fn applyUpdateRecord(
|
||||
id: i64,
|
||||
item: model.LocalRecord,
|
||||
) 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;
|
||||
if (try mutations.checkLocalRecord(arena, item)) |problem| return .{ .invalid = problem };
|
||||
|
||||
state.config_lock.lockUncancelable(io);
|
||||
@@ -131,10 +125,7 @@ pub fn applyUpdateRecord(
|
||||
}
|
||||
|
||||
pub fn applyDeleteRecord(state: *server.WebState, io: std.Io, arena: Allocator, 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);
|
||||
defer state.config_lock.unlock(io);
|
||||
@@ -154,10 +145,7 @@ pub fn applyCreateZone(
|
||||
arena: Allocator,
|
||||
item: model.ForwardZone,
|
||||
) error{OutOfMemory}!Created {
|
||||
const database = switch (mutations.configDb(state)) {
|
||||
.database => |value| value,
|
||||
.fail => |failure| return .{ .fail = failure },
|
||||
};
|
||||
const database = mutations.requireConfigDb(state) catch return .{ .fail = mutations.no_config_db };
|
||||
if (try mutations.checkForwardZone(arena, item)) |problem| return .{ .fail = .{ .invalid = problem } };
|
||||
|
||||
state.config_lock.lockUncancelable(io);
|
||||
@@ -176,10 +164,7 @@ pub fn applyUpdateZone(
|
||||
id: i64,
|
||||
item: model.ForwardZone,
|
||||
) 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;
|
||||
if (try mutations.checkForwardZone(arena, item)) |problem| return .{ .invalid = problem };
|
||||
|
||||
state.config_lock.lockUncancelable(io);
|
||||
@@ -191,10 +176,7 @@ pub fn applyUpdateZone(
|
||||
}
|
||||
|
||||
pub fn applyDeleteZone(state: *server.WebState, io: std.Io, arena: Allocator, 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);
|
||||
defer state.config_lock.unlock(io);
|
||||
@@ -208,35 +190,20 @@ pub fn applyDeleteZone(state: *server.WebState, io: std.Io, arena: Allocator, id
|
||||
// local records: routes
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
pub fn listRecords(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 local records"),
|
||||
};
|
||||
const records_resource = mutations.Resource(.{
|
||||
.Row = local_repo.LocalRecordRow,
|
||||
.list = local_repo.listLocalRecordRows,
|
||||
.get = local_repo.getLocalRecord,
|
||||
.remove = applyDeleteRecord,
|
||||
.label = "a local record",
|
||||
.plural = "local records",
|
||||
.envelope = "local_records",
|
||||
.view = RecordView.from,
|
||||
});
|
||||
|
||||
const rows = local_repo.listLocalRecordRows(database, request.arena) catch |err|
|
||||
return mutations.respondFailure(request, .{ .internal = err }, "listing local records");
|
||||
|
||||
const views = try request.arena.alloc(RecordView, rows.items.len);
|
||||
for (views, rows.items) |*view, row| view.* = .from(row);
|
||||
|
||||
return http_util.respondJson(request, .ok, .{ .local_records = views }, &.{});
|
||||
}
|
||||
|
||||
pub fn getRecord(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 local record"),
|
||||
};
|
||||
|
||||
const row = local_repo.getLocalRecord(database, request.arena, request.id.?) catch |err|
|
||||
return mutations.respondFailure(request, .{ .internal = err }, "reading a local record");
|
||||
const found = row orelse return mutations.respondFailure(request, .not_found, "");
|
||||
|
||||
return http_util.respondJson(request, .ok, RecordView.from(found), &.{});
|
||||
}
|
||||
pub const listRecords = records_resource.list;
|
||||
pub const getRecord = records_resource.get;
|
||||
pub const removeRecord = records_resource.remove;
|
||||
|
||||
pub fn createRecord(state: *server.WebState, io: std.Io, request: *Request) HandlerError!void {
|
||||
const parsed = http_util.parseBody(RecordBody, request) catch |err|
|
||||
@@ -279,43 +246,23 @@ pub fn updateRecord(state: *server.WebState, io: std.Io, request: *Request) Hand
|
||||
}, &.{});
|
||||
}
|
||||
|
||||
pub fn removeRecord(state: *server.WebState, io: std.Io, request: *Request) HandlerError!void {
|
||||
if (applyDeleteRecord(state, io, request.arena, request.id.?)) |failure| {
|
||||
return mutations.respondFailure(request, failure, "deleting a local record");
|
||||
}
|
||||
return http_util.respondEmpty(request, .no_content);
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// forward zones: routes
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
pub fn listZones(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 forward zones"),
|
||||
};
|
||||
const zones_resource = mutations.Resource(.{
|
||||
.Row = local_repo.ForwardZoneRow,
|
||||
.list = local_repo.listForwardZoneRows,
|
||||
.get = local_repo.getForwardZone,
|
||||
.remove = applyDeleteZone,
|
||||
.label = "a forward zone",
|
||||
.plural = "forward zones",
|
||||
.envelope = "forward_zones",
|
||||
});
|
||||
|
||||
const rows = local_repo.listForwardZoneRows(database, request.arena) catch |err|
|
||||
return mutations.respondFailure(request, .{ .internal = err }, "listing forward zones");
|
||||
|
||||
return http_util.respondJson(request, .ok, .{ .forward_zones = rows.items }, &.{});
|
||||
}
|
||||
|
||||
pub fn getZone(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 forward zone"),
|
||||
};
|
||||
|
||||
const row = local_repo.getForwardZone(database, request.arena, request.id.?) catch |err|
|
||||
return mutations.respondFailure(request, .{ .internal = err }, "reading a forward zone");
|
||||
const found = row orelse return mutations.respondFailure(request, .not_found, "");
|
||||
|
||||
return http_util.respondJson(request, .ok, found, &.{});
|
||||
}
|
||||
pub const listZones = zones_resource.list;
|
||||
pub const getZone = zones_resource.get;
|
||||
pub const removeZone = zones_resource.remove;
|
||||
|
||||
pub fn createZone(state: *server.WebState, io: std.Io, request: *Request) HandlerError!void {
|
||||
const parsed = http_util.parseBody(ZoneBody, request) catch |err|
|
||||
@@ -348,13 +295,6 @@ pub fn updateZone(state: *server.WebState, io: std.Io, request: *Request) Handle
|
||||
}, &.{});
|
||||
}
|
||||
|
||||
pub fn removeZone(state: *server.WebState, io: std.Io, request: *Request) HandlerError!void {
|
||||
if (applyDeleteZone(state, io, request.arena, request.id.?)) |failure| {
|
||||
return mutations.respondFailure(request, failure, "deleting a forward zone");
|
||||
}
|
||||
return http_util.respondEmpty(request, .no_content);
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// tests
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user