From 4a5c42ca06f3aa2f88a0536e033e3d8fe798408a Mon Sep 17 00:00:00 2001 From: d3m0k1d Date: Tue, 10 Feb 2026 22:45:27 +0300 Subject: [PATCH] feat: update callback handler and repository for user --- backend/internal/auth/jwt.go | 6 ++-- backend/internal/handlers/auth_handlers.go | 31 ++++++++++++++++++- .../internal/repositories/auth_repository.go | 21 ++++++++++++- backend/internal/repositories/interface.go | 3 +- backend/internal/storage/migrations.go | 2 +- backend/internal/storage/models.go | 7 +++++ 6 files changed, 63 insertions(+), 7 deletions(-) diff --git a/backend/internal/auth/jwt.go b/backend/internal/auth/jwt.go index 1da5967..e836759 100644 --- a/backend/internal/auth/jwt.go +++ b/backend/internal/auth/jwt.go @@ -14,9 +14,9 @@ var jwtSecret = []byte(os.Getenv("JWT_SECRET")) func GenerateJWT(user storage.User) (string, error) { token := jwt.NewWithClaims(jwt.SigningMethodHS512, jwt.MapClaims{ - "id": user.ID, - "email": user.Email, - "login": user.GithubLogin, + "id": user.ID, + "email": user.Email, + "github_id": user.GithubID, }) tokenString, err := token.SignedString(jwtSecret) if err != nil { diff --git a/backend/internal/handlers/auth_handlers.go b/backend/internal/handlers/auth_handlers.go index b3ef451..31dcf0e 100644 --- a/backend/internal/handlers/auth_handlers.go +++ b/backend/internal/handlers/auth_handlers.go @@ -1,6 +1,7 @@ package handlers import ( + "encoding/json" "os" "gitea.d3m0k1d.ru/d3m0k1d/d3m0k1d.ru/backend/internal/logger" @@ -81,7 +82,35 @@ 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 { + h.logger.Error("Get failed: " + err.Error()) + c.JSON(500, gin.H{"error": "get request failed to github", "details": err.Error()}) + return + } + var ghUser struct { + ID int `json:"id"` + Login string `json:"login"` + Email string `json:"email"` + AvatarURL string `json:"avatar_url"` + } + err = json.NewDecoder(resp.Body).Decode(&ghUser) + if err != nil { + h.logger.Error("Decode failed: " + err.Error()) + c.JSON(500, gin.H{"error": "decode failed", "details": err.Error()}) + return + } + isreg, err := h.repo.IsRegistered(c.Request.Context(), ghUser.ID) + if err != nil { + c.JSON(500, gin.H{"error": "database error", "details": err.Error()}) + return + } + if isreg { + c.JSON(200, gin.H{"user": ghUser}) + return + } h.logger.Info("200 OK - token received") - c.JSON(200, gin.H{"token": token}) + c.JSON(200, gin.H{"user": ghUser}) } diff --git a/backend/internal/repositories/auth_repository.go b/backend/internal/repositories/auth_repository.go index d8dbb99..7ef2caf 100644 --- a/backend/internal/repositories/auth_repository.go +++ b/backend/internal/repositories/auth_repository.go @@ -5,6 +5,7 @@ import ( "database/sql" "gitea.d3m0k1d.ru/d3m0k1d/d3m0k1d.ru/backend/internal/logger" + "gitea.d3m0k1d.ru/d3m0k1d/d3m0k1d.ru/backend/internal/storage" ) type authRepository struct { @@ -18,5 +19,23 @@ func NewAuthRepository(db *sql.DB) AuthRepository { logger: logger.New(false), } } -func (a *authRepository) Test(ctx context.Context) { + +func (a *authRepository) Register(ctx context.Context, user storage.UserReg) error { + _, 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.Info("User registered:", "email", user.Email) + return nil +} + +func (a *authRepository) IsRegistered(ctx context.Context, github_id int) (bool, error) { + row := a.db.QueryRow("SELECT id FROM users WHERE github_id = ?", github_id) + if row != nil { + return true, nil + } + return false, nil } diff --git a/backend/internal/repositories/interface.go b/backend/internal/repositories/interface.go index ccd80e9..1c1cbcc 100644 --- a/backend/internal/repositories/interface.go +++ b/backend/internal/repositories/interface.go @@ -15,5 +15,6 @@ type PostRepository interface { } type AuthRepository interface { - Test(ctx context.Context) + Register(ctx context.Context, user storage.UserReg) error + IsRegistered(ctx context.Context, github_id int) (bool, error) } diff --git a/backend/internal/storage/migrations.go b/backend/internal/storage/migrations.go index 58f1a9d..50cd1c3 100644 --- a/backend/internal/storage/migrations.go +++ b/backend/internal/storage/migrations.go @@ -11,7 +11,7 @@ CREATE TABLE IF NOT EXISTS posts( CREATE TABLE IF NOT EXISTS users( id INTEGER PRIMARY KEY AUTOINCREMENT, email TEXT, - github_id TEXT, + github_id INTEGER, github_login TEXT, avatar_url TEXT ); diff --git a/backend/internal/storage/models.go b/backend/internal/storage/models.go index 99c8de7..6a60251 100644 --- a/backend/internal/storage/models.go +++ b/backend/internal/storage/models.go @@ -25,3 +25,10 @@ type User struct { GithubLogin string `db:"github_login"` AvatarURL string `db:"avatar_url"` } + +type UserReg struct { + Email string `db:"email"` + GithubID string `db:"github_id"` + GithubLogin string `db:"github_login"` + AvatarURL string `db:"avatar_url"` +}