1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
use crate::files::FileService;

use rustimate_core::member::Member;
use rustimate_core::session::EstimateSession;
use rustimate_core::{Error, Result};

use std::sync::Arc;

#[derive(Clone, Debug)]
pub struct SessionService {
  files: Arc<FileService>,
  log: slog::Logger,
  sockets: std::collections::HashMap<String, String>
}

impl SessionService {
  pub fn new(files: Arc<FileService>, logger: slog::Logger) -> SessionService {
    let log = logger.new(slog::o!("service" => "session"));
    let sockets = std::collections::HashMap::new();
    SessionService { files, log, sockets }
  }

  pub fn read_session(&self, key: &str) -> Result<EstimateSession> {
    slog::debug!(&self.log, "Loading session [{}]", key);
    let p = format!("session/{}/session.json", key);
    if self.files.exists(&p) {
      self.files.read_json(&p)
    } else {
      Err(Error::from(format!("No session found with key [{}]", key)))
    }
  }

  pub fn write_session(&mut self, session: &EstimateSession) -> Result<()> {
    self.files.create_dir_if_needed(&format!("session/{}", session.key()))?;
    slog::debug!(&self.log, "Writing session [{}]", session.key());
    self.files.write_json(session, &format!("session/{}/session.json", session.key()))
  }

  pub fn read_members(&self, key: &str) -> Result<Vec<Member>> {
    slog::debug!(&self.log, "Loading members for session [{}]", key);
    let p = format!("session/{}/members.json", key);
    if self.files.exists(&p) {
      self.files.read_json(&p)
    } else {
      Ok(vec![])
    }
  }

  pub fn add_member(&mut self, key: &str, m: Member) -> Result<()> {
    let mut current = self.read_members(key)?;
    if current.iter().find(|x| x.user_id() == m.user_id()).is_some() {
      Ok(())
    } else {
      current.push(m);
      self.write_members(key, current)
    }
  }

  pub fn write_members(&mut self, key: &str, vm: Vec<Member>) -> Result<()> {
    let p = format!("session/{}/members.json", key);
    self.files.write_json(vm, &p)
  }
}