#![allow(unused)] use actix::{Actor, StreamHandler}; use actix_files::{Files, NamedFile}; use actix_form_data::{Error, Field, Value}; use actix_identity::Identity; use actix_identity::{CookieIdentityPolicy, IdentityService}; use actix_multipart::Multipart; use actix_web::{ cookie::Cookie, get, http, middleware, post, web, web::Data, web::Form, web::Path as Pathweb, App, HttpRequest, HttpResponse, HttpServer, Responder, }; use actix_web_actors::ws; use serde::{Deserialize, Serialize}; use std::collections::HashMap; use std::{fs::*, default}; use std::path::*; use std::process::Command; use tera::{Context, Tera}; #[macro_use] extern crate diesel; use diesel::prelude::*; pub mod schema; use schema::users; pub mod models; use models::{User, Project, Entity}; use walkdir::{DirEntry, WalkDir}; mod user_controller; mod response; mod util; use util::*; // use response::MyError; use futures_util::TryStreamExt as _; use std::io::Write; use tempfile::tempfile; use uuid::Uuid; use std::fs::File; use std::io::{self, prelude::*, BufReader}; struct Ws {} impl Actor for Ws { type Context = ws::WebsocketContext; fn started(&mut self, ctx: &mut Self::Context) {} } /// Handler for ws::Message message impl StreamHandler> for Ws { fn handle(&mut self, msg: Result, ctx: &mut Self::Context) { match msg { Ok(ws::Message::Ping(msg)) => { println!("msg: {:?}", msg); ctx.pong(&msg) } Ok(ws::Message::Text(text)) => { // println!("text: {:?}", text); // ctx.text(text); let str = &text.to_string(); if str == &"Coucou le serveur !".to_string() { // println!("text: {:?}", str); // println!("user: {:?}", User::find(1).unwrap()); return ctx.text(text); } ctx.text(text) } Ok(ws::Message::Binary(bin)) => { println!("bin: {:?}", bin); ctx.binary(bin) } _ => (), } } } #[get("/ws")] async fn websocket(req: HttpRequest, stream: web::Payload) -> impl Responder { let resp = ws::start(Ws {}, &req, stream); // println!("{:#?}", &ws); resp } #[get("/")] async fn index(tmpl: Data, id: Identity) -> impl Responder { let mut context = Context::new(); let result_user = get_user_session(&id); if !result_user.is_err() { let user_session = result_user.unwrap(); context.insert("user", &user_session); } let projects = Project::find_by_public(true).unwrap(); let mut projects_json = Vec::::new(); for project in projects { projects_json.push(project.to_json()); } context.insert("projects_json",&projects_json); response::template(tmpl, "index.html.twig", &context) } #[get("/home")] async fn home(tmpl: Data, id: Identity) -> impl Responder { let mut context = Context::new(); response::template(tmpl, "home.html.twig", &context) } async fn not_found(req: HttpRequest, tmpl: Data, id: Identity) -> impl Responder { let context = Context::new(); response::just_404(tmpl) } #[actix_web::main] async fn main() -> std::io::Result<()> { HttpServer::new(|| { let tera = Tera::new(concat!(env!("CARGO_MANIFEST_DIR"), "/templates/**/*")).unwrap(); let mut folder_static = "static/"; App::new() .app_data(Data::new(tera)) .wrap(IdentityService::new( CookieIdentityPolicy::new(&[0; 32]) .name("dr_who_website") .secure(true) .max_age_secs(60 * 60 * 24 * 7), // 1week )) .wrap(middleware::Logger::default()) .service(index) .service(user_controller::login) .service(user_controller::post_login) .service(user_controller::post_auth) .service(user_controller::post_auth_user) .service(user_controller::register) .service(user_controller::post_register) .service(user_controller::logout) .service(user_controller::register_google) .service(user_controller::post_register_google) .service(user_controller::user_validate) .service(user_controller::forgotpassword) .service(user_controller::post_forgotpassword) .service(user_controller::change_password) .service(user_controller::post_change_password) .service(user_controller::profile) .service(user_controller::profile_post) .service(user_controller::delete) .service(user_controller::user_deleted) .service(websocket) .service(home) .service(Files::new("/static", folder_static)) .default_service(web::route().to(not_found)) }) .workers(8) .bind(("0.0.0.0", 80))? .run() .await }