96 lines
2.0 KiB
Go
96 lines
2.0 KiB
Go
package main
|
|
|
|
import (
|
|
"flag"
|
|
"fmt"
|
|
"net"
|
|
"os"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/rs/zerolog"
|
|
"github.com/rs/zerolog/log"
|
|
"google.golang.org/grpc"
|
|
"gopkg.in/yaml.v2"
|
|
|
|
// My modules
|
|
"homelab.lan/music-agregator/internal"
|
|
"homelab.lan/music-agregator/internal/config"
|
|
"homelab.lan/music-agregator/internal/hello"
|
|
"homelab.lan/music-agregator/internal/indexer"
|
|
appRouter "homelab.lan/music-agregator/internal/router"
|
|
)
|
|
|
|
func main() {
|
|
log.Logger = zerolog.New(zerolog.ConsoleWriter{Out: os.Stderr}).
|
|
With().Timestamp().Logger()
|
|
|
|
configPath := flag.String("config", "", "Path to the config file")
|
|
flag.Parse()
|
|
|
|
cfg, err := parseConfig(configPath)
|
|
if err != nil {
|
|
log.Fatal().Err(err).Msg("Failed to load config")
|
|
}
|
|
log.Info().Interface("config", cfg).Msg("Loaded config")
|
|
|
|
// start the grpc in another thread to not block the next http start
|
|
go serveGrpc(*cfg)
|
|
|
|
serveHttp()
|
|
}
|
|
|
|
func serveHttp() {
|
|
router := gin.Default()
|
|
appRouter.SetupRoutes(router)
|
|
router.GET("/ping", func(c *gin.Context) {
|
|
c.JSON(200, gin.H{
|
|
"message": "pong",
|
|
})
|
|
})
|
|
router.Run()
|
|
}
|
|
|
|
func serveGrpc(config config.Config) {
|
|
var opts []grpc.ServerOption
|
|
server := grpc.NewServer(opts...)
|
|
|
|
indexerServer, err := indexer.NewIndexerServer(config)
|
|
if err != nil {
|
|
log.Fatal().Err(err).Msg("Failed to create IndexerServer")
|
|
}
|
|
|
|
services := []internal.Registrable{
|
|
hello.NewHelloServer(),
|
|
indexerServer,
|
|
}
|
|
|
|
for _, service := range services {
|
|
service.Register(server)
|
|
}
|
|
|
|
listener, err := net.Listen("tcp", fmt.Sprintf("%v:%v", config.App.Host, config.App.Port))
|
|
if err != nil {
|
|
log.Fatal().Err(err).Msg("Failed to listen on localhost:8081")
|
|
}
|
|
|
|
server.Serve(listener)
|
|
}
|
|
|
|
func parseConfig(path *string) (*config.Config, error) {
|
|
f, err := os.Open(*path)
|
|
if err != nil {
|
|
log.Error().Str("path", *path).Msg("Unable to opent config by path")
|
|
return nil, err
|
|
}
|
|
defer f.Close()
|
|
|
|
cfg := config.NewConfig()
|
|
decoder := yaml.NewDecoder(f)
|
|
err = decoder.Decode(&cfg)
|
|
if err != nil {
|
|
// processError(err)
|
|
}
|
|
|
|
return cfg, nil
|
|
}
|