summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmd/api/main.go2
-rw-r--r--internal/api/handlers/handlers.go85
-rw-r--r--internal/network/network.go7
-rw-r--r--internal/network/network_test.go8
4 files changed, 86 insertions, 16 deletions
diff --git a/cmd/api/main.go b/cmd/api/main.go
index 1fcd4d1..1ce83c9 100644
--- a/cmd/api/main.go
+++ b/cmd/api/main.go
@@ -20,6 +20,8 @@ func main() {
r.HandleFunc("/auth/register", handlers.RegisterUser).Methods(http.MethodPost)
r.HandleFunc("/auth/login", handlers.LoginUser).Methods(http.MethodPost)
r.Handle("/play", middleware.AuthMiddleware(http.HandlerFunc(handlers.NewPlay))).Methods(http.MethodPost)
+ r.Handle("/play", middleware.AuthMiddleware(http.HandlerFunc(handlers.AllPlay))).Methods(http.MethodGet)
+ r.Handle("/play/{id}", middleware.AuthMiddleware(http.HandlerFunc(handlers.GetGameId))).Methods(http.MethodGet)
r.Handle("/enter-game", middleware.AuthMiddleware(http.HandlerFunc(handlers.EnterGame))).Methods(http.MethodPost)
log.Info("Serving on :8080")
diff --git a/internal/api/handlers/handlers.go b/internal/api/handlers/handlers.go
index 4f668cd..ed4598d 100644
--- a/internal/api/handlers/handlers.go
+++ b/internal/api/handlers/handlers.go
@@ -2,6 +2,7 @@ package handlers
import (
"encoding/json"
+ "fmt"
"net/http"
"time"
@@ -9,6 +10,7 @@ import (
"github.com/boozec/rahanna/internal/api/database"
"github.com/boozec/rahanna/internal/logger"
"github.com/boozec/rahanna/internal/network"
+ "github.com/gorilla/mux"
"gorm.io/gorm"
)
@@ -166,36 +168,101 @@ func EnterGame(w http.ResponseWriter, r *http.Request) {
db, _ := database.GetDb()
- var play database.Game
+ var game database.Game
- result := db.Where("name = ? AND player2_id IS NULL", payload.Name).First(&play)
+ result := db.Where("name = ? AND player2_id IS NULL", payload.Name).First(&game)
if result.Error != nil {
JsonError(&w, result.Error.Error())
return
}
- play.Player2ID = &claims.UserID
- play.IP2 = payload.IP
- play.UpdatedAt = time.Now()
+ game.Player2ID = &claims.UserID
+ game.IP2 = payload.IP
+ game.UpdatedAt = time.Now()
- if err := db.Save(&play).Error; err != nil {
+ if err := db.Save(&game).Error; err != nil {
JsonError(&w, err.Error())
return
}
- result = db.Where("id = ?", play.ID).
+ result = db.Where("id = ?", game.ID).
Preload("Player1", func(db *gorm.DB) *gorm.DB {
return db.Omit("Password")
}).
Preload("Player2", func(db *gorm.DB) *gorm.DB {
return db.Omit("Password")
}).
- First(&play)
+ First(&game)
if result.Error != nil {
JsonError(&w, result.Error.Error())
return
}
- json.NewEncoder(w).Encode(play)
+ json.NewEncoder(w).Encode(game)
+}
+
+func AllPlay(w http.ResponseWriter, r *http.Request) {
+ log, _ := logger.GetLogger()
+ log.Info("GET /play")
+
+ claims, err := auth.ValidateJWT(r.Header.Get("Authorization"))
+
+ if err != nil {
+ JsonError(&w, err.Error())
+ return
+ }
+
+ db, _ := database.GetDb()
+ var games []database.Game
+
+ result := db.Where("player1_id = ? OR player2_id = ?", claims.UserID, claims.UserID).
+ Preload("Player1", func(db *gorm.DB) *gorm.DB {
+ return db.Omit("Password")
+ }).
+ Preload("Player2", func(db *gorm.DB) *gorm.DB {
+ return db.Omit("Password")
+ }).
+ Order("updated_at DESC").
+ Find(&games)
+
+ if result.Error != nil {
+ JsonError(&w, result.Error.Error())
+ return
+ }
+
+ json.NewEncoder(w).Encode(games)
+}
+
+func GetGameId(w http.ResponseWriter, r *http.Request) {
+ log, _ := logger.GetLogger()
+ vars := mux.Vars(r)
+ id := vars["id"]
+ log.Info(fmt.Sprintf("GET /play/%s", id))
+
+ claims, err := auth.ValidateJWT(r.Header.Get("Authorization"))
+
+ if err != nil {
+ JsonError(&w, err.Error())
+ return
+ }
+
+ db, _ := database.GetDb()
+ var game database.Game
+
+ result := db.Where("id = ? AND (player1_id = ? OR player2_id = ?)", id, claims.UserID, claims.UserID).
+ Preload("Player1", func(db *gorm.DB) *gorm.DB {
+ return db.Omit("Password")
+ }).
+ Preload("Player2", func(db *gorm.DB) *gorm.DB {
+ return db.Omit("Password")
+ }).
+ First(&game)
+
+ if result.Error != nil {
+ JsonError(&w, result.Error.Error())
+ return
+ }
+
+ json.NewEncoder(w).Encode(game)
}
diff --git a/internal/network/network.go b/internal/network/network.go
index 247ce70..8b6c686 100644
--- a/internal/network/network.go
+++ b/internal/network/network.go
@@ -44,7 +44,7 @@ type TCPNetwork struct {
}
// initializes a TCP peer
-func NewTCPNetwork(localID, localIP string, localPort int) *TCPNetwork {
+func NewTCPNetwork(localID, localIP string, localPort int, onReceive func()) *TCPNetwork {
n := &TCPNetwork{
localPeer: PeerInfo{ID: localID, IP: localIP, Port: localPort},
connections: make(map[string]net.Conn),
@@ -54,7 +54,7 @@ func NewTCPNetwork(localID, localIP string, localPort int) *TCPNetwork {
logger: logger.InitLogger("rahanna.log"),
}
- go n.startServer()
+ go n.startServer(onReceive)
return n
}
@@ -65,7 +65,7 @@ func (n *TCPNetwork) AddPeer(remoteID string, remoteIP string, remotePort int) {
}
// startServer starts a TCP server to accept connections.
-func (n *TCPNetwork) startServer() {
+func (n *TCPNetwork) startServer(callback func()) {
address := fmt.Sprintf("%s:%d", n.localPeer.IP, n.localPeer.Port)
listener, err := net.Listen("tcp", address)
if err != nil {
@@ -85,6 +85,7 @@ func (n *TCPNetwork) startServer() {
remoteAddr := conn.RemoteAddr().String()
n.Lock()
n.connections[remoteAddr] = conn
+ callback()
n.Unlock()
n.isConnected = true
n.retryDelay = 2 * time.Second
diff --git a/internal/network/network_test.go b/internal/network/network_test.go
index 9dbc416..4f3211c 100644
--- a/internal/network/network_test.go
+++ b/internal/network/network_test.go
@@ -12,12 +12,12 @@ func TestPeerToPeerCommunication(t *testing.T) {
// Create a mock of the first peer (peer-1)
peer1IP := "127.0.0.1"
peer1Port := 9001
- peer1 := NewTCPNetwork("peer-1", peer1IP, peer1Port)
+ peer1 := NewTCPNetwork("peer-1", peer1IP, peer1Port, func() {})
// Create a mock of the second peer (peer-2)
peer2IP := "127.0.0.1"
peer2Port := 9002
- peer2 := NewTCPNetwork("peer-2", peer2IP, peer2Port)
+ peer2 := NewTCPNetwork("peer-2", peer2IP, peer2Port, func() {})
// Register a message handler on peer-2 to receive the message from peer-1
peer2.RegisterHandler("chat", func(msg Message) {
@@ -43,8 +43,8 @@ func TestPeerToPeerCommunication(t *testing.T) {
// TestSendFailure tests if sending a message fails when no connection exists.
func TestSendFailure(t *testing.T) {
- peer1 := NewTCPNetwork("peer-1", "127.0.0.1", 9001)
- _ = NewTCPNetwork("peer-2", "127.0.0.1", 9002)
+ peer1 := NewTCPNetwork("peer-1", "127.0.0.1", 9001, func() {})
+ _ = NewTCPNetwork("peer-2", "127.0.0.1", 9002, func() {})
// Attempt to send a message without establishing a connection first
err := peer1.Send("peer-2", "chat", []byte("Message without connection"))