add fields to list resources

This commit is contained in:
mbecker20
2023-08-04 20:43:57 -04:00
parent 5eea95d118
commit c66fc2d6de
18 changed files with 306 additions and 257 deletions

View File

@@ -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
}
}

View File

@@ -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
}
}

View File

@@ -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
}
}

View File

@@ -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
}
}

View File

@@ -40,7 +40,6 @@ enum ReadRequest {
// ==== SEARCH ====
FindResources(FindResources),
FindResourcesWithQuery(FindResourcesWithQuery),
// ==== SERVER ====
GetServersSummary(GetServersSummary),

View File

@@ -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
}
}

View File

@@ -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
// }

View File

@@ -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
}
}

View File

@@ -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",

View File

@@ -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(),
})
}
}

View File

@@ -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;

View File

@@ -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;
}};

View File

@@ -131,7 +131,7 @@ pub enum ResourceTarget {
impl Default for ResourceTarget {
fn default() -> Self {
Self::System("System".to_string())
Self::System("system".to_string())
}
}

View File

@@ -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]

View File

@@ -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]

View File

@@ -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>,
}
//

View File

@@ -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>>,
}

View File

@@ -44,6 +44,7 @@ pub struct ServerListItem {
pub name: String,
pub status: ServerStatus,
pub tags: Vec<String>,
pub region: String,
}
//