edc_dataplane_proxy/service/
refresh.rs1use edc_dataplane_core::core::{
2 db::transfer::TransferRepoRef,
3 model::transfer::{Transfer, TransferStatus},
4};
5use thiserror::Error;
6use uuid::Uuid;
7
8use crate::model::{
9 edr::{EdrClaims, EdrEntry, RefreshTokenId, TokenId},
10 token::{TokenRequest, TokenResponse},
11};
12
13use super::{
14 edr::{EdrError, EdrManager},
15 token::{TokenError, TokenManager},
16};
17
18#[derive(Clone)]
19pub struct RefreshManager<T: TokenManager> {
20 pub(crate) edrs: EdrManager<T>,
21 store: TransferRepoRef,
22}
23
24impl<T: TokenManager> RefreshManager<T> {
25 pub fn new(edrs: EdrManager<T>, store: TransferRepoRef) -> Self {
26 Self { edrs, store }
27 }
28
29 async fn get_transfer(&self, id: &str) -> Result<Transfer, RefreshError> {
30 self.store
31 .fetch_by_id(id)
32 .await?
33 .filter(|t| t.status == TransferStatus::Started)
34 .ok_or_else(|| {
35 RefreshError::Generic(anyhow::anyhow!("Transfer not found or not valid"))
36 })
37 }
38
39 async fn get_edr_entry(&self, claims: &EdrClaims) -> Result<EdrEntry, RefreshError> {
40 self.edrs
41 .get_by_transfer_id(&claims.transfer_id)
42 .await?
43 .filter(|t| t.refresh_token_id == claims.jti.into())
44 .ok_or_else(|| {
45 RefreshError::Generic(anyhow::anyhow!("Transfer not found or not valid"))
46 })
47 }
48
49 pub async fn refresh_token(&self, req: TokenRequest) -> Result<TokenResponse, RefreshError> {
50 let claims = self.edrs.tokens.validate::<EdrClaims>(&req.refresh_token)?;
51
52 let _transfer = self.get_transfer(&claims.claims.transfer_id).await?;
53
54 let mut edr_entry = self.get_edr_entry(&claims.claims).await?;
55
56 let token_id: TokenId = Uuid::new_v4().into();
57 let refresh_token_id: RefreshTokenId = Uuid::new_v4().into();
58
59 let token_response = self
60 .edrs
61 .issue_token(
62 token_id,
63 refresh_token_id,
64 &claims.claims.sub,
65 &claims.claims.transfer_id,
66 )
67 .map(Ok)?;
68
69 edr_entry.refresh_token_id = refresh_token_id;
70 edr_entry.token_id = token_id;
71
72 self.edrs.save(edr_entry).await?;
73
74 token_response
75 }
76}
77
78#[derive(Debug, Error)]
79pub enum RefreshError {
80 #[error(transparent)]
81 Token(#[from] TokenError),
82 #[error(transparent)]
83 Edr(#[from] EdrError),
84 #[error(transparent)]
85 Generic(#[from] anyhow::Error),
86}