Init
This commit is contained in:
commit
e70a04ac16
19 changed files with 576 additions and 0 deletions
89
src/web/endpoints/Block.zig
Normal file
89
src/web/endpoints/Block.zig
Normal 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);
|
||||
}
|
1
src/web/endpoints/root.zig
Normal file
1
src/web/endpoints/root.zig
Normal file
|
@ -0,0 +1 @@
|
|||
pub const Block = @import("Block.zig");
|
16
src/web/models/Block.zig
Normal file
16
src/web/models/Block.zig
Normal 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
1
src/web/models/root.zig
Normal file
|
@ -0,0 +1 @@
|
|||
pub const Block = @import("Block.zig");
|
41
src/web/root.zig
Normal file
41
src/web/root.zig
Normal 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,
|
||||
});
|
||||
}
|
3
src/web/stores/BlockUpdateQueue.zig
Normal file
3
src/web/stores/BlockUpdateQueue.zig
Normal 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
1
src/web/stores/root.zig
Normal file
|
@ -0,0 +1 @@
|
|||
pub const BlockUpdateQueue = @import("BlockUpdateQueue.zig");
|
Loading…
Add table
Add a link
Reference in a new issue