cleanup some shit in auth service
This commit is contained in:
@@ -3,14 +3,12 @@ package grpc
|
||||
import (
|
||||
"context"
|
||||
"log"
|
||||
"strings"
|
||||
|
||||
"datarush/internal/auth/domain"
|
||||
"datarush/internal/auth/service"
|
||||
pb "datarush/pkg/api/auth"
|
||||
|
||||
"google.golang.org/grpc/codes"
|
||||
"google.golang.org/grpc/metadata"
|
||||
"google.golang.org/grpc/status"
|
||||
)
|
||||
|
||||
@@ -58,18 +56,8 @@ func (h *AuthHandler) SignIn(ctx context.Context, req *pb.SignInRequest) (*pb.Si
|
||||
func (h *AuthHandler) ValidateToken(ctx context.Context, req *pb.ValidateTokenRequest) (*pb.ValidateTokenResponse, error) {
|
||||
token := req.Token
|
||||
|
||||
// If token is empty, try to get it from Authorization header (for gRPC-Gateway)
|
||||
if token == "" {
|
||||
md, ok := metadata.FromIncomingContext(ctx)
|
||||
if ok {
|
||||
authHeaders := md.Get("authorization")
|
||||
if len(authHeaders) > 0 {
|
||||
parts := strings.Split(authHeaders[0], " ")
|
||||
if len(parts) == 2 && parts[0] == "Bearer" {
|
||||
token = parts[1]
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil, status.Error(codes.Unauthenticated, "missing token")
|
||||
}
|
||||
|
||||
if token == "" {
|
||||
|
||||
@@ -1,24 +0,0 @@
|
||||
package interceptor
|
||||
|
||||
import (
|
||||
"context"
|
||||
"log"
|
||||
|
||||
"google.golang.org/grpc"
|
||||
)
|
||||
|
||||
type LoggerInterceptor struct{}
|
||||
|
||||
func NewLoggerInterceptor() *LoggerInterceptor {
|
||||
return &LoggerInterceptor{}
|
||||
}
|
||||
|
||||
func (li *LoggerInterceptor) UnaryServerInterceptor(
|
||||
ctx context.Context,
|
||||
req interface{},
|
||||
info *grpc.UnaryServerInfo,
|
||||
handler grpc.UnaryHandler,
|
||||
) (interface{}, error) {
|
||||
log.Printf("gRPC call: %s", info.FullMethod)
|
||||
return handler(ctx, req)
|
||||
}
|
||||
@@ -6,7 +6,6 @@ import (
|
||||
"log"
|
||||
"net"
|
||||
"net/http"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"datarush/internal/auth/config"
|
||||
@@ -43,24 +42,16 @@ func New(cfg *config.Config) *Server {
|
||||
}
|
||||
|
||||
func (s *Server) Start() error {
|
||||
// Connect to database
|
||||
db, err := sqlx.Connect("postgres", s.config.BuildPostgresConnStr())
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to connect to postgres: %w", err)
|
||||
}
|
||||
s.db = db
|
||||
|
||||
// Create tables
|
||||
if err := s.createTables(); err != nil {
|
||||
return fmt.Errorf("failed to create tables: %w", err)
|
||||
}
|
||||
|
||||
// Register gRPC services
|
||||
if err := s.registerGRPCServices(); err != nil {
|
||||
return fmt.Errorf("failed to register gRPC services: %w", err)
|
||||
}
|
||||
|
||||
// Start gRPC server in a goroutine
|
||||
go func() {
|
||||
lis, err := net.Listen("tcp", fmt.Sprintf(":%d", s.config.GRPCPort))
|
||||
if err != nil {
|
||||
@@ -73,7 +64,6 @@ func (s *Server) Start() error {
|
||||
}
|
||||
}()
|
||||
|
||||
// Start HTTP server
|
||||
if err := s.startHTTPServer(); err != nil {
|
||||
return fmt.Errorf("failed to start HTTP server: %w", err)
|
||||
}
|
||||
@@ -84,17 +74,13 @@ func (s *Server) Start() error {
|
||||
func (s *Server) registerGRPCServices() error {
|
||||
s.grpcServer = grpc.NewServer()
|
||||
|
||||
// Create repositories
|
||||
userRepo := authPostgresRepo.NewUserRepository(s.db)
|
||||
|
||||
// Create services
|
||||
authService := service.NewAuthService(userRepo, s.config.JWTSecret)
|
||||
|
||||
// Create and register handlers
|
||||
authHandler := grpcHandlers.NewAuthHandler(authService)
|
||||
pb.RegisterAuthServiceServer(s.grpcServer, authHandler)
|
||||
|
||||
// Enable reflection if configured
|
||||
if s.config.GRPCEnableReflection {
|
||||
reflection.Register(s.grpcServer)
|
||||
}
|
||||
@@ -103,20 +89,14 @@ func (s *Server) registerGRPCServices() error {
|
||||
}
|
||||
|
||||
func (s *Server) startHTTPServer() error {
|
||||
// Create repositories
|
||||
userRepo := authPostgresRepo.NewUserRepository(s.db)
|
||||
|
||||
// Create services
|
||||
authService := service.NewAuthService(userRepo, s.config.JWTSecret)
|
||||
|
||||
// Create HTTP handlers
|
||||
authHandler := httpHandlers.NewAuthHandler(authService)
|
||||
userHandler := httpHandlers.NewUserHandler(authService)
|
||||
|
||||
// Create router
|
||||
mux := http.NewServeMux()
|
||||
|
||||
// Register routes with middleware wrapper
|
||||
mux.HandleFunc("/api/v1/sign-up", func(w http.ResponseWriter, r *http.Request) {
|
||||
if r.Method != http.MethodPost {
|
||||
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
|
||||
@@ -133,41 +113,6 @@ func (s *Server) startHTTPServer() error {
|
||||
authHandler.SignIn(w, r)
|
||||
})
|
||||
|
||||
mux.HandleFunc("/api/v1/me", func(w http.ResponseWriter, r *http.Request) {
|
||||
if r.Method != http.MethodGet {
|
||||
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
|
||||
return
|
||||
}
|
||||
userHandler.GetMe(w, r)
|
||||
})
|
||||
|
||||
mux.HandleFunc("/api/v1/users/", func(w http.ResponseWriter, r *http.Request) {
|
||||
if r.Method != http.MethodGet {
|
||||
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
|
||||
return
|
||||
}
|
||||
// Extract user_id from path /api/v1/users/:user_id
|
||||
userID := strings.TrimPrefix(r.URL.Path, "/api/v1/users/")
|
||||
r.Header.Set("X-User-ID", userID)
|
||||
userHandler.GetUser(w, r)
|
||||
})
|
||||
|
||||
mux.HandleFunc("/api/v1/me/stat", func(w http.ResponseWriter, r *http.Request) {
|
||||
if r.Method != http.MethodGet {
|
||||
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
|
||||
return
|
||||
}
|
||||
userHandler.GetMyStat(w, r)
|
||||
})
|
||||
|
||||
mux.HandleFunc("/api/v1/leaderboard", func(w http.ResponseWriter, r *http.Request) {
|
||||
if r.Method != http.MethodGet {
|
||||
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
|
||||
return
|
||||
}
|
||||
userHandler.GetLeaderboard(w, r)
|
||||
})
|
||||
|
||||
s.httpServer = &http.Server{
|
||||
Addr: fmt.Sprintf(":%d", s.config.HTTPPort),
|
||||
Handler: mux,
|
||||
@@ -209,21 +154,3 @@ func (s *Server) Stop() {
|
||||
|
||||
log.Println("auth server stopped")
|
||||
}
|
||||
|
||||
func (s *Server) createTables() error {
|
||||
schema := `
|
||||
CREATE TABLE IF NOT EXISTS users (
|
||||
id UUID PRIMARY KEY,
|
||||
email VARCHAR(255) UNIQUE NOT NULL,
|
||||
username VARCHAR(255) NOT NULL,
|
||||
password VARCHAR(255) NOT NULL,
|
||||
created_at TIMESTAMP NOT NULL,
|
||||
updated_at TIMESTAMP NOT NULL
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_users_email ON users(email);
|
||||
`
|
||||
|
||||
_, err := s.db.Exec(schema)
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -36,7 +36,6 @@ func NewAuthService(repo UserRepository, jwtSecret string) *AuthService {
|
||||
}
|
||||
|
||||
func (s *AuthService) SignUp(ctx context.Context, email, username, password string) (string, error) {
|
||||
// Check if user already exists
|
||||
_, err := s.repo.GetByEmail(ctx, email)
|
||||
if err == nil {
|
||||
return "", domain.ErrUserAlreadyExists
|
||||
@@ -45,13 +44,11 @@ func (s *AuthService) SignUp(ctx context.Context, email, username, password stri
|
||||
return "", err
|
||||
}
|
||||
|
||||
// Hash password
|
||||
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcryptCost)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
// Create user
|
||||
user := &domain.User{
|
||||
ID: domain.NewID(),
|
||||
Email: email,
|
||||
@@ -63,7 +60,6 @@ func (s *AuthService) SignUp(ctx context.Context, email, username, password stri
|
||||
return "", err
|
||||
}
|
||||
|
||||
// Generate token
|
||||
token, err := s.generateToken(user)
|
||||
if err != nil {
|
||||
return "", err
|
||||
@@ -73,7 +69,6 @@ func (s *AuthService) SignUp(ctx context.Context, email, username, password stri
|
||||
}
|
||||
|
||||
func (s *AuthService) SignIn(ctx context.Context, email, password string) (string, error) {
|
||||
// Get user by email
|
||||
user, err := s.repo.GetByEmail(ctx, email)
|
||||
if err != nil {
|
||||
if err == domain.ErrUserNotFound {
|
||||
@@ -82,12 +77,10 @@ func (s *AuthService) SignIn(ctx context.Context, email, password string) (strin
|
||||
return "", err
|
||||
}
|
||||
|
||||
// Check password
|
||||
if err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(password)); err != nil {
|
||||
return "", domain.ErrInvalidPassword
|
||||
}
|
||||
|
||||
// Generate token
|
||||
token, err := s.generateToken(user)
|
||||
if err != nil {
|
||||
return "", err
|
||||
|
||||
Reference in New Issue
Block a user