Skip to content

Commit a52cea2

Browse files
committed
models/token: Inline ApiToken::insert_with_scopes() fn
1 parent 761116a commit a52cea2

File tree

5 files changed

+45
-57
lines changed

5 files changed

+45
-57
lines changed

src/controllers/token.rs

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use crate::app::AppState;
77
use crate::auth::AuthCheck;
88
use crate::models::token::{CrateScope, EndpointScope};
99
use crate::util::errors::{bad_request, AppResult};
10+
use crate::util::token::PlainToken;
1011
use axum::extract::{Path, Query};
1112
use axum::response::{IntoResponse, Response};
1213
use axum::Json;
@@ -148,15 +149,16 @@ pub async fn create_api_token(
148149

149150
let recipient = user.email(&mut conn).await?;
150151

151-
let api_token = ApiToken::insert_with_scopes(
152-
&mut conn,
153-
user.id,
154-
&new.api_token.name,
155-
crate_scopes,
156-
endpoint_scopes,
157-
new.api_token.expired_at,
158-
)
159-
.await?;
152+
let plaintext = PlainToken::generate();
153+
154+
let new_token = crate::models::token::NewApiToken::builder()
155+
.user_id(user.id)
156+
.name(&new.api_token.name)
157+
.token(plaintext.hashed())
158+
.maybe_crate_scopes(crate_scopes)
159+
.maybe_endpoint_scopes(endpoint_scopes)
160+
.maybe_expired_at(new.api_token.expired_at)
161+
.build();
160162

161163
if let Some(recipient) = recipient {
162164
let email = NewTokenEmail {
@@ -174,11 +176,22 @@ pub async fn create_api_token(
174176
}
175177
}
176178

177-
let api_token = EncodableApiTokenWithToken::from(api_token);
179+
let created_token = CreatedApiToken {
180+
plaintext,
181+
model: new_token.insert(&mut conn).await?,
182+
};
183+
184+
let api_token = EncodableApiTokenWithToken::from(created_token);
178185

179186
Ok(json!({ "api_token": api_token }))
180187
}
181188

189+
#[derive(Debug)]
190+
pub struct CreatedApiToken {
191+
pub model: ApiToken,
192+
pub plaintext: PlainToken,
193+
}
194+
182195
/// Find API token by id.
183196
#[utoipa::path(
184197
get,

src/models.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ pub use self::krate::{Crate, CrateName, NewCrate, RecentCrateDownloads};
1414
pub use self::owner::{CrateOwner, Owner, OwnerKind};
1515
pub use self::rights::Rights;
1616
pub use self::team::{NewTeam, Team};
17-
pub use self::token::{ApiToken, CreatedApiToken};
17+
pub use self::token::ApiToken;
1818
pub use self::user::{NewUser, User};
1919
pub use self::version::{NewVersion, TopVersions, Version};
2020

src/models/token.rs

Lines changed: 0 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -61,31 +61,6 @@ pub struct ApiToken {
6161
}
6262

6363
impl ApiToken {
64-
pub async fn insert_with_scopes(
65-
conn: &mut AsyncPgConnection,
66-
user_id: i32,
67-
name: &str,
68-
crate_scopes: Option<Vec<CrateScope>>,
69-
endpoint_scopes: Option<Vec<EndpointScope>>,
70-
expired_at: Option<NaiveDateTime>,
71-
) -> QueryResult<CreatedApiToken> {
72-
let token = PlainToken::generate();
73-
74-
let new_token = NewApiToken::builder()
75-
.user_id(user_id)
76-
.name(name)
77-
.token(token.hashed())
78-
.maybe_crate_scopes(crate_scopes)
79-
.maybe_endpoint_scopes(endpoint_scopes)
80-
.maybe_expired_at(expired_at)
81-
.build();
82-
83-
Ok(CreatedApiToken {
84-
plaintext: token,
85-
model: new_token.insert(conn).await?,
86-
})
87-
}
88-
8964
pub async fn find_by_api_token(
9065
conn: &mut AsyncPgConnection,
9166
token: &HashedToken,
@@ -120,12 +95,6 @@ impl ApiToken {
12095
}
12196
}
12297

123-
#[derive(Debug)]
124-
pub struct CreatedApiToken {
125-
pub model: ApiToken,
126-
pub plaintext: PlainToken,
127-
}
128-
12998
#[cfg(test)]
13099
mod tests {
131100
use super::*;

src/tests/util.rs

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
//! `MockCookieUser` and `MockTokenUser` provide an `as_model` function which returns a reference
2020
//! to the underlying database model value (`User` and `ApiToken` respectively).
2121
22-
use crate::models::{ApiToken, CreatedApiToken, User};
22+
use crate::models::{ApiToken, User};
2323
use crate::tests::{
2424
CategoryListResponse, CategoryResponse, CrateList, CrateResponse, GoodCrate, OwnerResp,
2525
OwnersResponse, VersionResponse,
@@ -28,7 +28,7 @@ use std::future::Future;
2828

2929
use http::{Method, Request};
3030

31-
use crate::models::token::{CrateScope, EndpointScope};
31+
use crate::models::token::{CrateScope, EndpointScope, NewApiToken};
3232
use crate::util::token::PlainToken;
3333
use axum::body::{Body, Bytes};
3434
use axum::extract::connect_info::MockConnectInfo;
@@ -50,6 +50,7 @@ mod mock_request;
5050
mod response;
5151
mod test_app;
5252

53+
use crate::controllers::token::CreatedApiToken;
5354
use mock_request::MockRequest;
5455
pub use mock_request::MockRequestExt;
5556
pub use response::Response;
@@ -320,16 +321,21 @@ impl MockCookieUser {
320321
) -> MockTokenUser {
321322
let mut conn = self.app().db_conn().await;
322323

323-
let token = ApiToken::insert_with_scopes(
324-
&mut conn,
325-
self.user.id,
326-
name,
327-
crate_scopes,
328-
endpoint_scopes,
329-
expired_at,
330-
)
331-
.await
332-
.unwrap();
324+
let plaintext = PlainToken::generate();
325+
326+
let new_token = NewApiToken::builder()
327+
.user_id(self.user.id)
328+
.name(name)
329+
.token(plaintext.hashed())
330+
.maybe_crate_scopes(crate_scopes)
331+
.maybe_endpoint_scopes(endpoint_scopes)
332+
.maybe_expired_at(expired_at)
333+
.build();
334+
335+
let token = CreatedApiToken {
336+
plaintext,
337+
model: new_token.insert(&mut conn).await.unwrap(),
338+
};
333339

334340
MockTokenUser {
335341
app: self.app.clone(),

src/views.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
use chrono::NaiveDateTime;
22
use secrecy::ExposeSecret;
33

4+
use crate::controllers::token::CreatedApiToken;
45
use crate::external_urls::remove_blocked_urls;
56
use crate::models::{
6-
ApiToken, Category, Crate, CrateOwnerInvitation, CreatedApiToken, Dependency, DependencyKind,
7-
Keyword, Owner, ReverseDependency, Team, TopVersions, User, Version, VersionDownload,
8-
VersionOwnerAction,
7+
ApiToken, Category, Crate, CrateOwnerInvitation, Dependency, DependencyKind, Keyword, Owner,
8+
ReverseDependency, Team, TopVersions, User, Version, VersionDownload, VersionOwnerAction,
99
};
1010
use crate::util::rfc3339;
1111
use crates_io_github as github;

0 commit comments

Comments
 (0)