AnvilAuth/src/routes/aliapi/api/profiles/minecraft.zig
2024-03-02 19:54:51 +01:00

94 lines
2.7 KiB
Zig

const std = @import("std");
const conutil = @import("../../../../conutil.zig");
const Id = @import("../../../../Id.zig");
const State = @import("../../../../State.zig");
pub fn matches(path: []const u8) bool {
return std.mem.eql(u8, path, "/aliapi/api/profiles/minecraft");
}
pub fn call(req: *std.http.Server.Request, state: *State) !void {
if (req.head.method != .POST) {
try conutil.sendJsonError(
req,
.method_not_allowed,
"only POST requests are allowed to this endpoint!",
.{},
);
return;
}
var json_reader = std.json.reader(state.allocator, try req.reader());
defer json_reader.deinit();
const usernames_req = try std.json.parseFromTokenSource(
[][]u8,
state.allocator,
&json_reader,
.{},
);
defer usernames_req.deinit();
if (usernames_req.value.len > 10) {
try conutil.sendJsonError(
req,
.bad_request,
"Only up to 10 usernames may be requested at a time, got {}",
.{usernames_req.value.len},
);
return;
}
for (usernames_req.value) |username| {
for (username) |*char|
char.* = std.ascii.toLower(char.*);
}
var param_str = std.ArrayList(u8).init(state.allocator);
defer param_str.deinit();
try param_str.append('{');
for (usernames_req.value, 0..) |username, i| {
if (i != 0) try param_str.append(',');
try param_str.appendSlice(username);
}
try param_str.append('}');
try param_str.append(0);
const db_res = state.db.execParams(
\\SELECT id, name FROM users
\\WHERE lower(name)=any($1::varchar[]);
, .{@as([*:0]const u8, @ptrCast(param_str.items.ptr))});
defer db_res.deinit();
try db_res.expectTuples();
if (db_res.cols() != 2) return error.InvalidResultFromPostgresServer;
var response_json = std.ArrayList(u8).init(state.allocator);
defer response_json.deinit();
var json_writer = std.json.writeStream(response_json.writer(), .{});
try json_writer.beginArray();
for (0..@intCast(db_res.rows())) |rowidx| {
const id = db_res.get(Id, @intCast(rowidx), 0);
const name = db_res.get([]const u8, @intCast(rowidx), 1);
try json_writer.beginObject();
try json_writer.objectField("id");
try json_writer.write(&id.toString());
try json_writer.objectField("name");
try json_writer.write(name);
try json_writer.endObject();
}
try json_writer.endArray();
try req.respond(response_json.items, .{
.extra_headers = &.{.{
.name = "Content-Type",
.value = "application/json",
}},
});
}