add rpc core client

This commit is contained in:
Pavel 2024-04-04 10:10:09 +03:00
parent eb815ba8d4
commit fc539179ee
6 changed files with 140 additions and 31 deletions

12
go.mod

@ -9,13 +9,15 @@ require (
github.com/twmb/franz-go v1.16.1
go.mongodb.org/mongo-driver v1.14.0
go.uber.org/zap v1.27.0
google.golang.org/grpc v1.63.0
google.golang.org/protobuf v1.33.0
penahub.gitlab.yandexcloud.net/backend/penahub_common v0.0.0-20240223054633-6cb3d5ce45b6
)
require (
github.com/andybalholm/brotli v1.0.5 // indirect
github.com/golang/snappy v0.0.1 // indirect
github.com/google/uuid v1.4.0 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/klauspost/compress v1.17.4 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
@ -32,8 +34,10 @@ require (
github.com/xdg-go/stringprep v1.0.4 // indirect
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect
go.uber.org/multierr v1.10.0 // indirect
golang.org/x/crypto v0.17.0 // indirect
golang.org/x/sync v0.1.0 // indirect
golang.org/x/sys v0.15.0 // indirect
golang.org/x/crypto v0.19.0 // indirect
golang.org/x/net v0.21.0 // indirect
golang.org/x/sync v0.6.0 // indirect
golang.org/x/sys v0.17.0 // indirect
golang.org/x/text v0.14.0 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de // indirect
)

30
go.sum

@ -8,10 +8,10 @@ github.com/gofiber/fiber/v2 v2.51.0 h1:JNACcZy5e2tGApWB2QrRpenTWn0fq0hkFm6k0C86g
github.com/gofiber/fiber/v2 v2.51.0/go.mod h1:xaQRZQJGqnKOQnbQw+ltvku3/h8QxvNi8o6JiJ7Ll0U=
github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM=
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4=
github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4=
@ -62,16 +62,18 @@ go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k=
golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo=
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4=
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ=
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
@ -79,8 +81,8 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y=
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@ -93,8 +95,12 @@ golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGm
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de h1:cZGRis4/ot9uVm639a+rHCUaG0JJHEsdyzSQTMX+suY=
google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:H4O17MA/PE9BsGx3w+a+W2VOLLD1Qf7oJneAoU6WktY=
google.golang.org/grpc v1.63.0 h1:WjKe+dnvABXyPJMD7KDNLxtoGk5tgk+YFWN6cBWjZE8=
google.golang.org/grpc v1.63.0/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA=
google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=
google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
penahub.gitlab.yandexcloud.net/backend/penahub_common v0.0.0-20240223054633-6cb3d5ce45b6 h1:oV+/HNX+JPoQ3/GUx08hio7d45WpY0AMGrFs7j70QlA=

@ -21,7 +21,7 @@ func Run(ctx context.Context, config initialize.Config, logger *zap.Logger) erro
defer cancel()
// todo обдумать буфер чтобы не было блокировок, хотя это не предугадать но оптимально подстроить можно
welcomeChan := make(chan models.Message, 50)
welcomeChan := make(chan models.Message, 10)
mdb, err := initialize.MongoInit(ctx, config)
if err != nil {
@ -30,6 +30,10 @@ func Run(ctx context.Context, config initialize.Config, logger *zap.Logger) erro
}
kafka, err := initialize.KafkaConsumerInit(ctx, config)
if err != nil {
logger.Error("Failed to initialize kafka", zap.Error(err))
return err
}
repo := repository.NewRepository(mdb.Collection("notify"), welcomeChan)
@ -44,6 +48,8 @@ func Run(ctx context.Context, config initialize.Config, logger *zap.Logger) erro
Logger: logger,
})
quizClient := clients.NewQuizClient(config.QuizRPCURL, logger)
customerClient := clients.NewCustomerClient(clients.CustomerDeps{
Url: config.CustomerURL,
Logger: logger,
@ -59,6 +65,7 @@ func Run(ctx context.Context, config initialize.Config, logger *zap.Logger) erro
Repo: repo,
MailClient: mailClient,
CustomerClient: customerClient,
QuizClient: quizClient,
Logger: logger,
})

@ -0,0 +1,67 @@
package clients
import (
"context"
"go.uber.org/zap"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
notifyer "mailnotifier/internal/proto"
)
type QuizClient struct {
address string
logger *zap.Logger
}
func NewQuizClient(address string, logger *zap.Logger) *QuizClient {
return &QuizClient{
address: address,
logger: logger,
}
}
func (q *QuizClient) GetQuizzes(ctx context.Context, req *notifyer.GetQuizzesRequest) (*notifyer.GetQuizzesResponse, error) {
connection, err := grpc.Dial(q.address, grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
q.logger.Error("failed to connect on GetQuizzes of core rpc", zap.Error(err), zap.String("core rpc host", q.address))
return nil, err
}
defer func() {
if closeErr := connection.Close(); closeErr != nil {
q.logger.Error("failed to close connection on GetQuizzes of core rpc", zap.Error(closeErr))
}
}()
client := notifyer.NewQuizServiceClient(connection)
response, err := client.GetQuizzes(ctx, req)
if err != nil {
q.logger.Error("failed to GetQuizzes core rpc", zap.Error(err), zap.Any("request", req))
return nil, err
}
return response, nil
}
func (q *QuizClient) GetStartedQuizzes(ctx context.Context, req *notifyer.GetStartedQuizzesRequest) (*notifyer.GetStartedQuizzesResponse, error) {
connection, err := grpc.Dial(q.address, grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
q.logger.Error("failed to connect on GetStartedQuizzes of core rpc", zap.Error(err), zap.String("core rpc host", q.address))
return nil, err
}
defer func() {
if closeErr := connection.Close(); closeErr != nil {
q.logger.Error("failed to close connection on GetStartedQuizzes of core rpc", zap.Error(closeErr))
}
}()
client := notifyer.NewQuizServiceClient(connection)
response, err := client.GetStartedQuizzes(ctx, req)
if err != nil {
q.logger.Error("failed to GetStartedQuizzes core rpc", zap.Error(err), zap.Any("request", req))
return nil, err
}
return response, nil
}

@ -23,6 +23,7 @@ type Config struct {
SmtpApiKey string `env:"SMTP_API_KEY"`
SmtpSender string `env:"SMTP_SENDER"`
CustomerURL string `env:"CUSTOMER_URL"`
QuizRPCURL string `enc:"QUIZ_RPC_URL"`
}
func LoadConfig() (*Config, error) {

@ -4,6 +4,7 @@ import (
"context"
"go.uber.org/zap"
"mailnotifier/internal/clients"
notifyer "mailnotifier/internal/proto"
"mailnotifier/internal/repository"
"time"
)
@ -14,6 +15,7 @@ type Notifyer struct {
repo *repository.Repository
mailClient *clients.MailClient
customerClient *clients.Customer
quizClient *clients.QuizClient
logger *zap.Logger
}
@ -21,6 +23,7 @@ type NotifyerDeps struct {
Repo *repository.Repository
MailClient *clients.MailClient
CustomerClient *clients.Customer
QuizClient *clients.QuizClient
Logger *zap.Logger
}
@ -29,6 +32,7 @@ func NewNotifyer(deps NotifyerDeps) *Notifyer {
repo: deps.Repo,
mailClient: deps.MailClient,
customerClient: deps.CustomerClient,
quizClient: deps.QuizClient,
logger: deps.Logger,
}
}
@ -65,7 +69,15 @@ func (n *Notifyer) notify(ctx context.Context) {
}
// тут запрос к кору на получение всех квизов, если длина больше 0, то отправляем письмо
resp, err := n.quizClient.GetQuizzes(ctx, &notifyer.GetQuizzesRequest{
AccountId: record.AccountID,
})
if err != nil {
n.logger.Error("error getting all created quizzes from core rpc:", zap.Error(err))
continue
}
if len(resp.QuizIds) > 0 {
// отправка письма
err = n.mailClient.MailSender(clients.SenderDeps{
Subject: "checkCreatedQuiz",
@ -77,6 +89,8 @@ func (n *Notifyer) notify(ctx context.Context) {
}
}
}
if record.SendRegistration && !record.SendUnpublished && now.Sub(record.SendAt) >= 14*24*time.Hour {
record.SendUnpublished = true
err = n.repo.Update(ctx, record)
@ -86,7 +100,16 @@ func (n *Notifyer) notify(ctx context.Context) {
}
// тут запрос к кору на получение всех квизов со start = true, если нет ниодного со start true, то отправляем письмо
resp, err := n.quizClient.GetStartedQuizzes(ctx, &notifyer.GetStartedQuizzesRequest{
AccountId: record.AccountID,
})
if err != nil {
n.logger.Error("error getting all started quizzes from core rpc:", zap.Error(err))
continue
}
if len(resp.QuizIds) == 0 {
// отправка письма
err = n.mailClient.MailSender(clients.SenderDeps{
Subject: "checkPublishedQuiz",
@ -97,6 +120,7 @@ func (n *Notifyer) notify(ctx context.Context) {
n.logger.Error("error sending message to mailbox checkPublishedQuiz:", zap.Error(err))
}
}
}
if record.SendRegistration && !record.SendPaid && now.Sub(record.SendAt) > 14*24*time.Hour {
record.SendPaid = true