1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
use async_trait::async_trait;
use serde::Serialize;
use thiserror::Error;
use crate::user_management::{SessionId, UserManagement};
use crate::{ResponseExt, WorkOsError, WorkOsResult};
/// The parameters for [`RevokeSession`].
#[derive(Debug, Serialize)]
pub struct RevokeSessionParams<'a> {
/// The ID of the session.
pub session_id: &'a SessionId,
}
/// An error returned from [`RevokeSession`].
#[derive(Debug, Error)]
pub enum RevokeSessionError {}
impl From<RevokeSessionError> for WorkOsError<RevokeSessionError> {
fn from(err: RevokeSessionError) -> Self {
Self::Operation(err)
}
}
/// [WorkOS Docs: Revoke session](https://workos.com/docs/reference/user-management/session/revoke)
#[async_trait]
pub trait RevokeSession {
/// Revoke a session.
///
/// [WorkOS Docs: Revoke session](https://workos.com/docs/reference/user-management/session/revoke)
///
/// # Examples
///
/// ```
/// # use workos::WorkOsResult;
/// # use workos::user_management::*;
/// use workos::{ApiKey, Metadata, WorkOs};
///
/// # async fn run() -> WorkOsResult<(), RevokeSessionError> {
/// let workos = WorkOs::new(&ApiKey::from("sk_example_123456789"));
///
/// workos
/// .user_management()
/// .revoke_session(&RevokeSessionParams {
/// session_id: &SessionId::from("session_01E4ZCR3C56J083X43JQXF3JK5"),
/// })
/// .await?;
/// # Ok(())
/// # }
/// ```
async fn revoke_session(
&self,
params: &RevokeSessionParams<'_>,
) -> WorkOsResult<(), RevokeSessionError>;
}
#[async_trait]
impl RevokeSession for UserManagement<'_> {
async fn revoke_session(
&self,
params: &RevokeSessionParams<'_>,
) -> WorkOsResult<(), RevokeSessionError> {
let url = self
.workos
.base_url()
.join("/user_management/sessions/revoke")?;
self.workos
.client()
.post(url)
.bearer_auth(self.workos.key())
.json(¶ms)
.send()
.await?
.handle_unauthorized_or_generic_error()
.await?;
Ok(())
}
}
#[cfg(test)]
mod test {
use matches::assert_matches;
use tokio;
use crate::{ApiKey, WorkOs};
use super::*;
#[tokio::test]
async fn it_calls_the_revoke_session_endpoint() {
let mut server = mockito::Server::new_async().await;
let workos = WorkOs::builder(&ApiKey::from("sk_example_123456789"))
.base_url(&server.url())
.unwrap()
.build();
server
.mock("POST", "/user_management/sessions/revoke")
.match_header("Authorization", "Bearer sk_example_123456789")
.match_body(r#"{"session_id":"session_01E4ZCR3C56J083X43JQXF3JK5"}"#)
.with_status(202)
.create_async()
.await;
let result = workos
.user_management()
.revoke_session(&RevokeSessionParams {
session_id: &SessionId::from("session_01E4ZCR3C56J083X43JQXF3JK5"),
})
.await;
assert_matches!(result, Ok(()));
}
}