Diffstat (limited to 'internal')
| -rw-r--r-- | internal/b2/client.go | 7 | ||||
| -rw-r--r-- | internal/blogtrigger/blogtrigger.go | 68 | ||||
| -rw-r--r-- | internal/mailer/mailer.go | 103 | ||||
| -rw-r--r-- | internal/router/api-v1-email-send-verification-code.go | 2 | ||||
| -rw-r--r-- | internal/router/api-v1-general-page-body.go | 4 |
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())) } |