summaryrefslogtreecommitdiffstats
path: root/src/routes/model.rs
diff options
context:
space:
mode:
authorSanto Cariotti <santo@dcariotti.me>2022-10-03 18:24:38 +0000
committerSanto Cariotti <santo@dcariotti.me>2022-10-03 18:24:38 +0000
commitc1f61c458e0e97586796a3acdbd21aedf8b2e8ad (patch)
tree35d2aea0e2ce7eda52f5f519ae0dec6ab8b5c1b2 /src/routes/model.rs
parent1d559a116a51140a4f13450fbed896b1929de5c0 (diff)
Likes model and them to a model
Diffstat (limited to 'src/routes/model.rs')
-rw-r--r--src/routes/model.rs44
1 files changed, 44 insertions, 0 deletions
diff --git a/src/routes/model.rs b/src/routes/model.rs
index 9242c31..d72d7af 100644
--- a/src/routes/model.rs
+++ b/src/routes/model.rs
@@ -3,6 +3,7 @@ use crate::{
files::{delete_upload, upload},
models::{
auth::Claims,
+ likes::Like,
model::{Model, ModelCreate, ModelUpload, ModelUser},
user::User,
},
@@ -21,6 +22,7 @@ pub fn create_route() -> Router {
Router::new()
.route("/", get(list_models).post(create_model))
.route("/:id", get(get_model).delete(delete_model).put(edit_model))
+ .route("/:id/like", post(add_like).delete(delete_like))
.route("/:id/upload", post(upload_model_file))
.route("/:id/upload/:uid", delete(delete_model_file))
}
@@ -207,3 +209,45 @@ async fn delete_model_file(
Err(e) => Err(e),
}
}
+
+/// Assign a like to a model from the Authorization user
+async fn add_like(claims: Claims, Path(model_id): Path<i32>) -> Result<StatusCode, AppError> {
+ let model = match Model::find_by_id(model_id).await {
+ Ok(model) => model,
+ Err(_) => {
+ return Err(AppError::NotFound("Model not found".to_string()));
+ }
+ };
+
+ let user = User::find_by_id(claims.user_id).await?;
+
+ let like = Like::new(user.id, model.id);
+
+ match like.save().await {
+ Ok(_) => Ok(StatusCode::CREATED),
+ Err(e) => {
+ return Err(e);
+ }
+ }
+}
+
+/// Remove a like from a model and an Authorization user
+async fn delete_like(claims: Claims, Path(model_id): Path<i32>) -> Result<StatusCode, AppError> {
+ let model = match Model::find_by_id(model_id).await {
+ Ok(model) => model,
+ Err(_) => {
+ return Err(AppError::NotFound("Model not found".to_string()));
+ }
+ };
+
+ let user = User::find_by_id(claims.user_id).await?;
+
+ let like = Like::new(user.id, model.id);
+
+ match like.remove().await {
+ Ok(_) => Ok(StatusCode::NO_CONTENT),
+ Err(e) => {
+ return Err(e);
+ }
+ }
+}