added config for helper service

This commit is contained in:
Sergey Chubaryan 2024-12-04 01:22:52 +03:00
parent f8968ddd82
commit b2702d8375
6 changed files with 70 additions and 49 deletions

9
helper/config.yaml Normal file
View File

@ -0,0 +1,9 @@
kafka:
brokers:
- localhost:9092
topic: backend_events
smtp:
server: smtp.yandex.ru
port: 587
email: ""
password: ""

View File

@ -9,4 +9,5 @@ require (
github.com/pierrec/lz4/v4 v4.1.15 // indirect github.com/pierrec/lz4/v4 v4.1.15 // indirect
github.com/segmentio/kafka-go v0.4.47 // indirect github.com/segmentio/kafka-go v0.4.47 // indirect
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
gopkg.in/yaml.v3 v3.0.1
) )

View File

@ -60,4 +60,5 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df h1:n7WqCuqOuCbNr617RXOY0AWRXxgwEyPp2z+p0+hgMuE= gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df h1:n7WqCuqOuCbNr617RXOY0AWRXxgwEyPp2z+p0+hgMuE=
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df/go.mod h1:LRQQ+SO6ZHR7tOkpBDuZnXENFzX8qRjMDMyPD6BRkCw= gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df/go.mod h1:LRQQ+SO6ZHR7tOkpBDuZnXENFzX8qRjMDMyPD6BRkCw=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

View File

@ -5,58 +5,73 @@ import (
"encoding/json" "encoding/json"
"io" "io"
"log" "log"
"os"
"strings"
"github.com/segmentio/kafka-go" "github.com/segmentio/kafka-go"
"gopkg.in/gomail.v2" "gopkg.in/gomail.v2"
"gopkg.in/yaml.v3"
) )
// type emailHelper struct { const MSG_TEXT = `
// dialer *gomail.Dialer <html>
// } <head>
</head>
<body>
<p>This message was sent because you forgot a password</p>
<p>To change a password, use <a href="{{Link}}"/>this</a> link</p>
</body>
</html>
`
// func (e *emailHelper) SendEmailForgotPassword(email, token string) { func SendEmailForgotPassword(dialer *gomail.Dialer, from, to, token string) error {
// link := "https://nucrea.ru?token=" + token link := "localhost:8080/restore-password?token=" + token
// const MSG_TEXT = ` msgText := strings.ReplaceAll(MSG_TEXT, "{{Link}}", link)
// <html>
// <head>
// </head>
// <body>
// <p>This message was sent because you forgot a password</p>
// <p>To change a password, use <a href="{{Link}}"/>this</a> link</p>
// </body>
// </html>
// `
// msgText := strings.ReplaceAll(MSG_TEXT, "{{Link}}", link)
// m := gomail.NewMessage() m := gomail.NewMessage()
// m.SetHeader("From", "email") m.SetHeader("From", m.FormatAddress(from, "Pet Backend"))
// m.SetHeader("To", email) m.SetHeader("To", to)
// m.SetHeader("Subject", "Hello!") m.SetHeader("Subject", "Hello!")
// m.SetBody("text/html", msgText) m.SetBody("text/html", msgText)
// if err := d.DialAndSend(m); err != nil { return dialer.DialAndSend(m)
// panic(err) }
// }
// } type Config struct {
Kafka struct {
Brokers []string `yaml:"brokers"`
Topic string `yaml:"topic"`
}
SMTP struct {
Server string `yaml:"server"`
Port int `yaml:"port"`
Email string `yaml:"email"`
Password string `yaml:"password"`
} `yaml:"smtp"`
}
func main() { func main() {
const (
SMTP_SERVER = "smtp.yandex.ru"
SMTP_PORT = 587
SMTP_LOGIN = "serghio2@yandex.ru"
SMTP_PASSWORD = "ercutguhcfuzbvyl"
)
ctx := context.Background() ctx := context.Background()
d := gomail.NewDialer(SMTP_SERVER, SMTP_PORT, SMTP_LOGIN, SMTP_PASSWORD) configFile, err := os.ReadFile("config.yaml")
if err != nil {
log.Fatal(err.Error())
}
config := &Config{}
if err := yaml.Unmarshal(configFile, config); err != nil {
log.Fatal(err.Error())
}
dialer := gomail.NewDialer(config.SMTP.Server, config.SMTP.Port, config.SMTP.Email, config.SMTP.Password)
log.Println("starting reader...") log.Println("starting reader...")
r := kafka.NewReader(kafka.ReaderConfig{ r := kafka.NewReader(kafka.ReaderConfig{
Brokers: []string{"localhost:9092"}, Brokers: config.Kafka.Brokers,
Topic: "backend_events", Topic: config.Kafka.Topic,
GroupID: "consumer-group-id", GroupID: "consumer-group-id",
}) })
@ -90,13 +105,7 @@ func main() {
continue continue
} }
m := gomail.NewMessage() if err := SendEmailForgotPassword(dialer, config.SMTP.Email, value.Email, value.Token); err != nil {
m.SetHeader("From", m.FormatAddress("serghio2@yandex.ru", "Pet Backend"))
m.SetHeader("To", value.Email)
m.SetHeader("Subject", "Hello!")
m.SetBody("text/html", "Test backend")
if err := d.DialAndSend(m); err != nil {
log.Fatalf("failed to send email: %s\n", err.Error()) log.Fatalf("failed to send email: %s\n", err.Error())
continue continue
} }

View File

@ -29,7 +29,10 @@ type UserService interface {
CreateUser(ctx context.Context, params UserCreateParams) (*models.UserDTO, error) CreateUser(ctx context.Context, params UserCreateParams) (*models.UserDTO, error)
AuthenticateUser(ctx context.Context, login, password string) (string, error) AuthenticateUser(ctx context.Context, login, password string) (string, error)
ValidateToken(ctx context.Context, tokenStr string) (*models.UserDTO, error) ValidateToken(ctx context.Context, tokenStr string) (*models.UserDTO, error)
HelpPasswordForgot(ctx context.Context, userId string) error
ForgotPassword(ctx context.Context, userId string) error
ChangePassword(ctx context.Context, userId, oldPassword, newPassword string) error
ChangePasswordWithToken(ctx context.Context, userId, actionToken, newPassword string) error
} }
func NewUserService(deps UserServiceDeps) UserService { func NewUserService(deps UserServiceDeps) UserService {
@ -85,8 +88,6 @@ func (u *userService) CreateUser(ctx context.Context, params UserCreateParams) (
return nil, err return nil, err
} }
u.deps.EventRepo.SendEmailForgotPassword(ctx, user.Email, "123")
u.deps.UserCache.Set(result.Id, *result, cache.Expiration{Ttl: userCacheTtl}) u.deps.UserCache.Set(result.Id, *result, cache.Expiration{Ttl: userCacheTtl})
return result, nil return result, nil
@ -116,7 +117,7 @@ func (u *userService) AuthenticateUser(ctx context.Context, email, password stri
return jwt, nil return jwt, nil
} }
func (u *userService) HelpPasswordForgot(ctx context.Context, userId string) error { func (u *userService) ForgotPassword(ctx context.Context, userId string) error {
user, err := u.getUserById(ctx, userId) user, err := u.getUserById(ctx, userId)
if err != nil { if err != nil {
return err return err
@ -138,13 +139,13 @@ func (u *userService) HelpPasswordForgot(ctx context.Context, userId string) err
return u.deps.EventRepo.SendEmailForgotPassword(ctx, user.Email, actionToken.Value) return u.deps.EventRepo.SendEmailForgotPassword(ctx, user.Email, actionToken.Value)
} }
func (u *userService) ChangePasswordForgot(ctx context.Context, userId, newPassword, accessCode string) error { func (u *userService) ChangePasswordWithToken(ctx context.Context, userId, actionToken, newPassword string) error {
user, err := u.getUserById(ctx, userId) user, err := u.getUserById(ctx, userId)
if err != nil { if err != nil {
return err return err
} }
code, err := u.deps.ActionTokenRepo.PopActionToken(ctx, userId, accessCode, models.ActionTokenTargetForgotPassword) code, err := u.deps.ActionTokenRepo.PopActionToken(ctx, userId, actionToken, models.ActionTokenTargetForgotPassword)
if err != nil { if err != nil {
return err return err
} }

View File

@ -64,7 +64,7 @@ func New(opts NewServerOpts) *Server {
dummyGroup.GET("", handlers.NewDummyHandler()) dummyGroup.GET("", handlers.NewDummyHandler())
dummyGroup.POST("/forgot-password", func(c *gin.Context) { dummyGroup.POST("/forgot-password", func(c *gin.Context) {
user := utils.GetUserFromRequest(c) user := utils.GetUserFromRequest(c)
opts.UserService.HelpPasswordForgot(c, user.Id) opts.UserService.ForgotPassword(c, user.Id)
}) })
} }