diff options
Diffstat (limited to 'api')
-rw-r--r-- | api/auth/auth.go | 13 | ||||
-rw-r--r-- | api/database/database.go | 2 | ||||
-rw-r--r-- | api/database/models.go | 13 | ||||
-rw-r--r-- | api/handlers/handlers.go | 52 |
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}) +} |