From bc9a0de90f0463b59e69e6bb2f2e75f3c29062e5 Mon Sep 17 00:00:00 2001 From: Santo Cariotti Date: Wed, 17 Mar 2021 09:15:15 +0100 Subject: feat: add commit models and get all of them --- src/commit/routes.rs | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/commit/routes.rs (limited to 'src/commit/routes.rs') diff --git a/src/commit/routes.rs b/src/commit/routes.rs new file mode 100644 index 0000000..bf04108 --- /dev/null +++ b/src/commit/routes.rs @@ -0,0 +1,28 @@ +use crate::commit::models::Commit; +use crate::config::AppState; +use crate::errors::AppErrorResponse; + +use actix_web::{web, HttpResponse, Responder}; +use slog::info; + +/// Endpoint used for getting all commits +async fn index(state: web::Data) -> impl Responder { + info!(state.log, "GET /commit/"); + let result = Commit::find_all(state.pool.clone()).await; + + match result { + Ok(commits) => HttpResponse::Ok().json(commits), + _ => HttpResponse::BadRequest().json(AppErrorResponse { + detail: "Error trying to read all commits from database" + .to_string(), + }), + } +} + +/// Routes for commits +pub fn config(cfg: &mut web::ServiceConfig) { + cfg.service( + web::scope("/commit") + .service(web::resource("{_:/?}").route(web::get().to(index))), + ); +} -- cgit v1.2.3-18-g5258 From 07b052797e273d4a85f2316e7ef9ca8677595dd1 Mon Sep 17 00:00:00 2001 From: Santo Cariotti Date: Wed, 17 Mar 2021 09:57:56 +0100 Subject: feat: get commit by hash --- src/commit/routes.rs | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) (limited to 'src/commit/routes.rs') diff --git a/src/commit/routes.rs b/src/commit/routes.rs index bf04108..1b73c4f 100644 --- a/src/commit/routes.rs +++ b/src/commit/routes.rs @@ -19,10 +19,28 @@ async fn index(state: web::Data) -> impl Responder { } } +// Endpoint used for getting one commit +async fn get_commit( + state: web::Data, + hash: web::Path<(String,)>, +) -> impl Responder { + info!(state.log, "GET /commit/{}/", &hash.0); + + let result = Commit::find(state.pool.clone(), hash.0.clone()).await; + + result + .map(|commit| HttpResponse::Ok().json(commit)) + .map_err(|e| e) +} + /// Routes for commits pub fn config(cfg: &mut web::ServiceConfig) { cfg.service( web::scope("/commit") - .service(web::resource("{_:/?}").route(web::get().to(index))), + .service(web::resource("{_:/?}").route(web::get().to(index))) + .service( + web::resource("/{hash}{_:/?}") + .route(web::get().to(get_commit)), + ), ); } -- cgit v1.2.3-18-g5258 From 904c7e40a2d092eea87ca6d9ea80edce8a2aad2a Mon Sep 17 00:00:00 2001 From: Santo Cariotti Date: Wed, 17 Mar 2021 14:14:46 +0100 Subject: feat: add delete commit endpoint --- src/commit/routes.rs | 46 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 42 insertions(+), 4 deletions(-) (limited to 'src/commit/routes.rs') diff --git a/src/commit/routes.rs b/src/commit/routes.rs index 1b73c4f..e49f698 100644 --- a/src/commit/routes.rs +++ b/src/commit/routes.rs @@ -1,9 +1,10 @@ use crate::commit::models::Commit; use crate::config::AppState; -use crate::errors::AppErrorResponse; - -use actix_web::{web, HttpResponse, Responder}; +use crate::errors::{AppError, AppErrorResponse, AppErrorType}; +use actix_web::http::header; +use actix_web::{web, HttpRequest, HttpResponse, Responder}; use slog::info; +use std::env; /// Endpoint used for getting all commits async fn index(state: web::Data) -> impl Responder { @@ -33,6 +34,42 @@ async fn get_commit( .map_err(|e| e) } +/// Endpoint used for delete commitsitory. +/// It uses a SECRET_KEY used like an API key +async fn delete_commit( + req: HttpRequest, + state: web::Data, + hash: web::Path<(String,)>, +) -> impl Responder { + match req.headers().get(header::AUTHORIZATION) { + Some(x) + if x.to_str().unwrap() + != env::var("SECRET_KEY").unwrap_or("".to_string()) => + { + info!(state.log, "DELETE /commit/{}/ 401", &hash.0); + return Err(AppError { + error_type: AppErrorType::AuthorizationError, + message: Some( + "You must provide a valid Authorization".to_string(), + ), + cause: None, + }); + } + Some(_) => {} + None => { + info!(state.log, "DELETE /commit/{}/ 400", &hash.0); + return Ok(HttpResponse::BadRequest().body("")); + } + }; + + let result = Commit::delete(state.pool.clone(), &hash.0).await; + info!(state.log, "DELETE /commit/{}/", &hash.0); + + result + .map(|_| HttpResponse::NoContent().body("")) + .map_err(|e| e) +} + /// Routes for commits pub fn config(cfg: &mut web::ServiceConfig) { cfg.service( @@ -40,7 +77,8 @@ pub fn config(cfg: &mut web::ServiceConfig) { .service(web::resource("{_:/?}").route(web::get().to(index))) .service( web::resource("/{hash}{_:/?}") - .route(web::get().to(get_commit)), + .route(web::get().to(get_commit)) + .route(web::delete().to(delete_commit)), ), ); } -- cgit v1.2.3-18-g5258