package grpcserver import ( "context" "strings" 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) PutFirebaseToken(ctx context.Context, req *grpcproto.FirebaseTokenRequest) (resp *grpcproto.FirebaseTokenResponse, err error) { var ( ok bool md metadata.MD authHeader []string ) if req.Token == "" || req.DevicePlatform == "" { return &grpcproto.FirebaseTokenResponse{ Result: false, }, nil } if md, ok = metadata.FromIncomingContext(ctx); !ok { return &grpcproto.FirebaseTokenResponse{ Result: false, }, status.Errorf(codes.Unauthenticated, "Missing metadata") } authHeader, ok = md["authorization"] if !ok || len(authHeader) == 0 { return &grpcproto.FirebaseTokenResponse{ Result: false, }, status.Errorf(codes.Unauthenticated, "Missing authorization header") } tokenString := strings.TrimPrefix(authHeader[0], "Bearer ") id := ExtractIdFromToken(tokenString) log.Info(). Str("User ID", id). Msg("PutFirebaseToken") if err = s.Handler.PutFirebase(context.Background(), id, req.Token, req.DevicePlatform); err != nil { return &grpcproto.FirebaseTokenResponse{ Result: false, }, status.Errorf(codes.Unknown, "Database error") } return &grpcproto.FirebaseTokenResponse{ Result: true, }, nil }