aboutsummaryrefslogtreecommitdiff
path: root/backend/src/repos/markers_repo.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/repos/markers_repo.zig
parent063d8ef9eaf874a941f4459e831057dd0a1b7ddd (diff)
Add ZIG server
Diffstat (limited to 'backend/src/repos/markers_repo.zig')
-rw-r--r--backend/src/repos/markers_repo.zig114
1 files changed, 114 insertions, 0 deletions
diff --git a/backend/src/repos/markers_repo.zig b/backend/src/repos/markers_repo.zig
new file mode 100644
index 0000000..232b8b6
--- /dev/null
+++ b/backend/src/repos/markers_repo.zig
@@ -0,0 +1,114 @@
+const std = @import("std");
+const zqlite = @import("zqlite");
+const nanoid = @import("../lib/nanoid.zig");
+
+pub const Marker = struct {
+ id: []const u8,
+ lat: f64,
+ lng: f64,
+ color: []const u8,
+ name: []const u8,
+ description: []const u8,
+ icon: []const u8,
+ radius: i64,
+};
+
+pub fn get_markers(allocator: std.mem.Allocator, conn: zqlite.Conn, map_id: []const u8) !std.ArrayList(Marker) {
+ const query =
+ \\SELECT id, lat, lng, color, name, description, icon, radius
+ \\FROM markers
+ \\WHERE map_id = ?
+ ;
+
+ var rows = try conn.rows(query, .{map_id});
+
+ defer rows.deinit();
+
+ var list = std.ArrayList(Marker).init(allocator);
+ while (rows.next()) |row| {
+ try list.append(Marker{
+ .id = try allocator.dupe(u8, row.text(0)),
+ .lat = row.float(1),
+ .lng = row.float(2),
+ .color = try allocator.dupe(u8, row.text(3)),
+ .name = try allocator.dupe(u8, row.text(4)),
+ .description = try allocator.dupe(u8, row.text(5)),
+ .icon = try allocator.dupe(u8, row.text(6)),
+ .radius = row.int(7),
+ });
+ }
+ if (rows.err) |err| return err;
+
+ return list;
+}
+
+pub const Payload = struct {
+ lat: f64,
+ lng: f64,
+ color: []const u8,
+ name: []const u8,
+ description: []const u8,
+ icon: []const u8,
+ radius: i64,
+};
+
+pub fn create(allocator: std.mem.Allocator, conn: zqlite.Conn, map_id: []const u8, p: Payload) !Marker {
+ const query =
+ \\INSERT INTO markers(id, map_id, lat, lng, color, name, description, icon, radius)
+ \\VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
+ ;
+
+ const id: []const u8 = &nanoid.generate(std.crypto.random);
+
+ try conn.exec(query, .{ id, map_id, p.lat, p.lng, p.color, p.name, p.description, p.icon, p.radius });
+
+ return Marker{
+ .id = try allocator.dupe(u8, id),
+ .lat = p.lat,
+ .lng = p.lng,
+ .color = p.color,
+ .name = p.name,
+ .description = p.description,
+ .icon = p.icon,
+ .radius = p.radius,
+ };
+}
+
+pub fn update(conn: zqlite.Conn, id: []const u8, p: Payload) !Marker {
+ const query =
+ \\UPDATE markers
+ \\SET lat = ?, lng = ?, color = ?, name = ?, description = ?, icon = ?, radius = ?, updated_at = datetime()
+ \\WHERE id = ?
+ ;
+
+ try conn.exec(query, .{ p.lat, p.lng, p.color, p.name, p.description, p.icon, p.radius, id });
+
+ return Marker{
+ .id = id,
+ .lat = p.lat,
+ .lng = p.lng,
+ .color = p.color,
+ .name = p.name,
+ .description = p.description,
+ .icon = p.icon,
+ .radius = p.radius,
+ };
+}
+
+pub fn delete(conn: zqlite.Conn, id: []const u8) !void {
+ const query =
+ \\DELETE FROM markers
+ \\WHERE id = ?
+ ;
+
+ try conn.exec(query, .{id});
+}
+
+pub fn delete_by_map_id(conn: zqlite.Conn, map_id: []const u8) !void {
+ const query =
+ \\DELETE FROM markers
+ \\WHERE map_id = ?
+ ;
+
+ try conn.exec(query, .{map_id});
+}