This commit is contained in:
Dominic Grimm 2025-06-01 12:33:53 +02:00
commit e70a04ac16
No known key found for this signature in database
19 changed files with 576 additions and 0 deletions

View file

@ -0,0 +1,89 @@
const std = @import("std");
const zap = @import("zap");
const models = @import("../models/root.zig");
const stores = @import("../stores/root.zig");
const msg_queue = @import("../../msg_queue/root.zig");
const Self = @This();
pub const default_path = "block";
allocator: std.mem.Allocator,
block_update_queue: *const stores.BlockUpdateQueue,
path: []const u8,
error_strategy: zap.Endpoint.ErrorStrategy = .log_to_console,
pub fn init(allocator: std.mem.Allocator, block_update_queue: *const stores.BlockUpdateQueue, path: []const u8) Self {
return .{
.allocator = allocator,
.block_update_queue = block_update_queue,
.path = path,
};
}
pub fn get(_: *Self, r: zap.Request) !void {
r.setStatus(.method_not_allowed);
r.markAsFinished(true);
}
pub fn post(_: *Self, r: zap.Request) !void {
r.setStatus(.method_not_allowed);
r.markAsFinished(true);
}
pub fn put(self: *Self, r: zap.Request) !void {
blk: {
if (r.body) |body| {
const maybe_block: ?std.json.Parsed(models.Block) = std.json.parseFromSlice(models.Block, self.allocator, body, .{}) catch null;
if (maybe_block) |parsed| {
defer parsed.deinit();
const block = parsed.value;
if (block.material.len > msg_queue.messages.BlockUpdate.material_len_max or !models.Block.materialIsValid(block.material)) {
break :blk;
}
std.log.info("block: {}", .{block});
var msg = msg_queue.messages.BlockUpdate{
.dimension = block.dimension,
.x = block.x,
.y = block.y,
.z = block.z,
};
std.mem.copyForwards(u8, &msg.material, block.material);
msg.material_len = block.material.len;
self.block_update_queue.queue.enqueue(msg);
r.setStatus(.created);
r.markAsFinished(true);
return;
}
}
}
r.setStatus(.bad_request);
r.markAsFinished(true);
}
pub fn delete(_: *Self, r: zap.Request) !void {
r.setStatus(.method_not_allowed);
r.markAsFinished(true);
}
pub fn patch(_: *Self, r: zap.Request) !void {
r.setStatus(.method_not_allowed);
r.markAsFinished(true);
}
pub fn options(_: *Self, r: zap.Request) !void {
try r.setHeader("Access-Control-Allow-Origin", "*");
try r.setHeader("Access-Control-Allow-Methods", "PUT, OPTIONS, HEAD");
r.setStatus(zap.http.StatusCode.no_content);
r.markAsFinished(true);
}
pub fn head(_: *Self, r: zap.Request) !void {
r.setStatus(zap.http.StatusCode.no_content);
r.markAsFinished(true);
}

View file

@ -0,0 +1 @@
pub const Block = @import("Block.zig");

16
src/web/models/Block.zig Normal file
View file

@ -0,0 +1,16 @@
const std = @import("std");
dimension: u8,
x: i32,
y: i32,
z: i32,
material: []const u8,
pub fn materialIsValid(material: []const u8) bool {
for (material) |ch| {
if (!std.ascii.isAlphabetic(ch))
return false;
}
return true;
}

1
src/web/models/root.zig Normal file
View file

@ -0,0 +1 @@
pub const Block = @import("Block.zig");

41
src/web/root.zig Normal file
View file

@ -0,0 +1,41 @@
const std = @import("std");
const zap = @import("zap");
const msg_queue = @import("../msg_queue/root.zig");
const models = @import("models/root.zig");
const endpoints = @import("endpoints/root.zig");
const stores = @import("stores/root.zig");
fn onRequest(r: zap.Request) !void {
_ = r;
}
pub fn start(allocator: std.mem.Allocator, threads: i16, port: u16, queue: *msg_queue.MsgQueueUnmanaged(msg_queue.messages.BlockUpdate)) !void {
var listener = zap.Endpoint.Listener.init(allocator, .{
.port = port,
.on_request = onRequest,
.log = true,
});
defer listener.deinit();
const block_update_queue_store = stores.BlockUpdateQueue{
.queue = queue,
};
var block_endpoint = endpoints.Block.init(
allocator,
&block_update_queue_store,
std.fmt.comptimePrint("/api/{s}", .{endpoints.Block.default_path}),
);
try listener.register(&block_endpoint);
try listener.listen();
std.log.info("Listening on 0.0.0.0:{d}", .{port});
zap.start(.{
.threads = threads,
.workers = 1,
});
}

View file

@ -0,0 +1,3 @@
const msg_queue = @import("../../msg_queue/root.zig");
queue: *msg_queue.MsgQueueUnmanaged(msg_queue.messages.BlockUpdate),

1
src/web/stores/root.zig Normal file
View file

@ -0,0 +1 @@
pub const BlockUpdateQueue = @import("BlockUpdateQueue.zig");