diff options
Diffstat (limited to 'internal')
-rw-r--r-- | internal/api/handlers/handlers.go | 85 | ||||
-rw-r--r-- | internal/network/network.go | 7 | ||||
-rw-r--r-- | internal/network/network_test.go | 8 |
3 files changed, 84 insertions, 16 deletions
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")) |