Skip to content

Commit cf77767

Browse files
fix: update expiry date in db
1 parent e1cc7c8 commit cf77767

File tree

4 files changed

+51
-24
lines changed

4 files changed

+51
-24
lines changed

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "wildlive-token-refresher"
3-
version = "0.2.0"
3+
version = "0.2.1"
44
edition = "2024"
55
publish = false
66
authors = [

src/database.rs

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use std::time::Duration;
22

33
use anyhow::Result;
44
use indoc::indoc;
5+
use time::OffsetDateTime;
56
use tokio_postgres::{Client, NoTls};
67
use tracing::error;
78
use uuid::Uuid;
@@ -32,7 +33,7 @@ impl Database {
3233
pub async fn get_refresh_tokens(
3334
&self,
3435
comparison_duration: Duration,
35-
) -> Result<Vec<IdTokenPair>> {
36+
) -> Result<Vec<ConnectorRefreshToken>> {
3637
let now = time::OffsetDateTime::now_utc();
3738
let comparison_duration = time::Duration::try_from(comparison_duration)?;
3839
let now_plus_duration = now.saturating_add(comparison_duration);
@@ -43,7 +44,8 @@ impl Database {
4344
indoc! {"
4445
SELECT
4546
id,
46-
(((definition).wildlive_data_connector_definition).auth).refresh_token AS refresh_token
47+
(((definition).wildlive_data_connector_definition).auth).refresh_token AS refresh_token,
48+
(((definition).wildlive_data_connector_definition).auth).expiry_date AS expiry_date
4749
FROM
4850
layer_providers
4951
WHERE
@@ -62,9 +64,10 @@ impl Database {
6264
results
6365
.iter()
6466
.map(|row| {
65-
Ok(IdTokenPair {
67+
Ok(ConnectorRefreshToken {
6668
id: row.try_get("id")?,
6769
refresh_token: row.try_get("refresh_token")?,
70+
expiry_date: row.try_get::<_, time::OffsetDateTime>("expiry_date")?,
6871
})
6972
})
7073
.collect()
@@ -73,27 +76,33 @@ impl Database {
7376
// TODO: bulk insert multiple tokens at once
7477
pub async fn update_refresh_token(
7578
&self,
76-
IdTokenPair { id, refresh_token }: IdTokenPair,
79+
ConnectorRefreshToken {
80+
id,
81+
refresh_token,
82+
expiry_date,
83+
}: ConnectorRefreshToken,
7784
) -> Result<()> {
7885
self.client
7986
.execute(
8087
indoc! {"
8188
UPDATE
8289
layer_providers
8390
SET
84-
definition.wildlive_data_connector_definition.auth.refresh_token = $2
91+
definition.wildlive_data_connector_definition.auth.refresh_token = $2,
92+
definition.wildlive_data_connector_definition.auth.expiry_date = $3
8593
WHERE
8694
id = $1
8795
"},
88-
&[&id, &refresh_token],
96+
&[&id, &refresh_token, &expiry_date],
8997
)
9098
.await?;
9199
Ok(())
92100
}
93101
}
94102

95103
#[derive(Debug)]
96-
pub struct IdTokenPair {
104+
pub struct ConnectorRefreshToken {
97105
pub id: Uuid,
98106
pub refresh_token: String,
107+
pub expiry_date: OffsetDateTime,
99108
}

src/main.rs

Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::{
22
config::CONFIG,
3-
database::{Database, IdTokenPair},
3+
database::{ConnectorRefreshToken, Database},
44
oidc::{retrieve_access_and_refresh_token, retrieve_jwks},
55
};
66
use anyhow::{Context, Result};
@@ -166,12 +166,21 @@ async fn refresh_tokens(refresh_interval: Duration) -> Result<()> {
166166

167167
let mut num_updated = 0;
168168

169-
for IdTokenPair { id, refresh_token } in database.get_refresh_tokens(refresh_interval).await? {
169+
for ConnectorRefreshToken {
170+
id,
171+
refresh_token,
172+
expiry_date,
173+
} in database.get_refresh_tokens(refresh_interval).await?
174+
{
170175
match refresh_tokens_for_provider(
171176
&database,
172177
&http_client,
173178
jwks.clone(),
174-
IdTokenPair { id, refresh_token },
179+
ConnectorRefreshToken {
180+
id,
181+
refresh_token,
182+
expiry_date,
183+
},
175184
)
176185
.await
177186
{
@@ -194,20 +203,29 @@ async fn refresh_tokens_for_provider(
194203
database: &Database,
195204
http_client: &reqwest::Client,
196205
jwks: JsonWebKeySet<CoreJsonWebKey>,
197-
IdTokenPair { id, refresh_token }: IdTokenPair,
206+
ConnectorRefreshToken {
207+
id,
208+
refresh_token,
209+
expiry_date: _,
210+
}: ConnectorRefreshToken,
198211
) -> Result<()> {
199-
let new_pair = IdTokenPair {
212+
let token_response = retrieve_access_and_refresh_token(
213+
http_client,
214+
&CONFIG.oidc,
215+
jwks.clone(),
216+
&RefreshToken::new(refresh_token),
217+
)
218+
.await?;
219+
220+
let now = time::OffsetDateTime::now_utc();
221+
let expiry_duration = time::Duration::seconds(token_response.expires_in as i64);
222+
let expiry_date = now.saturating_add(expiry_duration);
223+
224+
let connector_refresh_token = ConnectorRefreshToken {
200225
id,
201-
refresh_token: retrieve_access_and_refresh_token(
202-
http_client,
203-
&CONFIG.oidc,
204-
jwks.clone(),
205-
&RefreshToken::new(refresh_token),
206-
)
207-
.await?
208-
.refresh_token
209-
.into_secret(),
226+
refresh_token: token_response.refresh_token.into_secret(),
227+
expiry_date,
210228
};
211229

212-
database.update_refresh_token(new_pair).await
230+
database.update_refresh_token(connector_refresh_token).await
213231
}

0 commit comments

Comments
 (0)