Add gRPC server implementation and database integration for marketplace and products
This commit is contained in:
		@@ -1,118 +1,105 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	adapters2 "Sipro-Marketplaces/internal/test/adapters"
 | 
			
		||||
	"context"
 | 
			
		||||
	"database/sql"
 | 
			
		||||
	"github.com/carlmjohnson/requests"
 | 
			
		||||
	"log"
 | 
			
		||||
	"os"
 | 
			
		||||
	"os/signal"
 | 
			
		||||
	"sync"
 | 
			
		||||
	"syscall"
 | 
			
		||||
 | 
			
		||||
	"Sipro-Marketplaces/internal/config"
 | 
			
		||||
	"Sipro-Marketplaces/internal/db"
 | 
			
		||||
	"github.com/gofiber/fiber/v2"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"github.com/jackc/pgx/v5"
 | 
			
		||||
	"github.com/joho/godotenv"
 | 
			
		||||
	"google.golang.org/grpc"
 | 
			
		||||
	"net"
 | 
			
		||||
	"os"
 | 
			
		||||
	"sipro-mps/internal/marketplace"
 | 
			
		||||
	ozon "sipro-mps/internal/ozon/products"
 | 
			
		||||
	"sipro-mps/internal/redis"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type Server struct {
 | 
			
		||||
	httpApp    *fiber.App
 | 
			
		||||
	grpcServer *grpc.Server
 | 
			
		||||
	db         *sql.DB
 | 
			
		||||
func logMessage(level string, format string, a ...interface{}) {
 | 
			
		||||
	const (
 | 
			
		||||
		green  = "\033[32m"
 | 
			
		||||
		red    = "\033[31m"
 | 
			
		||||
		yellow = "\033[33m"
 | 
			
		||||
		blue   = "\033[34m"
 | 
			
		||||
		reset  = "\033[0m"
 | 
			
		||||
	)
 | 
			
		||||
	switch level {
 | 
			
		||||
	case "info":
 | 
			
		||||
		fmt.Printf("%s✅ [INFO]%s %s %s\n", green, reset, fmt.Sprintf(format, a...), "ℹ️")
 | 
			
		||||
	case "error":
 | 
			
		||||
		fmt.Printf("%s❌ [ERROR]%s %s %s\n", red, reset, fmt.Sprintf(format, a...), "🚨")
 | 
			
		||||
	default:
 | 
			
		||||
		fmt.Printf("%s[LOG]%s %s\n", blue, reset, fmt.Sprintf(format, a...))
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewServer(cfg config.Config) (*Server, error) {
 | 
			
		||||
	dbConn, err := db.NewConnection(cfg.DB)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
func createGrpcServer() {
 | 
			
		||||
 | 
			
		||||
	httpApp := fiber.New()
 | 
			
		||||
	//adapters.RegisterHTTPRoutes(httpApp, testService)
 | 
			
		||||
	kal := httpApp.Group("/test")
 | 
			
		||||
	adapters2.RegisterRouter(&kal)
 | 
			
		||||
	lis, err := net.Listen("tcp", ":8080")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		fmt.Printf("failed to listen: %v\n", err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	grpcServer := grpc.NewServer()
 | 
			
		||||
 | 
			
		||||
	return &Server{
 | 
			
		||||
		httpApp:    httpApp,
 | 
			
		||||
		grpcServer: grpcServer,
 | 
			
		||||
		db:         dbConn,
 | 
			
		||||
	}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *Server) Start(cfg config.Config) error {
 | 
			
		||||
	var wg sync.WaitGroup
 | 
			
		||||
	ctx, cancel := context.WithCancel(context.Background())
 | 
			
		||||
	defer cancel()
 | 
			
		||||
 | 
			
		||||
	wg.Add(1)
 | 
			
		||||
	go func() {
 | 
			
		||||
		defer wg.Done()
 | 
			
		||||
		log.Printf("Starting HTTP server on %s", cfg.HTTP)
 | 
			
		||||
		if err := s.httpApp.Listen(cfg.HTTP); err != nil {
 | 
			
		||||
			log.Printf("HTTP server failed: %v", err)
 | 
			
		||||
			cancel()
 | 
			
		||||
		}
 | 
			
		||||
	}()
 | 
			
		||||
 | 
			
		||||
	wg.Add(1)
 | 
			
		||||
	go func() {
 | 
			
		||||
		defer wg.Done()
 | 
			
		||||
		log.Printf("Starting gRPC server on %s", cfg.GRPC)
 | 
			
		||||
	}()
 | 
			
		||||
 | 
			
		||||
	wg.Add(1)
 | 
			
		||||
 | 
			
		||||
	quit := make(chan os.Signal, 1)
 | 
			
		||||
	signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
 | 
			
		||||
	select {
 | 
			
		||||
	case <-quit:
 | 
			
		||||
		log.Println("Shutting down...")
 | 
			
		||||
	case <-ctx.Done():
 | 
			
		||||
		log.Println("Context cancelled, shutting down...")
 | 
			
		||||
	repo, err := marketplace.RegisterAdapterGRPC(grpcServer)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		fmt.Printf("failed to register gRPC server: %v\n", err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	_, err = ozon.RegisterAdapterGRPC(grpcServer, *repo)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		fmt.Printf("failed to register Ozon Products gRPC server: %v\n", err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	s.shutdown()
 | 
			
		||||
	wg.Wait()
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
	fmt.Println("gRPC server registered successfully.")
 | 
			
		||||
	// Start serving gRPC requests
 | 
			
		||||
	fmt.Println("gRPC server is starting on port 8080...")
 | 
			
		||||
 | 
			
		||||
func (s *Server) shutdown() {
 | 
			
		||||
	log.Println("Initiating graceful shutdown...")
 | 
			
		||||
	if err := s.httpApp.Shutdown(); err != nil {
 | 
			
		||||
		log.Printf("Failed to stop HTTP: %v", err)
 | 
			
		||||
	if err := grpcServer.Serve(lis); err != nil {
 | 
			
		||||
		fmt.Printf("failed to serve: %v\n", err)
 | 
			
		||||
	}
 | 
			
		||||
	s.grpcServer.GracefulStop()
 | 
			
		||||
	if err := s.db.Close(); err != nil {
 | 
			
		||||
		log.Printf("Failed to close DB: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
	log.Println("Shutdown complete")
 | 
			
		||||
	fmt.Println("gRPC server created.")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
	type post struct {
 | 
			
		||||
		Name     string  `json:"name"`
 | 
			
		||||
		Language string  `json:"language"`
 | 
			
		||||
		ID       string  `json:"id"`
 | 
			
		||||
		Bio      string  `json:"bio"`
 | 
			
		||||
		Version  float64 `json:"version"`
 | 
			
		||||
	}
 | 
			
		||||
	response := new([]post)
 | 
			
		||||
	err := requests.URL("https://microsoftedge.github.io/Demos/json-dummy-data/5MB-min.json").ToJSON(&response).Fetch(context.Background())
 | 
			
		||||
	// Initializing the dotenv file
 | 
			
		||||
	err := godotenv.Load()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Fatalf("Failed to fetch URL: %v", err)
 | 
			
		||||
		logMessage("error", "Error loading .env file: %v", err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	logMessage("info", "Dotenv file loaded successfully. 🌱")
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
	println(len(*response))
 | 
			
		||||
	return
 | 
			
		||||
	cfg := config.Load()
 | 
			
		||||
	server, err := NewServer(cfg)
 | 
			
		||||
	ctx := context.Background()
 | 
			
		||||
 | 
			
		||||
	// Initializing the Redis client
 | 
			
		||||
	err = redis.InitClient(ctx)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Fatalf("Failed to initialize server: %v", err)
 | 
			
		||||
		logMessage("error", "Failed to initialize Redis client: %v", err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	if err := server.Start(cfg); err != nil {
 | 
			
		||||
		log.Fatalf("Server failed: %v", err)
 | 
			
		||||
	defer redis.CloseClient()
 | 
			
		||||
	logMessage("info", "Redis client initialized successfully. 🟥")
 | 
			
		||||
 | 
			
		||||
	// Initializing pgx connection
 | 
			
		||||
	conn, err := pgx.Connect(ctx, os.Getenv("POSTGRES_URL"))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		logMessage("error", "Failed to connect to PostgreSQL: %v", err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	defer conn.Close(ctx)
 | 
			
		||||
	logMessage("info", "Connected to PostgreSQL successfully. 🐘")
 | 
			
		||||
	createGrpcServer()
 | 
			
		||||
	// ------------------ shitting
 | 
			
		||||
	//mpRepo := marketplace.NewDBRepository(conn)
 | 
			
		||||
	//
 | 
			
		||||
	//productsRepo := products.NewAPIRepository(
 | 
			
		||||
	//	mpRepo)
 | 
			
		||||
	//_, err = productsRepo.GetAllProducts(ctx, 262)
 | 
			
		||||
	//if err != nil {
 | 
			
		||||
	//	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//for _, item := range items {
 | 
			
		||||
//	//logMessage("info", "Product ID: %s, Name: %s, Price: %d", item.Price, item.Name, item.Price)
 | 
			
		||||
//}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user