aboutsummaryrefslogtreecommitdiff
path: root/backend/internal/server/server.go
diff options
context:
space:
mode:
Diffstat (limited to 'backend/internal/server/server.go')
-rw-r--r--backend/internal/server/server.go77
1 files changed, 77 insertions, 0 deletions
diff --git a/backend/internal/server/server.go b/backend/internal/server/server.go
new file mode 100644
index 0000000..c525cfd
--- /dev/null
+++ b/backend/internal/server/server.go
@@ -0,0 +1,77 @@
+package server
+
+import (
+ "context"
+ "fmt"
+ "log/slog"
+ "net"
+
+ "cloud.google.com/go/longrunning/autogen/longrunningpb"
+ spb "github.com/ansg191/ibd-trader-backend/api/gen/idb/stock/v1"
+ upb "github.com/ansg191/ibd-trader-backend/api/gen/idb/user/v1"
+ "github.com/ansg191/ibd-trader-backend/internal/database"
+ "github.com/ansg191/ibd-trader-backend/internal/ibd"
+ "github.com/ansg191/ibd-trader-backend/internal/keys"
+ "github.com/ansg191/ibd-trader-backend/internal/leader/manager/ibd/scrape"
+ "github.com/ansg191/ibd-trader-backend/internal/redis/taskqueue"
+ "github.com/ansg191/ibd-trader-backend/internal/server/idb/stock/v1"
+ "github.com/ansg191/ibd-trader-backend/internal/server/idb/user/v1"
+ "github.com/redis/go-redis/v9"
+ "google.golang.org/grpc"
+ "google.golang.org/grpc/reflection"
+)
+
+//go:generate make -C ../../api/ generate
+
+type Server struct {
+ s *grpc.Server
+ port uint16
+}
+
+func New(
+ ctx context.Context,
+ port uint16,
+ db database.TransactionExecutor,
+ rClient *redis.Client,
+ client *ibd.Client,
+ kms keys.KeyManagementService,
+ keyName string,
+) (*Server, error) {
+ scrapeQueue, err := taskqueue.New(
+ ctx,
+ rClient,
+ scrape.Queue,
+ "grpc-server",
+ taskqueue.WithEncoding[scrape.TaskInfo](scrape.QueueEncoding))
+ if err != nil {
+ return nil, err
+ }
+
+ s := grpc.NewServer()
+ upb.RegisterUserServiceServer(s, user.New(db, kms, keyName, client))
+ spb.RegisterStockServiceServer(s, stock.New(db, scrapeQueue))
+ longrunningpb.RegisterOperationsServer(s, newOperationServer(scrapeQueue))
+ reflection.Register(s)
+ return &Server{s, port}, nil
+}
+
+func (s *Server) Serve(ctx context.Context) error {
+ lis, err := net.Listen("tcp", fmt.Sprintf(":%d", s.port))
+ if err != nil {
+ return err
+ }
+
+ // Graceful shutdown
+ go func() {
+ <-ctx.Done()
+ slog.ErrorContext(ctx,
+ "Shutting down server",
+ "err", ctx.Err(),
+ "cause", context.Cause(ctx),
+ )
+ s.s.GracefulStop()
+ }()
+
+ slog.InfoContext(ctx, "Starting gRPC server", "port", s.port)
+ return s.s.Serve(lis)
+}