Skip to content

feat(rm-handlers): W5 — taxonomy admin pages (IssueStatus / Tracker / IssuePriority)#15

Merged
AdaWorldAPI merged 1 commit into
mainfrom
claude/w5-taxonomy-handlers
Jun 21, 2026
Merged

feat(rm-handlers): W5 — taxonomy admin pages (IssueStatus / Tracker / IssuePriority)#15
AdaWorldAPI merged 1 commit into
mainfrom
claude/w5-taxonomy-handlers

Conversation

@AdaWorldAPI

Copy link
Copy Markdown
Owner

W5 from the Redmine Integration Plan

Three near-identical lookup tables sharing (name, position, is_<flag>). Each behind a distinct OGAR canonical concept so the rendered HTML carries the right data-class-id for downstream dispatch.

Concept Class id Routes
IssueStatus 0x0105 project_status /issue_statuses + /issue_statuses/:name
Tracker 0x0106 project_type /trackers + /trackers/:name
IssuePriority 0x0107 priority /enumerations/issue_priorities + /.../issue_priorities/:name

The IssuePriority URL nests under /enumerations/ per Redmine's convention (Enumerations group lookup tables of variable schemas; TimeEntryActivity + DocumentCategory are siblings deferred for now).

Generic helpers — CRUD<T> factoring pilot

Three resources share find_by_name<T: SurrealValue> and list_table<T: SurrealValue> in rm-store/src/taxonomy.rs. This is the first sighting of the CRUD<T> trait factoring Plan §1.6 anticipates — taxonomy is the natural pilot since the row shape is uniform. Future taxonomy concepts (TimeEntryActivity, DocumentCategory) drop into the same shape.

CustomField deferred

W5 in the plan also includes CustomField (project_custom_field 0x0110). Its structurally-different shape (carries a field_format discriminator + per-format options) ties to D1 (forms depth track — picking the right input kind per field_format). Lands separately.

DoD pinned by 9 tests

Where What
store (5) round-trips per concept, list empty/populated, NotFound per concept
handlers (4) list class_id per concept, default-flag visible, Redmine-shape /enumerations/ URL, detail 404 across all 3

All three CI gates green locally: fmt + clippy + cargo test --workspace (124 tests across 5 crates).

Status

5 of 8 width tracks shipped. W1 ✓ W2 ✓ W3 ✓ W4 (User+Role) ✓ W5 (3 of 4) ✓. Remaining: W4 nested (Member/MemberRole/Watcher), W6 Comms, W7 SCM-light, W8 Queries/Relations.

🤖 Generated with Claude Code

… IssuePriority)

W5 of the Redmine Integration Plan. Three near-identical lookup
tables sharing the (name, position, is_<flag>) shape, behind three
distinct OGAR canonical concepts.

# Routes

- GET /issue_statuses               (0x0105 project_status)
- GET /issue_statuses/:name         IssueStatus detail (is_closed flag)
- GET /trackers                     (0x0106 project_type)
- GET /trackers/:name               Tracker detail (is_default flag)
- GET /enumerations/issue_priorities          (0x0107 priority)
- GET /enumerations/issue_priorities/:name    IssuePriority detail (is_default flag)

The IssuePriority URL nests under /enumerations/ per Redmine's
convention — Enumerations group lookup tables of variable schemas,
including TimeEntryActivity + DocumentCategory which we don't model
yet (deferred).

# Generic helpers landed in rm-store/src/taxonomy.rs

Three resources share `find_by_name<T: SurrealValue>` and
`list_table<T: SurrealValue>`. First sighting of the `CRUD<T>`
trait factoring the Integration Plan §1.6 anticipates — taxonomy
is the natural pilot since the row shape is uniform.

# CustomField deferred

W5 in the plan also includes CustomField (project_custom_field
0x0110). Its shape is structurally different (carries a `field_format`
discriminator + per-format options) and the form-rendering surface
(which input kind to use for "list" vs "text" vs "date" formats) is
the natural integration with D1 (forms depth track). Lands separately.

# DoD pinned by 9 tests + 5 in rm-handlers

Store (taxonomy.rs, 5):
- issue_status / tracker / issue_priority round-trip
- list empty-then-populated across all 3
- NotFound for unknown name across all 3

Handlers (taxonomy.rs, 4):
- issue_status list renders 0x0105
- tracker list renders 0x0106 + default flag
- issue_priority list uses Redmine-shape /enumerations/ URL
- detail pages render for all 3 with correct class_id
- detail 404 for unknown name across all 3 resources

# Status: 5/8 width tracks shipped

W1 ✓ W2 ✓ W3 ✓ W4 (User+Role) ✓ W5 (3 of 4 — CustomField deferred) ✓.
Remaining: W4 nested (Member/MemberRole/Watcher), W6 Comms,
W7 SCM-light, W8 Queries/Relations.

cargo fmt --check + cargo clippy --all-targets -- -D warnings +
cargo test --workspace all green locally; 124 tests across 5 crates.
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, you can upgrade your account or add credits to your account and enable them for code reviews in your settings.

@AdaWorldAPI AdaWorldAPI merged commit 48ab0d9 into main Jun 21, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant