tag2upload_service_manager/
api_routes.rs

1
2use crate::prelude::*;
3
4use rocket::serde::json::Json;
5
6//---------- /hook/gitlab ----------
7
8/// The path based in the public name of the kind of forge
9///
10/// This is baked into the configs of all the webhooks
11#[rocket::post("/hook/gitlab", data="<payload>")]
12async fn hook_gitlab(
13    payload: RoutePayloadParameter<gitlab::Forge2>,
14) -> Result<String, WebError> {
15    payload.webhook_impl().await
16}
17
18//---------- /internal/db-schema/* ----------
19
20#[rocket::get("/internal/db-schema/schema-intended")]
21async fn db_schema_schema_intended(
22    vhost: ui_vhost::UiResult,
23) -> Result<&'static str, WebError> {
24    static MEMO: OnceLock<String> = OnceLock::new();
25    vhost.check(WE::PageNotFoundHere)?;
26    let s = MEMO.get_or_init(|| db_schema::schema());
27    Ok(s)
28}
29
30#[derive(Serialize, Debug)]
31pub struct SchemaVersionApiResponse {
32    pub stored: SchemaVersion,
33    pub intended: SchemaVersion,
34}
35
36#[rocket::get("/internal/db-schema/version")]
37async fn db_schema_version(
38    vhost: ui_vhost::UiResult,
39) -> Result<Json<SchemaVersionApiResponse>, WebError> {
40    vhost.check(WE::PageNotFoundHere)?;
41    let resp = db_transaction(TransactionNature::Readonly, |dbt| {
42        let intended = db_schema::SCHEMA_VERSION;
43        let stored = db_support::get_user_version(&dbt)
44            .map_err(DbError::Sql)?;
45        Ok(SchemaVersionApiResponse {
46            stored,
47            intended,
48        })
49    })?;
50    Ok(Json(resp))
51}
52
53//---------- inventory ----------
54
55pub fn mount_api(rocket: RocketBuild) -> RocketBuild {
56    rocket.mount("/", rocket::routes![
57        db_schema_schema_intended,
58        db_schema_version,
59        hook_gitlab,
60    ])
61}