From 1693b2da822aa011f40aa9dea78b4e5546d0553a Mon Sep 17 00:00:00 2001 From: samuelIkoli Date: Fri, 28 Feb 2025 23:56:43 +0100 Subject: [PATCH 1/2] refactor: interfaced superadmin services --- pkg/controller/superadmin/superadmin.go | 21 ++++-- services/superadmin/superadmin.go | 94 +++++++++---------------- 2 files changed, 49 insertions(+), 66 deletions(-) diff --git a/pkg/controller/superadmin/superadmin.go b/pkg/controller/superadmin/superadmin.go index 6113723..4a05efc 100644 --- a/pkg/controller/superadmin/superadmin.go +++ b/pkg/controller/superadmin/superadmin.go @@ -21,7 +21,8 @@ type Controller struct { func (base *Controller) GetRegion(c *gin.Context) { - regionData, err := service.GetRegions(base.Db.Postgresql.DB()) + superAdminService := service.NewSuperAdminService(base.Db.Postgresql.DB()) + regionData, err := superAdminService.GetRegions() if err != nil { rd := utility.BuildErrorResponse(http.StatusBadRequest, "error", err.Error(), nil, nil) c.JSON(http.StatusBadRequest, rd) @@ -35,7 +36,8 @@ func (base *Controller) GetRegion(c *gin.Context) { func (base *Controller) GetTimeZone(c *gin.Context) { - timezoneData, err := service.GetTimeZones(base.Db.Postgresql.DB()) + superAdminService := service.NewSuperAdminService(base.Db.Postgresql.DB()) + timezoneData, err := superAdminService.GetTimeZones() if err != nil { rd := utility.BuildErrorResponse(http.StatusBadRequest, "error", err.Error(), nil, nil) c.JSON(http.StatusBadRequest, rd) @@ -49,7 +51,8 @@ func (base *Controller) GetTimeZone(c *gin.Context) { func (base *Controller) GetLanguage(c *gin.Context) { - languageData, err := service.GetLanguages(base.Db.Postgresql.DB()) + superAdminService := service.NewSuperAdminService(base.Db.Postgresql.DB()) + languageData, err := superAdminService.GetLanguages() if err != nil { rd := utility.BuildErrorResponse(http.StatusBadRequest, "error", err.Error(), nil, nil) c.JSON(http.StatusBadRequest, rd) @@ -81,7 +84,8 @@ func (base *Controller) AddToRegion(c *gin.Context) { return } - err = service.AddToRegion(&req, base.Db.Postgresql.DB()) + superAdminService := service.NewSuperAdminService(base.Db.Postgresql.DB()) + err = superAdminService.AddToRegion(&req) if err != nil { rd := utility.BuildErrorResponse(http.StatusBadRequest, "error", err.Error(), nil, nil) c.JSON(http.StatusBadRequest, rd) @@ -115,7 +119,8 @@ func (base *Controller) AddToTimeZone(c *gin.Context) { return } - err = service.AddToTimeZone(&req, base.Db.Postgresql.DB()) + superAdminService := service.NewSuperAdminService(base.Db.Postgresql.DB()) + err = superAdminService.AddToTimeZone(&req) if err != nil { rd := utility.BuildErrorResponse(http.StatusBadRequest, "error", err.Error(), nil, nil) c.JSON(http.StatusBadRequest, rd) @@ -149,7 +154,8 @@ func (base *Controller) AddToLanguage(c *gin.Context) { return } - err = service.AddToLanguage(&req, base.Db.Postgresql.DB()) + superAdminService := service.NewSuperAdminService(base.Db.Postgresql.DB()) + err = superAdminService.AddToLanguage(&req) if err != nil { rd := utility.BuildErrorResponse(http.StatusBadRequest, "error", err.Error(), nil, nil) c.JSON(http.StatusBadRequest, rd) @@ -184,7 +190,8 @@ func (base *Controller) UpdateTimeZone(c *gin.Context) { return } - respData, code, err := service.UpdateATimeZone(&req, reqID, base.Db.Postgresql.DB()) + superAdminService := service.NewSuperAdminService(base.Db.Postgresql.DB()) + respData, code, err := superAdminService.UpdateATimeZone(&req, reqID) if err != nil { rd := utility.BuildErrorResponse(code, "error", err.Error(), nil, nil) c.JSON(code, rd) diff --git a/services/superadmin/superadmin.go b/services/superadmin/superadmin.go index 6dce649..0068fd0 100644 --- a/services/superadmin/superadmin.go +++ b/services/superadmin/superadmin.go @@ -5,86 +5,62 @@ import ( "github.com/hngprojects/hng_boilerplate_golang_web/inst" "github.com/hngprojects/hng_boilerplate_golang_web/internal/models" + "github.com/hngprojects/hng_boilerplate_golang_web/pkg/repository/storage/database" "gorm.io/gorm" ) -func AddToRegion(region *models.Region, db *gorm.DB) error { - - pdb := inst.InitDB(db) - if err := region.CreateRegion(pdb); err != nil { - return err - } - - return nil +// SuperAdminService defines methods for handling regions, timezones, and languages. +type SuperAdminService interface { + AddToRegion(region *models.Region) error + AddToTimeZone(timezone *models.Timezone) error + AddToLanguage(language *models.Language) error + GetRegions() ([]models.Region, error) + GetTimeZones() ([]models.Timezone, error) + GetLanguages() ([]models.Language, error) + UpdateATimeZone(req *models.Timezone, reqID string) (*models.Timezone, int, error) } -func AddToTimeZone(timezone *models.Timezone, db *gorm.DB) error { - pdb := inst.InitDB(db) - - if err := timezone.CreateTimeZone(pdb); err != nil { - return err - } - - return nil +// superAdminService is the concrete implementation of SuperAdminService. +type superAdminService struct { + db database.DatabaseManager } -func AddToLanguage(language *models.Language, db *gorm.DB) error { +// NewSuperAdminService initializes the service with a database instance. +func NewSuperAdminService(db *gorm.DB) SuperAdminService { + return &superAdminService{db: inst.InitDB(db)} +} - pdb := inst.InitDB(db) - if err := language.CreateLanguage(pdb); err != nil { - return err - } +func (s *superAdminService) AddToRegion(region *models.Region) error { + return region.CreateRegion(s.db) +} - return nil +func (s *superAdminService) AddToTimeZone(timezone *models.Timezone) error { + return timezone.CreateTimeZone(s.db) } -func GetRegions(db *gorm.DB) ([]models.Region, error) { - pdb := inst.InitDB(db) +func (s *superAdminService) AddToLanguage(language *models.Language) error { + return language.CreateLanguage(s.db) +} +func (s *superAdminService) GetRegions() ([]models.Region, error) { var region models.Region - - regionData, err := region.GetRegions(pdb) - if err != nil { - return nil, err - } - - return regionData, nil + return region.GetRegions(s.db) } -func GetTimeZones(db *gorm.DB) ([]models.Timezone, error) { - +func (s *superAdminService) GetTimeZones() ([]models.Timezone, error) { var timezone models.Timezone - - pdb := inst.InitDB(db) - timezoneData, err := timezone.GetTimeZones(pdb) - if err != nil { - return nil, err - } - - return timezoneData, nil + return timezone.GetTimeZones(s.db) } -func GetLanguages(db *gorm.DB) ([]models.Language, error) { - +func (s *superAdminService) GetLanguages() ([]models.Language, error) { var language models.Language - - pdb := inst.InitDB(db) - languageData, err := language.GetLanguages(pdb) - if err != nil { - return nil, err - } - - return languageData, nil + return language.GetLanguages(s.db) } -func UpdateATimeZone(req *models.Timezone, reqID string, db *gorm.DB) (*models.Timezone, int, error) { - - var ( - timezone models.Timezone - ) - pdb := inst.InitDB(db) +func (s *superAdminService) UpdateATimeZone(req *models.Timezone, reqID string) (*models.Timezone, int, error) { + var timezone models.Timezone - timezone, err := timezone.GetTimezoneByID(pdb, reqID) + timezone, err := timezone.GetTimezoneByID(s.db, reqID) if err != nil { return nil, http.StatusNotFound, err } @@ -93,7 +69,7 @@ func UpdateATimeZone(req *models.Timezone, reqID string, db *gorm.DB) (*models.T timezone.GmtOffset = req.GmtOffset timezone.Description = req.Description - if err := timezone.UpdateTimeZone(pdb); err != nil { + if err := timezone.UpdateTimeZone(s.db); err != nil { return nil, http.StatusBadRequest, err } From d9f113139fe180c7738e72fcfd343c2fba89ded8 Mon Sep 17 00:00:00 2001 From: samuelIkoli Date: Sun, 2 Mar 2025 14:45:20 +0100 Subject: [PATCH 2/2] refactor: created a single instance of the superadmin service in the router --- pkg/controller/superadmin/superadmin.go | 29 +++++++++++++------------ pkg/router/superadmin.go | 5 ++++- tests/test_superadmin/base.go | 3 +++ 3 files changed, 22 insertions(+), 15 deletions(-) diff --git a/pkg/controller/superadmin/superadmin.go b/pkg/controller/superadmin/superadmin.go index 4a05efc..24fbb97 100644 --- a/pkg/controller/superadmin/superadmin.go +++ b/pkg/controller/superadmin/superadmin.go @@ -17,12 +17,13 @@ type Controller struct { Validator *validator.Validate Logger *utility.Logger ExtReq request.ExternalRequest + SuperAdminService service.SuperAdminService } func (base *Controller) GetRegion(c *gin.Context) { - superAdminService := service.NewSuperAdminService(base.Db.Postgresql.DB()) - regionData, err := superAdminService.GetRegions() + + regionData, err := base.SuperAdminService.GetRegions() if err != nil { rd := utility.BuildErrorResponse(http.StatusBadRequest, "error", err.Error(), nil, nil) c.JSON(http.StatusBadRequest, rd) @@ -36,8 +37,8 @@ func (base *Controller) GetRegion(c *gin.Context) { func (base *Controller) GetTimeZone(c *gin.Context) { - superAdminService := service.NewSuperAdminService(base.Db.Postgresql.DB()) - timezoneData, err := superAdminService.GetTimeZones() + + timezoneData, err := base.SuperAdminService.GetTimeZones() if err != nil { rd := utility.BuildErrorResponse(http.StatusBadRequest, "error", err.Error(), nil, nil) c.JSON(http.StatusBadRequest, rd) @@ -51,8 +52,8 @@ func (base *Controller) GetTimeZone(c *gin.Context) { func (base *Controller) GetLanguage(c *gin.Context) { - superAdminService := service.NewSuperAdminService(base.Db.Postgresql.DB()) - languageData, err := superAdminService.GetLanguages() + + languageData, err := base.SuperAdminService.GetLanguages() if err != nil { rd := utility.BuildErrorResponse(http.StatusBadRequest, "error", err.Error(), nil, nil) c.JSON(http.StatusBadRequest, rd) @@ -84,8 +85,8 @@ func (base *Controller) AddToRegion(c *gin.Context) { return } - superAdminService := service.NewSuperAdminService(base.Db.Postgresql.DB()) - err = superAdminService.AddToRegion(&req) + + err = base.SuperAdminService.AddToRegion(&req) if err != nil { rd := utility.BuildErrorResponse(http.StatusBadRequest, "error", err.Error(), nil, nil) c.JSON(http.StatusBadRequest, rd) @@ -119,8 +120,8 @@ func (base *Controller) AddToTimeZone(c *gin.Context) { return } - superAdminService := service.NewSuperAdminService(base.Db.Postgresql.DB()) - err = superAdminService.AddToTimeZone(&req) + + err = base.SuperAdminService.AddToTimeZone(&req) if err != nil { rd := utility.BuildErrorResponse(http.StatusBadRequest, "error", err.Error(), nil, nil) c.JSON(http.StatusBadRequest, rd) @@ -154,8 +155,8 @@ func (base *Controller) AddToLanguage(c *gin.Context) { return } - superAdminService := service.NewSuperAdminService(base.Db.Postgresql.DB()) - err = superAdminService.AddToLanguage(&req) + + err = base.SuperAdminService.AddToLanguage(&req) if err != nil { rd := utility.BuildErrorResponse(http.StatusBadRequest, "error", err.Error(), nil, nil) c.JSON(http.StatusBadRequest, rd) @@ -190,8 +191,8 @@ func (base *Controller) UpdateTimeZone(c *gin.Context) { return } - superAdminService := service.NewSuperAdminService(base.Db.Postgresql.DB()) - respData, code, err := superAdminService.UpdateATimeZone(&req, reqID) + + respData, code, err := base.SuperAdminService.UpdateATimeZone(&req, reqID) if err != nil { rd := utility.BuildErrorResponse(code, "error", err.Error(), nil, nil) c.JSON(code, rd) diff --git a/pkg/router/superadmin.go b/pkg/router/superadmin.go index 1215a01..4c52f0c 100644 --- a/pkg/router/superadmin.go +++ b/pkg/router/superadmin.go @@ -10,12 +10,15 @@ import ( "github.com/hngprojects/hng_boilerplate_golang_web/pkg/controller/superadmin" "github.com/hngprojects/hng_boilerplate_golang_web/pkg/middleware" "github.com/hngprojects/hng_boilerplate_golang_web/pkg/repository/storage" + service "github.com/hngprojects/hng_boilerplate_golang_web/services/superadmin" "github.com/hngprojects/hng_boilerplate_golang_web/utility" ) func SuperAdmin(r *gin.Engine, ApiVersion string, validator *validator.Validate, db *storage.Database, logger *utility.Logger) *gin.Engine { extReq := request.ExternalRequest{Logger: logger, Test: false} - superAdmin := superadmin.Controller{Db: db, Validator: validator, Logger: logger, ExtReq: extReq} + + superAdminService := service.NewSuperAdminService(db.Postgresql.DB()) + superAdmin := superadmin.Controller{Db: db, Validator: validator, Logger: logger, ExtReq: extReq, SuperAdminService: superAdminService} superadminUrl := r.Group(fmt.Sprintf("%v", ApiVersion), middleware.Authorize(db.Postgresql.DB(), models.RoleIdentity.SuperAdmin)) userUrl := r.Group(fmt.Sprintf("%v", ApiVersion), middleware.Authorize(db.Postgresql.DB())) diff --git a/tests/test_superadmin/base.go b/tests/test_superadmin/base.go index 5794ffa..5f22f4c 100644 --- a/tests/test_superadmin/base.go +++ b/tests/test_superadmin/base.go @@ -7,6 +7,7 @@ import ( "github.com/hngprojects/hng_boilerplate_golang_web/pkg/controller/superadmin" "github.com/hngprojects/hng_boilerplate_golang_web/pkg/middleware" "github.com/hngprojects/hng_boilerplate_golang_web/pkg/repository/storage" + service "github.com/hngprojects/hng_boilerplate_golang_web/services/superadmin" tst "github.com/hngprojects/hng_boilerplate_golang_web/tests" ) @@ -17,10 +18,12 @@ func SetupSATestRouter() (*gin.Engine, *superadmin.Controller) { db := storage.Connection() validator := validator.New() + superAdminService := service.NewSuperAdminService(db.Postgresql.DB()) saController := &superadmin.Controller{ Db: db, Validator: validator, Logger: logger, + SuperAdminService: superAdminService, } r := gin.Default()