From dcbf8e7a7292e0f5b46ce232f835d5d931fc5a59 Mon Sep 17 00:00:00 2001 From: samuelIkoli Date: Sat, 1 Mar 2025 02:37:39 +0100 Subject: [PATCH 1/2] refactor: interfaced jobpost services --- pkg/controller/jobpost/jobpost.go | 18 +++++++--- services/jobpost/jobpost.go | 57 +++++++++++++++++-------------- 2 files changed, 45 insertions(+), 30 deletions(-) diff --git a/pkg/controller/jobpost/jobpost.go b/pkg/controller/jobpost/jobpost.go index b80bb1e..60789bc 100644 --- a/pkg/controller/jobpost/jobpost.go +++ b/pkg/controller/jobpost/jobpost.go @@ -19,6 +19,7 @@ type Controller struct { Validator *validator.Validate Logger *utility.Logger ExtReq request.ExternalRequest + JobPostService service.JobPostService } func (base *Controller) CreateJobPost(c *gin.Context) { @@ -36,7 +37,9 @@ func (base *Controller) CreateJobPost(c *gin.Context) { return } - respData, err := service.CreateJobPost(req, base.Db.Postgresql.DB()) + jobPostService := service.NewJobPostService(base.Db.Postgresql.DB()) + + respData, err := jobPostService.CreateJobPost(req) if err != nil { rd := utility.BuildErrorResponse(http.StatusInternalServerError, "error", "Failed to create job post", err, nil) c.JSON(http.StatusInternalServerError, rd) @@ -50,7 +53,9 @@ func (base *Controller) CreateJobPost(c *gin.Context) { } func (base *Controller) FetchAllJobPost(c *gin.Context) { - jobPosts, paginationResponse, err := service.GetPaginatedJobPosts(c, base.Db.Postgresql.DB()) + + jobPostService := service.NewJobPostService(base.Db.Postgresql.DB()) + jobPosts, paginationResponse, err := jobPostService.GetPaginatedJobPosts(c) if err != nil { if err == gorm.ErrRecordNotFound { rd := utility.BuildErrorResponse(http.StatusNotFound, "error", "Jobs not found", err, nil) @@ -79,7 +84,8 @@ func (base *Controller) FetchJobPostByID(c *gin.Context) { c.JSON(http.StatusBadRequest, rd) return } - respData, err := service.FetchJobPostByID(base.Db.Postgresql.DB(), id) + jobPostService := service.NewJobPostService(base.Db.Postgresql.DB()) + respData, err := jobPostService.FetchJobPostByID(id) if err != nil { if err == gorm.ErrRecordNotFound { rd := utility.BuildErrorResponse(http.StatusNotFound, "error", "Job post not found", err, nil) @@ -118,7 +124,8 @@ func (base *Controller) UpdateJobPostByID(c *gin.Context) { return } - result, err := service.UpdateJobPost(base.Db.Postgresql.DB(), req, id) + jobPostService := service.NewJobPostService(base.Db.Postgresql.DB()) + result, err := jobPostService.UpdateJobPost(req, id) if err != nil { if err == gorm.ErrRecordNotFound { rd := utility.BuildErrorResponse(http.StatusNotFound, "error", "Job post not found", err, nil) @@ -144,7 +151,8 @@ func (base *Controller) DeleteJobPostByID(c *gin.Context) { return } - err := service.DeleteJobPostByID(base.Db.Postgresql.DB(), id) + jobPostService := service.NewJobPostService(base.Db.Postgresql.DB()) + err := jobPostService.DeleteJobPostByID(id) if err != nil { if err == gorm.ErrRecordNotFound { rd := utility.BuildErrorResponse(http.StatusNotFound, "error", "Job post not found", err, nil) diff --git a/services/jobpost/jobpost.go b/services/jobpost/jobpost.go index edaf57d..75fbf82 100644 --- a/services/jobpost/jobpost.go +++ b/services/jobpost/jobpost.go @@ -9,9 +9,26 @@ import ( "gorm.io/gorm" ) -func CreateJobPost(req models.CreateJobPostModel, db *gorm.DB) (models.JobPost, error) { - // instance of Postgresql db - pdb := inst.InitDB(db) +// JobPostService defines the interface for job post operations +type JobPostService interface { + CreateJobPost(req models.CreateJobPostModel) (models.JobPost, error) + GetPaginatedJobPosts(c *gin.Context) ([]models.JobPostSummary, database.PaginationResponse, error) + FetchJobPostByID(id string) (models.JobPost, error) + UpdateJobPost(jobPost models.JobPost, ID string) (models.JobPost, error) + DeleteJobPostByID(ID string) error +} + +// jobPostService is the concrete implementation of JobPostService +type jobPostService struct { + db *gorm.DB +} + +// NewJobPostService creates a new instance of jobPostService +func NewJobPostService(db *gorm.DB) JobPostService { + return &jobPostService{db: db} +} + +func (s *jobPostService) CreateJobPost(req models.CreateJobPostModel) (models.JobPost, error) { jobpost := models.JobPost{ ID: utility.GenerateUUID(), Title: req.Title, @@ -28,6 +45,7 @@ func CreateJobPost(req models.CreateJobPostModel, db *gorm.DB) (models.JobPost, Qualifications: req.Qualifications, } + pdb := inst.InitDB(s.db) if err := jobpost.CreateJobPost(pdb); err != nil { return models.JobPost{}, err } @@ -35,12 +53,10 @@ func CreateJobPost(req models.CreateJobPostModel, db *gorm.DB) (models.JobPost, return jobpost, nil } -func GetPaginatedJobPosts(c *gin.Context, db *gorm.DB) ([]models.JobPostSummary, database.PaginationResponse, error) { +func (s *jobPostService) GetPaginatedJobPosts(c *gin.Context) ([]models.JobPostSummary, database.PaginationResponse, error) { jobpost := models.JobPost{} - // instance of Postgresql db - pdb := inst.InitDB(db) + pdb := inst.InitDB(s.db) jobPosts, paginationResponse, err := jobpost.FetchAllJobPost(pdb, c) - if err != nil { return nil, paginationResponse, err } @@ -64,21 +80,17 @@ func GetPaginatedJobPosts(c *gin.Context, db *gorm.DB) ([]models.JobPostSummary, return jobPostSummaries, paginationResponse, nil } -func FetchJobPostByID(db *gorm.DB, id string) (models.JobPost, error) { - // instance of Postgresql db - pdb := inst.InitDB(db) - jobpost := models.JobPost{} - jobpost.ID = id - err := jobpost.FetchJobPostByID(pdb) - if err != nil { +func (s *jobPostService) FetchJobPostByID(id string) (models.JobPost, error) { + jobpost := models.JobPost{ID: id} + pdb := inst.InitDB(s.db) + if err := jobpost.FetchJobPostByID(pdb); err != nil { return models.JobPost{}, err } return jobpost, nil } -func UpdateJobPost(db *gorm.DB, jobPost models.JobPost, ID string) (models.JobPost, error) { - // instance of Postgresql db - pdb := inst.InitDB(db) +func (s *jobPostService) UpdateJobPost(jobPost models.JobPost, ID string) (models.JobPost, error) { + pdb := inst.InitDB(s.db) updatedJobPost, err := jobPost.UpdateJobPostByID(pdb, ID) if err != nil { return models.JobPost{}, err @@ -86,13 +98,8 @@ func UpdateJobPost(db *gorm.DB, jobPost models.JobPost, ID string) (models.JobPo return updatedJobPost, nil } -func DeleteJobPostByID(db *gorm.DB, ID string) error { +func (s *jobPostService) DeleteJobPostByID(ID string) error { jobPost := models.JobPost{ID: ID} - // instance of Postgresql db - pdb := inst.InitDB(db) - err := jobPost.DeleteJobPostByID(pdb, ID) - if err != nil { - return err - } - return nil + pdb := inst.InitDB(s.db) + return jobPost.DeleteJobPostByID(pdb, ID) } From abe3dc4554c83f6f0472731d6cf6e0448e8f285d Mon Sep 17 00:00:00 2001 From: samuelIkoli Date: Sun, 2 Mar 2025 16:14:29 +0100 Subject: [PATCH 2/2] refactor: instantiated jobPostService once in router and adjusted tests --- pkg/controller/jobpost/jobpost.go | 24 ++++++++++++------------ pkg/router/jobpost.go | 4 +++- tests/test_jobpost/jobpost_test.go | 16 +++++++++++----- 3 files changed, 26 insertions(+), 18 deletions(-) diff --git a/pkg/controller/jobpost/jobpost.go b/pkg/controller/jobpost/jobpost.go index 60789bc..f2c1ff7 100644 --- a/pkg/controller/jobpost/jobpost.go +++ b/pkg/controller/jobpost/jobpost.go @@ -9,7 +9,7 @@ import ( "github.com/hngprojects/hng_boilerplate_golang_web/external/request" "github.com/hngprojects/hng_boilerplate_golang_web/internal/models" "github.com/hngprojects/hng_boilerplate_golang_web/pkg/repository/storage" - service "github.com/hngprojects/hng_boilerplate_golang_web/services/jobpost" + jobPostServices "github.com/hngprojects/hng_boilerplate_golang_web/services/jobpost" "github.com/hngprojects/hng_boilerplate_golang_web/utility" "gorm.io/gorm" ) @@ -19,7 +19,7 @@ type Controller struct { Validator *validator.Validate Logger *utility.Logger ExtReq request.ExternalRequest - JobPostService service.JobPostService + JobPostService jobPostServices.JobPostService } func (base *Controller) CreateJobPost(c *gin.Context) { @@ -37,9 +37,9 @@ func (base *Controller) CreateJobPost(c *gin.Context) { return } - jobPostService := service.NewJobPostService(base.Db.Postgresql.DB()) + - respData, err := jobPostService.CreateJobPost(req) + respData, err := base.JobPostService.CreateJobPost(req) if err != nil { rd := utility.BuildErrorResponse(http.StatusInternalServerError, "error", "Failed to create job post", err, nil) c.JSON(http.StatusInternalServerError, rd) @@ -54,8 +54,8 @@ func (base *Controller) CreateJobPost(c *gin.Context) { func (base *Controller) FetchAllJobPost(c *gin.Context) { - jobPostService := service.NewJobPostService(base.Db.Postgresql.DB()) - jobPosts, paginationResponse, err := jobPostService.GetPaginatedJobPosts(c) + + jobPosts, paginationResponse, err := base.JobPostService.GetPaginatedJobPosts(c) if err != nil { if err == gorm.ErrRecordNotFound { rd := utility.BuildErrorResponse(http.StatusNotFound, "error", "Jobs not found", err, nil) @@ -84,8 +84,8 @@ func (base *Controller) FetchJobPostByID(c *gin.Context) { c.JSON(http.StatusBadRequest, rd) return } - jobPostService := service.NewJobPostService(base.Db.Postgresql.DB()) - respData, err := jobPostService.FetchJobPostByID(id) + + respData, err := base.JobPostService.FetchJobPostByID(id) if err != nil { if err == gorm.ErrRecordNotFound { rd := utility.BuildErrorResponse(http.StatusNotFound, "error", "Job post not found", err, nil) @@ -124,8 +124,8 @@ func (base *Controller) UpdateJobPostByID(c *gin.Context) { return } - jobPostService := service.NewJobPostService(base.Db.Postgresql.DB()) - result, err := jobPostService.UpdateJobPost(req, id) + + result, err := base.JobPostService.UpdateJobPost(req, id) if err != nil { if err == gorm.ErrRecordNotFound { rd := utility.BuildErrorResponse(http.StatusNotFound, "error", "Job post not found", err, nil) @@ -151,8 +151,8 @@ func (base *Controller) DeleteJobPostByID(c *gin.Context) { return } - jobPostService := service.NewJobPostService(base.Db.Postgresql.DB()) - err := jobPostService.DeleteJobPostByID(id) + + err := base.JobPostService.DeleteJobPostByID(id) if err != nil { if err == gorm.ErrRecordNotFound { rd := utility.BuildErrorResponse(http.StatusNotFound, "error", "Job post not found", err, nil) diff --git a/pkg/router/jobpost.go b/pkg/router/jobpost.go index 099a2a8..6c93141 100644 --- a/pkg/router/jobpost.go +++ b/pkg/router/jobpost.go @@ -10,12 +10,14 @@ import ( "github.com/hngprojects/hng_boilerplate_golang_web/pkg/controller/jobpost" "github.com/hngprojects/hng_boilerplate_golang_web/pkg/middleware" "github.com/hngprojects/hng_boilerplate_golang_web/pkg/repository/storage" + jobPostServices "github.com/hngprojects/hng_boilerplate_golang_web/services/jobpost" "github.com/hngprojects/hng_boilerplate_golang_web/utility" ) func JobPost(r *gin.Engine, ApiVersion string, validator *validator.Validate, db *storage.Database, logger *utility.Logger) *gin.Engine { extReq := request.ExternalRequest{Logger: logger, Test: false} - controller := jobpost.Controller{Db: db, Validator: validator, Logger: logger, ExtReq: extReq} + jobPostService := jobPostServices.NewJobPostService(db.Postgresql.DB()) + controller := jobpost.Controller{Db: db, Validator: validator, Logger: logger, ExtReq: extReq, JobPostService: jobPostService} jobPostUrl := r.Group(fmt.Sprintf("%v", ApiVersion)) { jobPostUrl.POST("/jobs", middleware.Authorize(db.Postgresql.DB(), models.RoleIdentity.SuperAdmin), controller.CreateJobPost) diff --git a/tests/test_jobpost/jobpost_test.go b/tests/test_jobpost/jobpost_test.go index ba1e8b2..6697bdd 100644 --- a/tests/test_jobpost/jobpost_test.go +++ b/tests/test_jobpost/jobpost_test.go @@ -18,6 +18,7 @@ import ( "github.com/hngprojects/hng_boilerplate_golang_web/pkg/controller/jobpost" "github.com/hngprojects/hng_boilerplate_golang_web/pkg/middleware" "github.com/hngprojects/hng_boilerplate_golang_web/pkg/repository/storage" + jobPostServices "github.com/hngprojects/hng_boilerplate_golang_web/services/jobpost" tst "github.com/hngprojects/hng_boilerplate_golang_web/tests" "github.com/hngprojects/hng_boilerplate_golang_web/utility" ) @@ -125,7 +126,8 @@ func TestJobPostCreate(t *testing.T) { }, } - jobPostController := jobpost.Controller{Db: db, Validator: validatorRef, Logger: logger} + jobPostService := jobPostServices.NewJobPostService(db.Postgresql.DB()) + jobPostController := jobpost.Controller{Db: db, Validator: validatorRef, Logger: logger, JobPostService: jobPostService} for _, test := range tests { r := gin.Default() @@ -184,7 +186,8 @@ func TestFetchAllJobPost(t *testing.T) { db := storage.Connection() requestURI := "/api/v1/jobs" - jobPostController := jobpost.Controller{Db: db, Validator: validatorRef, Logger: logger} + jobPostService := jobPostServices.NewJobPostService(db.Postgresql.DB()) + jobPostController := jobpost.Controller{Db: db, Validator: validatorRef, Logger: logger, JobPostService: jobPostService} r := gin.Default() jobUrl := r.Group("/api/v1") @@ -265,7 +268,8 @@ func TestFetchJobPostById(t *testing.T) { Qualifications: "Ability to work solo, Bachelor degree", } - jobPostController := jobpost.Controller{Db: db, Validator: validatorRef, Logger: logger} + jobPostService := jobPostServices.NewJobPostService(db.Postgresql.DB()) + jobPostController := jobpost.Controller{Db: db, Validator: validatorRef, Logger: logger, JobPostService: jobPostService} r.POST("/api/v1/jobs", jobPostController.CreateJobPost) @@ -371,7 +375,8 @@ func TestUpdateJobPostById(t *testing.T) { Qualifications: "Ability to work solo, Bachelor degree", } - jobPostController := jobpost.Controller{Db: db, Validator: validatorRef, Logger: logger} + jobPostService := jobPostServices.NewJobPostService(db.Postgresql.DB()) + jobPostController := jobpost.Controller{Db: db, Validator: validatorRef, Logger: logger, JobPostService: jobPostService} r.POST("/api/v1/jobs", jobPostController.CreateJobPost) var b bytes.Buffer @@ -489,7 +494,8 @@ func TestDeleteJobPostById(t *testing.T) { Qualifications: "Ability to work solo, Bachelor degree", } - jobPostController := jobpost.Controller{Db: db, Validator: validatorRef, Logger: logger} + jobPostService := jobPostServices.NewJobPostService(db.Postgresql.DB()) + jobPostController := jobpost.Controller{Db: db, Validator: validatorRef, Logger: logger, JobPostService: jobPostService} r.POST("/api/v1/jobs", jobPostController.CreateJobPost) var b bytes.Buffer