Skip to main content

MutationContext

Struct MutationContext 

Source
pub struct MutationContext {
    pub auth: AuthContext,
    pub request: RequestMetadata,
    /* private fields */
}
Expand description

Context for mutation functions (transactional database access).

Fields§

§auth: AuthContext

Authentication context.

§request: RequestMetadata

Request metadata.

Implementations§

Source§

impl MutationContext

Source

pub fn new(db_pool: PgPool, auth: AuthContext, request: RequestMetadata) -> Self

Create a new mutation context.

Source

pub fn with_dispatch( db_pool: PgPool, auth: AuthContext, request: RequestMetadata, http_client: CircuitBreakerClient, job_dispatch: Option<Arc<dyn JobDispatch>>, workflow_dispatch: Option<Arc<dyn WorkflowDispatch>>, ) -> Self

Create a mutation context with dispatch capabilities.

Source

pub fn with_env( db_pool: PgPool, auth: AuthContext, request: RequestMetadata, http_client: CircuitBreakerClient, job_dispatch: Option<Arc<dyn JobDispatch>>, workflow_dispatch: Option<Arc<dyn WorkflowDispatch>>, env_provider: Arc<dyn EnvProvider>, ) -> Self

Create a mutation context with a custom environment provider.

Source

pub fn with_transaction( db_pool: PgPool, tx: Transaction<'static, Postgres>, auth: AuthContext, request: RequestMetadata, http_client: CircuitBreakerClient, job_info_lookup: JobInfoLookup, ) -> (Self, Arc<AsyncMutex<Transaction<'static, Postgres>>>, Arc<Mutex<OutboxBuffer>>)

Returns handles to transaction and outbox for the caller to commit/flush.

Source

pub fn is_transactional(&self) -> bool

Source

pub async fn conn(&self) -> Result<ForgeConn<'_>>

Acquire a connection compatible with sqlx compile-time checked macros.

In transactional mode, returns a guard over the active transaction. Otherwise acquires a fresh connection from the pool.

let mut conn = ctx.conn().await?;
sqlx::query_as!(User, "INSERT INTO users ... RETURNING *", ...)
    .fetch_one(&mut *conn)
    .await?
Source

pub fn pool(&self) -> &PgPool

Direct pool access for operations that cannot run inside a transaction.

Source

pub fn http(&self) -> HttpClient

Get the HTTP client for external requests.

Requests go through the circuit breaker automatically. When the handler declared an explicit timeout, that timeout is also applied to outbound HTTP requests unless the request overrides it.

Source

pub fn raw_http(&self) -> &Client

Get the raw reqwest client, bypassing circuit breaker execution.

Source

pub fn set_http_timeout(&mut self, timeout: Option<Duration>)

Set the default outbound HTTP request timeout for this context.

Source

pub fn require_user_id(&self) -> Result<Uuid>

Source

pub fn require_subject(&self) -> Result<&str>

Source

pub fn set_token_issuer(&mut self, issuer: Arc<dyn TokenIssuer>)

Set the token issuer for this context.

Source

pub fn set_token_ttl(&mut self, ttl: AuthTokenTtl)

Set the token TTL configuration (from forge.toml [auth]).

Source

pub fn issue_token(&self, claims: &Claims) -> Result<String>

Issue a signed JWT from the given claims.

Only available when HMAC auth is configured in forge.toml. Returns an error if auth is not configured or uses an external provider (RSA/JWKS).

let claims = Claims::builder()
    .user_id(user.id)
    .duration_secs(7 * 24 * 3600)
    .build()
    .map_err(|e| ForgeError::Internal(e))?;

let token = ctx.issue_token(&claims)?;
Source

pub async fn issue_token_pair( &self, user_id: Uuid, roles: &[&str], ) -> Result<TokenPair>

Issue an access + refresh token pair for the given user.

Stores the refresh token hash in forge_refresh_tokens and returns both tokens. Use rotate_refresh_token() to exchange a refresh token for a new pair, and revoke_refresh_token() to invalidate one.

TTLs come from [auth] in forge.toml:

  • access_token_ttl (default “1h”)
  • refresh_token_ttl (default “30d”)
Source

pub async fn rotate_refresh_token( &self, old_refresh_token: &str, ) -> Result<TokenPair>

Rotate a refresh token: validate the old one, issue a new pair.

The old token is atomically deleted and a new access + refresh pair is returned. Fails if the token is invalid or expired.

Source

pub async fn revoke_refresh_token(&self, refresh_token: &str) -> Result<()>

Revoke a specific refresh token (e.g., on logout).

Source

pub async fn revoke_all_refresh_tokens(&self, user_id: Uuid) -> Result<()>

Revoke all refresh tokens for a user (e.g., on password change or account deletion).

Source

pub async fn dispatch_job<T: Serialize>( &self, job_type: &str, args: T, ) -> Result<Uuid>

In transactional mode, buffers for atomic commit; otherwise dispatches immediately.

Source

pub async fn dispatch_job_with_context<T: Serialize>( &self, job_type: &str, args: T, context: Value, ) -> Result<Uuid>

Dispatch a job with initial context.

Source

pub async fn cancel_job( &self, job_id: Uuid, reason: Option<String>, ) -> Result<bool>

Request cancellation for a job.

Source

pub async fn start_workflow<T: Serialize>( &self, workflow_name: &str, input: T, ) -> Result<Uuid>

In transactional mode, buffers for atomic commit; otherwise starts immediately.

Trait Implementations§

Source§

impl EnvAccess for MutationContext

Source§

fn env_provider(&self) -> &dyn EnvProvider

Get the environment provider.
Source§

fn env(&self, key: &str) -> Option<String>

Get an environment variable. Read more
Source§

fn env_or(&self, key: &str, default: &str) -> String

Get an environment variable with a default value. Read more
Source§

fn env_require(&self, key: &str) -> Result<String>

Get a required environment variable. Read more
Source§

fn env_parse<T: FromStr>(&self, key: &str) -> Result<T>
where T::Err: Display,

Get an environment variable and parse it to the specified type. Read more
Source§

fn env_parse_or<T: FromStr>(&self, key: &str, default: T) -> Result<T>
where T::Err: Display,

Get an environment variable and parse it, with a default. Read more
Source§

fn env_contains(&self, key: &str) -> bool

Check if an environment variable is set.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more