change tags api, add tags requests, get list items

This commit is contained in:
mbecker20
2023-07-06 06:06:14 +00:00
parent 6ce6b55b68
commit 91f1de5d95
34 changed files with 280 additions and 96 deletions
Generated
+4 -4
View File
@@ -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",
+1 -1
View File
@@ -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"
+2
View File
@@ -21,6 +21,7 @@ pub type RequestUserExtension = Extension<RequestUser>;
#[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,
+3 -3
View File
@@ -47,18 +47,18 @@ pub fn router(state: &State) -> Router {
|state: StateExtension, Json(request): Json<AuthRequest>| 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))
},
),
+3
View File
@@ -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,
+1 -1
View File
@@ -56,7 +56,7 @@ pub fn router() -> Router {
Json(request): Json<ExecuteRequest>| 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)
+46 -8
View File
@@ -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<CloneRepo, RequestUser> 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<PullRepo, RequestUser> 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<PullRepo, RequestUser> 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)
};
+14 -2
View File
@@ -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<ListBuilds, RequestUser> for State {
&self,
ListBuilds { query }: ListBuilds,
user: RequestUser,
) -> anyhow::Result<Vec<Build>> {
) -> anyhow::Result<Vec<BuildListItem>> {
let builds = self
.db
.builds
@@ -42,6 +43,17 @@ impl Resolve<ListBuilds, RequestUser> 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)
}
}
+23 -2
View File
@@ -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<ListDeployments, RequestUser> for State {
&self,
ListDeployments { query }: ListDeployments,
user: RequestUser,
) -> anyhow::Result<Vec<Deployment>> {
) -> anyhow::Result<Vec<DeploymentListItem>> {
let deployments = self
.db
.deployments
@@ -57,6 +58,26 @@ impl Resolve<ListDeployments, RequestUser> 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)
}
}
+8 -13
View File
@@ -83,19 +83,14 @@ pub fn router() -> Router {
Json(request): Json<ReadRequest>| 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:?}");
}
+11 -1
View File
@@ -26,7 +26,7 @@ impl Resolve<ListRepos, RequestUser> for State {
&self,
ListRepos { query }: ListRepos,
user: RequestUser,
) -> anyhow::Result<Vec<Repo>> {
) -> anyhow::Result<Vec<RepoListItem>> {
let repos = self
.db
.repos
@@ -43,6 +43,16 @@ impl Resolve<ListRepos, RequestUser> 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)
}
}
+13 -1
View File
@@ -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<ListServers, RequestUser> for State {
&self,
ListServers { query }: ListServers,
user: RequestUser,
) -> anyhow::Result<Vec<Server>> {
) -> anyhow::Result<Vec<ServerListItem>> {
let servers = self
.db
.servers
@@ -67,6 +68,17 @@ impl Resolve<ListServers, RequestUser> 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)
}
}
+3
View File
@@ -54,6 +54,7 @@ impl Resolve<CreateBuild, RequestUser> for State {
.into_iter()
.collect(),
description: Default::default(),
tags: Default::default(),
config: config.into(),
};
let build_id = self
@@ -96,6 +97,7 @@ impl Resolve<CopyBuild, RequestUser> for State {
let Build {
config,
description,
tags,
..
} = self
.get_build_check_permissions(&id, &user, PermissionLevel::Update)
@@ -131,6 +133,7 @@ impl Resolve<CopyBuild, RequestUser> for State {
.into_iter()
.collect(),
description,
tags,
config,
};
let build_id = self
+3
View File
@@ -48,6 +48,7 @@ impl Resolve<CreateDeployment, RequestUser> for State {
.into_iter()
.collect(),
description: Default::default(),
tags: Default::default(),
config: config.into(),
};
let deployment_id = self
@@ -93,6 +94,7 @@ impl Resolve<CopyDeployment, RequestUser> for State {
let Deployment {
config,
description,
tags,
..
} = self
.get_deployment_check_permissions(&id, &user, PermissionLevel::Update)
@@ -119,6 +121,7 @@ impl Resolve<CopyDeployment, RequestUser> for State {
.into_iter()
.collect(),
description,
tags,
config,
};
let deployment_id = self
+1 -1
View File
@@ -76,7 +76,7 @@ pub fn router() -> Router {
Json(request): Json<WriteRequest>| 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)
+5
View File
@@ -42,7 +42,9 @@ impl Resolve<CreateRepo, RequestUser> 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<CopyRepo, RequestUser> for State {
let Repo {
config,
description,
tags,
..
} = self
.get_repo_check_permissions(&id, &user, PermissionLevel::Update)
@@ -120,7 +123,9 @@ impl Resolve<CopyRepo, RequestUser> for State {
permissions: [(user.id.clone(), PermissionLevel::Update)]
.into_iter()
.collect(),
last_pulled_at: 0,
description,
tags,
config,
};
let repo_id = self
+1
View File
@@ -30,6 +30,7 @@ impl Resolve<CreateServer, RequestUser> for State {
.into_iter()
.collect(),
description: Default::default(),
tags: Default::default(),
config: req.config.into(),
};
let server_id = self
+6 -7
View File
@@ -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<String>,
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<String>,
}
fn default_branch() -> String {
@@ -143,7 +143,6 @@ impl From<PartialBuildConfig> 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(),
}
}
}
+2 -2
View File
@@ -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,
+6 -7
View File
@@ -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<String>,
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<String>,
}
fn default_term_signal_labels() -> Vec<TerminationSignalLabel> {
@@ -156,7 +156,6 @@ impl From<PartialDeploymentConfig> 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(),
}
}
}
+10 -7
View File
@@ -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<String>,
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<String>,
}
fn default_branch() -> String {
@@ -87,7 +91,6 @@ impl From<PartialRepoConfig> 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(),
}
}
}
+6 -7
View File
@@ -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<String>,
pub config: ServerConfig,
}
@@ -95,10 +99,6 @@ pub struct ServerConfig {
#[serde(default)]
#[builder(default)]
pub to_notify: Vec<String>, // slack users to notify
#[serde(default)]
#[builder(default)]
pub tags: Vec<String>,
}
fn default_enabled() -> bool {
@@ -147,7 +147,6 @@ impl From<PartialServerConfig> 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(),
}
}
}
+2 -2
View File
@@ -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<Log>,
+5 -2
View File
@@ -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<String>,
#[serde(default)]
pub last_update_view: I64,
#[serde(default, skip_serializing_if = "i64_is_zero")]
pub created_at: I64,
+2
View File
@@ -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;
+4 -3
View File
@@ -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::*;
+16 -3
View File
@@ -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<Build>)]
#[response(Vec<BuildListItem>)]
pub struct ListBuilds {
pub query: Option<MongoDocument>,
}
#[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<String>,
}
//
#[typeshare]
+13 -1
View File
@@ -23,11 +23,23 @@ pub struct GetDeployment {
#[typeshare]
#[derive(Serialize, Deserialize, Debug, Clone, Request)]
#[response(Vec<Deployment>)]
#[response(Vec<DeploymentListItem>)]
pub struct ListDeployments {
pub query: Option<MongoDocument>,
}
#[typeshare]
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct DeploymentListItem {
pub id: String,
pub name: String,
pub tags: Vec<String>,
pub state: DockerContainerState,
pub status: Option<String>,
pub image: String,
pub version: String,
}
//
#[typeshare]
+7 -6
View File
@@ -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;
//
+11 -2
View File
@@ -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<Repo>)]
#[response(Vec<RepoListItem>)]
pub struct ListRepos {
pub query: Option<MongoDocument>,
}
#[typeshare]
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct RepoListItem {
pub id: String,
pub name: String,
pub last_pulled_at: I64,
pub tags: Vec<String>,
}
//
#[typeshare]
+9 -1
View File
@@ -31,11 +31,19 @@ pub struct GetServer {
#[typeshare]
#[derive(Serialize, Deserialize, Debug, Clone, Request)]
#[response(Vec<Server>)]
#[response(Vec<ServerListItem>)]
pub struct ListServers {
pub query: Option<MongoDocument>,
}
#[typeshare]
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct ServerListItem {
pub id: String,
pub name: String,
pub status: ServerStatus,
}
//
#[typeshare]
+14 -9
View File
@@ -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::*;
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::*;
+25
View File
@@ -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<String>,
}
//
#[typeshare]
#[derive(Serialize, Deserialize, Debug, Clone, Request)]
#[response(())]
pub struct RemoveTags {
pub target: ResourceTarget,
pub tags: Vec<String>,
}