package v1 import ( "context" "gitea.badhouseplants.net/softplayer/softplayer-backend/internal/controllers" 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 NewPublicAccountServer( accountsCtrl *controllers.AccountController, authorizationCtrl *controllers.AuthController, ) *PublicAccountService { return &PublicAccountService{ accountsCtrl: accountsCtrl, authorizationCtrl: authorizationCtrl, } } type PublicAccountService struct { accounts.UnimplementedPublicAccountsServiceServer accountsCtrl *controllers.AccountController authorizationCtrl *controllers.AuthController } func (a *PublicAccountService) SignIn(ctx context.Context, in *accounts.SignInRequest) (*empty.Empty, error) { id, err := a.accountsCtrl.Login(ctx, in.GetEmail(), in.GetPassword()) if err != nil { return nil, status.Error(codes.Aborted, "Couldn't create a user") } accessToken, _, err := a.authorizationCtrl.GenerateToken(&controllers.JWTData{ UserID: id, TokenType: controllers.TokenTypeAccess, TokenAud: controllers.TokenAudWeb, }) if err != nil { return nil, status.Error(codes.Aborted, "Couldn't generate an access token") } refreshToken, tokenID, err := a.authorizationCtrl.GenerateToken(&controllers.JWTData{ UserID: id, TokenType: controllers.TokenTypeRefresh, TokenAud: controllers.TokenAudWeb, }) if err != nil { return nil, status.Error(codes.Aborted, "Couldn't generate an access token") } session := &controllers.Session{UserID: id} if err := a.authorizationCtrl.SaveSession(ctx, tokenID, session); err != nil { return nil, status.Error(codes.Aborted, "Couldn't store session") } header := metadata.New(map[string]string{ "X-Access-Token": accessToken, "X-Refresh-Token": refreshToken, }) if err := grpc.SetHeader(ctx, header); err != nil { return nil, status.Error(codes.Aborted, "Couldn't set metadata") } return &emptypb.Empty{}, nil } // Create a new account in Softplayer func (a *PublicAccountService) SignUp(ctx context.Context, in *accounts.SignUpRequest) (*empty.Empty, error) { data := &controllers.AccountData{ Password: in.GetPassword(), Email: in.GetEmail(), } id, err := a.accountsCtrl.Create(ctx, data) if err != nil { return nil, status.Error(codes.Aborted, "Couldn't create a user") } accessToken, _, err := a.authorizationCtrl.GenerateToken(&controllers.JWTData{ UserID: id, TokenType: controllers.TokenTypeAccess, TokenAud: controllers.TokenAudWeb, }) if err != nil { return nil, status.Error(codes.Aborted, "Couldn't generate an access token") } refreshToken, tokenID, err := a.authorizationCtrl.GenerateToken(&controllers.JWTData{ UserID: id, TokenType: controllers.TokenTypeRefresh, TokenAud: controllers.TokenAudWeb, }) if err != nil { return nil, status.Error(codes.Aborted, "Couldn't generate an access token") } session := &controllers.Session{UserID: id} if err := a.authorizationCtrl.SaveSession(ctx, tokenID, session); err != nil { return nil, status.Error(codes.Aborted, "Couldn't store session") } header := metadata.New(map[string]string{ "X-Access-Token": accessToken, "X-Refresh-Token": refreshToken, }) if err := grpc.SetHeader(ctx, header); err != nil { return nil, status.Error(codes.Aborted, "Couldn't set metadata") } return &emptypb.Empty{}, nil }