Compare commits

...
2 Commits
Author SHA1 Message Date
Bendik Aagaard LynghaugandClaude Fable 5.1 3c68814030 Release 0.3.45
Test / test (push) Successful in 1m3s
Publish release / publish (push) Successful in 3m18s
A mail stream that cannot be created at boot is a warning, not a
failed start.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-23 21:24:09 +02:00
Bendik Aagaard LynghaugandClaude Fable 5.1 0c68396d5b Release 0.3.44
Test / test (push) Failing after 1m3s
Publish release / publish (push) Successful in 3m6s
The mail stream is `mail`, not shouted; gdo 0.1.2 matches.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-23 21:15:40 +02:00
5 changed files with 17 additions and 4 deletions
+8
View File
@@ -4,6 +4,14 @@ One line per change, grouped by the release that shipped it. Newest
first. A release is a Cargo.toml bump plus a `v<version>` tag; the first. A release is a Cargo.toml bump plus a `v<version>` tag; the
content repos pin the tag they run (see the end of this file). content repos pin the tag they run (see the end of this file).
## 0.3.45 (2026-09-23)
- A mail stream that cannot be created at boot (subjects owned by an older stream) is a warning, not a failed start; 0.3.44 took the kasse sites down for two minutes on the rename.
## 0.3.44 (2026-09-23)
- The mail stream is named `mail` (was `WORMHOLE`); gdo 0.1.2 matches. Delete the old stream on each NATS after upgrading both.
## 0.3.43 (2026-09-23) ## 0.3.43 (2026-09-23)
- Mail is content: `mail: { to, subject, body }` on a state in aggregates.yaml sends when a record enters that state (`to: submitter` or one address; `{field}`, `{site}`, `{chain}`, `{email}` in the templates), and an invite mails its one-time link built in; `site.yaml` gains `mail: { from, reply_to, invite }`. Portal renders and publishes on `portal.mail.send` in the `WORMHOLE` stream; uhhm/gdo delivers. The lint requires a required `email` field on every form recording into a bucket that mails the submitter. - Mail is content: `mail: { to, subject, body }` on a state in aggregates.yaml sends when a record enters that state (`to: submitter` or one address; `{field}`, `{site}`, `{chain}`, `{email}` in the templates), and an invite mails its one-time link built in; `site.yaml` gains `mail: { from, reply_to, invite }`. Portal renders and publishes on `portal.mail.send` in the `WORMHOLE` stream; uhhm/gdo delivers. The lint requires a required `email` field on every form recording into a bucket that mails the submitter.
Generated
+1 -1
View File
@@ -3265,7 +3265,7 @@ dependencies = [
[[package]] [[package]]
name = "portal" name = "portal"
version = "0.3.43" version = "0.3.45"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"arc-swap", "arc-swap",
+1 -1
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "portal" name = "portal"
version = "0.3.43" version = "0.3.45"
edition = "2021" edition = "2021"
[lib] [lib]
+1 -1
View File
@@ -16,7 +16,7 @@ use std::time::Duration;
/// The stream both sides create on boot, with the same config, so /// The stream both sides create on boot, with the same config, so
/// whichever starts first owns nothing the other lacks. /// whichever starts first owns nothing the other lacks.
pub const STREAM: &str = "WORMHOLE"; pub const STREAM: &str = "mail";
pub const SUBJECTS: &str = "portal.mail.>"; pub const SUBJECTS: &str = "portal.mail.>";
pub const SUBJECT: &str = "portal.mail.send"; pub const SUBJECT: &str = "portal.mail.send";
/// Bumped when `Outgoing` changes shape; gdo refuses what it does not /// Bumped when `Outgoing` changes shape; gdo refuses what it does not
+6 -1
View File
@@ -62,7 +62,12 @@ async fn main() -> anyhow::Result<()> {
portal::events::store::ensure_stream(&jetstream).await?; portal::events::store::ensure_stream(&jetstream).await?;
// Outgoing mail waits here for gdo; a mail is never lost to gdo // Outgoing mail waits here for gdo; a mail is never lost to gdo
// being down, and never sent by portal itself. // being down, and never sent by portal itself.
portal::mail::ensure_stream(&jetstream).await?; // Best-effort: a stream that already owns these subjects under an
// older name (a rename mid-upgrade) must not keep a site from
// booting; mail waits until the old stream is removed.
if let Err(e) = portal::mail::ensure_stream(&jetstream).await {
tracing::warn!("the mail stream could not be created: {e} - outgoing mail is off until a stream owns portal.mail.>");
}
let oidc_state = Arc::new(oidc::Oidc::from_env().await?); let oidc_state = Arc::new(oidc::Oidc::from_env().await?);