router.rs 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. use crate::service::ws::{WSClient, WSServer, WsBizHandlers};
  2. use actix::Addr;
  3. use crate::service::user::LoggedUser;
  4. use actix_web::{
  5. get,
  6. web::{Data, Path, Payload},
  7. Error,
  8. HttpRequest,
  9. HttpResponse,
  10. };
  11. use actix_web_actors::ws;
  12. #[get("/{token}")]
  13. pub async fn establish_ws_connection(
  14. request: HttpRequest,
  15. payload: Payload,
  16. token: Path<String>,
  17. server: Data<Addr<WSServer>>,
  18. biz_handlers: Data<WsBizHandlers>,
  19. ) -> Result<HttpResponse, Error> {
  20. match LoggedUser::from_token(token.clone()) {
  21. Ok(user) => {
  22. let client = WSClient::new(&user.user_id, server.get_ref().clone(), biz_handlers);
  23. let result = ws::start(client, &request, payload);
  24. match result {
  25. Ok(response) => Ok(response.into()),
  26. Err(e) => {
  27. log::error!("ws connection error: {:?}", e);
  28. Err(e)
  29. },
  30. }
  31. },
  32. Err(e) => {
  33. if e.is_unauthorized() {
  34. Ok(HttpResponse::Unauthorized().json(e))
  35. } else {
  36. Ok(HttpResponse::BadRequest().json(e))
  37. }
  38. },
  39. }
  40. }