Files
superherohub/cmd/hub/main.go

80 lines
1.9 KiB
Go

package main
import (
"fmt"
"github.com/eslider/superherohub/internal/router"
"github.com/eslider/superherohub/pkg/deesee/storage"
"github.com/eslider/superherohub/pkg/file"
"log"
"net/http"
"os"
"strconv"
"time"
)
// main is the entry point of the application
func main() {
var (
dataPath = "data/heros.json" // store to JSON file
port = 8080 // Port to serve
key = 5 // DeeSee encryption key
err error
)
// Create logger
logger := log.Default()
// Get port from environment variable
if os.Getenv("PORT") != "" {
port, err = strconv.Atoi(os.Getenv("PORT"))
if err != nil {
logger.Fatalf("Invalid port number: %s", err.Error())
}
if port < 1 || port > 65535 {
logger.Print("Port number must be between 1 and 65535")
logger.Fatalf("Invalid port number : %d", port)
}
}
// Get key from environment variable
if os.Getenv("KEY") != "" {
key, err = strconv.Atoi(os.Getenv("KEY"))
if err != nil {
logger.Fatalf("Invalid key: %s", err.Error())
}
}
// Get data path from environment variable
if os.Getenv("DATA_PATH") != "" {
dataPath = os.Getenv("DATA_PATH")
}
// Check if data path exists
if !file.IsExist(dataPath) {
logger.Fatalf("Invalid data path: %s", dataPath)
}
// Create DeeSee storage
s, err := storage.New(dataPath)
if err != nil {
logger.Fatalf("Invalid data format: %s", dataPath)
}
// Create a new server
srv := &http.Server{
Addr: fmt.Sprintf(":%d", port), // Define port and address to serve
Handler: router.New(s, key, logger).GetHandler(),
ErrorLog: logger,
ReadTimeout: 240 * time.Second, // Good practice: enforcing timeouts for serving.
WriteTimeout: 240 * time.Second, // Good practice: enforcing timeouts for serving.
}
// Log info
logger.Printf("Serving on port %d", port)
// Serve and handle error
if err := srv.ListenAndServe(); err != nil {
logger.Fatal(err)
}
}