GoWeb/main.go

90 lines
2.2 KiB
Go
Raw Normal View History

2022-10-20 16:58:21 +00:00
package main
import (
"GoWeb/app"
"GoWeb/config"
"GoWeb/database"
"GoWeb/models"
2022-10-20 16:58:21 +00:00
"GoWeb/routes"
"context"
"embed"
2022-10-20 16:58:21 +00:00
"log"
"net/http"
"os"
"os/signal"
"syscall"
2022-12-05 00:04:24 +00:00
"time"
2022-10-20 16:58:21 +00:00
)
//go:embed templates static
var res embed.FS
2022-10-20 16:58:21 +00:00
func main() {
// Create instance of App
2022-12-05 00:04:24 +00:00
appLoaded := app.App{}
2022-10-20 16:58:21 +00:00
// Load config file to application
2022-12-05 00:04:24 +00:00
appLoaded.Config = config.LoadConfig()
2022-10-20 16:58:21 +00:00
// Load templates
appLoaded.Res = &res
// Create logs directory if it doesn't exist
if _, err := os.Stat("logs"); os.IsNotExist(err) {
2022-12-05 00:04:24 +00:00
err := os.Mkdir("logs", 0755)
if err != nil {
log.Println("Failed to create log directory")
log.Println(err)
return
2022-12-05 00:04:24 +00:00
}
}
// Create log file and set output
file, err := os.OpenFile("logs/"+time.Now().Format("2006-01-02")+".log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
2022-12-05 00:04:24 +00:00
log.SetOutput(file)
2022-10-20 16:58:21 +00:00
// Connect to database and run migrations
appLoaded.Db = database.Connect(&appLoaded)
if appLoaded.Config.Db.AutoMigrate {
err = models.RunAllMigrations(&appLoaded)
if err != nil {
log.Println(err)
return
}
}
2022-10-20 16:58:21 +00:00
// Assign and run scheduled tasks
appLoaded.ScheduledTasks = app.Scheduled{
EveryReboot: []func(app *app.App){models.ScheduledSessionCleanup},
EveryMinute: []func(app *app.App){models.ScheduledSessionCleanup},
}
2022-10-20 16:58:21 +00:00
// Define Routes
routes.Get(&appLoaded)
routes.Post(&appLoaded)
2022-10-20 16:58:21 +00:00
// Start server
server := &http.Server{Addr: appLoaded.Config.Listen.Ip + ":" + appLoaded.Config.Listen.Port}
go func() {
log.Println("Starting server and listening on " + appLoaded.Config.Listen.Ip + ":" + appLoaded.Config.Listen.Port)
err := server.ListenAndServe()
if err != nil && err != http.ErrServerClosed {
log.Fatalf("Could not listen on %s: %v\n", appLoaded.Config.Listen.Ip+":"+appLoaded.Config.Listen.Port, err)
}
}()
// Wait for interrupt signal and shut down the server
interrupt := make(chan os.Signal, 1)
signal.Notify(interrupt, os.Interrupt, syscall.SIGTERM)
stop := make(chan struct{})
go app.RunScheduledTasks(&appLoaded, 100, stop)
2023-04-06 17:01:29 +00:00
<-interrupt
log.Println("Interrupt signal received. Shutting down server...")
err = server.Shutdown(context.Background())
2022-10-20 16:58:21 +00:00
if err != nil {
log.Fatalf("Could not gracefully shutdown the server: %v\n", err)
2022-10-20 16:58:21 +00:00
}
}