99
1010 "github.com/opencars/schema/client"
1111 "github.com/opencars/seedwork/logger"
12+ "golang.org/x/sync/errgroup"
1213
14+ "github.com/opencars/vin-decoder-api/pkg/api/grpc"
1315 "github.com/opencars/vin-decoder-api/pkg/api/http"
1416 "github.com/opencars/vin-decoder-api/pkg/config"
1517 "github.com/opencars/vin-decoder-api/pkg/domain/service"
@@ -18,7 +20,8 @@ import (
1820
1921func main () {
2022 cfg := flag .String ("config" , "config/config.yaml" , "Path to the configuration file" )
21- port := flag .Int ("port" , 8080 , "Port of the server" )
23+ httpPort := flag .Int ("http-port" , 8080 , "Port for HTTP server" )
24+ grpcPort := flag .Int ("grpc-port" , 3000 , "Port for gRPC server" )
2225
2326 flag .Parse ()
2427
@@ -29,6 +32,13 @@ func main() {
2932
3033 logger .NewLogger (logger .LogLevel (conf .Log .Level ), conf .Log .Mode == "dev" )
3134
35+ // Initialize store
36+ store , err := sqlstore .New (& conf .DB )
37+ if err != nil {
38+ logger .Fatalf ("store: %v" , err )
39+ }
40+
41+ // Initialize NATS client
3242 c , err := client .New (conf .NATS .Address ())
3343 if err != nil {
3444 logger .Fatalf ("nats: %v" , err )
@@ -39,20 +49,36 @@ func main() {
3949 logger .Fatalf ("producer: %v" , err )
4050 }
4151
42- store , err := sqlstore .New (& conf .DB )
43- if err != nil {
44- logger .Fatalf ("store: %v" , err )
45- }
46-
47- svc := service .NewCustomerService (store .Manufacturer (), producer )
48-
49- addr := ":" + strconv .Itoa (* port )
52+ // Create services
53+ customerSvc := service .NewCustomerService (store .Manufacturer (), producer )
54+ internalSvc := service .NewInternalService (store .Manufacturer ())
5055
56+ // Create context with cancellation
5157 ctx , stop := signal .NotifyContext (context .Background (), syscall .SIGINT , syscall .SIGTERM )
5258 defer stop ()
5359
54- logger .Infof ("Listening on %s..." , addr )
55- if err := http .Start (ctx , addr , & conf .Server , svc ); err != nil {
56- logger .Fatalf ("http server failed: %v" , err )
60+ // Create errgroup with cancellation
61+ g , ctx := errgroup .WithContext (ctx )
62+
63+ // Start HTTP server
64+ g .Go (func () error {
65+ addr := ":" + strconv .Itoa (* httpPort )
66+ logger .Infof ("Starting HTTP server on %s..." , addr )
67+ return http .Start (ctx , addr , & conf .Server , customerSvc )
68+ })
69+
70+ // Start gRPC server
71+ g .Go (func () error {
72+ addr := ":" + strconv .Itoa (* grpcPort )
73+ logger .Infof ("Starting gRPC server on %s..." , addr )
74+ api := grpc .New (addr , internalSvc )
75+ return api .Run (ctx )
76+ })
77+
78+ // Wait for interrupt signal or error from servers
79+ logger .Infof ("Servers started successfully. Press Ctrl+C to stop..." )
80+ if err := g .Wait (); err != nil {
81+ logger .Fatalf ("Server error: %v" , err )
5782 }
83+ logger .Infof ("Servers stopped gracefully" )
5884}
0 commit comments