From 5be71f4e49334dfa2a9d33099837865dfc3b6fcd Mon Sep 17 00:00:00 2001 From: noobj Date: Tue, 24 Jan 2023 00:05:47 +0800 Subject: [PATCH 01/13] feat: DI apply lazy binding --- cmd/ahorro/login/main.go | 4 ++-- cmd/ahorro/refresh/main.go | 2 +- cmd/ahorro/sync/callback/main.go | 2 +- cmd/ahorro/sync/handler/main.go | 6 +++--- cmd/swimming/crowdscraper/main.go | 2 +- cmd/swimming/dailyfetch/main.go | 2 +- go.mod | 2 +- go.sum | 2 ++ 8 files changed, 12 insertions(+), 10 deletions(-) diff --git a/cmd/ahorro/login/main.go b/cmd/ahorro/login/main.go index 547d8e0..f8e7651 100644 --- a/cmd/ahorro/login/main.go +++ b/cmd/ahorro/login/main.go @@ -118,11 +118,11 @@ func Handler(ctx context.Context, request events.APIGatewayProxyRequest) (events func main() { userRepo := UserRepository.New() - container.NamedSingleton("UserRepo", func() repositories.IRepository { + container.NamedSingletonLazy("UserRepo", func() repositories.IRepository { return userRepo }) - container.NamedSingleton("LoginInfoRepo", func() repositories.IRepository { + container.NamedSingletonLazy("LoginInfoRepo", func() repositories.IRepository { return LoginInfoRepository.New() }) defer userRepo.Disconnect()() diff --git a/cmd/ahorro/refresh/main.go b/cmd/ahorro/refresh/main.go index 6ee84a4..48a03f8 100644 --- a/cmd/ahorro/refresh/main.go +++ b/cmd/ahorro/refresh/main.go @@ -86,7 +86,7 @@ func Handler(ctx context.Context, request events.APIGatewayV2HTTPRequest) (event func main() { repo := LoginInfoRepository.New() - container.NamedSingleton("LoginInfoRepo", func() repositories.IRepository { + container.NamedSingletonLazy("LoginInfoRepo", func() repositories.IRepository { return repo }) defer repo.Disconnect()() diff --git a/cmd/ahorro/sync/callback/main.go b/cmd/ahorro/sync/callback/main.go index 15097d0..619fdfa 100644 --- a/cmd/ahorro/sync/callback/main.go +++ b/cmd/ahorro/sync/callback/main.go @@ -94,7 +94,7 @@ func Handler(ctx context.Context, request events.APIGatewayV2HTTPRequest) (event func main() { userRepo := UserRepository.New() defer userRepo.Disconnect()() - container.NamedSingleton("UserRepo", func() repositories.IRepository { + container.NamedSingletonLazy("UserRepo", func() repositories.IRepository { return userRepo }) diff --git a/cmd/ahorro/sync/handler/main.go b/cmd/ahorro/sync/handler/main.go index 9325850..35a700a 100644 --- a/cmd/ahorro/sync/handler/main.go +++ b/cmd/ahorro/sync/handler/main.go @@ -239,15 +239,15 @@ func collateEntryItems(entryItems []EntryItem, cateIdMap map[string]primitive.Ob func main() { userRepo := UserRepository.New() defer userRepo.Disconnect()() - container.NamedSingleton("UserRepo", func() repositories.IRepository { + container.NamedSingletonLazy("UserRepo", func() repositories.IRepository { return userRepo }) - container.NamedSingleton("CategoryRepo", func() repositories.IRepository { + container.NamedSingletonLazy("CategoryRepo", func() repositories.IRepository { return CategoryRepository.New() }) - container.NamedSingleton("EntryRepo", func() repositories.IRepository { + container.NamedSingletonLazy("EntryRepo", func() repositories.IRepository { return AhorroRepository.New() }) diff --git a/cmd/swimming/crowdscraper/main.go b/cmd/swimming/crowdscraper/main.go index 1851485..0b2ff8d 100644 --- a/cmd/swimming/crowdscraper/main.go +++ b/cmd/swimming/crowdscraper/main.go @@ -52,7 +52,7 @@ func Handler(ctx context.Context) (events.APIGatewayProxyResponse, error) { func main() { entryRepo := EntryRepository.New() - container.Singleton(func() repositories.IRepository { + container.SingletonLazy(func() repositories.IRepository { return entryRepo }) diff --git a/cmd/swimming/dailyfetch/main.go b/cmd/swimming/dailyfetch/main.go index 4375a2f..c709da5 100644 --- a/cmd/swimming/dailyfetch/main.go +++ b/cmd/swimming/dailyfetch/main.go @@ -98,7 +98,7 @@ func Handler(ctx context.Context, request events.APIGatewayProxyRequest) (events func main() { entryRepo := EntryRepository.New() - container.Singleton(func() repositories.IRepository { + container.SingletonLazy(func() repositories.IRepository { return entryRepo }) defer entryRepo.Disconnect()() diff --git a/go.mod b/go.mod index a3fdbc5..0897dcd 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/gocolly/colly v1.2.0 github.com/golang-jwt/jwt v3.2.2+incompatible github.com/golang/mock v1.6.0 - github.com/golobby/container/v3 v3.2.1 + github.com/golobby/container/v3 v3.3.1 github.com/joho/godotenv v1.4.0 github.com/kelseyhightower/envconfig v1.4.0 github.com/mitchellh/mapstructure v1.5.0 diff --git a/go.sum b/go.sum index 4600776..6867048 100644 --- a/go.sum +++ b/go.sum @@ -154,6 +154,8 @@ github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golobby/container/v3 v3.2.1 h1:waIB8d4nSDwMaO7PvM6H+OCqAFEWyMuSPNN4Fwpv0Ok= github.com/golobby/container/v3 v3.2.1/go.mod h1:RDdKpnKpV1Of11PFBe7Dxc2C1k2KaLE4FD47FflAmj0= +github.com/golobby/container/v3 v3.3.1 h1:Y+QpwChmkz86tAKimvqc0qls8A4eYm/PhMqSEt/HTj4= +github.com/golobby/container/v3 v3.3.1/go.mod h1:RDdKpnKpV1Of11PFBe7Dxc2C1k2KaLE4FD47FflAmj0= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= From 79606c7e4f6794c0c5aa3ea247265e525011b5c0 Mon Sep 17 00:00:00 2001 From: noobj Date: Fri, 27 Jan 2023 23:56:49 +0800 Subject: [PATCH 02/13] refactor: change jwt_auth Auth func name to Handle --- cmd/ahorro/fetchentries/main.go | 2 +- cmd/ahorro/sync/callback/main.go | 2 +- cmd/ahorro/sync/checker/main.go | 2 +- cmd/ahorro/sync/receiver/main.go | 2 +- internal/middleware/jwt_auth/jwt_auth_middleware.go | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/cmd/ahorro/fetchentries/main.go b/cmd/ahorro/fetchentries/main.go index 67780f9..945a2a2 100644 --- a/cmd/ahorro/fetchentries/main.go +++ b/cmd/ahorro/fetchentries/main.go @@ -177,5 +177,5 @@ func main() { return entryRepo }) - lambda.Start(jwtMiddleWare.Auth(Handler)) + lambda.Start(jwtMiddleWare.Handle(Handler)) } diff --git a/cmd/ahorro/sync/callback/main.go b/cmd/ahorro/sync/callback/main.go index 619fdfa..f36e52d 100644 --- a/cmd/ahorro/sync/callback/main.go +++ b/cmd/ahorro/sync/callback/main.go @@ -98,5 +98,5 @@ func main() { return userRepo }) - lambda.Start(jwtMiddleWare.Auth(Handler)) + lambda.Start(jwtMiddleWare.Handle(Handler)) } diff --git a/cmd/ahorro/sync/checker/main.go b/cmd/ahorro/sync/checker/main.go index 7ed39ed..7a07728 100644 --- a/cmd/ahorro/sync/checker/main.go +++ b/cmd/ahorro/sync/checker/main.go @@ -65,5 +65,5 @@ func Handler(ctx context.Context, request events.APIGatewayV2HTTPRequest) (event } func main() { - lambda.Start(jwtMiddleWare.Auth(Handler)) + lambda.Start(jwtMiddleWare.Handle(Handler)) } diff --git a/cmd/ahorro/sync/receiver/main.go b/cmd/ahorro/sync/receiver/main.go index cc9fc8d..5f1d9a6 100644 --- a/cmd/ahorro/sync/receiver/main.go +++ b/cmd/ahorro/sync/receiver/main.go @@ -86,5 +86,5 @@ func Handler(ctx context.Context, request events.APIGatewayV2HTTPRequest) (event } func main() { - lambda.Start(jwtMiddleWare.Auth(Handler)) + lambda.Start(jwtMiddleWare.Handle(Handler)) } diff --git a/internal/middleware/jwt_auth/jwt_auth_middleware.go b/internal/middleware/jwt_auth/jwt_auth_middleware.go index 48e4939..39df25b 100644 --- a/internal/middleware/jwt_auth/jwt_auth_middleware.go +++ b/internal/middleware/jwt_auth/jwt_auth_middleware.go @@ -13,7 +13,7 @@ import ( "go.mongodb.org/mongo-driver/bson/primitive" ) -func Auth[T types.ApiRequest, R types.ApiResponse](f types.HandlerFunc[T, R]) types.HandlerFunc[T, R] { +func Handle[T types.ApiRequest, R types.ApiResponse](f types.HandlerFunc[T, R]) types.HandlerFunc[T, R] { return jwtmiddleware.Handle(f, payloadHandler) } From bc0871e1efe1ff9d69d5a763f029b7fd89cb2deb Mon Sep 17 00:00:00 2001 From: noobj Date: Sun, 29 Jan 2023 16:46:55 +0800 Subject: [PATCH 03/13] refactor: bind ioc in the middleware --- cmd/ahorro/fetchentries/main.go | 12 ++---- cmd/ahorro/login/main.go | 13 +------ cmd/ahorro/refresh/main.go | 10 +---- cmd/ahorro/sync/callback/main.go | 9 +---- .../bind-ioc/bind-ioc.middleware.go | 39 +++++++++++++++++++ ...h_middleware.go => jwt_auth.middleware.go} | 0 internal/middleware/middleware.go | 5 +-- internal/types/middleware.type.go | 8 ++++ 8 files changed, 57 insertions(+), 39 deletions(-) create mode 100644 internal/middleware/bind-ioc/bind-ioc.middleware.go rename internal/middleware/jwt_auth/{jwt_auth_middleware.go => jwt_auth.middleware.go} (100%) create mode 100644 internal/types/middleware.type.go diff --git a/cmd/ahorro/fetchentries/main.go b/cmd/ahorro/fetchentries/main.go index 945a2a2..ddf7fce 100644 --- a/cmd/ahorro/fetchentries/main.go +++ b/cmd/ahorro/fetchentries/main.go @@ -9,6 +9,7 @@ import ( "github.com/aws/aws-lambda-go/lambda" "github.com/golobby/container/v3" "github.com/noobj/go-serverless-services/internal/helpers/helper" + bindioc "github.com/noobj/go-serverless-services/internal/middleware/bind-ioc" jwtMiddleWare "github.com/noobj/go-serverless-services/internal/middleware/jwt_auth" "github.com/noobj/go-serverless-services/internal/repositories" AhorroRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro" @@ -79,7 +80,7 @@ func Handler(ctx context.Context, request events.APIGatewayV2HTTPRequest) (event // } // } var entryRepository repositories.IRepository - container.Resolve(&entryRepository) + container.NamedResolve(&entryRepository, "EntryRepo") matchStage := bson.D{{Key: "$match", Value: bson.D{ {Key: "$expr", Value: bson.D{ @@ -170,12 +171,5 @@ func Handler(ctx context.Context, request events.APIGatewayV2HTTPRequest) (event } func main() { - entryRepo := AhorroRepository.New() - defer entryRepo.Disconnect()() - - container.Singleton(func() repositories.IRepository { - return entryRepo - }) - - lambda.Start(jwtMiddleWare.Handle(Handler)) + lambda.Start(jwtMiddleWare.Handle(bindioc.Handle(Handler))) } diff --git a/cmd/ahorro/login/main.go b/cmd/ahorro/login/main.go index f8e7651..0e6bce9 100644 --- a/cmd/ahorro/login/main.go +++ b/cmd/ahorro/login/main.go @@ -12,6 +12,7 @@ import ( "github.com/golobby/container/v3" "github.com/noobj/go-serverless-services/internal/config" "github.com/noobj/go-serverless-services/internal/helpers/helper" + bindioc "github.com/noobj/go-serverless-services/internal/middleware/bind-ioc" "github.com/noobj/go-serverless-services/internal/repositories" LoginInfoRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro/logininfo" UserRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro/user" @@ -117,15 +118,5 @@ func Handler(ctx context.Context, request events.APIGatewayProxyRequest) (events } func main() { - userRepo := UserRepository.New() - container.NamedSingletonLazy("UserRepo", func() repositories.IRepository { - return userRepo - }) - - container.NamedSingletonLazy("LoginInfoRepo", func() repositories.IRepository { - return LoginInfoRepository.New() - }) - defer userRepo.Disconnect()() - - lambda.Start(Handler) + lambda.Start(bindioc.Handle(Handler)) } diff --git a/cmd/ahorro/refresh/main.go b/cmd/ahorro/refresh/main.go index 48a03f8..b9a2c34 100644 --- a/cmd/ahorro/refresh/main.go +++ b/cmd/ahorro/refresh/main.go @@ -12,6 +12,7 @@ import ( "github.com/golobby/container/v3" "github.com/noobj/go-serverless-services/internal/config" "github.com/noobj/go-serverless-services/internal/helpers/helper" + bindioc "github.com/noobj/go-serverless-services/internal/middleware/bind-ioc" "github.com/noobj/go-serverless-services/internal/repositories" LoginInfoRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro/logininfo" "go.mongodb.org/mongo-driver/bson" @@ -84,12 +85,5 @@ func Handler(ctx context.Context, request events.APIGatewayV2HTTPRequest) (event } func main() { - repo := LoginInfoRepository.New() - - container.NamedSingletonLazy("LoginInfoRepo", func() repositories.IRepository { - return repo - }) - defer repo.Disconnect()() - - lambda.Start(Handler) + lambda.Start(bindioc.Handle(Handler)) } diff --git a/cmd/ahorro/sync/callback/main.go b/cmd/ahorro/sync/callback/main.go index f36e52d..a030a3f 100644 --- a/cmd/ahorro/sync/callback/main.go +++ b/cmd/ahorro/sync/callback/main.go @@ -13,6 +13,7 @@ import ( "github.com/golobby/container/v3" "github.com/noobj/go-serverless-services/internal/config" "github.com/noobj/go-serverless-services/internal/helpers/helper" + bindioc "github.com/noobj/go-serverless-services/internal/middleware/bind-ioc" jwtMiddleWare "github.com/noobj/go-serverless-services/internal/middleware/jwt_auth" "github.com/noobj/go-serverless-services/internal/repositories" UserRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro/user" @@ -92,11 +93,5 @@ func Handler(ctx context.Context, request events.APIGatewayV2HTTPRequest) (event } func main() { - userRepo := UserRepository.New() - defer userRepo.Disconnect()() - container.NamedSingletonLazy("UserRepo", func() repositories.IRepository { - return userRepo - }) - - lambda.Start(jwtMiddleWare.Handle(Handler)) + lambda.Start(jwtMiddleWare.Handle(bindioc.Handle(Handler))) } diff --git a/internal/middleware/bind-ioc/bind-ioc.middleware.go b/internal/middleware/bind-ioc/bind-ioc.middleware.go new file mode 100644 index 0000000..3d1bcc3 --- /dev/null +++ b/internal/middleware/bind-ioc/bind-ioc.middleware.go @@ -0,0 +1,39 @@ +package bindioc + +import ( + "context" + + "github.com/golobby/container/v3" + "github.com/noobj/go-serverless-services/internal/repositories" + "github.com/noobj/jwtmiddleware/types" + + AhorroRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro" + CategoryRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro/category" + LoginInfoRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro/logininfo" + UserRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro/user" +) + +func Handle[T types.ApiRequest, R types.ApiResponse](next types.HandlerFunc[T, R]) types.HandlerFunc[T, R] { + return func(ctx context.Context, request T) (R, error) { + userRepo := UserRepository.New() + defer userRepo.Disconnect()() + + container.NamedSingletonLazy("UserRepo", func() repositories.IRepository { + return userRepo + }) + + container.NamedSingletonLazy("LoginInfoRepo", func() repositories.IRepository { + return LoginInfoRepository.New() + }) + + container.NamedSingletonLazy("CategoryRepo", func() repositories.IRepository { + return CategoryRepository.New() + }) + + container.NamedSingletonLazy("EntryRepo", func() repositories.IRepository { + return AhorroRepository.New() + }) + + return next(ctx, request) + } +} diff --git a/internal/middleware/jwt_auth/jwt_auth_middleware.go b/internal/middleware/jwt_auth/jwt_auth.middleware.go similarity index 100% rename from internal/middleware/jwt_auth/jwt_auth_middleware.go rename to internal/middleware/jwt_auth/jwt_auth.middleware.go diff --git a/internal/middleware/middleware.go b/internal/middleware/middleware.go index f831570..782b8b7 100644 --- a/internal/middleware/middleware.go +++ b/internal/middleware/middleware.go @@ -6,12 +6,9 @@ import ( "github.com/noobj/go-serverless-services/internal/types" ) -// HandlerFunc is a generic JSON Lambda handler used to chain middleware. -type HandlerFunc[T types.ApiRequest, R types.ApiResponse] func(context.Context, T) (R, error) - // MiddlewareFunc is a generic middleware example that takes in a HandlerFunc // and calls the next middleware in the chain. -func MiddlewareFunc[T types.ApiRequest, R types.ApiResponse](next HandlerFunc[T, R]) HandlerFunc[T, R] { +func MiddlewareFunc[T types.ApiRequest, R types.ApiResponse](next types.HandlerFunc[T, R]) types.HandlerFunc[T, R] { return func(ctx context.Context, request T) (R, error) { return next(ctx, request) } diff --git a/internal/types/middleware.type.go b/internal/types/middleware.type.go new file mode 100644 index 0000000..5d6bbeb --- /dev/null +++ b/internal/types/middleware.type.go @@ -0,0 +1,8 @@ +package types + +import ( + "context" +) + +// HandlerFunc is a generic JSON Lambda handler used to chain middleware. +type HandlerFunc[T ApiRequest, R ApiResponse] func(context.Context, T) (R, error) From 087ff3f25633c8b204dcab814a26da2a3fce5b7f Mon Sep 17 00:00:00 2001 From: noobj Date: Mon, 30 Jan 2023 18:08:50 +0800 Subject: [PATCH 04/13] test: fix test failed --- cmd/ahorro/fetchentries/fetchentries_test.go | 2 +- internal/middleware/bind-ioc/bind-ioc.middleware.go | 2 ++ internal/middleware/jwt_auth/jwt_auth.middleware.go | 2 ++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/cmd/ahorro/fetchentries/fetchentries_test.go b/cmd/ahorro/fetchentries/fetchentries_test.go index 9ae650d..371af1d 100644 --- a/cmd/ahorro/fetchentries/fetchentries_test.go +++ b/cmd/ahorro/fetchentries/fetchentries_test.go @@ -80,7 +80,7 @@ var _ = Describe("Fetchentries", func() { Password: "123456", }) - container.Singleton(func() repositories.IRepository { + container.NamedSingletonLazy("EntryRepo", func() repositories.IRepository { return m }) fakeRequest.QueryStringParameters = make(map[string]string) diff --git a/internal/middleware/bind-ioc/bind-ioc.middleware.go b/internal/middleware/bind-ioc/bind-ioc.middleware.go index 3d1bcc3..b0e052f 100644 --- a/internal/middleware/bind-ioc/bind-ioc.middleware.go +++ b/internal/middleware/bind-ioc/bind-ioc.middleware.go @@ -5,6 +5,8 @@ import ( "github.com/golobby/container/v3" "github.com/noobj/go-serverless-services/internal/repositories" + + // TODO: use internal types instead "github.com/noobj/jwtmiddleware/types" AhorroRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro" diff --git a/internal/middleware/jwt_auth/jwt_auth.middleware.go b/internal/middleware/jwt_auth/jwt_auth.middleware.go index 39df25b..37c1f2f 100644 --- a/internal/middleware/jwt_auth/jwt_auth.middleware.go +++ b/internal/middleware/jwt_auth/jwt_auth.middleware.go @@ -8,6 +8,8 @@ import ( "github.com/noobj/go-serverless-services/internal/helpers/helper" UserRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro/user" "github.com/noobj/jwtmiddleware" + + // TODO: use internal types instead "github.com/noobj/jwtmiddleware/types" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" From 0ef57230500ffa9dc81ca595cc5e6e7aa746f6c0 Mon Sep 17 00:00:00 2001 From: noobj Date: Tue, 31 Jan 2023 18:45:59 +0800 Subject: [PATCH 05/13] refactor: change the way IoC binding --- .../bind-ioc/bind-ioc.middleware.go | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/internal/middleware/bind-ioc/bind-ioc.middleware.go b/internal/middleware/bind-ioc/bind-ioc.middleware.go index b0e052f..a5969c8 100644 --- a/internal/middleware/bind-ioc/bind-ioc.middleware.go +++ b/internal/middleware/bind-ioc/bind-ioc.middleware.go @@ -4,13 +4,12 @@ import ( "context" "github.com/golobby/container/v3" - "github.com/noobj/go-serverless-services/internal/repositories" // TODO: use internal types instead "github.com/noobj/jwtmiddleware/types" - AhorroRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro" CategoryRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro/category" + EntryRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro/entry" LoginInfoRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro/logininfo" UserRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro/user" ) @@ -20,20 +19,20 @@ func Handle[T types.ApiRequest, R types.ApiResponse](next types.HandlerFunc[T, R userRepo := UserRepository.New() defer userRepo.Disconnect()() - container.NamedSingletonLazy("UserRepo", func() repositories.IRepository { - return userRepo + container.SingletonLazy(func() UserRepository.UserRepository { + return *userRepo }) - container.NamedSingletonLazy("LoginInfoRepo", func() repositories.IRepository { - return LoginInfoRepository.New() + container.SingletonLazy(func() LoginInfoRepository.LoginInfoRepository { + return *LoginInfoRepository.New() }) - container.NamedSingletonLazy("CategoryRepo", func() repositories.IRepository { - return CategoryRepository.New() + container.SingletonLazy(func() CategoryRepository.CategoryRepository { + return *CategoryRepository.New() }) - container.NamedSingletonLazy("EntryRepo", func() repositories.IRepository { - return AhorroRepository.New() + container.SingletonLazy(func() EntryRepository.EntryRepository { + return *EntryRepository.New() }) return next(ctx, request) From 6ecd8f1713620f73b2c6e7e5b11b49a97097eb3a Mon Sep 17 00:00:00 2001 From: noobj Date: Wed, 1 Feb 2023 18:35:04 +0800 Subject: [PATCH 06/13] refactor: apply singleton resolve, remove AbstractRepository --- cmd/ahorro/fetchentries/fetchentries_test.go | 8 ++-- cmd/ahorro/fetchentries/main.go | 9 ++-- cmd/ahorro/login/login_test.go | 13 +++--- cmd/ahorro/login/main.go | 10 ++--- cmd/ahorro/refresh/main.go | 5 +-- cmd/ahorro/refresh/refresh_test.go | 8 ++-- cmd/ahorro/sync/callback/main.go | 8 ++-- cmd/ahorro/sync/handler/main.go | 4 +- .../ahorro/{ => entry}/entry_repository.go | 19 ++++----- .../ahorro/logininfo/logininfo_repository.go | 13 +++--- .../ahorro/user/user_repository.go | 15 ++++--- internal/repositories/repository.go | 41 +++++++++++++++++++ 12 files changed, 93 insertions(+), 60 deletions(-) rename internal/repositories/ahorro/{ => entry}/entry_repository.go (65%) diff --git a/cmd/ahorro/fetchentries/fetchentries_test.go b/cmd/ahorro/fetchentries/fetchentries_test.go index 371af1d..7930d99 100644 --- a/cmd/ahorro/fetchentries/fetchentries_test.go +++ b/cmd/ahorro/fetchentries/fetchentries_test.go @@ -9,7 +9,7 @@ import ( "github.com/golobby/container/v3" main "github.com/noobj/go-serverless-services/cmd/ahorro/fetchentries" "github.com/noobj/go-serverless-services/internal/helpers/helper" - "github.com/noobj/go-serverless-services/internal/repositories" + EntryRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro/entry" UserRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro/user" . "github.com/noobj/go-serverless-services/internal/repositories/mocks" . "github.com/onsi/ginkgo/v2" @@ -74,15 +74,17 @@ var _ = Describe("Fetchentries", func() { BeforeEach(func() { ctrl := gomock.NewController(GinkgoT()) m := NewMockIRepository(ctrl) + a := EntryRepository.EntryRepository{IRepository: m} ctx = context.WithValue(context.Background(), helper.ContextKeyUser, UserRepository.User{ Id: fakeObjId, Account: "jjj", Password: "123456", }) - container.NamedSingletonLazy("EntryRepo", func() repositories.IRepository { - return m + container.SingletonLazy(func() EntryRepository.EntryRepository { + return a }) + fakeRequest.QueryStringParameters = make(map[string]string) fakeRequest.QueryStringParameters["timeStart"] = "2022-01-01" fakeRequest.QueryStringParameters["timeEnd"] = "2022-01-31" diff --git a/cmd/ahorro/fetchentries/main.go b/cmd/ahorro/fetchentries/main.go index ddf7fce..2753cde 100644 --- a/cmd/ahorro/fetchentries/main.go +++ b/cmd/ahorro/fetchentries/main.go @@ -11,8 +11,7 @@ import ( "github.com/noobj/go-serverless-services/internal/helpers/helper" bindioc "github.com/noobj/go-serverless-services/internal/middleware/bind-ioc" jwtMiddleWare "github.com/noobj/go-serverless-services/internal/middleware/jwt_auth" - "github.com/noobj/go-serverless-services/internal/repositories" - AhorroRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro" + EntryRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro/entry" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" ) @@ -29,7 +28,7 @@ type Entry struct { type AggregateResult struct { Entries []Entry Sum float32 - Category []AhorroRepository.Category + Category []EntryRepository.Category } type CategoryEntriesBundle struct { @@ -48,6 +47,8 @@ func checkTimeFormat(format string, timeString string) bool { } func Handler(ctx context.Context, request events.APIGatewayV2HTTPRequest) (events.APIGatewayProxyResponse, error) { + var entryRepository EntryRepository.EntryRepository + container.Resolve(&entryRepository) user, ok := helper.GetUserFromContext(ctx) if !ok { return events.APIGatewayProxyResponse{Body: "please login in", StatusCode: 401}, nil @@ -79,8 +80,6 @@ func Handler(ctx context.Context, request events.APIGatewayV2HTTPRequest) (event // excludeCondition = append(excludeCondition, condition) // } // } - var entryRepository repositories.IRepository - container.NamedResolve(&entryRepository, "EntryRepo") matchStage := bson.D{{Key: "$match", Value: bson.D{ {Key: "$expr", Value: bson.D{ diff --git a/cmd/ahorro/login/login_test.go b/cmd/ahorro/login/login_test.go index 3b34ede..7b68bb3 100644 --- a/cmd/ahorro/login/login_test.go +++ b/cmd/ahorro/login/login_test.go @@ -18,7 +18,8 @@ import ( "github.com/golang/mock/gomock" "github.com/golobby/container/v3" - "github.com/noobj/go-serverless-services/internal/repositories" + LoginInfoRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro/logininfo" + UserRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro/user" mocks "github.com/noobj/go-serverless-services/internal/repositories/mocks" ) @@ -39,12 +40,14 @@ var _ = Describe("Login", func() { ctrl := gomock.NewController(GinkgoT()) m := mocks.NewMockIRepository(ctrl) + userRepoMock := UserRepository.UserRepository{IRepository: m} + loginRepoMock := LoginInfoRepository.LoginInfoRepository{IRepository: m} - container.NamedSingleton("UserRepo", func() repositories.IRepository { - return m + container.Singleton(func() UserRepository.UserRepository { + return userRepoMock }) - container.NamedSingleton("LoginInfoRepo", func() repositories.IRepository { - return m + container.Singleton(func() LoginInfoRepository.LoginInfoRepository { + return loginRepoMock }) fakeSingleResult := mongo.NewSingleResultFromDocument(fakeUserDoc, nil, nil) diff --git a/cmd/ahorro/login/main.go b/cmd/ahorro/login/main.go index 0e6bce9..8f44a42 100644 --- a/cmd/ahorro/login/main.go +++ b/cmd/ahorro/login/main.go @@ -13,7 +13,6 @@ import ( "github.com/noobj/go-serverless-services/internal/config" "github.com/noobj/go-serverless-services/internal/helpers/helper" bindioc "github.com/noobj/go-serverless-services/internal/middleware/bind-ioc" - "github.com/noobj/go-serverless-services/internal/repositories" LoginInfoRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro/logininfo" UserRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro/user" "go.mongodb.org/mongo-driver/bson" @@ -32,13 +31,14 @@ func insertNewRefreshTokenIntoLoginInfo(userId primitive.ObjectID, refreshToken RefreshToken: refreshToken, CreatedAt: primitive.NewDateTimeFromTime(time.Now()), } - var loginInfoRepository repositories.IRepository - container.NamedResolve(&loginInfoRepository, "LoginInfoRepo") + var loginInfoRepository LoginInfoRepository.LoginInfoRepository + container.Resolve(&loginInfoRepository) loginInfoRepository.InsertOne(context.TODO(), loginInfo) } func Handler(ctx context.Context, request events.APIGatewayProxyRequest) (events.APIGatewayV2HTTPResponse, error) { - var userRepository repositories.IRepository + var userRepository UserRepository.UserRepository + container.Resolve(&userRepository) var requestBody LoginDto formData, err := helper.ParseMultipartForm(request.Headers["content-type"], strings.NewReader(request.Body), request.IsBase64Encoded) @@ -52,8 +52,6 @@ func Handler(ctx context.Context, request events.APIGatewayProxyRequest) (events return events.APIGatewayV2HTTPResponse{Body: "request body error", StatusCode: 400}, nil } - container.NamedResolve(&userRepository, "UserRepo") - var user UserRepository.User err = userRepository.FindOne(context.TODO(), bson.M{"account": requestBody.Account}).Decode(&user) if err != nil { diff --git a/cmd/ahorro/refresh/main.go b/cmd/ahorro/refresh/main.go index b9a2c34..249ed15 100644 --- a/cmd/ahorro/refresh/main.go +++ b/cmd/ahorro/refresh/main.go @@ -13,7 +13,6 @@ import ( "github.com/noobj/go-serverless-services/internal/config" "github.com/noobj/go-serverless-services/internal/helpers/helper" bindioc "github.com/noobj/go-serverless-services/internal/middleware/bind-ioc" - "github.com/noobj/go-serverless-services/internal/repositories" LoginInfoRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro/logininfo" "go.mongodb.org/mongo-driver/bson" ) @@ -26,6 +25,8 @@ type LoginDto struct { var errorHandler = helper.GenerateErrorResponse[events.APIGatewayV2HTTPResponse] func Handler(ctx context.Context, request events.APIGatewayV2HTTPRequest) (events.APIGatewayV2HTTPResponse, error) { + var loginInfoRepository LoginInfoRepository.LoginInfoRepository + container.Resolve(&loginInfoRepository) cookiesMap := helper.ParseCookie(request.Cookies) if _, ok := cookiesMap["refresh_token"]; !ok { @@ -44,9 +45,7 @@ func Handler(ctx context.Context, request events.APIGatewayV2HTTPRequest) (event return errorHandler(401) } - var loginInfoRepository repositories.IRepository var loginInfo LoginInfoRepository.LoginInfo - container.NamedResolve(&loginInfoRepository, "LoginInfoRepo") loginInfoRepository.FindOne(context.TODO(), bson.M{"refreshToken": cookiesMap["refresh_token"]}).Decode(&loginInfo) if loginInfo.User.Hex() != userId { diff --git a/cmd/ahorro/refresh/refresh_test.go b/cmd/ahorro/refresh/refresh_test.go index bcfefde..41907f3 100644 --- a/cmd/ahorro/refresh/refresh_test.go +++ b/cmd/ahorro/refresh/refresh_test.go @@ -11,7 +11,7 @@ import ( "github.com/golobby/container/v3" "github.com/joho/godotenv" main "github.com/noobj/go-serverless-services/cmd/ahorro/refresh" - "github.com/noobj/go-serverless-services/internal/repositories" + LoginInfoRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro/logininfo" mockRepo "github.com/noobj/go-serverless-services/internal/repositories/mocks" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" @@ -33,9 +33,9 @@ var _ = Describe("Refresh", func() { ctrl := gomock.NewController(GinkgoT()) m := mockRepo.NewMockIRepository(ctrl) - - container.NamedSingleton("LoginInfoRepo", func() repositories.IRepository { - return m + loginRepoMock := LoginInfoRepository.LoginInfoRepository{IRepository: m} + container.Singleton(func() LoginInfoRepository.LoginInfoRepository { + return loginRepoMock }) fakeLoginInfoDoc := bson.M{ diff --git a/cmd/ahorro/sync/callback/main.go b/cmd/ahorro/sync/callback/main.go index a030a3f..e1c956f 100644 --- a/cmd/ahorro/sync/callback/main.go +++ b/cmd/ahorro/sync/callback/main.go @@ -15,7 +15,6 @@ import ( "github.com/noobj/go-serverless-services/internal/helpers/helper" bindioc "github.com/noobj/go-serverless-services/internal/middleware/bind-ioc" jwtMiddleWare "github.com/noobj/go-serverless-services/internal/middleware/jwt_auth" - "github.com/noobj/go-serverless-services/internal/repositories" UserRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro/user" "go.mongodb.org/mongo-driver/bson" "golang.org/x/oauth2" @@ -30,7 +29,9 @@ var internalErrorhandler = func() (events.APIGatewayProxyResponse, error) { } func Handler(ctx context.Context, request events.APIGatewayV2HTTPRequest) (events.APIGatewayProxyResponse, error) { - var userRepositoryTmp repositories.IRepository + var userRepository UserRepository.UserRepository + container.Resolve(&userRepository) + user, ok := helper.GetUserFromContext(ctx) if !ok { return authErrorhandler() @@ -69,9 +70,6 @@ func Handler(ctx context.Context, request events.APIGatewayV2HTTPRequest) (event return authErrorhandler("exchange code error") } - container.NamedResolve(&userRepositoryTmp, "UserRepo") - userRepository, ok := userRepositoryTmp.(UserRepository.IUserRepository) - if !ok { log.Println("resolve repository error") return internalErrorhandler() diff --git a/cmd/ahorro/sync/handler/main.go b/cmd/ahorro/sync/handler/main.go index 35a700a..d85cdec 100644 --- a/cmd/ahorro/sync/handler/main.go +++ b/cmd/ahorro/sync/handler/main.go @@ -18,8 +18,8 @@ import ( "github.com/noobj/go-serverless-services/internal/helpers/helper" "github.com/noobj/go-serverless-services/internal/mongodb" "github.com/noobj/go-serverless-services/internal/repositories" - AhorroRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro" CategoryRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro/category" + EntryRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro/entry" UserRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro/user" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" @@ -248,7 +248,7 @@ func main() { }) container.NamedSingletonLazy("EntryRepo", func() repositories.IRepository { - return AhorroRepository.New() + return EntryRepository.New() }) lambda.Start(Handler) diff --git a/internal/repositories/ahorro/entry_repository.go b/internal/repositories/ahorro/entry/entry_repository.go similarity index 65% rename from internal/repositories/ahorro/entry_repository.go rename to internal/repositories/ahorro/entry/entry_repository.go index 86905cf..548fef5 100644 --- a/internal/repositories/ahorro/entry_repository.go +++ b/internal/repositories/ahorro/entry/entry_repository.go @@ -1,4 +1,4 @@ -package ahorro +package repository import ( "github.com/noobj/go-serverless-services/internal/mongodb" @@ -24,19 +24,16 @@ type Category struct { V int `bson:"__v,omitempty"` } -type AhorroRepository struct { - AbstractRepository +type EntryRepository struct { + IRepository } -func New() *AhorroRepository { - abstractRepository := AbstractRepository{ - BaseRepository: BaseRepository{ - Client: mongodb.GetInstance(), - Collection: mongodb.GetInstance().Database("ahorro").Collection("entries"), - }, +func New() *EntryRepository { + baseRepository := BaseRepository{ + Client: mongodb.GetInstance(), + Collection: mongodb.GetInstance().Database("ahorro").Collection("entries"), } - repo := AhorroRepository{AbstractRepository: abstractRepository} - repo.IRepository = abstractRepository + repo := EntryRepository{IRepository: baseRepository} return &repo } diff --git a/internal/repositories/ahorro/logininfo/logininfo_repository.go b/internal/repositories/ahorro/logininfo/logininfo_repository.go index 246fb47..dc6a1d0 100644 --- a/internal/repositories/ahorro/logininfo/logininfo_repository.go +++ b/internal/repositories/ahorro/logininfo/logininfo_repository.go @@ -14,18 +14,15 @@ type LoginInfo struct { } type LoginInfoRepository struct { - AbstractRepository + IRepository } func New() *LoginInfoRepository { - abstractRepository := AbstractRepository{ - BaseRepository: BaseRepository{ - Client: mongodb.GetInstance(), - Collection: mongodb.GetInstance().Database("ahorro").Collection("loginInfos"), - }, + baseRepository := BaseRepository{ + Client: mongodb.GetInstance(), + Collection: mongodb.GetInstance().Database("ahorro").Collection("loginInfos"), } - repo := LoginInfoRepository{AbstractRepository: abstractRepository} - repo.IRepository = abstractRepository + repo := LoginInfoRepository{IRepository: baseRepository} return &repo } diff --git a/internal/repositories/ahorro/user/user_repository.go b/internal/repositories/ahorro/user/user_repository.go index 0fc60de..d592fd7 100644 --- a/internal/repositories/ahorro/user/user_repository.go +++ b/internal/repositories/ahorro/user/user_repository.go @@ -19,7 +19,8 @@ type User struct { } type UserRepository struct { - repositories.AbstractRepository + repositories.IRepository + Collection *mongo.Collection } //go:generate mockgen -source=user_repository.go -package repositories -aux_files repositories=../../repository.go -destination ../../mocks/user/mock_user_repository.go @@ -29,14 +30,12 @@ type IUserRepository interface { } func New() *UserRepository { - abstractRepository := repositories.AbstractRepository{ - BaseRepository: repositories.BaseRepository{ - Client: mongodb.GetInstance(), - Collection: mongodb.GetInstance().Database("ahorro").Collection("users"), - }, + baseRepository := repositories.BaseRepository{ + Client: mongodb.GetInstance(), + Collection: mongodb.GetInstance().Database("ahorro").Collection("loginInfos"), } - repo := UserRepository{AbstractRepository: abstractRepository} - repo.IRepository = abstractRepository + repo := UserRepository{IRepository: baseRepository} + repo.Collection = baseRepository.Collection return &repo } diff --git a/internal/repositories/repository.go b/internal/repositories/repository.go index 63010cd..6291831 100644 --- a/internal/repositories/repository.go +++ b/internal/repositories/repository.go @@ -23,3 +23,44 @@ type BaseRepository struct { Client *mongo.Client Collection *mongo.Collection } + +func (repo BaseRepository) InsertOne(ctx context.Context, document interface{}, opts ...*options.InsertOneOptions) (*mongo.InsertOneResult, error) { + return repo.Collection.InsertOne(context.TODO(), document, opts...) +} + +func (repo BaseRepository) Disconnect() func() { + return func() { + if err := repo.Client.Disconnect(context.TODO()); err != nil { + panic(err) + } + } +} + +func (repo BaseRepository) Aggregate(stages interface{}) []bson.M { + cursor, err := repo.Collection.Aggregate(context.TODO(), stages) + if err != nil { + panic(err) + } + + var results []bson.M + + if err = cursor.All(context.TODO(), &results); err != nil { + panic(err) + } + + return results +} + +func (repo BaseRepository) FindOne(ctx context.Context, filter interface{}, opts ...*options.FindOneOptions) *mongo.SingleResult { + return repo.Collection.FindOne(ctx, filter, opts...) +} + +func (repo BaseRepository) DeleteMany(ctx context.Context, filter interface{}, + opts ...*options.DeleteOptions) (*mongo.DeleteResult, error) { + return repo.Collection.DeleteMany(ctx, filter, opts...) +} + +func (repo BaseRepository) InsertMany(ctx context.Context, documents []interface{}, + opts ...*options.InsertManyOptions) (*mongo.InsertManyResult, error) { + return repo.Collection.InsertMany(ctx, documents, opts...) +} From 54f0063cc6810012c3af01507ce712552da6bed4 Mon Sep 17 00:00:00 2001 From: noobj Date: Fri, 3 Feb 2023 10:14:33 +0800 Subject: [PATCH 07/13] refactor: change the binding and resolve --- cmd/ahorro/fetchentries/main.go | 2 ++ cmd/ahorro/login/main.go | 2 ++ cmd/ahorro/refresh/main.go | 2 ++ cmd/ahorro/sync/callback/main.go | 2 ++ cmd/ahorro/sync/checker/main.go | 2 ++ cmd/ahorro/sync/handler/main.go | 32 ++++++------------- cmd/ahorro/sync/receiver/main.go | 2 ++ go.mod | 4 +-- go.sum | 6 ++++ .../bind-ioc/bind-ioc.middleware.go | 5 +-- internal/mongodb/mongodb.go | 12 +++++++ .../ahorro/user/user_repository.go | 2 +- package.json | 2 +- 13 files changed, 45 insertions(+), 30 deletions(-) diff --git a/cmd/ahorro/fetchentries/main.go b/cmd/ahorro/fetchentries/main.go index 2753cde..5a1c112 100644 --- a/cmd/ahorro/fetchentries/main.go +++ b/cmd/ahorro/fetchentries/main.go @@ -11,6 +11,7 @@ import ( "github.com/noobj/go-serverless-services/internal/helpers/helper" bindioc "github.com/noobj/go-serverless-services/internal/middleware/bind-ioc" jwtMiddleWare "github.com/noobj/go-serverless-services/internal/middleware/jwt_auth" + "github.com/noobj/go-serverless-services/internal/mongodb" EntryRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro/entry" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" @@ -170,5 +171,6 @@ func Handler(ctx context.Context, request events.APIGatewayV2HTTPRequest) (event } func main() { + defer mongodb.Disconnect()() lambda.Start(jwtMiddleWare.Handle(bindioc.Handle(Handler))) } diff --git a/cmd/ahorro/login/main.go b/cmd/ahorro/login/main.go index 8f44a42..5e19e25 100644 --- a/cmd/ahorro/login/main.go +++ b/cmd/ahorro/login/main.go @@ -13,6 +13,7 @@ import ( "github.com/noobj/go-serverless-services/internal/config" "github.com/noobj/go-serverless-services/internal/helpers/helper" bindioc "github.com/noobj/go-serverless-services/internal/middleware/bind-ioc" + "github.com/noobj/go-serverless-services/internal/mongodb" LoginInfoRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro/logininfo" UserRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro/user" "go.mongodb.org/mongo-driver/bson" @@ -116,5 +117,6 @@ func Handler(ctx context.Context, request events.APIGatewayProxyRequest) (events } func main() { + defer mongodb.Disconnect()() lambda.Start(bindioc.Handle(Handler)) } diff --git a/cmd/ahorro/refresh/main.go b/cmd/ahorro/refresh/main.go index 249ed15..bf20ac5 100644 --- a/cmd/ahorro/refresh/main.go +++ b/cmd/ahorro/refresh/main.go @@ -13,6 +13,7 @@ import ( "github.com/noobj/go-serverless-services/internal/config" "github.com/noobj/go-serverless-services/internal/helpers/helper" bindioc "github.com/noobj/go-serverless-services/internal/middleware/bind-ioc" + "github.com/noobj/go-serverless-services/internal/mongodb" LoginInfoRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro/logininfo" "go.mongodb.org/mongo-driver/bson" ) @@ -84,5 +85,6 @@ func Handler(ctx context.Context, request events.APIGatewayV2HTTPRequest) (event } func main() { + defer mongodb.Disconnect()() lambda.Start(bindioc.Handle(Handler)) } diff --git a/cmd/ahorro/sync/callback/main.go b/cmd/ahorro/sync/callback/main.go index e1c956f..c61be75 100644 --- a/cmd/ahorro/sync/callback/main.go +++ b/cmd/ahorro/sync/callback/main.go @@ -15,6 +15,7 @@ import ( "github.com/noobj/go-serverless-services/internal/helpers/helper" bindioc "github.com/noobj/go-serverless-services/internal/middleware/bind-ioc" jwtMiddleWare "github.com/noobj/go-serverless-services/internal/middleware/jwt_auth" + "github.com/noobj/go-serverless-services/internal/mongodb" UserRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro/user" "go.mongodb.org/mongo-driver/bson" "golang.org/x/oauth2" @@ -91,5 +92,6 @@ func Handler(ctx context.Context, request events.APIGatewayV2HTTPRequest) (event } func main() { + defer mongodb.Disconnect()() lambda.Start(jwtMiddleWare.Handle(bindioc.Handle(Handler))) } diff --git a/cmd/ahorro/sync/checker/main.go b/cmd/ahorro/sync/checker/main.go index 7a07728..e9e2a76 100644 --- a/cmd/ahorro/sync/checker/main.go +++ b/cmd/ahorro/sync/checker/main.go @@ -14,6 +14,7 @@ import ( "github.com/noobj/go-serverless-services/internal/config" "github.com/noobj/go-serverless-services/internal/helpers/helper" jwtMiddleWare "github.com/noobj/go-serverless-services/internal/middleware/jwt_auth" + "github.com/noobj/go-serverless-services/internal/mongodb" ) var internalErrorhandler = func() (events.APIGatewayProxyResponse, error) { @@ -65,5 +66,6 @@ func Handler(ctx context.Context, request events.APIGatewayV2HTTPRequest) (event } func main() { + defer mongodb.Disconnect()() lambda.Start(jwtMiddleWare.Handle(Handler)) } diff --git a/cmd/ahorro/sync/handler/main.go b/cmd/ahorro/sync/handler/main.go index d85cdec..bf12b23 100644 --- a/cmd/ahorro/sync/handler/main.go +++ b/cmd/ahorro/sync/handler/main.go @@ -16,8 +16,9 @@ import ( "github.com/golobby/container/v3" "github.com/mitchellh/mapstructure" "github.com/noobj/go-serverless-services/internal/helpers/helper" + bindioc "github.com/noobj/go-serverless-services/internal/middleware/bind-ioc" + jwtMiddleWare "github.com/noobj/go-serverless-services/internal/middleware/jwt_auth" "github.com/noobj/go-serverless-services/internal/mongodb" - "github.com/noobj/go-serverless-services/internal/repositories" CategoryRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro/category" EntryRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro/entry" UserRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro/user" @@ -58,12 +59,12 @@ var internalErrorhandler = func(taskId string, message ...string) (events.APIGat } func Handler(ctx context.Context, event events.SQSEvent) (events.APIGatewayProxyResponse, error) { - var userRepository repositories.IRepository - container.NamedResolve(&userRepository, "UserRepo") - var categoryRepository repositories.IRepository - container.NamedResolve(&categoryRepository, "CategoryRepo") - var entryRepository repositories.IRepository - container.NamedResolve(&entryRepository, "EntryRepo") + var entryRepository EntryRepository.EntryRepository + container.Resolve(&entryRepository) + var userRepository UserRepository.UserRepository + container.Resolve(&userRepository) + var categoryRepository CategoryRepository.CategoryRepository + container.Resolve(&categoryRepository) for _, record := range event.Records { userId := *record.MessageAttributes["UserId"].StringValue @@ -237,19 +238,6 @@ func collateEntryItems(entryItems []EntryItem, cateIdMap map[string]primitive.Ob } func main() { - userRepo := UserRepository.New() - defer userRepo.Disconnect()() - container.NamedSingletonLazy("UserRepo", func() repositories.IRepository { - return userRepo - }) - - container.NamedSingletonLazy("CategoryRepo", func() repositories.IRepository { - return CategoryRepository.New() - }) - - container.NamedSingletonLazy("EntryRepo", func() repositories.IRepository { - return EntryRepository.New() - }) - - lambda.Start(Handler) + defer mongodb.Disconnect()() + lambda.Start(jwtMiddleWare.Handle(bindioc.Handle(Handler))) } diff --git a/cmd/ahorro/sync/receiver/main.go b/cmd/ahorro/sync/receiver/main.go index 5f1d9a6..ea81715 100644 --- a/cmd/ahorro/sync/receiver/main.go +++ b/cmd/ahorro/sync/receiver/main.go @@ -14,6 +14,7 @@ import ( "github.com/noobj/go-serverless-services/internal/config" "github.com/noobj/go-serverless-services/internal/helpers/helper" jwtMiddleWare "github.com/noobj/go-serverless-services/internal/middleware/jwt_auth" + "github.com/noobj/go-serverless-services/internal/mongodb" "golang.org/x/oauth2" drive "google.golang.org/api/drive/v3" ) @@ -86,5 +87,6 @@ func Handler(ctx context.Context, request events.APIGatewayV2HTTPRequest) (event } func main() { + defer mongodb.Disconnect()() lambda.Start(jwtMiddleWare.Handle(Handler)) } diff --git a/go.mod b/go.mod index 0897dcd..c8addce 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/noobj/go-serverless-services go 1.18 require ( - github.com/aws/aws-lambda-go v1.34.1 + github.com/aws/aws-lambda-go v1.37.0 github.com/aws/aws-sdk-go v1.44.79 github.com/gocolly/colly v1.2.0 github.com/golang-jwt/jwt v3.2.2+incompatible @@ -12,7 +12,7 @@ require ( github.com/joho/godotenv v1.4.0 github.com/kelseyhightower/envconfig v1.4.0 github.com/mitchellh/mapstructure v1.5.0 - github.com/noobj/jwtmiddleware v1.0.2 + github.com/noobj/jwtmiddleware v1.0.4 github.com/onsi/ginkgo/v2 v2.2.0 github.com/onsi/gomega v1.20.2 go.mongodb.org/mongo-driver v1.9.1 diff --git a/go.sum b/go.sum index 6867048..da59c1d 100644 --- a/go.sum +++ b/go.sum @@ -71,6 +71,8 @@ github.com/antchfx/xpath v1.2.1/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwq github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/aws/aws-lambda-go v1.34.1 h1:M3a/uFYBjii+tDcOJ0wL/WyFi2550FHoECdPf27zvOs= github.com/aws/aws-lambda-go v1.34.1/go.mod h1:jwFe2KmMsHmffA1X2R09hH6lFzJQxzI8qK17ewzbQMM= +github.com/aws/aws-lambda-go v1.37.0 h1:WXkQ/xhIcXZZ2P5ZBEw+bbAKeCEcb5NtiYpSwVVzIXg= +github.com/aws/aws-lambda-go v1.37.0/go.mod h1:jwFe2KmMsHmffA1X2R09hH6lFzJQxzI8qK17ewzbQMM= github.com/aws/aws-sdk-go v1.44.79 h1:IZCtfBq9VlJ1Eu34I+2Y76q+XkvTtZYbEwaoVM1gzoA= github.com/aws/aws-sdk-go v1.44.79/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -239,6 +241,10 @@ github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RR github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/noobj/jwtmiddleware v1.0.2 h1:h30phLAskmcpxBz/sd01qonIfF1Pu5pd1EhAm8JXsVs= github.com/noobj/jwtmiddleware v1.0.2/go.mod h1:KBR615o5jFZPvzWFs7bQ9ZS/69bo+uJCkI+k0yuQLTg= +github.com/noobj/jwtmiddleware v1.0.3 h1:kfJNDI22T6CCVoALFvMJi2iHBngSKOSAclrMs0mBvrc= +github.com/noobj/jwtmiddleware v1.0.3/go.mod h1:KBR615o5jFZPvzWFs7bQ9ZS/69bo+uJCkI+k0yuQLTg= +github.com/noobj/jwtmiddleware v1.0.4 h1:QWfjMw7d+CaBc14vthC7duzdEeLvq7cwZH133YCLw7I= +github.com/noobj/jwtmiddleware v1.0.4/go.mod h1:KBR615o5jFZPvzWFs7bQ9ZS/69bo+uJCkI+k0yuQLTg= github.com/onsi/ginkgo/v2 v2.2.0 h1:3ZNA3L1c5FYDFTTxbFeVGGD8jYvjYauHD30YgLxVsNI= github.com/onsi/ginkgo/v2 v2.2.0/go.mod h1:MEH45j8TBi6u9BMogfbp0stKC5cdGjumZj5Y7AG4VIk= github.com/onsi/gomega v1.20.2 h1:8uQq0zMgLEfa0vRrrBgaJF2gyW9Da9BmfGV+OyUzfkY= diff --git a/internal/middleware/bind-ioc/bind-ioc.middleware.go b/internal/middleware/bind-ioc/bind-ioc.middleware.go index a5969c8..3d73828 100644 --- a/internal/middleware/bind-ioc/bind-ioc.middleware.go +++ b/internal/middleware/bind-ioc/bind-ioc.middleware.go @@ -16,11 +16,8 @@ import ( func Handle[T types.ApiRequest, R types.ApiResponse](next types.HandlerFunc[T, R]) types.HandlerFunc[T, R] { return func(ctx context.Context, request T) (R, error) { - userRepo := UserRepository.New() - defer userRepo.Disconnect()() - container.SingletonLazy(func() UserRepository.UserRepository { - return *userRepo + return *UserRepository.New() }) container.SingletonLazy(func() LoginInfoRepository.LoginInfoRepository { diff --git a/internal/mongodb/mongodb.go b/internal/mongodb/mongodb.go index 7726777..72d214a 100644 --- a/internal/mongodb/mongodb.go +++ b/internal/mongodb/mongodb.go @@ -48,3 +48,15 @@ func GetInstance() *mongo.Client { return clientInstance } + +func Disconnect() func() { + return func() { + if clientInstance == nil { + return + } + + if err := clientInstance.Disconnect(context.TODO()); err != nil { + panic(err) + } + } +} diff --git a/internal/repositories/ahorro/user/user_repository.go b/internal/repositories/ahorro/user/user_repository.go index d592fd7..a7fadd0 100644 --- a/internal/repositories/ahorro/user/user_repository.go +++ b/internal/repositories/ahorro/user/user_repository.go @@ -32,7 +32,7 @@ type IUserRepository interface { func New() *UserRepository { baseRepository := repositories.BaseRepository{ Client: mongodb.GetInstance(), - Collection: mongodb.GetInstance().Database("ahorro").Collection("loginInfos"), + Collection: mongodb.GetInstance().Database("ahorro").Collection("users"), } repo := UserRepository{IRepository: baseRepository} repo.Collection = baseRepository.Collection diff --git a/package.json b/package.json index 3e90fbf..5b5ebdc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "lambda-golang-offline", - "description": "To run the golanf lambda service locally", + "description": "To run the golang lambda service locally", "version": "1.0.0", "scripts": { "start": "SLS_DEBUG=* node ./node_modules/.bin/serverless offline --host 0.0.0.0 start --useDocker", From d60a42573122d0cad5b48a5aa5c228d7f2eafa79 Mon Sep 17 00:00:00 2001 From: noobj Date: Sun, 5 Feb 2023 12:46:37 +0800 Subject: [PATCH 08/13] refactor: change handler to invoker in main.go --- cmd/ahorro/fetchentries/fetchentries_test.go | 18 +++---- cmd/ahorro/fetchentries/main.go | 15 +++--- cmd/ahorro/login/login_test.go | 21 +++----- cmd/ahorro/login/main.go | 24 ++++----- cmd/ahorro/refresh/main.go | 15 +++--- cmd/ahorro/refresh/refresh_test.go | 15 +++--- cmd/ahorro/sync/callback/main.go | 14 +++--- cmd/ahorro/sync/handler/main.go | 28 +++++------ internal/helpers/helper/test.go | 49 +++++++++++++++++++ .../bind-ioc/bind-ioc.middleware.go | 17 ++++++- .../ahorro/category/category_repository.go | 13 ++--- 11 files changed, 145 insertions(+), 84 deletions(-) create mode 100644 internal/helpers/helper/test.go diff --git a/cmd/ahorro/fetchentries/fetchentries_test.go b/cmd/ahorro/fetchentries/fetchentries_test.go index 7930d99..fad892b 100644 --- a/cmd/ahorro/fetchentries/fetchentries_test.go +++ b/cmd/ahorro/fetchentries/fetchentries_test.go @@ -6,10 +6,8 @@ import ( "github.com/aws/aws-lambda-go/events" "github.com/golang/mock/gomock" - "github.com/golobby/container/v3" main "github.com/noobj/go-serverless-services/cmd/ahorro/fetchentries" "github.com/noobj/go-serverless-services/internal/helpers/helper" - EntryRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro/entry" UserRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro/user" . "github.com/noobj/go-serverless-services/internal/repositories/mocks" . "github.com/onsi/ginkgo/v2" @@ -70,21 +68,21 @@ var fakeData = []bson.M{ var _ = Describe("Fetchentries", func() { var fakeRequest events.APIGatewayV2HTTPRequest var ctx context.Context + invoker := main.Invoker{} BeforeEach(func() { ctrl := gomock.NewController(GinkgoT()) m := NewMockIRepository(ctrl) - a := EntryRepository.EntryRepository{IRepository: m} + + if err := helper.BindIocForTesting(m, &invoker); err != nil { + panic(err.Error()) + } ctx = context.WithValue(context.Background(), helper.ContextKeyUser, UserRepository.User{ Id: fakeObjId, Account: "jjj", Password: "123456", }) - container.SingletonLazy(func() EntryRepository.EntryRepository { - return a - }) - fakeRequest.QueryStringParameters = make(map[string]string) fakeRequest.QueryStringParameters["timeStart"] = "2022-01-01" fakeRequest.QueryStringParameters["timeEnd"] = "2022-01-31" @@ -96,14 +94,14 @@ var _ = Describe("Fetchentries", func() { Context("when handler return expected json response", func() { It("should pass", func() { expectedRes := "{\"categories\":[{\"_id\":\"62badc82d420270009a51019\",\"sum\":110,\"percentage\":\"0.55\",\"name\":\"Food\",\"entries\":[{\"_id\":\"62badc82d420270009a51019\",\"amount\":110,\"date\":\"2022-01-05\",\"descr\":\"fuck\"}],\"color\":\"#a4e56c\"},{\"_id\":\"62badc82d420270009a51019\",\"sum\":90,\"percentage\":\"0.45\",\"name\":\"Abc\",\"entries\":[{\"_id\":\"62badc82d420270009a51019\",\"amount\":90,\"date\":\"2022-01-05\",\"descr\":\"fuck\"}],\"color\":\"#a4e51c\"}],\"total\":200}" - res, err := main.Handler(ctx, fakeRequest) + res, err := invoker.Invoke(ctx, fakeRequest) fmt.Printf("%+v", res.Body) Expect(res.Body).To(Equal(expectedRes)) Expect(err).To(BeNil()) }) It("should failed with wrong query string format", func() { - res, err := main.Handler(ctx, events.APIGatewayV2HTTPRequest{}) + res, err := invoker.Invoke(ctx, events.APIGatewayV2HTTPRequest{}) Expect(res.Body).To(Equal("request query error")) Expect(res.StatusCode).To(Equal(400)) Expect(err).To(BeNil()) @@ -111,7 +109,7 @@ var _ = Describe("Fetchentries", func() { It("should failed for not logining in", func() { ctx = context.TODO() - res, err := main.Handler(ctx, fakeRequest) + res, err := invoker.Invoke(ctx, fakeRequest) Expect(res.Body).To(Equal("please login in")) Expect(res.StatusCode).To(Equal(401)) Expect(err).To(BeNil()) diff --git a/cmd/ahorro/fetchentries/main.go b/cmd/ahorro/fetchentries/main.go index 5a1c112..68a39e2 100644 --- a/cmd/ahorro/fetchentries/main.go +++ b/cmd/ahorro/fetchentries/main.go @@ -7,7 +7,6 @@ import ( "github.com/aws/aws-lambda-go/events" "github.com/aws/aws-lambda-go/lambda" - "github.com/golobby/container/v3" "github.com/noobj/go-serverless-services/internal/helpers/helper" bindioc "github.com/noobj/go-serverless-services/internal/middleware/bind-ioc" jwtMiddleWare "github.com/noobj/go-serverless-services/internal/middleware/jwt_auth" @@ -47,9 +46,11 @@ func checkTimeFormat(format string, timeString string) bool { return err == nil } -func Handler(ctx context.Context, request events.APIGatewayV2HTTPRequest) (events.APIGatewayProxyResponse, error) { - var entryRepository EntryRepository.EntryRepository - container.Resolve(&entryRepository) +type Invoker struct { + entryRepository EntryRepository.EntryRepository `container:"type"` +} + +func (this *Invoker) Invoke(ctx context.Context, request events.APIGatewayV2HTTPRequest) (events.APIGatewayProxyResponse, error) { user, ok := helper.GetUserFromContext(ctx) if !ok { return events.APIGatewayProxyResponse{Body: "please login in", StatusCode: 401}, nil @@ -129,7 +130,7 @@ func Handler(ctx context.Context, request events.APIGatewayV2HTTPRequest) (event }, }} - repoResults := entryRepository.Aggregate([]bson.D{matchStage, sortStage, groupStage, sortSumStage, lookupStage}) + repoResults := this.entryRepository.Aggregate([]bson.D{matchStage, sortStage, groupStage, sortSumStage, lookupStage}) var categories []CategoryEntriesBundle total := float32(0.0) for _, repoResult := range repoResults { @@ -172,5 +173,7 @@ func Handler(ctx context.Context, request events.APIGatewayV2HTTPRequest) (event func main() { defer mongodb.Disconnect()() - lambda.Start(jwtMiddleWare.Handle(bindioc.Handle(Handler))) + invoker := Invoker{} + + lambda.Start(jwtMiddleWare.Handle(bindioc.Handle(invoker.Invoke, &invoker))) } diff --git a/cmd/ahorro/login/login_test.go b/cmd/ahorro/login/login_test.go index 7b68bb3..2b201bb 100644 --- a/cmd/ahorro/login/login_test.go +++ b/cmd/ahorro/login/login_test.go @@ -17,9 +17,7 @@ import ( "go.mongodb.org/mongo-driver/mongo" "github.com/golang/mock/gomock" - "github.com/golobby/container/v3" - LoginInfoRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro/logininfo" - UserRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro/user" + "github.com/noobj/go-serverless-services/internal/helpers/helper" mocks "github.com/noobj/go-serverless-services/internal/repositories/mocks" ) @@ -29,6 +27,7 @@ var fakeUserDoc = bson.M{"_id": fakeObjId, "account": "jjj", "password": "$2b$10 var _ = Describe("Login", func() { var fakeRequest events.APIGatewayProxyRequest + invoker := main.Invoker{} if err := godotenv.Load("../../../.env.example"); err != nil { log.Println("No .env file found", err) @@ -40,15 +39,9 @@ var _ = Describe("Login", func() { ctrl := gomock.NewController(GinkgoT()) m := mocks.NewMockIRepository(ctrl) - userRepoMock := UserRepository.UserRepository{IRepository: m} - loginRepoMock := LoginInfoRepository.LoginInfoRepository{IRepository: m} - - container.Singleton(func() UserRepository.UserRepository { - return userRepoMock - }) - container.Singleton(func() LoginInfoRepository.LoginInfoRepository { - return loginRepoMock - }) + if err := helper.BindIocForTesting(m, &invoker); err != nil { + panic(err.Error()) + } fakeSingleResult := mongo.NewSingleResultFromDocument(fakeUserDoc, nil, nil) fakeInsertOneResult := &mongo.InsertOneResult{InsertedID: 123} @@ -70,7 +63,7 @@ var _ = Describe("Login", func() { mw.Close() fakeRequest.Body = buf.String() - res, err := main.Handler(context.TODO(), fakeRequest) + res, err := invoker.Invoke(context.TODO(), fakeRequest) header := res.Cookies Expect(err).To(BeNil()) @@ -89,7 +82,7 @@ var _ = Describe("Login", func() { mw.Close() fakeRequest.Body = buf.String() - res, err := main.Handler(context.TODO(), fakeRequest) + res, err := invoker.Invoke(context.TODO(), fakeRequest) Expect(err).To(BeNil()) Expect(res.StatusCode).To(Equal(statusCode)) Expect(res.Body).Should(Equal(body)) diff --git a/cmd/ahorro/login/main.go b/cmd/ahorro/login/main.go index 5e19e25..abbd1cf 100644 --- a/cmd/ahorro/login/main.go +++ b/cmd/ahorro/login/main.go @@ -9,7 +9,6 @@ import ( "github.com/aws/aws-lambda-go/events" "github.com/aws/aws-lambda-go/lambda" - "github.com/golobby/container/v3" "github.com/noobj/go-serverless-services/internal/config" "github.com/noobj/go-serverless-services/internal/helpers/helper" bindioc "github.com/noobj/go-serverless-services/internal/middleware/bind-ioc" @@ -26,20 +25,21 @@ type LoginDto struct { Password string } -func insertNewRefreshTokenIntoLoginInfo(userId primitive.ObjectID, refreshToken string) { +func (this *Invoker) insertNewRefreshTokenIntoLoginInfo(userId primitive.ObjectID, refreshToken string) { loginInfo := LoginInfoRepository.LoginInfo{ User: userId, RefreshToken: refreshToken, CreatedAt: primitive.NewDateTimeFromTime(time.Now()), } - var loginInfoRepository LoginInfoRepository.LoginInfoRepository - container.Resolve(&loginInfoRepository) - loginInfoRepository.InsertOne(context.TODO(), loginInfo) + this.loginInfoRepository.InsertOne(context.TODO(), loginInfo) } -func Handler(ctx context.Context, request events.APIGatewayProxyRequest) (events.APIGatewayV2HTTPResponse, error) { - var userRepository UserRepository.UserRepository - container.Resolve(&userRepository) +type Invoker struct { + userRepository UserRepository.UserRepository `container:"type"` + loginInfoRepository LoginInfoRepository.LoginInfoRepository `container:"type"` +} + +func (this *Invoker) Invoke(ctx context.Context, request events.APIGatewayProxyRequest) (events.APIGatewayV2HTTPResponse, error) { var requestBody LoginDto formData, err := helper.ParseMultipartForm(request.Headers["content-type"], strings.NewReader(request.Body), request.IsBase64Encoded) @@ -54,7 +54,7 @@ func Handler(ctx context.Context, request events.APIGatewayProxyRequest) (events } var user UserRepository.User - err = userRepository.FindOne(context.TODO(), bson.M{"account": requestBody.Account}).Decode(&user) + err = this.userRepository.FindOne(context.TODO(), bson.M{"account": requestBody.Account}).Decode(&user) if err != nil { log.Println(err) return events.APIGatewayV2HTTPResponse{Body: "couldn't find the user", StatusCode: 404}, nil @@ -78,7 +78,7 @@ func Handler(ctx context.Context, request events.APIGatewayProxyRequest) (events return events.APIGatewayV2HTTPResponse{Body: "internal error", StatusCode: 500}, nil } - insertNewRefreshTokenIntoLoginInfo(user.Id, refreshToken) + this.insertNewRefreshTokenIntoLoginInfo(user.Id, refreshToken) resp := events.APIGatewayV2HTTPResponse{ StatusCode: 200, @@ -118,5 +118,7 @@ func Handler(ctx context.Context, request events.APIGatewayProxyRequest) (events func main() { defer mongodb.Disconnect()() - lambda.Start(bindioc.Handle(Handler)) + invoker := Invoker{} + + lambda.Start(bindioc.Handle(invoker.Invoke, &invoker)) } diff --git a/cmd/ahorro/refresh/main.go b/cmd/ahorro/refresh/main.go index bf20ac5..2f9de5d 100644 --- a/cmd/ahorro/refresh/main.go +++ b/cmd/ahorro/refresh/main.go @@ -9,7 +9,6 @@ import ( "github.com/aws/aws-lambda-go/events" "github.com/aws/aws-lambda-go/lambda" - "github.com/golobby/container/v3" "github.com/noobj/go-serverless-services/internal/config" "github.com/noobj/go-serverless-services/internal/helpers/helper" bindioc "github.com/noobj/go-serverless-services/internal/middleware/bind-ioc" @@ -25,9 +24,11 @@ type LoginDto struct { var errorHandler = helper.GenerateErrorResponse[events.APIGatewayV2HTTPResponse] -func Handler(ctx context.Context, request events.APIGatewayV2HTTPRequest) (events.APIGatewayV2HTTPResponse, error) { - var loginInfoRepository LoginInfoRepository.LoginInfoRepository - container.Resolve(&loginInfoRepository) +type Invoker struct { + loginInfoRepository LoginInfoRepository.LoginInfoRepository `container:"type"` +} + +func (this *Invoker) Invoke(ctx context.Context, request events.APIGatewayV2HTTPRequest) (events.APIGatewayV2HTTPResponse, error) { cookiesMap := helper.ParseCookie(request.Cookies) if _, ok := cookiesMap["refresh_token"]; !ok { @@ -47,7 +48,7 @@ func Handler(ctx context.Context, request events.APIGatewayV2HTTPRequest) (event } var loginInfo LoginInfoRepository.LoginInfo - loginInfoRepository.FindOne(context.TODO(), bson.M{"refreshToken": cookiesMap["refresh_token"]}).Decode(&loginInfo) + this.loginInfoRepository.FindOne(context.TODO(), bson.M{"refreshToken": cookiesMap["refresh_token"]}).Decode(&loginInfo) if loginInfo.User.Hex() != userId { fmt.Println("Didn't match or find the loginInfo user", loginInfo.User.Hex(), userId) @@ -86,5 +87,7 @@ func Handler(ctx context.Context, request events.APIGatewayV2HTTPRequest) (event func main() { defer mongodb.Disconnect()() - lambda.Start(bindioc.Handle(Handler)) + invoker := Invoker{} + + lambda.Start(bindioc.Handle(invoker.Invoke, &invoker)) } diff --git a/cmd/ahorro/refresh/refresh_test.go b/cmd/ahorro/refresh/refresh_test.go index 41907f3..848e40a 100644 --- a/cmd/ahorro/refresh/refresh_test.go +++ b/cmd/ahorro/refresh/refresh_test.go @@ -8,10 +8,9 @@ import ( "github.com/aws/aws-lambda-go/events" "github.com/golang/mock/gomock" - "github.com/golobby/container/v3" "github.com/joho/godotenv" main "github.com/noobj/go-serverless-services/cmd/ahorro/refresh" - LoginInfoRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro/logininfo" + "github.com/noobj/go-serverless-services/internal/helpers/helper" mockRepo "github.com/noobj/go-serverless-services/internal/repositories/mocks" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" @@ -27,16 +26,16 @@ var _ = Describe("Refresh", func() { log.Println("No .env file found", err) } var fakeRequest events.APIGatewayV2HTTPRequest + invoker := main.Invoker{} BeforeEach(func() { fakeRequest = events.APIGatewayV2HTTPRequest{} ctrl := gomock.NewController(GinkgoT()) m := mockRepo.NewMockIRepository(ctrl) - loginRepoMock := LoginInfoRepository.LoginInfoRepository{IRepository: m} - container.Singleton(func() LoginInfoRepository.LoginInfoRepository { - return loginRepoMock - }) + if err := helper.BindIocForTesting(m, &invoker); err != nil { + panic(err.Error()) + } fakeLoginInfoDoc := bson.M{ "_id": fakeObjId, @@ -58,7 +57,7 @@ var _ = Describe("Refresh", func() { "refresh_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwYXlsb2FkIjoiNjJiYWRjODJkNDIwMjcwMDA5YTUxMDE5In0.e5WtrcxJx0w2J6xTLzOSa6TJdR33PN9hdiipazfKmiY", } - res, err := main.Handler(context.TODO(), fakeRequest) + res, err := invoker.Invoke(context.TODO(), fakeRequest) header := res.Cookies Expect(err).To(BeNil()) @@ -74,7 +73,7 @@ var _ = Describe("Refresh", func() { tokenString, } - res, err := main.Handler(context.TODO(), fakeRequest) + res, err := invoker.Invoke(context.TODO(), fakeRequest) Expect(err).To(BeNil()) Expect(res.StatusCode).To(Equal(401)) }, diff --git a/cmd/ahorro/sync/callback/main.go b/cmd/ahorro/sync/callback/main.go index c61be75..1bb9b56 100644 --- a/cmd/ahorro/sync/callback/main.go +++ b/cmd/ahorro/sync/callback/main.go @@ -10,7 +10,6 @@ import ( "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/dynamodb" - "github.com/golobby/container/v3" "github.com/noobj/go-serverless-services/internal/config" "github.com/noobj/go-serverless-services/internal/helpers/helper" bindioc "github.com/noobj/go-serverless-services/internal/middleware/bind-ioc" @@ -29,10 +28,11 @@ var internalErrorhandler = func() (events.APIGatewayProxyResponse, error) { return helper.GenerateErrorResponse[events.APIGatewayProxyResponse](500) } -func Handler(ctx context.Context, request events.APIGatewayV2HTTPRequest) (events.APIGatewayProxyResponse, error) { - var userRepository UserRepository.UserRepository - container.Resolve(&userRepository) +type Invoker struct { + userRepository UserRepository.UserRepository `container:"type"` +} +func (this *Invoker) Invoke(ctx context.Context, request events.APIGatewayV2HTTPRequest) (events.APIGatewayProxyResponse, error) { user, ok := helper.GetUserFromContext(ctx) if !ok { return authErrorhandler() @@ -76,7 +76,7 @@ func Handler(ctx context.Context, request events.APIGatewayV2HTTPRequest) (event return internalErrorhandler() } - _, err = userRepository.UpdateOne(context.TODO(), bson.M{"account": user.Account}, bson.M{"$set": bson.M{"googleAccessToken": token.AccessToken, "googleRefreshToken": token.RefreshToken}}) + _, err = this.userRepository.UpdateOne(context.TODO(), bson.M{"account": user.Account}, bson.M{"$set": bson.M{"googleAccessToken": token.AccessToken, "googleRefreshToken": token.RefreshToken}}) if err != nil { log.Println("update error", err) return internalErrorhandler() @@ -93,5 +93,7 @@ func Handler(ctx context.Context, request events.APIGatewayV2HTTPRequest) (event func main() { defer mongodb.Disconnect()() - lambda.Start(jwtMiddleWare.Handle(bindioc.Handle(Handler))) + invoker := Invoker{} + + lambda.Start(jwtMiddleWare.Handle(bindioc.Handle(invoker.Invoke, &invoker))) } diff --git a/cmd/ahorro/sync/handler/main.go b/cmd/ahorro/sync/handler/main.go index bf12b23..1546ac3 100644 --- a/cmd/ahorro/sync/handler/main.go +++ b/cmd/ahorro/sync/handler/main.go @@ -13,7 +13,6 @@ import ( "github.com/aws/aws-lambda-go/events" "github.com/aws/aws-lambda-go/lambda" - "github.com/golobby/container/v3" "github.com/mitchellh/mapstructure" "github.com/noobj/go-serverless-services/internal/helpers/helper" bindioc "github.com/noobj/go-serverless-services/internal/middleware/bind-ioc" @@ -58,14 +57,13 @@ var internalErrorhandler = func(taskId string, message ...string) (events.APIGat return helper.GenerateErrorResponse[events.APIGatewayProxyResponse](500, message...) } -func Handler(ctx context.Context, event events.SQSEvent) (events.APIGatewayProxyResponse, error) { - var entryRepository EntryRepository.EntryRepository - container.Resolve(&entryRepository) - var userRepository UserRepository.UserRepository - container.Resolve(&userRepository) - var categoryRepository CategoryRepository.CategoryRepository - container.Resolve(&categoryRepository) +type Invoker struct { + userRepository UserRepository.UserRepository `container:"type"` + entryRepository EntryRepository.EntryRepository `container:"type"` + categoryRepository CategoryRepository.CategoryRepository `container:"type"` +} +func (this *Invoker) Invoke(ctx context.Context, event events.SQSEvent) (events.APIGatewayProxyResponse, error) { for _, record := range event.Records { userId := *record.MessageAttributes["UserId"].StringValue taskId := *record.MessageAttributes["TaskId"].StringValue @@ -73,7 +71,7 @@ func Handler(ctx context.Context, event events.SQSEvent) (events.APIGatewayProxy log.Printf("Start Syncing task %s", taskId) var user UserRepository.User userObjectId, _ := primitive.ObjectIDFromHex(userId) - err := userRepository.FindOne(context.TODO(), bson.M{"_id": userObjectId}).Decode(&user) + err := this.userRepository.FindOne(context.TODO(), bson.M{"_id": userObjectId}).Decode(&user) if err != nil { log.Println(err) return internalErrorhandler(taskId, "error: user not found") @@ -147,23 +145,23 @@ func Handler(ctx context.Context, event events.SQSEvent) (events.APIGatewayProxy return err } - _, err = categoryRepository.DeleteMany(sc, bson.M{"user": userObjectId}) + _, err = this.categoryRepository.DeleteMany(sc, bson.M{"user": userObjectId}) if err != nil { return err } categoriesForInsert, newCategoryIdMap := collateCategoryItems(categoryItems, userObjectId) - if _, err = categoryRepository.InsertMany(sc, categoriesForInsert); err != nil { + if _, err = this.categoryRepository.InsertMany(sc, categoriesForInsert); err != nil { return err } - if _, err = entryRepository.DeleteMany(sc, bson.M{"user": userObjectId}); err != nil { + if _, err = this.entryRepository.DeleteMany(sc, bson.M{"user": userObjectId}); err != nil { return err } entriesForInsert := collateEntryItems(entryItems, newCategoryIdMap, userObjectId) - _, err = entryRepository.InsertMany(sc, entriesForInsert) + _, err = this.entryRepository.InsertMany(sc, entriesForInsert) if err != nil { return err @@ -239,5 +237,7 @@ func collateEntryItems(entryItems []EntryItem, cateIdMap map[string]primitive.Ob func main() { defer mongodb.Disconnect()() - lambda.Start(jwtMiddleWare.Handle(bindioc.Handle(Handler))) + invoker := Invoker{} + + lambda.Start(jwtMiddleWare.Handle(bindioc.Handle(invoker.Invoke, &invoker))) } diff --git a/internal/helpers/helper/test.go b/internal/helpers/helper/test.go new file mode 100644 index 0000000..122434d --- /dev/null +++ b/internal/helpers/helper/test.go @@ -0,0 +1,49 @@ +package helper + +import ( + "errors" + "fmt" + "reflect" + + "github.com/golobby/container/v3" + CategoryRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro/category" + EntryRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro/entry" + LoginInfoRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro/logininfo" + UserRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro/user" + . "github.com/noobj/go-serverless-services/internal/repositories/mocks" +) + +func BindIocForTesting(mock *MockIRepository, invoker interface{}) error { + receiverType := reflect.TypeOf(invoker) + if receiverType == nil || receiverType.Kind() != reflect.Ptr { + return errors.New("container: invalid invoker type") + } + + fakeEntry := EntryRepository.EntryRepository{IRepository: mock} + fakeUser := UserRepository.UserRepository{IRepository: mock} + fakeLogin := LoginInfoRepository.LoginInfoRepository{IRepository: mock} + fakeCategory := CategoryRepository.CategoryRepository{IRepository: mock} + + container.SingletonLazy(func() UserRepository.UserRepository { + return fakeUser + }) + + container.SingletonLazy(func() LoginInfoRepository.LoginInfoRepository { + return fakeLogin + }) + + container.SingletonLazy(func() CategoryRepository.CategoryRepository { + return fakeCategory + }) + + container.SingletonLazy(func() EntryRepository.EntryRepository { + return fakeEntry + }) + + err := container.Fill(invoker) + if err != nil { + return fmt.Errorf("couldn't resolve the invoker") + } + + return nil +} diff --git a/internal/middleware/bind-ioc/bind-ioc.middleware.go b/internal/middleware/bind-ioc/bind-ioc.middleware.go index 3d73828..95b08ef 100644 --- a/internal/middleware/bind-ioc/bind-ioc.middleware.go +++ b/internal/middleware/bind-ioc/bind-ioc.middleware.go @@ -2,20 +2,29 @@ package bindioc import ( "context" + "log" + "reflect" "github.com/golobby/container/v3" // TODO: use internal types instead "github.com/noobj/jwtmiddleware/types" + "github.com/noobj/go-serverless-services/internal/helpers/helper" CategoryRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro/category" EntryRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro/entry" LoginInfoRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro/logininfo" UserRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro/user" ) -func Handle[T types.ApiRequest, R types.ApiResponse](next types.HandlerFunc[T, R]) types.HandlerFunc[T, R] { +func Handle[T types.ApiRequest, R types.ApiResponse](next types.HandlerFunc[T, R], invoker interface{}) types.HandlerFunc[T, R] { return func(ctx context.Context, request T) (R, error) { + receiverType := reflect.TypeOf(invoker) + if receiverType == nil || receiverType.Kind() == reflect.Ptr { + log.Println("container: invalid invoker type") + return helper.GenerateErrorResponse[R](500) + } + container.SingletonLazy(func() UserRepository.UserRepository { return *UserRepository.New() }) @@ -32,6 +41,12 @@ func Handle[T types.ApiRequest, R types.ApiResponse](next types.HandlerFunc[T, R return *EntryRepository.New() }) + err := container.Fill(invoker) + if err != nil { + log.Println("Couldn't resolve the invoker") + return helper.GenerateErrorResponse[R](500) + } + return next(ctx, request) } } diff --git a/internal/repositories/ahorro/category/category_repository.go b/internal/repositories/ahorro/category/category_repository.go index eb7f5d3..a1c1cab 100644 --- a/internal/repositories/ahorro/category/category_repository.go +++ b/internal/repositories/ahorro/category/category_repository.go @@ -14,18 +14,15 @@ type Category struct { } type CategoryRepository struct { - repositories.AbstractRepository + repositories.IRepository } func New() *CategoryRepository { - abstractRepository := repositories.AbstractRepository{ - BaseRepository: repositories.BaseRepository{ - Client: mongodb.GetInstance(), - Collection: mongodb.GetInstance().Database("ahorro").Collection("categories"), - }, + baseRepository := repositories.BaseRepository{ + Client: mongodb.GetInstance(), + Collection: mongodb.GetInstance().Database("ahorro").Collection("categories"), } - repo := CategoryRepository{AbstractRepository: abstractRepository} - repo.IRepository = abstractRepository + repo := CategoryRepository{IRepository: baseRepository} return &repo } From 6cf4f48efb262414d6f3fdc00ee47ca516248410 Mon Sep 17 00:00:00 2001 From: noobj Date: Sun, 5 Feb 2023 13:11:32 +0800 Subject: [PATCH 09/13] build: fix build failed --- .github/workflows/go.yml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index a329695..8cdc3db 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -41,7 +41,7 @@ jobs: env: COVERALLS_TOKEN: ${{ secrets.COVERALLS }} run: goveralls -coverprofile=coverprofile.out - + - name: Set flag to failed if: failure() id: set-flag @@ -57,10 +57,13 @@ jobs: uses: actions/setup-go@v3 with: go-version: 1.18 - + + - name: Generate Mocks + run: go generate -x ./... + - name: Build run: go build -v ./... - + - name: Set flag to failed if: failure() id: set-flag From 54299405003f9e63f4fec41d6cbcca0731c19b69 Mon Sep 17 00:00:00 2001 From: noobj Date: Sun, 5 Feb 2023 13:14:22 +0800 Subject: [PATCH 10/13] build: fix build failed --- .github/workflows/go.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 8cdc3db..c5e8bf8 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -58,6 +58,11 @@ jobs: with: go-version: 1.18 + - name: Install tools + run: | + go get github.com/golang/mock/mockgen@v1.6.0 + go install github.com/golang/mock/mockgen + - name: Generate Mocks run: go generate -x ./... From be06028544d5f28a9f38195739c73a7b352b3096 Mon Sep 17 00:00:00 2001 From: noobj Date: Mon, 6 Feb 2023 14:41:25 +0800 Subject: [PATCH 11/13] build: add go get mongo/driver/ocsp --- .github/workflows/go.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index c5e8bf8..5befbd5 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -61,6 +61,7 @@ jobs: - name: Install tools run: | go get github.com/golang/mock/mockgen@v1.6.0 + go get go.mongodb.org/mongo-driver/x/mongo/driver/ocsp@v1.9.1 go install github.com/golang/mock/mockgen - name: Generate Mocks From e50b42ccf1c3e218fbc33f479d9dbf5aa646b525 Mon Sep 17 00:00:00 2001 From: noobj Date: Mon, 6 Feb 2023 15:10:15 +0800 Subject: [PATCH 12/13] refactor: remove client in BaseRepository --- internal/repositories/abstract_repository.go | 55 ------------------- .../ahorro/category/category_repository.go | 1 - .../ahorro/entry/entry_repository.go | 1 - .../ahorro/logininfo/logininfo_repository.go | 1 - .../ahorro/user/user_repository.go | 1 - internal/repositories/repository.go | 3 +- .../repositories/swim/entry/repository.go | 12 ++-- 7 files changed, 5 insertions(+), 69 deletions(-) delete mode 100644 internal/repositories/abstract_repository.go diff --git a/internal/repositories/abstract_repository.go b/internal/repositories/abstract_repository.go deleted file mode 100644 index 25a5730..0000000 --- a/internal/repositories/abstract_repository.go +++ /dev/null @@ -1,55 +0,0 @@ -package repositories - -import ( - "context" - - "go.mongodb.org/mongo-driver/bson" - "go.mongodb.org/mongo-driver/mongo" - "go.mongodb.org/mongo-driver/mongo/options" -) - -type AbstractRepository struct { - BaseRepository - IRepository -} - -func (repo AbstractRepository) InsertOne(ctx context.Context, document interface{}, opts ...*options.InsertOneOptions) (*mongo.InsertOneResult, error) { - return repo.Collection.InsertOne(context.TODO(), document, opts...) -} - -func (repo AbstractRepository) Disconnect() func() { - return func() { - if err := repo.Client.Disconnect(context.TODO()); err != nil { - panic(err) - } - } -} - -func (repo AbstractRepository) Aggregate(stages interface{}) []bson.M { - cursor, err := repo.Collection.Aggregate(context.TODO(), stages) - if err != nil { - panic(err) - } - - var results []bson.M - - if err = cursor.All(context.TODO(), &results); err != nil { - panic(err) - } - - return results -} - -func (repo AbstractRepository) FindOne(ctx context.Context, filter interface{}, opts ...*options.FindOneOptions) *mongo.SingleResult { - return repo.Collection.FindOne(ctx, filter, opts...) -} - -func (repo AbstractRepository) DeleteMany(ctx context.Context, filter interface{}, - opts ...*options.DeleteOptions) (*mongo.DeleteResult, error) { - return repo.Collection.DeleteMany(ctx, filter, opts...) -} - -func (repo AbstractRepository) InsertMany(ctx context.Context, documents []interface{}, - opts ...*options.InsertManyOptions) (*mongo.InsertManyResult, error) { - return repo.Collection.InsertMany(ctx, documents, opts...) -} diff --git a/internal/repositories/ahorro/category/category_repository.go b/internal/repositories/ahorro/category/category_repository.go index a1c1cab..cba0360 100644 --- a/internal/repositories/ahorro/category/category_repository.go +++ b/internal/repositories/ahorro/category/category_repository.go @@ -19,7 +19,6 @@ type CategoryRepository struct { func New() *CategoryRepository { baseRepository := repositories.BaseRepository{ - Client: mongodb.GetInstance(), Collection: mongodb.GetInstance().Database("ahorro").Collection("categories"), } repo := CategoryRepository{IRepository: baseRepository} diff --git a/internal/repositories/ahorro/entry/entry_repository.go b/internal/repositories/ahorro/entry/entry_repository.go index 548fef5..43cd69f 100644 --- a/internal/repositories/ahorro/entry/entry_repository.go +++ b/internal/repositories/ahorro/entry/entry_repository.go @@ -30,7 +30,6 @@ type EntryRepository struct { func New() *EntryRepository { baseRepository := BaseRepository{ - Client: mongodb.GetInstance(), Collection: mongodb.GetInstance().Database("ahorro").Collection("entries"), } repo := EntryRepository{IRepository: baseRepository} diff --git a/internal/repositories/ahorro/logininfo/logininfo_repository.go b/internal/repositories/ahorro/logininfo/logininfo_repository.go index dc6a1d0..06bbdea 100644 --- a/internal/repositories/ahorro/logininfo/logininfo_repository.go +++ b/internal/repositories/ahorro/logininfo/logininfo_repository.go @@ -19,7 +19,6 @@ type LoginInfoRepository struct { func New() *LoginInfoRepository { baseRepository := BaseRepository{ - Client: mongodb.GetInstance(), Collection: mongodb.GetInstance().Database("ahorro").Collection("loginInfos"), } repo := LoginInfoRepository{IRepository: baseRepository} diff --git a/internal/repositories/ahorro/user/user_repository.go b/internal/repositories/ahorro/user/user_repository.go index a7fadd0..4030a67 100644 --- a/internal/repositories/ahorro/user/user_repository.go +++ b/internal/repositories/ahorro/user/user_repository.go @@ -31,7 +31,6 @@ type IUserRepository interface { func New() *UserRepository { baseRepository := repositories.BaseRepository{ - Client: mongodb.GetInstance(), Collection: mongodb.GetInstance().Database("ahorro").Collection("users"), } repo := UserRepository{IRepository: baseRepository} diff --git a/internal/repositories/repository.go b/internal/repositories/repository.go index 6291831..a552cd0 100644 --- a/internal/repositories/repository.go +++ b/internal/repositories/repository.go @@ -20,7 +20,6 @@ type IRepository interface { } type BaseRepository struct { - Client *mongo.Client Collection *mongo.Collection } @@ -30,7 +29,7 @@ func (repo BaseRepository) InsertOne(ctx context.Context, document interface{}, func (repo BaseRepository) Disconnect() func() { return func() { - if err := repo.Client.Disconnect(context.TODO()); err != nil { + if err := repo.Collection.Database().Client().Disconnect(context.TODO()); err != nil { panic(err) } } diff --git a/internal/repositories/swim/entry/repository.go b/internal/repositories/swim/entry/repository.go index 612efe4..a8f5ad3 100644 --- a/internal/repositories/swim/entry/repository.go +++ b/internal/repositories/swim/entry/repository.go @@ -11,18 +11,14 @@ type Entry struct { } type EntryRepository struct { - AbstractRepository + IRepository } func New() *EntryRepository { - abstractRepository := AbstractRepository{ - BaseRepository: BaseRepository{ - Client: mongodb.GetInstance(), - Collection: mongodb.GetInstance().Database("swimCrowdDB").Collection("entries"), - }, + baseRepository := BaseRepository{ + Collection: mongodb.GetInstance().Database("swimCrowdDB").Collection("entries"), } - repo := EntryRepository{AbstractRepository: abstractRepository} - repo.IRepository = abstractRepository + repo := EntryRepository{IRepository: baseRepository} return &repo } From 588809e60dd018b5b49ea573c8d15ac259d02c09 Mon Sep 17 00:00:00 2001 From: noobj Date: Tue, 7 Feb 2023 18:36:41 +0800 Subject: [PATCH 13/13] bindioc.Handle use only Invoker as parameter --- cmd/ahorro/fetchentries/main.go | 5 ++- cmd/ahorro/login/main.go | 7 ++-- cmd/ahorro/refresh/main.go | 3 +- cmd/ahorro/sync/callback/main.go | 3 +- cmd/ahorro/sync/handler/main.go | 3 +- .../bind-ioc/bind-ioc.middleware.go | 7 ++-- internal/middleware/middleswares-loader.go | 35 +++++++++++++++++++ internal/types/middleware.type.go | 6 ++++ 8 files changed, 53 insertions(+), 16 deletions(-) create mode 100644 internal/middleware/middleswares-loader.go diff --git a/cmd/ahorro/fetchentries/main.go b/cmd/ahorro/fetchentries/main.go index 68a39e2..b192b32 100644 --- a/cmd/ahorro/fetchentries/main.go +++ b/cmd/ahorro/fetchentries/main.go @@ -50,7 +50,7 @@ type Invoker struct { entryRepository EntryRepository.EntryRepository `container:"type"` } -func (this *Invoker) Invoke(ctx context.Context, request events.APIGatewayV2HTTPRequest) (events.APIGatewayProxyResponse, error) { +func (this Invoker) Invoke(ctx context.Context, request events.APIGatewayV2HTTPRequest) (events.APIGatewayProxyResponse, error) { user, ok := helper.GetUserFromContext(ctx) if !ok { return events.APIGatewayProxyResponse{Body: "please login in", StatusCode: 401}, nil @@ -173,7 +173,6 @@ func (this *Invoker) Invoke(ctx context.Context, request events.APIGatewayV2HTTP func main() { defer mongodb.Disconnect()() - invoker := Invoker{} - lambda.Start(jwtMiddleWare.Handle(bindioc.Handle(invoker.Invoke, &invoker))) + lambda.Start(jwtMiddleWare.Handle(bindioc.Handle[events.APIGatewayV2HTTPRequest, events.APIGatewayProxyResponse](&Invoker{}))) } diff --git a/cmd/ahorro/login/main.go b/cmd/ahorro/login/main.go index abbd1cf..3676272 100644 --- a/cmd/ahorro/login/main.go +++ b/cmd/ahorro/login/main.go @@ -25,7 +25,7 @@ type LoginDto struct { Password string } -func (this *Invoker) insertNewRefreshTokenIntoLoginInfo(userId primitive.ObjectID, refreshToken string) { +func (this Invoker) insertNewRefreshTokenIntoLoginInfo(userId primitive.ObjectID, refreshToken string) { loginInfo := LoginInfoRepository.LoginInfo{ User: userId, RefreshToken: refreshToken, @@ -39,7 +39,7 @@ type Invoker struct { loginInfoRepository LoginInfoRepository.LoginInfoRepository `container:"type"` } -func (this *Invoker) Invoke(ctx context.Context, request events.APIGatewayProxyRequest) (events.APIGatewayV2HTTPResponse, error) { +func (this Invoker) Invoke(ctx context.Context, request events.APIGatewayProxyRequest) (events.APIGatewayV2HTTPResponse, error) { var requestBody LoginDto formData, err := helper.ParseMultipartForm(request.Headers["content-type"], strings.NewReader(request.Body), request.IsBase64Encoded) @@ -118,7 +118,6 @@ func (this *Invoker) Invoke(ctx context.Context, request events.APIGatewayProxyR func main() { defer mongodb.Disconnect()() - invoker := Invoker{} - lambda.Start(bindioc.Handle(invoker.Invoke, &invoker)) + lambda.Start(bindioc.Handle[events.APIGatewayProxyRequest, events.APIGatewayV2HTTPResponse](&Invoker{})) } diff --git a/cmd/ahorro/refresh/main.go b/cmd/ahorro/refresh/main.go index 2f9de5d..957a84d 100644 --- a/cmd/ahorro/refresh/main.go +++ b/cmd/ahorro/refresh/main.go @@ -87,7 +87,6 @@ func (this *Invoker) Invoke(ctx context.Context, request events.APIGatewayV2HTTP func main() { defer mongodb.Disconnect()() - invoker := Invoker{} - lambda.Start(bindioc.Handle(invoker.Invoke, &invoker)) + lambda.Start(bindioc.Handle[events.APIGatewayV2HTTPRequest, events.APIGatewayV2HTTPResponse](&Invoker{})) } diff --git a/cmd/ahorro/sync/callback/main.go b/cmd/ahorro/sync/callback/main.go index 1bb9b56..823e313 100644 --- a/cmd/ahorro/sync/callback/main.go +++ b/cmd/ahorro/sync/callback/main.go @@ -93,7 +93,6 @@ func (this *Invoker) Invoke(ctx context.Context, request events.APIGatewayV2HTTP func main() { defer mongodb.Disconnect()() - invoker := Invoker{} - lambda.Start(jwtMiddleWare.Handle(bindioc.Handle(invoker.Invoke, &invoker))) + lambda.Start(jwtMiddleWare.Handle(bindioc.Handle[events.APIGatewayV2HTTPRequest, events.APIGatewayProxyResponse](&Invoker{}))) } diff --git a/cmd/ahorro/sync/handler/main.go b/cmd/ahorro/sync/handler/main.go index 1546ac3..4b7a027 100644 --- a/cmd/ahorro/sync/handler/main.go +++ b/cmd/ahorro/sync/handler/main.go @@ -237,7 +237,6 @@ func collateEntryItems(entryItems []EntryItem, cateIdMap map[string]primitive.Ob func main() { defer mongodb.Disconnect()() - invoker := Invoker{} - lambda.Start(jwtMiddleWare.Handle(bindioc.Handle(invoker.Invoke, &invoker))) + lambda.Start(jwtMiddleWare.Handle(bindioc.Handle[events.SQSEvent, events.APIGatewayProxyResponse](&Invoker{}))) } diff --git a/internal/middleware/bind-ioc/bind-ioc.middleware.go b/internal/middleware/bind-ioc/bind-ioc.middleware.go index 95b08ef..4b257d8 100644 --- a/internal/middleware/bind-ioc/bind-ioc.middleware.go +++ b/internal/middleware/bind-ioc/bind-ioc.middleware.go @@ -8,6 +8,7 @@ import ( "github.com/golobby/container/v3" // TODO: use internal types instead + typesInternal "github.com/noobj/go-serverless-services/internal/types" "github.com/noobj/jwtmiddleware/types" "github.com/noobj/go-serverless-services/internal/helpers/helper" @@ -17,10 +18,10 @@ import ( UserRepository "github.com/noobj/go-serverless-services/internal/repositories/ahorro/user" ) -func Handle[T types.ApiRequest, R types.ApiResponse](next types.HandlerFunc[T, R], invoker interface{}) types.HandlerFunc[T, R] { +func Handle[T types.ApiRequest, R types.ApiResponse](invoker typesInternal.IIvoker[T, R]) types.HandlerFunc[T, R] { return func(ctx context.Context, request T) (R, error) { receiverType := reflect.TypeOf(invoker) - if receiverType == nil || receiverType.Kind() == reflect.Ptr { + if receiverType == nil || receiverType.Kind() != reflect.Ptr { log.Println("container: invalid invoker type") return helper.GenerateErrorResponse[R](500) } @@ -47,6 +48,6 @@ func Handle[T types.ApiRequest, R types.ApiResponse](next types.HandlerFunc[T, R return helper.GenerateErrorResponse[R](500) } - return next(ctx, request) + return invoker.Invoke(ctx, request) } } diff --git a/internal/middleware/middleswares-loader.go b/internal/middleware/middleswares-loader.go new file mode 100644 index 0000000..02f5aa2 --- /dev/null +++ b/internal/middleware/middleswares-loader.go @@ -0,0 +1,35 @@ +package middleware + +import ( + "context" + "fmt" + + typesInternal "github.com/noobj/go-serverless-services/internal/types" + "github.com/noobj/jwtmiddleware/types" +) + +type middlewaresFunc[T types.ApiRequest, R types.ApiResponse] func(invoker typesInternal.IIvoker[T, R]) types.HandlerFunc[T, R] + +func fakeMiddlewareFunc[T types.ApiRequest, R types.ApiResponse](invoker typesInternal.IIvoker[T, R]) types.HandlerFunc[T, R] { + return func(ctx context.Context, request T) (R, error) { + fmt.Println("Fake middleware") + return invoker.Invoke(ctx, request) + } +} + +func Bootstrap[T types.ApiRequest, R types.ApiResponse](invoker typesInternal.IIvoker[T, R], middlewareFuncs ...middlewaresFunc[T, R]) types.HandlerFunc[T, R] { + result := func(mFunc middlewaresFunc[T, R]) middlewaresFunc[T, R] { + return func(invoker typesInternal.IIvoker[T, R]) types.HandlerFunc[T, R] { + return mFunc(invoker) + } + } + + for _, middlewareFunc := range middlewareFuncs { + oldResult := result + result = func(mFunc middlewaresFunc[T, R]) middlewaresFunc[T, R] { + return oldResult(middlewareFunc) + } + } + + return result(fakeMiddlewareFunc[T, R])(invoker) +} diff --git a/internal/types/middleware.type.go b/internal/types/middleware.type.go index 5d6bbeb..c4a48ac 100644 --- a/internal/types/middleware.type.go +++ b/internal/types/middleware.type.go @@ -2,7 +2,13 @@ package types import ( "context" + + "github.com/noobj/jwtmiddleware/types" ) // HandlerFunc is a generic JSON Lambda handler used to chain middleware. type HandlerFunc[T ApiRequest, R ApiResponse] func(context.Context, T) (R, error) + +type IIvoker[T types.ApiRequest, R types.ApiResponse] interface { + Invoke(context.Context, T) (R, error) +}