export all resources toml filter resources by tag

This commit is contained in:
mbecker20
2024-06-04 02:11:07 -07:00
parent 5fdaa9a808
commit 3504c083b4
7 changed files with 63 additions and 36 deletions
+46 -28
View File
@@ -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?
+5 -1
View File
@@ -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;
+3 -1
View File
@@ -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[];
}
/**
+5 -3
View File
@@ -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} />;
};
+1 -1
View File
@@ -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;
};
+2 -1
View File
@@ -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>
+1 -1
View File
@@ -30,7 +30,7 @@ export const Tree = () => {
placeholder="search..."
className="w-[200px] lg:w-[300px]"
/>
<ExportButton />
<ExportButton tags={tags} />
</div>
<TagsFilter />
</div>