Files
go-api-template/main.go

101 lines
3.1 KiB
Go
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package main
import (
"embed"
_ "embed"
"fmt"
"io/fs"
"log"
"net/http"
"os"
"github.com/asdine/storm/v3"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/basicauth"
"github.com/gofiber/fiber/v2/middleware/cors"
"github.com/gofiber/fiber/v2/middleware/filesystem"
"github.com/gofiber/fiber/v2/middleware/logger"
"github.com/rs/zerolog"
)
var (
//go:embed frontend/build
frontend embed.FS
)
type Server struct {
Config *Config
Database *storm.DB
WebServer *fiber.App
LogFile *os.File
Log zerolog.Logger
}
func main() {
server := Server{}
err := LoadConfig(&server)
if err != nil {
log.Fatal("Unable to setup config and logging: ", err)
}
fmt.Println("Server: ", server.Config)
app := fiber.New()
// Setup CORS
app.Use(cors.New(cors.Config{
AllowOrigins: "http://localhost:3000, http://localhost",
AllowHeaders: "Origin, Content-Type, Accept",
}))
// Setup our logger
app.Use(logger.New(logger.Config{
Output: server.LogFile,
TimeZone: server.Config.Timezone,
Format: `{"logtype":"webserver", "pid":"${pid}", "requestid":"${locals:requestid}", "status":"${status}", "method":"${method}", "path":"${path}"}` + "\n",
}))
server.WebServer = app
defer server.LogFile.Close() // Close out our logfile when closing server.
server.Database = SetupDatabase(&server) // Setup our database
defer server.Database.Close()
server.Log.Info().Msg("Database and Config loaded, starting webserver...") // Send all good message
// Loading in the frontend files that were embedded
reactFE, err := fs.Sub(frontend, "frontend/build")
if err != nil {
server.Log.Fatal().Msgf("Unable to load frontend/build: ", err)
}
staticFE, err := fs.Sub(frontend, "frontend/build/static")
if err != nil {
server.Log.Fatal().Msgf("Unable to load static files: ", err)
}
// serve our frontend and static files from our embed
server.WebServer.Use("/", filesystem.New(filesystem.Config{
Root: http.FS(reactFE),
}))
server.WebServer.Use("/static", filesystem.New(filesystem.Config{
Root: http.FS(staticFE),
PathPrefix: "static",
}))
// Load in our routes
server.WebServer.Get("/hello", func(c *fiber.Ctx) error { // Basic Hello Route
return c.SendString("GoInventorize Backend Hello Route!")
})
// Location Routes
server.WebServer.Get("/config", server.GetServerConfig)
// Setup our basic authentication if defined
if server.Config.Authentication.BasicAuth {
app.Use(basicauth.New(basicauth.Config{
Users: map[string]string{
server.Config.Authentication.UserName: server.Config.Authentication.Password,
},
}))
}
server.WebServer.Get("/locations", server.GetAllLocationsHandler)
server.WebServer.Post("/locations/new", server.AddNewLocationHandler)
server.WebServer.Delete("/locations/:locID", server.DeleteLocationHandler)
fmt.Println("Everything ready, starting server! ", fmt.Sprintf(":%s", server.Config.Server.Port))
server.WebServer.Listen(fmt.Sprintf(":%s", server.Config.Server.Port))
}