/
token.rs
61 lines (54 loc) · 1.87 KB
/
token.rs
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
use async_session::{MemoryStore, SessionStore};
use axum::{
extract::{Path, State},
response::IntoResponse,
Json, TypedHeader,
};
use volts_core::{ApiTokenList, NewTokenPayload};
use crate::{
db::{find_user, insert_token, list_tokens, revoke_token, DbPool},
router::authenticated_user,
state::SESSION_COOKIE_NAME,
};
pub async fn list(
State(store): State<MemoryStore>,
State(db_pool): State<DbPool>,
TypedHeader(cookies): TypedHeader<headers::Cookie>,
) -> impl IntoResponse {
let cookie = cookies.get(SESSION_COOKIE_NAME).unwrap();
let session = store
.load_session(cookie.to_string())
.await
.unwrap()
.unwrap();
let user_id: i32 = session.get("user_id").unwrap();
let mut conn = db_pool.read.get().await.unwrap();
let user = find_user(&mut conn, user_id).await.unwrap();
let tokens = list_tokens(&mut conn, &user).await.unwrap();
Json(ApiTokenList { api_tokens: tokens })
}
pub async fn new(
State(store): State<MemoryStore>,
State(db_pool): State<DbPool>,
TypedHeader(cookies): TypedHeader<headers::Cookie>,
Json(payload): Json<NewTokenPayload>,
) -> impl IntoResponse {
let user = authenticated_user(State(store), State(db_pool.clone()), TypedHeader(cookies))
.await
.unwrap();
let mut conn = db_pool.write.get().await.unwrap();
let token = insert_token(&mut conn, &user, &payload.name).await.unwrap();
Json(token)
}
pub async fn revoke(
State(store): State<MemoryStore>,
State(db_pool): State<DbPool>,
TypedHeader(cookies): TypedHeader<headers::Cookie>,
Path(id): Path<i32>,
) -> impl IntoResponse {
let user = authenticated_user(State(store), State(db_pool.clone()), TypedHeader(cookies))
.await
.unwrap();
let mut conn = db_pool.write.get().await.unwrap();
revoke_token(&mut conn, &user, id).await.unwrap();
}