use crate::state::ChannelId;
use helix_core::effect::{BatchUpdateSpec, Row, SqlValue, StorageOp, UpsertSpec};
use serde_json::Value;
pub fn message_v3_revoke_channel_ops(
channel_id: ChannelId,
auth_user_id: &str,
last_post: &Value,
) -> Vec<StorageOp> {
let encoded = last_post.to_string();
let create_at = last_post.get("createAt").and_then(Value::as_i64);
let mut patch: Row = vec![("last_post".to_string(), SqlValue::Text(encoded.clone()))];
let mut member_row: Row = vec![
(
"channel_id".to_string(),
SqlValue::Text(channel_id.as_str().to_string()),
),
(
"user_id".to_string(),
SqlValue::Text(auth_user_id.to_string()),
),
("last_post".to_string(), SqlValue::Text(encoded)),
];
if let Some(create_at) = create_at {
for target in [&mut patch, &mut member_row] {
target.push(("last_post_at".to_string(), SqlValue::Integer(create_at)));
target.push((
"last_root_post_at".to_string(),
SqlValue::Integer(create_at),
));
}
}
vec![
StorageOp::BatchUpdate(BatchUpdateSpec {
table: "channel",
key_col: "id",
key_vals: vec![SqlValue::Text(channel_id.as_str().to_string())],
patch,
}),
StorageOp::BatchUpsert(UpsertSpec {
version_column: None,
update_guard: None,
table: "channel_member",
rows: vec![member_row],
conflict_key: Some("channel_id,user_id"),
exclude_from_update: Vec::new(),
}),
]
}