package v1 import ( "context" "errors" "fmt" "gitea.badhouseplants.net/softplayer/softplayer-backend/internal/controllers" accounts "gitea.badhouseplants.net/softplayer/softplayer-go-proto/pkg/accounts/v1" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" ) func NewRefreshSessionServer( authorizationCtrl *controllers.AuthController, ) *RefreshSessionService { return &RefreshSessionService{ authorizationCtrl: authorizationCtrl, } } type RefreshSessionService struct { accounts.UnimplementedRefreshSessionServiceServer authorizationCtrl *controllers.AuthController } func (srv *RefreshSessionService) RefreshSession(ctx context.Context, in *accounts.RefreshSessionRequest) (*accounts.RefreshSessionResponse, error) { fmt.Println(in.GetRefreshToken()) claims, err := srv.authorizationCtrl.ParseToken(in.GetRefreshToken()) if err != nil { fmt.Println(err) return nil, status.Error(codes.Aborted, "Invalid token is sent") } if claims.TokenType != controllers.TokenTypeRefresh { return nil, status.Error(codes.Unauthenticated, "Invalid token") } session, err := srv.authorizationCtrl.GetSession(ctx, claims.TokenID) if err != nil { if errors.Is(err, controllers.ErrSessionNotFound) { return nil, status.Error(codes.Unauthenticated, "Session doesn't exists") } return nil, status.Error(codes.Internal, "Somethings is broken on our side") } if session.UserID != claims.UserID { return nil, status.Error(codes.Unauthenticated, "Invalid session") } accessToken, _, err := srv.authorizationCtrl.GenerateToken(&controllers.JWTData{ UserID: claims.UserID, TokenType: controllers.TokenTypeAccess, TokenAud: controllers.TokenAudWeb, }) if err != nil { return nil, status.Error(codes.Aborted, "Couldn't generate an access token") } refreshToken, tokenID, err := srv.authorizationCtrl.GenerateToken(&controllers.JWTData{ UserID: claims.UserID, TokenType: controllers.TokenTypeRefresh, TokenAud: controllers.TokenAudWeb, }) if err != nil { return nil, status.Error(codes.Aborted, "Couldn't generate an access token") } newSession := &controllers.Session{UserID: session.UserID} if err := srv.authorizationCtrl.SaveSession(ctx, tokenID, newSession); err != nil { return nil, status.Error(codes.Aborted, "Couldn't store session") } return &accounts.RefreshSessionResponse{TokenPair: &accounts.TokenPair{ AccessToken: accessToken, RefreshToken: refreshToken, }}, nil }