All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project aims to follow Semantic Versioning.
- This release explicitly targets Hubuum server v0.0.9, with its 202-operation
OpenAPI contract and immutable multi-platform image
sha256:1f12baf882b6d3df5b4b2dbdf26aad0793274e57f86a2c186b8e1e68632db5db. - Add machine-checked property-level reconciliation between pinned OpenAPI schemas and 34 generated or handwritten Rust wire models, including explicit point/list projection exceptions and regressions for relation cardinalities, import timestamps, and export timings.
- Create or update a GitHub Release from the matching dated changelog section
after crate publication, with an idempotent backfill for existing stable tags
and the newest stable release marked as
Latest.
- Update all locked Rust dependencies to their latest Rust 1.88-compatible
releases and refresh the pinned PostgreSQL 18 integration-fixture image.
Notable updates include Futures 0.3.34,
h20.4.19, Hyper 1.11.1, ICU 2.3,log0.4.34,syn3.0.4, andthiserror2.0.20. - Validate JSON query paths while preserving the existing
.json_schema().path(["key"]).eq(value)builder shape. Invalid or missing paths now returnApiError::InvalidJsonPathfrom the terminal query operation before transport;try_pathprovides eager validation andwith_pathaccepts a reusable validatedJsonPath.ObjectAggregateJsonPathremains as a compatibility alias for the sharedJsonPathtype.
- Reject empty JSON query paths, empty segments, and segments containing
characters outside ASCII alphanumeric,
_, or$before transport. - Forward positive page and unified-search per-kind limits to the server instead of rejecting values above 250, allowing deployments to apply their advertised pagination maximum while the client continues to reject zero locally.
- Make async and blocking export path downloads publish atomically after a successful flush, preserving existing destination files and removing partial temporary files when a download fails.
- Pass release tags to workflow shell steps through environment variables instead of interpolating expressions into generated shell commands.
- Update
h2to 0.4.19 (including the fix released in 0.4.16) to address RUSTSEC-2026-0258, which could allow an HTTP/2 peer to cause unbounded processing of empty DATA frames. - Require release tags to point at the exact protected
mainhead and pass the complete required CI suite for that commit before trusted publishing starts.
- This release explicitly targets Hubuum server v0.0.9, with its 202-operation
OpenAPI contract and immutable multi-platform image
sha256:1f12baf882b6d3df5b4b2dbdf26aad0793274e57f86a2c186b8e1e68632db5db. - Model positive resource revisions and opaque strong HTTP entity tags, retain
point-response ETags on resource handles, and support optional
If-Matchpreconditions on generic updates and deletes. Collection ACL reads retain SQL permission-set ETags, with conditional helpers for every ACL mutation. - Add import v2 write conditions and computed-field inputs; bounded RFC 6902 principal-settings patches; computed-field point reads; group-membership point reads; and principal-token active/expired state filters, point reads, renewal, and conditional revocation.
- Expose the server's maximum explicit token lifetime through public and administrative authentication configuration.
- Compatible lockfile dependencies are refreshed, including
aws-lc-rs1.18.0,aws-lc-sys0.44.0, andcc1.4.1. - Breaking: authoritative resource, history, integration, token, event, and
import response models expose v0.0.9 revisions. Struct-literal callers must
populate the new
revision,condition, orcomputed_fieldsfields. - Breaking: collection permission reads return
CollectionPermissionsResponse: SQL-backed responses contain a revisionedCollectionPermissionSet, while Treetop-backed responses preserve their expanded group/permission rows without inventing a revision. Group membership is represented byPrincipalMemberwith stable principal/group IDs and an optional nested principal projection. - Breaking: principal settings operations return
PrincipalSettingsResponse { revision, settings }; class point responses expose optional expanded collection data plus a stablecollection_id. - Breaking: user and service-account list/point projections now expose
optional identity-scope/provider names plus stable
identity_scope_idfields, matching the distinct v0.0.9 response shapes. Theiris_local()helpers now returnOption<bool>so point responses with no scope name are reported as unknown rather than incorrectly non-local. - Breaking:
ClassPatch::collection_idis now optional; struct-literal callers should wrap an intended move inSome(...). This also fixes description-only fluent updates incorrectly serializing collection ID zero. - Breaking: computed-field patches and deletes no longer carry an
expected_revisionbody or query parameter. Use the newIf-Matchhelpers with an ETag obtained from a point read when optimistic concurrency is required. - Breaking: event deliveries no longer expose the removed
claim_token; token metadata exposes lifecycle state, and event responses expose before and after revisions. - Breaking:
CURRENT_BACKUP_VERSIONis 4, matching the v0.0.9 server's revision-aware disaster-recovery snapshot format. Older backup artifacts must be restored with the server version that produced them.
- Validate response ETags instead of silently discarding malformed values, and preserve path-aware JSON errors for successful responses with bodies, including DELETE operations.
- Complete typed coverage for the fields added between Hubuum server v0.0.5
and v0.0.8: validated positive
ObjectRelationLimitvalues and per-side class-relation cardinalities, timestamp preservation for all five core graph import inputs, and total/query/hydration/render export-task timings. ClassRelationCreateOptionsand matching async/blockingcreate_relation_with_options()helpers compose template aliases with per-side cardinality limits on class-scoped relation creation.- Pinned downstream-consumer coverage verifies cardinality enforcement, core import timestamp preservation, export timing details, and Hubuum v0.0.8's resource-scoped administrator list visibility fix.
- This release explicitly targets Hubuum server v0.0.8, with its 196-operation
OpenAPI contract and immutable multi-platform image
sha256:850bfd95a2802485f93c1700fbff5a33465cbc7855cbc94962982c1074fd96f6. - Compatible lockfile dependencies are refreshed, including
aho-corasick1.1.5,ipnet2.12.1,regex-automata0.4.18, and test-onlytrybuild1.0.120. - Breaking:
ClassRelationPost, the five core graphImport*Inputmodels, andExportTaskDetailshave fields added for the v0.0.8 contract. Callers constructing them with struct literals must populate the new optional fields, usually withNone; alternatively use the typed builders where available. - Breaking: the nonfunctional class-relation template-alias query methods
and matching
ClassRelationGetfields are removed because Hubuum v0.0.8 does not support filtering relations by those fields.
- Typed class- and object-relation ID filters now emit Hubuum's actual query
keys (
from_classes,to_classes,from_objects,to_objects, andclass_relation) instead of response-model field names that v0.0.8 rejects.
- This release explicitly targets Hubuum server v0.0.8, with its 196-operation
OpenAPI contract and immutable multi-platform image
sha256:850bfd95a2802485f93c1700fbff5a33465cbc7855cbc94962982c1074fd96f6. - Resource API code generation now runs through the unpublished,
repository-local
hubuum_reconciletool and commits ordinary Rust source.hubuum_client_deriveis no longer a client dependency or separately published crate; this internal change leaves thehubuum_clientpublic API unchanged. - Direct and transitive dependencies are refreshed to their latest releases
compatible with Rust 1.88, including the test-only
event-listener5.4.2 update that resolvesRUSTSEC-2026-0221.
- Public client configuration now exposes Hubuum v0.0.5's effective default
token lifetime through
ClientConfig::authentication.default_token_lifetime_hours. - Login and principal-token issuance preserve the server's authoritative
expiry through
Client::token_expires_at(),Token::expires_at(), and the additive user and service-accounttokens_create_token()methods. Existingtokens_create()methods continue returning the one-time raw token string. - Administrative configuration exposes the token-retention purge switch, retention period, interval, and bounded batch size.
- This release explicitly targets Hubuum server v0.0.5 and pins its
196-operation OpenAPI contract plus immutable multi-platform server image
sha256:6f3e0f0debd418acd5cbc2b1399db9859a85ca1fa397525a5ef0e2f493a77c9b. - Tokens minted without an explicit expiry now surface the server's materialized default expiry in issuance and token-metadata responses.
- This release explicitly targets Hubuum server v0.0.4 and retains its pinned
196-operation OpenAPI contract plus immutable multi-platform server image
sha256:60142d605f423b1dc58d9dfe709164b0d5ec93befd2d702f9bdca7ee0654a583. - Compatible Rust dependencies are refreshed, including
syn3.0.3,cc1.4.0,glob0.3.4,libc0.2.189, andrustls-pki-types1.15.1. - Endpoint URL rendering now borrows dynamic path parameters instead of cloning their owned keys and values before every async and blocking request.
- Bearer tokens, restore capabilities, and caller-provided raw header values are
now marked sensitive for built-in and custom transports, keeping them out of
Debugoutput and HTTP/2 dynamic compression tables.
- Typed coverage for the Hubuum v0.0.4 contract: nested permission/resource token scopes, hierarchical collection/class/object token boundaries, root-task provenance on audit/history/task-event models and subscription filters, initiator event queries, and up to four numeric object aggregate measures.
- Full database-state responses and async/blocking
meta_db_full()accessors expose all v0.0.3 connection-pool acquisition, wait, timeout, creation, and closure metrics without breaking the originalDbStateResponsemodel. - Full collection-history responses and accessors preserve the server's
parent_collection_idwithout breaking the originalCollectionHistorymodel or its existing methods. - Additive
FullImportGraphandFullImportRequestmodels cover every Hubuum 0.0.3 import section, including identity and integration state plus class-relation template aliases. Async and blocking clients expose matchingsubmit_full()andrun_full()task helpers while the original core import types remain source-compatible. - Typed effective-permission lookup for any principal through
Client::principal_permissions, pluspermissions()convenience methods on user and service-account handles.
- This release explicitly targets Hubuum server v0.0.4 and pins its
196-operation OpenAPI contract plus immutable multi-platform server image
sha256:60142d605f423b1dc58d9dfe709164b0d5ec93befd2d702f9bdca7ee0654a583. - Principal-token mint requests now emit the v0.0.4 singular
scopeobject. ExistingNewTokenRequest::scopes(...)calls remain source-compatible and serialize asscope.permissions; useNewTokenRequest::scope(...)withTokenScopeDetailsto combine permission and resource boundaries. Omitscopeentirely to mint an unscoped token. - Token, event, history, task-event, subscription-filter, and aggregate response structs have additive v0.0.4 fields. This is a source-breaking change only for callers constructing those response models with struct literals; add the new fields or deserialize server responses instead.
- Hubuum v0.0.4 history lists can omit stored versions the caller cannot read,
and deleted-resource history requires an unscoped configured-backend
administrator token. JSON filter and aggregate paths must use non-empty
segments containing only ASCII letters, digits,
_, or$. - Hubuum v0.0.4 limits integer list/range filters to 1,024 unique expanded values. Callers must split larger requests rather than relying on server-side expansion.
- Custom-transport retry plans now share their immutable serialized request body across clones instead of copying the full payload for every attempt.
- Authenticated client and handle clones now share immutable bearer-token storage instead of duplicating the secret string on every clone.
- Async and blocking client clones now share their immutable HTTP runtime and configuration, avoiding repeated base-URL and option allocations when creating resource handles.
- Query-filter encoding now streams directly into the form serializer instead of cloning owned keys and values through two intermediate vectors.
- Raw JSON request bodies are serialized once when attached to the request instead of being materialized as a JSON value and serialized again at send time.
- Endpoint URL construction now borrows the normalized base URL instead of allocating an intermediate copy for every request.
- Collection-permission and group-membership methods now convert caller inputs
to
GroupIdorPrincipalIdbefore serializing route parameters, so into-only ID wrappers work and the typed conversion defines the wire value. PrincipalSettings::deserializenow decodes directly from the borrowed JSON document, avoiding a deep clone and permitting borrowed typed views.- Date-time display, serialization, deserialization, and backup compatibility
formatting avoid intermediate
Stringallocations on their common successful paths while preserving the existing wire and query representations. - The integration-test wrapper now defaults to the immutable target server
image declared in
Cargo.toml; the floatingmainimage remains an explicit forward-compatibility override.
- Principal-token creation now decodes Hubuum v0.0.4's JSON login response before returning the one-time bearer secret. Previously, the serialized JSON document itself was returned and could not be used for authentication.
- Principal-token expiry now serializes in the naive UTC request shape accepted
by the server, allowing
NewTokenRequest::expires_at(...)tokens to be created and expire as configured. - Reject task idempotency keys longer than the v0.0.4 server limit of 255 bytes before transport in both client modes.
- Validate export-scope identifier requirements and reject nonpositive class or object IDs before submission.
- Reject transport-controlled remote-target template and API-key headers such
as
Host,Content-Length,Connection,Proxy-Authorization, andTransfer-Encodingbefore create or update requests are sent. - Model object-data patch documents as a bounded newtype that rejects more than the server's 1,000-operation limit during construction, deserialization, or mutation.
- Reject empty principal-token scope sets before sending a request, preserving the explicit distinction between unscoped tokens and invalid scoped-token requests for user and service-account handles.
- Validate object-aggregate JSON paths through a dedicated newtype, rejecting empty paths and invalid segments before either client transport is reached.
- Typed response decoding now rejects trailing non-whitespace data after a valid JSON value instead of silently accepting and ignoring it.
- Export responses recognize known HTTP media types case-insensitively, so
mixed-case
Content-Typeheaders are decoded through the same async and blocking paths as their lowercase equivalents. - Absolute
Retry-Afterdates that have already elapsed now request an immediate retry instead of falling back to a randomized exponential delay. - The authenticated caller's group and token list helpers now follow cursor pagination instead of returning only the server's first page.
- Resource-handle list helpers now follow cursor pagination through every page instead of silently returning only the server's first page.
- Unified-search streams now apply
max_response_body_bytesto each buffered SSE event across async and blocking clients, preventing an unterminated or oversized event from growing client memory without bound. - Unified-search SSE decoding is now consistent across the public parser and
async and blocking streams: unnamed events use the standard
messagetype, one optional leading value space is removed without stripping significant whitespace, comment and empty frames are ignored, an initial byte-order mark is accepted, and incomplete events at end-of-stream are discarded. - Dynamic endpoint parameters are encoded centrally as opaque URL path
segments, preventing delimiters in low-level
UrlParamsor resource identifiers from altering the request target. - Successful JSON and text responses now reject invalid UTF-8 instead of silently replacing malformed bytes before parsing or returning the body.
- Invalid
ApiResourcederives now emit span-aware compiler diagnostics for unsupported names, item shapes, field layouts, and missing display fields instead of panicking inside the procedural macro. - Lazy
pages()anditems()traversal now honors the configured automatic pagination page and item limits, matching eagerall()collection. - Computed-field definitions with operation or result-type variants introduced
by a newer server now decode as
Unknowninstead of failing the entire response. - Typed pagination builders reject page sizes outside the Hubuum server
contract's
1..=250range before sending a request. - Empty or whitespace-only idempotency keys are rejected before task submissions or raw requests reach the transport.
- Remote-target invocation parameters and body overrides are rejected before submission unless they are JSON objects, matching the server contract.
- Configured custom transports now handle every client operation, including authentication, public discovery and probes, export downloads, and unified search streams, so credentials and network traffic cannot bypass the caller's transport boundary through the built-in HTTP client.
- Built-in async and blocking HTTP clients no longer follow redirects, keeping authenticated requests at the endpoint validated and constructed by the client.
- Transport failures now redact request query values from
ApiErrordisplay and debug output, and detailed HTTP response errors omit server-provided messages from default diagnostics. JSON, model-decoding, and exhausted-retry details also require explicit inspection instead of appearing in default error output or source chains. Unsuccessful high-level backup and export runners avoid copying server-provided task summaries into their errors, and event-delivery diagnostics redact internal claim tokens and sink error details. Event sink configuration, subscription routing, and remote-call failure diagnostics are redacted as well. Password request bodies, raw transport responses and cursors, and rendered or JSON export payloads are also omitted from default diagnostics. Import schemas and object data, task summaries and links, task events, and import-result details are likewise excluded. Explicit response, error, task, import, export, and delivery APIs continue to expose the original details when callers intentionally inspect them.
- This release explicitly targets Hubuum server v0.0.3 and retains its pinned OpenAPI contract and immutable tested server image.
- Blocking export readers and unified-search streams retain their existing
Send + Synccontract.
ObjectPost::collection_idandObjectPost::hubuum_class_idare now optional so class-scoped and natural-key object creation can let the server infer both values from the request path. Existing struct literals must wrap explicit IDs inSome(...); class-scoped creation can instead omit both fields.
- Exact class- and object-name scopes, including numeric-looking names, cover CRUD, permissions, related resources, relations, and graph operations for async and blocking clients.
- Permission-aware object aggregates support ordered typed dimensions, aggregate sorting, computed-field filters, cursor pagination, total counts, and both class-ID and exact-name routes.
- Atomic object-data updates use typed RFC 6902 documents across numeric,
exact-name, and object-handle APIs with the required
application/json-patch+jsonmedia type. - Public client configuration exposes the server's default and maximum pagination limits without authentication.
- Object list builders can filter and sort through typed shared or personal computed-field selectors.
Page<T>now includespage_limit, exposing the effective server-applied limit from theX-Page-Limitresponse header. This is additive becausePage<T>is non-exhaustive.
- This release explicitly targets Hubuum server v0.0.3 and pins its 196-operation
OpenAPI contract plus immutable multi-platform server image
sha256:f1f57a991f69005ee81f24e77533e61f75b5586949d98cccf1c40fc4329eb186. - Event list builders now expose the server's
include_totalcontrol. - Rust dependencies are refreshed to their latest releases, including
syn3 andhttpmock0.8.3, the workspace MSRV is raised to Rust 1.88, and the pinned OpenLDAP integration fixture now tracks its current image.
- Unauthenticated async and blocking Prometheus metrics retrieval through
metrics()for the server default andmetrics_at(path)for the path exposed by the read-only administrative configuration.
- This release explicitly targets Hubuum server v0.0.2 and adds live coverage for its runtime-configurable metrics route, which is intentionally outside the server's OpenAPI document.
- A compatibility history records the server target and immutable integration image used for each reproducibly tested client release.
- Typed backup submission, task inspection, output retrieval, and high-level backup runners for async and blocking clients.
- Typed destructive-restore staging, confirmation, and capability-only status inspection, with secret-bearing values redacted from debug output.
- Shared and personal computed-field definition, preview, update, deletion, rebuild, and computed-object read APIs.
- This release explicitly targets Hubuum server v0.0.2. Required CI and the
full library and consumer integration suites use the final v0.0.2 image at
sha256:8f543383b422124546c8d337fd557e1b182b1b6c7078d7870d3c5cd4f955ef1f. - The pinned OpenAPI contract now tracks the final server v0.0.2 release while
scheduled drift and integration jobs continue checking the server's
mainbranch for forward compatibility. - Administrative configuration models now cover the backup, restore, permissions, task lease/recovery, and computed reindex settings introduced by server v0.0.2.
RemoteCallResult::target_idnow usesOption<RemoteTargetId>instead ofOption<i32>. Intentionally polymorphic identifiers such as event entities and invocation subjects remain raw integers.
- Administrative effective-configuration retrieval through
admin_config(), with typed redacted configuration models for async and blocking clients. include_total(bool)controls on resource, cursor, history, and task list builders for opting into or out of exact pagination counts.- Fluent ID arguments accept borrowed typed IDs in addition to owned IDs and raw integers, avoiding unnecessary copies or explicit conversions in generic consumer code.
- Internal and end-to-end test helpers carry resource-specific ID types through workflows and unwrap them only at genuinely untyped wire boundaries.
- CI uses the Node 24-compatible RustSec audit action.
- Default features now enable only the async client. Blocking consumers must
enable the
blockingfeature explicitly. logout()consumes the authenticated client and returns an unauthenticated client, preventing reuse of a session after its token is revoked.- Task, principal, token, history, permission, event-delivery, import-result, remote-call, and subscription identifiers now use dedicated ID newtypes.
UnifiedSearchRequest::stream()now returns a lazy SSE stream or blocking iterator. Usecollect_stream()when a collectedVecis required.- Task wait timeouts now return structured
ApiError::TaskTimeoutvalues. - Core response models and extensible enums are non-exhaustive. Unknown server enum and SSE event values are preserved instead of failing deserialization.
- Unauthenticated provider discovery through
auth_providers()for building login selectors and CLI prompts before credentials are collected. - Provider-scoped credentials through
Credentials::scoped()andin_scope(), plus scope-aware identity queries and import group keys. - Identity-provider metadata on users, groups, service accounts, and group members, including helpers for detecting local and provider-managed records.
- Object-only principal settings with fluent current-principal and cross-principal get, replace, merge-patch, and reset operations for both async and blocking clients.
- True streaming for unified search, cursor pages/items, and export downloads.
- Compile-time required-field builders through
create_checked();create_raw()remains the explicit request-struct escape hatch. - Typed object payloads through
TypedObject<T>andtyped_class::<T>(), plus optional JSON Schema generation with thetyped-schemasfeature. - Collection-scoped navigation for classes, export templates, remote targets, events, history, and subscriptions.
- Configurable replay-safe retries with jitter,
Retry-Aftersupport, and idempotency-key protection for mutating requests. - Independent normal and error response-size limits, bounded body readers, and streaming download-to-writer/path helpers.
- Transport-neutral
RequestPlan, custom async/blocking transport traits,MockTransport, and authenticated relativeraw()requests for new routes. - High-level import runners that submit work, wait for terminal task state, reject unsuccessful tasks, and collect all result rows.
- A normalized OpenAPI operation snapshot covering 158 operations, executable endpoint coverage checks, documented upstream gaps, and scheduled drift CI.
- Strict formatting, clippy, docs, feature-matrix, MSRV, supply-chain, SemVer, pinned-server, and latest-server compatibility checks.
Page<T>now preserves the OpenAPI-documentedX-Total-Countresponse header and provides slice access pluslen(),is_empty(),has_next(),iter(), andinto_items()helpers.- Event, history, and task list builders now support automatic cursor pagination
through
all(). ApiErroraccessors expose HTTP status, request context, raw response bodies, API messages, and the standard structured Hubuum error payload.- Clients can be constructed directly from URL strings with
from_url()andbuilder_from_url(), and exposebase_url(),http_client(), andtoken()accessors.BaseUrl::new()provides direct validated parsing. - Resource queries expose
set_raw_param(), while cursor and graph requests exposeset_query_param(), for replacing scalar raw options. The correspondingraw_param()andquery_param()methods remain append-oriented for repeated keys.
- Raw requests cannot escape the configured origin or path prefix through network-path references, backslashes, or encoded dot segments before bearer authentication is attached.
- High-level import runners return a structured error for failed or cancelled terminal tasks instead of fetching result rows from unsuccessful work.
- Transport response diagnostics redact header values and bodies, and HTTP error diagnostics redact query values.
- Secret-bearing authentication and remote-target values use zeroizing secret storage and redact diagnostics. Request/response bodies and query values are no longer emitted through debug formatting or logs.
- Login-with-token preserves structured server failures instead of collapsing them into an invalid-token marker, and login borrows the unauthenticated client.
- Deserialization failures include the precise JSON field path.
- Custom transports now honor retry and response-size policies, matching the reqwest-backed transport behavior.
- Automatic pagination now returns
ApiError::PaginationCyclewhen a server repeats a cursor instead of requesting the same page forever. - Blocking login and sync/async health probes now preserve API error status, message, URL, and response body consistently with authenticated requests.
- Client debug logging no longer emits serialized request or response bodies,
and authentication and remote-target secrets are redacted from
Debugoutput. - Fluent scalar options now replace earlier values instead of generating duplicate limit, cursor, sort, event, task, search, or rate-limit query keys.
- Panicking client constructors, unchecked fluent
create(),get_token(), graphfetch(), and searchexecute()are deprecated in favor of fallible, explicit alternatives. ApiResourceis sealed and public imports are organized throughpreludeandmodelmodules.- Workspace packages declare Rust 1.86 as their minimum supported version.
- Nested resource, event, history, template, and remote-target helpers now use
the corresponding typed resource IDs while continuing to accept
i32values. - Simplified the derive macro by sharing identical generated fluent methods across blocking and async implementations.
- Docker-backed integration coverage now uses verified LDAPS to exercise scoped provider discovery and login, synchronized identities and groups, and external user settings through both async and blocking clients.
- Public resource terminology now follows the backend rename from namespaces to
collections.
Namespace*,namespaces(),namespace_id, and/api/v1/namespacesclient surfaces are replaced byCollection*,collections(),collection_id, and/api/v1/collections. - Public report terminology now follows the backend rename to exports:
Report*,reports(), and/api/v1/reportsare replaced byExport*,exports(), and/api/v1/exports; template routes move from/api/v1/templatesto/api/v1/export-templates. - Report task surfaces are now export task surfaces:
TaskKind::Report,links.report,links.report_output, anddetails.reportare replaced byTaskKind::Export,links.export,links.export_output, anddetails.export. - Resource collections can now be queried directly with calls like
client.classes().name().contains("server").list();query()remains available as a compatibility escape hatch but is no longer the documented primary path. - Resource primary IDs are now strongly typed (
ClassId,ObjectId,GroupId, etc.) and genericget,update, anddeleteoperations require values that convert into the correct resource ID type. - Graph and unified search request builders now use
.send()as the primary terminal method; older.fetch()/.execute()names are compatibility aliases.
- Collection hierarchy support: create collections with an optional
parent_collection_id, listchildren()andancestors(), and move a collection withmove_parent(...). - Effective collection permission helpers for inherited group and principal permissions.
- Path-aware collection import keys and collection-aware search, remote target, export template, event, and history types.
- Cursor-backed resource and request builders support
.all()to collect all pages, andPage<T>can be iterated directly. - Handles dereference and
AsRefto the wrapped resource and supportinto_inner(). - HTTP API errors include method, URL, status, parsed message, and raw response body for easier diagnostics.
- Compile-fail coverage for typed query operators and wrong-resource ID usage.
- Dedicated export-template execution helpers:
client.export_templates().submit_export(template_id, request)and.run_export(template_id, request)target/api/v1/export-templates/{template_id}/exports.
- Docker-backed e2e coverage now exercises the renamed export/export-template routes and verifies rendered template output metadata from export task details.
- The README is now a shorter introduction, with detailed client setup,
querying, export/import/task, and integration-test guides split into
docs/. - Refreshed the workspace lockfile to current compatible dependency releases.
- The async client is now exported as
hubuum_client::Client; the blocking client is exported ashubuum_client::blocking::Client. - Resource lookup APIs now use
get(id)andget_by_name(name); the legacyselect*names were removed. - Query builders now expose
query().list(),query().one(), typed field handles, and explicit raw escape hatches instead of the oldfind(),execute*(),FilterBuilder, and generatedfield_eq/field_containsshortcuts.
- Client builders for async and blocking clients with certificate validation, timeout, and user-agent controls.
- Typed query field handles such as
.name().contains(...),.created_at().gte(...), and.json_schema().path([...]).lt(...), with raw query escape hatches. - Generated resource endpoint metadata used by the new
get(id)path. - Real
asyncandblockingCargo features. Defaults still enable both clients, while feature-specific builds expose only the selected client surface.
HubuumDateTimenow formats as RFC3339 for typed query filters while still accepting both RFC3339 and naive UTC timestamp input during deserialization.
Client::reports().run(...)is now an asynchronous, task-based operation. It returns aReportRunOpbuilder whose.send()submits the report, polls the task to a terminal status, and fetches the output. The previous synchronousrun()that returned aReportResultdirectly has been removed, matching the backend's move toPOST /api/v1/reports→202 TaskResponse.
Client::reports().submit(...),.get(task_id), and.output(task_id)low-level helpers mirroring the imports API, plusReportRunOppoll-interval/timeout controls.Client::tasks().wait(task_id)poll-to-terminal helper andClient::tasks().query()cursor-paginated task listing (kind,status,submitted_byfilters).- Login rate-limit admin meta endpoints:
meta_login_rate_limit(),meta_login_rate_limit_release(id), andmeta_login_rate_limit_clear(). - Class relation template aliases (
forward_template_alias/reverse_template_alias) viacreate_relation_with_aliases(...). - Report request
includeandrelation_contextfields,ReportWarning.path, andreport/report_outputtask links plusReportTaskDetailson task responses. - Typed audit event support for
/api/v1/iam/users/{user_id}/eventsand/api/v1/iam/groups/{group_id}/eventsviauser_events(user_id)andgroup_events(group_id)on both sync and async clients. - Global audit event
entity_typeandentity_idfilters onEventListRequest.
- Tightened dependency floors and added
tokio(timefeature) as a runtime dependency for the async poll helpers.
- Redesigned relationship helpers around the new relation endpoint layout:
Class::related_classes()now targets/api/v1/classes/{class_id}/related/classes- added
Class::related_relations()for/api/v1/classes/{class_id}/related/relations - added
Class::related_graph()for/api/v1/classes/{class_id}/related/graph Object::related_objects()now targets/api/v1/classes/{class_id}/objects/{object_id}/related/objects- added
Object::related_relations()for/related/relations - added
Object::related_graph()for/related/graph
- Cursor-backed relationship requests now support query filters in addition to sorting, limits, and cursors, so connected-class, class-related-relation, related-object, and related-relation listings can all use the shared DB query interface.
Client::search(...)is now the typed unified search builder for/api/v1/searchand/api/v1/search/stream.
- Typed unified search models and SSE event parsing for grouped
/api/v1/searchresponses. - Endpoint-specific
ignore_classes(...)andignore_self_class(...)helpers for related-object listings and graph requests.
- The public
blocking::Client::search/Client::searchlow-level resource helper has been replaced by the unified search builder. Resource querying continues through resource handles likeclient.classes().query(). Class::transitive_relations()andClass::transitive_relations_to(...)were removed. Class traversal now mirrors object traversal throughrelated_classes(),related_relations(), andrelated_graph().- Relationship examples and fluent filters should use the new API query aliases such as
from_classes,to_classes,from_objects,to_objects, andclass_relationinstead of the older storage-shaped field names.
- Initial crates.io release for
hubuum_clientand itshubuum_client_derivesupport crate. - Synchronous and asynchronous Hubuum API clients with typed resource handles and filters.
- Support for reports, report templates, imports, task polling helpers, and Docker-backed integration tests.
- GitHub Actions release automation for crates.io trusted publishing, with release metadata checks.