Files
bssapp/svc/routes/mk_mail_helper.go
2026-05-22 14:57:56 +03:00

56 lines
1.5 KiB
Go

package routes
import (
"bssapp-backend/utils"
"database/sql"
"errors"
"regexp"
"strings"
)
var simpleEmailRe = regexp.MustCompile(`^[^\s@]+@[^\s@]+\.[^\s@]+$`)
// ensureMkMail makes sure the given email exists in mk_mail.
// If it already exists (case-insensitive match), it is re-activated and normalized.
// This is intentionally tolerant (no ON CONFLICT) to avoid relying on a specific unique constraint.
func ensureMkMail(tx *sql.Tx, email string) error {
mail := strings.ToLower(strings.TrimSpace(email))
if mail == "" {
return nil
}
if !simpleEmailRe.MatchString(mail) {
// user email field can be free-form; don't hard fail user save because of mk_mail bookkeeping
return nil
}
var id string
err := tx.QueryRow(`
SELECT m.id::text
FROM mk_mail m
WHERE LOWER(TRIM(m.email)) = LOWER(TRIM($1))
LIMIT 1
`, mail).Scan(&id)
if err != nil && !errors.Is(err, sql.ErrNoRows) {
return err
}
if errors.Is(err, sql.ErrNoRows) {
newID := utils.NewUUID()
// Keep this insert intentionally minimal because mk_mail schema may vary between environments.
// Only rely on columns we already SELECT elsewhere (id/email/display_name/is_active).
_, err = tx.Exec(`INSERT INTO mk_mail (id, email, display_name, is_active) VALUES ($1, $2, '', true)`, newID, mail)
return err
}
// Exists: normalize + activate.
_, err = tx.Exec(`
UPDATE mk_mail
SET
email = $2,
display_name = COALESCE(display_name, ''),
is_active = true
WHERE id::text = $1
`, id, mail)
return err
}