/* * This file is part of sdbapi * Copyright (C) 2022 Jonni Liljamo * * Licensed under GPL-3.0-only. * See LICENSE for licensing information. */ package main import ( "api/db" "api/handlers" "api/middlewares" "log" "os" "syscall" "github.com/gin-gonic/gin" ) func main() { // stores various errors during startup var err error err = setUlimits() if err != nil { log.Fatal("failed to set Ulimits") } dbConnectionString := os.Getenv("GORM_DB_STRING") if dbConnectionString == "" { log.Fatal("environment variable 'GORM_DB_STRING' is not set") } err = db.Connect(dbConnectionString) if err != nil { log.Fatal(err) } db.Migrate() log.Print("creating router and launching API") router := createRouter() router.Run(":3000") } func createRouter() *gin.Engine { router := gin.Default() api := router.Group("/api") { api.GET("/info", handlers.Info) user := api.Group("/user") { user.POST("/register", handlers.CreateUser) user.POST("/token", handlers.GenerateToken) user.GET("/:id", handlers.UserInfo) userp := user.Group("/_").Use(middlewares.Auth()) { userp.GET("/:id", handlers.UserInfoP) } } game := api.Group("/game").Use(middlewares.Auth()) { game.GET("/:id", handlers.GameInfo) game.GET("/all_forming", handlers.FormingGames) game.POST("/create", handlers.CreateGame) game.PATCH("/:id/state", handlers.PatchGameState) game.GET("/my_games", handlers.MyGames) game.POST("/:id/join", handlers.JoinGame) } } return router } // Set NOFILE limit to max, to allow more concurrent websocket connections func setUlimits() error { var rlimit syscall.Rlimit if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rlimit); err != nil { return err } rlimit.Cur = rlimit.Max return syscall.Setrlimit(syscall.RLIMIT_NOFILE, &rlimit) }