use crate::state::ChannelId;
use helix_core::effect::{BatchDeleteSpec, BatchUpdateSpec, Row, SqlValue, StorageOp, UpsertSpec};
use helix_core::Effect;
pub fn channel_set_cols(channel_id: ChannelId, cols: Vec<(&'static str, SqlValue)>) -> Effect {
Effect::PersistFire {
ops: vec![channel_set_cols_op(channel_id, cols)],
}
}
pub fn channel_set_cols_op(
channel_id: ChannelId,
cols: Vec<(&'static str, SqlValue)>,
) -> StorageOp {
let patch: Row = cols.into_iter().map(|(k, v)| (k.to_string(), v)).collect();
StorageOp::BatchUpdate(BatchUpdateSpec {
table: "channel",
key_col: "id",
key_vals: vec![SqlValue::Text(channel_id.as_str().to_string())],
patch,
})
}
pub struct MemberRow {
pub user_id: String,
pub team_id: String,
pub role: String,
pub nick_name: String,
}
pub fn upsert_channel_members(channel_id: ChannelId, members: Vec<MemberRow>) -> Option<Effect> {
Some(Effect::PersistFire {
ops: vec![upsert_channel_members_op(channel_id, members)?],
})
}
pub fn upsert_channel_members_op(
channel_id: ChannelId,
members: Vec<MemberRow>,
) -> Option<StorageOp> {
if members.is_empty() {
return None;
}
let cid = channel_id.as_str().to_string();
let rows: Vec<Row> = members
.into_iter()
.map(|m| {
vec![
("channel_id".to_string(), SqlValue::Text(cid.clone())),
("user_id".to_string(), SqlValue::Text(m.user_id)),
("team_id".to_string(), SqlValue::Text(m.team_id)),
("role".to_string(), SqlValue::Text(m.role)),
("nick_name".to_string(), SqlValue::Text(m.nick_name)),
]
})
.collect();
Some(StorageOp::BatchUpsert(UpsertSpec {
version_column: None,
update_guard: None,
table: "channel_member",
rows,
conflict_key: Some("channel_id,user_id"),
exclude_from_update: Vec::new(),
}))
}
pub fn delete_channel_members(channel_id: ChannelId, user_ids: Vec<String>) -> Option<Effect> {
Some(Effect::PersistFire {
ops: vec![delete_channel_members_op(channel_id, user_ids)?],
})
}
pub fn delete_channel_members_op(
channel_id: ChannelId,
user_ids: Vec<String>,
) -> Option<StorageOp> {
if user_ids.is_empty() {
return None;
}
Some(StorageOp::BatchDelete(BatchDeleteSpec {
table: "channel_member",
scope_col: "channel_id",
scope_val: SqlValue::Text(channel_id.as_str().to_string()),
key_col: "user_id",
key_vals: user_ids.into_iter().map(SqlValue::Text).collect(),
}))
}
pub fn update_member_nickname_op(
channel_id: ChannelId,
user_id: &str,
nick_name: &str,
) -> StorageOp {
let row: Row = vec![
(
"channel_id".to_string(),
SqlValue::Text(channel_id.as_str().to_string()),
),
("user_id".to_string(), SqlValue::Text(user_id.to_string())),
(
"nick_name".to_string(),
SqlValue::Text(nick_name.to_string()),
),
];
StorageOp::BatchUpsert(UpsertSpec {
version_column: None,
update_guard: None,
table: "channel_member",
rows: vec![row],
conflict_key: Some("channel_id,user_id"),
exclude_from_update: vec!["team_id", "role"],
})
}
pub fn update_member_nickname(channel_id: ChannelId, user_id: &str, nick_name: &str) -> Effect {
Effect::PersistFire {
ops: vec![update_member_nickname_op(channel_id, user_id, nick_name)],
}
}