OXYGENHUB

Coverage / crates/spectra-core/src/projections.rs 100.0%

13 of 13 lines run, 2 of 4 functions · run #26 on main · run missed

1
//! Projections (spec §9.3): tables kept from the ledger in the same
2
//! transaction as each append, and rebuilt from it by `spectra admin
3
//! rebuild`. Every table here must be a function of the events alone; the
4
//! test harness and `spectra admin check` hold them to it.
5
6
use crate::event::Event;
7
use sqlx::SqliteConnection;
8
9
/// The projection tables, in the order they are cleared and compared.
10
pub const TABLES: &[&str] = &[
11
    "event_counts",
12
    "identities",
13
    "agents",
14
    "projects",
15
    "project_relations",
16
    "presence",
17
    "sessions",
18
    "channels",
19
    "messages",
20
    "reactions",
21
    "inbox",
22
    "messages_fts",
23
];
24
25
/// Apply one event to every projection.
2642610×
pub async fn apply(conn: &mut SqliteConnection, e: &Event) -> sqlx::Result<()> {
2742610×
    sqlx::query("INSERT INTO event_counts (kind, n) VALUES (?, 1) ON CONFLICT(kind) DO UPDATE SET n = n + 1")
2842610×
        .bind(&e.kind)
2942610×
        .execute(&mut *conn)
3042610×
        .await?;
3142610×
    crate::principals::project(conn, e).await?;
3242610×
    crate::projects::project(conn, e).await?;
3342610×
    crate::presence::project(conn, e).await?;
3442610×
    crate::conversation::project(conn, e).await?;
3542610×
    crate::rules::project(conn, e).await?;
3642610×
    Ok(())
3742610×
}