pub struct IntegrationsModule {
pub integrations_write_service: Arc<IntegrationsWriteService>,
pub integrations_oauth: Option<Arc<IntegrationsOauthService>>,
/* private fields */
}Expand description
Integrations module configuration
Use the builder pattern to configure and register this module:
let integrations = IntegrationsModule::builder()
.with_database(pool.clone())
.build()?;
// Unguarded full CRUD (trusted/admin); compose a guarded router for production.
let router = integrations.all_crud_routes();Fields§
§integrations_write_service: Arc<IntegrationsWriteService>The hand-authored receive/retry/map path. The module’s reason for existing — without this field it’s unreachable through the public API (CLAUDE.md: “MUST register every service in the {Domain}Module builder”).
integrations_oauth: Option<Arc<IntegrationsOauthService>>The one OAuth generation service. Option because composition opts in
(with_oauth + the two ports); oauth_routes() is empty without it.
Implementations§
Source§impl IntegrationsModule
impl IntegrationsModule
Sourcepub fn builder() -> IntegrationsModuleBuilder
pub fn builder() -> IntegrationsModuleBuilder
Create a new module builder
Sourcepub fn all_crud_routes(&self) -> Router
pub fn all_crud_routes(&self) -> Router
Mount ALL generated CRUD endpoints (12 per entity) with NO domain validation — the fully unguarded surface. A well-formed request can create invalid rows or soft-delete a referenced master out from under its dependents. Prefer a guarded composition (read + validated writes) for any real deployment; use this only in trusted/admin/seeding contexts.
Sourcepub fn routes(&self) -> Router
👎Deprecated: mounts unvalidated generic CRUD; prefer readonly_routes() + validated writes, or all_crud_routes() for the full/unguarded surface
pub fn routes(&self) -> Router
mounts unvalidated generic CRUD; prefer readonly_routes() + validated writes, or all_crud_routes() for the full/unguarded surface
Deprecated alias for Self::all_crud_routes. routes() reads like
“the routes” but mounts UNVALIDATED generic CRUD on every entity — a naive
mount exposes unguarded writes. Compose a guarded router (read + validated
writes) for production, or call all_crud_routes() to opt into the full
unguarded surface explicitly.
Sourcepub fn readonly_routes(&self) -> Router
pub fn readonly_routes(&self) -> Router
Read-only routes for every entity (GET endpoints only) — the safe base.
Generic mutation can’t reach here, so this surface cannot bypass a validated write service’s invariants. Use this as the production base and merge validated write routes (or a write service’s HTTP layer) onto it.
Sourcepub fn guarded_routes(&self) -> Router
pub fn guarded_routes(&self) -> Router
Production-safe router: connector admin CRUD + event READ-only.
Integration events are produced by the idempotent receive_event path, not
hand-mutated, so the generic event write/bulk endpoints are deliberately
excluded here — a caller cannot bypass the dedup/map state machine through
this surface. Mount this (or readonly_routes()) for production; reserve
all_crud_routes() for trusted/admin/seeding only.
Sourcepub fn oauth_routes(&self) -> Router
pub fn oauth_routes(&self) -> Router
The verb-shaped OAuth surface (authorize / callback / complete /
disconnect / status). Empty when the module was built without
with_oauth — mounting it anyway is safe, it contributes no routes.
Auto Trait Implementations§
impl !RefUnwindSafe for IntegrationsModule
impl !UnwindSafe for IntegrationsModule
impl Freeze for IntegrationsModule
impl Send for IntegrationsModule
impl Sync for IntegrationsModule
impl Unpin for IntegrationsModule
impl UnsafeUnpin for IntegrationsModule
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more