2024-04-25 12:53:33 +00:00
package client
import (
"context"
"fmt"
"go.uber.org/zap"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
2024-04-28 08:20:58 +00:00
"io"
2024-04-25 12:53:33 +00:00
"log"
"penahub.gitlab.yandexcloud.net/pena-services/customer/internal/errors"
codeword_rpc "penahub.gitlab.yandexcloud.net/pena-services/customer/internal/proto/codeword"
"penahub.gitlab.yandexcloud.net/pena-services/customer/pkg/validate"
)
type CodewordClientDeps struct {
Logger * zap . Logger
CodewordServiceHost string
}
type CodewordClient struct {
logger * zap . Logger
codewordServiceHost string
}
func NewCodewordClient ( deps CodewordClientDeps ) * CodewordClient {
if deps . Logger == nil {
log . Panicln ( "logger is nil on <NewCodewordClient>" )
}
if validate . IsStringEmpty ( deps . CodewordServiceHost ) {
log . Panicln ( "codeword host is empty on <NewCodewordClient>" )
}
return & CodewordClient {
logger : deps . Logger ,
codewordServiceHost : deps . CodewordServiceHost ,
}
}
2024-04-28 08:20:58 +00:00
func ( receiver * CodewordClient ) GetAllPromoActivations ( ctx context . Context , req * codeword_rpc . Time ) ( map [ string ] [ ] * codeword_rpc . PromoActivationResp_UserTime , errors . Error ) {
2024-04-25 12:53:33 +00:00
connection , err := grpc . Dial ( receiver . codewordServiceHost , grpc . WithTransportCredentials ( insecure . NewCredentials ( ) ) )
if err != nil {
receiver . logger . Error ( "failed to connect on <GetAllPromoActivations> of <CodewordClient>" , zap . Error ( err ) , zap . String ( "codeword host" , receiver . codewordServiceHost ) )
return nil , errors . New ( fmt . Errorf ( "failed connect to codeword service: %w" , err ) , errors . ErrInternalError )
}
defer func ( ) {
if closeErr := connection . Close ( ) ; closeErr != nil {
receiver . logger . Error ( "failed to close connection on <GetAllPromoActivations> of <CodewordClient>" , zap . Error ( closeErr ) )
}
} ( )
client := codeword_rpc . NewPromoCodeServiceClient ( connection )
2024-04-28 08:20:58 +00:00
stream , err := client . GetAllPromoActivations ( ctx , req )
2024-04-25 12:53:33 +00:00
if err != nil {
2024-04-25 18:27:08 +00:00
receiver . logger . Error ( "failed getting stats resp on <GetAllPromoActivations> of <DiscountClient>" , zap . Error ( err ) )
2024-04-25 12:53:33 +00:00
return nil , errors . New ( fmt . Errorf ( "failed getting stats resp from codeword: %w" , err ) , errors . ErrInternalError )
}
2024-04-28 08:20:58 +00:00
response := make ( map [ string ] [ ] * codeword_rpc . PromoActivationResp_UserTime )
for {
activations , err := stream . Recv ( )
if err != nil {
if err == io . EOF {
break
}
return nil , errors . New ( fmt . Errorf ( "failed to receive response stream in codeword rpc client: %w" , err ) , errors . ErrInternalError )
}
if activations == nil {
continue
}
response [ activations . ID ] = append ( response [ activations . ID ] , activations . Users ... )
}
2024-04-25 12:53:33 +00:00
return response , nil
}