summaryrefslogtreecommitdiff
path: root/backend/src/API/WeaponsAPI.zig
blob: 7c8d72a8cee6a88a709e6bdd5d66fd3ef7634930 (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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
const std = @import("std");
const httpz = @import("httpz");
const model = @import("../Models/RangedWeapon.zig");
const descModel = @import("../Models/Description.zig");
const db = @import("../Database/Connection.zig");
const errDesc = @import("ErrorDescription.zig");
const Handler = @import("../Handler.zig");

pub fn RegisterEndpoints(router: *httpz.Router(*Handler.Handler,*const fn (*Handler.RequestData, *httpz.request.Request, *httpz.response.Response) anyerror!void)) void {
    router.get("/weapons/ranged", getAllRangedWeapons, .{});
    router.post("/weapons/ranged", newRangedWeapon, .{});
    router.get("/weapons/ranged/:id/description", getRangedWeaponDescription, .{});
    router.post("/weapons/ranged/:id/description", setRangedWeaponDescription, .{});
    router.get("/weapons/ranged/:id", getRangedWeaponById, .{});
    router.put("/weapons/ranged/:id", updateRangedWeapon, .{});
    router.delete("/weapons/ranged/:id", deleteRangedWeapon, .{});
}

fn getAllRangedWeapons(_: *Handler.RequestData, req: *httpz.Request, res: *httpz.Response) !void {
    var found = try db.RangedWeapons.GetAll(req.arena);
    defer found.deinit(req.arena);

    try res.json(found.items, .{});
}

fn getRangedWeaponById(_: *Handler.RequestData, req: *httpz.Request, res: *httpz.Response) !void {
    const id = req.param("id") orelse {
        res.setStatus(.bad_request);
        return;
    };

    const found = db.RangedWeapons.GetByDisplayName(req.arena, id) catch |err| {
        // Empty result handling
        if (err == db.ResultErrors.NotFound) {
            res.setStatus(.no_content);
            try res.json(errDesc.NotFoundDescriptor, .{});
            return;
        }
        return err;
    };

    try res.json(found, .{});
}

fn newRangedWeapon(_: *Handler.RequestData, req: *httpz.Request, res: *httpz.Response) !void {
    var body = try req.json(model.RequestBody) orelse {
        res.setStatus(.bad_request);
        return;
    };

    var weapon = body.ToModel();
    db.RangedWeapons.Create(&weapon) catch |err| {
        if (err == db.ResultErrors.AlreadyExists) {
            res.setStatus(.bad_request);
            try res.json(errDesc.ErrorDescriptor { 
                .Message = "A weapon with that ID already exists"
            }, .{});
            return;
        }
        return err;
    }; 

    res.setStatus(.created);
}

fn updateRangedWeapon(_: *Handler.RequestData, req: *httpz.Request, res: *httpz.Response) !void {
    const id = req.param("id") orelse {
        res.setStatus(.bad_request);
        return;
    };

    var body = try req.json(model.RequestBody) orelse {
        res.setStatus(.bad_request);
        return;
    };

    var weapon = body.ToModel();
    db.RangedWeapons.Update(id, &weapon) catch |err| {
        if (err == db.ResultErrors.NotFound) {
            res.setStatus(.no_content);
            try res.json(errDesc.NotFoundDescriptor, .{});
            return;
        }
        return err;
    };  
}

fn deleteRangedWeapon(_: *Handler.RequestData, req: *httpz.Request, res: *httpz.Response) !void {
    const id = req.param("id") orelse {
        res.setStatus(.bad_request);
        return;
    };

    try db.RangedWeapons.Delete(id);
}

fn getRangedWeaponDescription(_: *Handler.RequestData, req: *httpz.Request, res: *httpz.Response) !void {
    const id = req.param("id") orelse {
        res.setStatus(.bad_request);
        return;
    };

    const query = try req.query();
    const lang = query.get("lang") orelse "en";
    const desc = db.RangedWeapons.GetDescription(req.arena, id, lang) catch |err| {
        if (err == db.ResultErrors.NotFound) {
            // The description does not exist
            try res.json(descModel.Description {
                .Id = id,
                .Language = lang,
                .Contents = ""
            }, .{});
            return;
        }
        return err;
    };

    try res.json(desc, .{});
}

fn setRangedWeaponDescription(_: *Handler.RequestData, req: *httpz.Request, res: *httpz.Response) !void {
    const id = req.param("id") orelse {
        res.setStatus(.bad_request);
        return;
    };

    const body = try req.json(descModel.RequestBody) orelse {
        res.setStatus(.bad_request);
        return;
    };

    try db.RangedWeapons.SetDescription(.{
        .Id = id,
        .Language = body.Language,
        .Contents = body.Contents
    });
}