aboutsummaryrefslogtreecommitdiff
path: root/backend/src/main.zig
diff options
context:
space:
mode:
authorJoris2025-04-19 12:36:38 +0200
committerJoris2025-04-19 12:38:24 +0200
commit632eef6424d8dc8d40c2906177892697679e7b85 (patch)
tree48d9cd60e9e96eab810b5f7bb3c7b1fa79e0438f /backend/src/main.zig
parent063d8ef9eaf874a941f4459e831057dd0a1b7ddd (diff)
Add ZIG server
Diffstat (limited to 'backend/src/main.zig')
-rw-r--r--backend/src/main.zig65
1 files changed, 65 insertions, 0 deletions
diff --git a/backend/src/main.zig b/backend/src/main.zig
new file mode 100644
index 0000000..5363392
--- /dev/null
+++ b/backend/src/main.zig
@@ -0,0 +1,65 @@
+const Allocator = std.mem.Allocator;
+const httpz = @import("httpz");
+const std = @import("std");
+
+const repos = @import("repos/repos.zig");
+
+const static = @import("services/static.zig");
+const handler = @import("services/handler.zig");
+const auth_service = @import("services/auth_service.zig");
+const users_service = @import("services/users_service.zig");
+const maps_service = @import("services/maps_service.zig");
+const markers_service = @import("services/markers_service.zig");
+
+pub fn main() !void {
+
+ // ENV
+ const env = std.posix.getenv;
+ const port = try std.fmt.parseInt(u16, env("PORT") orelse "3000", 10);
+ const db_path = env("DB_PATH") orelse "db.sqlite3";
+ const secure_tokens = if (std.mem.eql(u8, env("SECURE_TOKENS") orelse "false", "true")) true else false;
+
+ // Allocator
+ var gpa = std.heap.GeneralPurposeAllocator(.{}){};
+ const allocator = gpa.allocator();
+ defer _ = gpa.deinit();
+
+ // DB connection
+ var conn = try repos.init(allocator, db_path);
+ defer conn.close();
+
+ var h = handler.Handler{ .conn = conn, .secure_tokens = secure_tokens };
+ var server = try httpz.Server(*handler.Handler).init(allocator, .{
+ .port = port,
+ }, &h);
+ defer server.deinit();
+ defer server.stop();
+
+ var router = try server.router(.{});
+
+ const public_route = &handler.RouteData{ .is_public = true };
+
+ // Static files
+ router.get("/public/main.css", static.main_css, .{ .data = public_route });
+ router.get("/public/main.js", static.main_js, .{ .data = public_route });
+ router.get("/public/icon.png", static.icon_png, .{ .data = public_route });
+
+ // API
+ router.post("/api/login", auth_service.login, .{ .data = public_route });
+ router.post("/api/logout", auth_service.logout, .{});
+ router.get("/api/user", users_service.get_user, .{});
+ // Maps
+ router.get("/api/maps", maps_service.list, .{});
+ router.get("/api/maps/:id", maps_service.get, .{});
+ router.post("/api/maps", maps_service.create, .{});
+ router.put("/api/maps/:id", maps_service.update, .{});
+ router.delete("/api/maps/:id", maps_service.delete, .{});
+ // Markers
+ router.get("/api/markers", markers_service.list_by_map, .{});
+ router.post("/api/markers", markers_service.create, .{});
+ router.put("/api/markers/:id", markers_service.update, .{});
+ router.delete("/api/markers/:id", markers_service.delete, .{});
+
+ std.debug.print("listening http://localhost:{d}/\n", .{port});
+ try server.listen();
+}