mirror of
https://github.com/moghtech/komodo.git
synced 2026-10-28 08:00:37 +00:00
export all resources toml filter resources by tag
This commit is contained in:
@@ -18,7 +18,7 @@ use monitor_client::{
|
||||
permission::{PermissionLevel, UserTarget},
|
||||
procedure::Procedure,
|
||||
repo::Repo,
|
||||
resource::Resource,
|
||||
resource::{Resource, ResourceQuery},
|
||||
server::Server,
|
||||
server_template::ServerTemplate,
|
||||
toml::{
|
||||
@@ -40,32 +40,41 @@ use crate::{
|
||||
impl Resolve<ExportAllResourcesToToml, User> for State {
|
||||
async fn resolve(
|
||||
&self,
|
||||
ExportAllResourcesToToml {}: ExportAllResourcesToToml,
|
||||
ExportAllResourcesToToml { tags }: ExportAllResourcesToToml,
|
||||
user: User,
|
||||
) -> anyhow::Result<ExportAllResourcesToTomlResponse> {
|
||||
let mut targets = Vec::<ResourceTarget>::new();
|
||||
|
||||
targets.extend(
|
||||
resource::list_for_user::<Alerter>(Default::default(), &user)
|
||||
.await?
|
||||
.into_iter()
|
||||
.map(|resource| ResourceTarget::Alerter(resource.id)),
|
||||
resource::list_for_user::<Alerter>(
|
||||
ResourceQuery::builder().tags(tags.clone()).build(),
|
||||
&user,
|
||||
)
|
||||
.await?
|
||||
.into_iter()
|
||||
.map(|resource| ResourceTarget::Alerter(resource.id)),
|
||||
);
|
||||
targets.extend(
|
||||
resource::list_for_user::<Builder>(Default::default(), &user)
|
||||
.await?
|
||||
.into_iter()
|
||||
.map(|resource| ResourceTarget::Builder(resource.id)),
|
||||
resource::list_for_user::<Builder>(
|
||||
ResourceQuery::builder().tags(tags.clone()).build(),
|
||||
&user,
|
||||
)
|
||||
.await?
|
||||
.into_iter()
|
||||
.map(|resource| ResourceTarget::Builder(resource.id)),
|
||||
);
|
||||
targets.extend(
|
||||
resource::list_for_user::<Server>(Default::default(), &user)
|
||||
.await?
|
||||
.into_iter()
|
||||
.map(|resource| ResourceTarget::Server(resource.id)),
|
||||
resource::list_for_user::<Server>(
|
||||
ResourceQuery::builder().tags(tags.clone()).build(),
|
||||
&user,
|
||||
)
|
||||
.await?
|
||||
.into_iter()
|
||||
.map(|resource| ResourceTarget::Server(resource.id)),
|
||||
);
|
||||
targets.extend(
|
||||
resource::list_for_user::<Deployment>(
|
||||
Default::default(),
|
||||
ResourceQuery::builder().tags(tags.clone()).build(),
|
||||
&user,
|
||||
)
|
||||
.await?
|
||||
@@ -73,26 +82,35 @@ impl Resolve<ExportAllResourcesToToml, User> for State {
|
||||
.map(|resource| ResourceTarget::Deployment(resource.id)),
|
||||
);
|
||||
targets.extend(
|
||||
resource::list_for_user::<Build>(Default::default(), &user)
|
||||
.await?
|
||||
.into_iter()
|
||||
.map(|resource| ResourceTarget::Build(resource.id)),
|
||||
resource::list_for_user::<Build>(
|
||||
ResourceQuery::builder().tags(tags.clone()).build(),
|
||||
&user,
|
||||
)
|
||||
.await?
|
||||
.into_iter()
|
||||
.map(|resource| ResourceTarget::Build(resource.id)),
|
||||
);
|
||||
targets.extend(
|
||||
resource::list_for_user::<Repo>(Default::default(), &user)
|
||||
.await?
|
||||
.into_iter()
|
||||
.map(|resource| ResourceTarget::Repo(resource.id)),
|
||||
resource::list_for_user::<Repo>(
|
||||
ResourceQuery::builder().tags(tags.clone()).build(),
|
||||
&user,
|
||||
)
|
||||
.await?
|
||||
.into_iter()
|
||||
.map(|resource| ResourceTarget::Repo(resource.id)),
|
||||
);
|
||||
targets.extend(
|
||||
resource::list_for_user::<Procedure>(Default::default(), &user)
|
||||
.await?
|
||||
.into_iter()
|
||||
.map(|resource| ResourceTarget::Procedure(resource.id)),
|
||||
resource::list_for_user::<Procedure>(
|
||||
ResourceQuery::builder().tags(tags.clone()).build(),
|
||||
&user,
|
||||
)
|
||||
.await?
|
||||
.into_iter()
|
||||
.map(|resource| ResourceTarget::Procedure(resource.id)),
|
||||
);
|
||||
targets.extend(
|
||||
resource::list_for_user::<ServerTemplate>(
|
||||
Default::default(),
|
||||
ResourceQuery::builder().tags(tags).build(),
|
||||
&user,
|
||||
)
|
||||
.await?
|
||||
|
||||
@@ -25,7 +25,11 @@ pub struct TomlResponse {
|
||||
)]
|
||||
#[empty_traits(MonitorReadRequest)]
|
||||
#[response(ExportAllResourcesToTomlResponse)]
|
||||
pub struct ExportAllResourcesToToml {}
|
||||
pub struct ExportAllResourcesToToml {
|
||||
/// Tag name or id. Empty array will not filter by tag.
|
||||
#[serde(default)]
|
||||
pub tags: Vec<String>,
|
||||
}
|
||||
|
||||
#[typeshare]
|
||||
pub type ExportAllResourcesToTomlResponse = TomlResponse;
|
||||
|
||||
@@ -698,7 +698,7 @@ export interface ProcedureStage {
|
||||
/** Whether the stage should be run as part of the procedure. */
|
||||
enabled: boolean;
|
||||
/** The executions in the stage */
|
||||
executions: EnabledExecution[];
|
||||
executions?: EnabledExecution[];
|
||||
}
|
||||
|
||||
/** Config for the [Procedure] */
|
||||
@@ -2513,6 +2513,8 @@ export interface ListTags {
|
||||
* Response: [TomlResponse].
|
||||
*/
|
||||
export interface ExportAllResourcesToToml {
|
||||
/** Tag name or id. Empty array will not filter by tag. */
|
||||
tags?: string[];
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -15,9 +15,11 @@ import { CopyButton } from "./util";
|
||||
export const ExportButton = ({
|
||||
target,
|
||||
user_group,
|
||||
tags,
|
||||
}: {
|
||||
target?: Types.ResourceTarget;
|
||||
user_group?: string;
|
||||
tags?: string[];
|
||||
}) => {
|
||||
const [open, setOpen] = useState(false);
|
||||
return (
|
||||
@@ -35,7 +37,7 @@ export const ExportButton = ({
|
||||
{target || user_group ? (
|
||||
<ExportTargetLoader target={target} user_group={user_group} />
|
||||
) : (
|
||||
<ExportAllLoader />
|
||||
<ExportAllLoader tags={tags} />
|
||||
)}
|
||||
</DialogContent>
|
||||
</Dialog>
|
||||
@@ -56,8 +58,8 @@ const ExportTargetLoader = ({
|
||||
return <ExportPre loading={isPending} content={data?.toml} />;
|
||||
};
|
||||
|
||||
const ExportAllLoader = () => {
|
||||
const { data, isPending } = useRead("ExportAllResourcesToToml", {});
|
||||
const ExportAllLoader = ({ tags }: { tags?: string[] }) => {
|
||||
const { data, isPending } = useRead("ExportAllResourcesToToml", { tags });
|
||||
return <ExportPre loading={isPending} content={data?.toml} />;
|
||||
};
|
||||
|
||||
|
||||
@@ -241,7 +241,7 @@ export const atomWithStorage = <T>(key: string, init: T) => {
|
||||
export const tagsAtom = atomWithStorage<string[]>("tags-v0", []);
|
||||
|
||||
export const useTagsFilter = () => {
|
||||
const [tags] = useAtom(tagsAtom);
|
||||
const [tags] = useAtom<string[]>(tagsAtom);
|
||||
return tags;
|
||||
};
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@ import { useState } from "react";
|
||||
|
||||
export const AllResources = () => {
|
||||
const [search, setSearch] = useState("");
|
||||
const tags = useTagsFilter();
|
||||
return (
|
||||
<Page
|
||||
titleOther={
|
||||
@@ -21,7 +22,7 @@ export const AllResources = () => {
|
||||
placeholder="search..."
|
||||
className="w-[200px] lg:w-[300px]"
|
||||
/>
|
||||
<ExportButton />
|
||||
<ExportButton tags={tags} />
|
||||
</div>
|
||||
<TagsFilter />
|
||||
</div>
|
||||
|
||||
@@ -30,7 +30,7 @@ export const Tree = () => {
|
||||
placeholder="search..."
|
||||
className="w-[200px] lg:w-[300px]"
|
||||
/>
|
||||
<ExportButton />
|
||||
<ExportButton tags={tags} />
|
||||
</div>
|
||||
<TagsFilter />
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user