Diffstat (limited to 'internal/mailer')
| -rw-r--r-- | internal/mailer/mailer.go | 71 |
1 files changed, 15 insertions, 56 deletions
diff --git a/internal/mailer/mailer.go b/internal/mailer/mailer.go index d6dbd17..c146548 100644 --- a/internal/mailer/mailer.go +++ b/internal/mailer/mailer.go @@ -152,20 +152,12 @@ func (m *Mailer) MailIsTaken(email string) (bool, error) { return false, fmt.Errorf("failed to initialize transaction with db: %s", err) } - slog.Debug("began db transaction", slog.String("method", "MailIsTaken")) - defer func(tx *sql.Tx) { - if err = tx.Commit(); err != nil { - tx.Rollback() - } - slog.Debug("ended db transaction", slog.String("method", "MailIsTaken")) - }(tx) - var rows *sql.Rows if rows, err = tx.Query(`SELECT email FROM user_email_table WHERE email=? LIMIT 1;`, email); err != nil { tx.Rollback() - return false, fmt.Errorf("failed to query user-email settings in db: %s", err) } + defer tx.Commit() defer rows.Close() isTaken := rows.Next() @@ -178,19 +170,12 @@ func (m *Mailer) GetInfo(userIdHash []byte) (email string, lang string, err erro return "", "", fmt.Errorf("failed to initialize transaction with db: %s", err) } - slog.Debug("began db transaction", slog.String("method", "GetInfo")) - defer func(tx *sql.Tx) { - if err = tx.Commit(); err != nil { - tx.Rollback() - } - slog.Debug("ended db transaction", slog.String("method", "GetInfo")) - }(tx) - var rows *sql.Rows if rows, err = tx.Query(`SELECT email, lang FROM user_email_table WHERE user_id=? LIMIT 1;`, userIdHash); err != nil { tx.Rollback() return "", "", fmt.Errorf("failed to query user-email settings in db: %s", err) } + defer tx.Commit() defer rows.Close() if !rows.Next() { @@ -317,22 +302,18 @@ func (m *Mailer) Verify(verificationCodeEncoded string, lang string) error { return fmt.Errorf("failed to initialize transaction with db: %s", err) } - slog.Debug("began db transaction", slog.String("method", "Verify")) if _, err = tx.Exec(`INSERT INTO user_email_table(user_id, email, lang) VALUES(?, ?, ?) ON CONFLICT(user_id) DO UPDATE SET email=excluded.email, lang=excluded.lang;`, m.GetHash(string(userId)), address, lang); err != nil { tx.Rollback() - slog.Debug("ended db transaction", slog.String("method", "Verify")) return fmt.Errorf("failed to configure user-email settings in db: %s", err) } if err = tx.Commit(); err != nil { tx.Rollback() - slog.Debug("ended db transaction", slog.String("method", "Verify")) return fmt.Errorf("failed to commit transaction to db: %s", err) } - slog.Debug("ended db transaction", slog.String("method", "Verify")) m.verificationCodes.Del(verificationCode) delete(m.lostMailMap, verificationSegments[0]) @@ -345,14 +326,6 @@ func (m *Mailer) GetSubscriptions(userId string) (subscriptionType SubscriptionT return None, nil, fmt.Errorf("failed to initialize transaction with db: %s", err) } - slog.Debug("began db transaction", slog.String("method", "GetSubscriptions")) - defer func(tx *sql.Tx) { - if err = tx.Commit(); err != nil { - tx.Rollback() - } - slog.Debug("ended db transaction", slog.String("method", "GetSubscriptions")) - }(tx) - hash := m.GetHash(userId) var rows *sql.Rows @@ -360,6 +333,7 @@ func (m *Mailer) GetSubscriptions(userId string) (subscriptionType SubscriptionT tx.Rollback() return None, nil, fmt.Errorf("failed to query user-to-tags table in db for the user: %s", err) } + defer tx.Commit() defer rows.Close() if !rows.Next() { @@ -387,8 +361,6 @@ func (m *Mailer) Subscribe(userIdHash []byte, subscriptionType SubscriptionType, return fmt.Errorf("failed to initialize transaction with db: %s", err) } - slog.Debug("began db transaction", slog.String("method", "Subscribe")) - slices.Sort(tags) tagsOutput := "" switch subscriptionType { @@ -404,16 +376,13 @@ func (m *Mailer) Subscribe(userIdHash []byte, subscriptionType SubscriptionType, ON CONFLICT(user_id) DO UPDATE SET tags=excluded.tags;`, userIdHash, tagsOutput); err != nil { tx.Rollback() - slog.Debug("ended db transaction", slog.String("method", "Subscribe")) return fmt.Errorf("failed to configure user-to-tags table in db for the user: %s", err) } if err = tx.Commit(); err != nil { tx.Rollback() - slog.Debug("ended db transaction", slog.String("method", "Subscribe")) return fmt.Errorf("failed to commit transaction to db: %s", err) } - slog.Debug("ended db transaction", slog.String("method", "Subscribe")) return nil } @@ -424,11 +393,9 @@ func (m *Mailer) NewPost(post *b2.BlogPage) error { return fmt.Errorf("failed to initialize transaction with db: %s", err) } - slog.Debug("began db transaction", slog.String("method", "NewPost")) var rows *sql.Rows if rows, err = tx.Query(`SELECT user_id, tags FROM subscription_user_to_tags_table;`); err != nil { tx.Rollback() - slog.Debug("ended db transaction", slog.String("method", "NewPost")) return fmt.Errorf("failed to query user-to-tags table in db: %s", err) } @@ -452,11 +419,21 @@ rowLoop: 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 + } + + if lang != post.Lang { + continue + } + if tagsString == "_all" { usersToSend = append(usersToSend, struct { userId []byte email string - }{userId, ""}) + }{userId, email}) continue } @@ -466,7 +443,7 @@ rowLoop: usersToSend = append(usersToSend, struct { userId []byte email string - }{userId, ""}) + }{userId, email}) continue rowLoop } } @@ -474,27 +451,9 @@ rowLoop: tx.Commit() rows.Close() - slog.Debug("ended db transaction", slog.String("method", "NewPost")) - - for i := range usersToSend { - email, lang, err := m.GetInfo(usersToSend[i].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 - } - - if lang != post.Lang { - continue - } - - usersToSend[i].email = email - } messages := make([]*mail.Msg, 0, len(usersToSend)) for _, user := range usersToSend { - if user.email == "" { - continue - } unsubscribeCodeBytes := make([]byte, 8) rand.Read(unsubscribeCodeBytes) unsubscribeCode := binary.LittleEndian.Uint64(unsubscribeCodeBytes) |