package routes
import (
"encoding/json"
"log"
"strconv"
"time"
"github.com/aziis98/lupus-lite/database"
"github.com/aziis98/lupus-lite/lupus"
"github.com/aziis98/lupus-lite/model"
"github.com/aziis98/lupus-lite/util"
"github.com/gofiber/fiber/v2"
)
func ( s * Server ) ApiRoutes ( api fiber . Router ) {
api . Get ( "/status" , func ( c * fiber . Ctx ) error {
s , err := json . MarshalIndent ( s . db , "" , " " )
if err != nil {
return err
}
log . Println ( string ( s ) )
return c . SendString ( "ok" )
} )
api . Post ( "/login" , func ( c * fiber . Ctx ) error {
var loginForm struct {
Username string ` form:"username" `
Password string ` form:"password" `
}
if err := c . BodyParser ( & loginForm ) ; err != nil {
return err
}
token , err := s . auth . Login ( loginForm . Username , loginForm . Password )
if err != nil {
return err
}
c . Cookie ( & fiber . Cookie {
Name : "sid" ,
Value : token ,
Path : "/" ,
Expires : time . Now ( ) . Add ( 3 * 24 * time . Hour ) ,
} )
return c . Redirect ( "/" )
} )
api . Post ( "/logout" , func ( c * fiber . Ctx ) error {
c . Cookie ( & fiber . Cookie {
Name : "sid" ,
Value : "" ,
Path : "/" ,
Expires : time . Now ( ) ,
} )
return c . SendString ( "ok" )
} )
api . Post ( "/register" , func ( c * fiber . Ctx ) error {
var loginForm struct {
Username string ` form:"username" `
Password string ` form:"password" `
Password2 string ` form:"password2" `
}
if err := c . BodyParser ( & loginForm ) ; err != nil {
return err
}
if err := util . ValidateUsername ( loginForm . Username ) ; err != nil {
return err
}
if err := util . ValidatePasswords ( loginForm . Password , loginForm . Password2 ) ; err != nil {
return err
}
if err := s . auth . Register ( loginForm . Username , loginForm . Password ) ; err != nil {
return err
}
return c . Redirect ( "/login" )
} )
api . Post ( "/crea-partita" , s . requireLogged , func ( c * fiber . Ctx ) error {
user := requestUser ( c )
var form struct {
NumGiocatori string ` form:"numero-giocatori" `
NumLupi string ` form:"numero-lupi" `
NumFattucchiere string ` form:"numero-fattucchiere" `
NumGuardie string ` form:"numero-guardie" `
NumCacciatori string ` form:"numero-cacciatori" `
NumMedium string ` form:"numero-medium" `
NumVeggenti string ` form:"numero-veggenti" `
}
if err := c . BodyParser ( & form ) ; err != nil {
return err
}
cfg := model . PartitaConfig {
NumeroPerRuolo : map [ string ] int { } ,
}
if err := util . AtoiInto ( form . NumGiocatori , & cfg . NumeroGiocatori ) ; err != nil {
return err
}
// Questo codice magico scorre su questa "tabella" con colonne ruolo e stringa del ruolo nel form e popola la mappa NumeroPerRuolo da uid ruolo a numero per ruolo.
for _ , r := range [ ] struct {
ruolo lupus . Ruolo
num string
} {
{ lupus . Lupo , form . NumLupi } ,
{ lupus . Fattucchiera , form . NumFattucchiere } ,
{ lupus . Guardia , form . NumGuardie } ,
{ lupus . Cacciatore , form . NumCacciatori } ,
{ lupus . Medium , form . NumMedium } ,
{ lupus . Veggente , form . NumVeggenti } ,
} {
num , err := strconv . Atoi ( r . num )
if err != nil {
return err
}
cfg . NumeroPerRuolo [ r . ruolo . Uid ] = num
}
partita , err := s . db . CreatePartita ( user . Username , cfg )
if err != nil {
return err
}
return c . JSON ( partita )
} )
api . Get ( "/user" , s . requireLogged , func ( c * fiber . Ctx ) error {
return c . JSON ( requestUser ( c ) . PublicUser ( ) )
} )
api . Get ( "/partita/:partita/players" , func ( c * fiber . Ctx ) error {
partitaUid := c . Params ( "partita" )
partita , err := s . db . GetPartita ( partitaUid )
if err != nil {
return err
}
return c . JSON ( partita . Players )
} )
api . Get ( "/partita/:partita/join-partita" , s . requireLogged , func ( c * fiber . Ctx ) error {
user := requestUser ( c )
partitaUid := c . Params ( "partita" )
partita , err := s . db . GetPartita ( partitaUid )
if err != nil {
return err
}
partita . Players = append ( partita . Players , user . Username )
if err := s . db . UpdatePartita ( partita ) ; err != nil {
return err
}
s . eventBus . Dispatch ( database . OnPartitaPlayersChange ( partitaUid ) , partita . Players )
return c . SendString ( "ok" )
} )
}