Skip to content

Commit

Permalink
feat: generate readable initial user name
Browse files Browse the repository at this point in the history
  • Loading branch information
meowtec committed Apr 16, 2023
1 parent 840ff47 commit 7c0e5e0
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 7 deletions.
11 changes: 11 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions packages/server/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,4 @@ include_dir = "0.7"
mime = "0.3"
mime_guess = "2"
sled = "0.34"
woothee = "0.13"
12 changes: 7 additions & 5 deletions packages/server/src/controllers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,13 @@ pub struct UploadQuery {

#[post("/file/upload")]
pub async fn file_upload(
req: HttpRequest,
payload: web::Payload,
query: web::Query<UploadQuery>,
file_manager: web::Data<FileManager>,
session: Session,
) -> ResponseResult<UserFile> {
let user = User::get_from_session(&session).map_err(anyhow::Error::from)?;
let user = User::get_from_session(&session, &req).map_err(anyhow::Error::from)?;
let file = file_manager
.add_from_stream(payload, query.filename.to_string(), user.id)
.await?;
Expand All @@ -47,18 +48,19 @@ pub async fn file_download(
}

#[get("/user-info")]
pub async fn user_info(session: Session) -> ResponseResult<User> {
let user = User::get_from_session(&session).map_err(anyhow::Error::from)?;
pub async fn user_info(req: HttpRequest, session: Session) -> ResponseResult<User> {
let user = User::get_from_session(&session, &req).map_err(anyhow::Error::from)?;
MyResponse::ok(user)
}

#[post("/user-info")]
pub async fn update_user_info(
req: HttpRequest,
payload: web::Json<User>,
session: Session,
office: web::Data<Addr<PostOffice>>,
) -> ResponseResult<User> {
let mut user = User::get_from_session(&session).map_err(anyhow::Error::from)?;
let mut user = User::get_from_session(&session, &req).map_err(anyhow::Error::from)?;
// Update current user info, payload.id will be excluded
user.update(payload.into_inner());
user.insert_to_session(&session)
Expand Down Expand Up @@ -88,7 +90,7 @@ pub async fn websocket(
stream: web::Payload,
office: web::Data<Addr<PostOffice>>,
) -> Result<HttpResponse, actix_web::Error> {
let user = User::get_from_session(&session)?;
let user = User::get_from_session(&session, &req)?;

log::info!(
"CONNECT /ws: websocket connected from user: {} {}",
Expand Down
26 changes: 24 additions & 2 deletions packages/server/src/user.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use actix_session::{Session, SessionInsertError};
use actix_web::HttpRequest;
use serde::{Deserialize, Serialize};

const USER_INFO_SESSION_KEY: &str = "user_info";
Expand All @@ -9,6 +10,15 @@ pub struct User {
pub user_name: String,
}

fn get_default_user_name_from_ua(ua: &str) -> Option<String> {
let result = woothee::parser::Parser::new().parse(ua)?;
Some(format!(
"{} {}",
result.os.replace("Windows", "Win"),
result.name
))
}

impl User {
pub fn new() -> Self {
let id = nanoid::nanoid!(16);
Expand All @@ -26,13 +36,25 @@ impl User {
Ok(())
}

pub fn get_from_session(session: &Session) -> Result<User, SessionInsertError> {
pub fn get_from_session(
session: &Session,
req: &HttpRequest,
) -> Result<User, SessionInsertError> {
let user_option = session.get::<User>(USER_INFO_SESSION_KEY).unwrap_or(None);

let user = match user_option {
Some(user) => user,
None => {
let new_user = User::new();
let user_agent = req
.headers()
.get("User-Agent")
.and_then(|ua| ua.to_str().ok())
.unwrap_or_default();

let mut new_user = User::new();
if let Some(user_name) = get_default_user_name_from_ua(user_agent) {
new_user.user_name = user_name;
}
new_user.insert_to_session(session)?;
new_user
}
Expand Down

0 comments on commit 7c0e5e0

Please sign in to comment.