add: notifications for likes

TODO: notifications ui
This commit is contained in:
trisua 2025-03-29 23:51:13 -04:00
parent 6413ed09fb
commit 9dc75d7095
9 changed files with 292 additions and 27 deletions

View file

@ -3,5 +3,6 @@ CREATE TABLE IF NOT EXISTS notifications (
created INTEGER NOT NULL,
title TEXT NOT NULL,
content TEXT NOT NULL,
owner INTEGER NOT NULL
owner INTEGER NOT NULL,
read INTEGER NOT NULL
)

View file

@ -21,6 +21,7 @@ impl DataManager {
title: get!(x->2(String)),
content: get!(x->3(String)),
owner: get!(x->4(isize)) as usize,
read: if get!(x->5(i8)) == 1 { true } else { false },
}
}
@ -59,13 +60,14 @@ impl DataManager {
let res = execute!(
&conn,
"INSERT INTO reactions VALUES ($1, $2, $3, $4, $5)",
"INSERT INTO notifications VALUES ($1, $2, $3, $4, $5, $6)",
&[
&data.id.to_string().as_str(),
&data.created.to_string().as_str(),
&data.title.to_string().as_str(),
&data.content.to_string().as_str(),
&data.owner.to_string().as_str()
&data.owner.to_string().as_str(),
&(if data.read { 1 } else { 0 }).to_string().as_str()
]
);
@ -80,7 +82,7 @@ impl DataManager {
Ok(())
}
pub async fn delete_notification(&self, id: usize, user: User) -> Result<()> {
pub async fn delete_notification(&self, id: usize, user: &User) -> Result<()> {
let notification = self.get_notification_by_id(id).await?;
if user.id != notification.owner {
@ -114,4 +116,61 @@ impl DataManager {
// return
Ok(())
}
pub async fn delete_all_notifications(&self, user: &User) -> Result<()> {
let notifications = self.get_notifications_by_owner(user.id).await?;
for notification in notifications {
if user.id != notification.owner {
if !user.permissions.check(FinePermission::MANAGE_NOTIFICATIONS) {
return Err(Error::NotAllowed);
}
}
self.delete_notification(notification.id, user).await?
}
Ok(())
}
pub async fn update_notification_read(
&self,
id: usize,
new_read: bool,
user: &User,
) -> Result<()> {
let y = self.get_notification_by_id(id).await?;
if y.owner != user.id {
if !user.permissions.check(FinePermission::MANAGE_NOTIFICATIONS) {
return Err(Error::NotAllowed);
}
}
// ...
let conn = match self.connect().await {
Ok(c) => c,
Err(e) => return Err(Error::DatabaseConnection(e.to_string())),
};
let res = execute!(
&conn,
"UPDATE notifications SET read = $1 WHERE id = $2",
&[&(if new_read { 1 } else { 0 }).to_string(), &id.to_string()]
);
if let Err(e) = res {
return Err(Error::DatabaseError(e.to_string()));
}
self.2.remove(format!("atto.notification:{}", id)).await;
if (y.read == true) && (new_read == false) {
self.incr_user_notifications(user.id).await?;
} else if (y.read == false) && (new_read == true) {
self.decr_user_notifications(user.id).await?;
}
Ok(())
}
}

View file

@ -2,7 +2,7 @@ use super::*;
use crate::cache::Cache;
use crate::model::{
Error, Result,
auth::User,
auth::{Notification, User},
permissions::FinePermission,
reactions::{AssetType, Reaction},
};
@ -61,7 +61,7 @@ impl DataManager {
///
/// # Arguments
/// * `data` - a mock [`Reaction`] object to insert
pub async fn create_reaction(&self, data: Reaction) -> Result<()> {
pub async fn create_reaction(&self, data: Reaction, user: &User) -> Result<()> {
let conn = match self.connect().await {
Ok(c) => c,
Err(e) => return Err(Error::DatabaseConnection(e.to_string())),
@ -95,6 +95,24 @@ impl DataManager {
}
} {
return Err(e);
} else if data.is_like {
let community = self.get_community_by_id(data.asset).await.unwrap();
if community.owner != user.id {
if let Err(e) = self
.create_notification(Notification::new(
"Your community has received a like!".to_string(),
format!(
"[@{}](/api/v1/auth/profile/find/{}) has liked your community!",
user.username, user.id
),
community.owner,
))
.await
{
return Err(e);
}
}
}
}
AssetType::Post => {
@ -106,6 +124,24 @@ impl DataManager {
}
} {
return Err(e);
} else if data.is_like {
let post = self.get_post_by_id(data.asset).await.unwrap();
if post.owner != user.id {
if let Err(e) = self
.create_notification(Notification::new(
"Your post has received a like!".to_string(),
format!(
"[@{}](/api/v1/auth/profile/find/{}) has liked your post!",
user.username, user.id
),
post.owner,
))
.await
{
return Err(e);
}
}
}
}
};

View file

@ -114,6 +114,7 @@ pub struct Notification {
pub title: String,
pub content: String,
pub owner: usize,
pub read: bool,
}
impl Notification {
@ -128,6 +129,7 @@ impl Notification {
title,
content,
owner,
read: false,
}
}
}