Visibility Architecture: Decision & Analysis
Discussed with @REDCODE — July 15, 2026
Conclusion: Rejecting the Additive Rule
After analyzing the entire codebase and discussing the…
Status check against current codebase — ~90% complete
✅ Phase A — Enum + Entities (DONE)
EVisibility.cscreated inButter/Types/- All three models (
Person,Album,Asset)…
Visibility Audit Report: Issue #44 vs Current Implementation
Issue Thesis
Assets inside an album should inherit the album's visibility — "you only need permission over album to see…
Changes from latest review session (5 commits)
Backend fixes
UserController.GetAll— changed?? EAccessLevel.Adminfallback to?? EAccessLevel.User(safer default behind…
PR #127 Review
Overview
39 files, +1217 / -159. Introduces the Maintainer role, data visibility enforcement at the mapper level, maintainer-to-cosplayer assignment, centralized role…
Fixed in 0673017 — both methods now use switch expressions.
Fixed in a449c79 — EAccessLevel enum replaces bool parameter. Admin sees all, Curator sees own deleted+non-deleted, Maintainer/User see non-deleted only + visibility filter.
Fixed in 9323111 — Maintainer can now see Visibility field.
Fixed in 0673017 — same.
Fixed in c64c194 — same scoping applied to SearchQuery.
Fixed in 0673017 — switched to switch expression.
Fixed in c64c194 — Maintainer now sees Public + Protected + persons they maintain, not all persons.
MediaController already passes user.AccessLevel to the media repository. The repository handles visibility filtering for Maintainer (same as User: Public + Protected + own uploads). Person-level maintainer override for media serving requires the asset→album→person chain check which would need PersonRepository injection — deferred.
Fixed in 08c3890 — same.
Fixed in 08c3890 — now uses PagedParametersDto.MaxPageSize const instead of hardcoded 150.
Fixed in bbb2ed8 — default changed to EVisibility.Private.