aboutsummaryrefslogtreecommitdiff
path: root/backend/src/repos/markers_repo.zig
blob: 232b8b6a5465958ffa2a4d20e2859021f014538c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
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});
}