forked from github-starred/komodo
add fields to list resources
This commit is contained in:
@@ -27,8 +27,8 @@ impl Resolve<ListAlerters, RequestUser> for State {
|
||||
&self,
|
||||
ListAlerters { query }: ListAlerters,
|
||||
user: RequestUser,
|
||||
) -> anyhow::Result<Vec<Alerter>> {
|
||||
<State as Resource<Alerter>>::list_resources_for_user(self, &user, query).await
|
||||
) -> anyhow::Result<Vec<AlerterListItem>> {
|
||||
<State as Resource<Alerter>>::list_resources_for_user(self, query, &user).await
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -32,7 +32,7 @@ impl Resolve<ListBuilds, RequestUser> for State {
|
||||
ListBuilds { query }: ListBuilds,
|
||||
user: RequestUser,
|
||||
) -> anyhow::Result<Vec<BuildListItem>> {
|
||||
<State as Resource<Build>>::list_resources_for_user(self, &user, query).await
|
||||
<State as Resource<Build>>::list_resources_for_user(self, query, &user).await
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -27,8 +27,8 @@ impl Resolve<ListBuilders, RequestUser> for State {
|
||||
&self,
|
||||
ListBuilders { query }: ListBuilders,
|
||||
user: RequestUser,
|
||||
) -> anyhow::Result<Vec<Builder>> {
|
||||
<State as Resource<Builder>>::list_resources_for_user(self, &user, query).await
|
||||
) -> anyhow::Result<Vec<BuilderListItem>> {
|
||||
<State as Resource<Builder>>::list_resources_for_user(self, query, &user).await
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@ impl Resolve<ListDeployments, RequestUser> for State {
|
||||
ListDeployments { query }: ListDeployments,
|
||||
user: RequestUser,
|
||||
) -> anyhow::Result<Vec<DeploymentListItem>> {
|
||||
<State as Resource<Deployment>>::list_resources_for_user(self, &user, query).await
|
||||
<State as Resource<Deployment>>::list_resources_for_user(self, query, &user).await
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -40,7 +40,6 @@ enum ReadRequest {
|
||||
|
||||
// ==== SEARCH ====
|
||||
FindResources(FindResources),
|
||||
FindResourcesWithQuery(FindResourcesWithQuery),
|
||||
|
||||
// ==== SERVER ====
|
||||
GetServersSummary(GetServersSummary),
|
||||
|
||||
@@ -27,7 +27,7 @@ impl Resolve<ListRepos, RequestUser> for State {
|
||||
ListRepos { query }: ListRepos,
|
||||
user: RequestUser,
|
||||
) -> anyhow::Result<Vec<RepoListItem>> {
|
||||
<State as Resource<Repo>>::list_resources_for_user(self, &user, query).await
|
||||
<State as Resource<Repo>>::list_resources_for_user(self, query, &user).await
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,21 +1,11 @@
|
||||
use std::str::FromStr;
|
||||
|
||||
use anyhow::{anyhow, Context};
|
||||
use async_trait::async_trait;
|
||||
use monitor_types::{
|
||||
entities::{
|
||||
build, deployment, repo, server,
|
||||
tag::Tag,
|
||||
update::ResourceTargetVariant::{self, *},
|
||||
PermissionLevel,
|
||||
},
|
||||
permissioned::Permissioned,
|
||||
requests::read::{
|
||||
BuildListItem, DeploymentListItem, FindResources, FindResourcesResponse,
|
||||
FindResourcesWithQuery, RepoListItem, ServerListItem,
|
||||
},
|
||||
requests::read::{FindResources, FindResourcesResponse},
|
||||
};
|
||||
use mungos::mongodb::bson::{doc, oid::ObjectId};
|
||||
use resolver_api::Resolve;
|
||||
|
||||
use crate::{auth::RequestUser, resource::Resource, state::State};
|
||||
@@ -23,10 +13,10 @@ use crate::{auth::RequestUser, resource::Resource, state::State};
|
||||
const FIND_RESOURCE_TYPES: [ResourceTargetVariant; 4] = [Server, Build, Deployment, Repo];
|
||||
|
||||
#[async_trait]
|
||||
impl Resolve<FindResourcesWithQuery, RequestUser> for State {
|
||||
impl Resolve<FindResources, RequestUser> for State {
|
||||
async fn resolve(
|
||||
&self,
|
||||
FindResourcesWithQuery { query, resources }: FindResourcesWithQuery,
|
||||
FindResources { query, resources }: FindResources,
|
||||
user: RequestUser,
|
||||
) -> anyhow::Result<FindResourcesResponse> {
|
||||
let mut res = FindResourcesResponse::default();
|
||||
@@ -42,8 +32,8 @@ impl Resolve<FindResourcesWithQuery, RequestUser> for State {
|
||||
Server => {
|
||||
res.servers = <State as Resource<server::Server>>::list_resources_for_user(
|
||||
self,
|
||||
&user,
|
||||
query.clone(),
|
||||
&user,
|
||||
)
|
||||
.await?;
|
||||
}
|
||||
@@ -51,24 +41,24 @@ impl Resolve<FindResourcesWithQuery, RequestUser> for State {
|
||||
res.deployments =
|
||||
<State as Resource<deployment::Deployment>>::list_resources_for_user(
|
||||
self,
|
||||
&user,
|
||||
query.clone(),
|
||||
&user,
|
||||
)
|
||||
.await?;
|
||||
}
|
||||
Build => {
|
||||
res.builds = <State as Resource<build::Build>>::list_resources_for_user(
|
||||
self,
|
||||
&user,
|
||||
query.clone(),
|
||||
&user,
|
||||
)
|
||||
.await?;
|
||||
}
|
||||
Repo => {
|
||||
res.repos = <State as Resource<repo::Repo>>::list_resources_for_user(
|
||||
self,
|
||||
&user,
|
||||
query.clone(),
|
||||
&user,
|
||||
)
|
||||
.await?;
|
||||
}
|
||||
@@ -80,189 +70,190 @@ impl Resolve<FindResourcesWithQuery, RequestUser> for State {
|
||||
}
|
||||
}
|
||||
|
||||
#[async_trait]
|
||||
impl Resolve<FindResources, RequestUser> for State {
|
||||
async fn resolve(
|
||||
&self,
|
||||
FindResources { search, tags }: FindResources,
|
||||
user: RequestUser,
|
||||
) -> anyhow::Result<FindResourcesResponse> {
|
||||
let SeperateTags {
|
||||
resource_types,
|
||||
server_ids,
|
||||
custom_tag_ids,
|
||||
} = seperate_tags(tags);
|
||||
// #[async_trait]
|
||||
// impl Resolve<FindResources, RequestUser> for State {
|
||||
// async fn resolve(
|
||||
// &self,
|
||||
// FindResources { search, tags }: FindResources,
|
||||
// user: RequestUser,
|
||||
// ) -> anyhow::Result<FindResourcesResponse> {
|
||||
// let SeperateTags {
|
||||
// resource_types,
|
||||
// server_ids,
|
||||
// custom_tag_ids,
|
||||
// } = seperate_tags(tags);
|
||||
|
||||
let mut query = doc! {
|
||||
"name": { "$regex": search }
|
||||
};
|
||||
// let mut query = doc! {
|
||||
// "name": { "$regex": search }
|
||||
// };
|
||||
|
||||
if !user.is_admin {
|
||||
query.insert(
|
||||
format!("permissions.{}", user.id),
|
||||
doc! { "$in": ["read", "execute", "update"] },
|
||||
);
|
||||
}
|
||||
// if !user.is_admin {
|
||||
// query.insert(
|
||||
// format!("permissions.{}", user.id),
|
||||
// doc! { "$in": ["read", "execute", "update"] },
|
||||
// );
|
||||
// }
|
||||
|
||||
if !custom_tag_ids.is_empty() {
|
||||
query.insert("tags", doc! { "$all": custom_tag_ids });
|
||||
}
|
||||
// if !custom_tag_ids.is_empty() {
|
||||
// query.insert("tags", doc! { "$all": custom_tag_ids });
|
||||
// }
|
||||
|
||||
let mut response = FindResourcesResponse::default();
|
||||
// let mut response = FindResourcesResponse::default();
|
||||
|
||||
for resource_type in resource_types {
|
||||
match resource_type {
|
||||
Server => {
|
||||
let servers = if server_ids.is_empty() {
|
||||
self.db.servers.get_some(query.clone(), None).await?
|
||||
} else {
|
||||
let server_ids = server_ids
|
||||
.iter()
|
||||
.map(|id| {
|
||||
ObjectId::from_str(id)
|
||||
.context("failed to parse server id as ObjectId")
|
||||
})
|
||||
.collect::<anyhow::Result<Vec<_>>>()?;
|
||||
let mut query = query.clone();
|
||||
query.insert("_id", doc! { "$in": server_ids });
|
||||
self.db.servers.get_some(query, None).await?
|
||||
};
|
||||
for server in servers {
|
||||
let status = self
|
||||
.server_status_cache
|
||||
.get(&server.id)
|
||||
.await
|
||||
.map(|s| s.status)
|
||||
.unwrap_or_default();
|
||||
let item = ServerListItem {
|
||||
status,
|
||||
id: server.id,
|
||||
name: server.name,
|
||||
tags: server.tags,
|
||||
};
|
||||
response.servers.push(item);
|
||||
}
|
||||
}
|
||||
Deployment => {
|
||||
let mut query = query.clone();
|
||||
// for resource_type in resource_types {
|
||||
// match resource_type {
|
||||
// Server => {
|
||||
// let servers = if server_ids.is_empty() {
|
||||
// self.db.servers.get_some(query.clone(), None).await?
|
||||
// } else {
|
||||
// let server_ids = server_ids
|
||||
// .iter()
|
||||
// .map(|id| {
|
||||
// ObjectId::from_str(id)
|
||||
// .context("failed to parse server id as ObjectId")
|
||||
// })
|
||||
// .collect::<anyhow::Result<Vec<_>>>()?;
|
||||
// let mut query = query.clone();
|
||||
// query.insert("_id", doc! { "$in": server_ids });
|
||||
// self.db.servers.get_some(query, None).await?
|
||||
// };
|
||||
// for server in servers {
|
||||
// let status = self
|
||||
// .server_status_cache
|
||||
// .get(&server.id)
|
||||
// .await
|
||||
// .map(|s| s.status)
|
||||
// .unwrap_or_default();
|
||||
// let item = ServerListItem {
|
||||
// status,
|
||||
// id: server.id,
|
||||
// name: server.name,
|
||||
// tags: server.tags,
|
||||
// };
|
||||
// response.servers.push(item);
|
||||
// }
|
||||
// }
|
||||
// Deployment => {
|
||||
// let mut query = query.clone();
|
||||
|
||||
if !server_ids.is_empty() {
|
||||
query.insert("config.server_id", doc! { "$in": &server_ids });
|
||||
}
|
||||
// if !server_ids.is_empty() {
|
||||
// query.insert("config.server_id", doc! { "$in": &server_ids });
|
||||
// }
|
||||
|
||||
let deployments = self
|
||||
.db
|
||||
.deployments
|
||||
.get_some(query, None)
|
||||
.await?
|
||||
.into_iter()
|
||||
.filter(|d| d.get_user_permissions(&user.id) > PermissionLevel::Read);
|
||||
// let deployments = self
|
||||
// .db
|
||||
// .deployments
|
||||
// .get_some(query, None)
|
||||
// .await?
|
||||
// .into_iter()
|
||||
// .filter(|d| d.get_user_permissions(&user.id) > PermissionLevel::Read);
|
||||
|
||||
for deployment in deployments {
|
||||
let status = self.deployment_status_cache.get(&deployment.id).await;
|
||||
let item = DeploymentListItem {
|
||||
id: deployment.id,
|
||||
name: deployment.name,
|
||||
tags: deployment.tags,
|
||||
state: status.as_ref().map(|s| s.state).unwrap_or_default(),
|
||||
status: status.as_ref().and_then(|s| {
|
||||
s.container.as_ref().and_then(|c| c.status.to_owned())
|
||||
}),
|
||||
image: String::new(),
|
||||
version: String::new(),
|
||||
};
|
||||
response.deployments.push(item);
|
||||
}
|
||||
}
|
||||
Build => {
|
||||
let mut query = query.clone();
|
||||
// for deployment in deployments {
|
||||
// let status = self.deployment_status_cache.get(&deployment.id).await;
|
||||
// let item = DeploymentListItem {
|
||||
// id: deployment.id,
|
||||
// name: deployment.name,
|
||||
// tags: deployment.tags,
|
||||
// state: status.as_ref().map(|s| s.state).unwrap_or_default(),
|
||||
// status: status.as_ref().and_then(|s| {
|
||||
// s.container.as_ref().and_then(|c| c.status.to_owned())
|
||||
// }),
|
||||
// image: String::new(),
|
||||
// server_id: String::new(),
|
||||
// build_id: None,
|
||||
// };
|
||||
// response.deployments.push(item);
|
||||
// }
|
||||
// }
|
||||
// Build => {
|
||||
// let mut query = query.clone();
|
||||
|
||||
if !server_ids.is_empty() {
|
||||
query.insert(
|
||||
"config.builder.params.server_id",
|
||||
doc! { "$in": &server_ids },
|
||||
);
|
||||
}
|
||||
// if !server_ids.is_empty() {
|
||||
// query.insert(
|
||||
// "config.builder.params.server_id",
|
||||
// doc! { "$in": &server_ids },
|
||||
// );
|
||||
// }
|
||||
|
||||
let builds = self
|
||||
.db
|
||||
.builds
|
||||
.get_some(query, None)
|
||||
.await?
|
||||
.into_iter()
|
||||
.filter(|d| d.get_user_permissions(&user.id) > PermissionLevel::Read);
|
||||
// let builds = self
|
||||
// .db
|
||||
// .builds
|
||||
// .get_some(query, None)
|
||||
// .await?
|
||||
// .into_iter()
|
||||
// .filter(|d| d.get_user_permissions(&user.id) > PermissionLevel::Read);
|
||||
|
||||
for build in builds {
|
||||
let item = BuildListItem {
|
||||
id: build.id,
|
||||
name: build.name,
|
||||
tags: build.tags,
|
||||
last_built_at: build.last_built_at,
|
||||
version: build.config.version,
|
||||
};
|
||||
response.builds.push(item);
|
||||
}
|
||||
}
|
||||
Repo => {
|
||||
let mut query = query.clone();
|
||||
// for build in builds {
|
||||
// let item = BuildListItem {
|
||||
// id: build.id,
|
||||
// name: build.name,
|
||||
// tags: build.tags,
|
||||
// last_built_at: build.last_built_at,
|
||||
// version: build.config.version,
|
||||
// };
|
||||
// response.builds.push(item);
|
||||
// }
|
||||
// }
|
||||
// Repo => {
|
||||
// let mut query = query.clone();
|
||||
|
||||
if !server_ids.is_empty() {
|
||||
query.insert("config.server_id", doc! { "$in": &server_ids });
|
||||
}
|
||||
// if !server_ids.is_empty() {
|
||||
// query.insert("config.server_id", doc! { "$in": &server_ids });
|
||||
// }
|
||||
|
||||
let repos = self
|
||||
.db
|
||||
.repos
|
||||
.get_some(query, None)
|
||||
.await?
|
||||
.into_iter()
|
||||
.filter(|d| d.get_user_permissions(&user.id) > PermissionLevel::Read);
|
||||
// let repos = self
|
||||
// .db
|
||||
// .repos
|
||||
// .get_some(query, None)
|
||||
// .await?
|
||||
// .into_iter()
|
||||
// .filter(|d| d.get_user_permissions(&user.id) > PermissionLevel::Read);
|
||||
|
||||
for repo in repos {
|
||||
let item = RepoListItem {
|
||||
id: repo.id,
|
||||
name: repo.name,
|
||||
tags: repo.tags,
|
||||
last_pulled_at: repo.last_pulled_at,
|
||||
};
|
||||
response.repos.push(item);
|
||||
}
|
||||
}
|
||||
_ => return Err(anyhow!("{resource_type} is not compatible with this route")),
|
||||
}
|
||||
}
|
||||
// for repo in repos {
|
||||
// let item = RepoListItem {
|
||||
// id: repo.id,
|
||||
// name: repo.name,
|
||||
// tags: repo.tags,
|
||||
// last_pulled_at: repo.last_pulled_at,
|
||||
// };
|
||||
// response.repos.push(item);
|
||||
// }
|
||||
// }
|
||||
// _ => return Err(anyhow!("{resource_type} is not compatible with this route")),
|
||||
// }
|
||||
// }
|
||||
|
||||
Ok(response)
|
||||
}
|
||||
}
|
||||
// Ok(response)
|
||||
// }
|
||||
// }
|
||||
|
||||
#[derive(Default)]
|
||||
struct SeperateTags {
|
||||
resource_types: Vec<ResourceTargetVariant>,
|
||||
server_ids: Vec<String>,
|
||||
custom_tag_ids: Vec<String>,
|
||||
}
|
||||
// #[derive(Default)]
|
||||
// struct SeperateTags {
|
||||
// resource_types: Vec<ResourceTargetVariant>,
|
||||
// server_ids: Vec<String>,
|
||||
// custom_tag_ids: Vec<String>,
|
||||
// }
|
||||
|
||||
fn seperate_tags(tags: Vec<Tag>) -> SeperateTags {
|
||||
let mut seperated = SeperateTags::default();
|
||||
// fn seperate_tags(tags: Vec<Tag>) -> SeperateTags {
|
||||
// let mut seperated = SeperateTags::default();
|
||||
|
||||
for tag in tags {
|
||||
match tag {
|
||||
Tag::Custom { tag_id } => seperated.custom_tag_ids.push(tag_id),
|
||||
Tag::Server { server_id } => seperated.server_ids.push(server_id),
|
||||
Tag::ResourceType { resource } => {
|
||||
if !matches!(resource, Builder | Alerter | System,)
|
||||
&& !seperated.resource_types.contains(&resource)
|
||||
{
|
||||
seperated.resource_types.push(resource);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// for tag in tags {
|
||||
// match tag {
|
||||
// Tag::Custom { tag_id } => seperated.custom_tag_ids.push(tag_id),
|
||||
// Tag::Server { server_id } => seperated.server_ids.push(server_id),
|
||||
// Tag::ResourceType { resource } => {
|
||||
// if !matches!(resource, Builder | Alerter | System,)
|
||||
// && !seperated.resource_types.contains(&resource)
|
||||
// {
|
||||
// seperated.resource_types.push(resource);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
if seperated.resource_types.is_empty() {
|
||||
seperated.resource_types = FIND_RESOURCE_TYPES.to_vec();
|
||||
}
|
||||
// if seperated.resource_types.is_empty() {
|
||||
// seperated.resource_types = FIND_RESOURCE_TYPES.to_vec();
|
||||
// }
|
||||
|
||||
seperated
|
||||
}
|
||||
// seperated
|
||||
// }
|
||||
|
||||
@@ -26,7 +26,7 @@ impl Resolve<GetServersSummary, RequestUser> for State {
|
||||
user: RequestUser,
|
||||
) -> anyhow::Result<GetServersSummaryResponse> {
|
||||
let servers =
|
||||
<State as Resource<Server>>::list_resources_for_user(self, &user, None).await?;
|
||||
<State as Resource<Server>>::list_resources_for_user(self, None, &user).await?;
|
||||
let mut res = GetServersSummaryResponse::default();
|
||||
for server in servers {
|
||||
res.total += 1;
|
||||
@@ -81,7 +81,7 @@ impl Resolve<ListServers, RequestUser> for State {
|
||||
ListServers { query }: ListServers,
|
||||
user: RequestUser,
|
||||
) -> anyhow::Result<Vec<ServerListItem>> {
|
||||
<State as Resource<Server>>::list_resources_for_user(self, &user, query).await
|
||||
<State as Resource<Server>>::list_resources_for_user(self, query, &user).await
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -57,7 +57,7 @@ impl Resolve<UpdateUserPermissions, RequestUser> for State {
|
||||
.await?;
|
||||
let end_ts = monitor_timestamp();
|
||||
let mut update = Update {
|
||||
target: ResourceTarget::System("System".to_string()),
|
||||
target: ResourceTarget::System("system".to_string()),
|
||||
operation: Operation::UpdateUserPermissions,
|
||||
logs: vec![Log::simple(
|
||||
"modify user enabled",
|
||||
|
||||
@@ -3,11 +3,19 @@ use async_trait::async_trait;
|
||||
use futures::future::join_all;
|
||||
use monitor_types::{
|
||||
entities::{
|
||||
alerter::Alerter, build::Build, builder::Builder, deployment::Deployment, repo::Repo,
|
||||
server::Server, PermissionLevel,
|
||||
alerter::{Alerter, AlerterConfig},
|
||||
build::Build,
|
||||
builder::{Builder, BuilderConfig},
|
||||
deployment::{Deployment, DeploymentImage},
|
||||
repo::Repo,
|
||||
server::Server,
|
||||
PermissionLevel,
|
||||
},
|
||||
permissioned::Permissioned,
|
||||
requests::read::{BuildListItem, DeploymentListItem, RepoListItem, ServerListItem},
|
||||
requests::read::{
|
||||
AlerterListItem, BuildListItem, BuilderListItem, DeploymentListItem, RepoListItem,
|
||||
ServerListItem,
|
||||
},
|
||||
};
|
||||
use mungos::{
|
||||
mongodb::bson::{doc, Document},
|
||||
@@ -24,7 +32,7 @@ pub trait Resource<T: Indexed + Send + Unpin + Permissioned> {
|
||||
|
||||
fn name() -> &'static str;
|
||||
fn coll(&self) -> &Collection<T>;
|
||||
async fn to_list_item(&self, resource: T) -> Self::ListItem;
|
||||
async fn to_list_item(&self, resource: T) -> anyhow::Result<Self::ListItem>;
|
||||
|
||||
async fn get_resource(&self, id: &str) -> anyhow::Result<T> {
|
||||
self.coll()
|
||||
@@ -96,8 +104,8 @@ pub trait Resource<T: Indexed + Send + Unpin + Permissioned> {
|
||||
|
||||
async fn list_resources_for_user(
|
||||
&self,
|
||||
user: &RequestUser,
|
||||
query: Option<Document>,
|
||||
user: &RequestUser,
|
||||
) -> anyhow::Result<Vec<Self::ListItem>> {
|
||||
let mut query = query.unwrap_or_default();
|
||||
if !user.is_admin {
|
||||
@@ -114,7 +122,11 @@ pub trait Resource<T: Indexed + Send + Unpin + Permissioned> {
|
||||
.into_iter()
|
||||
.map(|resource| self.to_list_item(resource));
|
||||
|
||||
let list = join_all(list).await;
|
||||
let list = join_all(list)
|
||||
.await
|
||||
.into_iter()
|
||||
.collect::<anyhow::Result<Vec<_>>>()
|
||||
.context("failed to convert deployment list item")?;
|
||||
|
||||
Ok(list)
|
||||
}
|
||||
@@ -146,14 +158,15 @@ impl Resource<Server> for State {
|
||||
&self.db.servers
|
||||
}
|
||||
|
||||
async fn to_list_item(&self, server: Server) -> ServerListItem {
|
||||
async fn to_list_item(&self, server: Server) -> anyhow::Result<ServerListItem> {
|
||||
let status = self.server_status_cache.get(&server.id).await;
|
||||
ServerListItem {
|
||||
Ok(ServerListItem {
|
||||
id: server.id,
|
||||
name: server.name,
|
||||
tags: server.tags,
|
||||
status: status.map(|s| s.status).unwrap_or_default(),
|
||||
}
|
||||
region: server.config.region,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -169,9 +182,21 @@ impl Resource<Deployment> for State {
|
||||
&self.db.deployments
|
||||
}
|
||||
|
||||
async fn to_list_item(&self, deployment: Deployment) -> DeploymentListItem {
|
||||
async fn to_list_item(&self, deployment: Deployment) -> anyhow::Result<DeploymentListItem> {
|
||||
let status = self.deployment_status_cache.get(&deployment.id).await;
|
||||
DeploymentListItem {
|
||||
let (image, build_id) = match deployment.config.image {
|
||||
DeploymentImage::Build { build_id, version } => {
|
||||
let build: Build = self.get_resource(&build_id).await?;
|
||||
let version = if version.is_none() {
|
||||
build.config.version.to_string()
|
||||
} else {
|
||||
version.to_string()
|
||||
};
|
||||
(format!("{}:{version}", build.name), Some(build_id))
|
||||
}
|
||||
DeploymentImage::Image { image } => (image, None),
|
||||
};
|
||||
Ok(DeploymentListItem {
|
||||
id: deployment.id,
|
||||
name: deployment.name,
|
||||
tags: deployment.tags,
|
||||
@@ -179,9 +204,10 @@ impl Resource<Deployment> for State {
|
||||
status: status
|
||||
.as_ref()
|
||||
.and_then(|s| s.container.as_ref().and_then(|c| c.status.to_owned())),
|
||||
image: String::new(),
|
||||
version: String::new(),
|
||||
}
|
||||
image,
|
||||
server_id: deployment.config.server_id,
|
||||
build_id,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -197,14 +223,14 @@ impl Resource<Build> for State {
|
||||
&self.db.builds
|
||||
}
|
||||
|
||||
async fn to_list_item(&self, build: Build) -> BuildListItem {
|
||||
BuildListItem {
|
||||
async fn to_list_item(&self, build: Build) -> anyhow::Result<BuildListItem> {
|
||||
Ok(BuildListItem {
|
||||
id: build.id,
|
||||
name: build.name,
|
||||
last_built_at: build.last_built_at,
|
||||
version: build.config.version,
|
||||
tags: build.tags,
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -220,19 +246,19 @@ impl Resource<Repo> for State {
|
||||
&self.db.repos
|
||||
}
|
||||
|
||||
async fn to_list_item(&self, repo: Repo) -> RepoListItem {
|
||||
RepoListItem {
|
||||
async fn to_list_item(&self, repo: Repo) -> anyhow::Result<RepoListItem> {
|
||||
Ok(RepoListItem {
|
||||
id: repo.id,
|
||||
name: repo.name,
|
||||
last_pulled_at: repo.last_pulled_at,
|
||||
tags: repo.tags,
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
#[async_trait]
|
||||
impl Resource<Builder> for State {
|
||||
type ListItem = Builder;
|
||||
type ListItem = BuilderListItem;
|
||||
|
||||
fn name() -> &'static str {
|
||||
"builder"
|
||||
@@ -242,14 +268,23 @@ impl Resource<Builder> for State {
|
||||
&self.db.builders
|
||||
}
|
||||
|
||||
async fn to_list_item(&self, builder: Builder) -> Builder {
|
||||
builder
|
||||
async fn to_list_item(&self, builder: Builder) -> anyhow::Result<BuilderListItem> {
|
||||
let (provider, instance_type) = match builder.config {
|
||||
BuilderConfig::Aws(config) => ("aws ec2".to_string(), Some(config.instance_type)),
|
||||
};
|
||||
|
||||
Ok(BuilderListItem {
|
||||
id: builder.id,
|
||||
name: builder.name,
|
||||
provider,
|
||||
instance_type,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
#[async_trait]
|
||||
impl Resource<Alerter> for State {
|
||||
type ListItem = Alerter;
|
||||
type ListItem = AlerterListItem;
|
||||
|
||||
fn name() -> &'static str {
|
||||
"alerter"
|
||||
@@ -259,7 +294,15 @@ impl Resource<Alerter> for State {
|
||||
&self.db.alerters
|
||||
}
|
||||
|
||||
async fn to_list_item(&self, alerter: Alerter) -> Alerter {
|
||||
alerter
|
||||
async fn to_list_item(&self, alerter: Alerter) -> anyhow::Result<AlerterListItem> {
|
||||
let alerter_type = match alerter.config {
|
||||
AlerterConfig::Custom(_) => "custom",
|
||||
AlerterConfig::Slack(_) => "slack",
|
||||
};
|
||||
Ok(AlerterListItem {
|
||||
id: alerter.id,
|
||||
name: alerter.name,
|
||||
alerter_type: alerter_type.to_string(),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,7 +15,6 @@ export type ReadResponses = {
|
||||
|
||||
// ==== SEARCH ====
|
||||
FindResources: Types.FindResourcesResponse;
|
||||
FindResourcesWithQuery: Types.FindResourcesResponse;
|
||||
|
||||
// ==== SERVER ====
|
||||
GetServersSummary: Types.GetServersSummaryResponse;
|
||||
@@ -57,12 +56,12 @@ export type ReadResponses = {
|
||||
// ==== BUILDER ====
|
||||
GetBuildersSummary: Types.GetBuildersSummaryResponse;
|
||||
GetBuilder: Types.Builder;
|
||||
ListBuilders: Types.Builder[];
|
||||
ListBuilders: Types.BuilderListItem[];
|
||||
|
||||
// ==== ALERTER ====
|
||||
GetAlertersSummary: Types.GetAlertersSummaryResponse;
|
||||
GetAlerter: Types.Alerter;
|
||||
ListAlerters: Types.Alerter[];
|
||||
ListAlerters: Types.AlerterListItem[];
|
||||
|
||||
// ==== TAG ====
|
||||
GetTag: Types.CustomTag;
|
||||
|
||||
@@ -735,6 +735,12 @@ export interface ListAlerters {
|
||||
query?: MongoDocument;
|
||||
}
|
||||
|
||||
export interface AlerterListItem {
|
||||
id: string;
|
||||
name: string;
|
||||
alerter_type: string;
|
||||
}
|
||||
|
||||
export interface GetAlertersSummary {
|
||||
}
|
||||
|
||||
@@ -806,6 +812,13 @@ export interface ListBuilders {
|
||||
query?: MongoDocument;
|
||||
}
|
||||
|
||||
export interface BuilderListItem {
|
||||
id: string;
|
||||
name: string;
|
||||
provider: string;
|
||||
instance_type?: string;
|
||||
}
|
||||
|
||||
export interface GetBuildersSummary {
|
||||
}
|
||||
|
||||
@@ -828,7 +841,8 @@ export interface DeploymentListItem {
|
||||
state: DockerContainerState;
|
||||
status?: string;
|
||||
image: string;
|
||||
version: string;
|
||||
server_id: string;
|
||||
build_id?: string;
|
||||
}
|
||||
|
||||
export interface GetDeploymentStatus {
|
||||
@@ -916,23 +930,7 @@ export interface GetReposSummaryResponse {
|
||||
total: number;
|
||||
}
|
||||
|
||||
export type Tag =
|
||||
| { type: "ResourceType", params: {
|
||||
resource: ResourceTarget["type"];
|
||||
}}
|
||||
| { type: "Server", params: {
|
||||
server_id: string;
|
||||
}}
|
||||
| { type: "Custom", params: {
|
||||
tag_id: string;
|
||||
}};
|
||||
|
||||
export interface FindResources {
|
||||
search: string;
|
||||
tags: Tag[];
|
||||
}
|
||||
|
||||
export interface FindResourcesWithQuery {
|
||||
query?: MongoDocument;
|
||||
resources?: ResourceTarget["type"][];
|
||||
}
|
||||
@@ -948,6 +946,7 @@ export interface ServerListItem {
|
||||
name: string;
|
||||
status: ServerStatus;
|
||||
tags: string[];
|
||||
region: string;
|
||||
}
|
||||
|
||||
export interface FindResourcesResponse {
|
||||
@@ -1303,7 +1302,6 @@ export type ReadRequest =
|
||||
| { type: "GetUser", params: GetUser }
|
||||
| { type: "GetUsername", params: GetUsername }
|
||||
| { type: "FindResources", params: FindResources }
|
||||
| { type: "FindResourcesWithQuery", params: FindResourcesWithQuery }
|
||||
| { type: "GetServersSummary", params: GetServersSummary }
|
||||
| { type: "GetServer", params: GetServer }
|
||||
| { type: "ListServers", params: ListServers }
|
||||
@@ -1435,3 +1433,14 @@ export type Alert =
|
||||
to: DockerContainerState;
|
||||
}};
|
||||
|
||||
export type Tag =
|
||||
| { type: "ResourceType", params: {
|
||||
resource: ResourceTarget["type"];
|
||||
}}
|
||||
| { type: "Server", params: {
|
||||
server_id: string;
|
||||
}}
|
||||
| { type: "Custom", params: {
|
||||
tag_id: string;
|
||||
}};
|
||||
|
||||
|
||||
@@ -131,7 +131,7 @@ pub enum ResourceTarget {
|
||||
|
||||
impl Default for ResourceTarget {
|
||||
fn default() -> Self {
|
||||
Self::System("System".to_string())
|
||||
Self::System("system".to_string())
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -17,11 +17,19 @@ pub struct GetAlerter {
|
||||
|
||||
#[typeshare]
|
||||
#[derive(Serialize, Deserialize, Debug, Clone, Request)]
|
||||
#[response(Vec<Alerter>)]
|
||||
#[response(Vec<AlerterListItem>)]
|
||||
pub struct ListAlerters {
|
||||
pub query: Option<MongoDocument>,
|
||||
}
|
||||
|
||||
#[typeshare]
|
||||
#[derive(Serialize, Deserialize, Debug, Clone)]
|
||||
pub struct AlerterListItem {
|
||||
pub id: String,
|
||||
pub name: String,
|
||||
pub alerter_type: String,
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
#[typeshare]
|
||||
|
||||
@@ -17,11 +17,20 @@ pub struct GetBuilder {
|
||||
|
||||
#[typeshare]
|
||||
#[derive(Serialize, Deserialize, Debug, Clone, Request)]
|
||||
#[response(Vec<Builder>)]
|
||||
#[response(Vec<BuilderListItem>)]
|
||||
pub struct ListBuilders {
|
||||
pub query: Option<MongoDocument>,
|
||||
}
|
||||
|
||||
#[typeshare]
|
||||
#[derive(Serialize, Deserialize, Debug, Clone)]
|
||||
pub struct BuilderListItem {
|
||||
pub id: String,
|
||||
pub name: String,
|
||||
pub provider: String,
|
||||
pub instance_type: Option<String>,
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
#[typeshare]
|
||||
|
||||
@@ -39,7 +39,8 @@ pub struct DeploymentListItem {
|
||||
pub state: DockerContainerState,
|
||||
pub status: Option<String>,
|
||||
pub image: String,
|
||||
pub version: String,
|
||||
pub server_id: String,
|
||||
pub build_id: Option<String>,
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
@@ -2,10 +2,7 @@ use resolver_api::derive::Request;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use typeshare::typeshare;
|
||||
|
||||
use crate::{
|
||||
entities::{tag::Tag, update::ResourceTargetVariant},
|
||||
MongoDocument,
|
||||
};
|
||||
use crate::{entities::update::ResourceTargetVariant, MongoDocument};
|
||||
|
||||
use super::{BuildListItem, DeploymentListItem, RepoListItem, ServerListItem};
|
||||
|
||||
@@ -15,14 +12,6 @@ use super::{BuildListItem, DeploymentListItem, RepoListItem, ServerListItem};
|
||||
#[derive(Serialize, Deserialize, Debug, Clone, Request)]
|
||||
#[response(FindResourcesResponse)]
|
||||
pub struct FindResources {
|
||||
pub search: String,
|
||||
pub tags: Vec<Tag>,
|
||||
}
|
||||
|
||||
#[typeshare]
|
||||
#[derive(Serialize, Deserialize, Debug, Clone, Request)]
|
||||
#[response(FindResourcesResponse)]
|
||||
pub struct FindResourcesWithQuery {
|
||||
pub query: Option<MongoDocument>,
|
||||
pub resources: Option<Vec<ResourceTargetVariant>>,
|
||||
}
|
||||
|
||||
@@ -44,6 +44,7 @@ pub struct ServerListItem {
|
||||
pub name: String,
|
||||
pub status: ServerStatus,
|
||||
pub tags: Vec<String>,
|
||||
pub region: String,
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
Reference in New Issue
Block a user