feat: update callback handler and repository for user
All checks were successful
Backend ci / build (push) Successful in 3m23s

This commit is contained in:
d3m0k1d
2026-02-10 22:45:27 +03:00
parent a58e0f4451
commit 4a5c42ca06
6 changed files with 63 additions and 7 deletions

View File

@@ -14,9 +14,9 @@ var jwtSecret = []byte(os.Getenv("JWT_SECRET"))
func GenerateJWT(user storage.User) (string, error) { func GenerateJWT(user storage.User) (string, error) {
token := jwt.NewWithClaims(jwt.SigningMethodHS512, jwt.MapClaims{ token := jwt.NewWithClaims(jwt.SigningMethodHS512, jwt.MapClaims{
"id": user.ID, "id": user.ID,
"email": user.Email, "email": user.Email,
"login": user.GithubLogin, "github_id": user.GithubID,
}) })
tokenString, err := token.SignedString(jwtSecret) tokenString, err := token.SignedString(jwtSecret)
if err != nil { if err != nil {

View File

@@ -1,6 +1,7 @@
package handlers package handlers
import ( import (
"encoding/json"
"os" "os"
"gitea.d3m0k1d.ru/d3m0k1d/d3m0k1d.ru/backend/internal/logger" "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()}) c.JSON(500, gin.H{"error": "exchange failed", "details": err.Error()})
return 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") h.logger.Info("200 OK - token received")
c.JSON(200, gin.H{"token": token}) c.JSON(200, gin.H{"user": ghUser})
} }

View File

@@ -5,6 +5,7 @@ import (
"database/sql" "database/sql"
"gitea.d3m0k1d.ru/d3m0k1d/d3m0k1d.ru/backend/internal/logger" "gitea.d3m0k1d.ru/d3m0k1d/d3m0k1d.ru/backend/internal/logger"
"gitea.d3m0k1d.ru/d3m0k1d/d3m0k1d.ru/backend/internal/storage"
) )
type authRepository struct { type authRepository struct {
@@ -18,5 +19,23 @@ func NewAuthRepository(db *sql.DB) AuthRepository {
logger: logger.New(false), 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
} }

View File

@@ -15,5 +15,6 @@ type PostRepository interface {
} }
type AuthRepository 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)
} }

View File

@@ -11,7 +11,7 @@ CREATE TABLE IF NOT EXISTS posts(
CREATE TABLE IF NOT EXISTS users( CREATE TABLE IF NOT EXISTS users(
id INTEGER PRIMARY KEY AUTOINCREMENT, id INTEGER PRIMARY KEY AUTOINCREMENT,
email TEXT, email TEXT,
github_id TEXT, github_id INTEGER,
github_login TEXT, github_login TEXT,
avatar_url TEXT avatar_url TEXT
); );

View File

@@ -25,3 +25,10 @@ type User struct {
GithubLogin string `db:"github_login"` GithubLogin string `db:"github_login"`
AvatarURL string `db:"avatar_url"` 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"`
}