archetype flows behave like the built-ins: switch off per archetype or per agent, board cards, duplicate
The document's disabled list takes archetype:<archetype>/<flow> (off for every member) and the same with @<agent> (off for one member); a key naming nothing is ignored. GET /api/notify/flows lists the archetype flows with their members, the board draws a card for each with a switch, a checkbox per agent and duplicate, and the dry run counts their hits. The flows keep following the archetype.
This commit is contained in:
parent
1efbb72fdd
commit
68c24643f6
1 changed files with 908 additions and 102 deletions
|
|
@ -46,7 +46,7 @@ pub async fn serve(client: async_nats::Client) {
|
|||
tokio::spawn(async move {
|
||||
let Some(reply) = request.reply else { return };
|
||||
let answer = if dry_run {
|
||||
dry_run_answer(&js, &request.payload).await
|
||||
dry_run_answer(&client, &js, &request.payload).await
|
||||
} else {
|
||||
deliveries_answer(&js, &request.payload).await
|
||||
};
|
||||
|
|
@ -91,7 +91,32 @@ async fn deliveries_answer(js: &jetstream::Context, payload: &[u8]) -> Vec<u8> {
|
|||
)
|
||||
}
|
||||
|
||||
async fn dry_run_answer(js: &jetstream::Context, payload: &[u8]) -> Vec<u8> {
|
||||
/// The archetypes' flows as they run under `document`'s switches. A bucket that
|
||||
/// cannot be read leaves them out of the counts.
|
||||
async fn archetype_flows(
|
||||
client: &async_nats::Client,
|
||||
js: &jetstream::Context,
|
||||
document: &swarm_wire::notify_flows::Document,
|
||||
) -> Vec<crate::flow::ArchetypeFlow> {
|
||||
let found = async {
|
||||
let roster = crate::roster_of(js).await.map_err(|e| format!("{e:#}"))?;
|
||||
crate::archetype_flows::load(client, &roster).await
|
||||
}
|
||||
.await;
|
||||
match found {
|
||||
Ok(found) => crate::archetype_flows::enabled(&found, &document.disabled_builtins),
|
||||
Err(why) => {
|
||||
tracing::warn!(%why, "notify router: a dry run without the archetype flows");
|
||||
Vec::new()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async fn dry_run_answer(
|
||||
client: &async_nats::Client,
|
||||
js: &jetstream::Context,
|
||||
payload: &[u8],
|
||||
) -> Vec<u8> {
|
||||
body(
|
||||
async {
|
||||
let request: DryRunRequest = serde_json::from_slice(payload)?;
|
||||
|
|
@ -100,6 +125,7 @@ async fn dry_run_answer(js: &jetstream::Context, payload: &[u8]) -> Vec<u8> {
|
|||
.check()
|
||||
.map_err(|why| anyhow::anyhow!("the document fails its check: {why}"))?;
|
||||
let (flows, _) = request.document.active();
|
||||
let archetype = archetype_flows(client, js, &request.document).await;
|
||||
let mut events: Vec<(String, Vec<u8>)> =
|
||||
log::newest(js, forge_events::STREAM, DRY_RUN_EVENTS)
|
||||
.await?
|
||||
|
|
@ -109,7 +135,7 @@ async fn dry_run_answer(js: &jetstream::Context, payload: &[u8]) -> Vec<u8> {
|
|||
})
|
||||
.collect();
|
||||
events.reverse();
|
||||
Ok(dry_run::run(&flows, &events))
|
||||
Ok(dry_run::run(&flows, &archetype, &events))
|
||||
}
|
||||
.await,
|
||||
)
|
||||
|
|
|
|||
Loading…
Reference in a new issue