From ffaaf6d094f02f29fbbceb3bbdd9b04d91d287de Mon Sep 17 00:00:00 2001 From: Florian Hansen Date: Mon, 5 Aug 2024 01:10:29 +0200 Subject: [PATCH] refactor: remove unnecessary api package --- cmd/server/main.go | 46 +++++++++++++++------- internal/api/api.go | 51 ------------------------- internal/api/http.go | 30 --------------- internal/api/log.go | 7 ---- internal/api/migration.go | 7 ---- internal/api/net.go | 35 ----------------- internal/api/option.go | 17 --------- internal/server/feature/service.go | 5 +-- internal/server/feature/service_test.go | 6 ++- 9 files changed, 39 insertions(+), 165 deletions(-) delete mode 100644 internal/api/api.go delete mode 100644 internal/api/http.go delete mode 100644 internal/api/log.go delete mode 100644 internal/api/migration.go delete mode 100644 internal/api/net.go delete mode 100644 internal/api/option.go diff --git a/cmd/server/main.go b/cmd/server/main.go index 02a6536..df09f01 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -4,12 +4,14 @@ import ( "database/sql" "flag" "log" + "net" + "net/http" "path" - "github.com/flohansen/dasher/internal/api" "github.com/flohansen/dasher/internal/repository" "github.com/flohansen/dasher/internal/routes" "github.com/flohansen/dasher/internal/server/feature" + "github.com/flohansen/dasher/pkg/proto" "github.com/pkg/errors" "google.golang.org/grpc" @@ -28,20 +30,38 @@ func run() error { return errors.Wrap(err, "sql open") } - grpcServer := grpc.NewServer() - store := repository.NewFeatureSQLite(db) - notifier := feature.NewService(grpcServer, store) migrator := repository.NewSQLiteMigrator(db) - routes := routes.New(store, notifier) - - return api.New( - api.WithLogging(), - api.WithMigrator(migrator), - api.WithHttpHandler(":3000", routes), - api.WithNetListenerServer(":50051", grpcServer), - ).Start() + if err := migrator.Migrate(); err != nil { + return errors.Wrap(err, "migrate") + } + + store := repository.NewFeatureSQLite(db) + featureService := feature.NewService(store) + errs := make(chan error, 1) + + go startGrpcServer(featureService, errs) + go startHttpServer(store, featureService, errs) + return <-errs +} + +func startGrpcServer(featureService *feature.Service, errs chan error) { + grpcServer := grpc.NewServer() + proto.RegisterFeatureStateServiceServer(grpcServer, featureService) + + lis, err := net.Listen("tcp", ":50051") + if err != nil { + errs <- err + return + } + + errs <- grpcServer.Serve(lis) +} + +func startHttpServer(store *repository.FeatureSQLite, featureService *feature.Service, errs chan error) { + routes := routes.New(store, featureService) + errs <- http.ListenAndServe(":3000", routes) } func main() { - log.Fatal(run()) + log.Fatalf("fatal error: %s", run()) } diff --git a/internal/api/api.go b/internal/api/api.go deleted file mode 100644 index f7482ea..0000000 --- a/internal/api/api.go +++ /dev/null @@ -1,51 +0,0 @@ -package api - -import ( - "log" -) - -type Migrator interface { - Migrate() error -} - -type Server interface { - Serve() error - Addr() string -} - -type Api struct { - loggingEnabled bool - migrator Migrator - servers []Server -} - -func New(opts ...ApiOption) *Api { - api := Api{} - for _, opt := range opts { - opt.apply(&api) - } - return &api -} - -func (api *Api) Start() error { - if api.migrator != nil { - if err := api.migrator.Migrate(); err != nil { - return err - } - } - - errs := make(chan error) - for _, server := range api.servers { - if api.loggingEnabled { - log.Printf("start serving at %s", server.Addr()) - } - - go func(server Server) { - if err := server.Serve(); err != nil { - errs <- err - } - }(server) - } - - return <-errs -} diff --git a/internal/api/http.go b/internal/api/http.go deleted file mode 100644 index c0af26a..0000000 --- a/internal/api/http.go +++ /dev/null @@ -1,30 +0,0 @@ -package api - -import "net/http" - -type HttpServer interface { - ServeHTTP(http.ResponseWriter, *http.Request) -} - -func WithHttpHandler(addr string, handler HttpServer) ApiOption { - return newFuncApiOption(func(a *Api) { - a.servers = append(a.servers, newHttpServer(addr, handler)) - }) -} - -func newHttpServer(addr string, handler HttpServer) *httpServer { - return &httpServer{addr, handler} -} - -type httpServer struct { - addr string - handler HttpServer -} - -func (server *httpServer) Serve() error { - return http.ListenAndServe(server.addr, server.handler) -} - -func (server *httpServer) Addr() string { - return server.addr -} diff --git a/internal/api/log.go b/internal/api/log.go deleted file mode 100644 index ab9be8f..0000000 --- a/internal/api/log.go +++ /dev/null @@ -1,7 +0,0 @@ -package api - -func WithLogging() ApiOption { - return newFuncApiOption(func(a *Api) { - a.loggingEnabled = true - }) -} diff --git a/internal/api/migration.go b/internal/api/migration.go deleted file mode 100644 index 7daf06b..0000000 --- a/internal/api/migration.go +++ /dev/null @@ -1,7 +0,0 @@ -package api - -func WithMigrator(migrator Migrator) ApiOption { - return newFuncApiOption(func(a *Api) { - a.migrator = migrator - }) -} diff --git a/internal/api/net.go b/internal/api/net.go deleted file mode 100644 index b294922..0000000 --- a/internal/api/net.go +++ /dev/null @@ -1,35 +0,0 @@ -package api - -import "net" - -type NetListenerServer interface { - Serve(net.Listener) error -} - -func WithNetListenerServer(addr string, handler NetListenerServer) ApiOption { - return newFuncApiOption(func(a *Api) { - a.servers = append(a.servers, newNetListenerServer(addr, handler)) - }) -} - -func newNetListenerServer(addr string, s NetListenerServer) *netListenerServer { - return &netListenerServer{addr, s} -} - -type netListenerServer struct { - addr string - s NetListenerServer -} - -func (server *netListenerServer) Serve() error { - lis, err := net.Listen("tcp", server.addr) - if err != nil { - return err - } - - return server.s.Serve(lis) -} - -func (server *netListenerServer) Addr() string { - return server.addr -} diff --git a/internal/api/option.go b/internal/api/option.go deleted file mode 100644 index 94668bb..0000000 --- a/internal/api/option.go +++ /dev/null @@ -1,17 +0,0 @@ -package api - -type ApiOption interface { - apply(*Api) -} - -type funcApiOption struct { - f func(*Api) -} - -func newFuncApiOption(f func(*Api)) *funcApiOption { - return &funcApiOption{f} -} - -func (o *funcApiOption) apply(api *Api) { - o.f(api) -} diff --git a/internal/server/feature/service.go b/internal/server/feature/service.go index 0dca16c..131ed9e 100644 --- a/internal/server/feature/service.go +++ b/internal/server/feature/service.go @@ -10,7 +10,6 @@ import ( "github.com/flohansen/dasher/internal/sqlc" "github.com/flohansen/dasher/pkg/proto" "github.com/pkg/errors" - "google.golang.org/grpc" ) type FeatureStore interface { @@ -25,12 +24,12 @@ type Service struct { mu sync.Mutex } -func NewService(grpcServer grpc.ServiceRegistrar, store FeatureStore) *Service { +func NewService(store FeatureStore) *Service { notifier := Service{ subscriptions: make(map[string]map[proto.FeatureStateService_SubscribeFeatureChangesServer]struct{}), store: store, } - proto.RegisterFeatureStateServiceServer(grpcServer, ¬ifier) + return ¬ifier } diff --git a/internal/server/feature/service_test.go b/internal/server/feature/service_test.go index 6ae3791..fe85770 100644 --- a/internal/server/feature/service_test.go +++ b/internal/server/feature/service_test.go @@ -26,8 +26,10 @@ func TestService(t *testing.T) { ctrl := gomock.NewController(t) store := mocks.NewMockFeatureStore(ctrl) lis := bufconn.Listen(2048) + s := grpc.NewServer() - notifier := NewService(s, store) + svc := NewService(store) + proto.RegisterFeatureStateServiceServer(s, svc) go func() { s.Serve(lis) @@ -75,7 +77,7 @@ func TestService(t *testing.T) { // when time.Sleep(10 * time.Millisecond) // workaround to wait until both clients subscribed - notifier.Notify(sqlc.Feature{FeatureID: "SOME_FEATURE_ID"}) + svc.Notify(sqlc.Feature{FeatureID: "SOME_FEATURE_ID"}) // then feature1, err := stream1.Recv()