diff --git a/Cargo.lock b/Cargo.lock index cb81d51bd..47ac818e7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2328,9 +2328,9 @@ dependencies = [ [[package]] name = "resolver_api" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a4c612fa902830ac9b906bacbe800e0cb34968ff913a1aef29b16b65a8c6781" +checksum = "d5e2d7561b561784a2dd7b18f98dbf7e5617f540f97cea6db3e118d57d7237d7" dependencies = [ "anyhow", "async-trait", @@ -2341,9 +2341,9 @@ dependencies = [ [[package]] name = "resolver_api_derive" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9be9792e0b0154c7764feb2ee95dd2427d4db012715bb8320a5f0e53368c558" +checksum = "6e1f7c7d2230fd8ab03239e20f32f99d85c8a1273bb159e1368cbda9fc2ff2ac" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index 6f356bcce..08c37dedb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -60,7 +60,7 @@ termination_signal = "0.1.2" async_timing_util = "0.1.14" partial_derive2 = "0.1.4" make_option = "0.1.3" -resolver_api = "0.1.5" +resolver_api = "0.1.6" parse_csl = "0.1.0" mungos = "0.4.5" svi = "0.1.4" diff --git a/core/src/auth/jwt.rs b/core/src/auth/jwt.rs index 170e76818..02f992ee3 100644 --- a/core/src/auth/jwt.rs +++ b/core/src/auth/jwt.rs @@ -21,6 +21,7 @@ pub type RequestUserExtension = Extension; #[derive(Default)] pub struct InnerRequestUser { pub id: String, + pub username: String, pub is_admin: bool, pub create_server_permissions: bool, pub create_build_permissions: bool, @@ -126,6 +127,7 @@ impl State { if user.enabled { let user = InnerRequestUser { id: claims.id, + username: user.username, is_admin: user.admin, create_server_permissions: user.create_server_permissions, create_build_permissions: user.create_build_permissions, diff --git a/core/src/auth/mod.rs b/core/src/auth/mod.rs index 08b10ab05..5a0360c01 100644 --- a/core/src/auth/mod.rs +++ b/core/src/auth/mod.rs @@ -47,18 +47,18 @@ pub fn router(state: &State) -> Router { |state: StateExtension, Json(request): Json| async move { let timer = Instant::now(); let req_id = Uuid::new_v4(); - info!("/auth request {req_id} | {request:?}"); + info!("/auth request {req_id} | METHOD: {}", request.req_type()); let res = state .resolve_request(request, ()) .await .map_err(|e| (StatusCode::INTERNAL_SERVER_ERROR, format!("{e:?}"))); if let Err(e) = &res { - info!("/auth request {req_id} ERROR: {e:?}"); + info!("/auth request {req_id} | ERROR: {e:?}"); } let res = res?; let elapsed = timer.elapsed(); info!("/auth request {req_id} | resolve time: {elapsed:?}"); - debug!("/auth request {req_id} RESPONSE: {res}"); + debug!("/auth request {req_id} | RESPONSE: {res}"); Result::<_, (StatusCode, String)>::Ok((TypedHeader(ContentType::json()), res)) }, ), diff --git a/core/src/listener/github.rs b/core/src/listener/github.rs index 11cdc4ebc..6bbb6eafc 100644 --- a/core/src/listener/github.rs +++ b/core/src/listener/github.rs @@ -80,6 +80,7 @@ impl State { execute::RunBuild { build_id }, InnerRequestUser { id: String::from("github"), + username: String::from("github"), is_admin: true, create_server_permissions: false, create_build_permissions: false, @@ -106,6 +107,7 @@ impl State { execute::CloneRepo { id: repo_id }, InnerRequestUser { id: String::from("github"), + username: String::from("github"), is_admin: true, create_server_permissions: false, create_build_permissions: false, @@ -132,6 +134,7 @@ impl State { execute::PullRepo { id: repo_id }, InnerRequestUser { id: String::from("github"), + username: String::from("github"), is_admin: true, create_server_permissions: false, create_build_permissions: false, diff --git a/core/src/requests/execute/mod.rs b/core/src/requests/execute/mod.rs index b1319d8e9..41d61418a 100644 --- a/core/src/requests/execute/mod.rs +++ b/core/src/requests/execute/mod.rs @@ -56,7 +56,7 @@ pub fn router() -> Router { Json(request): Json| async move { let timer = Instant::now(); let req_id = Uuid::new_v4(); - info!("/execute request {req_id} | {request:?}"); + info!("/execute request {req_id} | user: {} ({}) | {request:?}", user.username, user.id); let res = tokio::spawn(async move { state .resolve_request(request, user) diff --git a/core/src/requests/execute/repo.rs b/core/src/requests/execute/repo.rs index 1f689efe1..bd5578cb8 100644 --- a/core/src/requests/execute/repo.rs +++ b/core/src/requests/execute/repo.rs @@ -8,6 +8,7 @@ use monitor_types::{ monitor_timestamp, optional_string, requests::execute::*, }; +use mungos::mongodb::bson::doc; use periphery_client::requests; use resolver_api::Resolve; @@ -45,20 +46,37 @@ impl Resolve for State { update.id = self.add_update(update.clone()).await?; - match self + let logs = match self .periphery_client(&server) .request(requests::CloneRepo { args: (&repo).into(), }) .await { - Ok(logs) => update.logs.extend(logs), - Err(e) => update - .logs - .push(Log::error("clone repo", format!("{e:#?}"))), + Ok(logs) => logs, + Err(e) => vec![Log::error("clone repo", format!("{e:#?}"))], }; + update.logs.extend(logs); update.finalize(); + + if update.success { + let res = self + .db + .repos + .update_one( + &repo.id, + mungos::Update::Set(doc! { "last_pulled_at": monitor_timestamp() }), + ) + .await; + if let Err(e) = res { + warn!( + "failed to update repo last_pulled_at | repo id: {} | {e:#?}", + repo.id + ); + } + } + self.update_update(update.clone()).await?; Ok(update) }; @@ -119,7 +137,7 @@ impl Resolve for State { update.id = self.add_update(update.clone()).await?; - match self + let logs = match self .periphery_client(&server) .request(requests::PullRepo { name: repo.name, @@ -128,11 +146,31 @@ impl Resolve for State { }) .await { - Ok(logs) => update.logs.extend(logs), - Err(e) => update.logs.push(Log::error("pull repo", format!("{e:#?}"))), + Ok(logs) => logs, + Err(e) => vec![Log::error("pull repo", format!("{e:#?}"))], }; + update.logs.extend(logs); + update.finalize(); + + if update.success { + let res = self + .db + .repos + .update_one( + &repo.id, + mungos::Update::Set(doc! { "last_pulled_at": monitor_timestamp() }), + ) + .await; + if let Err(e) = res { + warn!( + "failed to update repo last_pulled_at | repo id: {} | {e:#?}", + repo.id + ); + } + } + self.update_update(update.clone()).await?; Ok(update) }; diff --git a/core/src/requests/read/build.rs b/core/src/requests/read/build.rs index 50dc791bc..beaeeac06 100644 --- a/core/src/requests/read/build.rs +++ b/core/src/requests/read/build.rs @@ -5,7 +5,8 @@ use monitor_types::{ build::{Build, BuildActionState}, PermissionLevel, }, - requests::read::*, permissioned::Permissioned, + permissioned::Permissioned, + requests::read::*, }; use resolver_api::Resolve; @@ -25,7 +26,7 @@ impl Resolve for State { &self, ListBuilds { query }: ListBuilds, user: RequestUser, - ) -> anyhow::Result> { + ) -> anyhow::Result> { let builds = self .db .builds @@ -42,6 +43,17 @@ impl Resolve for State { .collect() }; + let builds = builds + .into_iter() + .map(|build| BuildListItem { + id: build.id, + name: build.name, + last_built_at: build.last_built_at, + version: build.config.version, + tags: build.tags, + }) + .collect(); + Ok(builds) } } diff --git a/core/src/requests/read/deployment.rs b/core/src/requests/read/deployment.rs index 953b03feb..af7944da0 100644 --- a/core/src/requests/read/deployment.rs +++ b/core/src/requests/read/deployment.rs @@ -2,11 +2,12 @@ use std::cmp; use anyhow::{anyhow, Context}; use async_trait::async_trait; +use futures::future::join_all; use monitor_types::{ entities::{ deployment::{ Deployment, DeploymentActionState, DeploymentConfig, DeploymentImage, - DockerContainerStats, + DockerContainerState, DockerContainerStats, }, update::{Log, UpdateStatus}, Operation, PermissionLevel, @@ -38,7 +39,7 @@ impl Resolve for State { &self, ListDeployments { query }: ListDeployments, user: RequestUser, - ) -> anyhow::Result> { + ) -> anyhow::Result> { let deployments = self .db .deployments @@ -57,6 +58,26 @@ impl Resolve for State { .collect() }; + let deployments = deployments.into_iter().map(|deployment| async { + let status = self.deployment_status_cache.get(&deployment.id).await; + DeploymentListItem { + id: deployment.id, + name: deployment.name, + tags: deployment.tags, + state: status + .as_ref() + .map(|s| s.state) + .unwrap_or(DockerContainerState::Unknown), + status: status + .as_ref() + .and_then(|s| s.container.as_ref().and_then(|c| c.status.to_owned())), + image: String::new(), + version: String::new(), + } + }); + + let deployments = join_all(deployments).await; + Ok(deployments) } } diff --git a/core/src/requests/read/mod.rs b/core/src/requests/read/mod.rs index 456138210..aaf3e5988 100644 --- a/core/src/requests/read/mod.rs +++ b/core/src/requests/read/mod.rs @@ -83,19 +83,14 @@ pub fn router() -> Router { Json(request): Json| async move { let timer = Instant::now(); let req_id = Uuid::new_v4(); - info!("/read request {req_id} | {request:?}"); - let res = tokio::spawn(async move { - state - .resolve_request(request, user) - .await - .map_err(|e| (StatusCode::INTERNAL_SERVER_ERROR, format!("{e:?}"))) - }) - .await - .map_err(|e| (StatusCode::INTERNAL_SERVER_ERROR, format!("{e:?}"))); - if let Err(e) = &res { - info!("/read request {req_id} SPAWN ERROR: {e:?}"); - } - let res = res?; + info!( + "/read request {req_id} | user: {} ({}) | {request:?}", + user.username, user.id + ); + let res = state + .resolve_request(request, user) + .await + .map_err(|e| (StatusCode::INTERNAL_SERVER_ERROR, format!("{e:?}"))); if let Err(e) = &res { info!("/read request {req_id} ERROR: {e:?}"); } diff --git a/core/src/requests/read/repo.rs b/core/src/requests/read/repo.rs index 07f68b5df..3733f7bd4 100644 --- a/core/src/requests/read/repo.rs +++ b/core/src/requests/read/repo.rs @@ -26,7 +26,7 @@ impl Resolve for State { &self, ListRepos { query }: ListRepos, user: RequestUser, - ) -> anyhow::Result> { + ) -> anyhow::Result> { let repos = self .db .repos @@ -43,6 +43,16 @@ impl Resolve for State { .collect() }; + let repos = repos + .into_iter() + .map(|repo| RepoListItem { + id: repo.id, + name: repo.name, + last_pulled_at: repo.last_pulled_at, + tags: repo.tags, + }) + .collect(); + Ok(repos) } } diff --git a/core/src/requests/read/server.rs b/core/src/requests/read/server.rs index 4cbffd98e..8aea149bd 100644 --- a/core/src/requests/read/server.rs +++ b/core/src/requests/read/server.rs @@ -1,5 +1,6 @@ use anyhow::{anyhow, Context}; use async_trait::async_trait; +use futures::future::join_all; use monitor_types::{ entities::{ deployment::BasicContainerInfo, @@ -50,7 +51,7 @@ impl Resolve for State { &self, ListServers { query }: ListServers, user: RequestUser, - ) -> anyhow::Result> { + ) -> anyhow::Result> { let servers = self .db .servers @@ -67,6 +68,17 @@ impl Resolve for State { .collect() }; + let servers = servers.into_iter().map(|server| async { + let status = self.server_status_cache.get(&server.id).await; + ServerListItem { + id: server.id, + name: server.name, + status: status.map(|s| s.status).unwrap_or_default(), + } + }); + + let servers = join_all(servers).await; + Ok(servers) } } diff --git a/core/src/requests/write/build.rs b/core/src/requests/write/build.rs index 5c25c5fc6..a4e39623b 100644 --- a/core/src/requests/write/build.rs +++ b/core/src/requests/write/build.rs @@ -54,6 +54,7 @@ impl Resolve for State { .into_iter() .collect(), description: Default::default(), + tags: Default::default(), config: config.into(), }; let build_id = self @@ -96,6 +97,7 @@ impl Resolve for State { let Build { config, description, + tags, .. } = self .get_build_check_permissions(&id, &user, PermissionLevel::Update) @@ -131,6 +133,7 @@ impl Resolve for State { .into_iter() .collect(), description, + tags, config, }; let build_id = self diff --git a/core/src/requests/write/deployment.rs b/core/src/requests/write/deployment.rs index afdc4b2e3..0775babf3 100644 --- a/core/src/requests/write/deployment.rs +++ b/core/src/requests/write/deployment.rs @@ -48,6 +48,7 @@ impl Resolve for State { .into_iter() .collect(), description: Default::default(), + tags: Default::default(), config: config.into(), }; let deployment_id = self @@ -93,6 +94,7 @@ impl Resolve for State { let Deployment { config, description, + tags, .. } = self .get_deployment_check_permissions(&id, &user, PermissionLevel::Update) @@ -119,6 +121,7 @@ impl Resolve for State { .into_iter() .collect(), description, + tags, config, }; let deployment_id = self diff --git a/core/src/requests/write/mod.rs b/core/src/requests/write/mod.rs index 3cba011e7..4147d6a6a 100644 --- a/core/src/requests/write/mod.rs +++ b/core/src/requests/write/mod.rs @@ -76,7 +76,7 @@ pub fn router() -> Router { Json(request): Json| async move { let timer = Instant::now(); let req_id = Uuid::new_v4(); - info!("/write request {req_id} | {request:?}"); + info!("/write request {req_id} | user: {} ({}) | {request:?}", user.username, user.id); let res = tokio::spawn(async move { state .resolve_request(request, user) diff --git a/core/src/requests/write/repo.rs b/core/src/requests/write/repo.rs index 3278828ea..a99bf9f46 100644 --- a/core/src/requests/write/repo.rs +++ b/core/src/requests/write/repo.rs @@ -42,7 +42,9 @@ impl Resolve for State { permissions: [(user.id.clone(), PermissionLevel::Update)] .into_iter() .collect(), + last_pulled_at: 0, description: Default::default(), + tags: Default::default(), config: config.into(), }; let repo_id = self @@ -98,6 +100,7 @@ impl Resolve for State { let Repo { config, description, + tags, .. } = self .get_repo_check_permissions(&id, &user, PermissionLevel::Update) @@ -120,7 +123,9 @@ impl Resolve for State { permissions: [(user.id.clone(), PermissionLevel::Update)] .into_iter() .collect(), + last_pulled_at: 0, description, + tags, config, }; let repo_id = self diff --git a/core/src/requests/write/server.rs b/core/src/requests/write/server.rs index 1a0a00d6d..f0027fd48 100644 --- a/core/src/requests/write/server.rs +++ b/core/src/requests/write/server.rs @@ -30,6 +30,7 @@ impl Resolve for State { .into_iter() .collect(), description: Default::default(), + tags: Default::default(), config: req.config.into(), }; let server_id = self diff --git a/lib/types/src/entities/build.rs b/lib/types/src/entities/build.rs index 69fb21a2c..5522e7f0c 100644 --- a/lib/types/src/entities/build.rs +++ b/lib/types/src/entities/build.rs @@ -5,7 +5,7 @@ use partial_derive2::Partial; use serde::{Deserialize, Serialize}; use typeshare::typeshare; -use crate::{i64_is_zero, I64}; +use crate::{i64_is_zero, I64, MongoId}; use super::{EnvironmentVar, PermissionsMap, SystemCommand, Version}; @@ -19,7 +19,7 @@ pub struct Build { with = "hex_string_as_object_id" )] #[builder(setter(skip))] - pub id: String, + pub id: MongoId, #[unique_index] pub name: String, @@ -44,6 +44,10 @@ pub struct Build { #[builder(setter(skip))] pub last_built_at: I64, + #[serde(default)] + #[builder(default)] + pub tags: Vec, + pub config: BuildConfig, } @@ -108,10 +112,6 @@ pub struct BuildConfig { #[serde(default)] #[builder(default)] pub use_buildx: bool, - - #[serde(default)] - #[builder(default)] - pub tags: Vec, } fn default_branch() -> String { @@ -143,7 +143,6 @@ impl From for BuildConfig { build_args: value.build_args.unwrap_or_default(), extra_args: value.extra_args.unwrap_or_default(), use_buildx: value.use_buildx.unwrap_or_default(), - tags: value.tags.unwrap_or_default(), } } } diff --git a/lib/types/src/entities/builder.rs b/lib/types/src/entities/builder.rs index efdd7f4a6..11b817d1f 100644 --- a/lib/types/src/entities/builder.rs +++ b/lib/types/src/entities/builder.rs @@ -5,7 +5,7 @@ use partial_derive2::Partial; use serde::{Deserialize, Serialize}; use typeshare::typeshare; -use crate::{i64_is_zero, I64}; +use crate::{i64_is_zero, I64, MongoId}; use super::PermissionsMap; @@ -19,7 +19,7 @@ pub struct Builder { with = "hex_string_as_object_id" )] #[builder(setter(skip))] - pub id: String, + pub id: MongoId, #[unique_index] pub name: String, diff --git a/lib/types/src/entities/deployment.rs b/lib/types/src/entities/deployment.rs index f17198bc7..059124d4d 100644 --- a/lib/types/src/entities/deployment.rs +++ b/lib/types/src/entities/deployment.rs @@ -6,7 +6,7 @@ use serde::{Deserialize, Serialize}; use strum_macros::{Display, EnumString}; use typeshare::typeshare; -use crate::{i64_is_zero, I64}; +use crate::{i64_is_zero, I64, MongoId}; use super::{EnvironmentVar, PermissionsMap, Version}; @@ -20,7 +20,7 @@ pub struct Deployment { with = "hex_string_as_object_id" )] #[builder(setter(skip))] - pub id: String, + pub id: MongoId, #[unique_index] pub name: String, @@ -41,6 +41,10 @@ pub struct Deployment { #[builder(setter(skip))] pub updated_at: I64, + #[serde(default)] + #[builder(default)] + pub tags: Vec, + pub config: DeploymentConfig, } @@ -115,10 +119,6 @@ pub struct DeploymentConfig { #[serde(default)] #[builder(default)] pub docker_account: String, // the username of the dockerhub account. empty if no account. - - #[serde(default)] - #[builder(default)] - pub tags: Vec, } fn default_term_signal_labels() -> Vec { @@ -156,7 +156,6 @@ impl From for DeploymentConfig { container_user: value.container_user.unwrap_or_default(), extra_args: value.extra_args.unwrap_or_default(), docker_account: value.docker_account.unwrap_or_default(), - tags: value.tags.unwrap_or_default(), } } } diff --git a/lib/types/src/entities/repo.rs b/lib/types/src/entities/repo.rs index c746c05a0..8e12b6f17 100644 --- a/lib/types/src/entities/repo.rs +++ b/lib/types/src/entities/repo.rs @@ -5,7 +5,7 @@ use partial_derive2::Partial; use serde::{Deserialize, Serialize}; use typeshare::typeshare; -use crate::{i64_is_zero, I64}; +use crate::{i64_is_zero, I64, MongoId}; use super::{PermissionsMap, SystemCommand}; @@ -19,7 +19,7 @@ pub struct Repo { with = "hex_string_as_object_id" )] #[builder(setter(skip))] - pub id: String, + pub id: MongoId, #[unique_index] pub name: String, @@ -40,6 +40,14 @@ pub struct Repo { #[builder(setter(skip))] pub updated_at: I64, + #[serde(default)] + #[builder(setter(skip))] + pub last_pulled_at: I64, + + #[serde(default)] + #[builder(default)] + pub tags: Vec, + pub config: RepoConfig, } @@ -68,10 +76,6 @@ pub struct RepoConfig { #[serde(default)] #[builder(default)] pub on_pull: SystemCommand, - - #[serde(default)] - #[builder(default)] - pub tags: Vec, } fn default_branch() -> String { @@ -87,7 +91,6 @@ impl From for RepoConfig { github_account: value.github_account.unwrap_or_default(), on_clone: value.on_clone.unwrap_or_default(), on_pull: value.on_pull.unwrap_or_default(), - tags: value.tags.unwrap_or_default(), } } } diff --git a/lib/types/src/entities/server/mod.rs b/lib/types/src/entities/server/mod.rs index 0faaff65b..c9c455ff4 100644 --- a/lib/types/src/entities/server/mod.rs +++ b/lib/types/src/entities/server/mod.rs @@ -5,7 +5,7 @@ use partial_derive2::Partial; use serde::{Deserialize, Serialize}; use typeshare::typeshare; -use crate::{i64_is_zero, I64}; +use crate::{i64_is_zero, I64, MongoId}; use super::PermissionsMap; @@ -23,7 +23,7 @@ pub struct Server { with = "hex_string_as_object_id" )] #[builder(setter(skip))] - pub id: String, + pub id: MongoId, #[unique_index] pub name: String, @@ -44,6 +44,10 @@ pub struct Server { #[builder(setter(skip))] pub updated_at: I64, + #[serde(default)] + #[builder(default)] + pub tags: Vec, + pub config: ServerConfig, } @@ -95,10 +99,6 @@ pub struct ServerConfig { #[serde(default)] #[builder(default)] pub to_notify: Vec, // slack users to notify - - #[serde(default)] - #[builder(default)] - pub tags: Vec, } fn default_enabled() -> bool { @@ -147,7 +147,6 @@ impl From for ServerConfig { mem_critical: value.mem_critical.unwrap_or(default_mem_critical()), disk_critical: value.disk_critical.unwrap_or(default_disk_critical()), to_notify: value.to_notify.unwrap_or_default(), - tags: value.tags.unwrap_or_default(), } } } diff --git a/lib/types/src/entities/update.rs b/lib/types/src/entities/update.rs index 5ce1d7120..270fcb7b2 100644 --- a/lib/types/src/entities/update.rs +++ b/lib/types/src/entities/update.rs @@ -5,7 +5,7 @@ use serde::{Deserialize, Serialize}; use strum_macros::{Display, EnumString}; use typeshare::typeshare; -use crate::{entities::Operation, monitor_timestamp, I64}; +use crate::{entities::Operation, monitor_timestamp, I64, MongoId}; use super::Version; @@ -18,7 +18,7 @@ pub struct Update { skip_serializing_if = "String::is_empty", with = "hex_string_as_object_id" )] - pub id: String, + pub id: MongoId, pub target: ResourceTarget, pub operation: Operation, pub logs: Vec, diff --git a/lib/types/src/entities/user.rs b/lib/types/src/entities/user.rs index 5dc0c259c..280dcdd91 100644 --- a/lib/types/src/entities/user.rs +++ b/lib/types/src/entities/user.rs @@ -3,7 +3,7 @@ use mungos::MungosIndexed; use serde::{Deserialize, Serialize}; use typeshare::typeshare; -use crate::{i64_is_zero, I64}; +use crate::{i64_is_zero, I64, MongoId}; #[typeshare] #[derive(Serialize, Deserialize, Debug, Clone, Default, MungosIndexed)] @@ -14,7 +14,7 @@ pub struct User { skip_serializing_if = "String::is_empty", with = "hex_string_as_object_id" )] - pub id: String, + pub id: MongoId, #[unique_index] pub username: String, @@ -43,6 +43,9 @@ pub struct User { pub google_id: Option, + #[serde(default)] + pub last_update_view: I64, + #[serde(default, skip_serializing_if = "i64_is_zero")] pub created_at: I64, diff --git a/lib/types/src/lib.rs b/lib/types/src/lib.rs index 53b57b3c6..eb957d2cb 100644 --- a/lib/types/src/lib.rs +++ b/lib/types/src/lib.rs @@ -12,6 +12,8 @@ pub mod requests; #[typeshare(serialized_as = "number")] pub type I64 = i64; +#[typeshare(serialized_as = "{ $oid: string }")] +pub type MongoId = String; #[typeshare(serialized_as = "any")] pub type MongoDocument = mungos::mongodb::bson::Document; diff --git a/lib/types/src/requests/execute/mod.rs b/lib/types/src/requests/execute/mod.rs index a59727c5b..04bdc68cb 100644 --- a/lib/types/src/requests/execute/mod.rs +++ b/lib/types/src/requests/execute/mod.rs @@ -1,8 +1,9 @@ mod build; -pub use build::*; mod deployment; -pub use deployment::*; mod repo; -pub use repo::*; mod server; + +pub use build::*; +pub use deployment::*; +pub use repo::*; pub use server::*; diff --git a/lib/types/src/requests/read/build.rs b/lib/types/src/requests/read/build.rs index 0458adc90..5c9853d02 100644 --- a/lib/types/src/requests/read/build.rs +++ b/lib/types/src/requests/read/build.rs @@ -3,8 +3,11 @@ use serde::{Deserialize, Serialize}; use typeshare::typeshare; use crate::{ - entities::build::{Build, BuildActionState}, - MongoDocument, + entities::{ + build::{Build, BuildActionState}, + Version, + }, + MongoDocument, I64, }; // @@ -20,11 +23,21 @@ pub struct GetBuild { #[typeshare] #[derive(Serialize, Deserialize, Debug, Clone, Request)] -#[response(Vec)] +#[response(Vec)] pub struct ListBuilds { pub query: Option, } +#[typeshare] +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct BuildListItem { + pub id: String, + pub name: String, + pub last_built_at: I64, + pub version: Version, + pub tags: Vec, +} + // #[typeshare] diff --git a/lib/types/src/requests/read/deployment.rs b/lib/types/src/requests/read/deployment.rs index 674c065d4..3bd06cc1e 100644 --- a/lib/types/src/requests/read/deployment.rs +++ b/lib/types/src/requests/read/deployment.rs @@ -23,11 +23,23 @@ pub struct GetDeployment { #[typeshare] #[derive(Serialize, Deserialize, Debug, Clone, Request)] -#[response(Vec)] +#[response(Vec)] pub struct ListDeployments { pub query: Option, } +#[typeshare] +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct DeploymentListItem { + pub id: String, + pub name: String, + pub tags: Vec, + pub state: DockerContainerState, + pub status: Option, + pub image: String, + pub version: String, +} + // #[typeshare] diff --git a/lib/types/src/requests/read/mod.rs b/lib/types/src/requests/read/mod.rs index 4345c3bd5..8fd61fc13 100644 --- a/lib/types/src/requests/read/mod.rs +++ b/lib/types/src/requests/read/mod.rs @@ -1,17 +1,18 @@ use resolver_api::derive::Request; -use serde::{Serialize, Deserialize}; +use serde::{Deserialize, Serialize}; +use typeshare::typeshare; mod build; -pub use build::*; mod builder; -pub use builder::*; mod deployment; -pub use deployment::*; mod repo; -pub use repo::*; mod server; + +pub use build::*; +pub use builder::*; +pub use deployment::*; +pub use repo::*; pub use server::*; -use typeshare::typeshare; // diff --git a/lib/types/src/requests/read/repo.rs b/lib/types/src/requests/read/repo.rs index 027ba29a1..baa8630b2 100644 --- a/lib/types/src/requests/read/repo.rs +++ b/lib/types/src/requests/read/repo.rs @@ -4,7 +4,7 @@ use typeshare::typeshare; use crate::{ entities::repo::{Repo, RepoActionState}, - MongoDocument, + MongoDocument, I64, }; // @@ -20,11 +20,20 @@ pub struct GetRepo { #[typeshare] #[derive(Serialize, Deserialize, Debug, Clone, Request)] -#[response(Vec)] +#[response(Vec)] pub struct ListRepos { pub query: Option, } +#[typeshare] +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct RepoListItem { + pub id: String, + pub name: String, + pub last_pulled_at: I64, + pub tags: Vec, +} + // #[typeshare] diff --git a/lib/types/src/requests/read/server.rs b/lib/types/src/requests/read/server.rs index 9a22ed9b1..950d4cc89 100644 --- a/lib/types/src/requests/read/server.rs +++ b/lib/types/src/requests/read/server.rs @@ -31,11 +31,19 @@ pub struct GetServer { #[typeshare] #[derive(Serialize, Deserialize, Debug, Clone, Request)] -#[response(Vec)] +#[response(Vec)] pub struct ListServers { pub query: Option, } +#[typeshare] +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct ServerListItem { + pub id: String, + pub name: String, + pub status: ServerStatus, +} + // #[typeshare] diff --git a/lib/types/src/requests/write/mod.rs b/lib/types/src/requests/write/mod.rs index 966f02efd..e0ff8caf7 100644 --- a/lib/types/src/requests/write/mod.rs +++ b/lib/types/src/requests/write/mod.rs @@ -1,14 +1,19 @@ mod build; -pub use build::*; mod builder; -pub use builder::*; mod deployment; -pub use deployment::*; -mod repo; -pub use repo::*; -mod server; -pub use server::*; mod permissions; -pub use permissions::*; +mod repo; mod secret; -pub use secret::*; \ No newline at end of file +mod server; +mod tags; +mod user; + +pub use build::*; +pub use builder::*; +pub use deployment::*; +pub use permissions::*; +pub use repo::*; +pub use secret::*; +pub use server::*; +pub use tags::*; +pub use user::*; diff --git a/lib/types/src/requests/write/tags.rs b/lib/types/src/requests/write/tags.rs new file mode 100644 index 000000000..2d77133d8 --- /dev/null +++ b/lib/types/src/requests/write/tags.rs @@ -0,0 +1,25 @@ +use resolver_api::derive::Request; +use serde::{Serialize, Deserialize}; +use typeshare::typeshare; + +use crate::entities::update::ResourceTarget; + +// + +#[typeshare] +#[derive(Serialize, Deserialize, Debug, Clone, Request)] +#[response(())] +pub struct AddTags { + pub target: ResourceTarget, + pub tags: Vec, +} + +// + +#[typeshare] +#[derive(Serialize, Deserialize, Debug, Clone, Request)] +#[response(())] +pub struct RemoveTags { + pub target: ResourceTarget, + pub tags: Vec, +} diff --git a/lib/types/src/requests/write/user.rs b/lib/types/src/requests/write/user.rs new file mode 100644 index 000000000..e69de29bb