router.rs 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. use crate::service::ws_service::{entities::SessionId, WSClient, WSServer};
  2. use actix::Addr;
  3. use crate::service::user_service::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. ) -> Result<HttpResponse, Error> {
  19. match LoggedUser::from_token(token.clone()) {
  20. Ok(user) => {
  21. let client = WSClient::new(
  22. SessionId::new(user.user_id.clone()),
  23. server.get_ref().clone(),
  24. );
  25. let result = ws::start(client, &request, payload);
  26. match result {
  27. Ok(response) => Ok(response.into()),
  28. Err(e) => {
  29. log::error!("ws connection error: {:?}", e);
  30. Err(e)
  31. },
  32. }
  33. },
  34. Err(e) => {
  35. if e.is_unauthorized() {
  36. Ok(HttpResponse::Unauthorized().json(e))
  37. } else {
  38. Ok(HttpResponse::BadRequest().json(e))
  39. }
  40. },
  41. }
  42. }