╭ changed ─────────────╮ │src/ui/Repo/Events.zig│ ╰──────────────────────╯ ╭───────────╮ │← all files│ ╰───────────╯ ╭───────────────────────────────────────────────────────╮ │56 io: std.Io, │ │57 admin_moment: ?evt.AdminDB.HashMap(.read_only),│ │58 identity: []const u8, │ │59 + repo_event: evt.Repo, │ │60 requested_view: ui.RoutablePage.EventsView, │ │61 selected_kind: ?evt.EventKind, │ │62 selected: []const u8, │ ╰───────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │111 } │ │112 │ │113 if (moment_index != null) { │ │113 - try readMomentEvents(repo_kind, repo_opts, arena, &result, haxy_moment, kind_map, admin_moment, identity, selected); │ │114 + try readMomentEvents(repo_kind, repo_opts, arena, &result, haxy_moment, kind_map, admin_moment, identity, repo_event, selected);│ │115 return result; │ │116 } │ │117 │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │141 event_window.next = .{ .id = try formatId(aa, &id), .kind = kind }; │ │142 break; │ │143 } │ │143 - const item = (try readItem(repo_opts.hash, arena, haxy_moment, kind_map, admin_moment, identity, view == .active, kind, &id)) orelse continue; │ │144 + const item = (try readItem(repo_opts.hash, arena, haxy_moment, kind_map, admin_moment, identity, repo_event, view == .active, kind, &id)) orelse continue;│ │145 try events.append(aa, item); │ │146 } │ │147 event_window.events = events.items; │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────╮ │174 kind_map: evt.EventDB(repo_opts.hash).HashMap(.read_only),│ │175 admin_moment: ?evt.AdminDB.HashMap(.read_only), │ │176 identity: []const u8, │ │177 + repo_event: evt.Repo, │ │178 selected: []const u8, │ │179 ) !void { │ │180 const DB = evt.EventDB(repo_opts.hash); │ ╰───────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │210 if (event_window.next == null) event_window.next = .{ .id = try formatId(aa, &id), .kind = kind }; │ │211 continue; │ │212 } │ │211 - const item = (try readItem(repo_opts.hash, arena, haxy_moment, kind_map, admin_moment, identity, view == .active, kind, &id)) orelse continue; │ │213 + const item = (try readItem(repo_opts.hash, arena, haxy_moment, kind_map, admin_moment, identity, repo_event, view == .active, kind, &id)) orelse continue;│ │214 try window_events.append(aa, item); │ │215 } │ │216 // the window start can name an event this batch no longer holds │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────╮ │261 .repo => evt.Repo, │ │262 .fork => evt.Fork, │ │263 .grant => evt.Grant, │ │262 - .issue => evt.Issue, │ │264 .discuss => evt.Discussion,│ │265 + .issue => evt.Issue, │ │266 .comment => evt.Comment, │ │267 .attach => evt.Attachment, │ │268 .patchrev => evt.PatchRev, │ ╰────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────╮ │280 kind_map: evt.EventDB(hash_kind).HashMap(.read_only),│ │281 admin_moment: ?evt.AdminDB.HashMap(.read_only), │ │282 identity: []const u8, │ │283 + repo_event: evt.Repo, │ │284 include_view_url: bool, │ │285 kind: evt.EventKind, │ │286 id: *const [evt.event_id_size]u8, │ ╰──────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │308 }, │ │309 .fork => _ = (try evt.readRecordSubset(evt.Fork, struct { removed: bool }, DB, hash_kind, haxy_moment, arena, id)) orelse return null, │ │310 .grant => _ = (try evt.readRecordSubset(evt.Grant, struct { removed: bool }, DB, hash_kind, haxy_moment, arena, id)) orelse return null,│ │311 + .discuss => { │ │312 + const record = (try evt.readRecordSubset(evt.Discussion, Authored, DB, hash_kind, haxy_moment, arena, id)) orelse return null; │ │313 + item.author = try ui.Author.initFromEmail(admin_moment, arena, record.author_email); │ │314 + if (!include_view_url or repo_event.threadRole(.discuss) == null) return item; │ │315 + const route = ui.RoutablePage.repoThreadCommentsRoute(.discuss, identity, item.id, 0) orelse return error.RouteTooLong; │ │316 + item.view_url = try route.toUrl(arena); │ │317 + }, │ │318 .issue => { │ │319 const record = (try evt.readRecordSubset(evt.Issue, Authored, DB, hash_kind, haxy_moment, arena, id)) orelse return null; │ │320 item.author = try ui.Author.initFromEmail(admin_moment, arena, record.author_email); │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │311 - if (!include_view_url) return item; │ │321 + if (!include_view_url or repo_event.threadRole(.issue) == null) return item; │ │322 const route = ui.RoutablePage.repoThreadCommentsRoute(.issue, identity, item.id, 0) orelse return error.RouteTooLong;│ │323 item.view_url = try route.toUrl(arena); │ │324 }, │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │315 - .discuss => { │ │316 - const record = (try evt.readRecordSubset(evt.Discussion, Authored, DB, hash_kind, haxy_moment, arena, id)) orelse return null; │ │317 - item.author = try ui.Author.initFromEmail(admin_moment, arena, record.author_email); │ │318 - if (!include_view_url) return item; │ │319 - const route = ui.RoutablePage.repoThreadCommentsRoute(.discuss, identity, item.id, 0) orelse return error.RouteTooLong; │ │320 - item.view_url = try route.toUrl(arena); │ │321 - }, │ │325 .comment => { │ │326 const record = (try evt.readRecordSubset(evt.Comment, struct { author_email: ?[]const u8, event: struct { thread_id: [evt.event_id_size * 2]u8 } }, DB, hash_kind, haxy_moment, arena, id)) orelse return null;│ │327 item.author = try ui.Author.initFromEmail(admin_moment, arena, record.author_email); │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────╮ │next →│ ╰──────╯