use crate::sync_session::EventEnvelope;
use helix_core::Effect;
pub fn emit_for_kind(ev: &EventEnvelope) -> Effect {
use crate::sync_session::EventKind;
let msg_id = ev.msg_id.as_deref().unwrap_or("");
let seq = ev.seq.0;
let f = &ev.fields;
match ev.kind {
EventKind::PostUpsert => crate::acl::to_effect::emit_post_received_for_viewer(
ev.id,
seq,
msg_id,
f,
ev.viewer_user_id.as_str(),
),
EventKind::PostEdit => crate::acl::to_effect::emit_post_updated_for_viewer(
ev.id,
seq,
msg_id,
f,
ev.viewer_user_id.as_str(),
),
EventKind::PostRevoke => crate::acl::to_effect::emit_post_deleted_for_viewer(
ev.id,
seq,
msg_id,
f,
ev.event_id.as_str(),
ev.actor_id.as_str(),
ev.occurred_at,
ev.viewer_user_id.as_str(),
),
EventKind::PostRead => crate::acl::to_effect::emit_post_read_for_viewer(
ev.id,
seq,
msg_id,
f,
ev.viewer_user_id.as_str(),
),
EventKind::ChannelTerminalClosed => Effect::PersistFire { ops: Vec::new() },
EventKind::Other(_) => crate::acl::to_effect::emit_post_received(ev.id, seq, msg_id, f),
}
}
pub fn emit_for_canonical_kind(ev: &EventEnvelope) -> Effect {
use crate::sync_session::EventKind;
match ev.kind {
EventKind::PostUpsert => crate::acl::to_effect::emit_post_received_for_canonical_viewer(
ev.id,
ev.seq.0,
ev.msg_id.as_deref().unwrap_or(""),
&ev.fields,
ev.viewer_user_id.as_str(),
),
EventKind::PostRevoke => crate::acl::to_effect::emit_post_revoke_for_canonical_viewer(
ev.id,
ev.seq.0,
ev.msg_id.as_deref().unwrap_or(""),
&ev.fields,
),
_ => emit_for_kind(ev),
}
}
pub(super) fn collect_channel_update_for_post(
ev: &EventEnvelope,
source: &str,
out: &mut Vec<crate::channel_update::PendingChannelUpdate>,
) {
use crate::sync_session::EventKind;
if !matches!(ev.kind, EventKind::PostUpsert) {
return;
}
let Some(update) = ev.unread_bump.as_ref() else {
return;
};
if !update.visible {
return;
}
let msg_id = ev
.msg_id
.as_deref()
.filter(|id| !id.is_empty())
.unwrap_or(ev.fields.id.as_str());
out.push(
crate::channel_update::PendingChannelUpdate::new(
ev.id, ev.seq.0, msg_id, &ev.fields, update, source,
)
.with_causation_id(ev.causation_id.clone()),
);
}
pub(super) fn visible_post_for_storage(ev: &EventEnvelope) -> bool {
use crate::sync_session::EventKind;
match ev.kind {
EventKind::PostUpsert => ev.unread_bump.as_ref().map(|u| u.visible).unwrap_or(true),
EventKind::ChannelTerminalClosed => false,
EventKind::PostEdit | EventKind::PostRevoke | EventKind::PostRead | EventKind::Other(_) => {
true
}
}
}