summaryrefslogtreecommitdiff
path: root/legacy_data/src/data/local/latest_info.rs
blob: 57487930017fa2af6d7ac54ff359da66b8ffe735 (plain)
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
use std::{
    collections::{HashMap, HashSet},
    path::{Path, PathBuf},
    time::SystemTime,
};

use cfg_file::ConfigFile;
use serde::{Deserialize, Serialize};

use crate::{
    constants::{CLIENT_FILE_LATEST_INFO, CLIENT_FILE_LATEST_INFO_NOSET, KEY_ACCOUNT},
    data::{
        member::{Member, MemberId},
        sheet::{SheetData, SheetName, SheetPathBuf},
        vault::{
            mapping_share::{Share, SheetShareId},
            virtual_file::VirtualFileId,
        },
    },
};

/// # Latest Info
/// Locally cached latest information,
/// used to cache personal information from upstream for querying and quickly retrieving member information.
#[derive(Default, Serialize, Deserialize, ConfigFile)]
#[cfg_file(path = CLIENT_FILE_LATEST_INFO_NOSET)]
pub struct LatestInfo {
    // Sheets
    /// Visible sheets,
    /// indicating which sheets I can edit
    #[serde(rename = "my")]
    pub visible_sheets: Vec<SheetName>,

    /// Invisible sheets,
    /// indicating which sheets I can export files to (these sheets are not readable to me)
    #[serde(rename = "others")]
    pub invisible_sheets: Vec<SheetInfo>,

    /// Reference sheets,
    /// indicating sheets owned by the host, visible to everyone,
    /// but only the host can modify or add mappings within them
    #[serde(rename = "refsheets")]
    pub reference_sheets: HashSet<SheetName>,

    /// Reference sheet data, indicating what files I can get from the reference sheet
    #[serde(rename = "ref")]
    pub ref_sheet_content: SheetData,

    /// Reverse mapping from virtual file IDs to actual paths in reference sheets
    #[serde(rename = "ref_vfs")]
    pub ref_sheet_vfs_mapping: HashMap<VirtualFileId, SheetPathBuf>,

    /// Shares in my sheets, indicating which external merge requests have entries that I can view
    #[serde(rename = "shares")]
    pub shares_in_my_sheets: HashMap<SheetName, HashMap<SheetShareId, Share>>,

    /// Update instant
    #[serde(rename = "update")]
    pub update_instant: Option<SystemTime>,

    // Members
    /// All member information of the vault, allowing me to contact them more conveniently
    #[serde(rename = "members")]
    pub vault_members: Vec<Member>,
}

impl LatestInfo {
    /// Get the path to the latest info file for a given workspace and member ID
    pub fn latest_info_path(local_workspace_path: &Path, member_id: &MemberId) -> PathBuf {
        local_workspace_path.join(CLIENT_FILE_LATEST_INFO.replace(KEY_ACCOUNT, member_id))
    }
}

#[derive(Default, Serialize, Deserialize)]
pub struct SheetInfo {
    #[serde(rename = "name")]
    pub sheet_name: SheetName,

    #[serde(rename = "holder")]
    pub holder_name: Option<MemberId>,
}