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