286 lines
6.8 KiB
Go
286 lines
6.8 KiB
Go
package grpcserver
|
|
|
|
import (
|
|
"context"
|
|
"encoding/base64"
|
|
"encoding/json"
|
|
"strings"
|
|
"time"
|
|
|
|
grpcproto "git.coopgo.io/coopgo-apps/silvermobi/servers/grpcapi/proto"
|
|
"github.com/rs/zerolog/log"
|
|
"google.golang.org/grpc/codes"
|
|
"google.golang.org/grpc/metadata"
|
|
"google.golang.org/grpc/status"
|
|
)
|
|
|
|
func (s SilvermobiGRPCService) SetPhoneNumber(ctx context.Context,
|
|
req *grpcproto.SetPhoneNumberRequest) (res *grpcproto.SetPhoneNumberResponse, err error) {
|
|
|
|
var (
|
|
md metadata.MD
|
|
authHeader []string
|
|
ok bool
|
|
)
|
|
|
|
if md, ok = metadata.FromIncomingContext(ctx); !ok {
|
|
return nil, status.Errorf(codes.Unauthenticated, "Missing metadata")
|
|
}
|
|
|
|
authHeader, ok = md["authorization"]
|
|
if !ok || len(authHeader) == 0 {
|
|
return nil, status.Errorf(codes.Unauthenticated, "Missing authorization header")
|
|
}
|
|
|
|
tokenString := strings.TrimPrefix(authHeader[0], "Bearer ")
|
|
|
|
id := ExtractIdFromToken(tokenString)
|
|
|
|
log.Info().
|
|
Str("User ID", id).
|
|
Msg("SetPhoneNumber")
|
|
if err = s.Handler.UpdatePhoneNumber(
|
|
context.Background(),
|
|
id,
|
|
req.PhoneNumber,
|
|
); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &grpcproto.SetPhoneNumberResponse{Ok: true}, nil
|
|
}
|
|
|
|
func (s SilvermobiGRPCService) VerifyPhoneNumber(ctx context.Context,
|
|
req *grpcproto.VerifyPhoneNumberRequest) (res *grpcproto.VerifyPhoneNumberResponse, err error) {
|
|
|
|
var (
|
|
md metadata.MD
|
|
authHeader []string
|
|
ok bool
|
|
)
|
|
|
|
if md, ok = metadata.FromIncomingContext(ctx); !ok {
|
|
return nil, status.Errorf(codes.Unauthenticated, "Missing metadata")
|
|
}
|
|
|
|
authHeader, ok = md["authorization"]
|
|
|
|
if !ok || len(authHeader) == 0 {
|
|
return nil, status.Errorf(codes.Unauthenticated,
|
|
"Missing authorization header")
|
|
}
|
|
|
|
tokenString := strings.TrimPrefix(authHeader[0], "Bearer ")
|
|
|
|
id := ExtractIdFromToken(tokenString)
|
|
log.Info().
|
|
Str("User ID", id).
|
|
Msg("VerifyPhoneNumber")
|
|
|
|
if err = s.Handler.VerifyPhoneNumber(
|
|
context.Background(),
|
|
id,
|
|
req.PhoneNumber,
|
|
req.VerificationCode,
|
|
); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &grpcproto.VerifyPhoneNumberResponse{Ok: true}, nil
|
|
}
|
|
|
|
func (s SilvermobiGRPCService) SetBirthDate(ctx context.Context,
|
|
req *grpcproto.BirthDateRequest) (res *grpcproto.BirthDateResponse, err error) {
|
|
|
|
var (
|
|
md metadata.MD
|
|
authHeader []string
|
|
ok bool
|
|
)
|
|
|
|
if md, ok = metadata.FromIncomingContext(ctx); !ok {
|
|
return nil, status.Errorf(codes.Unauthenticated, "Missing metadata")
|
|
}
|
|
|
|
authHeader, ok = md["authorization"]
|
|
if !ok || len(authHeader) == 0 {
|
|
return nil, status.Errorf(codes.Unauthenticated, "Missing authorization header")
|
|
}
|
|
|
|
tokenString := strings.TrimPrefix(authHeader[0], "Bearer ")
|
|
id := ExtractIdFromToken(tokenString)
|
|
|
|
log.Info().
|
|
Str("User ID", id).
|
|
Msg("SetBirthDate")
|
|
|
|
birthdate := time.Unix(req.Birthdate.Seconds, int64(req.Birthdate.Nanos)).UTC()
|
|
birthdateString := birthdate.Format("2006-01-02T15:04:05Z")
|
|
if err = s.Handler.UpdateBirthDate(ctx, id, birthdateString); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &grpcproto.BirthDateResponse{
|
|
Ok: true,
|
|
}, nil
|
|
}
|
|
|
|
func (s SilvermobiGRPCService) SetAccountType(ctx context.Context,
|
|
req *grpcproto.AccountTypeRequest) (res *grpcproto.AccountTypeResponse, err error) {
|
|
|
|
var (
|
|
md metadata.MD
|
|
authHeader []string
|
|
ok bool
|
|
)
|
|
|
|
if md, ok = metadata.FromIncomingContext(ctx); !ok {
|
|
return nil, status.Errorf(codes.Unauthenticated, "Missing metadata")
|
|
}
|
|
|
|
authHeader, ok = md["authorization"]
|
|
if !ok || len(authHeader) == 0 {
|
|
return nil, status.Errorf(codes.Unauthenticated,
|
|
"Missing authorization header")
|
|
}
|
|
|
|
tokenString := strings.TrimPrefix(authHeader[0], "Bearer ")
|
|
|
|
id := ExtractIdFromToken(tokenString)
|
|
|
|
log.Info().
|
|
Str("User ID", id).
|
|
Msg("SetAccountType")
|
|
|
|
if req.GetType() != grpcproto.AccountTypeRequest_PASSENGER && req.GetType() != grpcproto.AccountTypeRequest_DRIVER {
|
|
return nil, status.Errorf(codes.InvalidArgument, "Type should be PASSENGER or DRIVER")
|
|
}
|
|
|
|
if err = s.Handler.SetAccountType(ctx, id, req.GetType().String()); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &grpcproto.AccountTypeResponse{
|
|
Ok: true,
|
|
}, nil
|
|
|
|
}
|
|
|
|
func (s SilvermobiGRPCService) GetAccountType(ctx context.Context,
|
|
req *grpcproto.AccountTypeRequest) (res *grpcproto.AccountTypeResponse, err error) {
|
|
|
|
var (
|
|
md metadata.MD
|
|
authHeader []string
|
|
ok bool
|
|
accountType string
|
|
responseType grpcproto.AccountTypeResponse_AccountType
|
|
)
|
|
|
|
if md, ok = metadata.FromIncomingContext(ctx); !ok {
|
|
return nil, status.Errorf(codes.Unauthenticated, "Missing metadata")
|
|
}
|
|
|
|
authHeader, ok = md["authorization"]
|
|
|
|
if !ok || len(authHeader) == 0 {
|
|
return nil, status.Errorf(codes.Unauthenticated, "Missing authorization header")
|
|
}
|
|
|
|
tokenString := strings.TrimPrefix(authHeader[0], "Bearer ")
|
|
|
|
id := ExtractIdFromToken(tokenString)
|
|
|
|
log.Info().
|
|
Str("User ID", id).
|
|
Msg("GetAccountType")
|
|
|
|
if req.Request == false || !req.Request {
|
|
return nil, status.Errorf(codes.InvalidArgument, "request arg should be true")
|
|
}
|
|
|
|
if accountType, err = s.Handler.GetAccountType(ctx, id); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
switch accountType {
|
|
case "PASSENGER":
|
|
responseType = grpcproto.AccountTypeResponse_PASSENGER
|
|
case "DRIVER":
|
|
responseType = grpcproto.AccountTypeResponse_DRIVER
|
|
default:
|
|
return nil, status.Errorf(codes.InvalidArgument, "Invalid account type")
|
|
}
|
|
|
|
response := &grpcproto.AccountTypeResponse{
|
|
Type: responseType,
|
|
}
|
|
|
|
return response, nil
|
|
|
|
}
|
|
|
|
func (s SilvermobiGRPCService) GetValidation(ctx context.Context,
|
|
req *grpcproto.ValidationRequest) (res *grpcproto.ValidationResponse, err error) {
|
|
|
|
var (
|
|
md metadata.MD
|
|
authHeader []string
|
|
ok, phoneValidation, birthValidation, typeValidation bool
|
|
)
|
|
|
|
if md, ok = metadata.FromIncomingContext(ctx); ok {
|
|
return nil, status.Errorf(codes.Unauthenticated, "Missing metadata")
|
|
}
|
|
|
|
authHeader, ok = md["authorization"]
|
|
|
|
if !ok || len(authHeader) == 0 {
|
|
return nil, status.Errorf(codes.Unauthenticated, "Missing authorization header")
|
|
}
|
|
|
|
tokenString := strings.TrimPrefix(authHeader[0], "Bearer ")
|
|
|
|
id := ExtractIdFromToken(tokenString)
|
|
|
|
if phoneValidation, birthValidation, typeValidation, err = s.Handler.CheckValidation(ctx, id); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &grpcproto.ValidationResponse{
|
|
Phone: phoneValidation,
|
|
Birthdate: birthValidation,
|
|
Type: typeValidation,
|
|
}, nil
|
|
}
|
|
|
|
func ExtractIdFromToken(tokenString string) string {
|
|
var (
|
|
err error
|
|
payloadBytes []byte
|
|
payloadMap map[string]interface{}
|
|
id string
|
|
ok bool
|
|
)
|
|
|
|
parts := strings.Split(tokenString, ".")
|
|
|
|
if len(parts) != 3 {
|
|
return ""
|
|
}
|
|
|
|
if payloadBytes, err = base64.RawStdEncoding.DecodeString(parts[1]); err != nil {
|
|
return ""
|
|
}
|
|
|
|
if err = json.Unmarshal(payloadBytes, &payloadMap); err != nil {
|
|
return ""
|
|
}
|
|
|
|
if id, ok = payloadMap["sub"].(string); !ok {
|
|
return ""
|
|
}
|
|
|
|
return id
|
|
}
|