use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use uuid::Uuid;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
#[serde(rename_all = "lowercase")]
pub enum NoteFormat {
#[default]
Plain,
Markdown,
}
impl NoteFormat {
pub fn is_markdown(self) -> bool {
self == NoteFormat::Markdown
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Note {
#[serde(default = "Uuid::new_v4")]
pub uuid: Uuid,
#[serde(default)]
pub title: Option<String>,
pub body: String,
#[serde(default)]
pub format: NoteFormat,
#[serde(default)]
pub tags: Vec<String>,
#[serde(default)]
pub language: Option<String>,
#[serde(default)]
pub project_id: Option<Uuid>,
#[serde(default)]
pub task_id: Option<Uuid>,
#[serde(default)]
pub resource_ids: Vec<Uuid>,
pub created_at: DateTime<Utc>,
#[serde(default)]
pub updated_at: Option<DateTime<Utc>>,
#[serde(default)]
pub deleted_at: Option<DateTime<Utc>>,
}
impl Note {
pub fn new(body: String) -> Self {
Self {
uuid: Uuid::new_v4(),
title: None,
body,
format: NoteFormat::Plain,
tags: Vec::new(),
language: None,
project_id: None,
task_id: None,
resource_ids: Vec::new(),
created_at: Utc::now(),
updated_at: Some(Utc::now()),
deleted_at: None,
}
}
pub fn new_markdown(body: String) -> Self {
Self {
format: NoteFormat::Markdown,
..Self::new(body)
}
}
pub fn touch(&mut self) {
self.updated_at = Some(Utc::now());
}
pub fn soft_delete(&mut self) {
self.deleted_at = Some(Utc::now());
self.touch();
}
pub fn is_deleted(&self) -> bool {
self.deleted_at.is_some()
}
pub fn is_markdown(&self) -> bool {
self.format.is_markdown()
}
pub fn belongs_to_project(&self, project_id: Uuid) -> bool {
self.project_id == Some(project_id)
}
pub fn belongs_to_task(&self, task_id: Uuid) -> bool {
self.task_id == Some(task_id)
}
pub fn references_resource(&self, resource_id: Uuid) -> bool {
self.resource_ids.contains(&resource_id)
}
pub fn add_resource(&mut self, resource_id: Uuid) {
if !self.resource_ids.contains(&resource_id) {
self.resource_ids.push(resource_id);
}
}
pub fn remove_resource(&mut self, resource_id: Uuid) {
self.resource_ids.retain(|id| *id != resource_id);
}
}