From 1a6b48078ab5d8b83406713620c064fc28cc59f5 Mon Sep 17 00:00:00 2001 From: trisua Date: Mon, 24 Mar 2025 20:23:52 -0400 Subject: [PATCH] add: journal entry context --- .../app/src/routes/api/v1/journal/entries.rs | 24 ++++++++++++++++++- crates/app/src/routes/api/v1/mod.rs | 13 +++++++++- .../database/drivers/sql/create_entries.sql | 3 ++- crates/core/src/database/entries.rs | 4 ++++ crates/core/src/model/journal.rs | 16 +++++++++++++ 5 files changed, 57 insertions(+), 3 deletions(-) diff --git a/crates/app/src/routes/api/v1/journal/entries.rs b/crates/app/src/routes/api/v1/journal/entries.rs index 2e87d0a..ce103d3 100644 --- a/crates/app/src/routes/api/v1/journal/entries.rs +++ b/crates/app/src/routes/api/v1/journal/entries.rs @@ -4,7 +4,7 @@ use tetratto_core::model::{ApiReturn, Error, journal::JournalEntry}; use crate::{ State, get_user_from_token, - routes::api::v1::{CreateJournalEntry, UpdateJournalEntryContent}, + routes::api::v1::{CreateJournalEntry, UpdateJournalEntryContent, UpdateJournalEntryContext}, }; pub async fn create_request( @@ -73,3 +73,25 @@ pub async fn update_content_request( Err(e) => return Json(e.into()), } } + +pub async fn update_context_request( + jar: CookieJar, + Extension(data): Extension, + Path(id): Path, + Json(req): Json, +) -> impl IntoResponse { + let data = &(data.read().await).0; + let user = match get_user_from_token!(jar, data) { + Some(ua) => ua, + None => return Json(Error::NotAllowed.into()), + }; + + match data.update_entry_context(id, user, req.context).await { + Ok(_) => Json(ApiReturn { + ok: true, + message: "Entry updated".to_string(), + payload: (), + }), + Err(e) => return Json(e.into()), + } +} diff --git a/crates/app/src/routes/api/v1/mod.rs b/crates/app/src/routes/api/v1/mod.rs index 977b013..cc64af5 100644 --- a/crates/app/src/routes/api/v1/mod.rs +++ b/crates/app/src/routes/api/v1/mod.rs @@ -6,7 +6,9 @@ use axum::{ routing::{delete, get, post}, }; use serde::Deserialize; -use tetratto_core::model::journal::{JournalPageReadAccess, JournalPageWriteAccess}; +use tetratto_core::model::journal::{ + JournalEntryContext, JournalPageReadAccess, JournalPageWriteAccess, +}; pub fn routes() -> Router { Router::new() @@ -36,6 +38,10 @@ pub fn routes() -> Router { "/entries/{id}/content", post(journal::entries::update_content_request), ) + .route( + "/entries/{id}/context", + post(journal::entries::update_context_request), + ) // auth // global .route("/auth/register", post(auth::register_request)) @@ -102,3 +108,8 @@ pub struct CreateJournalEntry { pub struct UpdateJournalEntryContent { pub content: String, } + +#[derive(Deserialize)] +pub struct UpdateJournalEntryContext { + pub context: JournalEntryContext, +} diff --git a/crates/core/src/database/drivers/sql/create_entries.sql b/crates/core/src/database/drivers/sql/create_entries.sql index 10b058f..2d2968a 100644 --- a/crates/core/src/database/drivers/sql/create_entries.sql +++ b/crates/core/src/database/drivers/sql/create_entries.sql @@ -3,5 +3,6 @@ CREATE TABLE IF NOT EXISTS entries ( created INTEGER NOT NULL, content TEXT NOT NULL, owner INTEGER NOT NULL, - journal INTEGER NOT NULL + journal INTEGER NOT NULL, + context TEXT NOT NULL ) diff --git a/crates/core/src/database/entries.rs b/crates/core/src/database/entries.rs index 53b305d..527ad3d 100644 --- a/crates/core/src/database/entries.rs +++ b/crates/core/src/database/entries.rs @@ -1,5 +1,6 @@ use super::*; use crate::cache::Cache; +use crate::model::journal::JournalEntryContext; use crate::model::{ Error, Result, auth::User, journal::JournalEntry, journal::JournalPageWriteAccess, permissions::FinePermission, @@ -24,6 +25,7 @@ impl DataManager { content: get!(x->2(String)), owner: get!(x->3(u64)) as usize, journal: get!(x->4(u64)) as usize, + context: serde_json::from_str(&get!(x->5(String))).unwrap(), } } @@ -79,6 +81,7 @@ impl DataManager { &data.content.as_str(), &data.owner.to_string().as_str(), &data.journal.to_string().as_str(), + &serde_json::to_string(&data.context).unwrap().as_str(), ] ); @@ -91,4 +94,5 @@ impl DataManager { auto_method!(delete_entry()@get_entry_by_id:MANAGE_JOURNAL_ENTRIES -> "DELETE FROM entries WHERE id = $1" --cache-key-tmpl="atto.entry:{}"); auto_method!(update_entry_content(String)@get_entry_by_id:MANAGE_JOURNAL_ENTRIES -> "UPDATE entries SET content = $1 WHERE id = $2" --cache-key-tmpl="atto.entry:{}"); + auto_method!(update_entry_context(JournalEntryContext)@get_entry_by_id:MANAGE_JOURNAL_ENTRIES -> "UPDATE entries SET context = $1 WHERE id = $2" --serde --cache-key-tmpl="atto.entry:{}"); } diff --git a/crates/core/src/model/journal.rs b/crates/core/src/model/journal.rs index cb1d533..1d96dd3 100644 --- a/crates/core/src/model/journal.rs +++ b/crates/core/src/model/journal.rs @@ -100,6 +100,19 @@ impl JournalPageMembership { } } +#[derive(Serialize, Deserialize)] +pub struct JournalEntryContext { + pub comments_enabled: bool, +} + +impl Default for JournalEntryContext { + fn default() -> Self { + Self { + comments_enabled: true, + } + } +} + #[derive(Serialize, Deserialize)] pub struct JournalEntry { pub id: usize, @@ -109,6 +122,8 @@ pub struct JournalEntry { pub owner: usize, /// The ID of the [`JournalPage`] this entry belongs to. pub journal: usize, + /// Extra information about the journal entry. + pub context: JournalEntryContext, } impl JournalEntry { @@ -123,6 +138,7 @@ impl JournalEntry { content, owner, journal, + context: JournalEntryContext::default(), } } }