Files
dr_who_website/src/main.rs
2023-01-05 11:21:32 +01:00

160 lines
5.0 KiB
Rust

#![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<Self>;
fn started(&mut self, ctx: &mut Self::Context) {}
}
/// Handler for ws::Message message
impl StreamHandler<Result<ws::Message, ws::ProtocolError>> for Ws {
fn handle(&mut self, msg: Result<ws::Message, ws::ProtocolError>, 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<Tera>, 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::<serde_json::Value>::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<Tera>, id: Identity) -> impl Responder {
let mut context = Context::new();
response::template(tmpl, "home.html.twig", &context)
}
async fn not_found(req: HttpRequest, tmpl: Data<Tera>, 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
}