Skip to content

Commit c166f89

Browse files
0xPoeTurbo87
authored andcommitted
fix: do not send email for expired token
1 parent 09df08f commit c166f89

File tree

2 files changed

+29
-7
lines changed

2 files changed

+29
-7
lines changed

src/models/token.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,12 @@ impl ApiToken {
110110
.filter(
111111
api_tokens::expired_at
112112
.is_not_null()
113-
.and(api_tokens::expired_at.lt(now.nullable() + days_until_expiry.days())),
113+
.and(api_tokens::expired_at.assume_not_null().gt(now)) // Ignore already expired tokens
114+
.and(
115+
api_tokens::expired_at
116+
.assume_not_null()
117+
.lt(now + days_until_expiry.days()),
118+
),
114119
)
115120
.filter(api_tokens::expiry_notification_at.is_null())
116121
.select(ApiToken::as_select())

src/worker/jobs/expiry_notification.rs

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use crate::models::ApiToken;
2+
use crate::schema::api_tokens;
23
use crate::{email::Email, models::User, worker::Environment, Emails};
34
use anyhow::anyhow;
45
use chrono::SecondsFormat;
@@ -57,10 +58,7 @@ fn check(emails: &Emails, conn: &mut PgConnection) -> anyhow::Result<()> {
5758
Ok(_) => {
5859
// Update the token to prevent duplicate notifications.
5960
diesel::update(token)
60-
.set(
61-
crate::schema::api_tokens::expiry_notification_at
62-
.eq(now.nullable()),
63-
)
61+
.set(api_tokens::expiry_notification_at.eq(now.nullable()))
6462
.execute(conn)?;
6563
}
6664
Err(e) => {
@@ -110,6 +108,7 @@ mod tests {
110108
models::token::ApiToken, schema::api_tokens, test_util::test_db_connection,
111109
util::token::PlainToken,
112110
};
111+
use diesel::dsl::IntervalDsl;
113112
use diesel::{QueryDsl, SelectableHelper};
114113
use lettre::Address;
115114

@@ -125,14 +124,13 @@ mod tests {
125124
&mut conn,
126125
)?;
127126
let token = PlainToken::generate();
128-
let expired_at = diesel::dsl::now;
129127

130128
let token: ApiToken = diesel::insert_into(api_tokens::table)
131129
.values((
132130
api_tokens::user_id.eq(user.id),
133131
api_tokens::name.eq("test_token"),
134132
api_tokens::token.eq(token.hashed()),
135-
api_tokens::expired_at.eq(expired_at),
133+
api_tokens::expired_at.eq(now.nullable() + (EXPIRY_THRESHOLD - 1).day()),
136134
))
137135
.returning(ApiToken::as_returning())
138136
.get_result(&mut conn)?;
@@ -152,6 +150,25 @@ mod tests {
152150
.first::<ApiToken>(&mut conn)?;
153151
assert!(update_token.expiry_notification_at.is_some());
154152

153+
// Insert a already expired token.
154+
let token = PlainToken::generate();
155+
diesel::insert_into(api_tokens::table)
156+
.values((
157+
api_tokens::user_id.eq(user.id),
158+
api_tokens::name.eq("expired_token"),
159+
api_tokens::token.eq(token.hashed()),
160+
api_tokens::expired_at.eq(diesel::dsl::now.nullable() - 1.day()),
161+
))
162+
.returning(ApiToken::as_returning())
163+
.get_result(&mut conn)?;
164+
165+
// Check that the token is not about to expire.
166+
check(&emails, &mut conn)?;
167+
168+
// Check that no email was sent.
169+
let sent_mail = emails.mails_in_memory().unwrap();
170+
assert_eq!(sent_mail.len(), 1);
171+
155172
Ok(())
156173
}
157174
}

0 commit comments

Comments
 (0)