summaryrefslogtreecommitdiff
path: root/api
diff options
context:
space:
mode:
Diffstat (limited to 'api')
-rw-r--r--api/auth/auth.go13
-rw-r--r--api/database/database.go2
-rw-r--r--api/database/models.go13
-rw-r--r--api/handlers/handlers.go52
4 files changed, 75 insertions, 5 deletions
diff --git a/api/auth/auth.go b/api/auth/auth.go
index 23b4f53..b382beb 100644
--- a/api/auth/auth.go
+++ b/api/auth/auth.go
@@ -1,9 +1,12 @@
package auth
import (
- "github.com/golang-jwt/jwt/v5"
+ "errors"
"os"
+ "strings"
"time"
+
+ "github.com/golang-jwt/jwt/v5"
)
var jwtKey = []byte(os.Getenv("JWT_SECRET"))
@@ -32,7 +35,13 @@ func GenerateJWT(userID int) (string, error) {
func ValidateJWT(tokenString string) (*Claims, error) {
claims := &Claims{}
- token, err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) {
+ // A token has a form `Bearer ...`
+ tokenParts := strings.Split(tokenString, " ")
+ if len(tokenParts) != 2 {
+ return nil, errors.New("not valid JWT")
+ }
+
+ token, err := jwt.ParseWithClaims(tokenParts[1], claims, func(token *jwt.Token) (interface{}, error) {
return jwtKey, nil
})
diff --git a/api/database/database.go b/api/database/database.go
index e5ecca8..0ba40aa 100644
--- a/api/database/database.go
+++ b/api/database/database.go
@@ -17,7 +17,7 @@ func InitDb(dsn string) (*gorm.DB, error) {
db, err = gorm.Open(postgres.Open(dsn), &gorm.Config{})
if err == nil {
- db.AutoMigrate(&User{})
+ db.AutoMigrate(&User{}, &Play{})
}
return db, err
diff --git a/api/database/models.go b/api/database/models.go
index e309a36..900c7b3 100644
--- a/api/database/models.go
+++ b/api/database/models.go
@@ -9,3 +9,16 @@ type User struct {
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
+
+type Play struct {
+ ID int `json:"id"`
+ Player1ID int `json:"-"`
+ Player1 User `gorm:"foreignKey:Player1ID" json:"player1"`
+ Player2ID *int `json:"-"`
+ Player2 *User `gorm:"foreignKey:Player2ID;null" json:"player2"`
+ Name string `json:"name"`
+ IP1 string `json:"ip1"`
+ IP2 string `json:"ip2"`
+ CreatedAt time.Time `json:"created_at"`
+ UpdatedAt time.Time `json:"updated_at"`
+}
diff --git a/api/handlers/handlers.go b/api/handlers/handlers.go
index cc7a9d9..9166ec7 100644
--- a/api/handlers/handlers.go
+++ b/api/handlers/handlers.go
@@ -8,11 +8,16 @@ import (
"github.com/boozec/rahanna/api/auth"
"github.com/boozec/rahanna/api/database"
utils "github.com/boozec/rahanna/pkg"
+ "github.com/boozec/rahanna/relay"
"golang.org/x/crypto/bcrypt"
)
+type NewPlayRequest struct {
+ IP string `json:"ip"`
+}
+
func RegisterUser(w http.ResponseWriter, r *http.Request) {
- slog.Info("POST /register")
+ slog.Info("POST /auth/register")
var user database.User
err := json.NewDecoder(r.Body).Decode(&user)
if err != nil {
@@ -57,7 +62,7 @@ func RegisterUser(w http.ResponseWriter, r *http.Request) {
}
func LoginUser(w http.ResponseWriter, r *http.Request) {
- slog.Info("POST /login")
+ slog.Info("POST /auth/login")
var inputUser database.User
err := json.NewDecoder(r.Body).Decode(&inputUser)
if err != nil {
@@ -88,3 +93,46 @@ func LoginUser(w http.ResponseWriter, r *http.Request) {
json.NewEncoder(w).Encode(map[string]string{"token": token})
}
+
+func NewPlay(w http.ResponseWriter, r *http.Request) {
+ slog.Info("POST /play")
+ claims, err := auth.ValidateJWT(r.Header.Get("Authorization"))
+
+ if err != nil {
+ utils.JsonError(&w, err.Error())
+ return
+ }
+
+ var payload struct {
+ IP string `json:"ip"`
+ }
+
+ if err := json.NewDecoder(r.Body).Decode(&payload); err != nil {
+ utils.JsonError(&w, err.Error())
+ return
+ }
+
+ if err != nil {
+ utils.JsonError(&w, err.Error())
+ return
+ }
+
+ db, _ := database.GetDb()
+
+ name := relay.NewSession()
+ play := database.Play{
+ Player1ID: claims.UserID,
+ Player2ID: nil,
+ Name: name,
+ IP1: payload.IP,
+ IP2: "",
+ }
+
+ result := db.Create(&play)
+ if result.Error != nil {
+ utils.JsonError(&w, result.Error.Error())
+ return
+ }
+
+ json.NewEncoder(w).Encode(map[string]string{"name": name})
+}