package routes
import (
"encoding/json"
"log"
"strconv"
"time"
"github.com/aziis98/lupus-lite/auth"
"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 Api ( api fiber . Router ) {
db , err := database . NewInMemoryDB ( )
if err != nil {
log . Fatal ( err )
}
auth := auth . NewInMemoryAuthService ( db )
requireLogged := RequireLoggedMiddleware ( auth )
api . Get ( "/status" , func ( c * fiber . Ctx ) error {
s , err := json . MarshalIndent ( 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 := 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 := auth . Register ( loginForm . Username , loginForm . Password ) ; err != nil {
return err
}
return c . Redirect ( "/login" )
} )
api . Post ( "/crea-partita" , 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 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 := db . CreatePartita ( user . Username , cfg )
if err != nil {
return err
}
return c . JSON ( partita )
} )
api . Get ( "/user" , requireLogged , func ( c * fiber . Ctx ) error {
return c . JSON ( requestUser ( c ) . PublicUser ( ) )
} )
}