feat: API endpoints to schedule and post results
This commit is contained in:
parent
438fe46d58
commit
eb870acdb0
3 changed files with 157 additions and 0 deletions
5
src/api/mod.rs
Normal file
5
src/api/mod.rs
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
// SPDX-FileCopyrightText: 2023 Aravinth Manivannan <realaravinth@batsense.net>
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
|
pub mod v1;
|
9
src/api/v1/mod.rs
Normal file
9
src/api/v1/mod.rs
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
// SPDX-FileCopyrightText: 2023 Aravinth Manivannan <realaravinth@batsense.net>
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
|
pub mod webhooks;
|
||||||
|
|
||||||
|
pub fn services(cfg: &mut actix_web::web::ServiceConfig) {
|
||||||
|
webhooks::services(cfg);
|
||||||
|
}
|
143
src/api/v1/webhooks.rs
Normal file
143
src/api/v1/webhooks.rs
Normal file
|
@ -0,0 +1,143 @@
|
||||||
|
// SPDX-FileCopyrightText: 2023 Aravinth Manivannan <realaravinth@batsense.net>
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
|
use crate::complaince::result::Result as CResult;
|
||||||
|
use crate::errors::*;
|
||||||
|
use crate::AppCtx;
|
||||||
|
use actix_web::{web, HttpResponse, Responder};
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
|
pub mod routes {
|
||||||
|
pub struct Tests {
|
||||||
|
pub init: &'static str,
|
||||||
|
pub results: &'static str,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Tests {
|
||||||
|
pub const fn new() -> Self {
|
||||||
|
Self {
|
||||||
|
init: "/api/v1/init",
|
||||||
|
results: "/api/v1/{auth}/results",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const ROUTES: routes::Tests = routes::Tests::new();
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, Deserialize, Serialize)]
|
||||||
|
pub struct TestEvent {
|
||||||
|
pub commit: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[actix_web_codegen_const_routes::post(path = "ROUTES.results")]
|
||||||
|
async fn results(
|
||||||
|
payload: web::Json<CResult>,
|
||||||
|
auth: web::Path<String>,
|
||||||
|
ctx: AppCtx,
|
||||||
|
) -> ServiceResult<impl Responder> {
|
||||||
|
let auth = auth.into_inner();
|
||||||
|
{
|
||||||
|
let r = ctx.results.read().unwrap();
|
||||||
|
if r.get(&auth).is_none() {
|
||||||
|
return Err(ServiceError::WrongPassword);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let tx = {
|
||||||
|
let mut w = ctx.results.write().unwrap();
|
||||||
|
w.remove(&auth)
|
||||||
|
};
|
||||||
|
|
||||||
|
if let Some(tx) = tx {
|
||||||
|
tx.send(payload.into_inner()).await.unwrap();
|
||||||
|
}
|
||||||
|
Ok(HttpResponse::Ok())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[actix_web_codegen_const_routes::post(path = "ROUTES.init")]
|
||||||
|
async fn run_tests(payload: web::Json<TestEvent>, ctx: AppCtx) -> ServiceResult<impl Responder> {
|
||||||
|
ctx.db.add_job(&payload.commit).await?;
|
||||||
|
tracing::info!("Creating job for commit {}", payload.commit);
|
||||||
|
Ok(HttpResponse::Created())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn services(cfg: &mut web::ServiceConfig) {
|
||||||
|
cfg.service(run_tests);
|
||||||
|
cfg.service(results);
|
||||||
|
}
|
||||||
|
//
|
||||||
|
//#[cfg(test)]
|
||||||
|
//mod tests {
|
||||||
|
// use actix_web::{http::StatusCode, test};
|
||||||
|
//
|
||||||
|
// use crate::tests;
|
||||||
|
// use crate::*;
|
||||||
|
//
|
||||||
|
// use super::*;
|
||||||
|
//
|
||||||
|
// #[actix_rt::test]
|
||||||
|
// async fn deploy_update_works() {
|
||||||
|
// let (_dir, ctx) = tests::get_data().await;
|
||||||
|
// println!("[log] test configuration {:#?}", ctx.settings);
|
||||||
|
// let app = get_app!(ctx).await;
|
||||||
|
// let page = ctx.settings.pages.get(0);
|
||||||
|
// let page = page.unwrap();
|
||||||
|
//
|
||||||
|
// let mut payload = DeployEvent {
|
||||||
|
// secret: page.secret.clone(),
|
||||||
|
// branch: page.branch.clone(),
|
||||||
|
// };
|
||||||
|
//
|
||||||
|
// let resp = test::call_service(
|
||||||
|
// &app,
|
||||||
|
// post_request!(&payload, V1_API_ROUTES.deploy.update).to_request(),
|
||||||
|
// )
|
||||||
|
// .await;
|
||||||
|
// check_status!(resp, StatusCode::OK);
|
||||||
|
//
|
||||||
|
// payload.secret = page.branch.clone();
|
||||||
|
//
|
||||||
|
// let resp = test::call_service(
|
||||||
|
// &app,
|
||||||
|
// post_request!(&payload, V1_API_ROUTES.deploy.update).to_request(),
|
||||||
|
// )
|
||||||
|
// .await;
|
||||||
|
// check_status!(resp, StatusCode::NOT_FOUND);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// #[actix_rt::test]
|
||||||
|
// async fn deploy_info_works() {
|
||||||
|
// let (_dir, ctx) = tests::get_data().await;
|
||||||
|
// println!("[log] test configuration {:#?}", ctx.settings);
|
||||||
|
// let page = ctx.settings.pages.get(0);
|
||||||
|
// let page = page.unwrap();
|
||||||
|
// let app = get_app!(ctx).await;
|
||||||
|
//
|
||||||
|
// let mut payload = DeploySecret {
|
||||||
|
// secret: page.secret.clone(),
|
||||||
|
// };
|
||||||
|
//
|
||||||
|
// let resp = test::call_service(
|
||||||
|
// &app,
|
||||||
|
// post_request!(&payload, V1_API_ROUTES.deploy.info).to_request(),
|
||||||
|
// )
|
||||||
|
// .await;
|
||||||
|
//
|
||||||
|
// check_status!(resp, StatusCode::OK);
|
||||||
|
//
|
||||||
|
// let response: DeployInfo = actix_web::test::read_body_json(resp).await;
|
||||||
|
// assert_eq!(response.head, page.branch);
|
||||||
|
// assert_eq!(response.remote, page.repo);
|
||||||
|
//
|
||||||
|
// payload.secret = page.branch.clone();
|
||||||
|
//
|
||||||
|
// let resp = test::call_service(
|
||||||
|
// &app,
|
||||||
|
// post_request!(&payload, V1_API_ROUTES.deploy.info).to_request(),
|
||||||
|
// )
|
||||||
|
// .await;
|
||||||
|
// check_status!(resp, StatusCode::NOT_FOUND);
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
//
|
Loading…
Reference in a new issue