summaryrefslogtreecommitdiffci
path: root/internal
diff refs
from: back
to: back
| flip
diff options
context:
space:
mode:
Diffstat (limited to 'internal')
-rw-r--r--internal/b2/client.go7
-rw-r--r--internal/blogtrigger/blogtrigger.go68
-rw-r--r--internal/mailer/mailer.go103
-rw-r--r--internal/router/api-v1-email-send-verification-code.go2
-rw-r--r--internal/router/api-v1-general-page-body.go4
5 files changed, 8 insertions, 176 deletions
diff --git a/internal/b2/client.go b/internal/b2/client.go
index d712736..7b745a8 100644
--- a/internal/b2/client.go
+++ b/internal/b2/client.go
@@ -3,7 +3,6 @@ package b2
import (
"context"
"fmt"
- "slices"
"strings"
"time"
@@ -35,7 +34,6 @@ func NewB2Client(cfg *config.B2Config) (*B2Client, error) {
type BlogPage struct {
Link string
FileName string
- Lang string
Metadata *frontmatter.Metadata
}
@@ -76,9 +74,6 @@ func (c *B2Client) Scan(prefix string) ([]*BlogPage, error) {
nameParts := strings.Split(linkParts[len(linkParts)-1], ".")
fileName := strings.Join(nameParts[:len(linkParts)-1], ".")
- tags := strings.Split(attrs.Info["tags"], ",")
- slices.Sort(tags)
-
filePaths = append(filePaths, &BlogPage{
Link: obj.Name(),
FileName: fileName,
@@ -88,7 +83,7 @@ func (c *B2Client) Scan(prefix string) ([]*BlogPage, error) {
ActionDate: attrs.Info["action-date"],
PublishedTime: publishedTime,
Thumbnail: attrs.Info["thumbnail"],
- Tags: tags,
+ Tags: strings.Split(attrs.Info["tags"], ","),
Geolocation: attrs.Info["geolocation"],
},
})
diff --git a/internal/blogtrigger/blogtrigger.go b/internal/blogtrigger/blogtrigger.go
deleted file mode 100644
index ab66981..0000000
--- a/internal/blogtrigger/blogtrigger.go
+++ /dev/null
@@ -1,68 +0,0 @@
-package blogtrigger
-
-import (
- "fmt"
- "log/slog"
-
- "github.com/SayaAndy/saya-today-web/config"
- "github.com/SayaAndy/saya-today-web/internal/b2"
- "github.com/go-co-op/gocron/v2"
-)
-
-type BlogTriggerScheduler struct {
- s gocron.Scheduler
- knownBlogPages map[string]map[string]*b2.BlogPage
- b2Client *b2.B2Client
- onTrigger func([]*b2.BlogPage) error
-}
-
-func NewBlogTriggerScheduler(b2Client *b2.B2Client, availableLanguages []config.AvailableLanguageConfig, onTrigger func([]*b2.BlogPage) error) (*BlogTriggerScheduler, error) {
- s, err := gocron.NewScheduler()
- if err != nil {
- return nil, fmt.Errorf("failed to create new scheduler: %w", err)
- }
-
- knownBlogPages := make(map[string]map[string]*b2.BlogPage, len(availableLanguages))
- for _, lang := range availableLanguages {
- knownBlogPages[lang.Name] = make(map[string]*b2.BlogPage)
- }
-
- bts := &BlogTriggerScheduler{s, knownBlogPages, b2Client, onTrigger}
- defer bts.s.Start()
-
- bts.s.NewJob(gocron.CronJob("0/5 * * * *", false), gocron.NewTask(func(bts *BlogTriggerScheduler) {
- posts, err := bts.scan()
- if err != nil {
- slog.Error("failed to execute scanning new blog pages cron job", slog.String("error", err.Error()))
- return
- }
- if err = onTrigger(posts); err != nil {
- slog.Error("error happened on callback function after scanning new blog pages", slog.String("error", err.Error()))
- return
- }
- }, bts))
-
- if _, err = bts.scan(); err != nil {
- return nil, fmt.Errorf("failed to scan existing blog pages in b2: %w", err)
- }
-
- return bts, nil
-}
-
-func (bts *BlogTriggerScheduler) scan() (newPages []*b2.BlogPage, err error) {
- newPages = make([]*b2.BlogPage, 0)
- for lang := range bts.knownBlogPages {
- posts, err := bts.b2Client.Scan(lang + "/")
- if err != nil {
- return nil, fmt.Errorf("failed to scan blog pages in b2 on '%s': %w", lang, err)
- }
- for _, post := range posts {
- if _, ok := bts.knownBlogPages[lang][post.FileName]; !ok {
- post.Lang = lang
- newPages = append(newPages, post)
- bts.knownBlogPages[lang][post.FileName] = post
- }
- }
- }
- return newPages, nil
-}
diff --git a/internal/mailer/mailer.go b/internal/mailer/mailer.go
index f51186e..ba2202e 100644
--- a/internal/mailer/mailer.go
+++ b/internal/mailer/mailer.go
@@ -7,13 +7,11 @@ import (
"encoding/binary"
"fmt"
"log/slog"
- "slices"
"strconv"
"strings"
"sync"
"time"
- "github.com/SayaAndy/saya-today-web/internal/b2"
"github.com/SayaAndy/saya-today-web/internal/templatemanager"
"github.com/SayaAndy/saya-today-web/locale"
"github.com/dgraph-io/ristretto/v2"
@@ -151,14 +149,16 @@ func (m *Mailer) MailIsTaken(email string) (bool, error) {
return isTaken, nil
}
-func (m *Mailer) GetInfo(userIdHash []byte) (email string, lang string, err error) {
+func (m *Mailer) GetInfo(userId string) (email string, lang string, err error) {
+ hash := m.GetHash(userId)
+
tx, err := m.db.Begin()
if err != nil {
return "", "", fmt.Errorf("failed to initialize transaction with db: %s", err)
}
var rows *sql.Rows
- if rows, err = tx.Query(`SELECT email, lang FROM user_email_table WHERE user_id=? LIMIT 1;`, userIdHash); err != nil {
+ if rows, err = tx.Query(`SELECT email, lang FROM user_email_table WHERE user_id=? LIMIT 1;`, hash); err != nil {
tx.Rollback()
return "", "", fmt.Errorf("failed to query user-email settings in db: %s", err)
}
@@ -330,7 +330,6 @@ func (m *Mailer) Subscribe(userId string, subscriptionType SubscriptionType, tag
return fmt.Errorf("failed to initialize transaction with db: %s", err)
}
- slices.Sort(tags)
tagsOutput := ""
switch subscriptionType {
case All:
@@ -358,98 +357,6 @@ func (m *Mailer) Subscribe(userId string, subscriptionType SubscriptionType, tag
return nil
}
-func (m *Mailer) NewPost(post *b2.BlogPage) error {
- tx, err := m.db.Begin()
- if err != nil {
- return fmt.Errorf("failed to initialize transaction with db: %s", err)
- }
-
- var rows *sql.Rows
- if rows, err = tx.Query(`SELECT user_id, tags FROM subscription_user_to_tags_table;`); err != nil {
- tx.Rollback()
- return fmt.Errorf("failed to query user-to-tags table in db: %s", err)
- }
-
- var userId []byte
- usersToSend := make([]string, 0)
- var tagsString string
- i := -1
-
-rowLoop:
- for rows.Next() {
- i++
- if err = rows.Scan(&userId, &tagsString); err != nil {
- slog.Warn("failed to scan a row in user-to-tags table", slog.String("error", err.Error()), slog.Int("index", i), slog.String("user_id", base64.RawStdEncoding.EncodeToString(userId)))
- continue
- }
-
- if tagsString == "" {
- continue
- }
-
- email, lang, err := m.GetInfo(userId)
- if err != nil {
- slog.Warn("failed to get info about the user", slog.String("error", err.Error()), slog.Int("index", i), slog.String("user_id", base64.RawStdEncoding.EncodeToString(userId)))
- continue
- }
+func SendNewPost() {
- if lang != post.Lang {
- continue
- }
-
- if tagsString == "_all" {
- usersToSend = append(usersToSend, email)
- continue
- }
-
- pageTags := strings.Split(tagsString, ",")
- for _, tag := range pageTags {
- if _, found := slices.BinarySearch(post.Metadata.Tags, tag); found {
- usersToSend = append(usersToSend, email)
- continue rowLoop
- }
- }
- }
-
- tx.Commit()
- rows.Close()
-
- msgBody, err := m.tm.Render("new-post", fiber.Map{
- "L": m.l[post.Lang],
- "Lang": post.Lang,
- "Post": post,
- "ClientHost": m.clientHost,
- })
-
- messages := make([]*mail.Msg, 0, len(usersToSend))
- for _, user := range usersToSend {
- if err != nil {
- return fmt.Errorf("failed to render message body: %w", err)
- }
-
- message := mail.NewMsg()
-
- if err := message.EnvelopeFrom(m.mailAddress); err != nil {
- return fmt.Errorf("failed to set ENVELOPE FROM address: %w", err)
- }
- if err := message.FromFormat(m.publicName, m.mailAddress); err != nil {
- return fmt.Errorf("failed to set formatted FROM address: %w", err)
- }
- if err := message.To(user); err != nil {
- return fmt.Errorf("failed to set TO address: %w", err)
- }
-
- message.SetMessageID()
- message.SetDate()
- message.SetBulk()
- message.Subject(m.l[post.Lang].Mail.NewPost.Subject)
- message.SetBodyString(mail.TypeTextHTML, string(msgBody))
-
- messages = append(messages, message)
- }
-
- if err := m.mailClient.DialAndSend(messages...); err != nil {
- return fmt.Errorf("failed to send new post notifications: %w", err)
- }
- return nil
}
diff --git a/internal/router/api-v1-email-send-verification-code.go b/internal/router/api-v1-email-send-verification-code.go
index 9372eb3..2cde1bd 100644
--- a/internal/router/api-v1-email-send-verification-code.go
+++ b/internal/router/api-v1-email-send-verification-code.go
@@ -58,7 +58,7 @@ func Api_V1_Email_SendVerificationCode(l map[string]*locale.LocaleConfig) func(c
})
}
- if previousEmail, _, _ := Mailer.GetInfo(Mailer.GetHash(id)); previousEmail == email {
+ if previousEmail, _, _ := Mailer.GetInfo(id); previousEmail == email {
return api_v1_email_sendStatusHtml(c, "email-message", l, "Failed", fiber.ErrUnprocessableEntity.Code, lang, l[lang].UserProfile.EmailAlreadyValidated, map[string]string{})
}
diff --git a/internal/router/api-v1-general-page-body.go b/internal/router/api-v1-general-page-body.go
index b5567b7..66f1234 100644
--- a/internal/router/api-v1-general-page-body.go
+++ b/internal/router/api-v1-general-page-body.go
@@ -14,7 +14,6 @@ import (
"github.com/SayaAndy/saya-today-web/config"
"github.com/SayaAndy/saya-today-web/internal/b2"
- "github.com/SayaAndy/saya-today-web/internal/blogtrigger"
"github.com/SayaAndy/saya-today-web/internal/factgiver"
"github.com/SayaAndy/saya-today-web/internal/frontmatter"
"github.com/SayaAndy/saya-today-web/internal/mailer"
@@ -25,7 +24,6 @@ import (
var FactGiver *factgiver.FactGiver
var Mailer *mailer.Mailer
-var BlogTrigger *blogtrigger.BlogTriggerScheduler
func init() {
assert(0, tm.Add("general-page-body", "views/partials/general-page-body.html"))
@@ -112,7 +110,7 @@ func Api_V1_GeneralPage_Body(l map[string]*locale.LocaleConfig, langs []config.A
} else if len(pathParts) == 2 && pathParts[1] == "user" {
values["Title"] = l[lang].UserProfile.Header
- email, _, err := Mailer.GetInfo(Mailer.GetHash(c.IP()))
+ email, _, err := Mailer.GetInfo(c.IP())
if err != nil {
slog.Error("get info from mailer about a client", slog.String("error", err.Error()))
}