FavoritesDao for querying, adding and removing favorites
This commit is contained in:
76
src/main.rs
76
src/main.rs
@@ -3,7 +3,7 @@ extern crate diesel;
|
||||
extern crate rayon;
|
||||
|
||||
use crate::auth::login;
|
||||
use database::{SqliteUserDao, UserDao};
|
||||
use database::{DbError, DbErrorKind, FavoriteDao, SqliteFavoriteDao, SqliteUserDao, UserDao};
|
||||
use futures::stream::StreamExt;
|
||||
use std::io::prelude::*;
|
||||
use std::path::{Path, PathBuf};
|
||||
@@ -15,7 +15,9 @@ use actix::{Actor, Addr};
|
||||
use actix_files::NamedFile;
|
||||
use actix_multipart as mp;
|
||||
use actix_web::{
|
||||
get, post,
|
||||
delete,
|
||||
error::BlockingError,
|
||||
get, post, put,
|
||||
web::{self, BufMut, BytesMut},
|
||||
App, HttpServer, Responder,
|
||||
};
|
||||
@@ -31,7 +33,6 @@ use data::{AddFavoriteRequest, ThumbnailRequest};
|
||||
use log::{debug, error, info};
|
||||
|
||||
use crate::data::Claims;
|
||||
use crate::database::{add_favorite, get_favorites};
|
||||
use crate::files::{is_image_or_video, is_valid_path, list_files};
|
||||
use crate::video::*;
|
||||
|
||||
@@ -216,13 +217,17 @@ async fn get_video_part(
|
||||
}
|
||||
|
||||
#[get("image/favorites")]
|
||||
async fn favorites(claims: Claims) -> impl Responder {
|
||||
let favorites = web::block(move || get_favorites(claims.sub.parse::<i32>().unwrap()))
|
||||
.await
|
||||
.unwrap()
|
||||
.into_iter()
|
||||
.map(|favorite| favorite.path)
|
||||
.collect::<Vec<String>>();
|
||||
async fn favorites(
|
||||
claims: Claims,
|
||||
favorites_dao: web::Data<Box<dyn FavoriteDao>>,
|
||||
) -> impl Responder {
|
||||
let favorites =
|
||||
web::block(move || favorites_dao.get_favorites(claims.sub.parse::<i32>().unwrap()))
|
||||
.await
|
||||
.unwrap()
|
||||
.into_iter()
|
||||
.map(|favorite| favorite.path)
|
||||
.collect::<Vec<String>>();
|
||||
|
||||
HttpResponse::Ok().json(PhotosResponse {
|
||||
photos: &favorites,
|
||||
@@ -230,17 +235,55 @@ async fn favorites(claims: Claims) -> impl Responder {
|
||||
})
|
||||
}
|
||||
|
||||
#[post("image/favorites")]
|
||||
async fn post_add_favorite(claims: Claims, body: web::Json<AddFavoriteRequest>) -> impl Responder {
|
||||
#[put("image/favorites")]
|
||||
async fn put_add_favorite(
|
||||
claims: Claims,
|
||||
body: web::Json<AddFavoriteRequest>,
|
||||
favorites_dao: web::Data<Box<dyn FavoriteDao>>,
|
||||
) -> impl Responder {
|
||||
if let Ok(user_id) = claims.sub.parse::<i32>() {
|
||||
let path = body.path.clone();
|
||||
match web::block::<_, usize, DbError>(move || favorites_dao.add_favorite(user_id, &path))
|
||||
.await
|
||||
{
|
||||
Err(BlockingError::Error(e)) if e.kind == DbErrorKind::AlreadyExists => {
|
||||
debug!("Favorite: {} exists for user: {}", &body.path, user_id);
|
||||
HttpResponse::Ok()
|
||||
}
|
||||
Err(e) => {
|
||||
info!("{:?} {}. for user: {}", e, body.path, user_id);
|
||||
HttpResponse::BadRequest()
|
||||
}
|
||||
Ok(_) => {
|
||||
debug!("Adding favorite \"{}\" for userid: {}", body.path, user_id);
|
||||
HttpResponse::Created()
|
||||
}
|
||||
}
|
||||
} else {
|
||||
error!("Unable to parse sub as i32: {}", claims.sub);
|
||||
HttpResponse::BadRequest()
|
||||
}
|
||||
}
|
||||
|
||||
#[delete("image/favorites")]
|
||||
async fn delete_favorite(
|
||||
claims: Claims,
|
||||
body: web::Query<AddFavoriteRequest>,
|
||||
favorites_dao: web::Data<Box<dyn FavoriteDao>>,
|
||||
) -> impl Responder {
|
||||
if let Ok(user_id) = claims.sub.parse::<i32>() {
|
||||
let path = body.path.clone();
|
||||
web::block::<_, _, String>(move || {
|
||||
add_favorite(user_id, path);
|
||||
favorites_dao.remove_favorite(user_id, path);
|
||||
Ok(())
|
||||
})
|
||||
.await
|
||||
.unwrap();
|
||||
debug!("Adding favorite \"{}\" for userid: {}", body.path, user_id);
|
||||
|
||||
debug!(
|
||||
"Removing favorite \"{}\" for userid: {}",
|
||||
body.path, user_id
|
||||
);
|
||||
HttpResponse::Ok()
|
||||
} else {
|
||||
error!("Unable to parse sub as i32: {}", claims.sub);
|
||||
@@ -367,6 +410,7 @@ fn main() -> std::io::Result<()> {
|
||||
|
||||
HttpServer::new(move || {
|
||||
let user_dao = SqliteUserDao::new();
|
||||
let favorites_dao = SqliteFavoriteDao::new();
|
||||
App::new()
|
||||
.wrap(middleware::Logger::default())
|
||||
.service(web::resource("/login").route(web::post().to(login)))
|
||||
@@ -377,9 +421,11 @@ fn main() -> std::io::Result<()> {
|
||||
.service(stream_video)
|
||||
.service(get_video_part)
|
||||
.service(favorites)
|
||||
.service(post_add_favorite)
|
||||
.service(put_add_favorite)
|
||||
.service(delete_favorite)
|
||||
.app_data(app_data.clone())
|
||||
.data::<Box<dyn UserDao>>(Box::new(user_dao))
|
||||
.data::<Box<dyn FavoriteDao>>(Box::new(favorites_dao))
|
||||
})
|
||||
.bind(dotenv::var("BIND_URL").unwrap())?
|
||||
.bind("localhost:8088")?
|
||||
|
||||
Reference in New Issue
Block a user