aboutsummaryrefslogtreecommitdiff
path: root/backend/src/repos/maps_repo.zig
blob: 80318278e7c72d2eae85182f1207618fbf922e04 (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
const std = @import("std");
const zqlite = @import("zqlite");
const nanoid = @import("../lib/nanoid.zig");

pub const Map = struct {
    id: []const u8,
    name: []const u8,
};

pub fn get_maps(allocator: std.mem.Allocator, conn: zqlite.Conn) !std.ArrayList(Map) {
    const query =
        \\SELECT id, name
        \\FROM maps
    ;

    var rows = try conn.rows(query, .{});
    defer rows.deinit();

    var list = std.ArrayList(Map).init(allocator);
    while (rows.next()) |row| {
        try list.append(Map{
            .id = try allocator.dupe(u8, row.text(0)),
            .name = try allocator.dupe(u8, row.text(1)),
        });
    }
    if (rows.err) |err| return err;

    return list;
}

pub fn get_map(allocator: std.mem.Allocator, conn: zqlite.Conn, id: []const u8) !?Map {
    const query =
        \\SELECT id, name
        \\FROM maps
        \\WHERE id = ?
    ;

    if (try conn.row(query, .{id})) |row| {
        defer row.deinit();
        return Map{
            .id = try allocator.dupe(u8, row.text(0)),
            .name = try allocator.dupe(u8, row.text(1)),
        };
    } else {
        return null;
    }
}

pub fn create(allocator: std.mem.Allocator, conn: zqlite.Conn, name: []const u8) !Map {
    const query =
        \\INSERT INTO maps(id, name)
        \\VALUES (?, ?)
    ;

    const id: []const u8 = &nanoid.generate(std.crypto.random);
    try conn.exec(query, .{ id, name });
    return Map{
        .id = try allocator.dupe(u8, id),
        .name = name,
    };
}

pub fn update(conn: zqlite.Conn, id: []const u8, name: []const u8) !Map {
    const query =
        \\UPDATE maps
        \\SET name = ?, updated_at = datetime()
        \\WHERE id = ?
    ;

    try conn.exec(query, .{ name, id });
    return Map{
        .id = id,
        .name = name,
    };
}

pub fn delete(conn: zqlite.Conn, id: []const u8) !void {
    const query =
        \\DELETE FROM maps
        \\WHERE id = ?
    ;

    try conn.exec(query, .{id});
}