diff --git a/.gitignore b/.gitignore index 629123e..615644c 100644 --- a/.gitignore +++ b/.gitignore @@ -9,7 +9,6 @@ Cargo.lock # These are backup files generated by rustfmt **/*.rs.bk -/medias persistence-db tmp/* static/sourcefiles/ diff --git a/docker-compose.yml b/docker-compose.yml index 1f7a1ce..ef77727 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -14,8 +14,8 @@ services: - MODE_INSTALL=DEV # DEV, PROD - RUST_BACKTRACE=1 - TMPDIR=/usr/src/myapp/tmp - - GOOGLE_CLIENT_ID=723424966880-015kn0qncavlgbj4j3k1ggs3arn7tdkd.apps.googleusercontent.com - - GOOGLE_CLIENT_SECRET=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 + - GOOGLE_CLIENT_ID=1041713159432-vad6qp7ce7p9iid9qjdiopi7n6ajvmtv.apps.googleusercontent.com + - GOOGLE_CLIENT_SECRET=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 depends_on: - dr_who_website-db labels: diff --git a/k-9_url b/k-9_url deleted file mode 100644 index cef9b64..0000000 --- a/k-9_url +++ /dev/null @@ -1,26 +0,0 @@ -youtube-dl https://www.shoutfactorytv.com/k-9/k-9-s1-e1-regeneration/54d111ea69702d0707150800 -youtube-dl https://www.shoutfactorytv.com/k-9/k-9-s1-e2-liberation/54d1122969702d04c9700800 -youtube-dl https://www.shoutfactorytv.com/k-9/k-9-s1-e3-the-korven/54d1124369702d04ca100800 -youtube-dl https://www.shoutfactorytv.com/k-9/k-9-s1-e4-the-bounty-hunter/54d1127e69702d04c9740800 -youtube-dl https://www.shoutfactorytv.com/k-9/k-9-s1-e5-sirens-of-ceres/54d1129669702d07071c0800 -youtube-dl https://www.shoutfactorytv.com/k-9/k-9-s1-e6-fear-itself/54d113a069702d04c9830800 -youtube-dl https://www.shoutfactorytv.com/k-9/k-9-s1-e7-the-fall-of-the-house-of-gryffen/54d1142f69702d04c98b0800 -youtube-dl https://www.shoutfactorytv.com/k-9/k-9-s1-e8-jaws-of-orthrus/54d1144169702d07072f0800 -youtube-dl https://www.shoutfactorytv.com/k-9/k-9-s1-e9-dream-eaters/54d1145769702d04c98d0800 -youtube-dl https://www.shoutfactorytv.com/k-9/k-9-s1-e10-curse-of-anubis/54d1146969702d04c9910800 -youtube-dl https://www.shoutfactorytv.com/k-9/k-9-s1-e11-oroborus/54d1147c69702d04ca2c0800 -youtube-dl https://www.shoutfactorytv.com/k-9/k-9-s1-e12-alien-avatar/54d1148e69702d04ca2f0800 -youtube-dl https://www.shoutfactorytv.com/k-9/k-9-s1-e13-aeolian/54d114ac69702d0707380800 -youtube-dl https://www.shoutfactorytv.com/k-9/k-9-s1-e14-the-last-oak-tree/54d114c069702d04ca390800 -youtube-dl https://www.shoutfactorytv.com/k-9/k-9-s1-e15-black-hunger/54d114e769702d04c99a0800 -youtube-dl https://www.shoutfactorytv.com/k-9/k-9-s1-e16-the-cambridge-spy/54d1151269702d04ca3e0800 -youtube-dl https://www.shoutfactorytv.com/k-9/k-9-s1-e17-lost-library-of-ukko/54d1152469702d04c99f0800 -youtube-dl https://www.shoutfactorytv.com/k-9/k-9-s1-e18-mutant-copper/54d1153769702d0707420800 -youtube-dl https://www.shoutfactorytv.com/k-9/k-9-s1-e19-the-custodians/54d1154969702d04c9a40800 -youtube-dl https://www.shoutfactorytv.com/k-9/k-9-s1-e20-taphony-and-the-time-loop/54d1155c69702d04ca450800 -youtube-dl https://www.shoutfactorytv.com/k-9/k-9-s1-e21-robot-gladiators/54d1157069702d0707460800 -youtube-dl https://www.shoutfactorytv.com/k-9/k-9-s1-e22-mind-snap/54d1158469702d0707490800 -youtube-dl https://www.shoutfactorytv.com/k-9/k-9-s1-e23-angel-of-the-north/54d115a669702d07074c0800 -youtube-dl https://www.shoutfactorytv.com/k-9/k-9-s1-e24-the-last-precinct/54d115bb69702d04c9ac0800 -youtube-dl https://www.shoutfactorytv.com/k-9/k-9-s1-e25-hound-of-the-korven/54d115cf69702d04ca4a0800 -youtube-dl https://www.shoutfactorytv.com/k-9/k-9-s1-e26-the-eclipse-of-the-korven/54d115e969702d04c9ae0800 \ No newline at end of file diff --git a/medias/DB/bd b/medias/DB/bd new file mode 100644 index 0000000..e69de29 diff --git a/medias/Podcast/podcast b/medias/Podcast/podcast new file mode 100644 index 0000000..e69de29 diff --git a/medias/Romans/romans b/medias/Romans/romans new file mode 100644 index 0000000..e69de29 diff --git a/medias/Series/Class/class b/medias/Series/Class/class new file mode 100644 index 0000000..e69de29 diff --git a/medias/Series/DrWho Classic/drwhoclassic b/medias/Series/DrWho Classic/drwhoclassic new file mode 100644 index 0000000..e69de29 diff --git a/medias/Series/DrWho/drwho b/medias/Series/DrWho/drwho new file mode 100644 index 0000000..e69de29 diff --git a/medias/Series/K-9/k9 b/medias/Series/K-9/k9 new file mode 100644 index 0000000..e69de29 diff --git a/medias/Series/The Sarah Jane Adventures/sarahjaneadventures b/medias/Series/The Sarah Jane Adventures/sarahjaneadventures new file mode 100644 index 0000000..e69de29 diff --git a/medias/Series/Torchwood/torchwood b/medias/Series/Torchwood/torchwood new file mode 100644 index 0000000..e69de29 diff --git a/migrations/2022-07-20-084320_create_users/up.sql b/migrations/2022-07-20-084320_create_users/up.sql index cf93438..5d35af8 100644 --- a/migrations/2022-07-20-084320_create_users/up.sql +++ b/migrations/2022-07-20-084320_create_users/up.sql @@ -7,7 +7,5 @@ create table users( email VARCHAR(255) NOT NULL DEFAULT '', google VARCHAR(255) NOT NULL DEFAULT '', email_valid VARCHAR(255) NOT NULL DEFAULT '', - data VARCHAR(255) NOT NULL DEFAULT '' + data TEXT NOT NULL DEFAULT '' ); - -insert into users(username, password, salt) values ('adminkey', '', ''); diff --git a/src/main.rs b/src/main.rs index 00bba0f..f7dc479 100644 --- a/src/main.rs +++ b/src/main.rs @@ -25,7 +25,7 @@ use diesel::prelude::*; pub mod schema; use schema::users; pub mod models; -use models::{User, Project, Entity}; +use models::{User}; use walkdir::{DirEntry, WalkDir}; @@ -44,48 +44,6 @@ 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 { @@ -95,19 +53,30 @@ async fn index(tmpl: Data, id: Identity) -> impl Responder { 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 { + +#[derive(Debug, Deserialize)] +pub struct ParamsMedias { + q: String, +} + +#[get("/medias")] +async fn medias(req: HttpRequest, tmpl: Data, id: Identity) -> impl Responder { let mut context = Context::new(); - response::template(tmpl, "home.html.twig", &context) + let result_user = get_user_session(&id); + if !result_user.is_err() { + let user_session = result_user.unwrap(); + context.insert("user", &user_session); + } + let params_result = web::Query::::from_query(req.query_string()); + if params_result.is_err() { + return response::redirect("/"); + } + let params = params_result.unwrap(); + context.insert("path", ¶ms.q); + response::template(tmpl, "medias.html.twig", &context) } async fn not_found(req: HttpRequest, tmpl: Data, id: Identity) -> impl Responder { @@ -130,6 +99,7 @@ async fn main() -> std::io::Result<()> { )) .wrap(middleware::Logger::default()) .service(index) + .service(medias) .service(user_controller::login) .service(user_controller::post_login) .service(user_controller::post_auth) @@ -148,8 +118,6 @@ async fn main() -> std::io::Result<()> { .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)) }) diff --git a/src/media_controller.rs b/src/media_controller.rs new file mode 100644 index 0000000..59aaa59 --- /dev/null +++ b/src/media_controller.rs @@ -0,0 +1,33 @@ +#![allow(unused)] +use actix_files::{Files, NamedFile}; +use actix_form_data::{Error, Field}; +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 lettre::transport::smtp::commands::Mail; +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; +use std::fmt::format; +use std::{fs::*, string}; +use std::path::*; +use std::sync::mpsc::Sender; +use tera::{Context, Tera}; + +use super::models::User; +use diesel::prelude::*; + +use walkdir::{DirEntry, WalkDir}; +use serde_json::{json, Serializer, Value}; + +use super::response; +use super::util::*; + +use futures_util::TryStreamExt as _; +use std::io::Write; +use tempfile::tempfile; +use uuid::Uuid; diff --git a/src/models.rs b/src/models.rs index 9c060f9..dd32cc9 100644 --- a/src/models.rs +++ b/src/models.rs @@ -23,6 +23,7 @@ pub struct User { pub email: String, pub google: String, pub email_valid: String, + pub data: String } impl User { @@ -63,6 +64,7 @@ impl User { users::dsl::email_valid.eq(uuid), users::dsl::email.eq(email), users::dsl::google.eq("".to_string()), + users::dsl::data.eq("{}".to_string()), )) .get_result(&db()); if !result.is_err() { @@ -84,7 +86,7 @@ impl User { } pub fn find_all() -> Result, String> { - let result = users::dsl::users.get_results::(&db()); + let result = users::dsl::users.get_results::(&db()); if !result.is_err() { let users = result.unwrap(); return Ok(users); @@ -196,36 +198,9 @@ impl User { self.salt = sha256::digest(y.to_string()) } - pub fn get_projects(&self) -> Result, String> { - let result = projects::dsl::projects - .filter(projects::dsl::creator_id.eq(&self.id)) - .get_results::(&db()); - if !result.is_err() { - let projects = result.unwrap(); - return Ok(projects); - } - Err(format!("Project {} not fetched", self.id)) - } - - pub fn get_project_accesss(&self) -> Result, String> { - let result = project_accesss::dsl::project_accesss - .filter(project_accesss::dsl::user_id.eq(&self.id)) - .get_results::(&db()); - if !result.is_err() { - let project_accesss = result.unwrap(); - return Ok(project_accesss); - } - Err(format!("ProjectAccesss {} not fetched", self.id)) - } - pub fn delete(self) -> Result { let id = self.id.clone(); let name = self.username.clone(); - let result_projects = self.get_projects(); - let projects = result_projects.unwrap(); - for project in projects { - project.delete(); - } let filter_user = users::dsl::users.filter(users::dsl::id.eq(&id)); let result_del_user = diesel::delete(filter_user) .returning(users::dsl::username) @@ -238,539 +213,6 @@ impl User { pub fn to_json(self) -> Value { let mut user_value = json!(self); - let project_accesss = self.get_project_accesss().unwrap(); - let mut project_accesss_json = Vec::new(); - for project_access in project_accesss { - project_accesss_json.push(project_access.to_json()); - } - user_value["project_accesss"] = json!(project_accesss_json); - user_value["projects"] = json!(self.get_projects().unwrap()); user_value } } - -#[derive(Debug, Queryable, Identifiable, Insertable, serde::Serialize)] -pub struct Project { - pub id: i32, - pub creator_id: i32, - pub uuid: String, - pub name: String, - pub password: String, - pub time_limit: SystemTime, - pub premium: i32, - pub is_public: bool, - pub image: String, - pub origin_filename: String, - pub description: String, - pub data: String, -} -impl Project { - const FREE: i32 = 0; - const PAID: i32 = 1; - - pub fn create( - name: String, - origin_filename: String, - password: String, - user: &User, - ) -> Result { - let result = diesel::insert_into(projects::table) - .values(( - projects::dsl::origin_filename.eq(origin_filename), - projects::dsl::creator_id.eq(user.id), - projects::dsl::uuid.eq(Uuid::new_v4().to_string()), - projects::dsl::name.eq(name), - projects::dsl::password.eq(password), - projects::dsl::time_limit - .eq(SystemTime::now() + Duration::new(60 * 60 * 24 * 5, 0)), // calcul pour 5 jour en seconde - projects::dsl::premium.eq(Project::FREE), - projects::dsl::is_public.eq(true), - projects::dsl::description.eq("".to_string()), - projects::dsl::data.eq("{}".to_string()), - )) - .get_result(&db()); - if !result.is_err() { - let project = result.unwrap(); - return Ok(project); - } - Err(format!("Project not created")) - } - - pub fn find(id: i32) -> Result { - let result = projects::dsl::projects - .filter(projects::dsl::id.eq(id)) - .get_result::(&db()); - if !result.is_err() { - let project = result.unwrap(); - return Ok(project); - } - Err(format!("User {} not found", id)) - } - - pub fn find_by_uuid(uuid: &str) -> Result { - let result = projects::dsl::projects - .filter(projects::dsl::uuid.eq(&uuid)) - .get_result::(&db()); - if !result.is_err() { - let project = result.unwrap(); - return Ok(project); - } - Err(format!("Project {} not find", &uuid)) - } - - pub fn find_by_public(is_public: bool) -> Result, String> { - let result = projects::dsl::projects - .filter(projects::dsl::is_public.eq(&is_public)) - .get_results::(&db()); - if !result.is_err() { - let projects = result.unwrap(); - return Ok(projects); - } - Err(format!("User {} not found", &is_public)) - } - - pub fn update(self) -> Result { - let filter = projects::dsl::projects.filter(projects::dsl::id.eq(self.id)); - let result = diesel::update(filter) - .set(( - projects::dsl::image.eq(self.image), - projects::dsl::origin_filename.eq(self.origin_filename), - projects::dsl::creator_id.eq(self.creator_id), - projects::dsl::uuid.eq(self.uuid), - projects::dsl::name.eq(self.name), - projects::dsl::password.eq(self.password), - projects::dsl::time_limit.eq(self.time_limit), - projects::dsl::premium.eq(self.premium), - projects::dsl::is_public.eq(self.is_public), - projects::dsl::data.eq(self.data), - projects::dsl::description.eq(self.description), - )) - .get_result::(&db()); - if !result.is_err() { - let project = result.unwrap(); - return Ok(project); - } - Err(format!("Project {} not update", self.id)) - } - - pub fn get_entitys(&self) -> Result, String> { - let result = entitys::dsl::entitys - .filter(entitys::dsl::project_id.eq(&self.id)) - .get_results::(&db()); - if !result.is_err() { - let entitys = result.unwrap(); - return Ok(entitys); - } - Err(format!("Project entitys {} not fetched", self.id)) - } - - pub fn get_creator(&self) -> Result { - User::find(self.creator_id) - } - - pub fn get_project_accesss(&self) -> Result, String> { - let result = project_accesss::dsl::project_accesss - .filter(project_accesss::dsl::project_id.eq(&self.id)) - .get_results::(&db()); - if !result.is_err() { - let project_accesss = result.unwrap(); - return Ok(project_accesss); - } - Err(format!("ProjectAccesss {} not fetched", self.id)) - } - - pub fn delete(self) -> Result { - let result_file = std::fs::remove_dir_all(Path::new("medias").join(self.uuid)); - let filter_entity = entitys::dsl::entitys.filter(entitys::dsl::project_id.eq(&self.id)); - let result_del_entity = diesel::delete(filter_entity) - .returning(entitys::dsl::name) - .get_results::(&db()); - if result_del_entity.is_err() { - return Err(format!("Project delete could not remove entity in db()")); - } - let filter_project = projects::dsl::projects.filter(projects::dsl::id.eq(&self.id)); - let result_del_project = diesel::delete(filter_project) - .returning(projects::dsl::name) - .get_result::(&db()); - if result_del_project.is_err() { - return Err(format!("Project delete could not remove project in db()")); - } - return Ok("Project was deleted".to_string()); - } - - pub fn get_logs(&self) -> String { - let path = Path::new("./medias") - .join(self.uuid.clone()) - .join("cmd_logs.txt"); - if path.exists() { - return String::from_utf8_lossy(&std::fs::read(&path).unwrap()).to_string(); - } - "".to_string() - } - - const CONVERTION: i32 = 0; - const COMPLETE: i32 = 1; - const CRASHED: i32 = 2; - - pub fn get_status(&self) -> i32 { - let path = Path::new("./medias") - .join(self.uuid.clone()) - .join("cmd_logs.txt"); - if path.exists() { - let metadata = std::fs::metadata(path).unwrap(); - let modified_time = metadata.modified().unwrap().elapsed().unwrap().as_secs(); - // println!("{} > 10", modified_time); - if modified_time > 300 { - return Project::CRASHED; - } - return Project::CONVERTION; - } - Project::COMPLETE - } - - pub const ACCESSREAD: i32 = 0; - pub const ACCESSWRITE: i32 = 1; - - pub fn test_access(&self, result_user: &Result, access_type: i32) -> bool { - if access_type == Project::ACCESSREAD && self.is_public { - return true; - } - else if access_type == Project::ACCESSREAD && !result_user.is_err() { - let user = result_user.as_ref().unwrap(); - if user.id == self.creator_id { - return true; - } - let result_pa = ProjectAccess::find(user.id,self.id); - if(!result_pa.is_err()){ - let pa = result_pa.unwrap(); - if(pa.access_type == Project::ACCESSREAD || pa.access_type == Project::ACCESSWRITE){ - return true; - } - } - } - else if access_type == Project::ACCESSWRITE && !result_user.is_err() { - let user = result_user.as_ref().unwrap(); - if user.id == self.creator_id { - return true; - } - let result_pa = ProjectAccess::find(user.id,self.id); - if(!result_pa.is_err()){ - let pa = result_pa.unwrap(); - if(pa.access_type == Project::ACCESSWRITE){ - return true; - } - } - } - return false; - } - - pub fn to_json(&self) -> Value { - let mut project_value = json!(self); - project_value["entitys"] = json!(self.get_entitys().unwrap()); - project_value["creator"] = json!(self.get_creator().unwrap()); - project_value["cmd_logs"] = json!(self.get_logs()); - project_value["status"] = json!(self.get_status()); - project_value["data"] = self.get_data(); - let project_accesss = self.get_project_accesss().unwrap(); - let mut project_accesss_json = Vec::new(); - for project_access in project_accesss { - project_accesss_json.push(project_access.to_json()); - } - project_value["project_accesss"] = json!(project_accesss_json); - project_value - } - - pub fn duplicate(&self) -> Result { - let user = User::find(self.creator_id)?; - let mut project = Project::create(self.name.clone()+"_copy", self.origin_filename.clone(), self.password.clone(), &user)?; - project.description = self.description.clone(); - project.is_public = self.is_public.clone(); - project = project.update().unwrap(); - let copy_result = copy_dir_all(Path::new("./medias").join(self.uuid.clone()), Path::new("./medias").join(project.uuid.clone())); - if copy_result.is_err() { - return Err(format!("You cannot copy {} in {}",self.uuid,project.uuid)); - } - copy_result.unwrap(); - let entitys = self.get_entitys()?; - for e in entitys { - let entity = e.duplicate(&project); - } - return Ok(project); - } - - pub fn set_data(&mut self, object: &Value) { - self.data = object.to_string(); - } - - pub fn get_data(&self) -> Value { - serde_json::from_str(self.data.as_str()).unwrap() - } -} - -#[derive(Debug, Queryable, Identifiable, Insertable, serde::Serialize)] -pub struct Entity { - pub id: i32, - pub project_id: i32, - pub name: String, - pub type_entity: i32, - pub data: String, - pub parent_id: Option, -} -impl Entity { - pub const POTREE: i32 = 0; - pub const MODELE: i32 = 1; - pub const IMAGE360: i32 = 2; - pub const POTREEITEM: i32 = 3; - pub const GROUP: i32 = 3; - - pub fn create(name: String, type_entity: i32, project: &Project) -> Result { - let result = diesel::insert_into(entitys::table) - .values(( - entitys::dsl::project_id.eq(project.id), - entitys::dsl::name.eq(name), - entitys::dsl::type_entity.eq(type_entity), - entitys::dsl::data.eq(json!({}).to_string()), - entitys::dsl::parent_id.eq(None::), - )) - .get_result(&db()); - if !result.is_err() { - let entity = result.unwrap(); - return Ok(entity); - } - Err(format!("Entity not created")) - } - - pub fn duplicate(&self , project: &Project) -> Result { - let result = diesel::insert_into(entitys::table) - .values(( - entitys::dsl::project_id.eq(project.id), - entitys::dsl::name.eq(self.name.clone()), - entitys::dsl::type_entity.eq(self.type_entity), - entitys::dsl::data.eq(self.data.clone()), - entitys::dsl::parent_id.eq(None::), - )) - .get_result(&db()); - if !result.is_err() { - let entity = result.unwrap(); - return Ok(entity); - } - Err(format!("Entity not created")) - } - - pub fn find(id: i32) -> Result { - let result = entitys::dsl::entitys - .filter(entitys::dsl::id.eq(id)) - .get_result::(&db()); - if !result.is_err() { - let entity = result.unwrap(); - return Ok(entity); - } - Err(format!("User {} not found", id)) - } - - pub fn update(self) -> Result { - let filter = entitys::dsl::entitys.filter(entitys::dsl::id.eq(self.id)); - let result = diesel::update(filter) - .set(( - entitys::dsl::project_id.eq(self.project_id), - entitys::dsl::name.eq(self.name), - entitys::dsl::type_entity.eq(self.type_entity), - entitys::dsl::data.eq(self.data), - entitys::dsl::parent_id.eq(self.parent_id), - )) - .get_result::(&db()); - if !result.is_err() { - let entity = result.unwrap(); - return Ok(entity); - } - Err(format!("Project {} not update", self.id)) - } - - pub fn set_data(&mut self, object: &Value) { - self.data = object.to_string(); - } - - pub fn get_data(&self) -> Value { - serde_json::from_str(self.data.as_str()).unwrap() - } - - pub fn get_project(&self) -> Result { - let result = projects::dsl::projects - .filter(projects::dsl::id.eq(self.project_id)) - .get_result::(&db()); - if !result.is_err() { - let project = result.unwrap(); - return Ok(project); - } - Err(format!("User {} not found", self.project_id)) - } - - pub fn find_by_name_and_project(name: String, project_id: i32) -> Vec { - let result = entitys::dsl::entitys - .filter(entitys::dsl::name.eq(&name)) - .filter(entitys::dsl::project_id.eq(&project_id)) - .get_results::(&db()); - if !result.is_err() { - let entitys = result.unwrap(); - return entitys; - } - Vec::::new() - } - - pub fn delete(self) -> Result { - let id = self.id.clone(); - let name = self.name.clone(); - let result_project = self.get_project(); - if result_project.is_err() { - return Err(format!("Entity delete could not find project")); - } - let project = result_project.unwrap(); - let entity_with_same_file = Entity::find_by_name_and_project(self.name, self.project_id); - - if self.type_entity != Entity::POTREEITEM && entity_with_same_file.len() <= 1 { - let entity_path = Path::new("medias").join(project.uuid).join(&name); - if entity_path.exists() && entity_path.is_dir() { - let result_file = std::fs::remove_dir_all(entity_path); - if result_file.is_err() { - return Err(format!("Entity delete could not remove folder")); - } - } else if entity_path.exists() { - let result_file = std::fs::remove_file(entity_path); - if result_file.is_err() { - return Err(format!("Entity delete could not remove file")); - } - } - } - - let filter_entity = entitys::dsl::entitys.filter(entitys::dsl::id.eq(&id)); - let result_del_entity = diesel::delete(filter_entity) - .returning(entitys::dsl::name) - .get_result::(&db()); - if result_del_entity.is_err() { - return Err(format!("Entity delete could not remove project in db()")); - } - return Ok("Entity was deleted".to_string()); - } -} - -#[derive(Debug, Queryable, Identifiable, Insertable, serde::Serialize)] -pub struct ProjectAccess { - pub id: i32, - pub user_id: i32, - pub project_id: i32, - pub access_type: i32, -} -impl ProjectAccess { - - pub fn create( - user: &User, - project: &Project, - access: i32, - ) -> Result { - let project_access_result = ProjectAccess::find(user.id, project.id); - if !project_access_result.is_err(){ - let mut project_access = project_access_result.unwrap(); - project_access.access_type = access; - project_access = project_access.update().unwrap(); - return Ok(project_access); - } - if ProjectAccess::find(user.id, project.id).is_err() { - let result = diesel::insert_into(project_accesss::table) - .values(( - project_accesss::dsl::user_id.eq(user.id), - project_accesss::dsl::project_id.eq(project.id), - project_accesss::dsl::access_type.eq(access), - )) - .get_result(&db()); - let pa_project = project_accesss::dsl::project_accesss - .filter(project_accesss::dsl::project_id.eq(project.id)) - .get_results::(&db()) - .unwrap(); - if !result.is_err() { - let project_access = result.unwrap(); - return Ok(project_access); - } - } - Err(format!("Project_Access not created")) - } - - pub fn get_user(&self) -> Result { - let result = users::dsl::users - .filter(users::dsl::id.eq(&self.user_id)) - .get_result::(&db()); - if !result.is_err() { - let user = result.unwrap(); - return Ok(user); - } - Err(format!("User {} not found", self.user_id)) - } - - pub fn get_project(&self) -> Result { - let result = projects::dsl::projects - .filter(projects::dsl::id.eq(&self.project_id)) - .get_result::(&db()); - if !result.is_err() { - let project = result.unwrap(); - return Ok(project); - } - Err(format!("Project {} not found", self.project_id)) - } - - pub fn find(user_id: i32, project_id: i32) -> Result { - let result = project_accesss::dsl::project_accesss - .filter(project_accesss::dsl::user_id.eq(user_id)) - .filter(project_accesss::dsl::project_id.eq(project_id)) - .get_result::(&db()); - if !result.is_err() { - let project_access = result.unwrap(); - return Ok(project_access); - } - Err(format!("Project Access with project_id{} and user_id{} not found", project_id, user_id)) - } - - pub fn find_id(id: i32) -> Result { - let result = project_accesss::dsl::project_accesss - .filter(project_accesss::dsl::id.eq(id)) - .get_result::(&db()); - if !result.is_err() { - let project_access = result.unwrap(); - return Ok(project_access); - } - Err(format!("ProjectAccess {} not found", id)) - } - - pub fn update(self) -> Result { - let filter = project_accesss::dsl::project_accesss.filter(project_accesss::dsl::id.eq(self.id)); - let result = diesel::update(filter) - .set(( - project_accesss::dsl::user_id.eq(self.user_id), - project_accesss::dsl::project_id.eq(self.project_id), - project_accesss::dsl::access_type.eq(self.access_type), - )) - .get_result::(&db()); - if !result.is_err() { - let project_access = result.unwrap(); - return Ok(project_access); - } - Err(format!("ProjectAccess {} not update", self.id)) - } - - pub fn delete(self) -> Result { - let id = self.id.clone(); - let filter_pa = project_accesss::dsl::project_accesss.filter(project_accesss::dsl::id.eq(&id)); - let result_del_pa = diesel::delete(filter_pa) - .returning(project_accesss::dsl::id) - .get_result::(&db()); - if result_del_pa.is_err() { - return Err(format!("ProjectAccess cannot be deleted in db()")); - } - return Ok("ProjectAccess was deleted".to_string()); - } - - pub fn to_json(self) -> Value { - let mut project_access_value = json!(self); - project_access_value["user"] = json!(self.get_user().unwrap()); - project_access_value["project"] = json!(self.get_project().unwrap()); - project_access_value - } -} \ No newline at end of file diff --git a/src/schema.rs b/src/schema.rs index f5d7268..def4285 100644 --- a/src/schema.rs +++ b/src/schema.rs @@ -1,42 +1,5 @@ // @generated automatically by Diesel CLI. -diesel::table! { - entitys (id) { - id -> Int4, - project_id -> Int4, - name -> Varchar, - type_entity -> Int4, - data -> Text, - parent_id -> Nullable, - } -} - -diesel::table! { - project_accesss (id) { - id -> Int4, - user_id -> Int4, - project_id -> Int4, - access_type -> Int4, - } -} - -diesel::table! { - projects (id) { - id -> Int4, - creator_id -> Int4, - uuid -> Varchar, - name -> Varchar, - password -> Varchar, - time_limit -> Timestamp, - premium -> Int4, - is_public -> Bool, - image -> Varchar, - origin_filename -> Varchar, - description -> Text, - data -> Text, - } -} - diesel::table! { users (id) { id -> Int4, @@ -47,17 +10,6 @@ diesel::table! { email -> Varchar, google -> Varchar, email_valid -> Varchar, + data -> Text, } } - -diesel::joinable!(entitys -> projects (project_id)); -diesel::joinable!(project_accesss -> projects (project_id)); -diesel::joinable!(project_accesss -> users (user_id)); -diesel::joinable!(projects -> users (creator_id)); - -diesel::allow_tables_to_appear_in_same_query!( - entitys, - project_accesss, - projects, - users, -); diff --git a/src/util.rs b/src/util.rs index 919f5c5..b727fdd 100644 --- a/src/util.rs +++ b/src/util.rs @@ -375,7 +375,7 @@ pub fn envoye_un_mail(tmpl: &Data, template_name: &'static str, context: & let body = tmpl.render(template_name, context).unwrap(); let email = Message::builder() - .from("Site DrWhy ".parse().unwrap()) + .from("Site DrWhy ".parse().unwrap()) .to(format!("<{}>", email_adress).parse().unwrap()) .subject(subject) .multipart(MultiPart::alternative_plain_html( @@ -385,8 +385,8 @@ pub fn envoye_un_mail(tmpl: &Data, template_name: &'static str, context: & let sender = SmtpTransport::starttls_relay("ssl0.ovh.net").unwrap() .credentials(Credentials::new( - "noreply@imaplan.fr".to_string(), - "24rueduMoulin".to_string(), + "contact@sorlinv.fr".to_string(), + "Wqaxszcde123".to_string(), )) // .authentication(vec![Mechanism::Plain]) .pool_config(PoolConfig::new().max_size(20)) diff --git a/static/img/google.svg b/static/img/google.svg new file mode 100644 index 0000000..088288f --- /dev/null +++ b/static/img/google.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/logo.png b/static/img/logo.png new file mode 100644 index 0000000..7820e8a Binary files /dev/null and b/static/img/logo.png differ diff --git a/templates/base.html.twig b/templates/base.html.twig index 677d379..635b4d7 100755 --- a/templates/base.html.twig +++ b/templates/base.html.twig @@ -2,7 +2,6 @@ {% block title %}{% endblock title %} - DrWhy - {% block head %} {% include 'includecss.html.twig' %} {% endblock head %} @@ -10,6 +9,5 @@ {% block body %}{% endblock body %} {% block footer %}{% include 'includescript.html.twig' %}{% endblock footer %} - diff --git a/templates/forms/user/change_password.html.twig b/templates/forms/user/change_password.html.twig index d9fdbe6..96c3490 100644 --- a/templates/forms/user/change_password.html.twig +++ b/templates/forms/user/change_password.html.twig @@ -1,16 +1,12 @@
- {# Error message #} - {% if message_error is defined %}
{{ message_error }}
{% endif %} - {# Password #} -
- + {% if message_error is defined %}
{{ message_error }}
{% endif %} +
+
- {# Password again #} -
- +
+
- {# Submit button #} - + \ No newline at end of file diff --git a/templates/forms/user/forgotpassword.html.twig b/templates/forms/user/forgotpassword.html.twig index e2afcda..52cf03a 100644 --- a/templates/forms/user/forgotpassword.html.twig +++ b/templates/forms/user/forgotpassword.html.twig @@ -1,13 +1,9 @@
- {# Email #} -
- +
+
- {# Submit button #} - {# Forgot password #} Se connecter
- {# Register #} Créer un compte diff --git a/templates/forms/user/login.html.twig b/templates/forms/user/login.html.twig index 16813fc..179663b 100644 --- a/templates/forms/user/login.html.twig +++ b/templates/forms/user/login.html.twig @@ -1,43 +1,20 @@
- {% if message_login is defined %}
{{ message_login }}
{% endif %} - {# Email #} -
- + {% if message_login is defined %}
{{ message_login }}
{% endif %} +
+
- {# Password #} -
- +
+
- {# Error message #} - {# Submit button #} - - {# Forgot password #} - Mot de passe oublié ?
- {# Register #} - Créer un compte - {# Divider #} -
- {# Third party #} -

Ou

- {# Google #} +
-
- - {# GitHub #} - - + data-client_id="1041713159432-vad6qp7ce7p9iid9qjdiopi7n6ajvmtv.apps.googleusercontent.com" + data-login_uri="/auth" + data-auto_prompt="false" + >
+ + Mot de passe oublié ?
+ Créer un compte + \ No newline at end of file diff --git a/templates/forms/user/register.html.twig b/templates/forms/user/register.html.twig index 8f5ac29..6fa1bd0 100644 --- a/templates/forms/user/register.html.twig +++ b/templates/forms/user/register.html.twig @@ -1,78 +1,37 @@
{# Error message #} - {% if message_register is defined %}
{{ message_register }}
{% endif %} + {% if message_register is defined %}
{{ message_register }}
{% endif %} {# UserName #} -
- +
+
- {# Email #} -
- +
+
- {# Password #} -
- +
+
- {# Password again #} -
- +
+
- {# Image #} -
-