blob: f6a0c83263017f851a15c710248b686a2506983e [file]
use crate::streaming::users::user::User;
use iggy::models::permissions::{GlobalPermissions, StreamPermissions};
use iggy::models::user_info::UserId;
use serde::{Deserialize, Serialize};
use std::collections::{HashMap, HashSet};
#[derive(Debug, Serialize, Deserialize, Default)]
pub struct Permissioner {
pub(super) users_permissions: HashMap<UserId, GlobalPermissions>,
pub(super) users_streams_permissions: HashMap<(UserId, u32), StreamPermissions>,
pub(super) users_that_can_poll_messages_from_all_streams: HashSet<UserId>,
pub(super) users_that_can_send_messages_to_all_streams: HashSet<UserId>,
pub(super) users_that_can_poll_messages_from_specific_streams: HashSet<(UserId, u32)>,
pub(super) users_that_can_send_messages_to_specific_streams: HashSet<(UserId, u32)>,
}
impl Permissioner {
pub fn init(&mut self, users: Vec<User>) {
for user in users {
self.init_permissions_for_user(user);
}
}
pub fn init_permissions_for_user(&mut self, user: User) {
if user.permissions.is_none() {
return;
}
let permissions = user.permissions.unwrap();
if permissions.global.poll_messages {
self.users_that_can_poll_messages_from_all_streams
.insert(user.id);
}
if permissions.global.send_messages {
self.users_that_can_send_messages_to_all_streams
.insert(user.id);
}
self.users_permissions.insert(user.id, permissions.global);
if permissions.streams.is_none() {
return;
}
let streams = permissions.streams.unwrap();
for (stream_id, stream) in streams {
if stream.poll_messages {
self.users_that_can_poll_messages_from_specific_streams
.insert((user.id, stream_id));
}
if stream.send_messages {
self.users_that_can_send_messages_to_specific_streams
.insert((user.id, stream_id));
}
self.users_streams_permissions
.insert((user.id, stream_id), stream);
}
}
pub fn update_permissions_for_user(&mut self, user: User) {
self.delete_permissions_for_user(user.id);
self.init_permissions_for_user(user);
}
pub fn delete_permissions_for_user(&mut self, user_id: UserId) {
self.users_permissions.remove(&user_id);
self.users_that_can_poll_messages_from_all_streams
.remove(&user_id);
self.users_that_can_send_messages_to_all_streams
.remove(&user_id);
self.users_streams_permissions
.retain(|(id, _), _| *id != user_id);
self.users_that_can_poll_messages_from_specific_streams
.retain(|(id, _)| *id != user_id);
self.users_that_can_send_messages_to_specific_streams
.retain(|(id, _)| *id != user_id);
}
}