Service login (#6)
Rust Build / Rustfmt (push) Successful in 1m24s
Rust Build / Check (push) Successful in 1m29s
Rust Build / Test Suite (push) Successful in 1m29s
Rust Build / build (push) Successful in 1m42s
Rust Build / Clippy (push) Successful in 1m52s
Rust Build / Rustfmt (pull_request) Successful in 53s
Rust Build / Test Suite (pull_request) Successful in 1m25s
Rust Build / Check (pull_request) Successful in 1m47s
Rust Build / Clippy (pull_request) Successful in 1m40s
Rust Build / build (pull_request) Successful in 1m36s
Rust Build / Rustfmt (push) Successful in 1m24s
Rust Build / Check (push) Successful in 1m29s
Rust Build / Test Suite (push) Successful in 1m29s
Rust Build / build (push) Successful in 1m42s
Rust Build / Clippy (push) Successful in 1m52s
Rust Build / Rustfmt (pull_request) Successful in 53s
Rust Build / Test Suite (pull_request) Successful in 1m25s
Rust Build / Check (pull_request) Successful in 1m47s
Rust Build / Clippy (pull_request) Successful in 1m40s
Rust Build / build (pull_request) Successful in 1m36s
Reviewed-on: phoenix/textsender-auth#6
This commit was merged in pull request #6.
This commit is contained in:
+50
-6
@@ -54,17 +54,27 @@ pub async fn get_with_username(
|
||||
username: &String,
|
||||
) -> Result<textsender_models::user::ServiceUser, sqlx::Error> {
|
||||
match sqlx::query(
|
||||
r#"SELECT id, username, passphrase, created, last_login FROM "service_user" WHERE username = $1"#
|
||||
r#"SELECT id, username, passphrase, created, last_login, salt_id FROM "service_user" WHERE username = $1"#
|
||||
).bind(username)
|
||||
.fetch_one(pool).await {
|
||||
Ok(row) => {
|
||||
let last_login: Option<time::OffsetDateTime> = match row.try_get("last_login") {
|
||||
Ok(login) => {
|
||||
Some(login)
|
||||
}
|
||||
Err(err) => {
|
||||
eprintln!("Error: {err:?}");
|
||||
None
|
||||
}
|
||||
};
|
||||
|
||||
let service_user = textsender_models::user::ServiceUser {
|
||||
id: row.try_get("id")?,
|
||||
username: row.try_get("username")?,
|
||||
passphrase: row.try_get("passphrase")?,
|
||||
created: row.try_get("created")?,
|
||||
last_login: row.try_get("last_login")?,
|
||||
salt_id: row.try_get("salt_id")?
|
||||
last_login,
|
||||
salt_id: row.try_get("salt_id")?,
|
||||
};
|
||||
|
||||
Ok(service_user)
|
||||
@@ -75,14 +85,47 @@ pub async fn get_with_username(
|
||||
}
|
||||
}
|
||||
|
||||
pub async fn update_last_login(
|
||||
pool: &sqlx::PgPool,
|
||||
service_user: &textsender_models::user::ServiceUser,
|
||||
time: &time::OffsetDateTime,
|
||||
) -> Result<time::OffsetDateTime, sqlx::Error> {
|
||||
let result = sqlx::query(
|
||||
r#"
|
||||
UPDATE "service_user" SET last_login = $1 WHERE id = $2 RETURNING last_login
|
||||
"#,
|
||||
)
|
||||
.bind(time)
|
||||
.bind(service_user.id)
|
||||
.fetch_optional(pool)
|
||||
.await
|
||||
.map_err(|e| {
|
||||
eprintln!("Error updating time: {e}");
|
||||
e
|
||||
});
|
||||
|
||||
match result {
|
||||
Ok(row) => match row {
|
||||
Some(r) => {
|
||||
let last_login: time::OffsetDateTime = r
|
||||
.try_get("last_login")
|
||||
.map_err(|_e| sqlx::Error::RowNotFound)?;
|
||||
Ok(last_login)
|
||||
}
|
||||
None => Err(sqlx::Error::RowNotFound),
|
||||
},
|
||||
Err(err) => Err(err),
|
||||
}
|
||||
}
|
||||
|
||||
pub async fn insert(
|
||||
pool: &sqlx::PgPool,
|
||||
service_user: &textsender_models::user::ServiceUser,
|
||||
) -> Result<time::OffsetDateTime, sqlx::Error> {
|
||||
) -> Result<(uuid::Uuid, time::OffsetDateTime), sqlx::Error> {
|
||||
match sqlx::query(
|
||||
r#"INSERT INTO "service_user" (username, passphrase, salt_id)
|
||||
VALUES ($1, $2, $3)
|
||||
RETURNING created
|
||||
RETURNING id, created
|
||||
"#,
|
||||
)
|
||||
.bind(&service_user.username)
|
||||
@@ -92,8 +135,9 @@ pub async fn insert(
|
||||
.await
|
||||
{
|
||||
Ok(row) => {
|
||||
let id: uuid::Uuid = row.try_get("id")?;
|
||||
let created: time::OffsetDateTime = row.try_get("created")?;
|
||||
Ok(created)
|
||||
Ok((id, created))
|
||||
}
|
||||
Err(err) => Err(err),
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user