lms-backend/main.go

114 lines
2.7 KiB
Go

package main
import (
"fmt"
"os"
"time"
"git.ex.umbach.dev/Alex/roese-utils/rsconfig"
"git.ex.umbach.dev/Alex/roese-utils/rslogger"
"git.ex.umbach.dev/LMS/libcore/models"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/cors"
"github.com/gofiber/websocket/v2"
"lms.de/backend/modules/config"
"lms.de/backend/modules/database"
"lms.de/backend/modules/logger"
"lms.de/backend/modules/permissions"
"lms.de/backend/modules/utils"
"lms.de/backend/routers/router"
"lms.de/backend/socketserver"
)
func init() {
fmt.Println("Server is starting...")
rsconfig.CreateEnvConfigFileIfNotExists(`DEBUG=false
COLORIZED_OUTPUT=true
HOST=127.0.0.1
PORT=8080
LOG_MANAGER_SERVER_URL=http://localhost:50110
# Folder paths
FOLDER_PUBLIC_STATIC=./public/
# MariaDB
MARIADB_HOSTNAME=127.0.0.1
MARIADB_PORT=3306
MARIADB_USERNAME=db_user
MARIADB_PASSWORD=db_password
MARIADB_DATABASE_NAME=db_database_name`)
config.LoadConfig()
rslogger.InitLogger(config.Cfg.Debug, config.Cfg.ColorizedOutput, config.Cfg.LogManagerServerUrl)
if os.Getenv("DOCKER") != "" {
fmt.Println("Waiting for mariadb docker")
// waiting for the start of mariadb docker
time.Sleep(10 * time.Second)
}
utils.ValidatorInit()
database.InitDatabase()
permissions.InitPermissions()
}
func main() {
app := fiber.New(fiber.Config{
BodyLimit: 100 * 1024 * 1024,
})
app.Use(cors.New())
router.SetupRoutes(app)
app.Use("/ws", func(c *fiber.Ctx) error {
// IsWebSocketUpgrade returns true if the client
// requested upgrade to the WebSocket protocol.
if websocket.IsWebSocketUpgrade(c) {
sessionId := c.Query("auth")
// needed for a user who uses multiple tabs in the browser
// with the same session id because otherwise the last browser
// tab would subscribe to the topic and the other tabs would
// not receive any messages
browserTabSession := c.Query("bts")
if len(sessionId) != utils.LenHeaderXAuthorization ||
len(browserTabSession) != utils.LenHeaderXAuthorization {
return c.SendStatus(fiber.StatusUnauthorized)
}
// validate ws session
var userSession models.UserSession
database.DB.Select("user_id").First(&userSession, "session = ?", sessionId)
if userSession.UserId != "" {
var user models.User
database.DB.First(&user, "id = ?", userSession.UserId)
if user.Id != "" {
c.Locals("sessionId", sessionId)
c.Locals("browserTabSession", browserTabSession)
c.Locals("userId", user.Id)
c.Locals("organizationId", user.OrganizationId)
}
}
return c.Next()
}
return fiber.ErrUpgradeRequired
})
go socketserver.RunHub()
socketserver.WebSocketServer(app)
logger.AddSystemLog(rslogger.LogTypeInfo, "Server started")
app.Listen(config.Cfg.Host + ":" + config.Cfg.Port)
}