movier/server/cmd/serve.go

76 lines
1.9 KiB
Go

package cmd
import (
"context"
"fmt"
"log"
"net/http"
"github.com/aykhans/movier/server/pkg/config"
"github.com/aykhans/movier/server/pkg/handlers"
"github.com/aykhans/movier/server/pkg/storage/postgresql"
"github.com/aykhans/movier/server/pkg/storage/postgresql/repository"
"github.com/spf13/cobra"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
)
func getServeCmd() *cobra.Command {
serveCmd := &cobra.Command{
Use: "serve",
Short: "Movie Recommendation Serve",
Run: func(cmd *cobra.Command, args []string) {
err := runServe()
if err != nil {
log.Fatalln(err)
}
fmt.Println("Movie Recommendation Serve")
},
}
return serveCmd
}
func runServe() error {
dbURL, err := config.NewPostgresURL()
if err != nil {
return err
}
db, err := postgresql.NewDB(dbURL)
defer db.Close(context.Background())
if err != nil {
return err
}
imdbRepo := repository.NewIMDbRepository(db)
grpcRecommenderServiceTarget, err := config.NewRecommenderServiceGrpcTarget()
if err != nil {
return err
}
conn, err := grpc.NewClient(
grpcRecommenderServiceTarget,
grpc.WithTransportCredentials(insecure.NewCredentials()),
)
if err != nil {
log.Fatalf("did not connect to grpc recommender service: %v", err)
}
defer conn.Close()
router := http.NewServeMux()
imdbHandler := handlers.NewIMDbHandler(*imdbRepo, conn, config.GetBaseURL())
router.HandleFunc("GET /ping", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "text/plain")
w.WriteHeader(http.StatusOK)
w.Write([]byte("pong"))
})
router.HandleFunc("GET /", imdbHandler.HandlerHome)
router.HandleFunc("GET /recs", imdbHandler.HandlerGetRecommendations)
log.Printf("serving on port %d", config.ServePort)
err = http.ListenAndServe(fmt.Sprintf(":%d", config.ServePort), handlers.CORSMiddleware(router))
if err != nil {
return err
}
return nil
}