outline functions on state to work with procedures

This commit is contained in:
beckerinj
2022-12-15 00:24:57 -05:00
parent b92111c7c2
commit 7719c17227
13 changed files with 153 additions and 44 deletions

View File

@@ -89,9 +89,7 @@ fn default_repo_dir() -> String {
"/repos".to_string()
}
#[derive(
Serialize, Deserialize, Debug, Display, EnumString, PartialEq, Hash, Eq, Clone, Copy,
)]
#[derive(Serialize, Deserialize, Debug, Display, EnumString, PartialEq, Hash, Eq, Clone, Copy)]
pub enum RestartMode {
#[serde(rename = "no")]
#[strum(serialize = "no")]

View File

@@ -74,14 +74,14 @@ impl State {
pub async fn create_full_build(
&self,
mut full_build: Build,
mut build: Build,
user: &RequestUser,
) -> anyhow::Result<Build> {
let build = self
.create_build(&full_build.name, full_build.server_id.clone(), user)
.await?;
full_build.id = build.id;
let build = self.update_build(full_build, user).await?;
build.id = self
.create_build(&build.name, build.server_id.clone(), user)
.await?
.id;
let build = self.update_build(build, user).await?;
Ok(build)
}

View File

@@ -72,18 +72,18 @@ impl State {
pub async fn create_full_deployment(
&self,
mut full_deployment: Deployment,
mut deployment: Deployment,
user: &RequestUser,
) -> anyhow::Result<Deployment> {
let deployment = self
deployment.id = self
.create_deployment(
&full_deployment.name,
full_deployment.server_id.clone(),
&deployment.name,
deployment.server_id.clone(),
user,
)
.await?;
full_deployment.id = deployment.id;
let deployment = self.update_deployment(full_deployment, user).await?;
.await?
.id;
let deployment = self.update_deployment(deployment, user).await?;
Ok(deployment)
}

View File

@@ -5,6 +5,7 @@ use crate::state::State;
mod build;
mod deployment;
mod procedure;
mod server;
impl State {

View File

@@ -0,0 +1,69 @@
use anyhow::anyhow;
use types::{traits::Permissioned, PermissionLevel, Procedure, Update};
use crate::{auth::RequestUser, state::State};
impl State {
pub async fn get_procedure_check_permissions(
&self,
procedure_id: &str,
user: &RequestUser,
permission_level: PermissionLevel,
) -> anyhow::Result<Procedure> {
let procedure = self.db.get_procedure(procedure_id).await?;
let permissions = procedure.get_user_permissions(&user.id);
if user.is_admin || permissions >= permission_level {
Ok(procedure)
} else {
Err(anyhow!(
"user does not have required permissions on this procedure"
))
}
}
pub async fn create_procedure(
&self,
name: &str,
user: &RequestUser,
) -> anyhow::Result<Procedure> {
todo!()
}
pub async fn create_full_procedure(
&self,
mut full_procedure: Procedure,
user: &RequestUser,
) -> anyhow::Result<Procedure> {
let procedure = self.create_procedure(&full_procedure.name, user).await?;
full_procedure.id = procedure.id;
let procedure = self.update_procedure(full_procedure, user).await?;
Ok(procedure)
}
pub async fn delete_procedure(
&self,
id: &str,
user: &RequestUser,
) -> anyhow::Result<Procedure> {
todo!()
}
pub async fn update_procedure(
&self,
new_procedure: Procedure,
user: &RequestUser,
) -> anyhow::Result<Procedure> {
let current_procedure = self
.get_procedure_check_permissions(&new_procedure.id, user, PermissionLevel::Write)
.await?;
todo!()
}
pub async fn run_procedure(&self, id: &str, user: &RequestUser) -> anyhow::Result<Vec<Update>> {
let procedure = self
.get_procedure_check_permissions(id, user, PermissionLevel::Write)
.await?;
todo!()
}
}

View File

@@ -72,14 +72,14 @@ impl State {
pub async fn create_full_server(
&self,
mut full_server: Server,
mut server: Server,
user: &RequestUser,
) -> anyhow::Result<Server> {
let server = self
.create_server(&full_server.name, full_server.address.clone(), user)
.await?;
full_server.id = server.id;
let server = self.update_server(full_server, user).await?;
server.id = self
.create_server(&server.name, server.address.clone(), user)
.await?
.id;
let server = self.update_server(server, user).await?;
Ok(server)
}

View File

@@ -74,9 +74,9 @@ pub fn router() -> Router {
post(
|Extension(state): StateExtension,
Extension(user): RequestUserExtension,
Json(full_build): Json<Build>| async move {
Json(build): Json<Build>| async move {
let build = state
.create_full_build(full_build, &user)
.create_full_build(build, &user)
.await
.map_err(handle_anyhow_error)?;
response!(Json(build))

View File

@@ -77,9 +77,9 @@ pub fn router() -> Router {
post(
|Extension(state): StateExtension,
Extension(user): RequestUserExtension,
Json(full_deployment): Json<Deployment>| async move {
Json(deployment): Json<Deployment>| async move {
let deployment = state
.create_full_deployment(full_deployment, &user)
.create_full_deployment(deployment, &user)
.await
.map_err(handle_anyhow_error)?;
response!(Json(deployment))

View File

@@ -63,9 +63,9 @@ pub fn router() -> Router {
post(
|Extension(state): StateExtension,
Extension(user): RequestUserExtension,
Json(full_server): Json<Server>| async move {
Json(server): Json<Server>| async move {
let server = state
.create_full_server(full_server, &user)
.create_full_server(server, &user)
.await
.map_err(handle_anyhow_error)?;
response!(Json(server))

View File

@@ -18,9 +18,6 @@ pub async fn servers_collection(
coll.create_unique_index("name")
.await
.context("failed at creating name index")?;
coll.create_index("permissions")
.await
.context("failed at creating permissions index")?;
Ok(coll)
}
@@ -32,9 +29,6 @@ pub async fn deployments_collection(
coll.create_unique_index("name")
.await
.context("failed at creating name index")?;
coll.create_index("permissions")
.await
.context("failed at creating permissions index")?;
Ok(coll)
}
@@ -46,9 +40,6 @@ pub async fn builds_collection(
coll.create_unique_index("name")
.await
.context("failed at creating name index")?;
coll.create_index("permissions")
.await
.context("failed at creating permissions index")?;
Ok(coll)
}
@@ -77,8 +68,5 @@ pub async fn procedures_collection(
coll.create_index("name")
.await
.context("failed at creating entity_id index")?;
coll.create_index("permissions")
.await
.context("failed at creating permissions index")?;
Ok(coll)
}

View File

@@ -38,7 +38,6 @@ impl DbClient {
builds: builds_collection(&mungos, db_name)
.await
.expect("failed to make builds collection"),
// build_records:
updates: updates_collection(&mungos, db_name)
.await
.expect("failed to make updates collection"),
@@ -131,4 +130,30 @@ impl DbClient {
.unwrap_or_default();
Ok(permissions)
}
pub async fn get_procedure(&self, procedure_id: &str) -> anyhow::Result<Procedure> {
let procedure = self
.procedures
.find_one_by_id(procedure_id)
.await
.context(format!(
"failed at mongo query for procedure {procedure_id}"
))?
.ok_or(anyhow!("procedure at {procedure_id} doesn't exist"))?;
Ok(procedure)
}
pub async fn get_user_permission_on_procedure(
&self,
user_id: &str,
procedure_id: &str,
) -> anyhow::Result<PermissionLevel> {
let permissions = *self
.get_procedure(procedure_id)
.await?
.permissions
.get(user_id)
.unwrap_or_default();
Ok(permissions)
}
}

View File

@@ -331,7 +331,7 @@ pub struct Update {
pub version: Option<Version>,
}
#[derive(Serialize, Deserialize, Debug, Clone, Default, Diff)]
#[derive(Serialize, Deserialize, Debug, Clone, Default, Diff, Builder)]
#[diff(attr(#[derive(Debug, Serialize)]))]
pub struct Procedure {
#[serde(
@@ -340,10 +340,27 @@ pub struct Procedure {
skip_serializing_if = "String::is_empty",
with = "hex_string_as_object_id"
)]
#[builder(setter(skip))]
pub id: String,
pub name: String,
pub procedure: Vec<Operation>,
pub procedure: Vec<ProcedureStage>,
#[builder(setter(skip))]
pub permissions: PermissionsMap,
#[serde(default)]
#[diff(attr(#[serde(skip)]))]
#[builder(setter(skip))]
pub created_at: i64,
#[serde(default)]
#[diff(attr(#[serde(skip)]))]
#[builder(setter(skip))]
pub updated_at: i64,
}
#[derive(Serialize, Deserialize, Debug, Clone, Default, PartialEq, Diff)]
#[diff(attr(#[derive(Debug, Serialize)]))]
pub struct ProcedureStage {
pub operation: Operation,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Default, Diff, Builder)]
@@ -674,6 +691,11 @@ pub enum Operation {
StartDeployment,
PullDeployment,
RecloneDeployment,
// procedure
CreateProcedure,
UpdateProcedure,
DeleteProcedure,
}
impl Default for Operation {

View File

@@ -1,4 +1,4 @@
use crate::{Build, Deployment, PermissionLevel, PermissionsMap, Server};
use crate::{Build, Deployment, PermissionLevel, PermissionsMap, Procedure, Server};
pub trait Permissioned {
fn permissions_map(&self) -> &PermissionsMap;
@@ -25,3 +25,9 @@ impl Permissioned for Server {
&self.permissions
}
}
impl Permissioned for Procedure {
fn permissions_map(&self) -> &PermissionsMap {
&self.permissions
}
}