package v1 import ( "context" "gitea.badhouseplants.net/softplayer/softplayer-backend/internal/controllers" "gitea.badhouseplants.net/softplayer/softplayer-backend/internal/tools/logger" accounts "gitea.badhouseplants.net/softplayer/softplayer-go-proto/pkg/accounts/v1" "github.com/golang/protobuf/ptypes/empty" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/metadata" "google.golang.org/grpc/status" "google.golang.org/protobuf/types/known/emptypb" ) func NewAccountAuthRPCImpl(ctrl *controllers.AccountController) *AccountsAuthServer { return &AccountsAuthServer{ ctrl: ctrl, } } type AccountsAuthServer struct { accounts.UnimplementedAccountsAuthServiceServer ctrl *controllers.AccountController } func (a *AccountsAuthServer) RefreshToken(ctx context.Context, in *empty.Empty) (*empty.Empty, error) { tokenID := ctx.Value("token_id").(string) userID := ctx.Value("user_id").(string) log := logger.FromContext(ctx) uuid, err := a.ctrl.ValidateRefreshToken(ctx, tokenID, userID) if err != nil { return nil, status.Error(codes.Unauthenticated, "refresh token is invalid") } accessToken, err := a.ctrl.GenerateAccessToken(uuid) if err != nil { log.Error(err, "Couldn't generate an access token") return nil, status.Error(codes.Aborted, "Couldn't generate Access Token") } refreshToken, err := a.ctrl.GenerateRefreshToken(ctx, uuid) if err != nil { log.Error(err, "Couldn't generate a refresh token") return nil, status.Error(codes.Aborted, "Couldn't generate Access Token") } header := metadata.Pairs( "access-token", accessToken, "refreshToken", refreshToken, ) if err := grpc.SetHeader(ctx, header); err != nil { log.Error(err, "Couldn't set headers") return nil, status.Error(codes.Unknown, "Couldn't set headers") } return &emptypb.Empty{}, nil }