feat: update callback handler and repository for user
All checks were successful
Backend ci / build (push) Successful in 3m23s
All checks were successful
Backend ci / build (push) Successful in 3m23s
This commit is contained in:
@@ -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 {
|
||||||
|
|||||||
@@ -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})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -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"`
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user