adds email notifications

This commit is contained in:
Christian Beutel
2025-01-04 14:24:00 +01:00
parent 72d2bf6062
commit 788690086e
15 changed files with 666 additions and 373 deletions

View File

@@ -2,10 +2,12 @@ package util
import (
"fmt"
"net/mail"
"github.com/pocketbase/dbx"
"github.com/pocketbase/pocketbase"
"github.com/pocketbase/pocketbase/models"
"github.com/pocketbase/pocketbase/tools/mailer"
)
type NotificationType string
@@ -20,10 +22,10 @@ const (
)
type Notification struct {
Type NotificationType `json:"type"`
Metadata interface{} `json:"metadata,omitempty"`
Seen bool `json:"seen"`
Author string `json:"author"`
Type NotificationType `json:"type"`
Metadata map[string]string `json:"metadata,omitempty"`
Seen bool `json:"seen"`
Author string `json:"author"`
}
type NotificationSettings struct {
@@ -59,22 +61,50 @@ func SendNotification(app *pocketbase.PocketBase, notification Notification, rec
if err != nil {
return err
}
if !permissions.Web {
return nil
}
notifications, err := app.Dao().FindCollectionByNameOrId("notifications")
if err != nil {
return err
}
n := models.NewRecord(notifications)
n.Set("type", string(notification.Type))
n.Set("metadata", notification.Metadata)
n.Set("seen", notification.Seen)
n.Set("recipient", recipient)
n.Set("author", notification.Author)
if err := app.Dao().SaveRecord(n); err != nil {
return err
if permissions.Web {
n := models.NewRecord(notifications)
n.Set("type", string(notification.Type))
n.Set("metadata", notification.Metadata)
n.Set("seen", notification.Seen)
n.Set("recipient", recipient)
n.Set("author", notification.Author)
if err := app.Dao().SaveRecord(n); err != nil {
return err
}
}
if permissions.Email {
recipientUser, err := app.Dao().FindRecordById("users", recipient)
if err != nil {
return err
}
authorUser, err := app.Dao().FindRecordById("users", notification.Author)
if err != nil {
return err
}
html, err := GenerateHTML(app.Settings().Meta.AppUrl, recipientUser.Username(), authorUser.Username(), notification.Type, notification.Metadata)
if err != nil {
return err
}
message := &mailer.Message{
From: mail.Address{
Address: app.Settings().Meta.SenderAddress,
Name: app.Settings().Meta.SenderName,
},
To: []mail.Address{{Address: recipientUser.Email()}},
Subject: "wanderer - New Notification",
HTML: html,
}
app.NewMailClient().Send(message)
}
return nil
}
@@ -85,32 +115,11 @@ func SendNotificationToFollowers(app *pocketbase.PocketBase, notification Notifi
if err != nil {
return err
}
notifications, err := app.Dao().FindCollectionByNameOrId("notifications")
if err != nil {
return err
}
for _, f := range followers {
recipient := f.GetString("follower")
if notification.Author == recipient {
continue
}
permissions, err := getNotificationPermissions(app, recipient, notification.Type)
if err != nil {
continue
}
if !permissions.Web {
continue
}
n := models.NewRecord(notifications)
n.Set("type", string(notification.Type))
n.Set("metadata", notification.Metadata)
n.Set("seen", notification.Seen)
n.Set("recipient", recipient)
n.Set("author", notification.Author)
SendNotification(app, notification, recipient)
if err := app.Dao().SaveRecord(n); err != nil {
continue
}
}
return nil
}