You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

156 lines
3.4 KiB
Go

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())
})
}