edc_dataplane_proxy/service/
refresh.rs

1use 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}