You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

routes.rs 4.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. use chrono::prelude::Local;
  2. use serde::{Deserialize, Serialize};
  3. use tera::{Context, Tera};
  4. use tide::http::mime;
  5. use tide::{Redirect, Request, Response, Result, StatusCode};
  6. use uuid::Uuid;
  7. use std::env;
  8. use crate::{fs, post::Post};
  9. #[derive(Debug, Serialize, Deserialize)]
  10. struct User {
  11. username: String,
  12. password: String,
  13. }
  14. pub async fn index(req: Request<()>) -> Result {
  15. let posts: Vec<Post> = fs::get_all_posts().await?;
  16. let mut context = Context::new();
  17. context.insert("posts", &posts);
  18. let logged_in: bool = req.session().get("logged_in").unwrap_or(false);
  19. context.insert("logged_in", &logged_in);
  20. render_response("index.html", &context)
  21. }
  22. pub async fn single_post(req: Request<()>) -> Result {
  23. let mut context = Context::new();
  24. let logged_in: bool = req.session().get("logged_in").unwrap_or(false);
  25. context.insert("logged_in", &logged_in);
  26. let post_id = req.param("id")?;
  27. let post = fs::get_one_post(post_id).await?;
  28. context.insert("post", &post);
  29. render_response("single.html", &context)
  30. }
  31. pub async fn edit_post(req: Request<()>) -> Result {
  32. let logged_in: bool = req.session().get("logged_in").unwrap_or(false);
  33. let mut context = Context::new();
  34. context.insert("logged_in", &logged_in);
  35. let post_id = req.param("id")?;
  36. let mut post = fs::get_one_post(post_id).await?;
  37. post.body = post.body.replace("<br>", "\n");
  38. context.insert("post", &post);
  39. render_response("edit.html", &context)
  40. }
  41. pub async fn create_post(mut req: Request<()>) -> Result {
  42. let mut post: Post = req.body_form().await?;
  43. post.id = Uuid::new_v4().to_string();
  44. post.date = Local::now().date().naive_local().to_string();
  45. post.body = post.body.trim().to_owned();
  46. post.save().await?;
  47. Ok(Redirect::new("/").into())
  48. }
  49. pub async fn update_post(mut req: Request<()>) -> Result {
  50. let mut post: Post = req.body_form().await?;
  51. post.save().await?;
  52. Ok(Redirect::new(format!("/posts/{}", post.id)).into())
  53. }
  54. pub async fn delete_post(req: Request<()>) -> Result {
  55. let id: String = req.param("id")?;
  56. fs::delete_post(id)?;
  57. let mut res = Response::new(tide::StatusCode::Ok);
  58. res.set_body("{\"success\": \"true\"}");
  59. res.set_content_type(mime::JSON);
  60. Ok(res)
  61. }
  62. pub async fn login_page(mut req: Request<()>) -> Result {
  63. let mut context = Context::new();
  64. let logged_in: bool = req.session().get("logged_in").unwrap_or(false);
  65. context.insert("logged_in", &logged_in);
  66. match req.session_mut().get::<String>("flash_error") {
  67. Some(error) => {
  68. req.session_mut().remove("flash_error");
  69. &context.insert("error", &error);
  70. }
  71. None => {}
  72. }
  73. render_response("login.html", &context)
  74. }
  75. pub async fn login(mut req: Request<()>) -> Result {
  76. let logged_in: bool = req.session().get("logged_in").unwrap_or(false);
  77. if logged_in {
  78. return Ok(Redirect::new("/").into());
  79. }
  80. let username = env::var("ADMIN_USERNAME")?;
  81. let password = env::var("ADMIN_PASSWORD")?;
  82. let user: User = req.body_form().await?;
  83. if user.username == username && user.password == password {
  84. req.session_mut().remove("logged_in");
  85. req.session_mut().insert("logged_in", true)?;
  86. Ok(Redirect::new("/").into())
  87. } else {
  88. req.session_mut().remove("logged_in");
  89. req.session_mut()
  90. .insert("flash_error", "Invalid credentials")?;
  91. Ok(Redirect::new("/login").into())
  92. }
  93. }
  94. pub async fn logout(mut req: Request<()>) -> Result {
  95. req.session_mut().remove("logged_in");
  96. req.session_mut().insert("logged_in", false)?;
  97. Ok(Redirect::new("/").into())
  98. }
  99. pub fn render_response(template: &str, context: &Context) -> Result<Response> {
  100. let html = render_template(template, context)?;
  101. let mut res = Response::new(StatusCode::Ok);
  102. res.set_body(html);
  103. res.set_content_type(mime::HTML);
  104. Ok(res)
  105. }
  106. pub fn render_template(template: &str, context: &Context) -> Result<String> {
  107. let tera = Tera::new("templates/**/*.html")?;
  108. let html = tera.render(template, &context)?;
  109. Ok(html)
  110. }