Files
memberApp/backend/main.go
2025-11-12 16:07:10 +01:00

221 lines
6.3 KiB
Go

package main
import (
"backend/env"
"backend/models"
"backend/server"
"backend/utils"
"flag"
"fmt"
"log"
"net/http"
"os"
"path/filepath"
"strings"
"time"
AccessHandler "gitea.tecamino.com/paadi/access-handler"
dbApi "gitea.tecamino.com/paadi/memberDB/api"
"gitea.tecamino.com/paadi/tecamino-dbm/cert"
"gitea.tecamino.com/paadi/tecamino-logger/logging"
"github.com/gin-contrib/cors"
"github.com/gin-gonic/gin"
)
func main() {
// set cli flage
envFile := flag.String("env", ".env", "enviroment file")
flag.Parse()
// load enviroment file if exists
if err := env.Load(*envFile); err != nil {
fmt.Println("no .env found path: ", *envFile)
}
devMode := env.InDevelopmentMode()
// set gin mode
if !devMode {
gin.SetMode(env.GinMode.GetValue())
}
workingDir := env.WorkingDir.GetValue()
spa := env.Spa.GetValue()
//change working directory only if value is given
if workingDir != "." && workingDir != "" {
os.Chdir(workingDir)
}
//set allowed origins
var allowOrigins models.StringSlice
if strings.Contains(env.DOMAIN.GetValue(), "http") {
allowOrigins.Set(env.DOMAIN.GetValue())
}
if env.AllowOrigin.GetValue() != "" {
allowOrigins.Set(env.AllowOrigin.GetValue())
}
wd, err := os.Getwd()
if err != nil {
log.Fatalf("Could not get working directory: %v", err)
}
folderName := filepath.Base(wd)
logFileName := folderName + ".log"
logger, err := logging.NewLogger(logFileName, &logging.Config{
MaxSize: 1,
MaxBackup: 3,
MaxAge: 28,
Debug: env.InDebugMode(),
TerminalOut: true,
})
if err != nil {
logger.Error("main new logger", err)
panic(err)
}
//new login manager
accessHandler, err := AccessHandler.NewAccessHandler(".", logger)
if err != nil {
logger.Error("main login manager", err)
panic(err)
}
// new server
s := server.NewServer()
// initiate Database handler
dbHandler, err := dbApi.NewAPIHandler(logger)
if err != nil {
logger.Error("main login manager", err)
panic(err)
}
//get local ip
httpString := "http://"
if env.Https.GetBoolValue() {
httpString = "https://"
}
allowOrigins = append(allowOrigins, httpString+"localhost:9000", httpString+"localhost:9500", httpString+"127.0.0.1:9000", httpString+"0.0.0.0:9500")
localIP, err := utils.GetLocalIP()
if err != nil {
logger.Error("main", fmt.Sprintf("get local ip : %s", err))
} else {
allowOrigins = append(allowOrigins, fmt.Sprintf("%s%s:9000", httpString, localIP), fmt.Sprintf("%s%s:9500", httpString, localIP))
}
fmt.Println(100, allowOrigins)
s.Routes.Use(cors.New(cors.Config{
AllowOrigins: allowOrigins,
//AllowOrigins: []string{"*"},
AllowMethods: []string{"POST", "GET", "DELETE", "OPTIONS"},
AllowHeaders: []string{"Origin", "Content-Type"},
ExposeHeaders: []string{"Content-Length"},
AllowCredentials: true,
MaxAge: 12 * time.Hour,
}))
//set logger for AuthMiddleware
accessHandler.SetMiddlewareLogger(s.Routes)
api := s.Routes.Group("/api")
//set routes
//public
api.GET("/logout", accessHandler.Logout)
api.GET("/login/me", accessHandler.Me)
api.POST("/login", accessHandler.Login)
//private
auth := api.Group("", accessHandler.AuthMiddleware())
role := auth.Group("", accessHandler.AuthorizeRole("/api"))
role.GET("/members", dbHandler.GetMember)
auth.GET("/events", dbHandler.GetEvent)
auth.GET("/users", accessHandler.GetUser)
auth.GET("/roles", accessHandler.GetRole)
auth.POST("database/open", dbHandler.OpenDatabase)
auth.POST("/members/add", dbHandler.AddNewMember)
auth.POST("/members/edit", dbHandler.UpdateMember)
auth.POST("/members/delete", dbHandler.DeleteMember)
auth.POST("/members/import/csv", dbHandler.ImportCSV)
auth.POST("/events/add", dbHandler.StartNewEvent)
auth.POST("/events/edit", dbHandler.UpdateEvent)
auth.POST("/events/add/attendees", dbHandler.AddNewAttendees)
auth.POST("/events/delete/attendees", dbHandler.DeleteAttendee)
auth.POST("/events/delete", dbHandler.DeleteEvent)
auth.GET("/responsible", dbHandler.GetResponsible)
auth.POST("/responsible/add", dbHandler.AddNewResponsible)
auth.POST("/responsible/delete", dbHandler.DeleteResponsible)
auth.POST("/roles/add", accessHandler.AddRole)
auth.POST("/roles/update", accessHandler.UpdateRole)
auth.POST("/roles/delete", accessHandler.DeleteRole)
auth.POST("/users/add", accessHandler.AddUser)
auth.POST("/users/update", accessHandler.UpdateUser)
auth.POST("/users/delete", accessHandler.DeleteUser)
api.POST("/login/refresh", accessHandler.Refresh)
// Serve static files
s.Routes.StaticFS("/assets", gin.Dir(filepath.Join(spa, "assets"), true))
s.Routes.NoRoute(func(c *gin.Context) {
// Disallow fallback for /api paths
if strings.HasPrefix(c.Request.URL.Path, "/api") {
c.JSON(http.StatusNotFound, models.NewJsonMessageResponse("API endpoint not found"))
return
}
// Try to serve file from SPA directory
filePath := filepath.Join(spa, c.Request.URL.Path)
if _, err := os.Stat(filePath); err == nil {
c.File(filePath)
return
}
// Fallback to index.html for SPA routing
c.File(filepath.Join(spa, "index.html"))
})
go func() {
time.Sleep(500 * time.Millisecond)
if err := utils.OpenBrowser(fmt.Sprintf("%slocalhost:%s", httpString, env.HostPort.GetValue()), logger); err != nil {
logger.Error("main", fmt.Sprintf("starting browser error : %s", err))
}
}()
if env.Https.GetBoolValue() {
if env.Fullchain.GetValue() == "" {
logger.Error("ssl certificate", "-cert flag not given for https server")
log.Fatal("-cert flag not given for https server")
}
if env.PrivKey.GetValue() == "" {
logger.Error("ssl key", "-chain flag not given for https server")
log.Fatal("-chain flag not given for https server")
}
// start https server
logger.Info("main", fmt.Sprintf("https listen on ip: %s port: %s", env.HostUrl.GetValue(), env.HostPort.GetValue()))
if err := s.ServeHttps(env.HostUrl.GetValue(), env.HostPort.GetUIntValue(), cert.Cert{Organization: env.Organization.GetValue(), CertFile: env.Fullchain.GetValue(), KeyFile: env.PrivKey.GetValue()}); err != nil {
logger.Error("main", "error https server "+err.Error())
}
return
}
// start http server
logger.Info("main", fmt.Sprintf("http listen on ip: %s port: %s", env.HostUrl.GetValue(), env.HostPort.GetValue()))
if err := s.ServeHttp(env.HostUrl.GetValue(), env.HostPort.GetUIntValue()); err != nil {
logger.Error("main", "error http server "+err.Error())
}
}