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}); }