ADORSYS-GIS / ADORSYS-GIS/lightbridge-authz

[Task]: Seat snapshots query endpoint

Open
#728 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
Rust
Stars
0
Forks
1
Avg merge
7h 7m
Merged PRs (30d)
237

Description

Parent: #586 (Per-grain query APIs)

### Summary

Build the seat snapshots query endpoint: request types, query builder, handler, and route.

### What to build

1. **`SeatSnapshotQueryRequest`** — scope: User/All, start_time, end_time, bucket, filters, group_by, limit
2. **`SeatSnapshotQueryFilters`** — source, subject_kind, seat_state, assignee_team, plan_type
3. **`SeatGroupBy`** enum — Source, SubjectKind, SubjectId, SeatState
4. **`SeatSnapshotSeriesPoint`** — bucket_start, source, subject_kind, subject_id, seat_count, active_count, pending_cancellation_count
5. **`build_seat_snapshot_query()`** — aggregation over `usage_seat_snapshots`
6. **Handler + route:** `POST /usage/v1/usage/seats/query`

### SQL shape

Similar to day facts — single-table aggregation. Seat count per bucket: `COUNT(*)` or `COUNT(DISTINCT provider_user_id)` depending on whether the query is per-subject or per-seat-state. Bucket-scoped truncation via `dense_rank()`.

### Scope filter

- `scope=user`: `provider_user_id = $scope_id`
- `scope=all`: no entity filter, requires `usage:read-all`
- `scope=account` / `scope=project`: return `400` (not applicable)

### Files to modify

- `crates/lightbridge-authz-usage/src/models/seat.rs` — NEW: request, filters, group_by, point structs
- `crates/lightbridge-authz-usage/src/repo/seat_query.rs` — NEW: query builder
- `crates/lightbridge-authz-usage/src/handlers/seat.rs` — NEW: handler
- `crates/lightbridge-authz-usage/src/routers/mod.rs` — add route

### Tests

- Seed seat snapshots → query → assert correct seat counts
- scope=user → assert only matching user's seats returned
- scope=account → 400
- Bucket truncation
- Filter by seat_state, source

### Source of truth

- Design Decision 1: `docs/plans/0586-per-grain-query-apis-analysis.md`
- Seat snapshots DDL: `migrations-usage/20260908000002_usage_seat_snapshots.sql`
- SubjectKind vocabulary: `crates/lightbridge-authz-usage/src/models/day_seat.rs`

### Verification evidence

To be attached on the implementing PR.

Contributor guide

Open the contributing guide

Research direction

Start with docs/plans/0586-per-grain-query-apis-analysis.md, migrations-usage/20260908000002_usage_seat_snapshots.sql, and crates/lightbridge-authz-usage/src/models/day_seat.rs. Then implement the request models, query builder, handler, and route in the listed files, adding tests for counts, scope handling, bucket truncation, and filters. Done means POST /usage/v1/usage/seats/query supports the specified scopes and returns the requested seat snapshot series.

Written by the indexing model from the issue text.

Assessment

Tech stack
rust
Domain
api, backend, database
Issue type
Feature
Difficulty
4/5
Estimated time
3-5 days
Activity status
Active
Clarity
Clearly specified
Newbie friendliness
68/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.