From 632eef6424d8dc8d40c2906177892697679e7b85 Mon Sep 17 00:00:00 2001 From: Joris Date: Sat, 19 Apr 2025 12:36:38 +0200 Subject: Add ZIG server --- backend/src/main.zig | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 backend/src/main.zig (limited to 'backend/src/main.zig') 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(); +} -- cgit v1.2.3