Every key observed across the thirteen repository objects in the golden fixtures — golden/repository/repo-single.json, repo-single-community.json, search.json, forks-list.json, golden/user/user-repos-list.json and golden/organization/org-repos-list.json — is represented here. Two keys are deliberately not:
repo_transfer is null on all thirteen. It carries a pending-transfer record whose payload includes a Team model no wave owns yet, and inventing a shape for a field nobody has ever seen populated would be a guess.
external_tracker and external_wiki never appear at all — docs/HAZARDS.md records that Forgejo omits them entirely when unconfigured — so there is no observed evidence to model them from. They belong to the wave that first meets a repository using an external tracker.
parent recurses into this same DTO. Forgejo populates it for forks and sends null otherwise, so the recursion terminates on the wire rather than by depth limit.
Converts to the domain, reporting failure paths relative to at.
Converts to the domain, reporting failure paths relative to at.
Four things are required, because without them there is no repository to speak of: id, name, owner, and the owner's login. The last two are what build the com.worxbend.codeberg4s.repositories.RepoSlug, and the slug is what every other repository endpoint takes as its argument — a Repository that cannot address itself would be useless. name and the owner's login additionally go through their smart constructors, so a value containing a slash is rejected here rather than forging a path later.
Everything else is optional or defaulted. Absent counts become 0, absent flags become false, and an absent topics becomes an empty Vector — the reduced repository objects Forgejo embeds in pull requests and notifications carry none of them.
A failure inside owner or parent is reported at that nested path, not at the repository's.