Add gRPC server implementation and database integration for marketplace and products

This commit is contained in:
2025-05-27 03:41:52 +03:00
parent 008f3df42d
commit b083cccc09
44 changed files with 2182 additions and 1201 deletions

View File

@@ -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)
//}