package cmds import ( "fmt" "git.itzana.me/strafesnet/maps-service/pkg/api" "git.itzana.me/strafesnet/maps-service/pkg/datastore/gormstore" "git.itzana.me/strafesnet/maps-service/pkg/service" log "github.com/sirupsen/logrus" "github.com/urfave/cli/v2" "net/http" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" "github.com/nats-io/nats.go" ) func NewServeCommand() *cli.Command { return &cli.Command{ Name: "serve", Usage: "Run maps service", Action: serve, Flags: []cli.Flag{ &cli.StringFlag{ Name: "pg-host", Usage: "Host of postgres database", EnvVars: []string{"PG_HOST"}, Required: true, }, &cli.IntFlag{ Name: "pg-port", Usage: "Port of postgres database", EnvVars: []string{"PG_PORT"}, Required: true, }, &cli.StringFlag{ Name: "pg-db", Usage: "Name of database to connect to", EnvVars: []string{"PG_DB"}, Required: true, }, &cli.StringFlag{ Name: "pg-user", Usage: "User to connect with", EnvVars: []string{"PG_USER"}, Required: true, }, &cli.StringFlag{ Name: "pg-password", Usage: "Password to connect with", EnvVars: []string{"PG_PASSWORD"}, Required: true, }, &cli.BoolFlag{ Name: "migrate", Usage: "Run database migrations", Value: true, EnvVars: []string{"MIGRATE"}, }, &cli.IntFlag{ Name: "port", Usage: "Port to listen on", Value: 8080, EnvVars: []string{"PORT"}, }, }, } } func serve(ctx *cli.Context) error { db, err := gormstore.New(ctx) if err != nil { log.WithError(err).Fatal("failed to connect database") } nc, err := nats.Connect("nats:4222") if err != nil { log.WithError(err).Fatal("failed to connect nats") } svc := &service.Service{ DB: db, Nats: nc, } conn, err := grpc.Dial("auth-service:8090", grpc.WithTransportCredentials(insecure.NewCredentials())) if err != nil { log.Fatal(err) } sec := service.SecurityHandler{ Client: conn, } srv, err := api.NewServer(svc, sec, api.WithPathPrefix("/v1")) if err != nil { log.WithError(err).Fatal("failed to initialize api server") } return http.ListenAndServe(fmt.Sprintf(":%d", ctx.Int("port")), srv) }