tetratto/crates/core/src/model/journals.rs
2025-06-26 02:56:22 -04:00

84 lines
2.2 KiB
Rust

use serde::{Serialize, Deserialize};
use tetratto_shared::{snow::Snowflake, unix_epoch_timestamp};
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
pub enum JournalPrivacyPermission {
/// Can be accessed by anyone via link.
Public,
/// Visible only to the journal owner.
Private,
}
impl Default for JournalPrivacyPermission {
fn default() -> Self {
Self::Private
}
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct Journal {
pub id: usize,
pub created: usize,
pub owner: usize,
pub title: String,
pub privacy: JournalPrivacyPermission,
/// An array of directories notes can be placed in.
///
/// `Vec<(id, parent id, name)>`
pub dirs: Vec<(usize, usize, String)>,
}
impl Journal {
/// Create a new [`Journal`].
pub fn new(owner: usize, title: String) -> Self {
Self {
id: Snowflake::new().to_string().parse::<usize>().unwrap(),
created: unix_epoch_timestamp(),
owner,
title,
privacy: JournalPrivacyPermission::default(),
dirs: Vec::new(),
}
}
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct Note {
pub id: usize,
pub created: usize,
pub owner: usize,
pub title: String,
/// The ID of the [`Journal`] this note belongs to.
///
/// The note is subject to the settings set for the journal it's in.
pub journal: usize,
pub content: String,
pub edited: usize,
/// The "id" of the directoryy this note is in.
///
/// Directories are held in the journal in the `dirs` column.
pub dir: usize,
/// An array of tags associated with the note.
pub tags: Vec<String>,
pub is_global: bool,
}
impl Note {
/// Create a new [`Note`].
pub fn new(owner: usize, title: String, journal: usize, content: String) -> Self {
let created = unix_epoch_timestamp();
Self {
id: Snowflake::new().to_string().parse::<usize>().unwrap(),
created,
owner,
title,
journal,
content,
edited: created,
dir: 0,
tags: Vec::new(),
is_global: false,
}
}
}