handler config
This commit is contained in:
parent
5c8f6c1ba9
commit
52a6f06f11
|
@ -0,0 +1 @@
|
||||||
|
-- This file should undo anything in `up.sql`
|
|
@ -0,0 +1,16 @@
|
||||||
|
CREATE TABLE IF NOT EXISTS handler_config
|
||||||
|
( key_name VARCHAR NOT NULL
|
||||||
|
, value_contents VARCHAR NOT NULL
|
||||||
|
, handler_id UUID NOT NULL
|
||||||
|
, created_at TIMESTAMP NOT NULL DEFAULT NOW()
|
||||||
|
, updated_at TIMESTAMP NOT NULL DEFAULT NOW()
|
||||||
|
, PRIMARY KEY (key_name, handler_id)
|
||||||
|
, CONSTRAINT fk_handler_id
|
||||||
|
FOREIGN KEY (handler_id)
|
||||||
|
REFERENCES handlers(id)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TRIGGER set_timestamp_handler_config
|
||||||
|
BEFORE UPDATE ON handler_config
|
||||||
|
FOR EACH ROW
|
||||||
|
EXECUTE PROCEDURE trigger_set_timestamp();
|
|
@ -3,6 +3,7 @@ use crate::{models, schema, MainDatabase};
|
||||||
use chrono::prelude::*;
|
use chrono::prelude::*;
|
||||||
use diesel::prelude::*;
|
use diesel::prelude::*;
|
||||||
use rocket_contrib::{json::Json, uuid::Uuid};
|
use rocket_contrib::{json::Json, uuid::Uuid};
|
||||||
|
use schema::handlers::dsl::*;
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
|
|
||||||
#[derive(Debug, Eq, PartialEq, Deserialize)]
|
#[derive(Debug, Eq, PartialEq, Deserialize)]
|
||||||
|
@ -38,8 +39,6 @@ pub fn create(
|
||||||
#[instrument(skip(conn), err)]
|
#[instrument(skip(conn), err)]
|
||||||
#[get("/handler")]
|
#[get("/handler")]
|
||||||
pub fn list(user: models::User, conn: MainDatabase) -> Result<Json<Vec<models::Handler>>> {
|
pub fn list(user: models::User, conn: MainDatabase) -> Result<Json<Vec<models::Handler>>> {
|
||||||
use schema::handlers::dsl::*;
|
|
||||||
|
|
||||||
Ok(Json(
|
Ok(Json(
|
||||||
handlers
|
handlers
|
||||||
.filter(user_id.eq(user.id))
|
.filter(user_id.eq(user.id))
|
||||||
|
@ -51,7 +50,6 @@ pub fn list(user: models::User, conn: MainDatabase) -> Result<Json<Vec<models::H
|
||||||
#[instrument(skip(conn), err)]
|
#[instrument(skip(conn), err)]
|
||||||
#[get("/handler/<uuid>")]
|
#[get("/handler/<uuid>")]
|
||||||
pub fn get(user: models::User, uuid: Uuid, conn: MainDatabase) -> Result<Json<models::Handler>> {
|
pub fn get(user: models::User, uuid: Uuid, conn: MainDatabase) -> Result<Json<models::Handler>> {
|
||||||
use schema::handlers::dsl::*;
|
|
||||||
let uuid = uuid.into_inner();
|
let uuid = uuid.into_inner();
|
||||||
let handler = handlers
|
let handler = handlers
|
||||||
.find(uuid)
|
.find(uuid)
|
||||||
|
@ -68,7 +66,6 @@ pub fn get(user: models::User, uuid: Uuid, conn: MainDatabase) -> Result<Json<mo
|
||||||
#[instrument(skip(conn), err)]
|
#[instrument(skip(conn), err)]
|
||||||
#[delete("/handler/<uuid>")]
|
#[delete("/handler/<uuid>")]
|
||||||
pub fn delete(user: models::User, uuid: Uuid, conn: MainDatabase) -> Result {
|
pub fn delete(user: models::User, uuid: Uuid, conn: MainDatabase) -> Result {
|
||||||
use schema::handlers::dsl::*;
|
|
||||||
let uuid = uuid.into_inner();
|
let uuid = uuid.into_inner();
|
||||||
|
|
||||||
let hdl: models::Handler = handlers
|
let hdl: models::Handler = handlers
|
||||||
|
@ -86,3 +83,78 @@ pub fn delete(user: models::User, uuid: Uuid, conn: MainDatabase) -> Result {
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[instrument(skip(conn), err)]
|
||||||
|
#[get("/handler/<handler_id_str>/config")]
|
||||||
|
pub fn get_config(
|
||||||
|
user: models::User,
|
||||||
|
handler_id_str: Uuid,
|
||||||
|
conn: MainDatabase,
|
||||||
|
) -> Result<Json<Vec<models::HandlerConfig>>> {
|
||||||
|
let uuid = handler_id_str.into_inner();
|
||||||
|
{
|
||||||
|
use schema::handler_config::dsl::{handler_config, handler_id};
|
||||||
|
|
||||||
|
let handler = handlers
|
||||||
|
.find(uuid)
|
||||||
|
.get_result::<models::Handler>(&*conn)
|
||||||
|
.map_err(Error::Database)?;
|
||||||
|
|
||||||
|
if handler.user_id != user.id {
|
||||||
|
return Err(Error::LackPermissions);
|
||||||
|
}
|
||||||
|
|
||||||
|
let config = handler_config
|
||||||
|
.filter(handler_id.eq(handler.id))
|
||||||
|
.load::<models::HandlerConfig>(&*conn)
|
||||||
|
.map_err(Error::Database)?;
|
||||||
|
|
||||||
|
Ok(Json(config))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize, Debug, Clone)]
|
||||||
|
pub struct Cfg {
|
||||||
|
pub key: String,
|
||||||
|
pub value: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[instrument(skip(conn, cfg), err)]
|
||||||
|
#[post("/handler/<handler_id_str>/config", format = "json", data = "<cfg>")]
|
||||||
|
pub fn create_config(
|
||||||
|
user: models::User,
|
||||||
|
handler_id_str: Uuid,
|
||||||
|
cfg: Json<Vec<Cfg>>,
|
||||||
|
conn: MainDatabase,
|
||||||
|
) -> Result {
|
||||||
|
use schema::handler_config::table;
|
||||||
|
let uuid = handler_id_str.into_inner();
|
||||||
|
|
||||||
|
let handler = handlers
|
||||||
|
.find(uuid)
|
||||||
|
.get_result::<models::Handler>(&*conn)
|
||||||
|
.map_err(Error::Database)?;
|
||||||
|
|
||||||
|
if handler.user_id != user.id {
|
||||||
|
return Err(Error::LackPermissions);
|
||||||
|
}
|
||||||
|
|
||||||
|
let cfg: Vec<models::NewHandlerConfig> = cfg
|
||||||
|
.into_inner()
|
||||||
|
.iter()
|
||||||
|
.map(|kv| models::NewHandlerConfig {
|
||||||
|
key_name: kv.key.clone(),
|
||||||
|
value_contents: kv.value.clone(),
|
||||||
|
handler_id: handler.id.clone(),
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
diesel::insert_into(table)
|
||||||
|
.values(&cfg)
|
||||||
|
.get_result::<models::HandlerConfig>(&*conn)
|
||||||
|
.map_err(Error::Database)?;
|
||||||
|
|
||||||
|
let _ = cfg.iter().inspect(|kv| info!(name = kv.key_name.as_str(), "config created"));
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
|
@ -44,6 +44,8 @@ fn main() -> Result<()> {
|
||||||
api::handler::list,
|
api::handler::list,
|
||||||
api::handler::get,
|
api::handler::get,
|
||||||
api::handler::delete,
|
api::handler::delete,
|
||||||
|
api::handler::get_config,
|
||||||
|
api::handler::create_config,
|
||||||
api::user::whoami,
|
api::user::whoami,
|
||||||
api::user::get,
|
api::user::get,
|
||||||
api::token::list,
|
api::token::list,
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use crate::schema::{gitea_tokens, handlers, tokens, users};
|
use crate::schema::*;
|
||||||
use chrono::NaiveDateTime;
|
use chrono::NaiveDateTime;
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
|
@ -85,3 +85,20 @@ pub struct Handler {
|
||||||
pub updated_at: NaiveDateTime,
|
pub updated_at: NaiveDateTime,
|
||||||
pub deleted_at: Option<NaiveDateTime>,
|
pub deleted_at: Option<NaiveDateTime>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Insertable)]
|
||||||
|
#[table_name = "handler_config"]
|
||||||
|
pub struct NewHandlerConfig {
|
||||||
|
pub key_name: String,
|
||||||
|
pub value_contents: String,
|
||||||
|
pub handler_id: Uuid,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Queryable, Debug, Clone, Serialize)]
|
||||||
|
pub struct HandlerConfig {
|
||||||
|
pub key_name: String,
|
||||||
|
pub value_contents: String,
|
||||||
|
pub handler_id: Uuid,
|
||||||
|
pub created_at: NaiveDateTime,
|
||||||
|
pub updated_at: NaiveDateTime,
|
||||||
|
}
|
||||||
|
|
|
@ -9,6 +9,16 @@ table! {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
table! {
|
||||||
|
handler_config (key_name, handler_id) {
|
||||||
|
key_name -> Varchar,
|
||||||
|
value_contents -> Varchar,
|
||||||
|
handler_id -> Uuid,
|
||||||
|
created_at -> Timestamp,
|
||||||
|
updated_at -> Timestamp,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
table! {
|
table! {
|
||||||
handlers (id) {
|
handlers (id) {
|
||||||
id -> Uuid,
|
id -> Uuid,
|
||||||
|
@ -45,8 +55,11 @@ table! {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
joinable!(handler_config -> handlers (handler_id));
|
||||||
|
|
||||||
allow_tables_to_appear_in_same_query!(
|
allow_tables_to_appear_in_same_query!(
|
||||||
gitea_tokens,
|
gitea_tokens,
|
||||||
|
handler_config,
|
||||||
handlers,
|
handlers,
|
||||||
tokens,
|
tokens,
|
||||||
users,
|
users,
|
||||||
|
|
Loading…
Reference in New Issue