Proof of concept artist name in url string

Some of my favorite code in the project. Just need a disambiguation page, and we're in business here
This commit is contained in:
mitteneer 2025-06-18 02:11:30 -04:00
parent 0b07947b8a
commit 2d7d2835fd

View file

@ -2,9 +2,10 @@ const std = @import("std");
const jetzig = @import("jetzig");
const jetquery = @import("jetzig").jetquery;
const TableRow = @import("../../types.zig").TableRow;
const dateFmt = @import("../../date_fmt.zig").dateFmt;
const ordinalFmt = @import("../../ordinal_fmt.zig").ordinalFmt;
//const dateFmt = @import("../../date_fmt.zig").dateFmt;
//const ordinalFmt = @import("../../ordinal_fmt.zig").ordinalFmt;
const queries = @import("../../queries.zig");
const decode = @import("../../date_fmt.zig").urlDecode;
pub fn index(request: *jetzig.Request) !jetzig.View {
var root = try request.data(.object);
@ -16,21 +17,45 @@ pub fn index(request: *jetzig.Request) !jetzig.View {
}
pub fn get(id: []const u8, request: *jetzig.Request) !jetzig.View {
const parse_err = blk: {
const rdr_id = std.fmt.parseInt(i64, id, 10) catch |err| break :blk err;
const artist = try jetzig.database.Query(.Artist).find(rdr_id).execute(request.repo);
if (artist == null) break :blk error.InvalidCharacter;
var name = std.ArrayList(u8).init(request.allocator);
try name.appendSlice("http://127.0.0.1:8080/artists/");
try name.appendSlice(artist.?.name);
return request.redirect(try name.toOwnedSlice(), .found);
};
const id_int = switch (parse_err) {
error.Overflow => return request.fail(.not_found),
error.InvalidCharacter => blk: {
const rn = try decode(request.allocator, id);
std.log.debug("{s}", .{rn});
const artists = try jetzig.database.Query(.Artist).where(.{ .name = rn }).all(request.repo);
if (artists.len == 0) return request.fail(.not_found);
if (artists.len > 1) return request.redirect("http://127.0.0.1:8080", .found);
break :blk artists[0].id;
},
else => unreachable,
};
var root = try request.data(.object);
const artist = try queries.entityQueryResult(request, queries.loadQuery(.artist, .entity_info), .{id});
const artist = try queries.entityQueryResult(request, queries.loadQuery(.artist, .entity_info), .{id_int});
try root.put("artist", artist);
const albums = try queries.entityQueryResult(request, queries.loadQuery(.artist, .get_albums), .{id});
const albums = try queries.entityQueryResult(request, queries.loadQuery(.artist, .get_albums), .{id_int});
try root.put("albums", albums);
const appears = try queries.entityQueryResult(request, queries.loadQuery(.artist, .appears), .{id});
const appears = try queries.entityQueryResult(request, queries.loadQuery(.artist, .appears), .{id_int});
try root.put("appears", appears);
const firstlast = try queries.entityQueryResult(request, queries.loadQuery(.artist, .firstlast), .{id});
const firstlast = try queries.entityQueryResult(request, queries.loadQuery(.artist, .firstlast), .{id_int});
try root.put("firstlast", firstlast);
const timescale = try queries.entityQueryResult(request, queries.loadQuery(.artist, .timescale), .{id});
const timescale = try queries.entityQueryResult(request, queries.loadQuery(.artist, .timescale), .{id_int});
try root.put("yearly", timescale);
return request.render(.ok);