gitlab.com/picnic-app/backend/role-api@v0.0.0-20230614140944-06a76ff3696d/cmd/main.go (about)

     1  package main
     2  
     3  import (
     4  	"context"
     5  	"log"
     6  	"os"
     7  	"syscall"
     8  	"time"
     9  
    10  	"gitlab.com/picnic-app/backend/libs/golang/config"
    11  	"gitlab.com/picnic-app/backend/libs/golang/core"
    12  	"gitlab.com/picnic-app/backend/libs/golang/core/mw"
    13  	"gitlab.com/picnic-app/backend/libs/golang/graceful"
    14  	"gitlab.com/picnic-app/backend/libs/golang/logger"
    15  	"gitlab.com/picnic-app/backend/libs/golang/monitoring/monitoring"
    16  	"gitlab.com/picnic-app/backend/libs/golang/monitoring/tracing"
    17  	"gitlab.com/picnic-app/backend/role-api/internal/controller"
    18  	"gitlab.com/picnic-app/backend/role-api/internal/repo/spanner"
    19  	"gitlab.com/picnic-app/backend/role-api/internal/service"
    20  )
    21  
    22  func main() {
    23  	ctx, cancel := context.WithCancel(context.Background())
    24  	defer cancel()
    25  
    26  	err := config.Load(ctx)
    27  	if err != nil {
    28  		logger.Fatal(ctx, err)
    29  	}
    30  
    31  	logger.InitWithString(config.LogLevel())
    32  
    33  	err = tracing.SetupExporter(ctx)
    34  	if err != nil {
    35  		logger.Errorf(ctx, "failed to set up tracing exporter: %v", err)
    36  	}
    37  
    38  	monitoring.RegisterPrometheusSuffix()
    39  
    40  	app, err := core.InitApp(ctx)
    41  	if err != nil {
    42  		log.Fatal(err)
    43  	}
    44  	app.WithMW(mw.NewServerContextInterceptor(config.String("env.auth.secret")))
    45  
    46  	debugSrv, err := app.RunDebug(ctx)
    47  	if err != nil {
    48  		logger.Fatalf(ctx, "failed to start debug server: %v", err)
    49  	}
    50  
    51  	ctrl, cleanup, err := initController(ctx, app.Config())
    52  	if err != nil {
    53  		logger.Fatalf(ctx, "failed to init controller: %v", err)
    54  	}
    55  	defer cleanup()
    56  
    57  	gracefulShutdown := graceful.New(
    58  		&graceful.ShutdownManagerOptions{Timeout: 60 * time.Second},
    59  		graceful.Parallel(
    60  			&graceful.ParallelShutdownOptions{
    61  				Name:    "servers",
    62  				Timeout: 30 * time.Second,
    63  			},
    64  			graceful.ShutdownErrorFunc(func() error {
    65  				app.Close()
    66  				return nil
    67  			}),
    68  			graceful.HTTPServer(debugSrv),
    69  		),
    70  		graceful.Context(cancel),
    71  		graceful.Parallel(
    72  			&graceful.ParallelShutdownOptions{
    73  				Name:    "clients",
    74  				Timeout: 30 * time.Second,
    75  			},
    76  			graceful.ShutdownErrorFunc(func() error {
    77  				cleanup()
    78  				return nil
    79  			}),
    80  			graceful.Tracer(),
    81  		),
    82  		graceful.Logger(nil),
    83  	)
    84  	gracefulShutdown.RegisterSignals(os.Interrupt, syscall.SIGTERM)
    85  	defer func() {
    86  		_ = gracefulShutdown.Shutdown(context.Background())
    87  	}()
    88  
    89  	err = app.Run(ctx, ctrl)
    90  	if err != nil {
    91  		logger.Fatal(ctx, err)
    92  	}
    93  
    94  	logger.Info(ctx, "gRPC server closed gracefully")
    95  }
    96  
    97  func initController(ctx context.Context, cfg config.Config) (controller.Controller, func(), error) {
    98  	repo, err := spanner.NewRepo(ctx, cfg.Spanner)
    99  	if err != nil {
   100  		return controller.Controller{}, nil, err
   101  	}
   102  
   103  	svc := service.New(repo)
   104  
   105  	return controller.New(svc), func() {
   106  		repo.Close()
   107  	}, nil
   108  }