diff --git a/backend/?_journal_mode=WAL&_busy_timeout=5000&_synchronous=NORMAL&_cache_size=2000&_foreign_keys=ON b/backend/?_journal_mode=WAL&_busy_timeout=5000&_synchronous=NORMAL&_cache_size=2000&_foreign_keys=ON new file mode 100644 index 0000000..2da5919 Binary files /dev/null and b/backend/?_journal_mode=WAL&_busy_timeout=5000&_synchronous=NORMAL&_cache_size=2000&_foreign_keys=ON differ diff --git a/backend/internal/handlers/auth_handlers.go b/backend/internal/handlers/auth_handlers.go index 37d2dd2..c404a39 100644 --- a/backend/internal/handlers/auth_handlers.go +++ b/backend/internal/handlers/auth_handlers.go @@ -4,6 +4,7 @@ import ( "encoding/json" "os" + "gitea.d3m0k1d.ru/d3m0k1d/d3m0k1d.ru/backend/internal/auth" "gitea.d3m0k1d.ru/d3m0k1d/d3m0k1d.ru/backend/internal/logger" "gitea.d3m0k1d.ru/d3m0k1d/d3m0k1d.ru/backend/internal/repositories" "gitea.d3m0k1d.ru/d3m0k1d/d3m0k1d.ru/backend/internal/storage" @@ -66,6 +67,7 @@ func (h *AuthHandlers) LoginGithub(c *gin.Context) { // @Failure 500 {object} map[string]string "Exchange failed" // @Router /callback/github [get] func (h *AuthHandlers) CallbackGithub(c *gin.Context) { + var id int h.logger.Info("CallbackGithub called") code := c.Query("code") @@ -83,6 +85,7 @@ func (h *AuthHandlers) CallbackGithub(c *gin.Context) { c.JSON(500, gin.H{"error": "exchange failed", "details": err.Error()}) return } + client := h.config.Client(c.Request.Context(), token) resp, err := client.Get("https://api.github.com/user") if err != nil { @@ -90,6 +93,7 @@ func (h *AuthHandlers) CallbackGithub(c *gin.Context) { c.JSON(500, gin.H{"error": "get request failed to github", "details": err.Error()}) return } + var ghUser storage.UserReg err = json.NewDecoder(resp.Body).Decode(&ghUser) if err != nil { @@ -97,23 +101,41 @@ func (h *AuthHandlers) CallbackGithub(c *gin.Context) { c.JSON(500, gin.H{"error": "decode failed", "details": err.Error()}) return } + isreg, err := h.repo.IsRegistered(c.Request.Context(), ghUser.GithubID) if err != nil { + h.logger.Error("Database check failed: " + err.Error()) c.JSON(500, gin.H{"error": "database error", "details": err.Error()}) return } - if isreg { - c.JSON(200, gin.H{"user": ghUser}) - reg := h.repo.Register(c.Request.Context(), ghUser) - if reg != nil { - c.JSON(500, gin.H{"error": "database error", "details": reg.Error()}) - err := h.repo.Register(c.Request.Context(), ghUser) - if err != nil { - c.JSON(500, gin.H{"error": "database error", "details": err.Error()}) - h.logger.Error("Database eer in gh callback handler") - } + if !isreg { + h.logger.Info("New user, registering: " + ghUser.GithubLogin) + id, err = h.repo.Register(c.Request.Context(), ghUser) + if err != nil { + h.logger.Error("Registration failed: " + err.Error()) + c.JSON(500, gin.H{"error": "registration failed", "details": err.Error()}) + return } } + user := storage.User{ + ID: id, + GithubID: ghUser.GithubID, + GithubLogin: ghUser.GithubLogin, + Email: ghUser.Email, + AvatarURL: ghUser.AvatarURL, + } + jwtToken, err := auth.GenerateJWT(user) + if err != nil { + h.logger.Error("JWT generation failed: " + err.Error()) + c.JSON(500, gin.H{"error": "token generation failed", "details": err.Error()}) + return + } + h.logger.Info("Authentication successful for user: " + ghUser.GithubLogin) + + c.JSON(200, gin.H{ + "token": jwtToken, + "user": ghUser, + }) } diff --git a/backend/internal/repositories/auth_repository.go b/backend/internal/repositories/auth_repository.go index 7ef2caf..5361516 100644 --- a/backend/internal/repositories/auth_repository.go +++ b/backend/internal/repositories/auth_repository.go @@ -20,16 +20,24 @@ func NewAuthRepository(db *sql.DB) AuthRepository { } } -func (a *authRepository) Register(ctx context.Context, user storage.UserReg) error { +func (a *authRepository) Register(ctx context.Context, user storage.UserReg) (int, error) { + var id int _, err := a.db.Exec( "INSERT INTO users(email, github_id, github_login, avatar_url) VALUES(?, ?, ?, ?)", ) if err != nil { - a.logger.Error("error scan: " + err.Error()) - return err + a.logger.Error("error request: " + err.Error()) + return 0, err } + row := a.db.QueryRow("SELECT id FROM users WHERE github_id = ?", user.GithubID) + err = row.Scan(&id) + if err != nil { + a.logger.Error("error scan: " + err.Error()) + return 0, err + } + a.logger.Info("User registered:", "email", user.Email) - return nil + return id, nil } func (a *authRepository) IsRegistered(ctx context.Context, github_id int) (bool, error) { diff --git a/backend/internal/repositories/interface.go b/backend/internal/repositories/interface.go index 1c1cbcc..b49bdcf 100644 --- a/backend/internal/repositories/interface.go +++ b/backend/internal/repositories/interface.go @@ -15,6 +15,6 @@ type PostRepository interface { } type AuthRepository interface { - Register(ctx context.Context, user storage.UserReg) error + Register(ctx context.Context, user storage.UserReg) (int, error) IsRegistered(ctx context.Context, github_id int) (bool, error) } diff --git a/frontend/src/components/Skills.tsx b/frontend/src/components/Skills.tsx index cfc45d6..0385dab 100644 --- a/frontend/src/components/Skills.tsx +++ b/frontend/src/components/Skills.tsx @@ -12,7 +12,7 @@ export default function About() { 💻 Github