From 58bb26f7b975b196bc348cb4b9e03e2ea046d99c Mon Sep 17 00:00:00 2001 From: hanif salafi Date: Wed, 2 Jul 2025 13:03:52 +0700 Subject: [PATCH] feat: update major --- .gitlab-ci.yml | 6 +- .idea/go-humas-be.iml | 9 - .idea/modules.xml | 2 +- app/database/entity/activity_logs.entity.go | 20 +- app/database/entity/advertisement.entity.go | 30 +- .../entity/article_approvals.entity.go | 20 +- .../entity/article_categories.entity.go | 6 +- .../article_category_details.entity.go | 4 +- .../entity/article_comments.entity.go | 6 +- app/database/entity/article_files.entity.go | 6 +- app/database/entity/articles.entity.go | 6 +- app/database/entity/audit_trails.entity.go | 6 +- app/database/entity/clients.go | 15 + .../entity/csrf_token_records.entity.go | 14 +- .../entity/custom_static_pages.entity.go | 22 +- app/database/entity/feedbacks.entity.go | 6 +- .../entity/forgot_passwords.entity.go | 18 +- app/database/entity/magazine_files.entity.go | 6 +- app/database/entity/magazines.entity.go | 6 +- app/database/entity/master_menus.entity.go | 30 +- app/database/entity/master_modules.entity.go | 22 +- .../entity/one_time_passwords.entity.go | 22 +- app/database/entity/subscription.entity.go | 16 +- app/database/entity/user_levels.entity.go | 28 +- .../entity/user_role_accesses.entity.go | 30 +- .../entity/user_role_level_details.entity.go | 18 +- app/database/entity/user_roles.entity.go | 26 +- app/database/entity/users/users.entity.go | 4 +- app/database/index.database.go | 9 +- .../seeds/activity_log_types.seeds.go | 2 +- .../seeds/master_approval_statuses.seeds.go | 2 +- app/database/seeds/master_statuses.seeds.go | 2 +- app/middleware/audit_trails.middleware.go | 4 +- app/middleware/client.middleware.go | 121 +++++++ app/middleware/csrf.middleware.go | 2 +- app/middleware/register.middleware.go | 11 +- .../activity_logs/activity_logs.module.go | 6 +- .../controller/activity_logs.controller.go | 36 +- .../activity_logs/controller/controller.go | 2 +- .../mapper/activity_logs.mapper.go | 4 +- .../repository/activity_logs.repository.go | 97 ++--- .../request/activity_logs.request.go | 4 +- .../service/activity_logs.service.go | 67 ++-- .../advertisement/advertisement.module.go | 6 +- .../controller/advertisement.controller.go | 42 ++- .../advertisement/controller/controller.go | 2 +- .../mapper/advertisement.mapper.go | 4 +- .../repository/advertisement.repository.go | 68 ++-- .../request/advertisement.request.go | 4 +- .../service/advertisement.service.go | 83 +++-- .../article_approvals.module.go | 6 +- .../article_approvals.controller.go | 17 +- .../controller/controller.go | 2 +- .../mapper/article_approvals.mapper.go | 4 +- .../article_approvals.repository.go | 10 +- .../request/article_approvals.request.go | 4 +- .../service/article_approvals.service.go | 25 +- .../article_categories.module.go | 6 +- .../article_categories.controller.go | 38 +- .../controller/controller.go | 4 +- .../mapper/article_categories.mapper.go | 4 +- .../article_categories.repository.go | 86 +++-- .../request/article_categories.request.go | 4 +- .../service/article_categories.service.go | 85 +++-- .../article_category_details.module.go | 6 +- .../article_category_details.controller.go | 10 +- .../controller/controller.go | 4 +- .../mapper/article_category_details.mapper.go | 4 +- .../article_category_details.repository.go | 8 +- .../article_category_details.request.go | 4 +- .../article_category_details.service.go | 10 +- .../article_comments.module.go | 6 +- .../controller/article_comments.controller.go | 41 ++- .../article_comments/controller/controller.go | 2 +- .../mapper/article_comments.mapper.go | 11 +- .../repository/article_comments.repository.go | 68 +++- .../request/article_comments.request.go | 4 +- .../service/article_comments.service.go | 59 +-- .../article_files/article_files.module.go | 6 +- .../controller/article_files.controller.go | 41 ++- .../article_files/controller/controller.go | 4 +- .../mapper/article_files.mapper.go | 4 +- .../repository/article_files.repository.go | 89 +++-- .../request/article_files.request.go | 4 +- .../service/article_files.service.go | 59 +-- .../article_nulis_ai.module.go | 6 +- .../controller/article_nulis_ai.controller.go | 10 +- .../article_nulis_ai/controller/controller.go | 2 +- .../mapper/article_nulis_ai.mapper.go | 4 +- .../repository/article_nulis_ai.repository.go | 8 +- .../request/article_nulis_ai.request.go | 4 +- .../service/article_nulis_ai.service.go | 22 +- app/module/articles/articles.module.go | 6 +- .../controller/articles.controller.go | 85 ++++- app/module/articles/controller/controller.go | 7 +- app/module/articles/mapper/articles.mapper.go | 24 +- .../repository/articles.repository.go | 170 ++++++--- .../articles/request/articles.request.go | 4 +- .../articles/response/articles.response.go | 4 +- .../articles/service/articles.service.go | 145 ++++---- app/module/cities/cities.module.go | 6 +- .../cities/controller/cities.controller.go | 10 +- app/module/cities/controller/controller.go | 4 +- app/module/cities/mapper/cities.mapper.go | 12 +- .../cities/repository/cities.repository.go | 10 +- app/module/cities/request/cities.request.go | 33 +- app/module/cities/service/cities.service.go | 10 +- app/module/clients/clients.module.go | 54 +++ .../clients/controller/clients.controller.go | 196 ++++++++++ app/module/clients/controller/controller.go | 16 + app/module/clients/mapper/clients.mapper.go | 20 ++ .../clients/repository/clients.repository.go | 93 +++++ app/module/clients/request/clients.request.go | 66 ++++ .../clients/response/clients.response.go | 15 + app/module/clients/service/clients.service.go | 95 +++++ .../controller/controller.go | 2 +- .../custom_static_pages.controller.go | 10 +- .../custom_static_pages.module.go | 6 +- .../mapper/custom_static_pages.mapper.go | 4 +- .../custom_static_pages.repository.go | 10 +- .../request/custom_static_pages.request.go | 4 +- .../service/custom_static_pages.service.go | 14 +- app/module/districts/controller/controller.go | 4 +- .../controller/districts.controller.go | 10 +- app/module/districts/districts.module.go | 6 +- .../districts/mapper/districts.mapper.go | 4 +- .../repository/districts.repository.go | 10 +- .../districts/request/districts.request.go | 4 +- .../districts/service/districts.service.go | 10 +- app/module/feedbacks/controller/controller.go | 2 +- .../controller/feedbacks.controller.go | 41 ++- app/module/feedbacks/feedbacks.module.go | 6 +- .../feedbacks/mapper/feedbacks.mapper.go | 4 +- .../repository/feedbacks.repository.go | 66 ++-- .../feedbacks/request/feedbacks.request.go | 4 +- .../feedbacks/service/feedbacks.service.go | 63 ++-- .../magazine_files/controller/controller.go | 4 +- .../controller/magazine_files.controller.go | 10 +- .../magazine_files/magazine_files.module.go | 6 +- .../mapper/magazine_files.mapper.go | 4 +- .../repository/magazine_files.repository.go | 10 +- .../request/magazine_files.request.go | 4 +- .../service/magazine_files.service.go | 14 +- app/module/magazines/controller/controller.go | 4 +- .../controller/magazines.controller.go | 46 ++- app/module/magazines/magazines.module.go | 6 +- .../magazines/mapper/magazines.mapper.go | 10 +- .../repository/magazines.repository.go | 68 ++-- .../magazines/request/magazines.request.go | 4 +- .../magazines/response/magazines.response.go | 2 +- .../magazines/service/magazines.service.go | 73 ++-- .../master_menus/controller/controller.go | 4 +- .../controller/master_menus.controller.go | 10 +- .../mapper/master_menus.mapper.go | 4 +- .../master_menus/master_menus.module.go | 8 +- .../repository/master_menus.repository.go | 8 +- .../request/master_menus.request.go | 4 +- .../service/master_menus.service.go | 10 +- .../master_modules/controller/controller.go | 4 +- .../controller/master_modules.controller.go | 10 +- .../mapper/master_modules.mapper.go | 4 +- .../master_modules/master_modules.module.go | 8 +- .../repository/master_modules.repository.go | 8 +- .../request/master_modules.request.go | 4 +- .../service/master_modules.service.go | 10 +- .../master_statuses/controller/controller.go | 4 +- .../controller/master_statuses.controller.go | 10 +- .../mapper/master_statuses.mapper.go | 12 +- .../master_statuses/master_statuses.module.go | 8 +- .../repository/master_statuses.repository.go | 10 +- .../request/master_statuses.request.go | 33 +- .../service/master_statuses.service.go | 10 +- app/module/provinces/controller/controller.go | 4 +- .../controller/provinces.controller.go | 10 +- .../provinces/mapper/provinces.mapper.go | 16 +- app/module/provinces/provinces.module.go | 6 +- .../repository/provinces.repository.go | 10 +- .../provinces/request/provinces.request.go | 53 ++- .../provinces/service/provinces.service.go | 10 +- .../subscription/controller/controller.go | 2 +- .../controller/subscription.controller.go | 10 +- .../mapper/subscription.mapper.go | 4 +- .../repository/subscription.repository.go | 8 +- .../request/subscription.request.go | 4 +- .../service/subscription.service.go | 14 +- .../subscription/subscription.module.go | 6 +- .../user_levels/controller/controller.go | 4 +- .../controller/user_levels.controller.go | 10 +- .../user_levels/mapper/user_levels.mapper.go | 4 +- .../repository/user_levels.repository.go | 10 +- .../request/user_levels.request.go | 4 +- .../service/user_levels.service.go | 12 +- app/module/user_levels/user_levels.module.go | 6 +- .../controller/controller.go | 4 +- .../user_role_accesses.controller.go | 10 +- .../mapper/user_role_accesses.mapper.go | 4 +- .../user_role_accesses.repository.go | 8 +- .../request/user_role_accesses.request.go | 4 +- .../service/user_role_accesses.service.go | 10 +- .../user_role_accesses.module.go | 8 +- .../controller/controller.go | 2 +- .../user_role_level_details.controller.go | 10 +- .../mapper/user_role_level_details.mapper.go | 4 +- .../user_role_level_details.repository.go | 8 +- .../user_role_level_details.request.go | 4 +- .../user_role_level_details.service.go | 10 +- .../user_role_level_details.module.go | 6 +- .../user_roles/controller/controller.go | 2 +- .../controller/user_roles.controller.go | 10 +- .../user_roles/mapper/user_roles.mapper.go | 4 +- .../repository/user_roles.repository.go | 10 +- .../user_roles/request/user_roles.request.go | 6 +- .../user_roles/service/user_roles.service.go | 22 +- app/module/user_roles/user_roles.module.go | 6 +- app/module/users/controller/controller.go | 4 +- .../users/controller/users.controller.go | 62 +++- app/module/users/mapper/users.mapper.go | 6 +- .../users/repository/users.repository.go | 72 ++-- app/module/users/request/users.request.go | 4 +- app/module/users/service/users.service.go | 85 +++-- app/module/users/users.module.go | 6 +- app/router/api.go | 55 +-- config/logger/index.logger.go | 2 +- config/toml/config.toml | 6 +- config/webserver/webserver.config.go | 14 +- docker-compose.yml | 6 +- docs/swagger/docs.go | 336 ++++++++++++++++++ docs/swagger/swagger.json | 336 ++++++++++++++++++ docs/swagger/swagger.yaml | 213 +++++++++++ go.mod | 2 +- main.go | 62 ++-- utils/middleware/client_utils.go | 56 +++ utils/response/index.response.go | 2 +- utils/service/user_utils.service.go | 4 +- 234 files changed, 3802 insertions(+), 1484 deletions(-) delete mode 100644 .idea/go-humas-be.iml create mode 100644 app/database/entity/clients.go create mode 100644 app/middleware/client.middleware.go create mode 100644 app/module/clients/clients.module.go create mode 100644 app/module/clients/controller/clients.controller.go create mode 100644 app/module/clients/controller/controller.go create mode 100644 app/module/clients/mapper/clients.mapper.go create mode 100644 app/module/clients/repository/clients.repository.go create mode 100644 app/module/clients/request/clients.request.go create mode 100644 app/module/clients/response/clients.response.go create mode 100644 app/module/clients/service/clients.service.go create mode 100644 utils/middleware/client_utils.go diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b378326..84e698c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -20,8 +20,8 @@ build-2: script: - docker login -u $DEPLOY_USERNAME -p $DEPLOY_TOKEN 103.82.242.92:8900 - docker-compose build - - docker tag registry.gitlab.com/hanifsalafi/web-humas-be:dev 103.82.242.92:8900/humas/web-humas-be:dev - - docker push 103.82.242.92:8900/humas/web-humas-be:dev + - docker tag registry.gitlab.com/hanifsalafi/web-medols-be:dev 103.82.242.92:8900/medols/web-medols-be:dev + - docker push 103.82.242.92:8900/medols/web-medols-be:dev deploy: stage: deploy @@ -30,4 +30,4 @@ deploy: services: - docker:dind script: - - curl --user $JENKINS_USER:$JENKINS_PWD http://38.47.180.165:8080/job/autodeploy-humas-be/build?token=autodeployhumas \ No newline at end of file + - curl --user $JENKINS_USER:$JENKINS_PWD http://38.47.180.165:8080/job/autodeploy-medols-be/build?token=autodeploymedols \ No newline at end of file diff --git a/.idea/go-humas-be.iml b/.idea/go-humas-be.iml deleted file mode 100644 index 5e764c4..0000000 --- a/.idea/go-humas-be.iml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml index ebf4611..40fa4db 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,7 +2,7 @@ - + \ No newline at end of file diff --git a/app/database/entity/activity_logs.entity.go b/app/database/entity/activity_logs.entity.go index 219cca0..79cb8aa 100644 --- a/app/database/entity/activity_logs.entity.go +++ b/app/database/entity/activity_logs.entity.go @@ -1,13 +1,17 @@ package entity -import "time" +import ( + "github.com/google/uuid" + "time" +) type ActivityLogs struct { - ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` - ActivityTypeId int `json:"activity_type_id" gorm:"type:int4"` - Url string `json:"url" gorm:"type:varchar"` - VisitorIp *string `json:"visitor_ip" gorm:"type:varchar"` - ArticleId *uint `json:"article_id" gorm:"type:int4"` - UserId *uint `json:"user_id" gorm:"type:int4"` - CreatedAt time.Time `json:"created_at" gorm:"default:now()"` + ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` + ActivityTypeId int `json:"activity_type_id" gorm:"type:int4"` + Url string `json:"url" gorm:"type:varchar"` + VisitorIp *string `json:"visitor_ip" gorm:"type:varchar"` + ArticleId *uint `json:"article_id" gorm:"type:int4"` + UserId *uint `json:"user_id" gorm:"type:int4"` + ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"` + CreatedAt time.Time `json:"created_at" gorm:"default:now()"` } diff --git a/app/database/entity/advertisement.entity.go b/app/database/entity/advertisement.entity.go index 387674e..f997d18 100644 --- a/app/database/entity/advertisement.entity.go +++ b/app/database/entity/advertisement.entity.go @@ -1,18 +1,22 @@ package entity -import "time" +import ( + "github.com/google/uuid" + "time" +) type Advertisement struct { - ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` - Title string `json:"title" gorm:"type:varchar"` - Description string `json:"description" gorm:"type:varchar"` - RedirectLink string `json:"redirect_link" gorm:"type:varchar"` - ContentFilePath *string `json:"content_file_path" gorm:"type:varchar"` - ContentFileName *string `json:"content_file_name" gorm:"type:varchar"` - Placement string `json:"placement" gorm:"type:varchar"` - StatusId int `json:"status_id" gorm:"type:int4"` - IsPublish bool `json:"is_publish" gorm:"type:bool"` - IsActive bool `json:"is_active" gorm:"type:bool;default:true"` - CreatedAt time.Time `json:"created_at" gorm:"default:now()"` - UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` + ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` + Title string `json:"title" gorm:"type:varchar"` + Description string `json:"description" gorm:"type:varchar"` + RedirectLink string `json:"redirect_link" gorm:"type:varchar"` + ContentFilePath *string `json:"content_file_path" gorm:"type:varchar"` + ContentFileName *string `json:"content_file_name" gorm:"type:varchar"` + Placement string `json:"placement" gorm:"type:varchar"` + StatusId int `json:"status_id" gorm:"type:int4"` + IsPublish bool `json:"is_publish" gorm:"type:bool"` + ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"` + IsActive bool `json:"is_active" gorm:"type:bool;default:true"` + CreatedAt time.Time `json:"created_at" gorm:"default:now()"` + UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` } diff --git a/app/database/entity/article_approvals.entity.go b/app/database/entity/article_approvals.entity.go index 9b14f29..1420090 100644 --- a/app/database/entity/article_approvals.entity.go +++ b/app/database/entity/article_approvals.entity.go @@ -1,13 +1,17 @@ package entity -import "time" +import ( + "github.com/google/uuid" + "time" +) type ArticleApprovals struct { - ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` - ArticleId uint `json:"article_id" gorm:"type:int4"` - ApprovalBy uint `json:"approval_by" gorm:"type:int4"` - StatusId int `json:"status_id" gorm:"type:int4"` - Message string `json:"message" gorm:"type:varchar"` - ApprovalAtLevel *int `json:"approval_at_level" gorm:"type:int4"` - CreatedAt time.Time `json:"created_at" gorm:"default:now()"` + ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` + ArticleId uint `json:"article_id" gorm:"type:int4"` + ApprovalBy uint `json:"approval_by" gorm:"type:int4"` + StatusId int `json:"status_id" gorm:"type:int4"` + Message string `json:"message" gorm:"type:varchar"` + ApprovalAtLevel *int `json:"approval_at_level" gorm:"type:int4"` + ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"` + CreatedAt time.Time `json:"created_at" gorm:"default:now()"` } diff --git a/app/database/entity/article_categories.entity.go b/app/database/entity/article_categories.entity.go index 3894a66..0c1ebdd 100644 --- a/app/database/entity/article_categories.entity.go +++ b/app/database/entity/article_categories.entity.go @@ -1,6 +1,9 @@ package entity -import "time" +import ( + "github.com/google/uuid" + "time" +) type ArticleCategories struct { ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` @@ -16,6 +19,7 @@ type ArticleCategories struct { StatusId int `json:"status_id" gorm:"type:int4;default:1"` IsPublish *bool `json:"is_publish" gorm:"type:bool;default:false"` PublishedAt *time.Time `json:"published_at" gorm:"type:timestamp"` + ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"` IsActive *bool `json:"is_active" gorm:"type:bool;default:true"` CreatedAt time.Time `json:"created_at" gorm:"default:now()"` UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` diff --git a/app/database/entity/article_category_details/article_category_details.entity.go b/app/database/entity/article_category_details/article_category_details.entity.go index 85c2892..50f1e16 100644 --- a/app/database/entity/article_category_details/article_category_details.entity.go +++ b/app/database/entity/article_category_details/article_category_details.entity.go @@ -1,8 +1,9 @@ package article_category_details import ( - entity "go-humas-be/app/database/entity" + "github.com/google/uuid" "time" + entity "web-medols-be/app/database/entity" ) type ArticleCategoryDetails struct { @@ -10,6 +11,7 @@ type ArticleCategoryDetails struct { ArticleId uint `json:"article_id" gorm:"type:int4"` CategoryId int `json:"category_id" gorm:"type:int4"` Category *entity.ArticleCategories `json:"category" gorm:"foreignKey:CategoryId;references:ID"` + ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"` IsActive bool `json:"is_active" gorm:"type:bool"` CreatedAt time.Time `json:"created_at" gorm:"default:now()"` UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` diff --git a/app/database/entity/article_comments.entity.go b/app/database/entity/article_comments.entity.go index de1da6a..7a263ff 100644 --- a/app/database/entity/article_comments.entity.go +++ b/app/database/entity/article_comments.entity.go @@ -1,6 +1,9 @@ package entity -import "time" +import ( + "github.com/google/uuid" + "time" +) type ArticleComments struct { ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` @@ -11,6 +14,7 @@ type ArticleComments struct { IsPublic bool `json:"is_public" gorm:"type:bool;default:false"` StatusId int `json:"status_id" gorm:"type:int4;default:0"` ApprovedAt *time.Time `json:"approved_at" gorm:"type:timestamp"` + ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"` IsActive bool `json:"is_active" gorm:"type:bool"` CreatedAt time.Time `json:"created_at" gorm:"default:now()"` UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` diff --git a/app/database/entity/article_files.entity.go b/app/database/entity/article_files.entity.go index 4c0f9b4..c1891de 100644 --- a/app/database/entity/article_files.entity.go +++ b/app/database/entity/article_files.entity.go @@ -1,6 +1,9 @@ package entity -import "time" +import ( + "github.com/google/uuid" + "time" +) type ArticleFiles struct { ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` @@ -19,6 +22,7 @@ type ArticleFiles struct { StatusId int `json:"status_id" gorm:"type:int4"` IsPublish *bool `json:"is_publish" gorm:"type:bool;default:false"` PublishedAt *time.Time `json:"published_at" gorm:"type:timestamp"` + ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"` IsActive bool `json:"is_active" gorm:"type:bool;default:true"` CreatedAt time.Time `json:"created_at" gorm:"default:now()"` UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` diff --git a/app/database/entity/articles.entity.go b/app/database/entity/articles.entity.go index 6fe3f4f..f77f238 100644 --- a/app/database/entity/articles.entity.go +++ b/app/database/entity/articles.entity.go @@ -1,6 +1,9 @@ package entity -import "time" +import ( + "github.com/google/uuid" + "time" +) type Articles struct { ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` @@ -29,6 +32,7 @@ type Articles struct { IsDraft *bool `json:"is_draft" gorm:"type:bool;default:false"` DraftedAt *time.Time `json:"drafted_at" gorm:"type:timestamp"` PublishSchedule *string `json:"publish_schedule" gorm:"type:varchar"` + ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"` IsActive *bool `json:"is_active" gorm:"type:bool;default:true"` CreatedAt time.Time `json:"created_at" gorm:"default:now()"` UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` diff --git a/app/database/entity/audit_trails.entity.go b/app/database/entity/audit_trails.entity.go index acb37f1..399c8f2 100644 --- a/app/database/entity/audit_trails.entity.go +++ b/app/database/entity/audit_trails.entity.go @@ -1,6 +1,9 @@ package entity -import "time" +import ( + "github.com/google/uuid" + "time" +) type AuditTrails struct { ID uint `gorm:"primaryKey"` @@ -13,5 +16,6 @@ type AuditTrails struct { RequestBody string ResponseBody string DurationMs int64 + ClientId *uuid.UUID CreatedAt time.Time } diff --git a/app/database/entity/clients.go b/app/database/entity/clients.go new file mode 100644 index 0000000..b4ba2f1 --- /dev/null +++ b/app/database/entity/clients.go @@ -0,0 +1,15 @@ +package entity + +import ( + "github.com/google/uuid" + "time" +) + +type Clients struct { + ID uuid.UUID `json:"id" gorm:"primaryKey;type:UUID"` + Name string `json:"name" gorm:"type:varchar"` + CreatedById *uint `json:"created_by_id" gorm:"type:int4"` + IsActive *bool `json:"is_active" gorm:"type:bool;default:true"` + CreatedAt time.Time `json:"created_at" gorm:"default:now()"` + UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` +} diff --git a/app/database/entity/csrf_token_records.entity.go b/app/database/entity/csrf_token_records.entity.go index e5681ca..101dd8c 100644 --- a/app/database/entity/csrf_token_records.entity.go +++ b/app/database/entity/csrf_token_records.entity.go @@ -1,11 +1,15 @@ package entity -import "time" +import ( + "github.com/google/uuid" + "time" +) type CsrfTokenRecords struct { - ID uint `gorm:"primaryKey"` - Token string `gorm:"uniqueIndex;size:255"` - Value []byte `gorm:"value"` - ExpireAt time.Time `gorm:"index"` + ID uint `gorm:"primaryKey"` + Token string `gorm:"uniqueIndex;size:255"` + Value []byte `gorm:"value"` + ExpireAt time.Time `gorm:"index"` + ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"` CreatedAt time.Time } diff --git a/app/database/entity/custom_static_pages.entity.go b/app/database/entity/custom_static_pages.entity.go index 3a6388c..68c8f5f 100644 --- a/app/database/entity/custom_static_pages.entity.go +++ b/app/database/entity/custom_static_pages.entity.go @@ -1,14 +1,18 @@ package entity -import "time" +import ( + "github.com/google/uuid" + "time" +) type CustomStaticPages struct { - ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` - Title string `json:"title" gorm:"type:varchar"` - Description string `json:"description" gorm:"type:varchar"` - Slug string `json:"slug" gorm:"type:varchar"` - HtmlBody string `json:"html_body" gorm:"type:text"` - IsActive bool `json:"is_active" gorm:"type:bool"` - CreatedAt time.Time `json:"created_at" gorm:"default:now()"` - UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` + ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` + Title string `json:"title" gorm:"type:varchar"` + Description string `json:"description" gorm:"type:varchar"` + Slug string `json:"slug" gorm:"type:varchar"` + HtmlBody string `json:"html_body" gorm:"type:text"` + IsActive bool `json:"is_active" gorm:"type:bool"` + ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"` + CreatedAt time.Time `json:"created_at" gorm:"default:now()"` + UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` } diff --git a/app/database/entity/feedbacks.entity.go b/app/database/entity/feedbacks.entity.go index 8f8b6f9..499dfd2 100644 --- a/app/database/entity/feedbacks.entity.go +++ b/app/database/entity/feedbacks.entity.go @@ -1,6 +1,9 @@ package entity -import "time" +import ( + "github.com/google/uuid" + "time" +) type Feedbacks struct { ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` @@ -10,6 +13,7 @@ type Feedbacks struct { StatusId int `json:"status_id" gorm:"type:int4;default:0"` ApprovedAt *time.Time `json:"approved_at" gorm:"type:timestamp"` ReplyMessage *string `json:"reply_message" gorm:"type:varchar"` + ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"` IsActive bool `json:"is_active" gorm:"type:bool;default:true"` CreatedAt time.Time `json:"created_at" gorm:"default:now()"` UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` diff --git a/app/database/entity/forgot_passwords.entity.go b/app/database/entity/forgot_passwords.entity.go index 1f95270..2fd5543 100644 --- a/app/database/entity/forgot_passwords.entity.go +++ b/app/database/entity/forgot_passwords.entity.go @@ -1,12 +1,16 @@ package entity -import "time" +import ( + "github.com/google/uuid" + "time" +) type ForgotPasswords struct { - ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` - KeycloakID string `json:"keycloak_id" gorm:"type:varchar"` - CodeRequest string `json:"code_request" gorm:"type:varchar"` - IsActive bool `json:"is_active" gorm:"type:bool"` - CreatedAt time.Time `json:"created_at" gorm:"default:now()"` - UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` + ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` + KeycloakID string `json:"keycloak_id" gorm:"type:varchar"` + CodeRequest string `json:"code_request" gorm:"type:varchar"` + ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"` + IsActive bool `json:"is_active" gorm:"type:bool"` + CreatedAt time.Time `json:"created_at" gorm:"default:now()"` + UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` } diff --git a/app/database/entity/magazine_files.entity.go b/app/database/entity/magazine_files.entity.go index c16ad49..1ebc3f4 100644 --- a/app/database/entity/magazine_files.entity.go +++ b/app/database/entity/magazine_files.entity.go @@ -1,6 +1,9 @@ package entity -import "time" +import ( + "github.com/google/uuid" + "time" +) type MagazineFiles struct { ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` @@ -18,6 +21,7 @@ type MagazineFiles struct { HeightPixel *string `json:"height_pixel" gorm:"type:varchar"` Size *string `json:"size" gorm:"type:varchar"` PublishedAt *time.Time `json:"published_at" gorm:"type:timestamp"` + ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"` IsActive bool `json:"is_active" gorm:"type:bool"` CreatedAt time.Time `json:"created_at" gorm:"default:now()"` UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` diff --git a/app/database/entity/magazines.entity.go b/app/database/entity/magazines.entity.go index 3cfc206..d2ed199 100644 --- a/app/database/entity/magazines.entity.go +++ b/app/database/entity/magazines.entity.go @@ -1,6 +1,9 @@ package entity -import "time" +import ( + "github.com/google/uuid" + "time" +) type Magazines struct { ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` @@ -14,6 +17,7 @@ type Magazines struct { StatusId int `json:"status_id" gorm:"type:int4"` IsPublish *bool `json:"is_publish" gorm:"type:bool"` PublishedAt *time.Time `json:"published_at" gorm:"type:timestamp"` + ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"` IsActive bool `json:"is_active" gorm:"type:bool"` CreatedAt time.Time `json:"created_at" gorm:"default:now()"` UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` diff --git a/app/database/entity/master_menus.entity.go b/app/database/entity/master_menus.entity.go index 143e764..b0e1290 100644 --- a/app/database/entity/master_menus.entity.go +++ b/app/database/entity/master_menus.entity.go @@ -1,18 +1,22 @@ package entity -import "time" +import ( + "github.com/google/uuid" + "time" +) type MasterMenus struct { - ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` - Name string `json:"name" gorm:"type:varchar"` - Description string `json:"description" gorm:"type:varchar"` - ModuleId int `json:"module_id" gorm:"type:int4"` - ParentMenuId *int `json:"parent_menu_id" gorm:"type:int4"` - Icon *string `json:"icon" gorm:"type:varchar"` - Group string `json:"group" gorm:"type:varchar"` - Position *int `json:"position" gorm:"type:int4"` - StatusId int `json:"status_id" gorm:"type:int4"` - IsActive *bool `json:"is_active" gorm:"type:bool;default:true"` - CreatedAt time.Time `json:"created_at" gorm:"default:now()"` - UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` + ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` + Name string `json:"name" gorm:"type:varchar"` + Description string `json:"description" gorm:"type:varchar"` + ModuleId int `json:"module_id" gorm:"type:int4"` + ParentMenuId *int `json:"parent_menu_id" gorm:"type:int4"` + Icon *string `json:"icon" gorm:"type:varchar"` + Group string `json:"group" gorm:"type:varchar"` + Position *int `json:"position" gorm:"type:int4"` + StatusId int `json:"status_id" gorm:"type:int4"` + ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"` + IsActive *bool `json:"is_active" gorm:"type:bool;default:true"` + CreatedAt time.Time `json:"created_at" gorm:"default:now()"` + UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` } diff --git a/app/database/entity/master_modules.entity.go b/app/database/entity/master_modules.entity.go index b332b92..4eedc12 100644 --- a/app/database/entity/master_modules.entity.go +++ b/app/database/entity/master_modules.entity.go @@ -1,14 +1,18 @@ package entity -import "time" +import ( + "github.com/google/uuid" + "time" +) type MasterModules struct { - ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` - Name string `json:"name" gorm:"type:varchar"` - Description string `json:"description" gorm:"type:varchar"` - PathUrl string `json:"path_url" gorm:"type:varchar"` - StatusId int `json:"status_id" gorm:"type:int4"` - IsActive *bool `json:"is_active" gorm:"type:bool;default:true"` - CreatedAt time.Time `json:"created_at" gorm:"default:now()"` - UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` + ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` + Name string `json:"name" gorm:"type:varchar"` + Description string `json:"description" gorm:"type:varchar"` + PathUrl string `json:"path_url" gorm:"type:varchar"` + StatusId int `json:"status_id" gorm:"type:int4"` + ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"` + IsActive *bool `json:"is_active" gorm:"type:bool;default:true"` + CreatedAt time.Time `json:"created_at" gorm:"default:now()"` + UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` } diff --git a/app/database/entity/one_time_passwords.entity.go b/app/database/entity/one_time_passwords.entity.go index aba4be7..1b7b6a6 100644 --- a/app/database/entity/one_time_passwords.entity.go +++ b/app/database/entity/one_time_passwords.entity.go @@ -1,14 +1,18 @@ package entity -import "time" +import ( + "github.com/google/uuid" + "time" +) type OneTimePasswords struct { - ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` - Email string `json:"email" gorm:"type:varchar"` - Name *string `json:"name" gorm:"type:varchar"` - Identity *string `json:"identity" gorm:"type:varchar"` - OtpCode string `json:"otp_code" gorm:"type:varchar"` - ValidUntil time.Time `json:"valid_until" gorm:"default:(NOW() + INTERVAL '10 minutes')"` - IsActive bool `json:"is_active" gorm:"type:bool"` - CreatedAt time.Time `json:"created_at" gorm:"default:now()"` + ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` + Email string `json:"email" gorm:"type:varchar"` + Name *string `json:"name" gorm:"type:varchar"` + Identity *string `json:"identity" gorm:"type:varchar"` + OtpCode string `json:"otp_code" gorm:"type:varchar"` + ValidUntil time.Time `json:"valid_until" gorm:"default:(NOW() + INTERVAL '10 minutes')"` + ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"` + IsActive bool `json:"is_active" gorm:"type:bool"` + CreatedAt time.Time `json:"created_at" gorm:"default:now()"` } diff --git a/app/database/entity/subscription.entity.go b/app/database/entity/subscription.entity.go index ef9de18..3d11947 100644 --- a/app/database/entity/subscription.entity.go +++ b/app/database/entity/subscription.entity.go @@ -1,11 +1,15 @@ package entity -import "time" +import ( + "github.com/google/uuid" + "time" +) type Subscription struct { - ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` - Email string `json:"email" gorm:"type:varchar"` - IsActive bool `json:"is_active" gorm:"type:bool;default:true"` - CreatedAt time.Time `json:"created_at" gorm:"default:now()"` - UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` + ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` + Email string `json:"email" gorm:"type:varchar"` + ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"` + IsActive bool `json:"is_active" gorm:"type:bool;default:true"` + CreatedAt time.Time `json:"created_at" gorm:"default:now()"` + UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` } diff --git a/app/database/entity/user_levels.entity.go b/app/database/entity/user_levels.entity.go index dbbea4d..ee7a906 100644 --- a/app/database/entity/user_levels.entity.go +++ b/app/database/entity/user_levels.entity.go @@ -1,17 +1,21 @@ package entity -import "time" +import ( + "github.com/google/uuid" + "time" +) type UserLevels struct { - ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` - Name string `json:"name" gorm:"type:varchar"` - AliasName string `json:"alias_name" gorm:"type:varchar"` - LevelNumber int `json:"level_number" gorm:"type:int4"` - ParentLevelId *int `json:"parent_level_id" gorm:"type:int4"` - ProvinceId *int `json:"province_id" gorm:"type:int4"` - Group *string `json:"group" gorm:"type:varchar"` - IsApprovalActive *bool `json:"is_approval_active" gorm:"type:bool;default:false"` - IsActive *bool `json:"is_active" gorm:"type:bool"` - CreatedAt time.Time `json:"created_at" gorm:"default:now()"` - UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` + ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` + Name string `json:"name" gorm:"type:varchar"` + AliasName string `json:"alias_name" gorm:"type:varchar"` + LevelNumber int `json:"level_number" gorm:"type:int4"` + ParentLevelId *int `json:"parent_level_id" gorm:"type:int4"` + ProvinceId *int `json:"province_id" gorm:"type:int4"` + Group *string `json:"group" gorm:"type:varchar"` + IsApprovalActive *bool `json:"is_approval_active" gorm:"type:bool;default:false"` + ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"` + IsActive *bool `json:"is_active" gorm:"type:bool"` + CreatedAt time.Time `json:"created_at" gorm:"default:now()"` + UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` } diff --git a/app/database/entity/user_role_accesses.entity.go b/app/database/entity/user_role_accesses.entity.go index 29b516f..2ebf920 100644 --- a/app/database/entity/user_role_accesses.entity.go +++ b/app/database/entity/user_role_accesses.entity.go @@ -1,18 +1,22 @@ package entity -import "time" +import ( + "github.com/google/uuid" + "time" +) type UserRoleAccesses struct { - ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` - UserRoleId uint `json:"user_role_id" gorm:"type:int4"` - MenuId int `json:"menu_id" gorm:"type:int4"` - IsViewEnabled bool `json:"is_view_enabled" gorm:"type:bool"` - IsInsertEnabled bool `json:"is_insert_enabled" gorm:"type:bool"` - IsUpdateEnabled bool `json:"is_update_enabled" gorm:"type:bool"` - IsDeleteEnabled bool `json:"is_delete_enabled" gorm:"type:bool"` - IsApprovalEnabled bool `json:"is_approval_enabled" gorm:"type:bool"` - IsAdminEnabled bool `json:"is_admin_enabled" gorm:"type:bool"` - IsActive *bool `json:"is_active" gorm:"type:bool;default:true"` - CreatedAt time.Time `json:"created_at" gorm:"default:now()"` - UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` + ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` + UserRoleId uint `json:"user_role_id" gorm:"type:int4"` + MenuId int `json:"menu_id" gorm:"type:int4"` + IsViewEnabled bool `json:"is_view_enabled" gorm:"type:bool"` + IsInsertEnabled bool `json:"is_insert_enabled" gorm:"type:bool"` + IsUpdateEnabled bool `json:"is_update_enabled" gorm:"type:bool"` + IsDeleteEnabled bool `json:"is_delete_enabled" gorm:"type:bool"` + IsApprovalEnabled bool `json:"is_approval_enabled" gorm:"type:bool"` + IsAdminEnabled bool `json:"is_admin_enabled" gorm:"type:bool"` + IsActive *bool `json:"is_active" gorm:"type:bool;default:true"` + ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"` + CreatedAt time.Time `json:"created_at" gorm:"default:now()"` + UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` } diff --git a/app/database/entity/user_role_level_details.entity.go b/app/database/entity/user_role_level_details.entity.go index b37d71f..2bc793f 100644 --- a/app/database/entity/user_role_level_details.entity.go +++ b/app/database/entity/user_role_level_details.entity.go @@ -1,12 +1,16 @@ package entity -import "time" +import ( + "github.com/google/uuid" + "time" +) type UserRoleLevelDetails struct { - ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` - UserRoleId uint `json:"user_role_id" gorm:"type:int4"` - UserLevelId uint `json:"user_level_id" gorm:"type:int4"` - IsActive *bool `json:"is_active" gorm:"type:bool;default:true"` - CreatedAt time.Time `json:"created_at" gorm:"default:now()"` - UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` + ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` + UserRoleId uint `json:"user_role_id" gorm:"type:int4"` + UserLevelId uint `json:"user_level_id" gorm:"type:int4"` + ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"` + IsActive *bool `json:"is_active" gorm:"type:bool;default:true"` + CreatedAt time.Time `json:"created_at" gorm:"default:now()"` + UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` } diff --git a/app/database/entity/user_roles.entity.go b/app/database/entity/user_roles.entity.go index fc9501b..f04223a 100644 --- a/app/database/entity/user_roles.entity.go +++ b/app/database/entity/user_roles.entity.go @@ -1,16 +1,20 @@ package entity -import "time" +import ( + "github.com/google/uuid" + "time" +) type UserRoles struct { - ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` - Name string `json:"name" gorm:"type:varchar"` - Description string `json:"description" gorm:"type:varchar"` - Code string `json:"code" gorm:"type:varchar"` - StatusId int `json:"status_id" gorm:"type:int4;default:1"` - CreatedById *uint `json:"created_by_id" gorm:"type:int4"` - UserLevelId uint `json:"user_level_id" gorm:"type:int4"` - IsActive *bool `json:"is_active" gorm:"type:bool;default:true"` - CreatedAt time.Time `json:"created_at" gorm:"default:now()"` - UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` + ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` + Name string `json:"name" gorm:"type:varchar"` + Description string `json:"description" gorm:"type:varchar"` + Code string `json:"code" gorm:"type:varchar"` + StatusId int `json:"status_id" gorm:"type:int4;default:1"` + CreatedById *uint `json:"created_by_id" gorm:"type:int4"` + UserLevelId uint `json:"user_level_id" gorm:"type:int4"` + ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"` + IsActive *bool `json:"is_active" gorm:"type:bool;default:true"` + CreatedAt time.Time `json:"created_at" gorm:"default:now()"` + UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` } diff --git a/app/database/entity/users/users.entity.go b/app/database/entity/users/users.entity.go index 95b128a..0a57dc0 100644 --- a/app/database/entity/users/users.entity.go +++ b/app/database/entity/users/users.entity.go @@ -1,8 +1,9 @@ package users import ( - "go-humas-be/app/database/entity" + "github.com/google/uuid" "time" + "web-medols-be/app/database/entity" ) type Users struct { @@ -29,6 +30,7 @@ type Users struct { ProfilePicturePath *string `json:"profile_picture_path" gorm:"type:varchar"` TempPassword *string `json:"temp_password" gorm:"type:varchar"` IsEmailUpdated *bool `json:"is_email_updated" gorm:"type:bool;default:false"` + ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"` IsActive *bool `json:"is_active" gorm:"type:bool;default:true"` CreatedAt time.Time `json:"created_at" gorm:"default:now()"` UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` diff --git a/app/database/index.database.go b/app/database/index.database.go index 32c46e3..264de8b 100644 --- a/app/database/index.database.go +++ b/app/database/index.database.go @@ -2,13 +2,13 @@ package database import ( "github.com/rs/zerolog" - "go-humas-be/app/database/entity" - "go-humas-be/app/database/entity/article_category_details" - "go-humas-be/app/database/entity/users" - "go-humas-be/config/config" "gorm.io/driver/postgres" "gorm.io/gorm" "gorm.io/gorm/logger" + "web-medols-be/app/database/entity" + "web-medols-be/app/database/entity/article_category_details" + "web-medols-be/app/database/entity/users" + "web-medols-be/config/config" ) // Database setup database with gorm @@ -95,6 +95,7 @@ func Models() []interface{} { entity.ArticleNulisAI{}, entity.AuditTrails{}, entity.Cities{}, + entity.Clients{}, entity.CsrfTokenRecords{}, entity.CustomStaticPages{}, entity.Districts{}, diff --git a/app/database/seeds/activity_log_types.seeds.go b/app/database/seeds/activity_log_types.seeds.go index 3d154b7..df07916 100644 --- a/app/database/seeds/activity_log_types.seeds.go +++ b/app/database/seeds/activity_log_types.seeds.go @@ -1,8 +1,8 @@ package seeds import ( - "go-humas-be/app/database/entity" "gorm.io/gorm" + "web-medols-be/app/database/entity" ) type ActivityLogsSeeder struct{} diff --git a/app/database/seeds/master_approval_statuses.seeds.go b/app/database/seeds/master_approval_statuses.seeds.go index 180e6c8..f24b40d 100644 --- a/app/database/seeds/master_approval_statuses.seeds.go +++ b/app/database/seeds/master_approval_statuses.seeds.go @@ -1,8 +1,8 @@ package seeds import ( - "go-humas-be/app/database/entity" "gorm.io/gorm" + "web-medols-be/app/database/entity" ) type MasterApprovalStatusesSeeder struct{} diff --git a/app/database/seeds/master_statuses.seeds.go b/app/database/seeds/master_statuses.seeds.go index 0834786..ea04d24 100644 --- a/app/database/seeds/master_statuses.seeds.go +++ b/app/database/seeds/master_statuses.seeds.go @@ -1,8 +1,8 @@ package seeds import ( - "go-humas-be/app/database/entity" "gorm.io/gorm" + "web-medols-be/app/database/entity" ) type MasterStatusesSeeder struct{} diff --git a/app/middleware/audit_trails.middleware.go b/app/middleware/audit_trails.middleware.go index c30fac2..bc3972b 100644 --- a/app/middleware/audit_trails.middleware.go +++ b/app/middleware/audit_trails.middleware.go @@ -3,12 +3,12 @@ package middleware import ( "encoding/json" "github.com/gofiber/fiber/v2" - "go-humas-be/app/database/entity" - utilSvc "go-humas-be/utils/service" "gorm.io/gorm" "log" "strings" "time" + "web-medols-be/app/database/entity" + utilSvc "web-medols-be/utils/service" ) func AuditTrailsMiddleware(db *gorm.DB) fiber.Handler { diff --git a/app/middleware/client.middleware.go b/app/middleware/client.middleware.go new file mode 100644 index 0000000..e5b4181 --- /dev/null +++ b/app/middleware/client.middleware.go @@ -0,0 +1,121 @@ +package middleware + +import ( + "github.com/gofiber/fiber/v2" + "github.com/google/uuid" + "gorm.io/gorm" + "strings" + "web-medols-be/app/database/entity" +) + +const ( + ClientKeyHeader = "X-Client-Key" + ClientContextKey = "client_id" +) + +// excludedPaths contains paths that don't require client key validation +var excludedPaths = []string{ + "/swagger/*", + "/docs/*", + "/users/login", + "/health/*", + "/clients", + "/clients/*", + "/metrics", + "/metrics/*", +} + +// isPathExcluded checks if the given path should be excluded from client key validation +func isPathExcluded(path string) bool { + for _, excludedPath := range excludedPaths { + if strings.HasPrefix(excludedPath, "*") { + // Handle wildcard at the beginning + if strings.HasSuffix(path, excludedPath[1:]) { + return true + } + } else if strings.HasSuffix(excludedPath, "*") { + // Handle wildcard at the end + prefix := excludedPath[:len(excludedPath)-1] + if strings.HasPrefix(path, prefix) { + return true + } + } else { + // Exact match + if path == excludedPath { + return true + } + } + } + return false +} + +// ClientMiddleware extracts and validates the Client Key from request headers +func ClientMiddleware(db *gorm.DB) fiber.Handler { + return func(c *fiber.Ctx) error { + // Check if path should be excluded from client key validation + if isPathExcluded(c.Path()) { + return c.Next() + } + + // Extract Client Key from header + clientKey := c.Get(ClientKeyHeader) + + if clientKey == "" { + return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ + "success": false, + "code": 400, + "messages": []string{"Client Key is required in header: " + ClientKeyHeader}, + }) + } + + // Parse UUID + clientUUID, err := uuid.Parse(clientKey) + if err != nil { + return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ + "success": false, + "code": 400, + "messages": []string{"Invalid Client Key format"}, + }) + } + + // Validate client exists and is active + var client entity.Clients + if err := db.Where("id = ? AND is_active = ?", clientUUID, true).First(&client).Error; err != nil { + if err == gorm.ErrRecordNotFound { + return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{ + "success": false, + "code": 401, + "messages": []string{"Invalid or inactive Client Key"}, + }) + } + return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ + "success": false, + "code": 500, + "messages": []string{"Error validating Client Key"}, + }) + } + + // Store client ID in context for use in handlers + c.Locals(ClientContextKey, clientUUID) + + return c.Next() + } +} + +// GetClientID retrieves the client ID from the context +func GetClientID(c *fiber.Ctx) *uuid.UUID { + if clientID, ok := c.Locals(ClientContextKey).(uuid.UUID); ok { + return &clientID + } + return nil +} + +// AddExcludedPath adds a new path to the excluded paths list +func AddExcludedPath(path string) { + excludedPaths = append(excludedPaths, path) +} + +// GetExcludedPaths returns the current list of excluded paths +func GetExcludedPaths() []string { + return excludedPaths +} diff --git a/app/middleware/csrf.middleware.go b/app/middleware/csrf.middleware.go index 84d6d16..def2d69 100644 --- a/app/middleware/csrf.middleware.go +++ b/app/middleware/csrf.middleware.go @@ -2,9 +2,9 @@ package middleware import ( "fmt" - "go-humas-be/app/database/entity" "gorm.io/gorm" "time" + "web-medols-be/app/database/entity" ) type PostgresStorage struct { diff --git a/app/middleware/register.middleware.go b/app/middleware/register.middleware.go index 641501d..35e9b4d 100644 --- a/app/middleware/register.middleware.go +++ b/app/middleware/register.middleware.go @@ -3,11 +3,11 @@ package middleware import ( "github.com/gofiber/fiber/v2/middleware/csrf" "github.com/gofiber/fiber/v2/middleware/session" - "go-humas-be/app/database" - "go-humas-be/config/config" - utilsSvc "go-humas-be/utils" "log" "time" + "web-medols-be/app/database" + "web-medols-be/config/config" + utilsSvc "web-medols-be/utils" "github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2/middleware/compress" @@ -59,7 +59,7 @@ func (m *Middleware) Register(db *database.Database) { Next: utilsSvc.IsEnabled(m.Cfg.Middleware.Cors.Enable), AllowOrigins: "http://localhost:3000, http://localhost:4000, https://kontenhumas.com, https://mediapool.id, https://polrinews-project.vercel.app, http://127.0.0.1:3000, http://10.200.202.141", AllowMethods: "HEAD, GET, POST, PUT, DELETE, OPTION, PATCH", - AllowHeaders: "Origin, Content-Type, Accept, Accept-Language, Authorization, X-Requested-With, Access-Control-Request-Method, Access-Control-Request-Headers, Access-Control-Allow-Origin, Access-Control-Allow-Credentials, X-Csrf-Token, Cookie, Set-Cookie", + AllowHeaders: "Origin, Content-Type, Accept, Accept-Language, Authorization, X-Requested-With, Access-Control-Request-Method, Access-Control-Request-Headers, Access-Control-Allow-Origin, Access-Control-Allow-Credentials, X-Csrf-Token, Cookie, Set-Cookie, X-Client-Key", ExposeHeaders: "Content-Length, Content-Type", AllowCredentials: true, MaxAge: 12, @@ -125,6 +125,9 @@ func (m *Middleware) Register(db *database.Database) { //=============================== + // Client middleware - must be applied before other business logic + m.App.Use(ClientMiddleware(db.DB)) + m.App.Use(AuditTrailsMiddleware(db.DB)) StartAuditTrailCleanup(db.DB, m.Cfg.Middleware.AuditTrails.Retention) diff --git a/app/module/activity_logs/activity_logs.module.go b/app/module/activity_logs/activity_logs.module.go index 31e838b..501dfe3 100644 --- a/app/module/activity_logs/activity_logs.module.go +++ b/app/module/activity_logs/activity_logs.module.go @@ -2,10 +2,10 @@ package activity_logs import ( "github.com/gofiber/fiber/v2" - "go-humas-be/app/module/activity_logs/controller" - "go-humas-be/app/module/activity_logs/repository" - "go-humas-be/app/module/activity_logs/service" "go.uber.org/fx" + "web-medols-be/app/module/activity_logs/controller" + "web-medols-be/app/module/activity_logs/repository" + "web-medols-be/app/module/activity_logs/service" ) // struct of ActivityLogsRouter diff --git a/app/module/activity_logs/controller/activity_logs.controller.go b/app/module/activity_logs/controller/activity_logs.controller.go index d755e1a..1477475 100644 --- a/app/module/activity_logs/controller/activity_logs.controller.go +++ b/app/module/activity_logs/controller/activity_logs.controller.go @@ -3,13 +3,14 @@ package controller import ( "github.com/gofiber/fiber/v2" "github.com/rs/zerolog" - "go-humas-be/app/module/activity_logs/request" - "go-humas-be/app/module/activity_logs/service" - "go-humas-be/utils/paginator" - utilRes "go-humas-be/utils/response" - utilVal "go-humas-be/utils/validator" "strconv" "strings" + "web-medols-be/app/middleware" + "web-medols-be/app/module/activity_logs/request" + "web-medols-be/app/module/activity_logs/service" + "web-medols-be/utils/paginator" + utilRes "web-medols-be/utils/response" + utilVal "web-medols-be/utils/validator" ) type activityLogsController struct { @@ -51,6 +52,8 @@ func (_i *activityLogsController) All(c *fiber.Ctx) error { return err } + clientId := middleware.GetClientID(c) + reqContext := request.ActivityLogsQueryRequestContext{ ActivityTypeId: c.Query("activityTypeId"), Url: c.Query("url"), @@ -60,7 +63,7 @@ func (_i *activityLogsController) All(c *fiber.Ctx) error { req := reqContext.ToParamRequest() req.Pagination = paginate - activityLogsData, paging, err := _i.activityLogsService.All(req) + activityLogsData, paging, err := _i.activityLogsService.All(clientId, req) if err != nil { return err } @@ -90,7 +93,9 @@ func (_i *activityLogsController) Show(c *fiber.Ctx) error { return err } - activityLogsData, err := _i.activityLogsService.Show(uint(id)) + clientId := middleware.GetClientID(c) + + activityLogsData, err := _i.activityLogsService.Show(clientId, uint(id)) if err != nil { return err } @@ -121,6 +126,8 @@ func (_i *activityLogsController) Save(c *fiber.Ctx) error { return err } + clientId := middleware.GetClientID(c) + var authToken *string getTokenFromHeader := c.Get("Authorization") if getTokenFromHeader == "" { @@ -130,7 +137,7 @@ func (_i *activityLogsController) Save(c *fiber.Ctx) error { } visitorIp := GetVisitorIP(c) req.VisitorIp = &visitorIp - dataResult, err := _i.activityLogsService.Save(*req, authToken) + dataResult, err := _i.activityLogsService.Save(clientId, *req, authToken) if err != nil { return err } @@ -166,7 +173,9 @@ func (_i *activityLogsController) Update(c *fiber.Ctx) error { return err } - err = _i.activityLogsService.Update(uint(id), *req) + clientId := middleware.GetClientID(c) + + err = _i.activityLogsService.Update(clientId, uint(id), *req) if err != nil { return err } @@ -195,7 +204,9 @@ func (_i *activityLogsController) Delete(c *fiber.Ctx) error { return err } - err = _i.activityLogsService.Delete(uint(id)) + clientId := middleware.GetClientID(c) + + err = _i.activityLogsService.Delete(clientId, uint(id)) if err != nil { return err } @@ -218,7 +229,10 @@ func (_i *activityLogsController) Delete(c *fiber.Ctx) error { // @Router /activity-logs/statistics [get] func (_i *activityLogsController) GetActivityStats(c *fiber.Ctx) error { _i.Log.Info().Interface("GetActivityStats", "checker controller").Msg("") - activityStatsData, err := _i.activityLogsService.GetActivityStats() + + clientId := middleware.GetClientID(c) + + activityStatsData, err := _i.activityLogsService.GetActivityStats(clientId) if err != nil { return err } diff --git a/app/module/activity_logs/controller/controller.go b/app/module/activity_logs/controller/controller.go index 6af03a3..b76271c 100644 --- a/app/module/activity_logs/controller/controller.go +++ b/app/module/activity_logs/controller/controller.go @@ -2,7 +2,7 @@ package controller import ( "github.com/rs/zerolog" - "go-humas-be/app/module/activity_logs/service" + "web-medols-be/app/module/activity_logs/service" ) type Controller struct { diff --git a/app/module/activity_logs/mapper/activity_logs.mapper.go b/app/module/activity_logs/mapper/activity_logs.mapper.go index 2e8d51d..79a1a3f 100644 --- a/app/module/activity_logs/mapper/activity_logs.mapper.go +++ b/app/module/activity_logs/mapper/activity_logs.mapper.go @@ -1,8 +1,8 @@ package mapper import ( - "go-humas-be/app/database/entity" - res "go-humas-be/app/module/activity_logs/response" + "web-medols-be/app/database/entity" + res "web-medols-be/app/module/activity_logs/response" ) func ActivityLogsResponseMapper(activityLogsReq *entity.ActivityLogs) (activityLogsRes *res.ActivityLogsResponse) { diff --git a/app/module/activity_logs/repository/activity_logs.repository.go b/app/module/activity_logs/repository/activity_logs.repository.go index a8cb707..d0844ba 100644 --- a/app/module/activity_logs/repository/activity_logs.repository.go +++ b/app/module/activity_logs/repository/activity_logs.repository.go @@ -2,13 +2,14 @@ package repository import ( "fmt" + "github.com/google/uuid" "github.com/rs/zerolog" - "go-humas-be/app/database" - "go-humas-be/app/database/entity" - "go-humas-be/app/module/activity_logs/request" - "go-humas-be/utils/paginator" "strings" "time" + "web-medols-be/app/database" + "web-medols-be/app/database/entity" + "web-medols-be/app/module/activity_logs/request" + "web-medols-be/utils/paginator" ) type activityLogsRepository struct { @@ -18,14 +19,14 @@ type activityLogsRepository struct { // ActivityLogsRepository define interface of IActivityLogsRepository type ActivityLogsRepository interface { - GetAll(req request.ActivityLogsQueryRequest) (activityLogss []*entity.ActivityLogs, paging paginator.Pagination, err error) - FindOne(id uint) (activityLogs *entity.ActivityLogs, err error) + GetAll(clientId *uuid.UUID, req request.ActivityLogsQueryRequest) (activityLogss []*entity.ActivityLogs, paging paginator.Pagination, err error) + FindOne(clientId *uuid.UUID, id uint) (activityLogs *entity.ActivityLogs, err error) Create(activityLogs *entity.ActivityLogs) (activityLogsReturn *entity.ActivityLogs, err error) - Update(id uint, activityLogs *entity.ActivityLogs) (err error) - Delete(id uint) (err error) - CountUniqueVisitorAllTime() (count int64, err error) - CountUniqueVisitorToday() (count int64, err error) - CountTotalViewAllTime() (count int64, err error) + Update(clientId *uuid.UUID, id uint, activityLogs *entity.ActivityLogs) (err error) + Delete(clientId *uuid.UUID, id uint) (err error) + CountUniqueVisitorAllTime(clientId *uuid.UUID) (count int64, err error) + CountUniqueVisitorToday(clientId *uuid.UUID) (count int64, err error) + CountTotalViewAllTime(clientId *uuid.UUID) (count int64, err error) } func NewActivityLogsRepository(db *database.Database, logger zerolog.Logger) ActivityLogsRepository { @@ -36,11 +37,16 @@ func NewActivityLogsRepository(db *database.Database, logger zerolog.Logger) Act } // implement interface of IActivityLogsRepository -func (_i *activityLogsRepository) GetAll(req request.ActivityLogsQueryRequest) (activityLogss []*entity.ActivityLogs, paging paginator.Pagination, err error) { +func (_i *activityLogsRepository) GetAll(clientId *uuid.UUID, req request.ActivityLogsQueryRequest) (activityLogss []*entity.ActivityLogs, paging paginator.Pagination, err error) { var count int64 query := _i.DB.DB.Model(&entity.ActivityLogs{}) + // Add ClientId filter + if clientId != nil { + query = query.Where("client_id = ?", clientId) + } + if req.ActivityTypeId != nil { query = query.Where("activity_type_id = ?", req.ActivityTypeId) } @@ -77,8 +83,15 @@ func (_i *activityLogsRepository) GetAll(req request.ActivityLogsQueryRequest) ( return } -func (_i *activityLogsRepository) FindOne(id uint) (activityLogs *entity.ActivityLogs, err error) { - if err := _i.DB.DB.First(&activityLogs, id).Error; err != nil { +func (_i *activityLogsRepository) FindOne(clientId *uuid.UUID, id uint) (activityLogs *entity.ActivityLogs, err error) { + query := _i.DB.DB.Where("id = ?", id) + + // Add ClientId filter + if clientId != nil { + query = query.Where("client_id = ?", clientId) + } + + if err := query.First(&activityLogs).Error; err != nil { return nil, err } @@ -90,43 +103,47 @@ func (_i *activityLogsRepository) Create(activityLogs *entity.ActivityLogs) (act return activityLogs, result.Error } -func (_i *activityLogsRepository) Update(id uint, activityLogs *entity.ActivityLogs) (err error) { - return _i.DB.DB.Model(&entity.ActivityLogs{}). - Where(&entity.ActivityLogs{ID: id}). - Updates(activityLogs).Error +func (_i *activityLogsRepository) Update(clientId *uuid.UUID, id uint, activityLogs *entity.ActivityLogs) (err error) { + query := _i.DB.DB.Model(&entity.ActivityLogs{}).Where(&entity.ActivityLogs{ID: id}) + if clientId != nil { + query = query.Where("client_id = ?", clientId) + } + return query.Updates(activityLogs).Error } -func (_i *activityLogsRepository) Delete(id uint) error { - return _i.DB.DB.Delete(&entity.ActivityLogs{}, id).Error +func (_i *activityLogsRepository) Delete(clientId *uuid.UUID, id uint) error { + query := _i.DB.DB.Model(&entity.ActivityLogs{}).Where("id = ?", id) + if clientId != nil { + query = query.Where("client_id = ?", clientId) + } + return query.Delete(&entity.ActivityLogs{}).Error } -func (_i *activityLogsRepository) CountUniqueVisitorAllTime() (count int64, err error) { - err = _i.DB.DB. - Model(&entity.ActivityLogs{}). - Distinct("visitor_ip"). - Count(&count).Error - +func (_i *activityLogsRepository) CountUniqueVisitorAllTime(clientId *uuid.UUID) (count int64, err error) { + query := _i.DB.DB.Model(&entity.ActivityLogs{}) + if clientId != nil { + query = query.Where("client_id = ?", clientId) + } + err = query.Distinct("visitor_ip").Count(&count).Error return } -func (_i *activityLogsRepository) CountTotalViewAllTime() (count int64, err error) { - err = _i.DB.DB. - Model(&entity.ActivityLogs{}). - Where("activity_type_id = ?", 2). - Count(&count).Error - +func (_i *activityLogsRepository) CountTotalViewAllTime(clientId *uuid.UUID) (count int64, err error) { + query := _i.DB.DB.Model(&entity.ActivityLogs{}).Where("activity_type_id = ?", 2) + if clientId != nil { + query = query.Where("client_id = ?", clientId) + } + err = query.Count(&count).Error return } -func (_i *activityLogsRepository) CountUniqueVisitorToday() (count int64, err error) { +func (_i *activityLogsRepository) CountUniqueVisitorToday(clientId *uuid.UUID) (count int64, err error) { tenMinutesAgo := time.Now().Add(-10 * time.Minute) - err = _i.DB.DB. - Model(&entity.AuditTrails{}). - Where("created_at >= ?", tenMinutesAgo). - Select("ip"). - Group("ip"). - Count(&count).Error - + query := _i.DB.DB.Model(&entity.AuditTrails{}).Where("created_at >= ?", tenMinutesAgo) + if clientId != nil { + query = query.Where("client_id = ?", clientId) + } + err = query.Select("ip").Group("ip").Count(&count).Error return } diff --git a/app/module/activity_logs/request/activity_logs.request.go b/app/module/activity_logs/request/activity_logs.request.go index 60c9613..8c540d5 100644 --- a/app/module/activity_logs/request/activity_logs.request.go +++ b/app/module/activity_logs/request/activity_logs.request.go @@ -1,10 +1,10 @@ package request import ( - "go-humas-be/app/database/entity" - "go-humas-be/utils/paginator" "strconv" "time" + "web-medols-be/app/database/entity" + "web-medols-be/utils/paginator" ) type ActivityLogsGeneric interface { diff --git a/app/module/activity_logs/service/activity_logs.service.go b/app/module/activity_logs/service/activity_logs.service.go index 81395fd..8e7b5f0 100644 --- a/app/module/activity_logs/service/activity_logs.service.go +++ b/app/module/activity_logs/service/activity_logs.service.go @@ -1,16 +1,17 @@ package service import ( + "github.com/google/uuid" "github.com/rs/zerolog" - "go-humas-be/app/database/entity" - "go-humas-be/app/module/activity_logs/mapper" - "go-humas-be/app/module/activity_logs/repository" - "go-humas-be/app/module/activity_logs/request" - "go-humas-be/app/module/activity_logs/response" - "go-humas-be/app/module/articles/service" - usersRepository "go-humas-be/app/module/users/repository" - "go-humas-be/utils/paginator" - utilSvc "go-humas-be/utils/service" + "web-medols-be/app/database/entity" + "web-medols-be/app/module/activity_logs/mapper" + "web-medols-be/app/module/activity_logs/repository" + "web-medols-be/app/module/activity_logs/request" + "web-medols-be/app/module/activity_logs/response" + "web-medols-be/app/module/articles/service" + usersRepository "web-medols-be/app/module/users/repository" + "web-medols-be/utils/paginator" + utilSvc "web-medols-be/utils/service" ) // ActivityLogsService @@ -23,12 +24,12 @@ type activityLogsService struct { // ActivityLogsService define interface of IActivityLogsService type ActivityLogsService interface { - All(req request.ActivityLogsQueryRequest) (activityLogs []*response.ActivityLogsResponse, paging paginator.Pagination, err error) - Show(id uint) (activityLogs *response.ActivityLogsResponse, err error) - Save(req request.ActivityLogsCreateRequest, authToken *string) (activityLogs *entity.ActivityLogs, err error) - Update(id uint, req request.ActivityLogsUpdateRequest) (err error) - Delete(id uint) error - GetActivityStats() (activityStats *response.ActivityStatsResponse, err error) + All(clientId *uuid.UUID, req request.ActivityLogsQueryRequest) (activityLogs []*response.ActivityLogsResponse, paging paginator.Pagination, err error) + Show(clientId *uuid.UUID, id uint) (activityLogs *response.ActivityLogsResponse, err error) + Save(clientId *uuid.UUID, req request.ActivityLogsCreateRequest, authToken *string) (activityLogs *entity.ActivityLogs, err error) + Update(clientId *uuid.UUID, id uint, req request.ActivityLogsUpdateRequest) (err error) + Delete(clientId *uuid.UUID, id uint) error + GetActivityStats(clientId *uuid.UUID) (activityStats *response.ActivityStatsResponse, err error) } // NewActivityLogsService init ActivityLogsService @@ -43,8 +44,8 @@ func NewActivityLogsService(repo repository.ActivityLogsRepository, log zerolog. } // All implement interface of ActivityLogsService -func (_i *activityLogsService) All(req request.ActivityLogsQueryRequest) (activityLogss []*response.ActivityLogsResponse, paging paginator.Pagination, err error) { - results, paging, err := _i.Repo.GetAll(req) +func (_i *activityLogsService) All(clientId *uuid.UUID, req request.ActivityLogsQueryRequest) (activityLogss []*response.ActivityLogsResponse, paging paginator.Pagination, err error) { + results, paging, err := _i.Repo.GetAll(clientId, req) if err != nil { return } @@ -56,8 +57,8 @@ func (_i *activityLogsService) All(req request.ActivityLogsQueryRequest) (activi return } -func (_i *activityLogsService) Show(id uint) (activityLogs *response.ActivityLogsResponse, err error) { - result, err := _i.Repo.FindOne(id) +func (_i *activityLogsService) Show(clientId *uuid.UUID, id uint) (activityLogs *response.ActivityLogsResponse, err error) { + result, err := _i.Repo.FindOne(clientId, id) if err != nil { return nil, err } @@ -65,11 +66,15 @@ func (_i *activityLogsService) Show(id uint) (activityLogs *response.ActivityLog return mapper.ActivityLogsResponseMapper(result), nil } -func (_i *activityLogsService) Save(req request.ActivityLogsCreateRequest, authToken *string) (activityLogs *entity.ActivityLogs, err error) { +func (_i *activityLogsService) Save(clientId *uuid.UUID, req request.ActivityLogsCreateRequest, authToken *string) (activityLogs *entity.ActivityLogs, err error) { _i.Log.Info().Interface("data", req).Msg("") newReq := req.ToEntity() + if clientId != nil { + newReq.ClientId = clientId + } + if authToken != nil { createdBy := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, *authToken) newReq.UserId = &createdBy.ID @@ -81,7 +86,7 @@ func (_i *activityLogsService) Save(req request.ActivityLogsCreateRequest, authT } // update article - err = _i.ArticleService.UpdateActivityCount(*req.ArticleId, req.ActivityTypeId) + err = _i.ArticleService.UpdateActivityCount(clientId, *req.ArticleId, req.ActivityTypeId) if err != nil { return nil, err } @@ -89,26 +94,30 @@ func (_i *activityLogsService) Save(req request.ActivityLogsCreateRequest, authT return result, nil } -func (_i *activityLogsService) Update(id uint, req request.ActivityLogsUpdateRequest) (err error) { +func (_i *activityLogsService) Update(clientId *uuid.UUID, id uint, req request.ActivityLogsUpdateRequest) (err error) { _i.Log.Info().Interface("data", req).Msg("") - return _i.Repo.Update(id, req.ToEntity()) + newReq := req.ToEntity() + if clientId != nil { + newReq.ClientId = clientId + } + return _i.Repo.Update(clientId, id, newReq) } -func (_i *activityLogsService) Delete(id uint) error { - return _i.Repo.Delete(id) +func (_i *activityLogsService) Delete(clientId *uuid.UUID, id uint) error { + return _i.Repo.Delete(clientId, id) } -func (_i *activityLogsService) GetActivityStats() (activityStats *response.ActivityStatsResponse, err error) { +func (_i *activityLogsService) GetActivityStats(clientId *uuid.UUID) (activityStats *response.ActivityStatsResponse, err error) { _i.Log.Info().Interface("GetActivityStats", "checker").Msg("") - countUniqueVisitorAllTime, err := _i.Repo.CountUniqueVisitorAllTime() + countUniqueVisitorAllTime, err := _i.Repo.CountUniqueVisitorAllTime(clientId) if err != nil { return nil, err } - countUniqueVisitorToday, err := _i.Repo.CountUniqueVisitorToday() + countUniqueVisitorToday, err := _i.Repo.CountUniqueVisitorToday(clientId) if err != nil { return nil, err } - countTotalViewAllTime, err := _i.Repo.CountTotalViewAllTime() + countTotalViewAllTime, err := _i.Repo.CountTotalViewAllTime(clientId) if err != nil { return nil, err } diff --git a/app/module/advertisement/advertisement.module.go b/app/module/advertisement/advertisement.module.go index eae08b4..fbf27be 100644 --- a/app/module/advertisement/advertisement.module.go +++ b/app/module/advertisement/advertisement.module.go @@ -2,10 +2,10 @@ package advertisement import ( "github.com/gofiber/fiber/v2" - "go-humas-be/app/module/advertisement/controller" - "go-humas-be/app/module/advertisement/repository" - "go-humas-be/app/module/advertisement/service" "go.uber.org/fx" + "web-medols-be/app/module/advertisement/controller" + "web-medols-be/app/module/advertisement/repository" + "web-medols-be/app/module/advertisement/service" ) // struct of AdvertisementRouter diff --git a/app/module/advertisement/controller/advertisement.controller.go b/app/module/advertisement/controller/advertisement.controller.go index c9d8a60..620d27c 100644 --- a/app/module/advertisement/controller/advertisement.controller.go +++ b/app/module/advertisement/controller/advertisement.controller.go @@ -3,13 +3,14 @@ package controller import ( "github.com/gofiber/fiber/v2" "github.com/rs/zerolog" - "go-humas-be/app/module/advertisement/request" - "go-humas-be/app/module/advertisement/service" - "go-humas-be/utils/paginator" "strconv" + "web-medols-be/app/middleware" + "web-medols-be/app/module/advertisement/request" + "web-medols-be/app/module/advertisement/service" + "web-medols-be/utils/paginator" - utilRes "go-humas-be/utils/response" - utilVal "go-humas-be/utils/validator" + utilRes "web-medols-be/utils/response" + utilVal "web-medols-be/utils/validator" ) type advertisementController struct { @@ -53,6 +54,8 @@ func (_i *advertisementController) All(c *fiber.Ctx) error { return err } + clientId := middleware.GetClientID(c) + reqContext := request.AdvertisementQueryRequestContext{ Title: c.Query("title"), Description: c.Query("description"), @@ -63,7 +66,7 @@ func (_i *advertisementController) All(c *fiber.Ctx) error { req := reqContext.ToParamRequest() req.Pagination = paginate - advertisementData, paging, err := _i.advertisementService.All(req) + advertisementData, paging, err := _i.advertisementService.All(clientId, req) if err != nil { return err } @@ -93,7 +96,9 @@ func (_i *advertisementController) Show(c *fiber.Ctx) error { return err } - advertisementData, err := _i.advertisementService.Show(uint(id)) + clientId := middleware.GetClientID(c) + + advertisementData, err := _i.advertisementService.Show(clientId, uint(id)) if err != nil { return err } @@ -124,7 +129,9 @@ func (_i *advertisementController) Save(c *fiber.Ctx) error { return err } - dataResult, err := _i.advertisementService.Save(*req) + clientId := middleware.GetClientID(c) + + dataResult, err := _i.advertisementService.Save(clientId, *req) if err != nil { return err } @@ -156,7 +163,9 @@ func (_i *advertisementController) Upload(c *fiber.Ctx) error { return err } - err = _i.advertisementService.Upload(c, uint(id)) + clientId := middleware.GetClientID(c) + + err = _i.advertisementService.Upload(clientId, c, uint(id)) if err != nil { return err } @@ -191,7 +200,9 @@ func (_i *advertisementController) Update(c *fiber.Ctx) error { return err } - err = _i.advertisementService.Update(uint(id), *req) + clientId := middleware.GetClientID(c) + + err = _i.advertisementService.Update(clientId, uint(id), *req) if err != nil { return err } @@ -227,7 +238,9 @@ func (_i *advertisementController) UpdatePublish(c *fiber.Ctx) error { return err } - err = _i.advertisementService.UpdatePublish(uint(id), isPublish) + clientId := middleware.GetClientID(c) + + err = _i.advertisementService.UpdatePublish(clientId, uint(id), isPublish) if err != nil { return err } @@ -256,7 +269,9 @@ func (_i *advertisementController) Delete(c *fiber.Ctx) error { return err } - err = _i.advertisementService.Delete(uint(id)) + clientId := middleware.GetClientID(c) + + err = _i.advertisementService.Delete(clientId, uint(id)) if err != nil { return err } @@ -279,5 +294,6 @@ func (_i *advertisementController) Delete(c *fiber.Ctx) error { // @Failure 500 {object} response.InternalServerError // @Router /advertisement/viewer/{filename} [get] func (_i *advertisementController) Viewer(c *fiber.Ctx) error { - return _i.advertisementService.Viewer(c) + clientId := middleware.GetClientID(c) + return _i.advertisementService.Viewer(clientId, c) } diff --git a/app/module/advertisement/controller/controller.go b/app/module/advertisement/controller/controller.go index 1e50050..5d0b8d8 100644 --- a/app/module/advertisement/controller/controller.go +++ b/app/module/advertisement/controller/controller.go @@ -2,7 +2,7 @@ package controller import ( "github.com/rs/zerolog" - "go-humas-be/app/module/advertisement/service" + "web-medols-be/app/module/advertisement/service" ) type Controller struct { diff --git a/app/module/advertisement/mapper/advertisement.mapper.go b/app/module/advertisement/mapper/advertisement.mapper.go index a03d37a..4ea87d9 100644 --- a/app/module/advertisement/mapper/advertisement.mapper.go +++ b/app/module/advertisement/mapper/advertisement.mapper.go @@ -1,8 +1,8 @@ package mapper import ( - "go-humas-be/app/database/entity" - res "go-humas-be/app/module/advertisement/response" + "web-medols-be/app/database/entity" + res "web-medols-be/app/module/advertisement/response" ) func AdvertisementResponseMapper(advertisementReq *entity.Advertisement, host string) (advertisementRes *res.AdvertisementResponse) { diff --git a/app/module/advertisement/repository/advertisement.repository.go b/app/module/advertisement/repository/advertisement.repository.go index e2f5580..29226c3 100644 --- a/app/module/advertisement/repository/advertisement.repository.go +++ b/app/module/advertisement/repository/advertisement.repository.go @@ -2,13 +2,14 @@ package repository import ( "fmt" + "github.com/google/uuid" "github.com/rs/zerolog" - "go-humas-be/app/database" - "go-humas-be/app/database/entity" - "go-humas-be/app/module/advertisement/request" - "go-humas-be/utils/paginator" - utilSvc "go-humas-be/utils/service" "strings" + "web-medols-be/app/database" + "web-medols-be/app/database/entity" + "web-medols-be/app/module/advertisement/request" + "web-medols-be/utils/paginator" + utilSvc "web-medols-be/utils/service" ) type advertisementRepository struct { @@ -18,12 +19,12 @@ type advertisementRepository struct { // AdvertisementRepository define interface of IAdvertisementRepository type AdvertisementRepository interface { - GetAll(req request.AdvertisementQueryRequest) (advertisements []*entity.Advertisement, paging paginator.Pagination, err error) - FindOne(id uint) (advertisement *entity.Advertisement, err error) - FindByFilename(contentFilename string) (advertisement *entity.Advertisement, err error) + GetAll(clientId *uuid.UUID, req request.AdvertisementQueryRequest) (advertisements []*entity.Advertisement, paging paginator.Pagination, err error) + FindOne(clientId *uuid.UUID, id uint) (advertisement *entity.Advertisement, err error) + FindByFilename(clientId *uuid.UUID, contentFilename string) (advertisement *entity.Advertisement, err error) Create(advertisement *entity.Advertisement) (advertisementReturn *entity.Advertisement, err error) - Update(id uint, advertisement *entity.Advertisement) (err error) - Delete(id uint) (err error) + Update(clientId *uuid.UUID, id uint, advertisement *entity.Advertisement) (err error) + Delete(clientId *uuid.UUID, id uint) (err error) } func NewAdvertisementRepository(db *database.Database, logger zerolog.Logger) AdvertisementRepository { @@ -34,10 +35,16 @@ func NewAdvertisementRepository(db *database.Database, logger zerolog.Logger) Ad } // implement interface of IAdvertisementRepository -func (_i *advertisementRepository) GetAll(req request.AdvertisementQueryRequest) (advertisements []*entity.Advertisement, paging paginator.Pagination, err error) { +func (_i *advertisementRepository) GetAll(clientId *uuid.UUID, req request.AdvertisementQueryRequest) (advertisements []*entity.Advertisement, paging paginator.Pagination, err error) { var count int64 query := _i.DB.DB.Model(&entity.Advertisement{}) + + // Add ClientId filter + if clientId != nil { + query = query.Where("client_id = ?", clientId) + } + query = query.Where("is_active = ?", true) if req.Title != nil && *req.Title != "" { @@ -82,17 +89,30 @@ func (_i *advertisementRepository) GetAll(req request.AdvertisementQueryRequest) return } -func (_i *advertisementRepository) FindOne(id uint) (advertisement *entity.Advertisement, err error) { - if err := _i.DB.DB.First(&advertisement, id).Error; err != nil { +func (_i *advertisementRepository) FindOne(clientId *uuid.UUID, id uint) (advertisement *entity.Advertisement, err error) { + query := _i.DB.DB.Where("id = ?", id) + + // Add ClientId filter + if clientId != nil { + query = query.Where("client_id = ?", clientId) + } + + if err := query.First(&advertisement).Error; err != nil { return nil, err } return advertisement, nil } -func (_i *advertisementRepository) FindByFilename(contentFilename string) (advertisement *entity.Advertisement, err error) { +func (_i *advertisementRepository) FindByFilename(clientId *uuid.UUID, contentFilename string) (advertisement *entity.Advertisement, err error) { + query := _i.DB.DB.Where("content_file_name = ?", contentFilename) - if err := _i.DB.DB.Where("content_file_name = ?", contentFilename).First(&advertisement).Error; err != nil { + // Add ClientId filter + if clientId != nil { + query = query.Where("client_id = ?", clientId) + } + + if err := query.First(&advertisement).Error; err != nil { return nil, err } @@ -104,16 +124,22 @@ func (_i *advertisementRepository) Create(advertisement *entity.Advertisement) ( return advertisement, result.Error } -func (_i *advertisementRepository) Update(id uint, advertisement *entity.Advertisement) (err error) { +func (_i *advertisementRepository) Update(clientId *uuid.UUID, id uint, advertisement *entity.Advertisement) (err error) { advertisementMap, err := utilSvc.StructToMap(advertisement) if err != nil { return err } - return _i.DB.DB.Model(&entity.Advertisement{}). - Where(&entity.Advertisement{ID: id}). - Updates(advertisementMap).Error + query := _i.DB.DB.Model(&entity.Advertisement{}).Where(&entity.Advertisement{ID: id}) + if clientId != nil { + query = query.Where("client_id = ?", clientId) + } + return query.Updates(advertisementMap).Error } -func (_i *advertisementRepository) Delete(id uint) error { - return _i.DB.DB.Delete(&entity.Advertisement{}, id).Error +func (_i *advertisementRepository) Delete(clientId *uuid.UUID, id uint) error { + query := _i.DB.DB.Model(&entity.Advertisement{}).Where("id = ?", id) + if clientId != nil { + query = query.Where("client_id = ?", clientId) + } + return query.Delete(&entity.Advertisement{}).Error } diff --git a/app/module/advertisement/request/advertisement.request.go b/app/module/advertisement/request/advertisement.request.go index f3e25c5..608db8a 100644 --- a/app/module/advertisement/request/advertisement.request.go +++ b/app/module/advertisement/request/advertisement.request.go @@ -1,10 +1,10 @@ package request import ( - "go-humas-be/app/database/entity" - "go-humas-be/utils/paginator" "strconv" "time" + "web-medols-be/app/database/entity" + "web-medols-be/utils/paginator" ) type AdvertisementGeneric interface { diff --git a/app/module/advertisement/service/advertisement.service.go b/app/module/advertisement/service/advertisement.service.go index f95dc99..39a22b5 100644 --- a/app/module/advertisement/service/advertisement.service.go +++ b/app/module/advertisement/service/advertisement.service.go @@ -4,17 +4,9 @@ import ( "context" "fmt" "github.com/gofiber/fiber/v2" + "github.com/google/uuid" "github.com/minio/minio-go/v7" "github.com/rs/zerolog" - "go-humas-be/app/database/entity" - "go-humas-be/app/module/advertisement/mapper" - "go-humas-be/app/module/advertisement/repository" - "go-humas-be/app/module/advertisement/request" - "go-humas-be/app/module/advertisement/response" - usersRepository "go-humas-be/app/module/users/repository" - config "go-humas-be/config/config" - minioStorage "go-humas-be/config/config" - "go-humas-be/utils/paginator" "io" "log" "math/rand" @@ -23,6 +15,15 @@ import ( "strconv" "strings" "time" + "web-medols-be/app/database/entity" + "web-medols-be/app/module/advertisement/mapper" + "web-medols-be/app/module/advertisement/repository" + "web-medols-be/app/module/advertisement/request" + "web-medols-be/app/module/advertisement/response" + usersRepository "web-medols-be/app/module/users/repository" + config "web-medols-be/config/config" + minioStorage "web-medols-be/config/config" + "web-medols-be/utils/paginator" ) // AdvertisementService @@ -36,14 +37,14 @@ type advertisementService struct { // AdvertisementService define interface of IAdvertisementService type AdvertisementService interface { - All(req request.AdvertisementQueryRequest) (advertisement []*response.AdvertisementResponse, paging paginator.Pagination, err error) - Show(id uint) (advertisement *response.AdvertisementResponse, err error) - Save(req request.AdvertisementCreateRequest) (advertisement *entity.Advertisement, err error) - Upload(c *fiber.Ctx, id uint) (err error) - Update(id uint, req request.AdvertisementUpdateRequest) (err error) - UpdatePublish(id uint, isPublish bool) (err error) - Delete(id uint) error - Viewer(c *fiber.Ctx) (err error) + All(clientId *uuid.UUID, req request.AdvertisementQueryRequest) (advertisement []*response.AdvertisementResponse, paging paginator.Pagination, err error) + Show(clientId *uuid.UUID, id uint) (advertisement *response.AdvertisementResponse, err error) + Save(clientId *uuid.UUID, req request.AdvertisementCreateRequest) (advertisement *entity.Advertisement, err error) + Upload(clientId *uuid.UUID, c *fiber.Ctx, id uint) (err error) + Update(clientId *uuid.UUID, id uint, req request.AdvertisementUpdateRequest) (err error) + UpdatePublish(clientId *uuid.UUID, id uint, isPublish bool) (err error) + Delete(clientId *uuid.UUID, id uint) error + Viewer(clientId *uuid.UUID, c *fiber.Ctx) (err error) } // NewAdvertisementService init AdvertisementService @@ -59,8 +60,8 @@ func NewAdvertisementService(repo repository.AdvertisementRepository, minioStora } // All implement interface of AdvertisementService -func (_i *advertisementService) All(req request.AdvertisementQueryRequest) (advertisements []*response.AdvertisementResponse, paging paginator.Pagination, err error) { - results, paging, err := _i.Repo.GetAll(req) +func (_i *advertisementService) All(clientId *uuid.UUID, req request.AdvertisementQueryRequest) (advertisements []*response.AdvertisementResponse, paging paginator.Pagination, err error) { + results, paging, err := _i.Repo.GetAll(clientId, req) if err != nil { return } @@ -73,8 +74,8 @@ func (_i *advertisementService) All(req request.AdvertisementQueryRequest) (adve return } -func (_i *advertisementService) Show(id uint) (advertisement *response.AdvertisementResponse, err error) { - result, err := _i.Repo.FindOne(id) +func (_i *advertisementService) Show(clientId *uuid.UUID, id uint) (advertisement *response.AdvertisementResponse, err error) { + result, err := _i.Repo.FindOne(clientId, id) if err != nil { return nil, err } @@ -83,13 +84,18 @@ func (_i *advertisementService) Show(id uint) (advertisement *response.Advertise return mapper.AdvertisementResponseMapper(result, host), nil } -func (_i *advertisementService) Save(req request.AdvertisementCreateRequest) (advertisement *entity.Advertisement, err error) { +func (_i *advertisementService) Save(clientId *uuid.UUID, req request.AdvertisementCreateRequest) (advertisement *entity.Advertisement, err error) { _i.Log.Info().Interface("data", req).Msg("") newReq := req.ToEntity() + + if clientId != nil { + newReq.ClientId = clientId + } + return _i.Repo.Create(newReq) } -func (_i *advertisementService) Upload(c *fiber.Ctx, id uint) (err error) { +func (_i *advertisementService) Upload(clientId *uuid.UUID, c *fiber.Ctx, id uint) (err error) { bucketName := _i.MinioStorage.Cfg.ObjectStorage.MinioStorage.BucketName form, err := c.MultipartForm() @@ -102,7 +108,7 @@ func (_i *advertisementService) Upload(c *fiber.Ctx, id uint) (err error) { // Create minio connection. minioClient, err := _i.MinioStorage.ConnectMinio() - result, err := _i.Repo.FindOne(id) + result, err := _i.Repo.FindOne(clientId, id) if result == nil { // Return status 400. Id not found. @@ -154,7 +160,7 @@ func (_i *advertisementService) Upload(c *fiber.Ctx, id uint) (err error) { result.ContentFileName = &newFilename result.ContentFilePath = &objectName - err = _i.Repo.Update(id, result) + err = _i.Repo.Update(clientId, id, result) if err != nil { return err } @@ -170,12 +176,16 @@ func (_i *advertisementService) Upload(c *fiber.Ctx, id uint) (err error) { return } -func (_i *advertisementService) Update(id uint, req request.AdvertisementUpdateRequest) (err error) { +func (_i *advertisementService) Update(clientId *uuid.UUID, id uint, req request.AdvertisementUpdateRequest) (err error) { _i.Log.Info().Interface("data", req).Msg("") - return _i.Repo.Update(id, req.ToEntity()) + newReq := req.ToEntity() + if clientId != nil { + newReq.ClientId = clientId + } + return _i.Repo.Update(clientId, id, newReq) } -func (_i *advertisementService) UpdatePublish(id uint, isPublish bool) (err error) { +func (_i *advertisementService) UpdatePublish(clientId *uuid.UUID, id uint, isPublish bool) (err error) { _i.Log.Info().Str("timestamp", time.Now(). Format(time.RFC3339)).Str("Service:Resource", "UpdatePublish"). Interface("ids", id).Msg("") @@ -183,7 +193,7 @@ func (_i *advertisementService) UpdatePublish(id uint, isPublish bool) (err erro Format(time.RFC3339)).Str("Service:Resource", "UpdatePublish"). Interface("isPublish", isPublish).Msg("") - result, err := _i.Repo.FindOne(id) + result, err := _i.Repo.FindOne(clientId, id) if err != nil { return err } @@ -194,21 +204,24 @@ func (_i *advertisementService) UpdatePublish(id uint, isPublish bool) (err erro Format(time.RFC3339)).Str("Service:Resource", "UpdatePublish"). Interface("result", result).Msg("") - return _i.Repo.Update(id, result) + return _i.Repo.Update(clientId, id, result) } -func (_i *advertisementService) Delete(id uint) error { - result, err := _i.Repo.FindOne(id) +func (_i *advertisementService) Delete(clientId *uuid.UUID, id uint) error { + result, err := _i.Repo.FindOne(clientId, id) if err != nil { return err } result.IsActive = false - return _i.Repo.Update(id, result) + if clientId != nil { + result.ClientId = clientId + } + return _i.Repo.Update(clientId, id, result) } -func (_i *advertisementService) Viewer(c *fiber.Ctx) (err error) { +func (_i *advertisementService) Viewer(clientId *uuid.UUID, c *fiber.Ctx) (err error) { filename := c.Params("filename") - result, err := _i.Repo.FindByFilename(filename) + result, err := _i.Repo.FindByFilename(clientId, filename) if err != nil { return err } diff --git a/app/module/article_approvals/article_approvals.module.go b/app/module/article_approvals/article_approvals.module.go index 5d6445d..8f29692 100644 --- a/app/module/article_approvals/article_approvals.module.go +++ b/app/module/article_approvals/article_approvals.module.go @@ -2,10 +2,10 @@ package article_approvals import ( "github.com/gofiber/fiber/v2" - "go-humas-be/app/module/article_approvals/controller" - "go-humas-be/app/module/article_approvals/repository" - "go-humas-be/app/module/article_approvals/service" "go.uber.org/fx" + "web-medols-be/app/module/article_approvals/controller" + "web-medols-be/app/module/article_approvals/repository" + "web-medols-be/app/module/article_approvals/service" ) // struct of ArticleApprovalsRouter diff --git a/app/module/article_approvals/controller/article_approvals.controller.go b/app/module/article_approvals/controller/article_approvals.controller.go index 6014895..6411176 100644 --- a/app/module/article_approvals/controller/article_approvals.controller.go +++ b/app/module/article_approvals/controller/article_approvals.controller.go @@ -3,13 +3,14 @@ package controller import ( "github.com/gofiber/fiber/v2" "github.com/rs/zerolog" - "go-humas-be/app/module/article_approvals/request" - "go-humas-be/app/module/article_approvals/service" - "go-humas-be/utils/paginator" "strconv" + "web-medols-be/app/middleware" + "web-medols-be/app/module/article_approvals/request" + "web-medols-be/app/module/article_approvals/service" + "web-medols-be/utils/paginator" - utilRes "go-humas-be/utils/response" - utilVal "go-humas-be/utils/validator" + utilRes "web-medols-be/utils/response" + utilVal "web-medols-be/utils/validator" ) type articleApprovalsController struct { @@ -122,7 +123,11 @@ func (_i *articleApprovalsController) Save(c *fiber.Ctx) error { } authToken := c.Get("Authorization") - dataResult, err := _i.articleApprovalsService.Save(*req, authToken) + + // Get ClientId from context + clientId := middleware.GetClientID(c) + + dataResult, err := _i.articleApprovalsService.Save(clientId, *req, authToken) if err != nil { return err } diff --git a/app/module/article_approvals/controller/controller.go b/app/module/article_approvals/controller/controller.go index 08ae49c..8f12a3f 100644 --- a/app/module/article_approvals/controller/controller.go +++ b/app/module/article_approvals/controller/controller.go @@ -2,7 +2,7 @@ package controller import ( "github.com/rs/zerolog" - "go-humas-be/app/module/article_approvals/service" + "web-medols-be/app/module/article_approvals/service" ) type Controller struct { diff --git a/app/module/article_approvals/mapper/article_approvals.mapper.go b/app/module/article_approvals/mapper/article_approvals.mapper.go index 2333f17..336fc39 100644 --- a/app/module/article_approvals/mapper/article_approvals.mapper.go +++ b/app/module/article_approvals/mapper/article_approvals.mapper.go @@ -1,8 +1,8 @@ package mapper import ( - "go-humas-be/app/database/entity" - res "go-humas-be/app/module/article_approvals/response" + "web-medols-be/app/database/entity" + res "web-medols-be/app/module/article_approvals/response" ) func ArticleApprovalsResponseMapper(articleApprovalsReq *entity.ArticleApprovals) (articleApprovalsRes *res.ArticleApprovalsResponse) { diff --git a/app/module/article_approvals/repository/article_approvals.repository.go b/app/module/article_approvals/repository/article_approvals.repository.go index bb458cd..d658ef3 100644 --- a/app/module/article_approvals/repository/article_approvals.repository.go +++ b/app/module/article_approvals/repository/article_approvals.repository.go @@ -3,12 +3,12 @@ package repository import ( "fmt" "github.com/rs/zerolog" - "go-humas-be/app/database" - "go-humas-be/app/database/entity" - "go-humas-be/app/module/article_approvals/request" - "go-humas-be/utils/paginator" - utilSvc "go-humas-be/utils/service" "strings" + "web-medols-be/app/database" + "web-medols-be/app/database/entity" + "web-medols-be/app/module/article_approvals/request" + "web-medols-be/utils/paginator" + utilSvc "web-medols-be/utils/service" ) type articleApprovalsRepository struct { diff --git a/app/module/article_approvals/request/article_approvals.request.go b/app/module/article_approvals/request/article_approvals.request.go index fbd959c..4f79252 100644 --- a/app/module/article_approvals/request/article_approvals.request.go +++ b/app/module/article_approvals/request/article_approvals.request.go @@ -1,9 +1,9 @@ package request import ( - "go-humas-be/app/database/entity" - "go-humas-be/utils/paginator" "strconv" + "web-medols-be/app/database/entity" + "web-medols-be/utils/paginator" ) type ArticleApprovalsGeneric interface { diff --git a/app/module/article_approvals/service/article_approvals.service.go b/app/module/article_approvals/service/article_approvals.service.go index 1fdf469..0f23692 100644 --- a/app/module/article_approvals/service/article_approvals.service.go +++ b/app/module/article_approvals/service/article_approvals.service.go @@ -1,17 +1,18 @@ package service import ( + "github.com/google/uuid" "github.com/rs/zerolog" - "go-humas-be/app/database/entity" - "go-humas-be/app/module/article_approvals/mapper" - "go-humas-be/app/module/article_approvals/repository" - "go-humas-be/app/module/article_approvals/request" - "go-humas-be/app/module/article_approvals/response" - articlesService "go-humas-be/app/module/articles/service" - usersRepository "go-humas-be/app/module/users/repository" - "go-humas-be/utils/paginator" + "web-medols-be/app/database/entity" + "web-medols-be/app/module/article_approvals/mapper" + "web-medols-be/app/module/article_approvals/repository" + "web-medols-be/app/module/article_approvals/request" + "web-medols-be/app/module/article_approvals/response" + articlesService "web-medols-be/app/module/articles/service" + usersRepository "web-medols-be/app/module/users/repository" + "web-medols-be/utils/paginator" - utilSvc "go-humas-be/utils/service" + utilSvc "web-medols-be/utils/service" ) // ArticleApprovalsService @@ -26,7 +27,7 @@ type articleApprovalsService struct { type ArticleApprovalsService interface { All(req request.ArticleApprovalsQueryRequest) (articleApprovals []*response.ArticleApprovalsResponse, paging paginator.Pagination, err error) Show(id uint) (articleApprovals *response.ArticleApprovalsResponse, err error) - Save(req request.ArticleApprovalsCreateRequest, authToken string) (articleApprovals *entity.ArticleApprovals, err error) + Save(clientId *uuid.UUID, req request.ArticleApprovalsCreateRequest, authToken string) (articleApprovals *entity.ArticleApprovals, err error) Update(id uint, req request.ArticleApprovalsUpdateRequest) (err error) Delete(id uint) error } @@ -65,7 +66,7 @@ func (_i *articleApprovalsService) Show(id uint) (articleApprovals *response.Art return mapper.ArticleApprovalsResponseMapper(result), nil } -func (_i *articleApprovalsService) Save(req request.ArticleApprovalsCreateRequest, authToken string) (articleApprovals *entity.ArticleApprovals, err error) { +func (_i *articleApprovalsService) Save(clientId *uuid.UUID, req request.ArticleApprovalsCreateRequest, authToken string) (articleApprovals *entity.ArticleApprovals, err error) { _i.Log.Info().Interface("data", req).Msg("") newReq := req.ToEntity() @@ -77,7 +78,7 @@ func (_i *articleApprovalsService) Save(req request.ArticleApprovalsCreateReques approvalByUserLevelId := createdBy.UserLevelId approvalParentLevelId := createdBy.UserLevel.ParentLevelId - err = _i.ArticlesService.UpdateApproval(newReq.ArticleId, newReq.StatusId, int(approvalByUserLevelId), *newReq.ApprovalAtLevel, *approvalParentLevelId) + err = _i.ArticlesService.UpdateApproval(clientId, newReq.ArticleId, newReq.StatusId, int(approvalByUserLevelId), *newReq.ApprovalAtLevel, *approvalParentLevelId) if err != nil { return nil, err } diff --git a/app/module/article_categories/article_categories.module.go b/app/module/article_categories/article_categories.module.go index 34bf423..3dbda68 100644 --- a/app/module/article_categories/article_categories.module.go +++ b/app/module/article_categories/article_categories.module.go @@ -2,10 +2,10 @@ package article_categories import ( "github.com/gofiber/fiber/v2" - "go-humas-be/app/module/article_categories/controller" - "go-humas-be/app/module/article_categories/repository" - "go-humas-be/app/module/article_categories/service" "go.uber.org/fx" + "web-medols-be/app/module/article_categories/controller" + "web-medols-be/app/module/article_categories/repository" + "web-medols-be/app/module/article_categories/service" ) // struct of ArticleCategoriesRouter diff --git a/app/module/article_categories/controller/article_categories.controller.go b/app/module/article_categories/controller/article_categories.controller.go index b7826fd..c5aac3b 100644 --- a/app/module/article_categories/controller/article_categories.controller.go +++ b/app/module/article_categories/controller/article_categories.controller.go @@ -2,13 +2,14 @@ package controller import ( "github.com/gofiber/fiber/v2" - "go-humas-be/app/module/article_categories/request" - "go-humas-be/app/module/article_categories/service" - "go-humas-be/utils/paginator" "strconv" + "web-medols-be/app/middleware" + "web-medols-be/app/module/article_categories/request" + "web-medols-be/app/module/article_categories/service" + "web-medols-be/utils/paginator" - utilRes "go-humas-be/utils/response" - utilVal "go-humas-be/utils/validator" + utilRes "web-medols-be/utils/response" + utilVal "web-medols-be/utils/validator" ) type articleCategoriesController struct { @@ -53,6 +54,7 @@ func (_i *articleCategoriesController) All(c *fiber.Ctx) error { } authToken := c.Get("Authorization") + clientId := middleware.GetClientID(c) reqContext := request.ArticleCategoriesQueryRequestContext{ Title: c.Query("title"), @@ -64,7 +66,7 @@ func (_i *articleCategoriesController) All(c *fiber.Ctx) error { req := reqContext.ToParamRequest() req.Pagination = paginate - articleCategoriesData, paging, err := _i.articleCategoriesService.All(req, authToken) + articleCategoriesData, paging, err := _i.articleCategoriesService.All(clientId, req, authToken) if err != nil { return err } @@ -94,7 +96,9 @@ func (_i *articleCategoriesController) Show(c *fiber.Ctx) error { return err } - articleCategoriesData, err := _i.articleCategoriesService.Show(uint(id)) + clientId := middleware.GetClientID(c) + + articleCategoriesData, err := _i.articleCategoriesService.Show(clientId, uint(id)) if err != nil { return err } @@ -123,7 +127,9 @@ func (_i *articleCategoriesController) ShowByOldId(c *fiber.Ctx) error { return err } - articleCategoriesData, err := _i.articleCategoriesService.ShowByOldId(uint(id)) + clientId := middleware.GetClientID(c) + + articleCategoriesData, err := _i.articleCategoriesService.ShowByOldId(clientId, uint(id)) if err != nil { return err } @@ -148,8 +154,9 @@ func (_i *articleCategoriesController) ShowByOldId(c *fiber.Ctx) error { // @Router /article-categories/slug/{slug} [get] func (_i *articleCategoriesController) ShowBySlug(c *fiber.Ctx) error { slug := c.Params("slug") + clientId := middleware.GetClientID(c) - articleCategoriesData, err := _i.articleCategoriesService.ShowBySlug(slug) + articleCategoriesData, err := _i.articleCategoriesService.ShowBySlug(clientId, slug) if err != nil { return err } @@ -181,7 +188,9 @@ func (_i *articleCategoriesController) Save(c *fiber.Ctx) error { } authToken := c.Get("Authorization") - dataResult, err := _i.articleCategoriesService.Save(*req, authToken) + clientId := middleware.GetClientID(c) + + dataResult, err := _i.articleCategoriesService.Save(clientId, *req, authToken) if err != nil { return err } @@ -208,7 +217,8 @@ func (_i *articleCategoriesController) Save(c *fiber.Ctx) error { // @Failure 500 {object} response.InternalServerError // @Router /article-categories/thumbnail/{id} [post] func (_i *articleCategoriesController) SaveThumbnail(c *fiber.Ctx) error { - err := _i.articleCategoriesService.SaveThumbnail(c) + clientId := middleware.GetClientID(c) + err := _i.articleCategoriesService.SaveThumbnail(clientId, c) if err != nil { return err } @@ -243,7 +253,8 @@ func (_i *articleCategoriesController) Update(c *fiber.Ctx) error { return err } - err = _i.articleCategoriesService.Update(uint(id), *req) + clientId := middleware.GetClientID(c) + err = _i.articleCategoriesService.Update(clientId, uint(id), *req) if err != nil { return err } @@ -272,7 +283,8 @@ func (_i *articleCategoriesController) Delete(c *fiber.Ctx) error { return err } - err = _i.articleCategoriesService.Delete(uint(id)) + clientId := middleware.GetClientID(c) + err = _i.articleCategoriesService.Delete(clientId, uint(id)) if err != nil { return err } diff --git a/app/module/article_categories/controller/controller.go b/app/module/article_categories/controller/controller.go index 0a510ae..1a0bdd1 100644 --- a/app/module/article_categories/controller/controller.go +++ b/app/module/article_categories/controller/controller.go @@ -1,6 +1,6 @@ package controller -import "go-humas-be/app/module/article_categories/service" +import "web-medols-be/app/module/article_categories/service" type Controller struct { ArticleCategories ArticleCategoriesController @@ -10,4 +10,4 @@ func NewController(ArticleCategoriesService service.ArticleCategoriesService) *C return &Controller{ ArticleCategories: NewArticleCategoriesController(ArticleCategoriesService), } -} \ No newline at end of file +} diff --git a/app/module/article_categories/mapper/article_categories.mapper.go b/app/module/article_categories/mapper/article_categories.mapper.go index 7193203..1f86ba7 100644 --- a/app/module/article_categories/mapper/article_categories.mapper.go +++ b/app/module/article_categories/mapper/article_categories.mapper.go @@ -1,10 +1,10 @@ package mapper import ( - "go-humas-be/app/database/entity" - res "go-humas-be/app/module/article_categories/response" "strconv" "strings" + "web-medols-be/app/database/entity" + res "web-medols-be/app/module/article_categories/response" ) func ArticleCategoriesResponseMapper(articleCategoriesReq *entity.ArticleCategories, host string) (articleCategoriesRes *res.ArticleCategoriesResponse) { diff --git a/app/module/article_categories/repository/article_categories.repository.go b/app/module/article_categories/repository/article_categories.repository.go index 5b53014..2a65abc 100644 --- a/app/module/article_categories/repository/article_categories.repository.go +++ b/app/module/article_categories/repository/article_categories.repository.go @@ -2,13 +2,14 @@ package repository import ( "fmt" + "github.com/google/uuid" "github.com/rs/zerolog" - "go-humas-be/app/database" - "go-humas-be/app/database/entity" - "go-humas-be/app/module/article_categories/request" - "go-humas-be/utils/paginator" - utilSvc "go-humas-be/utils/service" "strings" + "web-medols-be/app/database" + "web-medols-be/app/database/entity" + "web-medols-be/app/module/article_categories/request" + "web-medols-be/utils/paginator" + utilSvc "web-medols-be/utils/service" ) type articleCategoriesRepository struct { @@ -18,13 +19,13 @@ type articleCategoriesRepository struct { // ArticleCategoriesRepository define interface of IArticleCategoriesRepository type ArticleCategoriesRepository interface { - GetAll(req request.ArticleCategoriesQueryRequest) (articleCategoriess []*entity.ArticleCategories, paging paginator.Pagination, err error) - FindOne(id uint) (articleCategories *entity.ArticleCategories, err error) - FindOneByOldId(id uint) (articleCategories *entity.ArticleCategories, err error) - FindOneBySlug(slug string) (articleCategories *entity.ArticleCategories, err error) + GetAll(clientId *uuid.UUID, req request.ArticleCategoriesQueryRequest) (articleCategoriess []*entity.ArticleCategories, paging paginator.Pagination, err error) + FindOne(clientId *uuid.UUID, id uint) (articleCategories *entity.ArticleCategories, err error) + FindOneByOldId(clientId *uuid.UUID, id uint) (articleCategories *entity.ArticleCategories, err error) + FindOneBySlug(clientId *uuid.UUID, slug string) (articleCategories *entity.ArticleCategories, err error) Create(articleCategories *entity.ArticleCategories) (articleCategoriesReturn *entity.ArticleCategories, err error) - Update(id uint, articleCategories *entity.ArticleCategories) (err error) - Delete(id uint) (err error) + Update(clientId *uuid.UUID, id uint, articleCategories *entity.ArticleCategories) (err error) + Delete(clientId *uuid.UUID, id uint) (err error) } func NewArticleCategoriesRepository(db *database.Database, log zerolog.Logger) ArticleCategoriesRepository { @@ -35,16 +36,26 @@ func NewArticleCategoriesRepository(db *database.Database, log zerolog.Logger) A } // implement interface of IArticleCategoriesRepository -func (_i *articleCategoriesRepository) GetAll(req request.ArticleCategoriesQueryRequest) (articleCategoriess []*entity.ArticleCategories, paging paginator.Pagination, err error) { +func (_i *articleCategoriesRepository) GetAll(clientId *uuid.UUID, req request.ArticleCategoriesQueryRequest) (articleCategoriess []*entity.ArticleCategories, paging paginator.Pagination, err error) { var count int64 query := _i.DB.DB.Model(&entity.ArticleCategories{}) + // Add ClientId filter + if clientId != nil { + query = query.Where("article_categories.client_id = ?", clientId) + } + if req.UserLevelId != nil { query = _i.DB.DB.Model(&entity.ArticleCategories{}). Joins("LEFT JOIN users ON article_categories.created_by_id = users.id"). Joins("LEFT JOIN user_levels ON users.user_level_id = user_levels.id"). Where("user_levels.id = ? or user_levels.parent_level_id = ?", *req.UserLevelId, *req.UserLevelId) + + // Add ClientId filter for joined query + if clientId != nil { + query = query.Where("article_categories.client_id = ?", clientId) + } } query = query.Where("article_categories.is_active = ?", true) @@ -90,24 +101,45 @@ func (_i *articleCategoriesRepository) GetAll(req request.ArticleCategoriesQuery return } -func (_i *articleCategoriesRepository) FindOne(id uint) (articleCategories *entity.ArticleCategories, err error) { - if err := _i.DB.DB.First(&articleCategories, id).Error; err != nil { +func (_i *articleCategoriesRepository) FindOne(clientId *uuid.UUID, id uint) (articleCategories *entity.ArticleCategories, err error) { + query := _i.DB.DB.Where("id = ?", id) + + // Add ClientId filter + if clientId != nil { + query = query.Where("client_id = ?", clientId) + } + + if err := query.First(&articleCategories).Error; err != nil { return nil, err } return articleCategories, nil } -func (_i *articleCategoriesRepository) FindOneByOldId(id uint) (articleCategories *entity.ArticleCategories, err error) { - if err := _i.DB.DB.Where("old_category_id = ?", id).First(&articleCategories).Error; err != nil { +func (_i *articleCategoriesRepository) FindOneByOldId(clientId *uuid.UUID, id uint) (articleCategories *entity.ArticleCategories, err error) { + query := _i.DB.DB.Where("old_category_id = ?", id) + + // Add ClientId filter + if clientId != nil { + query = query.Where("client_id = ?", clientId) + } + + if err := query.First(&articleCategories).Error; err != nil { return nil, err } return articleCategories, nil } -func (_i *articleCategoriesRepository) FindOneBySlug(slug string) (articleCategories *entity.ArticleCategories, err error) { - if err := _i.DB.DB.Where("slug = ?", slug).First(&articleCategories).Error; err != nil { +func (_i *articleCategoriesRepository) FindOneBySlug(clientId *uuid.UUID, slug string) (articleCategories *entity.ArticleCategories, err error) { + query := _i.DB.DB.Where("slug = ?", slug) + + // Add ClientId filter + if clientId != nil { + query = query.Where("client_id = ?", clientId) + } + + if err := query.First(&articleCategories).Error; err != nil { return nil, err } @@ -119,16 +151,22 @@ func (_i *articleCategoriesRepository) Create(articleCategories *entity.ArticleC return articleCategories, result.Error } -func (_i *articleCategoriesRepository) Update(id uint, articleCategories *entity.ArticleCategories) (err error) { +func (_i *articleCategoriesRepository) Update(clientId *uuid.UUID, id uint, articleCategories *entity.ArticleCategories) (err error) { articleCategoriesMap, err := utilSvc.StructToMap(articleCategories) if err != nil { return err } - return _i.DB.DB.Model(&entity.ArticleCategories{}). - Where(&entity.ArticleCategories{ID: id}). - Updates(articleCategoriesMap).Error + query := _i.DB.DB.Model(&entity.ArticleCategories{}).Where(&entity.ArticleCategories{ID: id}) + if clientId != nil { + query = query.Where("client_id = ?", clientId) + } + return query.Updates(articleCategoriesMap).Error } -func (_i *articleCategoriesRepository) Delete(id uint) error { - return _i.DB.DB.Delete(&entity.ArticleCategories{}, id).Error +func (_i *articleCategoriesRepository) Delete(clientId *uuid.UUID, id uint) error { + query := _i.DB.DB.Model(&entity.ArticleCategories{}).Where("id = ?", id) + if clientId != nil { + query = query.Where("client_id = ?", clientId) + } + return query.Delete(&entity.ArticleCategories{}).Error } diff --git a/app/module/article_categories/request/article_categories.request.go b/app/module/article_categories/request/article_categories.request.go index 486c321..9a275f0 100644 --- a/app/module/article_categories/request/article_categories.request.go +++ b/app/module/article_categories/request/article_categories.request.go @@ -1,10 +1,10 @@ package request import ( - "go-humas-be/app/database/entity" - "go-humas-be/utils/paginator" "strconv" "time" + "web-medols-be/app/database/entity" + "web-medols-be/utils/paginator" ) type ArticleCategoriesGeneric interface { diff --git a/app/module/article_categories/service/article_categories.service.go b/app/module/article_categories/service/article_categories.service.go index 3d4c7d7..4478093 100644 --- a/app/module/article_categories/service/article_categories.service.go +++ b/app/module/article_categories/service/article_categories.service.go @@ -3,18 +3,9 @@ package service import ( "context" "github.com/gofiber/fiber/v2" + "github.com/google/uuid" "github.com/minio/minio-go/v7" "github.com/rs/zerolog" - "go-humas-be/app/database/entity" - "go-humas-be/app/module/article_categories/mapper" - "go-humas-be/app/module/article_categories/repository" - "go-humas-be/app/module/article_categories/request" - "go-humas-be/app/module/article_categories/response" - usersRepository "go-humas-be/app/module/users/repository" - config "go-humas-be/config/config" - minioStorage "go-humas-be/config/config" - "go-humas-be/utils/paginator" - utilSvc "go-humas-be/utils/service" "io" "log" "math/rand" @@ -23,6 +14,16 @@ import ( "strconv" "strings" "time" + "web-medols-be/app/database/entity" + "web-medols-be/app/module/article_categories/mapper" + "web-medols-be/app/module/article_categories/repository" + "web-medols-be/app/module/article_categories/request" + "web-medols-be/app/module/article_categories/response" + usersRepository "web-medols-be/app/module/users/repository" + config "web-medols-be/config/config" + minioStorage "web-medols-be/config/config" + "web-medols-be/utils/paginator" + utilSvc "web-medols-be/utils/service" ) // ArticleCategoriesService @@ -36,14 +37,14 @@ type articleCategoriesService struct { // ArticleCategoriesService define interface of IArticleCategoriesService type ArticleCategoriesService interface { - All(req request.ArticleCategoriesQueryRequest, authToken string) (articleCategories []*response.ArticleCategoriesResponse, paging paginator.Pagination, err error) - Show(id uint) (articleCategories *response.ArticleCategoriesResponse, err error) - ShowByOldId(id uint) (articleCategories *response.ArticleCategoriesResponse, err error) - ShowBySlug(slug string) (articleCategories *response.ArticleCategoriesResponse, err error) - Save(req request.ArticleCategoriesCreateRequest, authToken string) (articleCategories *entity.ArticleCategories, err error) - SaveThumbnail(c *fiber.Ctx) (err error) - Update(id uint, req request.ArticleCategoriesUpdateRequest) (err error) - Delete(id uint) error + All(clientId *uuid.UUID, req request.ArticleCategoriesQueryRequest, authToken string) (articleCategories []*response.ArticleCategoriesResponse, paging paginator.Pagination, err error) + Show(clientId *uuid.UUID, id uint) (articleCategories *response.ArticleCategoriesResponse, err error) + ShowByOldId(clientId *uuid.UUID, id uint) (articleCategories *response.ArticleCategoriesResponse, err error) + ShowBySlug(clientId *uuid.UUID, slug string) (articleCategories *response.ArticleCategoriesResponse, err error) + Save(clientId *uuid.UUID, req request.ArticleCategoriesCreateRequest, authToken string) (articleCategories *entity.ArticleCategories, err error) + SaveThumbnail(clientId *uuid.UUID, c *fiber.Ctx) (err error) + Update(clientId *uuid.UUID, id uint, req request.ArticleCategoriesUpdateRequest) (err error) + Delete(clientId *uuid.UUID, id uint) error Viewer(c *fiber.Ctx) error } @@ -60,7 +61,7 @@ func NewArticleCategoriesService(repo repository.ArticleCategoriesRepository, us } // All implement interface of ArticleCategoriesService -func (_i *articleCategoriesService) All(req request.ArticleCategoriesQueryRequest, authToken string) (articleCategoriess []*response.ArticleCategoriesResponse, paging paginator.Pagination, err error) { +func (_i *articleCategoriesService) All(clientId *uuid.UUID, req request.ArticleCategoriesQueryRequest, authToken string) (articleCategoriess []*response.ArticleCategoriesResponse, paging paginator.Pagination, err error) { createdBy := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken) if createdBy != nil { if createdBy.UserLevel.LevelNumber > 1 { @@ -68,7 +69,7 @@ func (_i *articleCategoriesService) All(req request.ArticleCategoriesQueryReques } } - results, paging, err := _i.Repo.GetAll(req) + results, paging, err := _i.Repo.GetAll(clientId, req) if err != nil { return } @@ -81,8 +82,8 @@ func (_i *articleCategoriesService) All(req request.ArticleCategoriesQueryReques return } -func (_i *articleCategoriesService) Show(id uint) (articleCategories *response.ArticleCategoriesResponse, err error) { - result, err := _i.Repo.FindOne(id) +func (_i *articleCategoriesService) Show(clientId *uuid.UUID, id uint) (articleCategories *response.ArticleCategoriesResponse, err error) { + result, err := _i.Repo.FindOne(clientId, id) if err != nil { return nil, err } @@ -90,8 +91,8 @@ func (_i *articleCategoriesService) Show(id uint) (articleCategories *response.A return mapper.ArticleCategoriesResponseMapper(result, host), nil } -func (_i *articleCategoriesService) ShowByOldId(id uint) (articleCategories *response.ArticleCategoriesResponse, err error) { - result, err := _i.Repo.FindOneByOldId(id) +func (_i *articleCategoriesService) ShowByOldId(clientId *uuid.UUID, id uint) (articleCategories *response.ArticleCategoriesResponse, err error) { + result, err := _i.Repo.FindOneByOldId(clientId, id) if err != nil { return nil, err } @@ -99,8 +100,8 @@ func (_i *articleCategoriesService) ShowByOldId(id uint) (articleCategories *res return mapper.ArticleCategoriesResponseMapper(result, host), nil } -func (_i *articleCategoriesService) ShowBySlug(slug string) (articleCategories *response.ArticleCategoriesResponse, err error) { - result, err := _i.Repo.FindOneBySlug(slug) +func (_i *articleCategoriesService) ShowBySlug(clientId *uuid.UUID, slug string) (articleCategories *response.ArticleCategoriesResponse, err error) { + result, err := _i.Repo.FindOneBySlug(clientId, slug) if err != nil { return nil, err } @@ -108,10 +109,14 @@ func (_i *articleCategoriesService) ShowBySlug(slug string) (articleCategories * return mapper.ArticleCategoriesResponseMapper(result, host), nil } -func (_i *articleCategoriesService) Save(req request.ArticleCategoriesCreateRequest, authToken string) (articleCategories *entity.ArticleCategories, err error) { +func (_i *articleCategoriesService) Save(clientId *uuid.UUID, req request.ArticleCategoriesCreateRequest, authToken string) (articleCategories *entity.ArticleCategories, err error) { _i.Log.Info().Interface("data", req).Msg("") newReq := req.ToEntity() + if clientId != nil { + newReq.ClientId = clientId + } + if req.CreatedById != nil { createdBy, err := _i.UsersRepo.FindOne(*req.CreatedById) if err != nil { @@ -126,8 +131,7 @@ func (_i *articleCategoriesService) Save(req request.ArticleCategoriesCreateRequ return _i.Repo.Create(newReq) } -func (_i *articleCategoriesService) SaveThumbnail(c *fiber.Ctx) (err error) { - +func (_i *articleCategoriesService) SaveThumbnail(clientId *uuid.UUID, c *fiber.Ctx) (err error) { id, err := strconv.ParseUint(c.Params("id"), 10, 0) if err != nil { return err @@ -153,7 +157,6 @@ func (_i *articleCategoriesService) SaveThumbnail(c *fiber.Ctx) (err error) { // Iterasi semua file yang diunggah for _, file := range files { - _i.Log.Info().Str("timestamp", time.Now(). Format(time.RFC3339)).Str("Service:Resource", "Uploader:: loop1"). Interface("data", file).Msg("") @@ -175,9 +178,9 @@ func (_i *articleCategoriesService) SaveThumbnail(c *fiber.Ctx) (err error) { newFilename := newFilenameWithoutExt + "." + extension objectName := "articles/category/thumbnail/" + newFilename - findCategory, err := _i.Repo.FindOne(uint(id)) + findCategory, err := _i.Repo.FindOne(clientId, uint(id)) findCategory.ThumbnailPath = &objectName - err = _i.Repo.Update(uint(id), findCategory) + err = _i.Repo.Update(clientId, uint(id), findCategory) if err != nil { return err } @@ -192,10 +195,13 @@ func (_i *articleCategoriesService) SaveThumbnail(c *fiber.Ctx) (err error) { return } -func (_i *articleCategoriesService) Update(id uint, req request.ArticleCategoriesUpdateRequest) (err error) { +func (_i *articleCategoriesService) Update(clientId *uuid.UUID, id uint, req request.ArticleCategoriesUpdateRequest) (err error) { _i.Log.Info().Interface("data", req).Msg("") newReq := req.ToEntity() + if clientId != nil { + newReq.ClientId = clientId + } if req.CreatedById != nil { createdBy, err := _i.UsersRepo.FindOne(*req.CreatedById) if err != nil { @@ -204,23 +210,26 @@ func (_i *articleCategoriesService) Update(id uint, req request.ArticleCategorie newReq.CreatedById = &createdBy.ID } - return _i.Repo.Update(id, newReq) + return _i.Repo.Update(clientId, id, newReq) } -func (_i *articleCategoriesService) Delete(id uint) error { - result, err := _i.Repo.FindOne(id) +func (_i *articleCategoriesService) Delete(clientId *uuid.UUID, id uint) error { + result, err := _i.Repo.FindOne(clientId, id) if err != nil { return err } isActive := false result.IsActive = &isActive - return _i.Repo.Update(id, result) + if clientId != nil { + result.ClientId = clientId + } + return _i.Repo.Update(clientId, id, result) } func (_i *articleCategoriesService) Viewer(c *fiber.Ctx) (err error) { id, err := strconv.ParseUint(c.Params("id"), 10, 0) - result, err := _i.Repo.FindOne(uint(id)) + result, err := _i.Repo.FindOne(nil, uint(id)) if err != nil { return err } diff --git a/app/module/article_category_details/article_category_details.module.go b/app/module/article_category_details/article_category_details.module.go index e482392..c69669a 100644 --- a/app/module/article_category_details/article_category_details.module.go +++ b/app/module/article_category_details/article_category_details.module.go @@ -2,10 +2,10 @@ package article_category_details import ( "github.com/gofiber/fiber/v2" - "go-humas-be/app/module/article_category_details/controller" - "go-humas-be/app/module/article_category_details/repository" - "go-humas-be/app/module/article_category_details/service" "go.uber.org/fx" + "web-medols-be/app/module/article_category_details/controller" + "web-medols-be/app/module/article_category_details/repository" + "web-medols-be/app/module/article_category_details/service" ) // struct of ArticleCategoryDetailsRouter diff --git a/app/module/article_category_details/controller/article_category_details.controller.go b/app/module/article_category_details/controller/article_category_details.controller.go index f4e2f33..74e4e4f 100644 --- a/app/module/article_category_details/controller/article_category_details.controller.go +++ b/app/module/article_category_details/controller/article_category_details.controller.go @@ -2,13 +2,13 @@ package controller import ( "github.com/gofiber/fiber/v2" - "go-humas-be/app/module/article_category_details/request" - "go-humas-be/app/module/article_category_details/service" - "go-humas-be/utils/paginator" "strconv" + "web-medols-be/app/module/article_category_details/request" + "web-medols-be/app/module/article_category_details/service" + "web-medols-be/utils/paginator" - utilRes "go-humas-be/utils/response" - utilVal "go-humas-be/utils/validator" + utilRes "web-medols-be/utils/response" + utilVal "web-medols-be/utils/validator" ) type articleCategoryDetailsController struct { diff --git a/app/module/article_category_details/controller/controller.go b/app/module/article_category_details/controller/controller.go index ff2de77..097b5d8 100644 --- a/app/module/article_category_details/controller/controller.go +++ b/app/module/article_category_details/controller/controller.go @@ -1,6 +1,6 @@ package controller -import "go-humas-be/app/module/article_category_details/service" +import "web-medols-be/app/module/article_category_details/service" type Controller struct { ArticleCategoryDetails ArticleCategoryDetailsController @@ -10,4 +10,4 @@ func NewController(ArticleCategoryDetailsService service.ArticleCategoryDetailsS return &Controller{ ArticleCategoryDetails: NewArticleCategoryDetailsController(ArticleCategoryDetailsService), } -} \ No newline at end of file +} diff --git a/app/module/article_category_details/mapper/article_category_details.mapper.go b/app/module/article_category_details/mapper/article_category_details.mapper.go index 15681da..e933de3 100644 --- a/app/module/article_category_details/mapper/article_category_details.mapper.go +++ b/app/module/article_category_details/mapper/article_category_details.mapper.go @@ -1,8 +1,8 @@ package mapper import ( - "go-humas-be/app/database/entity/article_category_details" - res "go-humas-be/app/module/article_category_details/response" + "web-medols-be/app/database/entity/article_category_details" + res "web-medols-be/app/module/article_category_details/response" ) func ArticleCategoryDetailsResponseMapper(articleCategoryDetailsReq *article_category_details.ArticleCategoryDetails) (articleCategoryDetailsRes *res.ArticleCategoryDetailsResponse) { diff --git a/app/module/article_category_details/repository/article_category_details.repository.go b/app/module/article_category_details/repository/article_category_details.repository.go index a7b977f..0c560aa 100644 --- a/app/module/article_category_details/repository/article_category_details.repository.go +++ b/app/module/article_category_details/repository/article_category_details.repository.go @@ -1,10 +1,10 @@ package repository import ( - "go-humas-be/app/database" - "go-humas-be/app/database/entity/article_category_details" - "go-humas-be/app/module/article_category_details/request" - "go-humas-be/utils/paginator" + "web-medols-be/app/database" + "web-medols-be/app/database/entity/article_category_details" + "web-medols-be/app/module/article_category_details/request" + "web-medols-be/utils/paginator" ) type articleCategoryDetailsRepository struct { diff --git a/app/module/article_category_details/request/article_category_details.request.go b/app/module/article_category_details/request/article_category_details.request.go index c28944a..88b1e83 100644 --- a/app/module/article_category_details/request/article_category_details.request.go +++ b/app/module/article_category_details/request/article_category_details.request.go @@ -1,9 +1,9 @@ package request import ( - "go-humas-be/app/database/entity/article_category_details" - "go-humas-be/utils/paginator" "time" + "web-medols-be/app/database/entity/article_category_details" + "web-medols-be/utils/paginator" ) type ArticleCategoryDetailsGeneric interface { diff --git a/app/module/article_category_details/service/article_category_details.service.go b/app/module/article_category_details/service/article_category_details.service.go index 0ac2b80..9dd6736 100644 --- a/app/module/article_category_details/service/article_category_details.service.go +++ b/app/module/article_category_details/service/article_category_details.service.go @@ -2,11 +2,11 @@ package service import ( "github.com/rs/zerolog" - "go-humas-be/app/module/article_category_details/mapper" - "go-humas-be/app/module/article_category_details/repository" - "go-humas-be/app/module/article_category_details/request" - "go-humas-be/app/module/article_category_details/response" - "go-humas-be/utils/paginator" + "web-medols-be/app/module/article_category_details/mapper" + "web-medols-be/app/module/article_category_details/repository" + "web-medols-be/app/module/article_category_details/request" + "web-medols-be/app/module/article_category_details/response" + "web-medols-be/utils/paginator" ) // ArticleCategoryDetailsService diff --git a/app/module/article_comments/article_comments.module.go b/app/module/article_comments/article_comments.module.go index 0a1d6da..b246de0 100644 --- a/app/module/article_comments/article_comments.module.go +++ b/app/module/article_comments/article_comments.module.go @@ -2,10 +2,10 @@ package article_comments import ( "github.com/gofiber/fiber/v2" - "go-humas-be/app/module/article_comments/controller" - "go-humas-be/app/module/article_comments/repository" - "go-humas-be/app/module/article_comments/service" "go.uber.org/fx" + "web-medols-be/app/module/article_comments/controller" + "web-medols-be/app/module/article_comments/repository" + "web-medols-be/app/module/article_comments/service" ) // struct of ArticleCommentsRouter diff --git a/app/module/article_comments/controller/article_comments.controller.go b/app/module/article_comments/controller/article_comments.controller.go index 4f78b13..1f82776 100644 --- a/app/module/article_comments/controller/article_comments.controller.go +++ b/app/module/article_comments/controller/article_comments.controller.go @@ -3,12 +3,13 @@ package controller import ( "github.com/gofiber/fiber/v2" "github.com/rs/zerolog" - "go-humas-be/app/module/article_comments/request" - "go-humas-be/app/module/article_comments/service" - "go-humas-be/utils/paginator" - utilRes "go-humas-be/utils/response" - utilVal "go-humas-be/utils/validator" "strconv" + "web-medols-be/app/middleware" + "web-medols-be/app/module/article_comments/request" + "web-medols-be/app/module/article_comments/service" + "web-medols-be/utils/paginator" + utilRes "web-medols-be/utils/response" + utilVal "web-medols-be/utils/validator" ) type articleCommentsController struct { @@ -45,6 +46,9 @@ func NewArticleCommentsController(articleCommentsService service.ArticleComments // @Failure 500 {object} response.InternalServerError // @Router /article-comments [get] func (_i *articleCommentsController) All(c *fiber.Ctx) error { + // Get ClientId from context + clientId := middleware.GetClientID(c) + paginate, err := paginator.Paginate(c) if err != nil { return err @@ -60,7 +64,7 @@ func (_i *articleCommentsController) All(c *fiber.Ctx) error { req := reqContext.ToParamRequest() req.Pagination = paginate - articleCommentsData, paging, err := _i.articleCommentsService.All(req) + articleCommentsData, paging, err := _i.articleCommentsService.All(clientId, req) if err != nil { return err } @@ -85,12 +89,15 @@ func (_i *articleCommentsController) All(c *fiber.Ctx) error { // @Failure 500 {object} response.InternalServerError // @Router /article-comments/{id} [get] func (_i *articleCommentsController) Show(c *fiber.Ctx) error { + // Get ClientId from context + clientId := middleware.GetClientID(c) + id, err := strconv.ParseUint(c.Params("id"), 10, 0) if err != nil { return err } - articleCommentsData, err := _i.articleCommentsService.Show(uint(id)) + articleCommentsData, err := _i.articleCommentsService.Show(clientId, uint(id)) if err != nil { return err } @@ -116,13 +123,16 @@ func (_i *articleCommentsController) Show(c *fiber.Ctx) error { // @Failure 500 {object} response.InternalServerError // @Router /article-comments [post] func (_i *articleCommentsController) Save(c *fiber.Ctx) error { + // Get ClientId from context + clientId := middleware.GetClientID(c) + req := new(request.ArticleCommentsCreateRequest) if err := utilVal.ParseAndValidate(c, req); err != nil { return err } authToken := c.Get("Authorization") - dataResult, err := _i.articleCommentsService.Save(*req, authToken) + dataResult, err := _i.articleCommentsService.Save(clientId, *req, authToken) if err != nil { return err } @@ -148,6 +158,9 @@ func (_i *articleCommentsController) Save(c *fiber.Ctx) error { // @Failure 500 {object} response.InternalServerError // @Router /article-comments/{id} [put] func (_i *articleCommentsController) Update(c *fiber.Ctx) error { + // Get ClientId from context + clientId := middleware.GetClientID(c) + id, err := strconv.ParseUint(c.Params("id"), 10, 0) if err != nil { return err @@ -158,7 +171,7 @@ func (_i *articleCommentsController) Update(c *fiber.Ctx) error { return err } - err = _i.articleCommentsService.Update(uint(id), *req) + err = _i.articleCommentsService.Update(clientId, uint(id), *req) if err != nil { return err } @@ -182,12 +195,15 @@ func (_i *articleCommentsController) Update(c *fiber.Ctx) error { // @Failure 500 {object} response.InternalServerError // @Router /article-comments/{id} [delete] func (_i *articleCommentsController) Delete(c *fiber.Ctx) error { + // Get ClientId from context + clientId := middleware.GetClientID(c) + id, err := strconv.ParseUint(c.Params("id"), 10, 0) if err != nil { return err } - err = _i.articleCommentsService.Delete(uint(id)) + err = _i.articleCommentsService.Delete(clientId, uint(id)) if err != nil { return err } @@ -211,12 +227,15 @@ func (_i *articleCommentsController) Delete(c *fiber.Ctx) error { // @Failure 500 {object} response.InternalServerError // @Router /article-comments/approval [post] func (_i *articleCommentsController) Approval(c *fiber.Ctx) error { + // Get ClientId from context + clientId := middleware.GetClientID(c) + req := new(request.ArticleCommentsApprovalRequest) if err := utilVal.ParseAndValidate(c, req); err != nil { return err } - err := _i.articleCommentsService.Approval(req.ID, *req) + err := _i.articleCommentsService.Approval(clientId, req.ID, *req) if err != nil { return err } diff --git a/app/module/article_comments/controller/controller.go b/app/module/article_comments/controller/controller.go index e0aff99..1a81285 100644 --- a/app/module/article_comments/controller/controller.go +++ b/app/module/article_comments/controller/controller.go @@ -2,7 +2,7 @@ package controller import ( "github.com/rs/zerolog" - "go-humas-be/app/module/article_comments/service" + "web-medols-be/app/module/article_comments/service" ) type Controller struct { diff --git a/app/module/article_comments/mapper/article_comments.mapper.go b/app/module/article_comments/mapper/article_comments.mapper.go index 1bc53e3..e6d0962 100644 --- a/app/module/article_comments/mapper/article_comments.mapper.go +++ b/app/module/article_comments/mapper/article_comments.mapper.go @@ -1,17 +1,18 @@ package mapper import ( - "go-humas-be/app/database/entity" - res "go-humas-be/app/module/article_comments/response" - usersRepository "go-humas-be/app/module/users/repository" + "github.com/google/uuid" + "web-medols-be/app/database/entity" + res "web-medols-be/app/module/article_comments/response" + usersRepository "web-medols-be/app/module/users/repository" ) -func ArticleCommentsResponseMapper(articleCommentsReq *entity.ArticleComments, usersRepo usersRepository.UsersRepository) (articleCommentsRes *res.ArticleCommentsResponse) { +func ArticleCommentsResponseMapper(clientId *uuid.UUID, articleCommentsReq *entity.ArticleComments, usersRepo usersRepository.UsersRepository) (articleCommentsRes *res.ArticleCommentsResponse) { if articleCommentsReq != nil { commentFromName := "" if articleCommentsReq.CommentFrom != nil { - findUser, _ := usersRepo.FindOne(*articleCommentsReq.CommentFrom) + findUser, _ := usersRepo.FindOne(clientId, *articleCommentsReq.CommentFrom) if findUser != nil { commentFromName = findUser.Fullname } diff --git a/app/module/article_comments/repository/article_comments.repository.go b/app/module/article_comments/repository/article_comments.repository.go index 03426e6..a2ee5ca 100644 --- a/app/module/article_comments/repository/article_comments.repository.go +++ b/app/module/article_comments/repository/article_comments.repository.go @@ -2,13 +2,14 @@ package repository import ( "fmt" + "github.com/google/uuid" "github.com/rs/zerolog" - "go-humas-be/app/database" - "go-humas-be/app/database/entity" - "go-humas-be/app/module/article_comments/request" - "go-humas-be/utils/paginator" - utilSvc "go-humas-be/utils/service" "strings" + "web-medols-be/app/database" + "web-medols-be/app/database/entity" + "web-medols-be/app/module/article_comments/request" + "web-medols-be/utils/paginator" + utilSvc "web-medols-be/utils/service" ) type articleCommentsRepository struct { @@ -18,11 +19,11 @@ type articleCommentsRepository struct { // ArticleCommentsRepository define interface of IArticleCommentsRepository type ArticleCommentsRepository interface { - GetAll(req request.ArticleCommentsQueryRequest) (articleCommentss []*entity.ArticleComments, paging paginator.Pagination, err error) - FindOne(id uint) (articleComments *entity.ArticleComments, err error) - Create(articleComments *entity.ArticleComments) (articleCommentsReturn *entity.ArticleComments, err error) - Update(id uint, articleComments *entity.ArticleComments) (err error) - Delete(id uint) (err error) + GetAll(clientId *uuid.UUID, req request.ArticleCommentsQueryRequest) (articleCommentss []*entity.ArticleComments, paging paginator.Pagination, err error) + FindOne(clientId *uuid.UUID, id uint) (articleComments *entity.ArticleComments, err error) + Create(clientId *uuid.UUID, articleComments *entity.ArticleComments) (articleCommentsReturn *entity.ArticleComments, err error) + Update(clientId *uuid.UUID, id uint, articleComments *entity.ArticleComments) (err error) + Delete(clientId *uuid.UUID, id uint) (err error) } func NewArticleCommentsRepository(db *database.Database, logger zerolog.Logger) ArticleCommentsRepository { @@ -33,12 +34,17 @@ func NewArticleCommentsRepository(db *database.Database, logger zerolog.Logger) } // implement interface of IArticleCommentsRepository -func (_i *articleCommentsRepository) GetAll(req request.ArticleCommentsQueryRequest) (articleCommentss []*entity.ArticleComments, paging paginator.Pagination, err error) { +func (_i *articleCommentsRepository) GetAll(clientId *uuid.UUID, req request.ArticleCommentsQueryRequest) (articleCommentss []*entity.ArticleComments, paging paginator.Pagination, err error) { var count int64 query := _i.DB.DB.Model(&entity.ArticleComments{}) query = query.Where("is_active = ?", true) + // Add client filter + if clientId != nil { + query = query.Where("client_id = ?", clientId) + } + if req.Message != nil && *req.Message != "" { message := strings.ToLower(*req.Message) query = query.Where("LOWER(message) LIKE ?", "%"+strings.ToLower(message)+"%") @@ -78,20 +84,39 @@ func (_i *articleCommentsRepository) GetAll(req request.ArticleCommentsQueryRequ return } -func (_i *articleCommentsRepository) FindOne(id uint) (articleComments *entity.ArticleComments, err error) { - if err := _i.DB.DB.First(&articleComments, id).Error; err != nil { +func (_i *articleCommentsRepository) FindOne(clientId *uuid.UUID, id uint) (articleComments *entity.ArticleComments, err error) { + query := _i.DB.DB + if clientId != nil { + query = query.Where("client_id = ?", clientId) + } + if err := query.First(&articleComments, id).Error; err != nil { return nil, err } return articleComments, nil } -func (_i *articleCommentsRepository) Create(articleComments *entity.ArticleComments) (articleCommentsReturn *entity.ArticleComments, err error) { +func (_i *articleCommentsRepository) Create(clientId *uuid.UUID, articleComments *entity.ArticleComments) (articleCommentsReturn *entity.ArticleComments, err error) { + // Set client ID + if clientId != nil { + articleComments.ClientId = clientId + } result := _i.DB.DB.Create(articleComments) return articleComments, result.Error } -func (_i *articleCommentsRepository) Update(id uint, articleComments *entity.ArticleComments) (err error) { +func (_i *articleCommentsRepository) Update(clientId *uuid.UUID, id uint, articleComments *entity.ArticleComments) (err error) { + // Validate client access + if clientId != nil { + var count int64 + if err := _i.DB.DB.Model(&entity.ArticleComments{}).Where("id = ? AND client_id = ?", id, clientId).Count(&count).Error; err != nil { + return err + } + if count == 0 { + return fmt.Errorf("access denied to this resource") + } + } + articleCommentsMap, err := utilSvc.StructToMap(articleComments) if err != nil { return err @@ -101,6 +126,17 @@ func (_i *articleCommentsRepository) Update(id uint, articleComments *entity.Art Updates(articleCommentsMap).Error } -func (_i *articleCommentsRepository) Delete(id uint) error { +func (_i *articleCommentsRepository) Delete(clientId *uuid.UUID, id uint) error { + // Validate client access + if clientId != nil { + var count int64 + if err := _i.DB.DB.Model(&entity.ArticleComments{}).Where("id = ? AND client_id = ?", id, clientId).Count(&count).Error; err != nil { + return err + } + if count == 0 { + return fmt.Errorf("access denied to this resource") + } + } + return _i.DB.DB.Delete(&entity.ArticleComments{}, id).Error } diff --git a/app/module/article_comments/request/article_comments.request.go b/app/module/article_comments/request/article_comments.request.go index 74b325e..7b054d7 100644 --- a/app/module/article_comments/request/article_comments.request.go +++ b/app/module/article_comments/request/article_comments.request.go @@ -1,10 +1,10 @@ package request import ( - "go-humas-be/app/database/entity" - "go-humas-be/utils/paginator" "strconv" "time" + "web-medols-be/app/database/entity" + "web-medols-be/utils/paginator" ) type ArticleCommentsGeneric interface { diff --git a/app/module/article_comments/service/article_comments.service.go b/app/module/article_comments/service/article_comments.service.go index 5b237f4..7630443 100644 --- a/app/module/article_comments/service/article_comments.service.go +++ b/app/module/article_comments/service/article_comments.service.go @@ -1,16 +1,17 @@ package service import ( + "github.com/google/uuid" "github.com/rs/zerolog" - "go-humas-be/app/database/entity" - "go-humas-be/app/module/article_comments/mapper" - "go-humas-be/app/module/article_comments/repository" - "go-humas-be/app/module/article_comments/request" - "go-humas-be/app/module/article_comments/response" - usersRepository "go-humas-be/app/module/users/repository" - "go-humas-be/utils/paginator" + "web-medols-be/app/database/entity" + "web-medols-be/app/module/article_comments/mapper" + "web-medols-be/app/module/article_comments/repository" + "web-medols-be/app/module/article_comments/request" + "web-medols-be/app/module/article_comments/response" + usersRepository "web-medols-be/app/module/users/repository" + "web-medols-be/utils/paginator" - utilSvc "go-humas-be/utils/service" + utilSvc "web-medols-be/utils/service" ) // ArticleCommentsService @@ -22,12 +23,12 @@ type articleCommentsService struct { // ArticleCommentsService define interface of IArticleCommentsService type ArticleCommentsService interface { - All(req request.ArticleCommentsQueryRequest) (articleComments []*response.ArticleCommentsResponse, paging paginator.Pagination, err error) - Show(id uint) (articleComments *response.ArticleCommentsResponse, err error) - Save(req request.ArticleCommentsCreateRequest, authToken string) (articleComments *entity.ArticleComments, err error) - Update(id uint, req request.ArticleCommentsUpdateRequest) (err error) - Delete(id uint) error - Approval(id uint, req request.ArticleCommentsApprovalRequest) (err error) + All(clientId *uuid.UUID, req request.ArticleCommentsQueryRequest) (articleComments []*response.ArticleCommentsResponse, paging paginator.Pagination, err error) + Show(clientId *uuid.UUID, id uint) (articleComments *response.ArticleCommentsResponse, err error) + Save(clientId *uuid.UUID, req request.ArticleCommentsCreateRequest, authToken string) (articleComments *entity.ArticleComments, err error) + Update(clientId *uuid.UUID, id uint, req request.ArticleCommentsUpdateRequest) (err error) + Delete(clientId *uuid.UUID, id uint) error + Approval(clientId *uuid.UUID, id uint, req request.ArticleCommentsApprovalRequest) (err error) } // NewArticleCommentsService init ArticleCommentsService @@ -41,29 +42,29 @@ func NewArticleCommentsService(repo repository.ArticleCommentsRepository, log ze } // All implement interface of ArticleCommentsService -func (_i *articleCommentsService) All(req request.ArticleCommentsQueryRequest) (articleCommentss []*response.ArticleCommentsResponse, paging paginator.Pagination, err error) { - results, paging, err := _i.Repo.GetAll(req) +func (_i *articleCommentsService) All(clientId *uuid.UUID, req request.ArticleCommentsQueryRequest) (articleCommentss []*response.ArticleCommentsResponse, paging paginator.Pagination, err error) { + results, paging, err := _i.Repo.GetAll(clientId, req) if err != nil { return } for _, result := range results { - articleCommentss = append(articleCommentss, mapper.ArticleCommentsResponseMapper(result, _i.UsersRepo)) + articleCommentss = append(articleCommentss, mapper.ArticleCommentsResponseMapper(clientId, result, _i.UsersRepo)) } return } -func (_i *articleCommentsService) Show(id uint) (articleComments *response.ArticleCommentsResponse, err error) { - result, err := _i.Repo.FindOne(id) +func (_i *articleCommentsService) Show(clientId *uuid.UUID, id uint) (articleComments *response.ArticleCommentsResponse, err error) { + result, err := _i.Repo.FindOne(clientId, id) if err != nil { return nil, err } - return mapper.ArticleCommentsResponseMapper(result, _i.UsersRepo), nil + return mapper.ArticleCommentsResponseMapper(clientId, result, _i.UsersRepo), nil } -func (_i *articleCommentsService) Save(req request.ArticleCommentsCreateRequest, authToken string) (articleComments *entity.ArticleComments, err error) { +func (_i *articleCommentsService) Save(clientId *uuid.UUID, req request.ArticleCommentsCreateRequest, authToken string) (articleComments *entity.ArticleComments, err error) { _i.Log.Info().Interface("data", req).Msg("") newReq := req.ToEntity() @@ -72,25 +73,25 @@ func (_i *articleCommentsService) Save(req request.ArticleCommentsCreateRequest, newReq.CommentFrom = &createdBy.ID newReq.IsActive = true - return _i.Repo.Create(newReq) + return _i.Repo.Create(clientId, newReq) } -func (_i *articleCommentsService) Update(id uint, req request.ArticleCommentsUpdateRequest) (err error) { +func (_i *articleCommentsService) Update(clientId *uuid.UUID, id uint, req request.ArticleCommentsUpdateRequest) (err error) { _i.Log.Info().Interface("data", req).Msg("") - return _i.Repo.Update(id, req.ToEntity()) + return _i.Repo.Update(clientId, id, req.ToEntity()) } -func (_i *articleCommentsService) Delete(id uint) error { - result, err := _i.Repo.FindOne(id) +func (_i *articleCommentsService) Delete(clientId *uuid.UUID, id uint) error { + result, err := _i.Repo.FindOne(clientId, id) if err != nil { return err } result.IsActive = false - return _i.Repo.Update(id, result) + return _i.Repo.Update(clientId, id, result) } -func (_i *articleCommentsService) Approval(id uint, req request.ArticleCommentsApprovalRequest) (err error) { +func (_i *articleCommentsService) Approval(clientId *uuid.UUID, id uint, req request.ArticleCommentsApprovalRequest) (err error) { _i.Log.Info().Interface("data", req).Msg("") newReq := req.ToEntity() @@ -100,5 +101,5 @@ func (_i *articleCommentsService) Approval(id uint, req request.ArticleCommentsA newReq.IsPublic = false } - return _i.Repo.Update(id, newReq) + return _i.Repo.Update(clientId, id, newReq) } diff --git a/app/module/article_files/article_files.module.go b/app/module/article_files/article_files.module.go index 3bb9a49..6f7d757 100644 --- a/app/module/article_files/article_files.module.go +++ b/app/module/article_files/article_files.module.go @@ -2,10 +2,10 @@ package article_files import ( "github.com/gofiber/fiber/v2" - "go-humas-be/app/module/article_files/controller" - "go-humas-be/app/module/article_files/repository" - "go-humas-be/app/module/article_files/service" "go.uber.org/fx" + "web-medols-be/app/module/article_files/controller" + "web-medols-be/app/module/article_files/repository" + "web-medols-be/app/module/article_files/service" ) // struct of ArticleFilesRouter diff --git a/app/module/article_files/controller/article_files.controller.go b/app/module/article_files/controller/article_files.controller.go index 34dc3f8..50a78cd 100644 --- a/app/module/article_files/controller/article_files.controller.go +++ b/app/module/article_files/controller/article_files.controller.go @@ -3,12 +3,13 @@ package controller import ( "fmt" "github.com/gofiber/fiber/v2" - "go-humas-be/app/module/article_files/request" - "go-humas-be/app/module/article_files/service" - "go-humas-be/utils/paginator" - utilRes "go-humas-be/utils/response" - utilVal "go-humas-be/utils/validator" "strconv" + "web-medols-be/app/middleware" + "web-medols-be/app/module/article_files/request" + "web-medols-be/app/module/article_files/service" + "web-medols-be/utils/paginator" + utilRes "web-medols-be/utils/response" + utilVal "web-medols-be/utils/validator" ) type articleFilesController struct { @@ -44,6 +45,9 @@ func NewArticleFilesController(articleFilesService service.ArticleFilesService) // @Failure 500 {object} response.InternalServerError // @Router /article-files [get] func (_i *articleFilesController) All(c *fiber.Ctx) error { + // Get ClientId from context + clientId := middleware.GetClientID(c) + paginate, err := paginator.Paginate(c) if err != nil { return err @@ -58,7 +62,7 @@ func (_i *articleFilesController) All(c *fiber.Ctx) error { req := reqContext.ToParamRequest() req.Pagination = paginate - articleFilesData, paging, err := _i.articleFilesService.All(req) + articleFilesData, paging, err := _i.articleFilesService.All(clientId, req) if err != nil { return err } @@ -83,12 +87,15 @@ func (_i *articleFilesController) All(c *fiber.Ctx) error { // @Failure 500 {object} response.InternalServerError // @Router /article-files/{id} [get] func (_i *articleFilesController) Show(c *fiber.Ctx) error { + // Get ClientId from context + clientId := middleware.GetClientID(c) + id, err := strconv.ParseUint(c.Params("id"), 10, 0) if err != nil { return err } - articleFilesData, err := _i.articleFilesService.Show(uint(id)) + articleFilesData, err := _i.articleFilesService.Show(clientId, uint(id)) if err != nil { return err } @@ -115,12 +122,15 @@ func (_i *articleFilesController) Show(c *fiber.Ctx) error { // @Failure 500 {object} response.InternalServerError // @Router /article-files/{articleId} [post] func (_i *articleFilesController) Save(c *fiber.Ctx) error { + // Get ClientId from context + clientId := middleware.GetClientID(c) + id, err := strconv.ParseUint(c.Params("articleId"), 10, 0) if err != nil { return err } - err = _i.articleFilesService.Save(c, uint(id)) + err = _i.articleFilesService.Save(clientId, c, uint(id)) if err != nil { return err } @@ -145,6 +155,9 @@ func (_i *articleFilesController) Save(c *fiber.Ctx) error { // @Failure 500 {object} response.InternalServerError // @Router /article-files/{id} [put] func (_i *articleFilesController) Update(c *fiber.Ctx) error { + // Get ClientId from context + clientId := middleware.GetClientID(c) + id, err := strconv.ParseUint(c.Params("id"), 10, 0) if err != nil { return err @@ -155,7 +168,7 @@ func (_i *articleFilesController) Update(c *fiber.Ctx) error { return err } - err = _i.articleFilesService.Update(uint(id), *req) + err = _i.articleFilesService.Update(clientId, uint(id), *req) if err != nil { return err } @@ -179,12 +192,15 @@ func (_i *articleFilesController) Update(c *fiber.Ctx) error { // @Failure 500 {object} response.InternalServerError // @Router /article-files/{id} [delete] func (_i *articleFilesController) Delete(c *fiber.Ctx) error { + // Get ClientId from context + clientId := middleware.GetClientID(c) + id, err := strconv.ParseUint(c.Params("id"), 10, 0) if err != nil { return err } - err = _i.articleFilesService.Delete(uint(id)) + err = _i.articleFilesService.Delete(clientId, uint(id)) if err != nil { return err } @@ -207,7 +223,10 @@ func (_i *articleFilesController) Delete(c *fiber.Ctx) error { // @Failure 500 {object} response.InternalServerError // @Router /article-files/viewer/{filename} [get] func (_i *articleFilesController) Viewer(c *fiber.Ctx) error { - return _i.articleFilesService.Viewer(c) + // Get ClientId from context + clientId := middleware.GetClientID(c) + + return _i.articleFilesService.Viewer(clientId, c) } // GetUploadStatus ArticleFiles diff --git a/app/module/article_files/controller/controller.go b/app/module/article_files/controller/controller.go index e0a1200..16163fd 100644 --- a/app/module/article_files/controller/controller.go +++ b/app/module/article_files/controller/controller.go @@ -1,6 +1,6 @@ package controller -import "go-humas-be/app/module/article_files/service" +import "web-medols-be/app/module/article_files/service" type Controller struct { ArticleFiles ArticleFilesController @@ -10,4 +10,4 @@ func NewController(ArticleFilesService service.ArticleFilesService) *Controller return &Controller{ ArticleFiles: NewArticleFilesController(ArticleFilesService), } -} \ No newline at end of file +} diff --git a/app/module/article_files/mapper/article_files.mapper.go b/app/module/article_files/mapper/article_files.mapper.go index cad2088..9645451 100644 --- a/app/module/article_files/mapper/article_files.mapper.go +++ b/app/module/article_files/mapper/article_files.mapper.go @@ -1,8 +1,8 @@ package mapper import ( - "go-humas-be/app/database/entity" - res "go-humas-be/app/module/article_files/response" + "web-medols-be/app/database/entity" + res "web-medols-be/app/module/article_files/response" ) func ArticleFilesResponseMapper(articleFilesReq *entity.ArticleFiles, host string) (articleFilesRes *res.ArticleFilesResponse) { diff --git a/app/module/article_files/repository/article_files.repository.go b/app/module/article_files/repository/article_files.repository.go index 85b5c4a..d55eb82 100644 --- a/app/module/article_files/repository/article_files.repository.go +++ b/app/module/article_files/repository/article_files.repository.go @@ -2,12 +2,13 @@ package repository import ( "fmt" - "go-humas-be/app/database" - "go-humas-be/app/database/entity" - "go-humas-be/app/module/article_files/request" - "go-humas-be/utils/paginator" - utilSvc "go-humas-be/utils/service" + "github.com/google/uuid" "strings" + "web-medols-be/app/database" + "web-medols-be/app/database/entity" + "web-medols-be/app/module/article_files/request" + "web-medols-be/utils/paginator" + utilSvc "web-medols-be/utils/service" ) type articleFilesRepository struct { @@ -16,13 +17,13 @@ type articleFilesRepository struct { // ArticleFilesRepository define interface of IArticleFilesRepository type ArticleFilesRepository interface { - GetAll(req request.ArticleFilesQueryRequest) (articleFiless []*entity.ArticleFiles, paging paginator.Pagination, err error) - FindOne(id uint) (articleFiles *entity.ArticleFiles, err error) - FindByArticle(articleId uint) (articleFiles []*entity.ArticleFiles, err error) - FindByFilename(filename string) (articleFiles *entity.ArticleFiles, err error) - Create(articleFiles *entity.ArticleFiles) (err error) - Update(id uint, articleFiles *entity.ArticleFiles) (err error) - Delete(id uint) (err error) + GetAll(clientId *uuid.UUID, req request.ArticleFilesQueryRequest) (articleFiless []*entity.ArticleFiles, paging paginator.Pagination, err error) + FindOne(clientId *uuid.UUID, id uint) (articleFiles *entity.ArticleFiles, err error) + FindByArticle(clientId *uuid.UUID, articleId uint) (articleFiles []*entity.ArticleFiles, err error) + FindByFilename(clientId *uuid.UUID, filename string) (articleFiles *entity.ArticleFiles, err error) + Create(clientId *uuid.UUID, articleFiles *entity.ArticleFiles) (err error) + Update(clientId *uuid.UUID, id uint, articleFiles *entity.ArticleFiles) (err error) + Delete(clientId *uuid.UUID, id uint) (err error) } func NewArticleFilesRepository(db *database.Database) ArticleFilesRepository { @@ -32,12 +33,17 @@ func NewArticleFilesRepository(db *database.Database) ArticleFilesRepository { } // implement interface of IArticleFilesRepository -func (_i *articleFilesRepository) GetAll(req request.ArticleFilesQueryRequest) (articleFiless []*entity.ArticleFiles, paging paginator.Pagination, err error) { +func (_i *articleFilesRepository) GetAll(clientId *uuid.UUID, req request.ArticleFilesQueryRequest) (articleFiless []*entity.ArticleFiles, paging paginator.Pagination, err error) { var count int64 query := _i.DB.DB.Model(&entity.ArticleFiles{}) query = query.Where("is_active = ?", true) + // Add client filter + if clientId != nil { + query = query.Where("client_id = ?", clientId) + } + if req.ArticleId != nil { query = query.Where("article_id = ?", req.ArticleId) } @@ -74,36 +80,62 @@ func (_i *articleFilesRepository) GetAll(req request.ArticleFilesQueryRequest) ( return } -func (_i *articleFilesRepository) FindOne(id uint) (articleFiles *entity.ArticleFiles, err error) { - if err := _i.DB.DB.First(&articleFiles, id).Error; err != nil { +func (_i *articleFilesRepository) FindOne(clientId *uuid.UUID, id uint) (articleFiles *entity.ArticleFiles, err error) { + query := _i.DB.DB + if clientId != nil { + query = query.Where("client_id = ?", clientId) + } + if err := query.First(&articleFiles, id).Error; err != nil { return nil, err } return articleFiles, nil } -func (_i *articleFilesRepository) FindByArticle(articleId uint) (articleFiles []*entity.ArticleFiles, err error) { - if err := _i.DB.DB.Where("article_id = ?", articleId).Find(&articleFiles).Error; err != nil { +func (_i *articleFilesRepository) FindByArticle(clientId *uuid.UUID, articleId uint) (articleFiles []*entity.ArticleFiles, err error) { + query := _i.DB.DB.Where("article_id = ?", articleId) + if clientId != nil { + query = query.Where("client_id = ?", clientId) + } + if err := query.Find(&articleFiles).Error; err != nil { return nil, err } return articleFiles, nil } -func (_i *articleFilesRepository) FindByFilename(articleFilename string) (articleFiles *entity.ArticleFiles, err error) { - - if err := _i.DB.DB.Where("file_name = ?", articleFilename).First(&articleFiles).Error; err != nil { +func (_i *articleFilesRepository) FindByFilename(clientId *uuid.UUID, articleFilename string) (articleFiles *entity.ArticleFiles, err error) { + query := _i.DB.DB.Where("file_name = ?", articleFilename) + if clientId != nil { + query = query.Where("client_id = ?", clientId) + } + if err := query.First(&articleFiles).Error; err != nil { return nil, err } return articleFiles, nil } -func (_i *articleFilesRepository) Create(articleFiles *entity.ArticleFiles) (err error) { +func (_i *articleFilesRepository) Create(clientId *uuid.UUID, articleFiles *entity.ArticleFiles) (err error) { + // Set client ID + if clientId != nil { + articleFiles.ClientId = clientId + } return _i.DB.DB.Create(articleFiles).Error } -func (_i *articleFilesRepository) Update(id uint, articleFiles *entity.ArticleFiles) (err error) { +func (_i *articleFilesRepository) Update(clientId *uuid.UUID, id uint, articleFiles *entity.ArticleFiles) (err error) { + // Validate client access + if clientId != nil { + var count int64 + if err := _i.DB.DB.Model(&entity.ArticleFiles{}).Where("id = ? AND client_id = ?", id, clientId).Count(&count).Error; err != nil { + return err + } + if count == 0 { + return fmt.Errorf("access denied to this resource") + } + } + articleFilesMap, err := utilSvc.StructToMap(articleFiles) if err != nil { return err @@ -113,6 +145,17 @@ func (_i *articleFilesRepository) Update(id uint, articleFiles *entity.ArticleFi Updates(articleFilesMap).Error } -func (_i *articleFilesRepository) Delete(id uint) error { +func (_i *articleFilesRepository) Delete(clientId *uuid.UUID, id uint) error { + // Validate client access + if clientId != nil { + var count int64 + if err := _i.DB.DB.Model(&entity.ArticleFiles{}).Where("id = ? AND client_id = ?", id, clientId).Count(&count).Error; err != nil { + return err + } + if count == 0 { + return fmt.Errorf("access denied to this resource") + } + } + return _i.DB.DB.Delete(&entity.ArticleFiles{}, id).Error } diff --git a/app/module/article_files/request/article_files.request.go b/app/module/article_files/request/article_files.request.go index da3b7a5..f6a6861 100644 --- a/app/module/article_files/request/article_files.request.go +++ b/app/module/article_files/request/article_files.request.go @@ -1,10 +1,10 @@ package request import ( - "go-humas-be/app/database/entity" - "go-humas-be/utils/paginator" "strconv" "time" + "web-medols-be/app/database/entity" + "web-medols-be/utils/paginator" ) type ArticleFilesGeneric interface { diff --git a/app/module/article_files/service/article_files.service.go b/app/module/article_files/service/article_files.service.go index 0817c27..72237f9 100644 --- a/app/module/article_files/service/article_files.service.go +++ b/app/module/article_files/service/article_files.service.go @@ -4,15 +4,9 @@ import ( "context" "fmt" "github.com/gofiber/fiber/v2" + "github.com/google/uuid" "github.com/minio/minio-go/v7" "github.com/rs/zerolog" - "go-humas-be/app/module/article_files/mapper" - "go-humas-be/app/module/article_files/repository" - "go-humas-be/app/module/article_files/request" - "go-humas-be/app/module/article_files/response" - config "go-humas-be/config/config" - minioStorage "go-humas-be/config/config" - "go-humas-be/utils/paginator" "io" "log" "math/rand" @@ -24,6 +18,13 @@ import ( "strings" "sync" "time" + "web-medols-be/app/module/article_files/mapper" + "web-medols-be/app/module/article_files/repository" + "web-medols-be/app/module/article_files/request" + "web-medols-be/app/module/article_files/response" + config "web-medols-be/config/config" + minioStorage "web-medols-be/config/config" + "web-medols-be/utils/paginator" ) // ArticleFilesService @@ -36,14 +37,14 @@ type articleFilesService struct { // ArticleFilesService define interface of IArticleFilesService type ArticleFilesService interface { - All(req request.ArticleFilesQueryRequest) (articleFiles []*response.ArticleFilesResponse, paging paginator.Pagination, err error) - Show(id uint) (articleFiles *response.ArticleFilesResponse, err error) - Save(c *fiber.Ctx, id uint) error - SaveAsync(c *fiber.Ctx, id uint) error - Update(id uint, req request.ArticleFilesUpdateRequest) (err error) + All(clientId *uuid.UUID, req request.ArticleFilesQueryRequest) (articleFiles []*response.ArticleFilesResponse, paging paginator.Pagination, err error) + Show(clientId *uuid.UUID, id uint) (articleFiles *response.ArticleFilesResponse, err error) + Save(clientId *uuid.UUID, c *fiber.Ctx, id uint) error + SaveAsync(clientId *uuid.UUID, c *fiber.Ctx, id uint) error + Update(clientId *uuid.UUID, id uint, req request.ArticleFilesUpdateRequest) (err error) GetUploadStatus(c *fiber.Ctx) (progress int, err error) - Delete(id uint) error - Viewer(c *fiber.Ctx) error + Delete(clientId *uuid.UUID, id uint) error + Viewer(clientId *uuid.UUID, c *fiber.Ctx) error } // NewArticleFilesService init ArticleFilesService @@ -69,8 +70,8 @@ type progressWriter struct { } // All implement interface of ArticleFilesService -func (_i *articleFilesService) All(req request.ArticleFilesQueryRequest) (articleFiless []*response.ArticleFilesResponse, paging paginator.Pagination, err error) { - results, paging, err := _i.Repo.GetAll(req) +func (_i *articleFilesService) All(clientId *uuid.UUID, req request.ArticleFilesQueryRequest) (articleFiless []*response.ArticleFilesResponse, paging paginator.Pagination, err error) { + results, paging, err := _i.Repo.GetAll(clientId, req) if err != nil { return } @@ -84,8 +85,8 @@ func (_i *articleFilesService) All(req request.ArticleFilesQueryRequest) (articl return } -func (_i *articleFilesService) Show(id uint) (articleFiles *response.ArticleFilesResponse, err error) { - result, err := _i.Repo.FindOne(id) +func (_i *articleFilesService) Show(clientId *uuid.UUID, id uint) (articleFiles *response.ArticleFilesResponse, err error) { + result, err := _i.Repo.FindOne(clientId, id) if err != nil { return nil, err } @@ -95,7 +96,7 @@ func (_i *articleFilesService) Show(id uint) (articleFiles *response.ArticleFile return mapper.ArticleFilesResponseMapper(result, host), nil } -func (_i *articleFilesService) SaveAsync(c *fiber.Ctx, id uint) (err error) { +func (_i *articleFilesService) SaveAsync(clientId *uuid.UUID, c *fiber.Ctx, id uint) (err error) { bucketName := _i.MinioStorage.Cfg.ObjectStorage.MinioStorage.BucketName ctx := context.Background() @@ -159,7 +160,7 @@ func (_i *articleFilesService) SaveAsync(c *fiber.Ctx, id uint) (err error) { Size: &fileSize, } - err = _i.Repo.Create(req.ToEntity()) + err = _i.Repo.Create(clientId, req.ToEntity()) if err != nil { return err } @@ -194,7 +195,7 @@ func (_i *articleFilesService) SaveAsync(c *fiber.Ctx, id uint) (err error) { return } -func (_i *articleFilesService) Save(c *fiber.Ctx, id uint) (err error) { +func (_i *articleFilesService) Save(clientId *uuid.UUID, c *fiber.Ctx, id uint) (err error) { bucketName := _i.MinioStorage.Cfg.ObjectStorage.MinioStorage.BucketName form, err := c.MultipartForm() @@ -256,7 +257,7 @@ func (_i *articleFilesService) Save(c *fiber.Ctx, id uint) (err error) { Size: &fileSize, } - err = _i.Repo.Create(req.ToEntity()) + err = _i.Repo.Create(clientId, req.ToEntity()) if err != nil { return err } @@ -276,23 +277,23 @@ func (_i *articleFilesService) Save(c *fiber.Ctx, id uint) (err error) { return } -func (_i *articleFilesService) Update(id uint, req request.ArticleFilesUpdateRequest) (err error) { +func (_i *articleFilesService) Update(clientId *uuid.UUID, id uint, req request.ArticleFilesUpdateRequest) (err error) { _i.Log.Info().Interface("data", req).Msg("") - return _i.Repo.Update(id, req.ToEntity()) + return _i.Repo.Update(clientId, id, req.ToEntity()) } -func (_i *articleFilesService) Delete(id uint) error { - result, err := _i.Repo.FindOne(id) +func (_i *articleFilesService) Delete(clientId *uuid.UUID, id uint) error { + result, err := _i.Repo.FindOne(clientId, id) if err != nil { return err } result.IsActive = false - return _i.Repo.Update(id, result) + return _i.Repo.Update(clientId, id, result) } -func (_i *articleFilesService) Viewer(c *fiber.Ctx) (err error) { +func (_i *articleFilesService) Viewer(clientId *uuid.UUID, c *fiber.Ctx) (err error) { filename := c.Params("filename") - result, err := _i.Repo.FindByFilename(filename) + result, err := _i.Repo.FindByFilename(clientId, filename) if err != nil { return err } diff --git a/app/module/article_nulis_ai/article_nulis_ai.module.go b/app/module/article_nulis_ai/article_nulis_ai.module.go index f34f257..f47bbee 100644 --- a/app/module/article_nulis_ai/article_nulis_ai.module.go +++ b/app/module/article_nulis_ai/article_nulis_ai.module.go @@ -2,10 +2,10 @@ package article_nulis_ai import ( "github.com/gofiber/fiber/v2" - "go-humas-be/app/module/article_nulis_ai/controller" - "go-humas-be/app/module/article_nulis_ai/repository" - "go-humas-be/app/module/article_nulis_ai/service" "go.uber.org/fx" + "web-medols-be/app/module/article_nulis_ai/controller" + "web-medols-be/app/module/article_nulis_ai/repository" + "web-medols-be/app/module/article_nulis_ai/service" ) // struct of ArticleNulisAIRouter diff --git a/app/module/article_nulis_ai/controller/article_nulis_ai.controller.go b/app/module/article_nulis_ai/controller/article_nulis_ai.controller.go index f81541d..f7a7781 100644 --- a/app/module/article_nulis_ai/controller/article_nulis_ai.controller.go +++ b/app/module/article_nulis_ai/controller/article_nulis_ai.controller.go @@ -3,12 +3,12 @@ package controller import ( "github.com/gofiber/fiber/v2" "github.com/rs/zerolog" - "go-humas-be/app/module/article_nulis_ai/request" - "go-humas-be/app/module/article_nulis_ai/service" - "go-humas-be/utils/paginator" - utilRes "go-humas-be/utils/response" - utilVal "go-humas-be/utils/validator" "strconv" + "web-medols-be/app/module/article_nulis_ai/request" + "web-medols-be/app/module/article_nulis_ai/service" + "web-medols-be/utils/paginator" + utilRes "web-medols-be/utils/response" + utilVal "web-medols-be/utils/validator" ) type articleNulisAIController struct { diff --git a/app/module/article_nulis_ai/controller/controller.go b/app/module/article_nulis_ai/controller/controller.go index 03095c6..c2f3815 100644 --- a/app/module/article_nulis_ai/controller/controller.go +++ b/app/module/article_nulis_ai/controller/controller.go @@ -2,7 +2,7 @@ package controller import ( "github.com/rs/zerolog" - "go-humas-be/app/module/article_nulis_ai/service" + "web-medols-be/app/module/article_nulis_ai/service" ) type Controller struct { diff --git a/app/module/article_nulis_ai/mapper/article_nulis_ai.mapper.go b/app/module/article_nulis_ai/mapper/article_nulis_ai.mapper.go index e894c74..a4fdf56 100644 --- a/app/module/article_nulis_ai/mapper/article_nulis_ai.mapper.go +++ b/app/module/article_nulis_ai/mapper/article_nulis_ai.mapper.go @@ -1,8 +1,8 @@ package mapper import ( - "go-humas-be/app/database/entity" - res "go-humas-be/app/module/article_nulis_ai/response" + "web-medols-be/app/database/entity" + res "web-medols-be/app/module/article_nulis_ai/response" ) func ArticleNulisAIResponseMapper(articleNulisAIReq *entity.ArticleNulisAI) (articleNulisAIRes *res.ArticleNulisAIResponse) { diff --git a/app/module/article_nulis_ai/repository/article_nulis_ai.repository.go b/app/module/article_nulis_ai/repository/article_nulis_ai.repository.go index 73b5921..ac79db8 100644 --- a/app/module/article_nulis_ai/repository/article_nulis_ai.repository.go +++ b/app/module/article_nulis_ai/repository/article_nulis_ai.repository.go @@ -3,11 +3,11 @@ package repository import ( "fmt" "github.com/rs/zerolog" - "go-humas-be/app/database" - "go-humas-be/app/database/entity" - "go-humas-be/app/module/article_nulis_ai/request" - "go-humas-be/utils/paginator" "strings" + "web-medols-be/app/database" + "web-medols-be/app/database/entity" + "web-medols-be/app/module/article_nulis_ai/request" + "web-medols-be/utils/paginator" ) type articleNulisAIRepository struct { diff --git a/app/module/article_nulis_ai/request/article_nulis_ai.request.go b/app/module/article_nulis_ai/request/article_nulis_ai.request.go index 70e2756..07dfccc 100644 --- a/app/module/article_nulis_ai/request/article_nulis_ai.request.go +++ b/app/module/article_nulis_ai/request/article_nulis_ai.request.go @@ -1,10 +1,10 @@ package request import ( - "go-humas-be/app/database/entity" - "go-humas-be/utils/paginator" "strconv" "time" + "web-medols-be/app/database/entity" + "web-medols-be/utils/paginator" ) type ArticleNulisAIGeneric interface { diff --git a/app/module/article_nulis_ai/service/article_nulis_ai.service.go b/app/module/article_nulis_ai/service/article_nulis_ai.service.go index 68dc40b..ed996b3 100644 --- a/app/module/article_nulis_ai/service/article_nulis_ai.service.go +++ b/app/module/article_nulis_ai/service/article_nulis_ai.service.go @@ -2,17 +2,17 @@ package service import ( "github.com/rs/zerolog" - "go-humas-be/app/database/entity" - "go-humas-be/app/module/article_nulis_ai/mapper" - "go-humas-be/app/module/article_nulis_ai/repository" - "go-humas-be/app/module/article_nulis_ai/request" - "go-humas-be/app/module/article_nulis_ai/response" - articlesRepository "go-humas-be/app/module/articles/repository" - articles "go-humas-be/app/module/articles/request" - usersRepository "go-humas-be/app/module/users/repository" - "go-humas-be/utils/paginator" + "web-medols-be/app/database/entity" + "web-medols-be/app/module/article_nulis_ai/mapper" + "web-medols-be/app/module/article_nulis_ai/repository" + "web-medols-be/app/module/article_nulis_ai/request" + "web-medols-be/app/module/article_nulis_ai/response" + articlesRepository "web-medols-be/app/module/articles/repository" + articles "web-medols-be/app/module/articles/request" + usersRepository "web-medols-be/app/module/users/repository" + "web-medols-be/utils/paginator" - utilSvc "go-humas-be/utils/service" + utilSvc "web-medols-be/utils/service" ) // ArticleNulisAIService @@ -96,7 +96,7 @@ func (_i *articleNulisAIService) Publish(req request.ArticleNulisAICreateRequest newArticleReq := articleReq.ToEntity() newArticleReq.CreatedById = &createdBy.ID - _, err = _i.ArticlesRepo.Create(newArticleReq) + _, err = _i.ArticlesRepo.Create(nil, newArticleReq) if err != nil { return err } else { diff --git a/app/module/articles/articles.module.go b/app/module/articles/articles.module.go index 55313df..3ef4365 100644 --- a/app/module/articles/articles.module.go +++ b/app/module/articles/articles.module.go @@ -2,10 +2,10 @@ package articles import ( "github.com/gofiber/fiber/v2" - "go-humas-be/app/module/articles/controller" - "go-humas-be/app/module/articles/repository" - "go-humas-be/app/module/articles/service" "go.uber.org/fx" + "web-medols-be/app/module/articles/controller" + "web-medols-be/app/module/articles/repository" + "web-medols-be/app/module/articles/service" ) // ArticlesRouter struct of ArticlesRouter diff --git a/app/module/articles/controller/articles.controller.go b/app/module/articles/controller/articles.controller.go index 3a041f8..83d3f41 100644 --- a/app/module/articles/controller/articles.controller.go +++ b/app/module/articles/controller/articles.controller.go @@ -2,17 +2,20 @@ package controller import ( "github.com/gofiber/fiber/v2" - "go-humas-be/app/module/articles/request" - "go-humas-be/app/module/articles/service" - "go-humas-be/utils/paginator" + "github.com/rs/zerolog" "strconv" + "web-medols-be/app/middleware" + "web-medols-be/app/module/articles/request" + "web-medols-be/app/module/articles/service" + "web-medols-be/utils/paginator" - utilRes "go-humas-be/utils/response" - utilVal "go-humas-be/utils/validator" + utilRes "web-medols-be/utils/response" + utilVal "web-medols-be/utils/validator" ) type articlesController struct { articlesService service.ArticlesService + Log zerolog.Logger } type ArticlesController interface { @@ -31,9 +34,10 @@ type ArticlesController interface { PublishScheduling(c *fiber.Ctx) error } -func NewArticlesController(articlesService service.ArticlesService) ArticlesController { +func NewArticlesController(articlesService service.ArticlesService, log zerolog.Logger) ArticlesController { return &articlesController{ articlesService: articlesService, + Log: log, } } @@ -42,6 +46,7 @@ func NewArticlesController(articlesService service.ArticlesService) ArticlesCont // @Description API for getting all Articles // @Tags Articles // @Security Bearer +// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param req query request.ArticlesQueryRequest false "query parameters" // @Param req query paginator.Pagination false "pagination parameters" // @Success 200 {object} response.Response @@ -70,7 +75,12 @@ func (_i *articlesController) All(c *fiber.Ctx) error { req := reqContext.ToParamRequest() req.Pagination = paginate - articlesData, paging, err := _i.articlesService.All(req) + // Get ClientId from context + clientId := middleware.GetClientID(c) + + _i.Log.Info().Interface("clientId", clientId).Msg("") + + articlesData, paging, err := _i.articlesService.All(clientId, req) if err != nil { return err } @@ -100,7 +110,10 @@ func (_i *articlesController) Show(c *fiber.Ctx) error { return err } - articlesData, err := _i.articlesService.Show(uint(id)) + // Get ClientId from context + clientId := middleware.GetClientID(c) + + articlesData, err := _i.articlesService.Show(clientId, uint(id)) if err != nil { return err } @@ -129,7 +142,10 @@ func (_i *articlesController) ShowByOldId(c *fiber.Ctx) error { return err } - articlesData, err := _i.articlesService.ShowByOldId(uint(id)) + // Get ClientId from context + clientId := middleware.GetClientID(c) + + articlesData, err := _i.articlesService.ShowByOldId(clientId, uint(id)) if err != nil { return err } @@ -161,7 +177,11 @@ func (_i *articlesController) Save(c *fiber.Ctx) error { } authToken := c.Get("Authorization") - dataResult, err := _i.articlesService.Save(*req, authToken) + + // Get ClientId from context + clientId := middleware.GetClientID(c) + + dataResult, err := _i.articlesService.Save(clientId, *req, authToken) if err != nil { return err } @@ -188,7 +208,10 @@ func (_i *articlesController) Save(c *fiber.Ctx) error { // @Failure 500 {object} response.InternalServerError // @Router /articles/thumbnail/{id} [post] func (_i *articlesController) SaveThumbnail(c *fiber.Ctx) error { - err := _i.articlesService.SaveThumbnail(c) + // Get ClientId from context + clientId := middleware.GetClientID(c) + + err := _i.articlesService.SaveThumbnail(clientId, c) if err != nil { return err } @@ -223,7 +246,10 @@ func (_i *articlesController) Update(c *fiber.Ctx) error { return err } - err = _i.articlesService.Update(uint(id), *req) + // Get ClientId from context + clientId := middleware.GetClientID(c) + + err = _i.articlesService.Update(clientId, uint(id), *req) if err != nil { return err } @@ -258,7 +284,10 @@ func (_i *articlesController) UpdateBanner(c *fiber.Ctx) error { return err } - err = _i.articlesService.UpdateBanner(uint(id), isBanner) + // Get ClientId from context + clientId := middleware.GetClientID(c) + + err = _i.articlesService.UpdateBanner(clientId, uint(id), isBanner) if err != nil { return err } @@ -287,7 +316,10 @@ func (_i *articlesController) Delete(c *fiber.Ctx) error { return err } - err = _i.articlesService.Delete(uint(id)) + // Get ClientId from context + clientId := middleware.GetClientID(c) + + err = _i.articlesService.Delete(clientId, uint(id)) if err != nil { return err } @@ -310,7 +342,10 @@ func (_i *articlesController) Delete(c *fiber.Ctx) error { // @Failure 500 {object} response.InternalServerError // @Router /articles/thumbnail/viewer/{thumbnailName} [get] func (_i *articlesController) Viewer(c *fiber.Ctx) error { - return _i.articlesService.Viewer(c) + // Get ClientId from context + clientId := middleware.GetClientID(c) + + return _i.articlesService.Viewer(clientId, c) } // SummaryStats Articles @@ -327,7 +362,10 @@ func (_i *articlesController) Viewer(c *fiber.Ctx) error { func (_i *articlesController) SummaryStats(c *fiber.Ctx) error { authToken := c.Get("Authorization") - response, err := _i.articlesService.SummaryStats(authToken) + // Get ClientId from context + clientId := middleware.GetClientID(c) + + response, err := _i.articlesService.SummaryStats(clientId, authToken) if err != nil { return err } @@ -357,7 +395,10 @@ func (_i *articlesController) ArticlePerUserLevelStats(c *fiber.Ctx) error { startDate := c.Query("startDate") endDate := c.Query("endDate") - response, err := _i.articlesService.ArticlePerUserLevelStats(authToken, &startDate, &endDate) + // Get ClientId from context + clientId := middleware.GetClientID(c) + + response, err := _i.articlesService.ArticlePerUserLevelStats(clientId, authToken, &startDate, &endDate) if err != nil { return err } @@ -389,7 +430,10 @@ func (_i *articlesController) ArticleMonthlyStats(c *fiber.Ctx) error { return err } - response, err := _i.articlesService.ArticleMonthlyStats(authToken, &yearInt) + // Get ClientId from context + clientId := middleware.GetClientID(c) + + response, err := _i.articlesService.ArticleMonthlyStats(clientId, authToken, &yearInt) if err != nil { return err } @@ -422,7 +466,10 @@ func (_i *articlesController) PublishScheduling(c *fiber.Ctx) error { } date := c.Query("date") - err = _i.articlesService.PublishScheduling(uint(id), date) + // Get ClientId from context + clientId := middleware.GetClientID(c) + + err = _i.articlesService.PublishScheduling(clientId, uint(id), date) if err != nil { return err } diff --git a/app/module/articles/controller/controller.go b/app/module/articles/controller/controller.go index 4208b7d..3b50fe8 100644 --- a/app/module/articles/controller/controller.go +++ b/app/module/articles/controller/controller.go @@ -1,15 +1,16 @@ package controller import ( - "go-humas-be/app/module/articles/service" + "github.com/rs/zerolog" + "web-medols-be/app/module/articles/service" ) type Controller struct { Articles ArticlesController } -func NewController(ArticlesService service.ArticlesService) *Controller { +func NewController(ArticlesService service.ArticlesService, log zerolog.Logger) *Controller { return &Controller{ - Articles: NewArticlesController(ArticlesService), + Articles: NewArticlesController(ArticlesService, log), } } diff --git a/app/module/articles/mapper/articles.mapper.go b/app/module/articles/mapper/articles.mapper.go index 38e5dff..e1f66a6 100644 --- a/app/module/articles/mapper/articles.mapper.go +++ b/app/module/articles/mapper/articles.mapper.go @@ -1,22 +1,24 @@ package mapper import ( + "github.com/google/uuid" "github.com/rs/zerolog" - "go-humas-be/app/database/entity" - articleCategoriesMapper "go-humas-be/app/module/article_categories/mapper" - articleCategoriesRepository "go-humas-be/app/module/article_categories/repository" - articleCategoriesResponse "go-humas-be/app/module/article_categories/response" - articleCategoryDetailsRepository "go-humas-be/app/module/article_category_details/repository" - articleFilesMapper "go-humas-be/app/module/article_files/mapper" - articleFilesRepository "go-humas-be/app/module/article_files/repository" - articleFilesResponse "go-humas-be/app/module/article_files/response" - res "go-humas-be/app/module/articles/response" - usersRepository "go-humas-be/app/module/users/repository" + "web-medols-be/app/database/entity" + articleCategoriesMapper "web-medols-be/app/module/article_categories/mapper" + articleCategoriesRepository "web-medols-be/app/module/article_categories/repository" + articleCategoriesResponse "web-medols-be/app/module/article_categories/response" + articleCategoryDetailsRepository "web-medols-be/app/module/article_category_details/repository" + articleFilesMapper "web-medols-be/app/module/article_files/mapper" + articleFilesRepository "web-medols-be/app/module/article_files/repository" + articleFilesResponse "web-medols-be/app/module/article_files/response" + res "web-medols-be/app/module/articles/response" + usersRepository "web-medols-be/app/module/users/repository" ) func ArticlesResponseMapper( log zerolog.Logger, host string, + clientId *uuid.UUID, articlesReq *entity.Articles, articleCategoriesRepo articleCategoriesRepository.ArticleCategoriesRepository, articleCategoryDetailsRepo articleCategoryDetailsRepository.ArticleCategoryDetailsRepository, @@ -42,7 +44,7 @@ func ArticlesResponseMapper( log.Info().Interface("articleCategoriesArr", articleCategoriesArr).Msg("") } - articleFiles, _ := articleFilesRepo.FindByArticle(articlesReq.ID) + articleFiles, _ := articleFilesRepo.FindByArticle(clientId, articlesReq.ID) var articleFilesArr []*articleFilesResponse.ArticleFilesResponse if articleFiles != nil && len(articleFiles) > 0 { for _, result := range articleFiles { diff --git a/app/module/articles/repository/articles.repository.go b/app/module/articles/repository/articles.repository.go index c449acb..517ebcf 100644 --- a/app/module/articles/repository/articles.repository.go +++ b/app/module/articles/repository/articles.repository.go @@ -2,15 +2,16 @@ package repository import ( "fmt" + "github.com/google/uuid" "github.com/rs/zerolog" - "go-humas-be/app/database" - "go-humas-be/app/database/entity" - "go-humas-be/app/module/articles/request" - "go-humas-be/app/module/articles/response" - "go-humas-be/utils/paginator" - utilSvc "go-humas-be/utils/service" "strings" "time" + "web-medols-be/app/database" + "web-medols-be/app/database/entity" + "web-medols-be/app/module/articles/request" + "web-medols-be/app/module/articles/response" + "web-medols-be/utils/paginator" + utilSvc "web-medols-be/utils/service" ) type articlesRepository struct { @@ -20,18 +21,18 @@ type articlesRepository struct { // ArticlesRepository define interface of IArticlesRepository type ArticlesRepository interface { - GetAll(req request.ArticlesQueryRequest) (articless []*entity.Articles, paging paginator.Pagination, err error) - GetAllPublishSchedule() (articless []*entity.Articles, err error) - FindOne(id uint) (articles *entity.Articles, err error) - FindByFilename(thumbnailName string) (articleReturn *entity.Articles, err error) - FindByOldId(oldId uint) (articles *entity.Articles, err error) - Create(articles *entity.Articles) (articleReturn *entity.Articles, err error) - Update(id uint, articles *entity.Articles) (err error) - UpdateSkipNull(id uint, articles *entity.Articles) (err error) - Delete(id uint) (err error) - SummaryStats(userID uint) (articleSummaryStats *response.ArticleSummaryStats, err error) - ArticlePerUserLevelStats(userLevelId *uint, levelNumber *int, startDate *time.Time, endDate *time.Time) (articlePerUserLevelStats []*response.ArticlePerUserLevelStats, err error) - ArticleMonthlyStats(userLevelId *uint, levelNumber *int, year int) (articleMontlyStats []*response.ArticleMonthlyStats, err error) + GetAll(clientId *uuid.UUID, req request.ArticlesQueryRequest) (articless []*entity.Articles, paging paginator.Pagination, err error) + GetAllPublishSchedule(clientId *uuid.UUID) (articless []*entity.Articles, err error) + FindOne(clientId *uuid.UUID, id uint) (articles *entity.Articles, err error) + FindByFilename(clientId *uuid.UUID, thumbnailName string) (articleReturn *entity.Articles, err error) + FindByOldId(clientId *uuid.UUID, oldId uint) (articles *entity.Articles, err error) + Create(clientId *uuid.UUID, articles *entity.Articles) (articleReturn *entity.Articles, err error) + Update(clientId *uuid.UUID, id uint, articles *entity.Articles) (err error) + UpdateSkipNull(clientId *uuid.UUID, id uint, articles *entity.Articles) (err error) + Delete(clientId *uuid.UUID, id uint) (err error) + SummaryStats(clientId *uuid.UUID, userID uint) (articleSummaryStats *response.ArticleSummaryStats, err error) + ArticlePerUserLevelStats(clientId *uuid.UUID, userLevelId *uint, levelNumber *int, startDate *time.Time, endDate *time.Time) (articlePerUserLevelStats []*response.ArticlePerUserLevelStats, err error) + ArticleMonthlyStats(clientId *uuid.UUID, userLevelId *uint, levelNumber *int, year int) (articleMontlyStats []*response.ArticleMonthlyStats, err error) } func NewArticlesRepository(db *database.Database, log zerolog.Logger) ArticlesRepository { @@ -42,10 +43,16 @@ func NewArticlesRepository(db *database.Database, log zerolog.Logger) ArticlesRe } // implement interface of IArticlesRepository -func (_i *articlesRepository) GetAll(req request.ArticlesQueryRequest) (articless []*entity.Articles, paging paginator.Pagination, err error) { +func (_i *articlesRepository) GetAll(clientId *uuid.UUID, req request.ArticlesQueryRequest) (articless []*entity.Articles, paging paginator.Pagination, err error) { var count int64 query := _i.DB.DB.Model(&entity.Articles{}) + + // Add client filter + if clientId != nil { + query = query.Where("client_id = ?", clientId) + } + if req.CategoryId != nil { query = query.Joins("JOIN article_category_details acd ON acd.article_id = articles.id"). Where("acd.category_id = ?", req.CategoryId) @@ -109,44 +116,76 @@ func (_i *articlesRepository) GetAll(req request.ArticlesQueryRequest) (articles return } -func (_i *articlesRepository) GetAllPublishSchedule() (articles []*entity.Articles, err error) { - err = _i.DB.DB.Where("publish_schedule IS NOT NULL").Find(&articles).Error +func (_i *articlesRepository) GetAllPublishSchedule(clientId *uuid.UUID) (articles []*entity.Articles, err error) { + query := _i.DB.DB.Where("publish_schedule IS NOT NULL") + if clientId != nil { + query = query.Where("client_id = ?", clientId) + } + err = query.Find(&articles).Error if err != nil { return nil, err } return articles, nil } -func (_i *articlesRepository) FindOne(id uint) (articles *entity.Articles, err error) { - if err := _i.DB.DB.First(&articles, id).Error; err != nil { +func (_i *articlesRepository) FindOne(clientId *uuid.UUID, id uint) (articles *entity.Articles, err error) { + query := _i.DB.DB + if clientId != nil { + query = query.Where("client_id = ?", clientId) + } + if err := query.First(&articles, id).Error; err != nil { return nil, err } return articles, nil } -func (_i *articlesRepository) FindByFilename(thumbnailName string) (articles *entity.Articles, err error) { - if err := _i.DB.DB.Where("thumbnail_name = ?", thumbnailName).First(&articles).Error; err != nil { +func (_i *articlesRepository) FindByFilename(clientId *uuid.UUID, thumbnailName string) (articles *entity.Articles, err error) { + query := _i.DB.DB.Where("thumbnail_name = ?", thumbnailName) + if clientId != nil { + query = query.Where("client_id = ?", clientId) + } + if err := query.First(&articles).Error; err != nil { return nil, err } return articles, nil } -func (_i *articlesRepository) FindByOldId(oldId uint) (articles *entity.Articles, err error) { - if err := _i.DB.DB.Where("old_id = ?", oldId).First(&articles).Error; err != nil { +func (_i *articlesRepository) FindByOldId(clientId *uuid.UUID, oldId uint) (articles *entity.Articles, err error) { + query := _i.DB.DB.Where("old_id = ?", oldId) + if clientId != nil { + query = query.Where("client_id = ?", clientId) + } + if err := query.First(&articles).Error; err != nil { return nil, err } return articles, nil } -func (_i *articlesRepository) Create(articles *entity.Articles) (articleReturn *entity.Articles, err error) { +func (_i *articlesRepository) Create(clientId *uuid.UUID, articles *entity.Articles) (articleReturn *entity.Articles, err error) { + // Set client ID + if clientId != nil { + articles.ClientId = clientId + } + result := _i.DB.DB.Create(articles) return articles, result.Error } -func (_i *articlesRepository) Update(id uint, articles *entity.Articles) (err error) { +func (_i *articlesRepository) Update(clientId *uuid.UUID, id uint, articles *entity.Articles) (err error) { + // Validate client access + if clientId != nil { + var count int64 + if err := _i.DB.DB.Model(&entity.Articles{}).Where("id = ? AND client_id = ?", id, clientId).Count(&count).Error; err != nil { + return err + } + if count == 0 { + return fmt.Errorf("access denied to this resource") + } + } + articlesMap, err := utilSvc.StructToMap(articles) if err != nil { return err @@ -156,23 +195,45 @@ func (_i *articlesRepository) Update(id uint, articles *entity.Articles) (err er Updates(articlesMap).Error } -func (_i *articlesRepository) UpdateSkipNull(id uint, articles *entity.Articles) (err error) { +func (_i *articlesRepository) UpdateSkipNull(clientId *uuid.UUID, id uint, articles *entity.Articles) (err error) { + // Validate client access + if clientId != nil { + var count int64 + if err := _i.DB.DB.Model(&entity.Articles{}).Where("id = ? AND client_id = ?", id, clientId).Count(&count).Error; err != nil { + return err + } + if count == 0 { + return fmt.Errorf("access denied to this resource") + } + } + return _i.DB.DB.Model(&entity.Articles{}). Where(&entity.Articles{ID: id}). Updates(articles).Error } -func (_i *articlesRepository) Delete(id uint) error { +func (_i *articlesRepository) Delete(clientId *uuid.UUID, id uint) error { + // Validate client access + if clientId != nil { + var count int64 + if err := _i.DB.DB.Model(&entity.Articles{}).Where("id = ? AND client_id = ?", id, clientId).Count(&count).Error; err != nil { + return err + } + if count == 0 { + return fmt.Errorf("access denied to this resource") + } + } + return _i.DB.DB.Delete(&entity.Articles{}, id).Error } -func (_i *articlesRepository) SummaryStats(userID uint) (articleSummaryStats *response.ArticleSummaryStats, err error) { +func (_i *articlesRepository) SummaryStats(clientId *uuid.UUID, userID uint) (articleSummaryStats *response.ArticleSummaryStats, err error) { now := time.Now() startOfDay := now.Truncate(24 * time.Hour) startOfWeek := now.AddDate(0, 0, -int(now.Weekday())+1).Truncate(24 * time.Hour) // Query - err = _i.DB.DB.Model(&entity.Articles{}). + query := _i.DB.DB.Model(&entity.Articles{}). Select( "COUNT(*) AS total_all, "+ "COALESCE(SUM(view_count), 0) AS total_views, "+ @@ -182,13 +243,19 @@ func (_i *articlesRepository) SummaryStats(userID uint) (articleSummaryStats *re "COUNT(CASE WHEN created_at >= ? THEN 1 END) AS total_this_week", startOfDay, startOfWeek, ). - Where("created_by_id = ?", userID). - Scan(&articleSummaryStats).Error + Where("created_by_id = ?", userID) + + // Add client filter + if clientId != nil { + query = query.Where("client_id = ?", clientId) + } + + err = query.Scan(&articleSummaryStats).Error return articleSummaryStats, err } -func (_i *articlesRepository) ArticlePerUserLevelStats(userLevelId *uint, levelNumber *int, startDate *time.Time, endDate *time.Time) (articlePerUserLevelStats []*response.ArticlePerUserLevelStats, err error) { +func (_i *articlesRepository) ArticlePerUserLevelStats(clientId *uuid.UUID, userLevelId *uint, levelNumber *int, startDate *time.Time, endDate *time.Time) (articlePerUserLevelStats []*response.ArticlePerUserLevelStats, err error) { levelNumberTop := 1 @@ -198,6 +265,11 @@ func (_i *articlesRepository) ArticlePerUserLevelStats(userLevelId *uint, levelN Joins("LEFT JOIN user_levels ON users.user_level_id = user_levels.id"). Where("articles.is_active = true") + // Add client filter + if clientId != nil { + query = query.Where("articles.client_id = ?", clientId) + } + if userLevelId != nil && *levelNumber != levelNumberTop { query = query.Where("user_levels.id = ? or user_levels.parent_level_id = ?", *userLevelId, *userLevelId) } else { @@ -229,12 +301,14 @@ func (_i *articlesRepository) ArticlePerUserLevelStats(userLevelId *uint, levelN FROM articles JOIN users ON articles.created_by_id = users.id JOIN LevelHierarchy lh ON users.user_level_id = lh.id - WHERE articles.is_active = true AND lh.level_2_id > 0 - GROUP BY - lh.level_2_id, - lh.level_2_name - ORDER BY - total_article DESC`) + WHERE articles.is_active = true AND lh.level_2_id > 0`) + + // Add client filter to raw query + if clientId != nil { + query = query.Where("articles.client_id = ?", clientId) + } + + query = query.Group("lh.level_2_id, lh.level_2_name").Order("total_article DESC") } // Apply date filters if provided @@ -253,7 +327,7 @@ func (_i *articlesRepository) ArticlePerUserLevelStats(userLevelId *uint, levelN return articlePerUserLevelStats, err } -func (_i *articlesRepository) ArticleMonthlyStats(userLevelId *uint, levelNumber *int, year int) (articleMontlyStats []*response.ArticleMonthlyStats, err error) { +func (_i *articlesRepository) ArticleMonthlyStats(clientId *uuid.UUID, userLevelId *uint, levelNumber *int, year int) (articleMontlyStats []*response.ArticleMonthlyStats, err error) { levelNumberTop := 1 if year < 1900 || year > 2100 { @@ -275,6 +349,11 @@ func (_i *articlesRepository) ArticleMonthlyStats(userLevelId *uint, levelNumber "SUM(share_count) as total_share"). Where("EXTRACT(YEAR FROM created_at) = ?", year) + // Add client filter + if clientId != nil { + query = query.Where("client_id = ?", clientId) + } + if userLevelId != nil && *levelNumber != levelNumberTop { query = _i.DB.DB.Model(&entity.Articles{}). Select("EXTRACT(MONTH FROM articles.created_at) as month, EXTRACT(DAY FROM articles.created_at) as day, "+ @@ -286,6 +365,11 @@ func (_i *articlesRepository) ArticleMonthlyStats(userLevelId *uint, levelNumber Where("articles.is_active = true"). Where("EXTRACT(YEAR FROM articles.created_at) = ?", year). Where("(user_levels.id = ? OR user_levels.parent_level_id = ?)", *userLevelId, *userLevelId) + + // Add client filter + if clientId != nil { + query = query.Where("articles.client_id = ?", clientId) + } } err = query.Group("month, day").Scan(&results).Error diff --git a/app/module/articles/request/articles.request.go b/app/module/articles/request/articles.request.go index 2ae1302..fd3d48a 100644 --- a/app/module/articles/request/articles.request.go +++ b/app/module/articles/request/articles.request.go @@ -1,10 +1,10 @@ package request import ( - "go-humas-be/app/database/entity" - "go-humas-be/utils/paginator" "strconv" "time" + "web-medols-be/app/database/entity" + "web-medols-be/utils/paginator" ) type ArticlesGeneric interface { diff --git a/app/module/articles/response/articles.response.go b/app/module/articles/response/articles.response.go index b1e6075..7534dd6 100644 --- a/app/module/articles/response/articles.response.go +++ b/app/module/articles/response/articles.response.go @@ -1,9 +1,9 @@ package response import ( - articleCategoriesResponse "go-humas-be/app/module/article_categories/response" - articleFilesResponse "go-humas-be/app/module/article_files/response" "time" + articleCategoriesResponse "web-medols-be/app/module/article_categories/response" + articleFilesResponse "web-medols-be/app/module/article_files/response" ) type ArticlesResponse struct { diff --git a/app/module/articles/service/articles.service.go b/app/module/articles/service/articles.service.go index c486296..af912b7 100644 --- a/app/module/articles/service/articles.service.go +++ b/app/module/articles/service/articles.service.go @@ -5,23 +5,9 @@ import ( "errors" "fmt" "github.com/gofiber/fiber/v2" + "github.com/google/uuid" "github.com/minio/minio-go/v7" "github.com/rs/zerolog" - "go-humas-be/app/database/entity" - articleApprovalsRepository "go-humas-be/app/module/article_approvals/repository" - articleCategoriesRepository "go-humas-be/app/module/article_categories/repository" - articleCategoryDetailsRepository "go-humas-be/app/module/article_category_details/repository" - articleCategoryDetailsReq "go-humas-be/app/module/article_category_details/request" - articleFilesRepository "go-humas-be/app/module/article_files/repository" - "go-humas-be/app/module/articles/mapper" - "go-humas-be/app/module/articles/repository" - "go-humas-be/app/module/articles/request" - "go-humas-be/app/module/articles/response" - usersRepository "go-humas-be/app/module/users/repository" - config "go-humas-be/config/config" - minioStorage "go-humas-be/config/config" - "go-humas-be/utils/paginator" - utilSvc "go-humas-be/utils/service" "io" "log" "math/rand" @@ -30,6 +16,21 @@ import ( "strconv" "strings" "time" + "web-medols-be/app/database/entity" + articleApprovalsRepository "web-medols-be/app/module/article_approvals/repository" + articleCategoriesRepository "web-medols-be/app/module/article_categories/repository" + articleCategoryDetailsRepository "web-medols-be/app/module/article_category_details/repository" + articleCategoryDetailsReq "web-medols-be/app/module/article_category_details/request" + articleFilesRepository "web-medols-be/app/module/article_files/repository" + "web-medols-be/app/module/articles/mapper" + "web-medols-be/app/module/articles/repository" + "web-medols-be/app/module/articles/request" + "web-medols-be/app/module/articles/response" + usersRepository "web-medols-be/app/module/users/repository" + config "web-medols-be/config/config" + minioStorage "web-medols-be/config/config" + "web-medols-be/utils/paginator" + utilSvc "web-medols-be/utils/service" ) // ArticlesService @@ -47,21 +48,21 @@ type articlesService struct { // ArticlesService define interface of IArticlesService type ArticlesService interface { - All(req request.ArticlesQueryRequest) (articles []*response.ArticlesResponse, paging paginator.Pagination, err error) - Show(id uint) (articles *response.ArticlesResponse, err error) - ShowByOldId(oldId uint) (articles *response.ArticlesResponse, err error) - Save(req request.ArticlesCreateRequest, authToken string) (articles *entity.Articles, err error) - SaveThumbnail(c *fiber.Ctx) (err error) - Update(id uint, req request.ArticlesUpdateRequest) (err error) - Delete(id uint) error - UpdateActivityCount(id uint, activityTypeId int) (err error) - UpdateApproval(id uint, statusId int, userLevelId int, userLevelNumber int, userParentLevelId int) (err error) - UpdateBanner(id uint, isBanner bool) error - Viewer(c *fiber.Ctx) error - SummaryStats(authToken string) (summaryStats *response.ArticleSummaryStats, err error) - ArticlePerUserLevelStats(authToken string, startDate *string, endDate *string) (articlePerUserLevelStats []*response.ArticlePerUserLevelStats, err error) - ArticleMonthlyStats(authToken string, year *int) (articleMonthlyStats []*response.ArticleMonthlyStats, err error) - PublishScheduling(id uint, publishSchedule string) error + All(clientId *uuid.UUID, req request.ArticlesQueryRequest) (articles []*response.ArticlesResponse, paging paginator.Pagination, err error) + Show(clientId *uuid.UUID, id uint) (articles *response.ArticlesResponse, err error) + ShowByOldId(clientId *uuid.UUID, oldId uint) (articles *response.ArticlesResponse, err error) + Save(clientId *uuid.UUID, req request.ArticlesCreateRequest, authToken string) (articles *entity.Articles, err error) + SaveThumbnail(clientId *uuid.UUID, c *fiber.Ctx) (err error) + Update(clientId *uuid.UUID, id uint, req request.ArticlesUpdateRequest) (err error) + Delete(clientId *uuid.UUID, id uint) error + UpdateActivityCount(clientId *uuid.UUID, id uint, activityTypeId int) (err error) + UpdateApproval(clientId *uuid.UUID, id uint, statusId int, userLevelId int, userLevelNumber int, userParentLevelId int) (err error) + UpdateBanner(clientId *uuid.UUID, id uint, isBanner bool) error + Viewer(clientId *uuid.UUID, c *fiber.Ctx) error + SummaryStats(clientId *uuid.UUID, authToken string) (summaryStats *response.ArticleSummaryStats, err error) + ArticlePerUserLevelStats(clientId *uuid.UUID, authToken string, startDate *string, endDate *string) (articlePerUserLevelStats []*response.ArticlePerUserLevelStats, err error) + ArticleMonthlyStats(clientId *uuid.UUID, authToken string, year *int) (articleMonthlyStats []*response.ArticleMonthlyStats, err error) + PublishScheduling(clientId *uuid.UUID, id uint, publishSchedule string) error ExecuteScheduling() error } @@ -92,7 +93,7 @@ func NewArticlesService( } // All implement interface of ArticlesService -func (_i *articlesService) All(req request.ArticlesQueryRequest) (articless []*response.ArticlesResponse, paging paginator.Pagination, err error) { +func (_i *articlesService) All(clientId *uuid.UUID, req request.ArticlesQueryRequest) (articless []*response.ArticlesResponse, paging paginator.Pagination, err error) { if req.Category != nil { findCategory, err := _i.ArticleCategoriesRepo.FindOneBySlug(*req.Category) if err != nil { @@ -101,7 +102,7 @@ func (_i *articlesService) All(req request.ArticlesQueryRequest) (articless []*r req.CategoryId = &findCategory.ID } - results, paging, err := _i.Repo.GetAll(req) + results, paging, err := _i.Repo.GetAll(clientId, req) if err != nil { return } @@ -113,36 +114,36 @@ func (_i *articlesService) All(req request.ArticlesQueryRequest) (articless []*r host := _i.Cfg.App.Domain for _, result := range results { - articleRes := mapper.ArticlesResponseMapper(_i.Log, host, result, _i.ArticleCategoriesRepo, _i.ArticleCategoryDetailsRepo, _i.ArticleFilesRepo, _i.UsersRepo) + articleRes := mapper.ArticlesResponseMapper(_i.Log, host, clientId, result, _i.ArticleCategoriesRepo, _i.ArticleCategoryDetailsRepo, _i.ArticleFilesRepo, _i.UsersRepo) articless = append(articless, articleRes) } return } -func (_i *articlesService) Show(id uint) (articles *response.ArticlesResponse, err error) { - result, err := _i.Repo.FindOne(id) +func (_i *articlesService) Show(clientId *uuid.UUID, id uint) (articles *response.ArticlesResponse, err error) { + result, err := _i.Repo.FindOne(clientId, id) if err != nil { return nil, err } host := _i.Cfg.App.Domain - return mapper.ArticlesResponseMapper(_i.Log, host, result, _i.ArticleCategoriesRepo, _i.ArticleCategoryDetailsRepo, _i.ArticleFilesRepo, _i.UsersRepo), nil + return mapper.ArticlesResponseMapper(_i.Log, host, clientId, result, _i.ArticleCategoriesRepo, _i.ArticleCategoryDetailsRepo, _i.ArticleFilesRepo, _i.UsersRepo), nil } -func (_i *articlesService) ShowByOldId(oldId uint) (articles *response.ArticlesResponse, err error) { - result, err := _i.Repo.FindByOldId(oldId) +func (_i *articlesService) ShowByOldId(clientId *uuid.UUID, oldId uint) (articles *response.ArticlesResponse, err error) { + result, err := _i.Repo.FindByOldId(clientId, oldId) if err != nil { return nil, err } host := _i.Cfg.App.Domain - return mapper.ArticlesResponseMapper(_i.Log, host, result, _i.ArticleCategoriesRepo, _i.ArticleCategoryDetailsRepo, _i.ArticleFilesRepo, _i.UsersRepo), nil + return mapper.ArticlesResponseMapper(_i.Log, host, clientId, result, _i.ArticleCategoriesRepo, _i.ArticleCategoryDetailsRepo, _i.ArticleFilesRepo, _i.UsersRepo), nil } -func (_i *articlesService) Save(req request.ArticlesCreateRequest, authToken string) (articles *entity.Articles, err error) { +func (_i *articlesService) Save(clientId *uuid.UUID, req request.ArticlesCreateRequest, authToken string) (articles *entity.Articles, err error) { _i.Log.Info().Interface("data", req).Msg("") newReq := req.ToEntity() @@ -207,7 +208,7 @@ func (_i *articlesService) Save(req request.ArticlesCreateRequest, authToken str newReq.PublishedAt = nil } - saveArticleRes, err := _i.Repo.Create(newReq) + saveArticleRes, err := _i.Repo.Create(clientId, newReq) if err != nil { return nil, err } @@ -278,7 +279,7 @@ func (_i *articlesService) Save(req request.ArticlesCreateRequest, authToken str return saveArticleRes, nil } -func (_i *articlesService) SaveThumbnail(c *fiber.Ctx) (err error) { +func (_i *articlesService) SaveThumbnail(clientId *uuid.UUID, c *fiber.Ctx) (err error) { id, err := strconv.ParseUint(c.Params("id"), 10, 0) if err != nil { @@ -333,10 +334,10 @@ func (_i *articlesService) SaveThumbnail(c *fiber.Ctx) (err error) { newFilename := newFilenameWithoutExt + "." + extension objectName := fmt.Sprintf("articles/thumbnail/%d/%d/%s", now.Year(), now.Month(), newFilename) - findCategory, err := _i.Repo.FindOne(uint(id)) + findCategory, err := _i.Repo.FindOne(clientId, uint(id)) findCategory.ThumbnailName = &newFilename findCategory.ThumbnailPath = &objectName - err = _i.Repo.Update(uint(id), findCategory) + err = _i.Repo.Update(clientId, uint(id), findCategory) if err != nil { return err } @@ -351,7 +352,7 @@ func (_i *articlesService) SaveThumbnail(c *fiber.Ctx) (err error) { return } -func (_i *articlesService) Update(id uint, req request.ArticlesUpdateRequest) (err error) { +func (_i *articlesService) Update(clientId *uuid.UUID, id uint, req request.ArticlesUpdateRequest) (err error) { _i.Log.Info().Interface("data", req).Msg("") newReq := req.ToEntity() @@ -364,27 +365,27 @@ func (_i *articlesService) Update(id uint, req request.ArticlesUpdateRequest) (e newReq.CreatedAt = parsedTime } - return _i.Repo.UpdateSkipNull(id, newReq) + return _i.Repo.UpdateSkipNull(clientId, id, newReq) } -func (_i *articlesService) Delete(id uint) error { - result, err := _i.Repo.FindOne(id) +func (_i *articlesService) Delete(clientId *uuid.UUID, id uint) error { + result, err := _i.Repo.FindOne(clientId, id) if err != nil { return err } isActive := false result.IsActive = &isActive - return _i.Repo.Update(id, result) + return _i.Repo.Update(clientId, id, result) } -func (_i *articlesService) Viewer(c *fiber.Ctx) (err error) { +func (_i *articlesService) Viewer(clientId *uuid.UUID, c *fiber.Ctx) (err error) { thumbnailName := c.Params("thumbnailName") emptyImage := "empty-image.jpg" searchThumbnail := emptyImage if thumbnailName != emptyImage { - result, err := _i.Repo.FindByFilename(thumbnailName) + result, err := _i.Repo.FindByFilename(clientId, thumbnailName) if err != nil { return err } @@ -439,8 +440,8 @@ func (_i *articlesService) Viewer(c *fiber.Ctx) (err error) { return } -func (_i *articlesService) UpdateActivityCount(id uint, activityTypeId int) error { - result, err := _i.Repo.FindOne(id) +func (_i *articlesService) UpdateActivityCount(clientId *uuid.UUID, id uint, activityTypeId int) error { + result, err := _i.Repo.FindOne(clientId, id) if err != nil { return err } @@ -468,20 +469,20 @@ func (_i *articlesService) UpdateActivityCount(id uint, activityTypeId int) erro result.ViewCount = &viewCount result.ShareCount = &shareCount result.CommentCount = &commentCount - return _i.Repo.Update(id, result) + return _i.Repo.Update(clientId, id, result) } -func (_i *articlesService) SummaryStats(authToken string) (summaryStats *response.ArticleSummaryStats, err error) { +func (_i *articlesService) SummaryStats(clientId *uuid.UUID, authToken string) (summaryStats *response.ArticleSummaryStats, err error) { user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken) - result, err := _i.Repo.SummaryStats(user.ID) + result, err := _i.Repo.SummaryStats(clientId, user.ID) if err != nil { return nil, err } return result, nil } -func (_i *articlesService) ArticlePerUserLevelStats(authToken string, startDate *string, endDate *string) (articlePerUserLevelStats []*response.ArticlePerUserLevelStats, err error) { +func (_i *articlesService) ArticlePerUserLevelStats(clientId *uuid.UUID, authToken string, startDate *string, endDate *string) (articlePerUserLevelStats []*response.ArticlePerUserLevelStats, err error) { user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken) _i.Log.Info().Str("timestamp", time.Now(). @@ -506,14 +507,14 @@ func (_i *articlesService) ArticlePerUserLevelStats(authToken string, startDate Format(time.RFC3339)).Str("Service:Resource", "articlesService:ArticlePerUserLevelStats"). Interface("userLevelNumber", userLevelNumber).Msg("") - result, err := _i.Repo.ArticlePerUserLevelStats(userLevelId, userLevelNumber, nil, nil) + result, err := _i.Repo.ArticlePerUserLevelStats(clientId, userLevelId, userLevelNumber, nil, nil) if err != nil { return nil, err } return result, nil } -func (_i *articlesService) ArticleMonthlyStats(authToken string, year *int) (articleMonthlyStats []*response.ArticleMonthlyStats, err error) { +func (_i *articlesService) ArticleMonthlyStats(clientId *uuid.UUID, authToken string, year *int) (articleMonthlyStats []*response.ArticleMonthlyStats, err error) { user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken) var userLevelId *uint @@ -524,15 +525,15 @@ func (_i *articlesService) ArticleMonthlyStats(authToken string, year *int) (art userLevelNumber = &user.UserLevel.LevelNumber } - result, err := _i.Repo.ArticleMonthlyStats(userLevelId, userLevelNumber, *year) + result, err := _i.Repo.ArticleMonthlyStats(clientId, userLevelId, userLevelNumber, *year) if err != nil { return nil, err } return result, nil } -func (_i *articlesService) UpdateApproval(id uint, statusId int, userLevelId int, userLevelNumber int, userParentLevelId int) (err error) { - result, err := _i.Repo.FindOne(id) +func (_i *articlesService) UpdateApproval(clientId *uuid.UUID, id uint, statusId int, userLevelId int, userLevelNumber int, userParentLevelId int) (err error) { + result, err := _i.Repo.FindOne(clientId, id) if err != nil { return err } @@ -576,7 +577,7 @@ func (_i *articlesService) UpdateApproval(id uint, statusId int, userLevelId int result.HasApprovedBy = nil } - err = _i.Repo.Update(id, result) + err = _i.Repo.Update(clientId, id, result) if err != nil { return err } @@ -584,26 +585,27 @@ func (_i *articlesService) UpdateApproval(id uint, statusId int, userLevelId int return } -func (_i *articlesService) PublishScheduling(id uint, publishSchedule string) error { - result, err := _i.Repo.FindOne(id) +func (_i *articlesService) PublishScheduling(clientId *uuid.UUID, id uint, publishSchedule string) error { + result, err := _i.Repo.FindOne(clientId, id) if err != nil { return err } result.PublishSchedule = &publishSchedule - return _i.Repo.Update(id, result) + return _i.Repo.Update(clientId, id, result) } -func (_i *articlesService) UpdateBanner(id uint, isBanner bool) error { - result, err := _i.Repo.FindOne(id) +func (_i *articlesService) UpdateBanner(clientId *uuid.UUID, id uint, isBanner bool) error { + result, err := _i.Repo.FindOne(clientId, id) if err != nil { return err } result.IsBanner = &isBanner - return _i.Repo.Update(id, result) + return _i.Repo.Update(clientId, id, result) } func (_i *articlesService) ExecuteScheduling() error { - articles, err := _i.Repo.GetAllPublishSchedule() + // For background jobs, we don't have context, so pass nil for clientId + articles, err := _i.Repo.GetAllPublishSchedule(nil) if err != nil { return err } @@ -631,7 +633,8 @@ func (_i *articlesService) ExecuteScheduling() error { article.PublishedAt = &now article.StatusId = &statusIdTwo - if err := _i.Repo.Update(article.ID, article); err != nil { + // For background jobs, we don't have context, so pass nil for clientId + if err := _i.Repo.UpdateSkipNull(nil, article.ID, article); err != nil { _i.Log.Info().Str("timestamp", time.Now(). Format(time.RFC3339)).Str("Service:articlesService", "Methods:ExecuteScheduling"). Interface("Failed to publish Article ID : ", article.ID).Msg("") diff --git a/app/module/cities/cities.module.go b/app/module/cities/cities.module.go index 08960e4..105c80d 100644 --- a/app/module/cities/cities.module.go +++ b/app/module/cities/cities.module.go @@ -2,10 +2,10 @@ package cities import ( "github.com/gofiber/fiber/v2" - "go-humas-be/app/module/cities/controller" - "go-humas-be/app/module/cities/repository" - "go-humas-be/app/module/cities/service" "go.uber.org/fx" + "web-medols-be/app/module/cities/controller" + "web-medols-be/app/module/cities/repository" + "web-medols-be/app/module/cities/service" ) // struct of CitiesRouter diff --git a/app/module/cities/controller/cities.controller.go b/app/module/cities/controller/cities.controller.go index 6ce531f..f8cf0fe 100644 --- a/app/module/cities/controller/cities.controller.go +++ b/app/module/cities/controller/cities.controller.go @@ -2,13 +2,13 @@ package controller import ( "github.com/gofiber/fiber/v2" - "go-humas-be/app/module/cities/request" - "go-humas-be/app/module/cities/service" - "go-humas-be/utils/paginator" "strconv" + "web-medols-be/app/module/cities/request" + "web-medols-be/app/module/cities/service" + "web-medols-be/utils/paginator" - utilRes "go-humas-be/utils/response" - utilVal "go-humas-be/utils/validator" + utilRes "web-medols-be/utils/response" + utilVal "web-medols-be/utils/validator" ) type citiesController struct { diff --git a/app/module/cities/controller/controller.go b/app/module/cities/controller/controller.go index 1ffd5a3..733acdf 100644 --- a/app/module/cities/controller/controller.go +++ b/app/module/cities/controller/controller.go @@ -1,6 +1,6 @@ package controller -import "go-humas-be/app/module/cities/service" +import "web-medols-be/app/module/cities/service" type Controller struct { Cities CitiesController @@ -10,4 +10,4 @@ func NewController(CitiesService service.CitiesService) *Controller { return &Controller{ Cities: NewCitiesController(CitiesService), } -} \ No newline at end of file +} diff --git a/app/module/cities/mapper/cities.mapper.go b/app/module/cities/mapper/cities.mapper.go index bccd3e4..405dafe 100644 --- a/app/module/cities/mapper/cities.mapper.go +++ b/app/module/cities/mapper/cities.mapper.go @@ -1,17 +1,17 @@ package mapper import ( - "go-humas-be/app/database/entity" - res "go-humas-be/app/module/cities/response" + "web-medols-be/app/database/entity" + res "web-medols-be/app/module/cities/response" ) func CitiesResponseMapper(citiesReq *entity.Cities) (citiesRes *res.CitiesResponse) { if citiesReq != nil { citiesRes = &res.CitiesResponse{ - ID: citiesReq.ID, - CityName: citiesReq.CityName, - ProvId: citiesReq.ProvId, + ID: citiesReq.ID, + CityName: citiesReq.CityName, + ProvId: citiesReq.ProvId, } } return citiesRes -} \ No newline at end of file +} diff --git a/app/module/cities/repository/cities.repository.go b/app/module/cities/repository/cities.repository.go index 529783d..21272c3 100644 --- a/app/module/cities/repository/cities.repository.go +++ b/app/module/cities/repository/cities.repository.go @@ -1,10 +1,10 @@ package repository import ( - "go-humas-be/app/database" - "go-humas-be/app/database/entity" - "go-humas-be/app/module/cities/request" - "go-humas-be/utils/paginator" + "web-medols-be/app/database" + "web-medols-be/app/database/entity" + "web-medols-be/app/module/cities/request" + "web-medols-be/utils/paginator" ) type citiesRepository struct { @@ -66,4 +66,4 @@ func (_i *citiesRepository) Update(id uint, cities *entity.Cities) (err error) { func (_i *citiesRepository) Delete(id uint) error { return _i.DB.DB.Delete(&entity.Cities{}, id).Error -} \ No newline at end of file +} diff --git a/app/module/cities/request/cities.request.go b/app/module/cities/request/cities.request.go index 48149ab..dcda863 100644 --- a/app/module/cities/request/cities.request.go +++ b/app/module/cities/request/cities.request.go @@ -1,8 +1,8 @@ package request import ( - "go-humas-be/app/database/entity" - "go-humas-be/utils/paginator" + "web-medols-be/app/database/entity" + "web-medols-be/utils/paginator" ) type CitiesGeneric interface { @@ -10,34 +10,33 @@ type CitiesGeneric interface { } type CitiesQueryRequest struct { - CityName string `json:"city_name" validate:"required"` - ProvId int `json:"prov_id" validate:"required"` - Pagination *paginator.Pagination `json:"pagination"` + CityName string `json:"city_name" validate:"required"` + ProvId int `json:"prov_id" validate:"required"` + Pagination *paginator.Pagination `json:"pagination"` } - type CitiesCreateRequest struct { - CityName string `json:"city_name" validate:"required"` - ProvId int `json:"prov_id" validate:"required"` + CityName string `json:"city_name" validate:"required"` + ProvId int `json:"prov_id" validate:"required"` } func (req CitiesCreateRequest) ToEntity() *entity.Cities { return &entity.Cities{ - CityName: req.CityName, - ProvId: req.ProvId, + CityName: req.CityName, + ProvId: req.ProvId, } } type CitiesUpdateRequest struct { - ID uint `json:"id" validate:"required"` - CityName string `json:"city_name" validate:"required"` - ProvId int `json:"prov_id" validate:"required"` + ID uint `json:"id" validate:"required"` + CityName string `json:"city_name" validate:"required"` + ProvId int `json:"prov_id" validate:"required"` } func (req CitiesUpdateRequest) ToEntity() *entity.Cities { return &entity.Cities{ - ID: req.ID, - CityName: req.CityName, - ProvId: req.ProvId, + ID: req.ID, + CityName: req.CityName, + ProvId: req.ProvId, } -} \ No newline at end of file +} diff --git a/app/module/cities/service/cities.service.go b/app/module/cities/service/cities.service.go index 46b363f..6ded9e4 100644 --- a/app/module/cities/service/cities.service.go +++ b/app/module/cities/service/cities.service.go @@ -2,11 +2,11 @@ package service import ( "github.com/rs/zerolog" - "go-humas-be/app/module/cities/mapper" - "go-humas-be/app/module/cities/repository" - "go-humas-be/app/module/cities/request" - "go-humas-be/app/module/cities/response" - "go-humas-be/utils/paginator" + "web-medols-be/app/module/cities/mapper" + "web-medols-be/app/module/cities/repository" + "web-medols-be/app/module/cities/request" + "web-medols-be/app/module/cities/response" + "web-medols-be/utils/paginator" ) // CitiesService diff --git a/app/module/clients/clients.module.go b/app/module/clients/clients.module.go new file mode 100644 index 0000000..1bf2889 --- /dev/null +++ b/app/module/clients/clients.module.go @@ -0,0 +1,54 @@ +package clients + +import ( + "github.com/gofiber/fiber/v2" + "go.uber.org/fx" + "web-medols-be/app/module/c + "web-medols-be/app/module/clients/controller" + "web-medols-be/app/module/clients/repository" + "go.uber.org/fx" +) + +// struct of ClientsRouter +type ClientsRouter struct { + App fiber.Router + Controller *controller.Controller +} + +// register bulky of Clients module +var NewClientsModule = fx.Options( + // register repository of Clients module + fx.Provide(repository.NewClientsRepository), + + // register service of Clients module + fx.Provide(service.NewClientsService), + + // register controller of Clients module + fx.Provide(controller.NewController), + + // register router of Clients module + fx.Provide(NewClientsRouter), +) + +// init ClientsRouter +func NewClientsRouter(fiber *fiber.App, controller *controller.Controller) *ClientsRouter { + return &ClientsRouter{ + App: fiber, + Controller: controller, + } +} + +// register routes of Clients module +func (_i *ClientsRouter) RegisterClientsRoutes() { + // define controllers + clientsController := _i.Controller.Clients + + // define routes + _i.App.Route("/clients", func(router fiber.Router) { + router.Get("/", clientsController.All) + router.Get("/:id", clientsController.Show) + router.Post("/", clientsController.Save) + router.Put("/:id", clientsController.Update) + router.Delete("/:id", clientsController.Delete) + }) +} diff --git a/app/module/clients/controller/clients.controller.go b/app/module/clients/controller/clients.controller.go new file mode 100644 index 0000000..f45e757 --- /dev/null +++ b/app/module/clients/controller/clients.controller.go @@ -0,0 +1,196 @@ +package controller + +import ( + "github.com/gofiber/fiber/v2" + "github.com/google/uuid" + "github.com/rs/zerolog" + "web-medols-be/app/module/clients/request" + "web-medols-be/app/module/clients/service" + "web-medols-be/utils/paginator" + + utilRes "web-medols-be/utils/response" + utilVal "web-medols-be/utils/validator" +) + +type clientsController struct { + clientsService service.ClientsService + Log zerolog.Logger +} + +type ClientsController interface { + All(c *fiber.Ctx) error + Show(c *fiber.Ctx) error + Save(c *fiber.Ctx) error + Update(c *fiber.Ctx) error + Delete(c *fiber.Ctx) error +} + +func NewClientsController(clientsService service.ClientsService, log zerolog.Logger) ClientsController { + return &clientsController{ + clientsService: clientsService, + Log: log, + } +} + +// All get all Clients +// @Summary Get all Clients +// @Description API for getting all Clients +// @Tags Clients +// @Security Bearer +// @Param req query request.ClientsQueryRequest false "query parameters" +// @Param req query paginator.Pagination false "pagination parameters" +// @Success 200 {object} response.Response +// @Failure 400 {object} response.BadRequestError +// @Failure 401 {object} response.UnauthorizedError +// @Failure 500 {object} response.InternalServerError +// @Router /clients [get] +func (_i *clientsController) All(c *fiber.Ctx) error { + paginate, err := paginator.Paginate(c) + if err != nil { + return err + } + + reqContext := request.ClientsQueryRequestContext{ + Name: c.Query("name"), + CreatedById: c.Query("createdById"), + } + req := reqContext.ToParamRequest() + req.Pagination = paginate + + clientsData, paging, err := _i.clientsService.All(req) + if err != nil { + return err + } + + return utilRes.Resp(c, utilRes.Response{ + Success: true, + Messages: utilRes.Messages{"Clients list successfully retrieved"}, + Data: clientsData, + Meta: paging, + }) +} + +// Show get one Clients +// @Summary Get one Clients +// @Description API for getting one Clients +// @Tags Clients +// @Security Bearer +// @Param id path int true "Clients ID" +// @Success 200 {object} response.Response +// @Failure 400 {object} response.BadRequestError +// @Failure 401 {object} response.UnauthorizedError +// @Failure 500 {object} response.InternalServerError +// @Router /clients/{id} [get] +func (_i *clientsController) Show(c *fiber.Ctx) error { + idStr := c.Params("id") + id, err := uuid.Parse(idStr) + if err != nil { + return err + } + + clientsData, err := _i.clientsService.Show(id) + if err != nil { + return err + } + + return utilRes.Resp(c, utilRes.Response{ + Success: true, + Messages: utilRes.Messages{"Clients successfully retrieved"}, + Data: clientsData, + }) +} + +// Save create Clients +// @Summary Create Clients +// @Description API for create Clients +// @Tags Clients +// @Security Bearer +// @Param Authorization header string true "Insert your access token" default(Bearer ) +// @Param payload body request.ClientsCreateRequest true "Required payload" +// @Success 200 {object} response.Response +// @Failure 400 {object} response.BadRequestError +// @Failure 401 {object} response.UnauthorizedError +// @Failure 500 {object} response.InternalServerError +// @Router /clients [post] +func (_i *clientsController) Save(c *fiber.Ctx) error { + req := new(request.ClientsCreateRequest) + if err := utilVal.ParseAndValidate(c, req); err != nil { + return err + } + + authToken := c.Get("Authorization") + dataResult, err := _i.clientsService.Save(*req, authToken) + if err != nil { + return err + } + + return utilRes.Resp(c, utilRes.Response{ + Success: true, + Messages: utilRes.Messages{"Clients successfully created"}, + Data: dataResult, + }) +} + +// Update update Clients +// @Summary update Clients +// @Description API for update Clients +// @Tags Clients +// @Security Bearer +// @Param payload body request.ClientsUpdateRequest true "Required payload" +// @Param id path string true "Clients ID" +// @Success 200 {object} response.Response +// @Failure 400 {object} response.BadRequestError +// @Failure 401 {object} response.UnauthorizedError +// @Failure 500 {object} response.InternalServerError +// @Router /clients/{id} [put] +func (_i *clientsController) Update(c *fiber.Ctx) error { + idStr := c.Params("id") + id, err := uuid.Parse(idStr) + if err != nil { + return err + } + + req := new(request.ClientsUpdateRequest) + if err := utilVal.ParseAndValidate(c, req); err != nil { + return err + } + + err = _i.clientsService.Update(id, *req) + if err != nil { + return err + } + + return utilRes.Resp(c, utilRes.Response{ + Success: true, + Messages: utilRes.Messages{"Clients successfully updated"}, + }) +} + +// Delete delete Clients +// @Summary delete Clients +// @Description API for delete Clients +// @Tags Clients +// @Security Bearer +// @Param id path string true "Clients ID" +// @Success 200 {object} response.Response +// @Failure 400 {object} response.BadRequestError +// @Failure 401 {object} response.UnauthorizedError +// @Failure 500 {object} response.InternalServerError +// @Router /clients/{id} [delete] +func (_i *clientsController) Delete(c *fiber.Ctx) error { + idStr := c.Params("id") + id, err := uuid.Parse(idStr) + if err != nil { + return err + } + + err = _i.clientsService.Delete(id) + if err != nil { + return err + } + + return utilRes.Resp(c, utilRes.Response{ + Success: true, + Messages: utilRes.Messages{"Clients successfully deleted"}, + }) +} diff --git a/app/module/clients/controller/controller.go b/app/module/clients/controller/controller.go new file mode 100644 index 0000000..05936e6 --- /dev/null +++ b/app/module/clients/controller/controller.go @@ -0,0 +1,16 @@ +package controller + +import ( + "github.com/rs/zerolog" + "web-medols-be/app/module/clients/service" +) + +type Controller struct { + Clients ClientsController +} + +func NewController(ClientsService service.ClientsService, log zerolog.Logger) *Controller { + return &Controller{ + Clients: NewClientsController(ClientsService, log), + } +} diff --git a/app/module/clients/mapper/clients.mapper.go b/app/module/clients/mapper/clients.mapper.go new file mode 100644 index 0000000..9f9e3d7 --- /dev/null +++ b/app/module/clients/mapper/clients.mapper.go @@ -0,0 +1,20 @@ +package mapper + +import ( + "web-medols-be/app/database/entity" + res "web-medols-be/app/module/clients/response" +) + +func ClientsResponseMapper(clientsReq *entity.Clients) (clientsRes *res.ClientsResponse) { + if clientsReq != nil { + clientsRes = &res.ClientsResponse{ + ClientID: clientsReq.ID, + Name: clientsReq.Name, + CreatedById: *clientsReq.CreatedById, + IsActive: *clientsReq.IsActive, + CreatedAt: clientsReq.CreatedAt, + UpdatedAt: clientsReq.UpdatedAt, + } + } + return clientsRes +} diff --git a/app/module/clients/repository/clients.repository.go b/app/module/clients/repository/clients.repository.go new file mode 100644 index 0000000..8388f76 --- /dev/null +++ b/app/module/clients/repository/clients.repository.go @@ -0,0 +1,93 @@ +package repository + +import ( + "fmt" + "github.com/google/uuid" + "github.com/rs/zerolog" + "strings" + "web-medols-be/app/database" + "web-medols-be/app/database/entity" + "web-medols-be/app/module/clients/request" + "web-medols-be/utils/paginator" +) + +type clientsRepository struct { + DB *database.Database + Log zerolog.Logger +} + +// ClientsRepository define interface of IClientsRepository +type ClientsRepository interface { + GetAll(req request.ClientsQueryRequest) (clientss []*entity.Clients, paging paginator.Pagination, err error) + FindOne(id uuid.UUID) (clients *entity.Clients, err error) + Create(clients *entity.Clients) (clientsReturn *entity.Clients, err error) + Update(id uuid.UUID, clients *entity.Clients) (err error) + Delete(id uuid.UUID) (err error) +} + +func NewClientsRepository(db *database.Database, logger zerolog.Logger) ClientsRepository { + return &clientsRepository{ + DB: db, + Log: logger, + } +} + +// implement interface of IClientsRepository +func (_i *clientsRepository) GetAll(req request.ClientsQueryRequest) (clientss []*entity.Clients, paging paginator.Pagination, err error) { + var count int64 + + query := _i.DB.DB.Model(&entity.Clients{}) + query = query.Where("is_active = ?", true) + + if req.Name != nil && *req.Name != "" { + name := strings.ToLower(*req.Name) + query = query.Where("LOWER(name) LIKE ?", "%"+strings.ToLower(name)+"%") + } + if req.CreatedById != nil { + query = query.Where("created_by_id = ?", req.CreatedById) + } + query.Count(&count) + + if req.Pagination.SortBy != "" { + direction := "ASC" + if req.Pagination.Sort == "desc" { + direction = "DESC" + } + query.Order(fmt.Sprintf("%s %s", req.Pagination.SortBy, direction)) + } + + req.Pagination.Count = count + req.Pagination = paginator.Paging(req.Pagination) + + err = query.Offset(req.Pagination.Offset).Limit(req.Pagination.Limit).Find(&clientss).Error + if err != nil { + return + } + + paging = *req.Pagination + + return +} + +func (_i *clientsRepository) FindOne(id uuid.UUID) (clients *entity.Clients, err error) { + if err := _i.DB.DB.First(&clients, id).Error; err != nil { + return nil, err + } + + return clients, nil +} + +func (_i *clientsRepository) Create(clients *entity.Clients) (clientsReturn *entity.Clients, err error) { + result := _i.DB.DB.Create(clients) + return clients, result.Error +} + +func (_i *clientsRepository) Update(id uuid.UUID, clients *entity.Clients) (err error) { + return _i.DB.DB.Model(&entity.Clients{}). + Where(&entity.Clients{ID: id}). + Updates(clients).Error +} + +func (_i *clientsRepository) Delete(id uuid.UUID) error { + return _i.DB.DB.Delete(&entity.Clients{}, id).Error +} diff --git a/app/module/clients/request/clients.request.go b/app/module/clients/request/clients.request.go new file mode 100644 index 0000000..0e8167c --- /dev/null +++ b/app/module/clients/request/clients.request.go @@ -0,0 +1,66 @@ +package request + +import ( + "strconv" + "time" + "web-medols-be/app/database/entity" + "web-medols-be/utils/paginator" +) + +type ClientsGeneric interface { + ToEntity() +} + +type ClientsQueryRequest struct { + Name *string `json:"name"` + CreatedById *uint `json:"createdBy"` + Pagination *paginator.Pagination `json:"pagination"` +} + +type ClientsCreateRequest struct { + Name string `json:"name" validate:"required"` + CreatedById *uint `json:"createdById"` +} + +func (req ClientsCreateRequest) ToEntity() *entity.Clients { + return &entity.Clients{ + Name: req.Name, + CreatedById: req.CreatedById, + CreatedAt: time.Now(), + } +} + +type ClientsUpdateRequest struct { + Name string `json:"name" validate:"required"` + CreatedById *uint `json:"createdById"` +} + +func (req ClientsUpdateRequest) ToEntity() *entity.Clients { + return &entity.Clients{ + Name: req.Name, + CreatedById: req.CreatedById, + UpdatedAt: time.Now(), + } +} + +type ClientsQueryRequestContext struct { + Name string `json:"name"` + CreatedById string `json:"createdById"` +} + +func (req ClientsQueryRequestContext) ToParamRequest() ClientsQueryRequest { + var request ClientsQueryRequest + + if name := req.Name; name != "" { + request.Name = &name + } + if createdByStr := req.CreatedById; createdByStr != "" { + createdBy, err := strconv.Atoi(createdByStr) + if err == nil { + createdByIdUint := uint(createdBy) + request.CreatedById = &createdByIdUint + } + } + + return request +} diff --git a/app/module/clients/response/clients.response.go b/app/module/clients/response/clients.response.go new file mode 100644 index 0000000..e832b38 --- /dev/null +++ b/app/module/clients/response/clients.response.go @@ -0,0 +1,15 @@ +package response + +import ( + "github.com/google/uuid" + "time" +) + +type ClientsResponse struct { + ClientID uuid.UUID `json:"clientId"` + Name string `json:"name"` + CreatedById uint `json:"createdById"` + IsActive bool `json:"isActive"` + CreatedAt time.Time `json:"createdAt"` + UpdatedAt time.Time `json:"updatedAt"` +} diff --git a/app/module/clients/service/clients.service.go b/app/module/clients/service/clients.service.go new file mode 100644 index 0000000..8304840 --- /dev/null +++ b/app/module/clients/service/clients.service.go @@ -0,0 +1,95 @@ +package service + +import ( + "github.com/google/uuid" + "github.com/rs/zerolog" + "web-medols-be/app/database/entity" + "web-medols-be/app/module/clients/mapper" + "web-medols-be/app/module/clients/repository" + "web-medols-be/app/module/clients/request" + "web-medols-be/app/module/clients/response" + usersRepository "web-medols-be/app/module/users/repository" + "web-medols-be/utils/paginator" + + utilSvc "web-medols-be/utils/service" +) + +// ClientsService +type clientsService struct { + Repo repository.ClientsRepository + UsersRepo usersRepository.UsersRepository + Log zerolog.Logger +} + +// ClientsService define interface of IClientsService +type ClientsService interface { + All(req request.ClientsQueryRequest) (clients []*response.ClientsResponse, paging paginator.Pagination, err error) + Show(id uuid.UUID) (clients *response.ClientsResponse, err error) + Save(req request.ClientsCreateRequest, authToken string) (clients *entity.Clients, err error) + Update(id uuid.UUID, req request.ClientsUpdateRequest) (err error) + Delete(id uuid.UUID) error +} + +// NewClientsService init ClientsService +func NewClientsService(repo repository.ClientsRepository, log zerolog.Logger, usersRepo usersRepository.UsersRepository) ClientsService { + + return &clientsService{ + Repo: repo, + Log: log, + UsersRepo: usersRepo, + } +} + +// All implement interface of ClientsService +func (_i *clientsService) All(req request.ClientsQueryRequest) (clientss []*response.ClientsResponse, paging paginator.Pagination, err error) { + results, paging, err := _i.Repo.GetAll(req) + if err != nil { + return + } + + for _, result := range results { + clientss = append(clientss, mapper.ClientsResponseMapper(result)) + } + + return +} + +func (_i *clientsService) Show(id uuid.UUID) (clients *response.ClientsResponse, err error) { + result, err := _i.Repo.FindOne(id) + if err != nil { + return nil, err + } + + return mapper.ClientsResponseMapper(result), nil +} + +func (_i *clientsService) Save(req request.ClientsCreateRequest, authToken string) (clients *entity.Clients, err error) { + _i.Log.Info().Interface("data", req).Msg("") + newReq := req.ToEntity() + _i.Log.Info().Interface("token", authToken).Msg("") + createdBy := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken) + _i.Log.Info().Interface("token", authToken).Msg("") + newReq.CreatedById = &createdBy.ID + + newReq.ID = uuid.New() + + _i.Log.Info().Interface("new data", newReq).Msg("") + + return _i.Repo.Create(newReq) +} + +func (_i *clientsService) Update(id uuid.UUID, req request.ClientsUpdateRequest) (err error) { + _i.Log.Info().Interface("data", req).Msg("") + return _i.Repo.Update(id, req.ToEntity()) +} + +func (_i *clientsService) Delete(id uuid.UUID) error { + result, err := _i.Repo.FindOne(id) + if err != nil { + return err + } + + isActive := false + result.IsActive = &isActive + return _i.Repo.Update(id, result) +} diff --git a/app/module/custom_static_pages/controller/controller.go b/app/module/custom_static_pages/controller/controller.go index af74453..549337d 100644 --- a/app/module/custom_static_pages/controller/controller.go +++ b/app/module/custom_static_pages/controller/controller.go @@ -2,7 +2,7 @@ package controller import ( "github.com/rs/zerolog" - "go-humas-be/app/module/custom_static_pages/service" + "web-medols-be/app/module/custom_static_pages/service" ) type Controller struct { diff --git a/app/module/custom_static_pages/controller/custom_static_pages.controller.go b/app/module/custom_static_pages/controller/custom_static_pages.controller.go index 872e928..b2633c3 100644 --- a/app/module/custom_static_pages/controller/custom_static_pages.controller.go +++ b/app/module/custom_static_pages/controller/custom_static_pages.controller.go @@ -3,13 +3,13 @@ package controller import ( "github.com/gofiber/fiber/v2" "github.com/rs/zerolog" - "go-humas-be/app/module/custom_static_pages/request" - "go-humas-be/app/module/custom_static_pages/service" - "go-humas-be/utils/paginator" "strconv" + "web-medols-be/app/module/custom_static_pages/request" + "web-medols-be/app/module/custom_static_pages/service" + "web-medols-be/utils/paginator" - utilRes "go-humas-be/utils/response" - utilVal "go-humas-be/utils/validator" + utilRes "web-medols-be/utils/response" + utilVal "web-medols-be/utils/validator" ) type customStaticPagesController struct { diff --git a/app/module/custom_static_pages/custom_static_pages.module.go b/app/module/custom_static_pages/custom_static_pages.module.go index 06f499b..f08e351 100644 --- a/app/module/custom_static_pages/custom_static_pages.module.go +++ b/app/module/custom_static_pages/custom_static_pages.module.go @@ -2,10 +2,10 @@ package custom_static_pages import ( "github.com/gofiber/fiber/v2" - "go-humas-be/app/module/custom_static_pages/controller" - "go-humas-be/app/module/custom_static_pages/repository" - "go-humas-be/app/module/custom_static_pages/service" "go.uber.org/fx" + "web-medols-be/app/module/custom_static_pages/controller" + "web-medols-be/app/module/custom_static_pages/repository" + "web-medols-be/app/module/custom_static_pages/service" ) // struct of CustomStaticPagesRouter diff --git a/app/module/custom_static_pages/mapper/custom_static_pages.mapper.go b/app/module/custom_static_pages/mapper/custom_static_pages.mapper.go index fa20af1..609d255 100644 --- a/app/module/custom_static_pages/mapper/custom_static_pages.mapper.go +++ b/app/module/custom_static_pages/mapper/custom_static_pages.mapper.go @@ -1,8 +1,8 @@ package mapper import ( - "go-humas-be/app/database/entity" - res "go-humas-be/app/module/custom_static_pages/response" + "web-medols-be/app/database/entity" + res "web-medols-be/app/module/custom_static_pages/response" ) func CustomStaticPagesResponseMapper(customStaticPagesReq *entity.CustomStaticPages) (customStaticPagesRes *res.CustomStaticPagesResponse) { diff --git a/app/module/custom_static_pages/repository/custom_static_pages.repository.go b/app/module/custom_static_pages/repository/custom_static_pages.repository.go index 494f3a3..8b28742 100644 --- a/app/module/custom_static_pages/repository/custom_static_pages.repository.go +++ b/app/module/custom_static_pages/repository/custom_static_pages.repository.go @@ -3,12 +3,12 @@ package repository import ( "fmt" "github.com/rs/zerolog" - "go-humas-be/app/database" - "go-humas-be/app/database/entity" - "go-humas-be/app/module/custom_static_pages/request" - "go-humas-be/utils/paginator" - utilSvc "go-humas-be/utils/service" "strings" + "web-medols-be/app/database" + "web-medols-be/app/database/entity" + "web-medols-be/app/module/custom_static_pages/request" + "web-medols-be/utils/paginator" + utilSvc "web-medols-be/utils/service" ) type customStaticPagesRepository struct { diff --git a/app/module/custom_static_pages/request/custom_static_pages.request.go b/app/module/custom_static_pages/request/custom_static_pages.request.go index e41d41f..600768d 100644 --- a/app/module/custom_static_pages/request/custom_static_pages.request.go +++ b/app/module/custom_static_pages/request/custom_static_pages.request.go @@ -1,9 +1,9 @@ package request import ( - "go-humas-be/app/database/entity" - "go-humas-be/utils/paginator" "time" + "web-medols-be/app/database/entity" + "web-medols-be/utils/paginator" ) type CustomStaticPagesGeneric interface { diff --git a/app/module/custom_static_pages/service/custom_static_pages.service.go b/app/module/custom_static_pages/service/custom_static_pages.service.go index a2d628b..bdf9446 100644 --- a/app/module/custom_static_pages/service/custom_static_pages.service.go +++ b/app/module/custom_static_pages/service/custom_static_pages.service.go @@ -2,13 +2,13 @@ package service import ( "github.com/rs/zerolog" - "go-humas-be/app/database/entity" - "go-humas-be/app/module/custom_static_pages/mapper" - "go-humas-be/app/module/custom_static_pages/repository" - "go-humas-be/app/module/custom_static_pages/request" - "go-humas-be/app/module/custom_static_pages/response" - usersRepository "go-humas-be/app/module/users/repository" - "go-humas-be/utils/paginator" + "web-medols-be/app/database/entity" + "web-medols-be/app/module/custom_static_pages/mapper" + "web-medols-be/app/module/custom_static_pages/repository" + "web-medols-be/app/module/custom_static_pages/request" + "web-medols-be/app/module/custom_static_pages/response" + usersRepository "web-medols-be/app/module/users/repository" + "web-medols-be/utils/paginator" ) // CustomStaticPagesService diff --git a/app/module/districts/controller/controller.go b/app/module/districts/controller/controller.go index 96be5df..7544c1e 100644 --- a/app/module/districts/controller/controller.go +++ b/app/module/districts/controller/controller.go @@ -1,6 +1,6 @@ package controller -import "go-humas-be/app/module/districts/service" +import "web-medols-be/app/module/districts/service" type Controller struct { Districts DistrictsController @@ -10,4 +10,4 @@ func NewController(DistrictsService service.DistrictsService) *Controller { return &Controller{ Districts: NewDistrictsController(DistrictsService), } -} \ No newline at end of file +} diff --git a/app/module/districts/controller/districts.controller.go b/app/module/districts/controller/districts.controller.go index 6cbfde7..ff6d84b 100644 --- a/app/module/districts/controller/districts.controller.go +++ b/app/module/districts/controller/districts.controller.go @@ -2,13 +2,13 @@ package controller import ( "github.com/gofiber/fiber/v2" - "go-humas-be/app/module/districts/request" - "go-humas-be/app/module/districts/service" - "go-humas-be/utils/paginator" "strconv" + "web-medols-be/app/module/districts/request" + "web-medols-be/app/module/districts/service" + "web-medols-be/utils/paginator" - utilRes "go-humas-be/utils/response" - utilVal "go-humas-be/utils/validator" + utilRes "web-medols-be/utils/response" + utilVal "web-medols-be/utils/validator" ) type districtsController struct { diff --git a/app/module/districts/districts.module.go b/app/module/districts/districts.module.go index 775162e..2b50122 100644 --- a/app/module/districts/districts.module.go +++ b/app/module/districts/districts.module.go @@ -2,10 +2,10 @@ package districts import ( "github.com/gofiber/fiber/v2" - "go-humas-be/app/module/districts/controller" - "go-humas-be/app/module/districts/repository" - "go-humas-be/app/module/districts/service" "go.uber.org/fx" + "web-medols-be/app/module/districts/controller" + "web-medols-be/app/module/districts/repository" + "web-medols-be/app/module/districts/service" ) // DistrictsRouter struct of DistrictsRouter diff --git a/app/module/districts/mapper/districts.mapper.go b/app/module/districts/mapper/districts.mapper.go index 7a86e08..5e45c29 100644 --- a/app/module/districts/mapper/districts.mapper.go +++ b/app/module/districts/mapper/districts.mapper.go @@ -1,8 +1,8 @@ package mapper import ( - "go-humas-be/app/database/entity" - res "go-humas-be/app/module/districts/response" + "web-medols-be/app/database/entity" + res "web-medols-be/app/module/districts/response" ) func DistrictsResponseMapper(districtsReq *entity.Districts) (districtsRes *res.DistrictsResponse) { diff --git a/app/module/districts/repository/districts.repository.go b/app/module/districts/repository/districts.repository.go index 259eff7..50a566f 100644 --- a/app/module/districts/repository/districts.repository.go +++ b/app/module/districts/repository/districts.repository.go @@ -1,10 +1,10 @@ package repository import ( - "go-humas-be/app/database" - "go-humas-be/app/database/entity" - "go-humas-be/app/module/districts/request" - "go-humas-be/utils/paginator" + "web-medols-be/app/database" + "web-medols-be/app/database/entity" + "web-medols-be/app/module/districts/request" + "web-medols-be/utils/paginator" ) type districtsRepository struct { @@ -66,4 +66,4 @@ func (_i *districtsRepository) Update(id uint, districts *entity.Districts) (err func (_i *districtsRepository) Delete(id uint) error { return _i.DB.DB.Delete(&entity.Districts{}, id).Error -} \ No newline at end of file +} diff --git a/app/module/districts/request/districts.request.go b/app/module/districts/request/districts.request.go index 4c1f8c8..5ee79fe 100644 --- a/app/module/districts/request/districts.request.go +++ b/app/module/districts/request/districts.request.go @@ -1,8 +1,8 @@ package request import ( - "go-humas-be/app/database/entity" - "go-humas-be/utils/paginator" + "web-medols-be/app/database/entity" + "web-medols-be/utils/paginator" ) type DistrictsGeneric interface { diff --git a/app/module/districts/service/districts.service.go b/app/module/districts/service/districts.service.go index 7c50ab3..0963d08 100644 --- a/app/module/districts/service/districts.service.go +++ b/app/module/districts/service/districts.service.go @@ -2,11 +2,11 @@ package service import ( "github.com/rs/zerolog" - "go-humas-be/app/module/districts/mapper" - "go-humas-be/app/module/districts/repository" - "go-humas-be/app/module/districts/request" - "go-humas-be/app/module/districts/response" - "go-humas-be/utils/paginator" + "web-medols-be/app/module/districts/mapper" + "web-medols-be/app/module/districts/repository" + "web-medols-be/app/module/districts/request" + "web-medols-be/app/module/districts/response" + "web-medols-be/utils/paginator" ) // DistrictsService diff --git a/app/module/feedbacks/controller/controller.go b/app/module/feedbacks/controller/controller.go index 871d0d1..ddead37 100644 --- a/app/module/feedbacks/controller/controller.go +++ b/app/module/feedbacks/controller/controller.go @@ -2,7 +2,7 @@ package controller import ( "github.com/rs/zerolog" - "go-humas-be/app/module/feedbacks/service" + "web-medols-be/app/module/feedbacks/service" ) type Controller struct { diff --git a/app/module/feedbacks/controller/feedbacks.controller.go b/app/module/feedbacks/controller/feedbacks.controller.go index 12df4d0..b22e725 100644 --- a/app/module/feedbacks/controller/feedbacks.controller.go +++ b/app/module/feedbacks/controller/feedbacks.controller.go @@ -3,12 +3,12 @@ package controller import ( "github.com/gofiber/fiber/v2" "github.com/rs/zerolog" - "go-humas-be/app/module/feedbacks/request" - "go-humas-be/app/module/feedbacks/service" - "go-humas-be/utils/paginator" - utilRes "go-humas-be/utils/response" - utilVal "go-humas-be/utils/validator" "strconv" + "web-medols-be/app/module/feedbacks/request" + "web-medols-be/app/module/feedbacks/service" + "web-medols-be/utils/paginator" + utilRes "web-medols-be/utils/response" + utilVal "web-medols-be/utils/validator" ) type feedbacksController struct { @@ -59,7 +59,10 @@ func (_i *feedbacksController) All(c *fiber.Ctx) error { req := reqContext.ToParamRequest() req.Pagination = paginate - feedbacksData, paging, err := _i.feedbacksService.All(req) + // Extract ClientId from context + clientId := c.Locals("clientId") + + feedbacksData, paging, err := _i.feedbacksService.All(clientId, req) if err != nil { return err } @@ -89,7 +92,10 @@ func (_i *feedbacksController) Show(c *fiber.Ctx) error { return err } - feedbacksData, err := _i.feedbacksService.Show(uint(id)) + // Extract ClientId from context + clientId := c.Locals("clientId") + + feedbacksData, err := _i.feedbacksService.Show(clientId, uint(id)) if err != nil { return err } @@ -121,7 +127,11 @@ func (_i *feedbacksController) Save(c *fiber.Ctx) error { } authToken := c.Get("Authorization") - dataResult, err := _i.feedbacksService.Save(*req, authToken) + + // Extract ClientId from context + clientId := c.Locals("clientId") + + dataResult, err := _i.feedbacksService.Save(clientId, *req, authToken) if err != nil { return err } @@ -157,7 +167,10 @@ func (_i *feedbacksController) Update(c *fiber.Ctx) error { return err } - err = _i.feedbacksService.Update(uint(id), *req) + // Extract ClientId from context + clientId := c.Locals("clientId") + + err = _i.feedbacksService.Update(clientId, uint(id), *req) if err != nil { return err } @@ -186,7 +199,10 @@ func (_i *feedbacksController) Delete(c *fiber.Ctx) error { return err } - err = _i.feedbacksService.Delete(uint(id)) + // Extract ClientId from context + clientId := c.Locals("clientId") + + err = _i.feedbacksService.Delete(clientId, uint(id)) if err != nil { return err } @@ -217,7 +233,10 @@ func (_i *feedbacksController) FeedbackMonthlyStats(c *fiber.Ctx) error { return err } - response, err := _i.feedbacksService.FeedbackMonthlyStats(authToken, &yearInt) + // Extract ClientId from context + clientId := c.Locals("clientId") + + response, err := _i.feedbacksService.FeedbackMonthlyStats(clientId, authToken, &yearInt) if err != nil { return err } diff --git a/app/module/feedbacks/feedbacks.module.go b/app/module/feedbacks/feedbacks.module.go index 39f6858..d33ac91 100644 --- a/app/module/feedbacks/feedbacks.module.go +++ b/app/module/feedbacks/feedbacks.module.go @@ -2,10 +2,10 @@ package feedbacks import ( "github.com/gofiber/fiber/v2" - "go-humas-be/app/module/feedbacks/controller" - "go-humas-be/app/module/feedbacks/repository" - "go-humas-be/app/module/feedbacks/service" "go.uber.org/fx" + "web-medols-be/app/module/feedbacks/controller" + "web-medols-be/app/module/feedbacks/repository" + "web-medols-be/app/module/feedbacks/service" ) // struct of FeedbacksRouter diff --git a/app/module/feedbacks/mapper/feedbacks.mapper.go b/app/module/feedbacks/mapper/feedbacks.mapper.go index 63982a1..9895057 100644 --- a/app/module/feedbacks/mapper/feedbacks.mapper.go +++ b/app/module/feedbacks/mapper/feedbacks.mapper.go @@ -1,8 +1,8 @@ package mapper import ( - "go-humas-be/app/database/entity" - res "go-humas-be/app/module/feedbacks/response" + "web-medols-be/app/database/entity" + res "web-medols-be/app/module/feedbacks/response" ) func FeedbacksResponseMapper(feedbacksReq *entity.Feedbacks) (feedbacksRes *res.FeedbacksResponse) { diff --git a/app/module/feedbacks/repository/feedbacks.repository.go b/app/module/feedbacks/repository/feedbacks.repository.go index cb3a09e..a505f79 100644 --- a/app/module/feedbacks/repository/feedbacks.repository.go +++ b/app/module/feedbacks/repository/feedbacks.repository.go @@ -2,15 +2,16 @@ package repository import ( "fmt" + "github.com/google/uuid" "github.com/rs/zerolog" - "go-humas-be/app/database" - "go-humas-be/app/database/entity" - "go-humas-be/app/module/feedbacks/request" - "go-humas-be/app/module/feedbacks/response" - "go-humas-be/utils/paginator" - utilSvc "go-humas-be/utils/service" "strings" "time" + "web-medols-be/app/database" + "web-medols-be/app/database/entity" + "web-medols-be/app/module/feedbacks/request" + "web-medols-be/app/module/feedbacks/response" + "web-medols-be/utils/paginator" + utilSvc "web-medols-be/utils/service" ) type feedbacksRepository struct { @@ -20,12 +21,12 @@ type feedbacksRepository struct { // FeedbacksRepository define interface of IFeedbacksRepository type FeedbacksRepository interface { - GetAll(req request.FeedbacksQueryRequest) (feedbackss []*entity.Feedbacks, paging paginator.Pagination, err error) - FindOne(id uint) (feedbacks *entity.Feedbacks, err error) + GetAll(clientId *uuid.UUID, req request.FeedbacksQueryRequest) (feedbackss []*entity.Feedbacks, paging paginator.Pagination, err error) + FindOne(clientId *uuid.UUID, id uint) (feedbacks *entity.Feedbacks, err error) Create(feedbacks *entity.Feedbacks) (feedbacksReturn *entity.Feedbacks, err error) - Update(id uint, feedbacks *entity.Feedbacks) (err error) - Delete(id uint) (err error) - FeedbacksMonthlyStats(year int) (feedbacksMonthlyStats []*response.FeedbacksMonthlyStats, err error) + Update(clientId *uuid.UUID, id uint, feedbacks *entity.Feedbacks) (err error) + Delete(clientId *uuid.UUID, id uint) (err error) + FeedbacksMonthlyStats(clientId *uuid.UUID, year int) (feedbacksMonthlyStats []*response.FeedbacksMonthlyStats, err error) } func NewFeedbacksRepository(db *database.Database, logger zerolog.Logger) FeedbacksRepository { @@ -36,10 +37,16 @@ func NewFeedbacksRepository(db *database.Database, logger zerolog.Logger) Feedba } // implement interface of IFeedbacksRepository -func (_i *feedbacksRepository) GetAll(req request.FeedbacksQueryRequest) (feedbackss []*entity.Feedbacks, paging paginator.Pagination, err error) { +func (_i *feedbacksRepository) GetAll(clientId *uuid.UUID, req request.FeedbacksQueryRequest) (feedbackss []*entity.Feedbacks, paging paginator.Pagination, err error) { var count int64 query := _i.DB.DB.Model(&entity.Feedbacks{}) + + // Add ClientId filter + if clientId != nil { + query = query.Where("client_id = ?", clientId) + } + query = query.Where("is_active = ?", true) if req.Message != nil && *req.Message != "" { @@ -81,8 +88,15 @@ func (_i *feedbacksRepository) GetAll(req request.FeedbacksQueryRequest) (feedba return } -func (_i *feedbacksRepository) FindOne(id uint) (feedbacks *entity.Feedbacks, err error) { - if err := _i.DB.DB.First(&feedbacks, id).Error; err != nil { +func (_i *feedbacksRepository) FindOne(clientId *uuid.UUID, id uint) (feedbacks *entity.Feedbacks, err error) { + query := _i.DB.DB.Where("id = ?", id) + + // Add ClientId filter + if clientId != nil { + query = query.Where("client_id = ?", clientId) + } + + if err := query.First(&feedbacks).Error; err != nil { return nil, err } @@ -94,21 +108,27 @@ func (_i *feedbacksRepository) Create(feedbacks *entity.Feedbacks) (feedbacksRet return feedbacks, result.Error } -func (_i *feedbacksRepository) Update(id uint, feedbacks *entity.Feedbacks) (err error) { +func (_i *feedbacksRepository) Update(clientId *uuid.UUID, id uint, feedbacks *entity.Feedbacks) (err error) { feedbacksMap, err := utilSvc.StructToMap(feedbacks) if err != nil { return err } - return _i.DB.DB.Model(&entity.Feedbacks{}). - Where(&entity.Feedbacks{ID: id}). - Updates(feedbacksMap).Error + query := _i.DB.DB.Model(&entity.Feedbacks{}).Where(&entity.Feedbacks{ID: id}) + if clientId != nil { + query = query.Where("client_id = ?", clientId) + } + return query.Updates(feedbacksMap).Error } -func (_i *feedbacksRepository) Delete(id uint) error { - return _i.DB.DB.Delete(&entity.Feedbacks{}, id).Error +func (_i *feedbacksRepository) Delete(clientId *uuid.UUID, id uint) error { + query := _i.DB.DB.Model(&entity.Feedbacks{}).Where("id = ?", id) + if clientId != nil { + query = query.Where("client_id = ?", clientId) + } + return query.Delete(&entity.Feedbacks{}).Error } -func (_i *feedbacksRepository) FeedbacksMonthlyStats(year int) (feedbacksMonthlyStats []*response.FeedbacksMonthlyStats, err error) { +func (_i *feedbacksRepository) FeedbacksMonthlyStats(clientId *uuid.UUID, year int) (feedbacksMonthlyStats []*response.FeedbacksMonthlyStats, err error) { if year < 1900 || year > 2100 { return nil, fmt.Errorf("invalid year") @@ -125,6 +145,10 @@ func (_i *feedbacksRepository) FeedbacksMonthlyStats(year int) (feedbacksMonthly "count(id) as total_feedbacks"). Where("EXTRACT(YEAR FROM created_at) = ?", year) + if clientId != nil { + query = query.Where("client_id = ?", clientId) + } + err = query.Group("month, day").Scan(&results).Error if err != nil { return nil, err diff --git a/app/module/feedbacks/request/feedbacks.request.go b/app/module/feedbacks/request/feedbacks.request.go index 653d43c..31e03ad 100644 --- a/app/module/feedbacks/request/feedbacks.request.go +++ b/app/module/feedbacks/request/feedbacks.request.go @@ -1,10 +1,10 @@ package request import ( - "go-humas-be/app/database/entity" - "go-humas-be/utils/paginator" "strconv" "time" + "web-medols-be/app/database/entity" + "web-medols-be/utils/paginator" ) type FeedbacksGeneric interface { diff --git a/app/module/feedbacks/service/feedbacks.service.go b/app/module/feedbacks/service/feedbacks.service.go index ffa0557..33f26b8 100644 --- a/app/module/feedbacks/service/feedbacks.service.go +++ b/app/module/feedbacks/service/feedbacks.service.go @@ -1,14 +1,15 @@ package service import ( + "github.com/google/uuid" "github.com/rs/zerolog" - "go-humas-be/app/database/entity" - "go-humas-be/app/module/feedbacks/mapper" - "go-humas-be/app/module/feedbacks/repository" - "go-humas-be/app/module/feedbacks/request" - "go-humas-be/app/module/feedbacks/response" - usersRepository "go-humas-be/app/module/users/repository" - "go-humas-be/utils/paginator" + "web-medols-be/app/database/entity" + "web-medols-be/app/module/feedbacks/mapper" + "web-medols-be/app/module/feedbacks/repository" + "web-medols-be/app/module/feedbacks/request" + "web-medols-be/app/module/feedbacks/response" + usersRepository "web-medols-be/app/module/users/repository" + "web-medols-be/utils/paginator" ) // FeedbacksService @@ -20,12 +21,12 @@ type feedbacksService struct { // FeedbacksService define interface of IFeedbacksService type FeedbacksService interface { - All(req request.FeedbacksQueryRequest) (feedbacks []*response.FeedbacksResponse, paging paginator.Pagination, err error) - Show(id uint) (feedbacks *response.FeedbacksResponse, err error) - Save(req request.FeedbacksCreateRequest, authToken string) (feedbacks *entity.Feedbacks, err error) - Update(id uint, req request.FeedbacksUpdateRequest) (err error) - Delete(id uint) error - FeedbackMonthlyStats(authToken string, year *int) (articleMonthlyStats []*response.FeedbacksMonthlyStats, err error) + All(clientId *uuid.UUID, req request.FeedbacksQueryRequest) (feedbacks []*response.FeedbacksResponse, paging paginator.Pagination, err error) + Show(clientId *uuid.UUID, id uint) (feedbacks *response.FeedbacksResponse, err error) + Save(clientId *uuid.UUID, req request.FeedbacksCreateRequest, authToken string) (feedbacks *entity.Feedbacks, err error) + Update(clientId *uuid.UUID, id uint, req request.FeedbacksUpdateRequest) (err error) + Delete(clientId *uuid.UUID, id uint) error + FeedbackMonthlyStats(clientId *uuid.UUID, authToken string, year *int) (articleMonthlyStats []*response.FeedbacksMonthlyStats, err error) } // NewFeedbacksService init FeedbacksService @@ -39,8 +40,8 @@ func NewFeedbacksService(repo repository.FeedbacksRepository, log zerolog.Logger } // All implement interface of FeedbacksService -func (_i *feedbacksService) All(req request.FeedbacksQueryRequest) (feedbackss []*response.FeedbacksResponse, paging paginator.Pagination, err error) { - results, paging, err := _i.Repo.GetAll(req) +func (_i *feedbacksService) All(clientId *uuid.UUID, req request.FeedbacksQueryRequest) (feedbackss []*response.FeedbacksResponse, paging paginator.Pagination, err error) { + results, paging, err := _i.Repo.GetAll(clientId, req) if err != nil { return } @@ -52,8 +53,8 @@ func (_i *feedbacksService) All(req request.FeedbacksQueryRequest) (feedbackss [ return } -func (_i *feedbacksService) Show(id uint) (feedbacks *response.FeedbacksResponse, err error) { - result, err := _i.Repo.FindOne(id) +func (_i *feedbacksService) Show(clientId *uuid.UUID, id uint) (feedbacks *response.FeedbacksResponse, err error) { + result, err := _i.Repo.FindOne(clientId, id) if err != nil { return nil, err } @@ -61,26 +62,36 @@ func (_i *feedbacksService) Show(id uint) (feedbacks *response.FeedbacksResponse return mapper.FeedbacksResponseMapper(result), nil } -func (_i *feedbacksService) Save(req request.FeedbacksCreateRequest, authToken string) (feedbacks *entity.Feedbacks, err error) { +func (_i *feedbacksService) Save(clientId *uuid.UUID, req request.FeedbacksCreateRequest, authToken string) (feedbacks *entity.Feedbacks, err error) { _i.Log.Info().Interface("data", req).Msg("") - return _i.Repo.Create(req.ToEntity()) + + // Set ClientId on entity + entity := req.ToEntity() + entity.ClientId = clientId + + return _i.Repo.Create(entity) } -func (_i *feedbacksService) Update(id uint, req request.FeedbacksUpdateRequest) (err error) { +func (_i *feedbacksService) Update(clientId *uuid.UUID, id uint, req request.FeedbacksUpdateRequest) (err error) { _i.Log.Info().Interface("data", req).Msg("") - return _i.Repo.Update(id, req.ToEntity()) + + // Set ClientId on entity + entity := req.ToEntity() + entity.ClientId = clientId + + return _i.Repo.Update(clientId, id, entity) } -func (_i *feedbacksService) Delete(id uint) error { - result, err := _i.Repo.FindOne(id) +func (_i *feedbacksService) Delete(clientId *uuid.UUID, id uint) error { + result, err := _i.Repo.FindOne(clientId, id) if err != nil { return err } result.IsActive = false - return _i.Repo.Update(id, result) + return _i.Repo.Update(clientId, id, result) } -func (_i *feedbacksService) FeedbackMonthlyStats(authToken string, year *int) (articleMonthlyStats []*response.FeedbacksMonthlyStats, err error) { +func (_i *feedbacksService) FeedbackMonthlyStats(clientId *uuid.UUID, authToken string, year *int) (articleMonthlyStats []*response.FeedbacksMonthlyStats, err error) { //user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken) //var userLevelId *uint @@ -91,7 +102,7 @@ func (_i *feedbacksService) FeedbackMonthlyStats(authToken string, year *int) (a // userLevelNumber = &user.UserLevel.LevelNumber //} - result, err := _i.Repo.FeedbacksMonthlyStats(*year) + result, err := _i.Repo.FeedbacksMonthlyStats(clientId, *year) if err != nil { return nil, err } diff --git a/app/module/magazine_files/controller/controller.go b/app/module/magazine_files/controller/controller.go index 592d393..ab456ea 100644 --- a/app/module/magazine_files/controller/controller.go +++ b/app/module/magazine_files/controller/controller.go @@ -1,6 +1,6 @@ package controller -import "go-humas-be/app/module/magazine_files/service" +import "web-medols-be/app/module/magazine_files/service" type Controller struct { MagazineFiles MagazineFilesController @@ -10,4 +10,4 @@ func NewController(MagazineFilesService service.MagazineFilesService) *Controlle return &Controller{ MagazineFiles: NewMagazineFilesController(MagazineFilesService), } -} \ No newline at end of file +} diff --git a/app/module/magazine_files/controller/magazine_files.controller.go b/app/module/magazine_files/controller/magazine_files.controller.go index 9c6571c..4907042 100644 --- a/app/module/magazine_files/controller/magazine_files.controller.go +++ b/app/module/magazine_files/controller/magazine_files.controller.go @@ -2,13 +2,13 @@ package controller import ( "github.com/gofiber/fiber/v2" - "go-humas-be/app/module/magazine_files/request" - "go-humas-be/app/module/magazine_files/service" - "go-humas-be/utils/paginator" "strconv" + "web-medols-be/app/module/magazine_files/request" + "web-medols-be/app/module/magazine_files/service" + "web-medols-be/utils/paginator" - utilRes "go-humas-be/utils/response" - utilVal "go-humas-be/utils/validator" + utilRes "web-medols-be/utils/response" + utilVal "web-medols-be/utils/validator" ) type magazineFilesController struct { diff --git a/app/module/magazine_files/magazine_files.module.go b/app/module/magazine_files/magazine_files.module.go index 8397c4e..4196044 100644 --- a/app/module/magazine_files/magazine_files.module.go +++ b/app/module/magazine_files/magazine_files.module.go @@ -2,10 +2,10 @@ package magazine_files import ( "github.com/gofiber/fiber/v2" - "go-humas-be/app/module/magazine_files/controller" - "go-humas-be/app/module/magazine_files/repository" - "go-humas-be/app/module/magazine_files/service" "go.uber.org/fx" + "web-medols-be/app/module/magazine_files/controller" + "web-medols-be/app/module/magazine_files/repository" + "web-medols-be/app/module/magazine_files/service" ) // struct of MagazineFilesRouter diff --git a/app/module/magazine_files/mapper/magazine_files.mapper.go b/app/module/magazine_files/mapper/magazine_files.mapper.go index 989b4c0..4acdc14 100644 --- a/app/module/magazine_files/mapper/magazine_files.mapper.go +++ b/app/module/magazine_files/mapper/magazine_files.mapper.go @@ -1,8 +1,8 @@ package mapper import ( - "go-humas-be/app/database/entity" - res "go-humas-be/app/module/magazine_files/response" + "web-medols-be/app/database/entity" + res "web-medols-be/app/module/magazine_files/response" ) func MagazineFilesResponseMapper(magazineFilesReq *entity.MagazineFiles, host string) (magazineFilesRes *res.MagazineFilesResponse) { diff --git a/app/module/magazine_files/repository/magazine_files.repository.go b/app/module/magazine_files/repository/magazine_files.repository.go index a328552..afdb397 100644 --- a/app/module/magazine_files/repository/magazine_files.repository.go +++ b/app/module/magazine_files/repository/magazine_files.repository.go @@ -2,12 +2,12 @@ package repository import ( "fmt" - "go-humas-be/app/database" - "go-humas-be/app/database/entity" - "go-humas-be/app/module/magazine_files/request" - "go-humas-be/utils/paginator" - utilSvc "go-humas-be/utils/service" "strings" + "web-medols-be/app/database" + "web-medols-be/app/database/entity" + "web-medols-be/app/module/magazine_files/request" + "web-medols-be/utils/paginator" + utilSvc "web-medols-be/utils/service" ) type magazineFilesRepository struct { diff --git a/app/module/magazine_files/request/magazine_files.request.go b/app/module/magazine_files/request/magazine_files.request.go index 728738f..d6f9e80 100644 --- a/app/module/magazine_files/request/magazine_files.request.go +++ b/app/module/magazine_files/request/magazine_files.request.go @@ -1,10 +1,10 @@ package request import ( - "go-humas-be/app/database/entity" - "go-humas-be/utils/paginator" "strconv" "time" + "web-medols-be/app/database/entity" + "web-medols-be/utils/paginator" ) type MagazineFilesGeneric interface { diff --git a/app/module/magazine_files/service/magazine_files.service.go b/app/module/magazine_files/service/magazine_files.service.go index 758643b..0d5bff8 100644 --- a/app/module/magazine_files/service/magazine_files.service.go +++ b/app/module/magazine_files/service/magazine_files.service.go @@ -6,13 +6,6 @@ import ( "github.com/gofiber/fiber/v2" "github.com/minio/minio-go/v7" "github.com/rs/zerolog" - "go-humas-be/app/module/magazine_files/mapper" - "go-humas-be/app/module/magazine_files/repository" - "go-humas-be/app/module/magazine_files/request" - "go-humas-be/app/module/magazine_files/response" - config "go-humas-be/config/config" - minioStorage "go-humas-be/config/config" - "go-humas-be/utils/paginator" "io" "log" "math/rand" @@ -21,6 +14,13 @@ import ( "strconv" "strings" "time" + "web-medols-be/app/module/magazine_files/mapper" + "web-medols-be/app/module/magazine_files/repository" + "web-medols-be/app/module/magazine_files/request" + "web-medols-be/app/module/magazine_files/response" + config "web-medols-be/config/config" + minioStorage "web-medols-be/config/config" + "web-medols-be/utils/paginator" ) // MagazineFilesService diff --git a/app/module/magazines/controller/controller.go b/app/module/magazines/controller/controller.go index 1346c96..4b0b03d 100644 --- a/app/module/magazines/controller/controller.go +++ b/app/module/magazines/controller/controller.go @@ -1,6 +1,6 @@ package controller -import "go-humas-be/app/module/magazines/service" +import "web-medols-be/app/module/magazines/service" type Controller struct { Magazines MagazinesController @@ -10,4 +10,4 @@ func NewController(MagazinesService service.MagazinesService) *Controller { return &Controller{ Magazines: NewMagazinesController(MagazinesService), } -} \ No newline at end of file +} diff --git a/app/module/magazines/controller/magazines.controller.go b/app/module/magazines/controller/magazines.controller.go index 2f28371..0765193 100644 --- a/app/module/magazines/controller/magazines.controller.go +++ b/app/module/magazines/controller/magazines.controller.go @@ -2,13 +2,13 @@ package controller import ( "github.com/gofiber/fiber/v2" - "go-humas-be/app/module/magazines/request" - "go-humas-be/app/module/magazines/service" - "go-humas-be/utils/paginator" "strconv" + "web-medols-be/app/module/magazines/request" + "web-medols-be/app/module/magazines/service" + "web-medols-be/utils/paginator" - utilRes "go-humas-be/utils/response" - utilVal "go-humas-be/utils/validator" + utilRes "web-medols-be/utils/response" + utilVal "web-medols-be/utils/validator" ) type magazinesController struct { @@ -59,7 +59,10 @@ func (_i *magazinesController) All(c *fiber.Ctx) error { req := reqContext.ToParamRequest() req.Pagination = paginate - magazinesData, paging, err := _i.magazinesService.All(req) + // Extract ClientId from context + clientId := c.Locals("clientId") + + magazinesData, paging, err := _i.magazinesService.All(clientId, req) if err != nil { return err } @@ -88,7 +91,10 @@ func (_i *magazinesController) Show(c *fiber.Ctx) error { return err } - magazinesData, err := _i.magazinesService.Show(uint(id)) + // Extract ClientId from context + clientId := c.Locals("clientId") + + magazinesData, err := _i.magazinesService.Show(clientId, uint(id)) if err != nil { return err } @@ -119,7 +125,11 @@ func (_i *magazinesController) Save(c *fiber.Ctx) error { } authToken := c.Get("Authorization") - dataResult, err := _i.magazinesService.Save(*req, authToken) + + // Extract ClientId from context + clientId := c.Locals("clientId") + + dataResult, err := _i.magazinesService.Save(clientId, *req, authToken) if err != nil { return err } @@ -155,7 +165,10 @@ func (_i *magazinesController) Update(c *fiber.Ctx) error { return err } - err = _i.magazinesService.Update(uint(id), *req) + // Extract ClientId from context + clientId := c.Locals("clientId") + + err = _i.magazinesService.Update(clientId, uint(id), *req) if err != nil { return err } @@ -180,7 +193,10 @@ func (_i *magazinesController) Update(c *fiber.Ctx) error { // @Failure 500 {object} response.InternalServerError // @Router /magazines/thumbnail/{id} [post] func (_i *magazinesController) SaveThumbnail(c *fiber.Ctx) error { - err := _i.magazinesService.SaveThumbnail(c) + // Extract ClientId from context + clientId := c.Locals("clientId") + + err := _i.magazinesService.SaveThumbnail(clientId, c) if err != nil { return err } @@ -203,7 +219,10 @@ func (_i *magazinesController) SaveThumbnail(c *fiber.Ctx) error { // @Failure 500 {object} response.InternalServerError // @Router /magazines/thumbnail/viewer/{thumbnailName} [get] func (_i *magazinesController) Viewer(c *fiber.Ctx) error { - return _i.magazinesService.Viewer(c) + // Extract ClientId from context + clientId := c.Locals("clientId") + + return _i.magazinesService.Viewer(clientId, c) } // Delete Magazines @@ -224,7 +243,10 @@ func (_i *magazinesController) Delete(c *fiber.Ctx) error { return err } - err = _i.magazinesService.Delete(uint(id)) + // Extract ClientId from context + clientId := c.Locals("clientId") + + err = _i.magazinesService.Delete(clientId, uint(id)) if err != nil { return err } diff --git a/app/module/magazines/magazines.module.go b/app/module/magazines/magazines.module.go index a172b65..16f0f8f 100644 --- a/app/module/magazines/magazines.module.go +++ b/app/module/magazines/magazines.module.go @@ -2,10 +2,10 @@ package magazines import ( "github.com/gofiber/fiber/v2" - "go-humas-be/app/module/magazines/controller" - "go-humas-be/app/module/magazines/repository" - "go-humas-be/app/module/magazines/service" "go.uber.org/fx" + "web-medols-be/app/module/magazines/controller" + "web-medols-be/app/module/magazines/repository" + "web-medols-be/app/module/magazines/service" ) // struct of MagazinesRouter diff --git a/app/module/magazines/mapper/magazines.mapper.go b/app/module/magazines/mapper/magazines.mapper.go index e7a0e1f..4c68619 100644 --- a/app/module/magazines/mapper/magazines.mapper.go +++ b/app/module/magazines/mapper/magazines.mapper.go @@ -1,11 +1,11 @@ package mapper import ( - "go-humas-be/app/database/entity" - magazineFilesMapper "go-humas-be/app/module/magazine_files/mapper" - magazineFilesRepository "go-humas-be/app/module/magazine_files/repository" - magazineFilesResponse "go-humas-be/app/module/magazine_files/response" - res "go-humas-be/app/module/magazines/response" + "web-medols-be/app/database/entity" + magazineFilesMapper "web-medols-be/app/module/magazine_files/mapper" + magazineFilesRepository "web-medols-be/app/module/magazine_files/repository" + magazineFilesResponse "web-medols-be/app/module/magazine_files/response" + res "web-medols-be/app/module/magazines/response" ) func MagazinesResponseMapper(magazinesReq *entity.Magazines, magazineFilesRepo magazineFilesRepository.MagazineFilesRepository, host string) (magazinesRes *res.MagazinesResponse) { diff --git a/app/module/magazines/repository/magazines.repository.go b/app/module/magazines/repository/magazines.repository.go index 4c309d3..43a3b28 100644 --- a/app/module/magazines/repository/magazines.repository.go +++ b/app/module/magazines/repository/magazines.repository.go @@ -2,12 +2,13 @@ package repository import ( "fmt" - "go-humas-be/app/database" - "go-humas-be/app/database/entity" - "go-humas-be/app/module/magazines/request" - "go-humas-be/utils/paginator" - utilSvc "go-humas-be/utils/service" + "github.com/google/uuid" "strings" + "web-medols-be/app/database" + "web-medols-be/app/database/entity" + "web-medols-be/app/module/magazines/request" + "web-medols-be/utils/paginator" + utilSvc "web-medols-be/utils/service" ) type magazinesRepository struct { @@ -16,12 +17,12 @@ type magazinesRepository struct { // MagazinesRepository define interface of IMagazinesRepository type MagazinesRepository interface { - GetAll(req request.MagazinesQueryRequest) (magaziness []*entity.Magazines, paging paginator.Pagination, err error) - FindOne(id uint) (magazines *entity.Magazines, err error) - FindByFilename(thumbnailName string) (magazineReturn *entity.Magazines, err error) + GetAll(clientId *uuid.UUID, req request.MagazinesQueryRequest) (magaziness []*entity.Magazines, paging paginator.Pagination, err error) + FindOne(clientId *uuid.UUID, id uint) (magazines *entity.Magazines, err error) + FindByFilename(clientId *uuid.UUID, thumbnailName string) (magazineReturn *entity.Magazines, err error) Create(magazines *entity.Magazines) (magazineReturn *entity.Magazines, err error) - Update(id uint, magazines *entity.Magazines) (err error) - Delete(id uint) (err error) + Update(clientId *uuid.UUID, id uint, magazines *entity.Magazines) (err error) + Delete(clientId *uuid.UUID, id uint) (err error) } func NewMagazinesRepository(db *database.Database) MagazinesRepository { @@ -31,10 +32,16 @@ func NewMagazinesRepository(db *database.Database) MagazinesRepository { } // implement interface of IMagazinesRepository -func (_i *magazinesRepository) GetAll(req request.MagazinesQueryRequest) (magaziness []*entity.Magazines, paging paginator.Pagination, err error) { +func (_i *magazinesRepository) GetAll(clientId *uuid.UUID, req request.MagazinesQueryRequest) (magaziness []*entity.Magazines, paging paginator.Pagination, err error) { var count int64 query := _i.DB.DB.Model(&entity.Magazines{}) + + // Add ClientId filter + if clientId != nil { + query = query.Where("client_id = ?", clientId) + } + query = query.Where("is_active = ?", true) if req.Title != nil && *req.Title != "" { @@ -77,17 +84,30 @@ func (_i *magazinesRepository) GetAll(req request.MagazinesQueryRequest) (magazi return } -func (_i *magazinesRepository) FindOne(id uint) (magazines *entity.Magazines, err error) { - if err := _i.DB.DB.First(&magazines, id).Error; err != nil { +func (_i *magazinesRepository) FindOne(clientId *uuid.UUID, id uint) (magazines *entity.Magazines, err error) { + query := _i.DB.DB.Where("id = ?", id) + + // Add ClientId filter + if clientId != nil { + query = query.Where("client_id = ?", clientId) + } + + if err := query.First(&magazines).Error; err != nil { return nil, err } return magazines, nil } -func (_i *magazinesRepository) FindByFilename(thumbnailName string) (magazines *entity.Magazines, err error) { +func (_i *magazinesRepository) FindByFilename(clientId *uuid.UUID, thumbnailName string) (magazines *entity.Magazines, err error) { + query := _i.DB.DB.Where("thumbnail_name = ?", thumbnailName) - if err := _i.DB.DB.Where("thumbnail_name = ?", thumbnailName).First(&magazines).Error; err != nil { + // Add ClientId filter + if clientId != nil { + query = query.Where("client_id = ?", clientId) + } + + if err := query.First(&magazines).Error; err != nil { return nil, err } @@ -99,16 +119,22 @@ func (_i *magazinesRepository) Create(magazines *entity.Magazines) (magazineRetu return magazines, result.Error } -func (_i *magazinesRepository) Update(id uint, magazines *entity.Magazines) (err error) { +func (_i *magazinesRepository) Update(clientId *uuid.UUID, id uint, magazines *entity.Magazines) (err error) { magazinesMap, err := utilSvc.StructToMap(magazines) if err != nil { return err } - return _i.DB.DB.Model(&entity.Magazines{}). - Where(&entity.Magazines{ID: id}). - Updates(magazinesMap).Error + query := _i.DB.DB.Model(&entity.Magazines{}).Where(&entity.Magazines{ID: id}) + if clientId != nil { + query = query.Where("client_id = ?", clientId) + } + return query.Updates(magazinesMap).Error } -func (_i *magazinesRepository) Delete(id uint) error { - return _i.DB.DB.Delete(&entity.Magazines{}, id).Error +func (_i *magazinesRepository) Delete(clientId *uuid.UUID, id uint) error { + query := _i.DB.DB.Model(&entity.Magazines{}).Where("id = ?", id) + if clientId != nil { + query = query.Where("client_id = ?", clientId) + } + return query.Delete(&entity.Magazines{}).Error } diff --git a/app/module/magazines/request/magazines.request.go b/app/module/magazines/request/magazines.request.go index ee798d0..87870b4 100644 --- a/app/module/magazines/request/magazines.request.go +++ b/app/module/magazines/request/magazines.request.go @@ -1,10 +1,10 @@ package request import ( - "go-humas-be/app/database/entity" - "go-humas-be/utils/paginator" "strconv" "time" + "web-medols-be/app/database/entity" + "web-medols-be/utils/paginator" ) type MagazinesGeneric interface { diff --git a/app/module/magazines/response/magazines.response.go b/app/module/magazines/response/magazines.response.go index 5ce62ea..937491f 100644 --- a/app/module/magazines/response/magazines.response.go +++ b/app/module/magazines/response/magazines.response.go @@ -1,8 +1,8 @@ package response import ( - magazineFilesResponse "go-humas-be/app/module/magazine_files/response" "time" + magazineFilesResponse "web-medols-be/app/module/magazine_files/response" ) type MagazinesResponse struct { diff --git a/app/module/magazines/service/magazines.service.go b/app/module/magazines/service/magazines.service.go index 932b162..0fbc668 100644 --- a/app/module/magazines/service/magazines.service.go +++ b/app/module/magazines/service/magazines.service.go @@ -4,19 +4,9 @@ import ( "context" "fmt" "github.com/gofiber/fiber/v2" + "github.com/google/uuid" "github.com/minio/minio-go/v7" "github.com/rs/zerolog" - "go-humas-be/app/database/entity" - magazineFilesRepository "go-humas-be/app/module/magazine_files/repository" - "go-humas-be/app/module/magazines/mapper" - "go-humas-be/app/module/magazines/repository" - "go-humas-be/app/module/magazines/request" - "go-humas-be/app/module/magazines/response" - usersRepository "go-humas-be/app/module/users/repository" - config "go-humas-be/config/config" - minioStorage "go-humas-be/config/config" - "go-humas-be/utils/paginator" - utilSvc "go-humas-be/utils/service" "io" "log" "math/rand" @@ -25,6 +15,17 @@ import ( "strconv" "strings" "time" + "web-medols-be/app/database/entity" + magazineFilesRepository "web-medols-be/app/module/magazine_files/repository" + "web-medols-be/app/module/magazines/mapper" + "web-medols-be/app/module/magazines/repository" + "web-medols-be/app/module/magazines/request" + "web-medols-be/app/module/magazines/response" + usersRepository "web-medols-be/app/module/users/repository" + config "web-medols-be/config/config" + minioStorage "web-medols-be/config/config" + "web-medols-be/utils/paginator" + utilSvc "web-medols-be/utils/service" ) // MagazinesService @@ -39,13 +40,13 @@ type magazinesService struct { // MagazinesService define interface of IMagazinesService type MagazinesService interface { - All(req request.MagazinesQueryRequest) (magazines []*response.MagazinesResponse, paging paginator.Pagination, err error) - Show(id uint) (magazines *response.MagazinesResponse, err error) - Save(req request.MagazinesCreateRequest, authToken string) (magazines *entity.Magazines, err error) - Update(id uint, req request.MagazinesUpdateRequest) (err error) - SaveThumbnail(c *fiber.Ctx) (err error) - Viewer(c *fiber.Ctx) (err error) - Delete(id uint) error + All(clientId *uuid.UUID, req request.MagazinesQueryRequest) (magazines []*response.MagazinesResponse, paging paginator.Pagination, err error) + Show(clientId *uuid.UUID, id uint) (magazines *response.MagazinesResponse, err error) + Save(clientId *uuid.UUID, req request.MagazinesCreateRequest, authToken string) (magazines *entity.Magazines, err error) + Update(clientId *uuid.UUID, id uint, req request.MagazinesUpdateRequest) (err error) + SaveThumbnail(clientId *uuid.UUID, c *fiber.Ctx) (err error) + Viewer(clientId *uuid.UUID, c *fiber.Ctx) (err error) + Delete(clientId *uuid.UUID, id uint) error } // NewMagazinesService init MagazinesService @@ -62,8 +63,8 @@ func NewMagazinesService(repo repository.MagazinesRepository, magazineFilesRepo } // All implement interface of MagazinesService -func (_i *magazinesService) All(req request.MagazinesQueryRequest) (magaziness []*response.MagazinesResponse, paging paginator.Pagination, err error) { - results, paging, err := _i.Repo.GetAll(req) +func (_i *magazinesService) All(clientId *uuid.UUID, req request.MagazinesQueryRequest) (magaziness []*response.MagazinesResponse, paging paginator.Pagination, err error) { + results, paging, err := _i.Repo.GetAll(clientId, req) if err != nil { return } @@ -76,8 +77,8 @@ func (_i *magazinesService) All(req request.MagazinesQueryRequest) (magaziness [ return } -func (_i *magazinesService) Show(id uint) (magazines *response.MagazinesResponse, err error) { - result, err := _i.Repo.FindOne(id) +func (_i *magazinesService) Show(clientId *uuid.UUID, id uint) (magazines *response.MagazinesResponse, err error) { + result, err := _i.Repo.FindOne(clientId, id) if err != nil { return nil, err } @@ -85,13 +86,16 @@ func (_i *magazinesService) Show(id uint) (magazines *response.MagazinesResponse return mapper.MagazinesResponseMapper(result, _i.MagazineFilesRepo, host), nil } -func (_i *magazinesService) Save(req request.MagazinesCreateRequest, authToken string) (magazines *entity.Magazines, err error) { +func (_i *magazinesService) Save(clientId *uuid.UUID, req request.MagazinesCreateRequest, authToken string) (magazines *entity.Magazines, err error) { _i.Log.Info().Interface("data", req).Msg("") newReq := req.ToEntity() createdBy := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken) newReq.CreatedById = &createdBy.ID + // Set ClientId on entity + newReq.ClientId = clientId + saveMagazineResponse, err := _i.Repo.Create(newReq) if err != nil { return nil, err @@ -100,7 +104,7 @@ func (_i *magazinesService) Save(req request.MagazinesCreateRequest, authToken s return saveMagazineResponse, nil } -func (_i *magazinesService) SaveThumbnail(c *fiber.Ctx) (err error) { +func (_i *magazinesService) SaveThumbnail(clientId *uuid.UUID, c *fiber.Ctx) (err error) { id, err := strconv.ParseUint(c.Params("id"), 10, 0) if err != nil { @@ -155,10 +159,10 @@ func (_i *magazinesService) SaveThumbnail(c *fiber.Ctx) (err error) { newFilename := newFilenameWithoutExt + "." + extension objectName := fmt.Sprintf("magazines/thumbnail/%d/%d/%s", now.Year(), now.Month(), newFilename) - findCategory, err := _i.Repo.FindOne(uint(id)) + findCategory, err := _i.Repo.FindOne(clientId, uint(id)) findCategory.ThumbnailName = &newFilename findCategory.ThumbnailPath = &objectName - err = _i.Repo.Update(uint(id), findCategory) + err = _i.Repo.Update(clientId, uint(id), findCategory) if err != nil { return err } @@ -173,22 +177,27 @@ func (_i *magazinesService) SaveThumbnail(c *fiber.Ctx) (err error) { return } -func (_i *magazinesService) Update(id uint, req request.MagazinesUpdateRequest) (err error) { +func (_i *magazinesService) Update(clientId *uuid.UUID, id uint, req request.MagazinesUpdateRequest) (err error) { _i.Log.Info().Interface("data", req).Msg("") - return _i.Repo.Update(id, req.ToEntity()) + + // Set ClientId on entity + entity := req.ToEntity() + entity.ClientId = clientId + + return _i.Repo.Update(clientId, id, entity) } -func (_i *magazinesService) Delete(id uint) error { - return _i.Repo.Delete(id) +func (_i *magazinesService) Delete(clientId *uuid.UUID, id uint) error { + return _i.Repo.Delete(clientId, id) } -func (_i *magazinesService) Viewer(c *fiber.Ctx) (err error) { +func (_i *magazinesService) Viewer(clientId *uuid.UUID, c *fiber.Ctx) (err error) { thumbnailName := c.Params("thumbnailName") emptyImage := "empty-image.jpg" searchThumbnail := emptyImage if thumbnailName != emptyImage { - result, err := _i.Repo.FindByFilename(thumbnailName) + result, err := _i.Repo.FindByFilename(clientId, thumbnailName) if err != nil { return err } diff --git a/app/module/master_menus/controller/controller.go b/app/module/master_menus/controller/controller.go index bc8c925..ccf95e2 100644 --- a/app/module/master_menus/controller/controller.go +++ b/app/module/master_menus/controller/controller.go @@ -1,6 +1,6 @@ package controller -import "go-humas-be/app/module/master_menus/service" +import "web-medols-be/app/module/master_menus/service" type Controller struct { MasterMenus MasterMenusController @@ -10,4 +10,4 @@ func NewController(MasterMenusService service.MasterMenusService) *Controller { return &Controller{ MasterMenus: NewMasterMenusController(MasterMenusService), } -} \ No newline at end of file +} diff --git a/app/module/master_menus/controller/master_menus.controller.go b/app/module/master_menus/controller/master_menus.controller.go index 7cf394a..b6e2a58 100644 --- a/app/module/master_menus/controller/master_menus.controller.go +++ b/app/module/master_menus/controller/master_menus.controller.go @@ -2,13 +2,13 @@ package controller import ( "github.com/gofiber/fiber/v2" - "go-humas-be/app/module/master_menus/request" - "go-humas-be/app/module/master_menus/service" - "go-humas-be/utils/paginator" "strconv" + "web-medols-be/app/module/master_menus/request" + "web-medols-be/app/module/master_menus/service" + "web-medols-be/utils/paginator" - utilRes "go-humas-be/utils/response" - utilVal "go-humas-be/utils/validator" + utilRes "web-medols-be/utils/response" + utilVal "web-medols-be/utils/validator" ) type masterMenusController struct { diff --git a/app/module/master_menus/mapper/master_menus.mapper.go b/app/module/master_menus/mapper/master_menus.mapper.go index 32dfd87..a890f31 100644 --- a/app/module/master_menus/mapper/master_menus.mapper.go +++ b/app/module/master_menus/mapper/master_menus.mapper.go @@ -1,8 +1,8 @@ package mapper import ( - "go-humas-be/app/database/entity" - res "go-humas-be/app/module/master_menus/response" + "web-medols-be/app/database/entity" + res "web-medols-be/app/module/master_menus/response" ) func MasterMenusResponseMapper(masterMenusReq *entity.MasterMenus) (masterMenusRes *res.MasterMenusResponse) { diff --git a/app/module/master_menus/master_menus.module.go b/app/module/master_menus/master_menus.module.go index ea3be0e..11a5e77 100644 --- a/app/module/master_menus/master_menus.module.go +++ b/app/module/master_menus/master_menus.module.go @@ -2,10 +2,10 @@ package master_menus import ( "github.com/gofiber/fiber/v2" - "go-humas-be/app/module/master_menus/controller" - "go-humas-be/app/module/master_menus/repository" - "go-humas-be/app/module/master_menus/service" "go.uber.org/fx" + "web-medols-be/app/module/master_menus/controller" + "web-medols-be/app/module/master_menus/repository" + "web-medols-be/app/module/master_menus/service" ) // struct of MasterMenusRouter @@ -50,4 +50,4 @@ func (_i *MasterMenusRouter) RegisterMasterMenusRoutes() { router.Put("/:id", masterMenusController.Update) router.Delete("/:id", masterMenusController.Delete) }) -} \ No newline at end of file +} diff --git a/app/module/master_menus/repository/master_menus.repository.go b/app/module/master_menus/repository/master_menus.repository.go index 77af33d..f0bb90f 100644 --- a/app/module/master_menus/repository/master_menus.repository.go +++ b/app/module/master_menus/repository/master_menus.repository.go @@ -2,11 +2,11 @@ package repository import ( "fmt" - "go-humas-be/app/database" - "go-humas-be/app/database/entity" - "go-humas-be/app/module/master_menus/request" - "go-humas-be/utils/paginator" "strings" + "web-medols-be/app/database" + "web-medols-be/app/database/entity" + "web-medols-be/app/module/master_menus/request" + "web-medols-be/utils/paginator" ) type masterMenusRepository struct { diff --git a/app/module/master_menus/request/master_menus.request.go b/app/module/master_menus/request/master_menus.request.go index e623462..e0ba9cc 100644 --- a/app/module/master_menus/request/master_menus.request.go +++ b/app/module/master_menus/request/master_menus.request.go @@ -1,10 +1,10 @@ package request import ( - "go-humas-be/app/database/entity" - "go-humas-be/utils/paginator" "strconv" "time" + "web-medols-be/app/database/entity" + "web-medols-be/utils/paginator" ) type MasterMenusGeneric interface { diff --git a/app/module/master_menus/service/master_menus.service.go b/app/module/master_menus/service/master_menus.service.go index 0368645..58db25c 100644 --- a/app/module/master_menus/service/master_menus.service.go +++ b/app/module/master_menus/service/master_menus.service.go @@ -2,11 +2,11 @@ package service import ( "github.com/rs/zerolog" - "go-humas-be/app/module/master_menus/mapper" - "go-humas-be/app/module/master_menus/repository" - "go-humas-be/app/module/master_menus/request" - "go-humas-be/app/module/master_menus/response" - "go-humas-be/utils/paginator" + "web-medols-be/app/module/master_menus/mapper" + "web-medols-be/app/module/master_menus/repository" + "web-medols-be/app/module/master_menus/request" + "web-medols-be/app/module/master_menus/response" + "web-medols-be/utils/paginator" ) // MasterMenusService diff --git a/app/module/master_modules/controller/controller.go b/app/module/master_modules/controller/controller.go index ec3d538..88b91d6 100644 --- a/app/module/master_modules/controller/controller.go +++ b/app/module/master_modules/controller/controller.go @@ -1,6 +1,6 @@ package controller -import "go-humas-be/app/module/master_modules/service" +import "web-medols-be/app/module/master_modules/service" type Controller struct { MasterModules MasterModulesController @@ -10,4 +10,4 @@ func NewController(MasterModulesService service.MasterModulesService) *Controlle return &Controller{ MasterModules: NewMasterModulesController(MasterModulesService), } -} \ No newline at end of file +} diff --git a/app/module/master_modules/controller/master_modules.controller.go b/app/module/master_modules/controller/master_modules.controller.go index fe539bd..04f481c 100644 --- a/app/module/master_modules/controller/master_modules.controller.go +++ b/app/module/master_modules/controller/master_modules.controller.go @@ -2,13 +2,13 @@ package controller import ( "github.com/gofiber/fiber/v2" - "go-humas-be/app/module/master_modules/request" - "go-humas-be/app/module/master_modules/service" - "go-humas-be/utils/paginator" "strconv" + "web-medols-be/app/module/master_modules/request" + "web-medols-be/app/module/master_modules/service" + "web-medols-be/utils/paginator" - utilRes "go-humas-be/utils/response" - utilVal "go-humas-be/utils/validator" + utilRes "web-medols-be/utils/response" + utilVal "web-medols-be/utils/validator" ) type masterModulesController struct { diff --git a/app/module/master_modules/mapper/master_modules.mapper.go b/app/module/master_modules/mapper/master_modules.mapper.go index 62432a0..c51cf91 100644 --- a/app/module/master_modules/mapper/master_modules.mapper.go +++ b/app/module/master_modules/mapper/master_modules.mapper.go @@ -1,8 +1,8 @@ package mapper import ( - "go-humas-be/app/database/entity" - res "go-humas-be/app/module/master_modules/response" + "web-medols-be/app/database/entity" + res "web-medols-be/app/module/master_modules/response" ) func MasterModulesResponseMapper(masterModulesReq *entity.MasterModules) (masterModulesRes *res.MasterModulesResponse) { diff --git a/app/module/master_modules/master_modules.module.go b/app/module/master_modules/master_modules.module.go index de9e961..55497f2 100644 --- a/app/module/master_modules/master_modules.module.go +++ b/app/module/master_modules/master_modules.module.go @@ -2,10 +2,10 @@ package master_modules import ( "github.com/gofiber/fiber/v2" - "go-humas-be/app/module/master_modules/controller" - "go-humas-be/app/module/master_modules/repository" - "go-humas-be/app/module/master_modules/service" "go.uber.org/fx" + "web-medols-be/app/module/master_modules/controller" + "web-medols-be/app/module/master_modules/repository" + "web-medols-be/app/module/master_modules/service" ) // struct of MasterModulesRouter @@ -50,4 +50,4 @@ func (_i *MasterModulesRouter) RegisterMasterModulesRoutes() { router.Put("/:id", masterModulesController.Update) router.Delete("/:id", masterModulesController.Delete) }) -} \ No newline at end of file +} diff --git a/app/module/master_modules/repository/master_modules.repository.go b/app/module/master_modules/repository/master_modules.repository.go index b527e92..e27e776 100644 --- a/app/module/master_modules/repository/master_modules.repository.go +++ b/app/module/master_modules/repository/master_modules.repository.go @@ -2,11 +2,11 @@ package repository import ( "fmt" - "go-humas-be/app/database" - "go-humas-be/app/database/entity" - "go-humas-be/app/module/master_modules/request" - "go-humas-be/utils/paginator" "strings" + "web-medols-be/app/database" + "web-medols-be/app/database/entity" + "web-medols-be/app/module/master_modules/request" + "web-medols-be/utils/paginator" ) type masterModulesRepository struct { diff --git a/app/module/master_modules/request/master_modules.request.go b/app/module/master_modules/request/master_modules.request.go index 9f4774b..a667e86 100644 --- a/app/module/master_modules/request/master_modules.request.go +++ b/app/module/master_modules/request/master_modules.request.go @@ -1,10 +1,10 @@ package request import ( - "go-humas-be/app/database/entity" - "go-humas-be/utils/paginator" "strconv" "time" + "web-medols-be/app/database/entity" + "web-medols-be/utils/paginator" ) type MasterModulesGeneric interface { diff --git a/app/module/master_modules/service/master_modules.service.go b/app/module/master_modules/service/master_modules.service.go index 90cf7f1..9b995e5 100644 --- a/app/module/master_modules/service/master_modules.service.go +++ b/app/module/master_modules/service/master_modules.service.go @@ -2,11 +2,11 @@ package service import ( "github.com/rs/zerolog" - "go-humas-be/app/module/master_modules/mapper" - "go-humas-be/app/module/master_modules/repository" - "go-humas-be/app/module/master_modules/request" - "go-humas-be/app/module/master_modules/response" - "go-humas-be/utils/paginator" + "web-medols-be/app/module/master_modules/mapper" + "web-medols-be/app/module/master_modules/repository" + "web-medols-be/app/module/master_modules/request" + "web-medols-be/app/module/master_modules/response" + "web-medols-be/utils/paginator" ) // MasterModulesService diff --git a/app/module/master_statuses/controller/controller.go b/app/module/master_statuses/controller/controller.go index 87e1e4f..d77d741 100644 --- a/app/module/master_statuses/controller/controller.go +++ b/app/module/master_statuses/controller/controller.go @@ -1,6 +1,6 @@ package controller -import "go-humas-be/app/module/master_statuses/service" +import "web-medols-be/app/module/master_statuses/service" type Controller struct { MasterStatuses MasterStatusesController @@ -10,4 +10,4 @@ func NewController(MasterStatusesService service.MasterStatusesService) *Control return &Controller{ MasterStatuses: NewMasterStatusesController(MasterStatusesService), } -} \ No newline at end of file +} diff --git a/app/module/master_statuses/controller/master_statuses.controller.go b/app/module/master_statuses/controller/master_statuses.controller.go index 9c68cda..04c54ab 100644 --- a/app/module/master_statuses/controller/master_statuses.controller.go +++ b/app/module/master_statuses/controller/master_statuses.controller.go @@ -2,13 +2,13 @@ package controller import ( "github.com/gofiber/fiber/v2" - "go-humas-be/app/module/master_statuses/request" - "go-humas-be/app/module/master_statuses/service" - "go-humas-be/utils/paginator" "strconv" + "web-medols-be/app/module/master_statuses/request" + "web-medols-be/app/module/master_statuses/service" + "web-medols-be/utils/paginator" - utilRes "go-humas-be/utils/response" - utilVal "go-humas-be/utils/validator" + utilRes "web-medols-be/utils/response" + utilVal "web-medols-be/utils/validator" ) type masterStatusesController struct { diff --git a/app/module/master_statuses/mapper/master_statuses.mapper.go b/app/module/master_statuses/mapper/master_statuses.mapper.go index 1ed31c5..da03264 100644 --- a/app/module/master_statuses/mapper/master_statuses.mapper.go +++ b/app/module/master_statuses/mapper/master_statuses.mapper.go @@ -1,17 +1,17 @@ package mapper import ( - "go-humas-be/app/database/entity" - res "go-humas-be/app/module/master_statuses/response" + "web-medols-be/app/database/entity" + res "web-medols-be/app/module/master_statuses/response" ) func MasterStatusesResponseMapper(masterStatusesReq *entity.MasterStatuses) (masterStatusesRes *res.MasterStatusesResponse) { if masterStatusesReq != nil { masterStatusesRes = &res.MasterStatusesResponse{ - ID: masterStatusesReq.ID, - Name: masterStatusesReq.Name, - IsActive: masterStatusesReq.IsActive, + ID: masterStatusesReq.ID, + Name: masterStatusesReq.Name, + IsActive: masterStatusesReq.IsActive, } } return masterStatusesRes -} \ No newline at end of file +} diff --git a/app/module/master_statuses/master_statuses.module.go b/app/module/master_statuses/master_statuses.module.go index 1a3e4d7..17707ba 100644 --- a/app/module/master_statuses/master_statuses.module.go +++ b/app/module/master_statuses/master_statuses.module.go @@ -2,10 +2,10 @@ package master_statuses import ( "github.com/gofiber/fiber/v2" - "go-humas-be/app/module/master_statuses/controller" - "go-humas-be/app/module/master_statuses/repository" - "go-humas-be/app/module/master_statuses/service" "go.uber.org/fx" + "web-medols-be/app/module/master_statuses/controller" + "web-medols-be/app/module/master_statuses/repository" + "web-medols-be/app/module/master_statuses/service" ) // struct of MasterStatusesRouter @@ -50,4 +50,4 @@ func (_i *MasterStatusesRouter) RegisterMasterStatusesRoutes() { router.Put("/:id", masterStatusesController.Update) router.Delete("/:id", masterStatusesController.Delete) }) -} \ No newline at end of file +} diff --git a/app/module/master_statuses/repository/master_statuses.repository.go b/app/module/master_statuses/repository/master_statuses.repository.go index 5ef8595..f836c3d 100644 --- a/app/module/master_statuses/repository/master_statuses.repository.go +++ b/app/module/master_statuses/repository/master_statuses.repository.go @@ -1,10 +1,10 @@ package repository import ( - "go-humas-be/app/database" - "go-humas-be/app/database/entity" - "go-humas-be/app/module/master_statuses/request" - "go-humas-be/utils/paginator" + "web-medols-be/app/database" + "web-medols-be/app/database/entity" + "web-medols-be/app/module/master_statuses/request" + "web-medols-be/utils/paginator" ) type masterStatusesRepository struct { @@ -66,4 +66,4 @@ func (_i *masterStatusesRepository) Update(id uint, masterStatuses *entity.Maste func (_i *masterStatusesRepository) Delete(id uint) error { return _i.DB.DB.Delete(&entity.MasterStatuses{}, id).Error -} \ No newline at end of file +} diff --git a/app/module/master_statuses/request/master_statuses.request.go b/app/module/master_statuses/request/master_statuses.request.go index 5b19b0d..1f4fd8a 100644 --- a/app/module/master_statuses/request/master_statuses.request.go +++ b/app/module/master_statuses/request/master_statuses.request.go @@ -1,9 +1,9 @@ package request import ( - "go-humas-be/app/database/entity" - "go-humas-be/utils/paginator" "time" + "web-medols-be/app/database/entity" + "web-medols-be/utils/paginator" ) type MasterStatusesGeneric interface { @@ -11,34 +11,33 @@ type MasterStatusesGeneric interface { } type MasterStatusesQueryRequest struct { - Name string `json:"name" validate:"required"` - IsActive bool `json:"is_active" validate:"required"` - Pagination *paginator.Pagination `json:"pagination"` + Name string `json:"name" validate:"required"` + IsActive bool `json:"is_active" validate:"required"` + Pagination *paginator.Pagination `json:"pagination"` } - type MasterStatusesCreateRequest struct { - Name string `json:"name" validate:"required"` - IsActive bool `json:"is_active" validate:"required"` + Name string `json:"name" validate:"required"` + IsActive bool `json:"is_active" validate:"required"` } func (req MasterStatusesCreateRequest) ToEntity() *entity.MasterStatuses { return &entity.MasterStatuses{ - Name: req.Name, - IsActive: req.IsActive, + Name: req.Name, + IsActive: req.IsActive, } } type MasterStatusesUpdateRequest struct { - ID uint `json:"id" validate:"required"` - Name string `json:"name" validate:"required"` - IsActive bool `json:"is_active" validate:"required"` + ID uint `json:"id" validate:"required"` + Name string `json:"name" validate:"required"` + IsActive bool `json:"is_active" validate:"required"` } func (req MasterStatusesUpdateRequest) ToEntity() *entity.MasterStatuses { return &entity.MasterStatuses{ - ID: req.ID, - Name: req.Name, - IsActive: req.IsActive, + ID: req.ID, + Name: req.Name, + IsActive: req.IsActive, } -} \ No newline at end of file +} diff --git a/app/module/master_statuses/service/master_statuses.service.go b/app/module/master_statuses/service/master_statuses.service.go index 86f3b85..b54108d 100644 --- a/app/module/master_statuses/service/master_statuses.service.go +++ b/app/module/master_statuses/service/master_statuses.service.go @@ -2,11 +2,11 @@ package service import ( "github.com/rs/zerolog" - "go-humas-be/app/module/master_statuses/mapper" - "go-humas-be/app/module/master_statuses/repository" - "go-humas-be/app/module/master_statuses/request" - "go-humas-be/app/module/master_statuses/response" - "go-humas-be/utils/paginator" + "web-medols-be/app/module/master_statuses/mapper" + "web-medols-be/app/module/master_statuses/repository" + "web-medols-be/app/module/master_statuses/request" + "web-medols-be/app/module/master_statuses/response" + "web-medols-be/utils/paginator" ) // MasterStatusesService diff --git a/app/module/provinces/controller/controller.go b/app/module/provinces/controller/controller.go index 8882051..67342d2 100644 --- a/app/module/provinces/controller/controller.go +++ b/app/module/provinces/controller/controller.go @@ -1,6 +1,6 @@ package controller -import "go-humas-be/app/module/provinces/service" +import "web-medols-be/app/module/provinces/service" type Controller struct { Provinces ProvincesController @@ -10,4 +10,4 @@ func NewController(ProvincesService service.ProvincesService) *Controller { return &Controller{ Provinces: NewProvincesController(ProvincesService), } -} \ No newline at end of file +} diff --git a/app/module/provinces/controller/provinces.controller.go b/app/module/provinces/controller/provinces.controller.go index a117fb4..c0cf771 100644 --- a/app/module/provinces/controller/provinces.controller.go +++ b/app/module/provinces/controller/provinces.controller.go @@ -2,13 +2,13 @@ package controller import ( "github.com/gofiber/fiber/v2" - "go-humas-be/app/module/provinces/request" - "go-humas-be/app/module/provinces/service" - "go-humas-be/utils/paginator" "strconv" + "web-medols-be/app/module/provinces/request" + "web-medols-be/app/module/provinces/service" + "web-medols-be/utils/paginator" - utilRes "go-humas-be/utils/response" - utilVal "go-humas-be/utils/validator" + utilRes "web-medols-be/utils/response" + utilVal "web-medols-be/utils/validator" ) type provincesController struct { diff --git a/app/module/provinces/mapper/provinces.mapper.go b/app/module/provinces/mapper/provinces.mapper.go index c2eab1a..1a5d51e 100644 --- a/app/module/provinces/mapper/provinces.mapper.go +++ b/app/module/provinces/mapper/provinces.mapper.go @@ -1,19 +1,19 @@ package mapper import ( - "go-humas-be/app/database/entity" - res "go-humas-be/app/module/provinces/response" + "web-medols-be/app/database/entity" + res "web-medols-be/app/module/provinces/response" ) func ProvincesResponseMapper(provincesReq *entity.Provinces) (provincesRes *res.ProvincesResponse) { if provincesReq != nil { provincesRes = &res.ProvincesResponse{ - ID: provincesReq.ID, - ProvName: provincesReq.ProvName, - LocationId: provincesReq.LocationId, - Status: provincesReq.Status, - Timezone: provincesReq.Timezone, + ID: provincesReq.ID, + ProvName: provincesReq.ProvName, + LocationId: provincesReq.LocationId, + Status: provincesReq.Status, + Timezone: provincesReq.Timezone, } } return provincesRes -} \ No newline at end of file +} diff --git a/app/module/provinces/provinces.module.go b/app/module/provinces/provinces.module.go index 8c2bd8b..3f1fa40 100644 --- a/app/module/provinces/provinces.module.go +++ b/app/module/provinces/provinces.module.go @@ -2,10 +2,10 @@ package provinces import ( "github.com/gofiber/fiber/v2" - "go-humas-be/app/module/provinces/controller" - "go-humas-be/app/module/provinces/repository" - "go-humas-be/app/module/provinces/service" "go.uber.org/fx" + "web-medols-be/app/module/provinces/controller" + "web-medols-be/app/module/provinces/repository" + "web-medols-be/app/module/provinces/service" ) // struct of ProvincesRouter diff --git a/app/module/provinces/repository/provinces.repository.go b/app/module/provinces/repository/provinces.repository.go index 69a02a9..e7b8194 100644 --- a/app/module/provinces/repository/provinces.repository.go +++ b/app/module/provinces/repository/provinces.repository.go @@ -1,10 +1,10 @@ package repository import ( - "go-humas-be/app/database" - "go-humas-be/app/database/entity" - "go-humas-be/app/module/provinces/request" - "go-humas-be/utils/paginator" + "web-medols-be/app/database" + "web-medols-be/app/database/entity" + "web-medols-be/app/module/provinces/request" + "web-medols-be/utils/paginator" ) type provincesRepository struct { @@ -66,4 +66,4 @@ func (_i *provincesRepository) Update(id uint, provinces *entity.Provinces) (err func (_i *provincesRepository) Delete(id uint) error { return _i.DB.DB.Delete(&entity.Provinces{}, id).Error -} \ No newline at end of file +} diff --git a/app/module/provinces/request/provinces.request.go b/app/module/provinces/request/provinces.request.go index 25f3648..a57080e 100644 --- a/app/module/provinces/request/provinces.request.go +++ b/app/module/provinces/request/provinces.request.go @@ -1,8 +1,8 @@ package request import ( - "go-humas-be/app/database/entity" - "go-humas-be/utils/paginator" + "web-medols-be/app/database/entity" + "web-medols-be/utils/paginator" ) type ProvincesGeneric interface { @@ -10,44 +10,43 @@ type ProvincesGeneric interface { } type ProvincesQueryRequest struct { - ProvName string `json:"prov_name" validate:"required"` - LocationId int `json:"location_id" validate:"required"` - Status int `json:"status" validate:"required"` - Timezone string `json:"timezone" validate:"required"` - Pagination *paginator.Pagination `json:"pagination"` + ProvName string `json:"prov_name" validate:"required"` + LocationId int `json:"location_id" validate:"required"` + Status int `json:"status" validate:"required"` + Timezone string `json:"timezone" validate:"required"` + Pagination *paginator.Pagination `json:"pagination"` } - type ProvincesCreateRequest struct { - ProvName string `json:"prov_name" validate:"required"` - LocationId int `json:"location_id" validate:"required"` - Status int `json:"status" validate:"required"` - Timezone string `json:"timezone" validate:"required"` + ProvName string `json:"prov_name" validate:"required"` + LocationId int `json:"location_id" validate:"required"` + Status int `json:"status" validate:"required"` + Timezone string `json:"timezone" validate:"required"` } func (req ProvincesCreateRequest) ToEntity() *entity.Provinces { return &entity.Provinces{ - ProvName: req.ProvName, - LocationId: req.LocationId, - Status: req.Status, - Timezone: req.Timezone, + ProvName: req.ProvName, + LocationId: req.LocationId, + Status: req.Status, + Timezone: req.Timezone, } } type ProvincesUpdateRequest struct { - ID uint `json:"id" validate:"required"` - ProvName string `json:"prov_name" validate:"required"` - LocationId int `json:"location_id" validate:"required"` - Status int `json:"status" validate:"required"` - Timezone string `json:"timezone" validate:"required"` + ID uint `json:"id" validate:"required"` + ProvName string `json:"prov_name" validate:"required"` + LocationId int `json:"location_id" validate:"required"` + Status int `json:"status" validate:"required"` + Timezone string `json:"timezone" validate:"required"` } func (req ProvincesUpdateRequest) ToEntity() *entity.Provinces { return &entity.Provinces{ - ID: req.ID, - ProvName: req.ProvName, - LocationId: req.LocationId, - Status: req.Status, - Timezone: req.Timezone, + ID: req.ID, + ProvName: req.ProvName, + LocationId: req.LocationId, + Status: req.Status, + Timezone: req.Timezone, } -} \ No newline at end of file +} diff --git a/app/module/provinces/service/provinces.service.go b/app/module/provinces/service/provinces.service.go index 8231ed4..274098f 100644 --- a/app/module/provinces/service/provinces.service.go +++ b/app/module/provinces/service/provinces.service.go @@ -2,11 +2,11 @@ package service import ( "github.com/rs/zerolog" - "go-humas-be/app/module/provinces/mapper" - "go-humas-be/app/module/provinces/repository" - "go-humas-be/app/module/provinces/request" - "go-humas-be/app/module/provinces/response" - "go-humas-be/utils/paginator" + "web-medols-be/app/module/provinces/mapper" + "web-medols-be/app/module/provinces/repository" + "web-medols-be/app/module/provinces/request" + "web-medols-be/app/module/provinces/response" + "web-medols-be/utils/paginator" ) // ProvincesService diff --git a/app/module/subscription/controller/controller.go b/app/module/subscription/controller/controller.go index 6fcdf0d..36dde87 100644 --- a/app/module/subscription/controller/controller.go +++ b/app/module/subscription/controller/controller.go @@ -2,7 +2,7 @@ package controller import ( "github.com/rs/zerolog" - "go-humas-be/app/module/subscription/service" + "web-medols-be/app/module/subscription/service" ) type Controller struct { diff --git a/app/module/subscription/controller/subscription.controller.go b/app/module/subscription/controller/subscription.controller.go index ef9b6dd..a7e71a8 100644 --- a/app/module/subscription/controller/subscription.controller.go +++ b/app/module/subscription/controller/subscription.controller.go @@ -3,12 +3,12 @@ package controller import ( "github.com/gofiber/fiber/v2" "github.com/rs/zerolog" - "go-humas-be/app/module/subscription/request" - "go-humas-be/app/module/subscription/service" - "go-humas-be/utils/paginator" - utilRes "go-humas-be/utils/response" - utilVal "go-humas-be/utils/validator" "strconv" + "web-medols-be/app/module/subscription/request" + "web-medols-be/app/module/subscription/service" + "web-medols-be/utils/paginator" + utilRes "web-medols-be/utils/response" + utilVal "web-medols-be/utils/validator" ) type subscriptionController struct { diff --git a/app/module/subscription/mapper/subscription.mapper.go b/app/module/subscription/mapper/subscription.mapper.go index 828017b..f8f9c11 100644 --- a/app/module/subscription/mapper/subscription.mapper.go +++ b/app/module/subscription/mapper/subscription.mapper.go @@ -1,8 +1,8 @@ package mapper import ( - "go-humas-be/app/database/entity" - res "go-humas-be/app/module/subscription/response" + "web-medols-be/app/database/entity" + res "web-medols-be/app/module/subscription/response" ) func SubscriptionResponseMapper(subscriptionReq *entity.Subscription) (subscriptionRes *res.SubscriptionResponse) { diff --git a/app/module/subscription/repository/subscription.repository.go b/app/module/subscription/repository/subscription.repository.go index 3c3b9fb..af84d9b 100644 --- a/app/module/subscription/repository/subscription.repository.go +++ b/app/module/subscription/repository/subscription.repository.go @@ -3,11 +3,11 @@ package repository import ( "fmt" "github.com/rs/zerolog" - "go-humas-be/app/database" - "go-humas-be/app/database/entity" - "go-humas-be/app/module/subscription/request" - "go-humas-be/utils/paginator" "strings" + "web-medols-be/app/database" + "web-medols-be/app/database/entity" + "web-medols-be/app/module/subscription/request" + "web-medols-be/utils/paginator" ) type subscriptionRepository struct { diff --git a/app/module/subscription/request/subscription.request.go b/app/module/subscription/request/subscription.request.go index 8cac0d9..d8e7869 100644 --- a/app/module/subscription/request/subscription.request.go +++ b/app/module/subscription/request/subscription.request.go @@ -1,9 +1,9 @@ package request import ( - "go-humas-be/app/database/entity" - "go-humas-be/utils/paginator" "time" + "web-medols-be/app/database/entity" + "web-medols-be/utils/paginator" ) type SubscriptionGeneric interface { diff --git a/app/module/subscription/service/subscription.service.go b/app/module/subscription/service/subscription.service.go index 44ae628..f8e0ddf 100644 --- a/app/module/subscription/service/subscription.service.go +++ b/app/module/subscription/service/subscription.service.go @@ -2,13 +2,13 @@ package service import ( "github.com/rs/zerolog" - "go-humas-be/app/database/entity" - "go-humas-be/app/module/subscription/mapper" - "go-humas-be/app/module/subscription/repository" - "go-humas-be/app/module/subscription/request" - "go-humas-be/app/module/subscription/response" - usersRepository "go-humas-be/app/module/users/repository" - "go-humas-be/utils/paginator" + "web-medols-be/app/database/entity" + "web-medols-be/app/module/subscription/mapper" + "web-medols-be/app/module/subscription/repository" + "web-medols-be/app/module/subscription/request" + "web-medols-be/app/module/subscription/response" + usersRepository "web-medols-be/app/module/users/repository" + "web-medols-be/utils/paginator" ) // SubscriptionService diff --git a/app/module/subscription/subscription.module.go b/app/module/subscription/subscription.module.go index 2c701d6..09aa2a8 100644 --- a/app/module/subscription/subscription.module.go +++ b/app/module/subscription/subscription.module.go @@ -2,10 +2,10 @@ package subscription import ( "github.com/gofiber/fiber/v2" - "go-humas-be/app/module/subscription/controller" - "go-humas-be/app/module/subscription/repository" - "go-humas-be/app/module/subscription/service" "go.uber.org/fx" + "web-medols-be/app/module/subscription/controller" + "web-medols-be/app/module/subscription/repository" + "web-medols-be/app/module/subscription/service" ) // struct of SubscriptionRouter diff --git a/app/module/user_levels/controller/controller.go b/app/module/user_levels/controller/controller.go index d435da8..ea2e278 100644 --- a/app/module/user_levels/controller/controller.go +++ b/app/module/user_levels/controller/controller.go @@ -1,6 +1,6 @@ package controller -import "go-humas-be/app/module/user_levels/service" +import "web-medols-be/app/module/user_levels/service" type Controller struct { UserLevels UserLevelsController @@ -10,4 +10,4 @@ func NewController(UserLevelsService service.UserLevelsService) *Controller { return &Controller{ UserLevels: NewUserLevelsController(UserLevelsService), } -} \ No newline at end of file +} diff --git a/app/module/user_levels/controller/user_levels.controller.go b/app/module/user_levels/controller/user_levels.controller.go index 59ccafe..7c125ad 100644 --- a/app/module/user_levels/controller/user_levels.controller.go +++ b/app/module/user_levels/controller/user_levels.controller.go @@ -2,14 +2,14 @@ package controller import ( "github.com/gofiber/fiber/v2" - "go-humas-be/app/module/user_levels/request" - "go-humas-be/app/module/user_levels/service" - "go-humas-be/utils/paginator" "strconv" "strings" + "web-medols-be/app/module/user_levels/request" + "web-medols-be/app/module/user_levels/service" + "web-medols-be/utils/paginator" - utilRes "go-humas-be/utils/response" - utilVal "go-humas-be/utils/validator" + utilRes "web-medols-be/utils/response" + utilVal "web-medols-be/utils/validator" ) type userLevelsController struct { diff --git a/app/module/user_levels/mapper/user_levels.mapper.go b/app/module/user_levels/mapper/user_levels.mapper.go index 6ed7839..27a00b3 100644 --- a/app/module/user_levels/mapper/user_levels.mapper.go +++ b/app/module/user_levels/mapper/user_levels.mapper.go @@ -1,8 +1,8 @@ package mapper import ( - "go-humas-be/app/database/entity" - res "go-humas-be/app/module/user_levels/response" + "web-medols-be/app/database/entity" + res "web-medols-be/app/module/user_levels/response" ) func UserLevelsResponseMapper(userLevelsReq *entity.UserLevels) (userLevelsRes *res.UserLevelsResponse) { diff --git a/app/module/user_levels/repository/user_levels.repository.go b/app/module/user_levels/repository/user_levels.repository.go index ff86cf4..0965848 100644 --- a/app/module/user_levels/repository/user_levels.repository.go +++ b/app/module/user_levels/repository/user_levels.repository.go @@ -2,12 +2,12 @@ package repository import ( "fmt" - "go-humas-be/app/database" - "go-humas-be/app/database/entity" - "go-humas-be/app/module/user_levels/request" - "go-humas-be/utils/paginator" - utilSvc "go-humas-be/utils/service" "strings" + "web-medols-be/app/database" + "web-medols-be/app/database/entity" + "web-medols-be/app/module/user_levels/request" + "web-medols-be/utils/paginator" + utilSvc "web-medols-be/utils/service" ) type userLevelsRepository struct { diff --git a/app/module/user_levels/request/user_levels.request.go b/app/module/user_levels/request/user_levels.request.go index 4c715c0..8d06599 100644 --- a/app/module/user_levels/request/user_levels.request.go +++ b/app/module/user_levels/request/user_levels.request.go @@ -1,10 +1,10 @@ package request import ( - "go-humas-be/app/database/entity" - "go-humas-be/utils/paginator" "strconv" "time" + "web-medols-be/app/database/entity" + "web-medols-be/utils/paginator" ) type UserLevelsGeneric interface { diff --git a/app/module/user_levels/service/user_levels.service.go b/app/module/user_levels/service/user_levels.service.go index b370f9e..bfd9f85 100644 --- a/app/module/user_levels/service/user_levels.service.go +++ b/app/module/user_levels/service/user_levels.service.go @@ -2,12 +2,12 @@ package service import ( "github.com/rs/zerolog" - "go-humas-be/app/database/entity" - "go-humas-be/app/module/user_levels/mapper" - "go-humas-be/app/module/user_levels/repository" - "go-humas-be/app/module/user_levels/request" - "go-humas-be/app/module/user_levels/response" - "go-humas-be/utils/paginator" + "web-medols-be/app/database/entity" + "web-medols-be/app/module/user_levels/mapper" + "web-medols-be/app/module/user_levels/repository" + "web-medols-be/app/module/user_levels/request" + "web-medols-be/app/module/user_levels/response" + "web-medols-be/utils/paginator" ) // UserLevelsService diff --git a/app/module/user_levels/user_levels.module.go b/app/module/user_levels/user_levels.module.go index aad51a3..c408f81 100644 --- a/app/module/user_levels/user_levels.module.go +++ b/app/module/user_levels/user_levels.module.go @@ -2,10 +2,10 @@ package user_levels import ( "github.com/gofiber/fiber/v2" - "go-humas-be/app/module/user_levels/controller" - "go-humas-be/app/module/user_levels/repository" - "go-humas-be/app/module/user_levels/service" "go.uber.org/fx" + "web-medols-be/app/module/user_levels/controller" + "web-medols-be/app/module/user_levels/repository" + "web-medols-be/app/module/user_levels/service" ) // struct of UserLevelsRouter diff --git a/app/module/user_role_accesses/controller/controller.go b/app/module/user_role_accesses/controller/controller.go index 24e5f6b..2761762 100644 --- a/app/module/user_role_accesses/controller/controller.go +++ b/app/module/user_role_accesses/controller/controller.go @@ -1,6 +1,6 @@ package controller -import "go-humas-be/app/module/user_role_accesses/service" +import "web-medols-be/app/module/user_role_accesses/service" type Controller struct { UserRoleAccesses UserRoleAccessesController @@ -10,4 +10,4 @@ func NewController(UserRoleAccessesService service.UserRoleAccessesService) *Con return &Controller{ UserRoleAccesses: NewUserRoleAccessesController(UserRoleAccessesService), } -} \ No newline at end of file +} diff --git a/app/module/user_role_accesses/controller/user_role_accesses.controller.go b/app/module/user_role_accesses/controller/user_role_accesses.controller.go index 4ac26e4..d6be2a6 100644 --- a/app/module/user_role_accesses/controller/user_role_accesses.controller.go +++ b/app/module/user_role_accesses/controller/user_role_accesses.controller.go @@ -2,13 +2,13 @@ package controller import ( "github.com/gofiber/fiber/v2" - "go-humas-be/app/module/user_role_accesses/request" - "go-humas-be/app/module/user_role_accesses/service" - "go-humas-be/utils/paginator" "strconv" + "web-medols-be/app/module/user_role_accesses/request" + "web-medols-be/app/module/user_role_accesses/service" + "web-medols-be/utils/paginator" - utilRes "go-humas-be/utils/response" - utilVal "go-humas-be/utils/validator" + utilRes "web-medols-be/utils/response" + utilVal "web-medols-be/utils/validator" ) type userRoleAccessesController struct { diff --git a/app/module/user_role_accesses/mapper/user_role_accesses.mapper.go b/app/module/user_role_accesses/mapper/user_role_accesses.mapper.go index df81c3e..de83710 100644 --- a/app/module/user_role_accesses/mapper/user_role_accesses.mapper.go +++ b/app/module/user_role_accesses/mapper/user_role_accesses.mapper.go @@ -1,8 +1,8 @@ package mapper import ( - "go-humas-be/app/database/entity" - res "go-humas-be/app/module/user_role_accesses/response" + "web-medols-be/app/database/entity" + res "web-medols-be/app/module/user_role_accesses/response" ) func UserRoleAccessesResponseMapper(userRoleAccessesReq *entity.UserRoleAccesses) (userRoleAccessesRes *res.UserRoleAccessesResponse) { diff --git a/app/module/user_role_accesses/repository/user_role_accesses.repository.go b/app/module/user_role_accesses/repository/user_role_accesses.repository.go index 4c8a038..7f3b6b8 100644 --- a/app/module/user_role_accesses/repository/user_role_accesses.repository.go +++ b/app/module/user_role_accesses/repository/user_role_accesses.repository.go @@ -1,10 +1,10 @@ package repository import ( - "go-humas-be/app/database" - "go-humas-be/app/database/entity" - "go-humas-be/app/module/user_role_accesses/request" - "go-humas-be/utils/paginator" + "web-medols-be/app/database" + "web-medols-be/app/database/entity" + "web-medols-be/app/module/user_role_accesses/request" + "web-medols-be/utils/paginator" ) type userRoleAccessesRepository struct { diff --git a/app/module/user_role_accesses/request/user_role_accesses.request.go b/app/module/user_role_accesses/request/user_role_accesses.request.go index 4489a2d..46d8f52 100644 --- a/app/module/user_role_accesses/request/user_role_accesses.request.go +++ b/app/module/user_role_accesses/request/user_role_accesses.request.go @@ -1,10 +1,10 @@ package request import ( - "go-humas-be/app/database/entity" - "go-humas-be/utils/paginator" "strconv" "time" + "web-medols-be/app/database/entity" + "web-medols-be/utils/paginator" ) type UserRoleAccessesGeneric interface { diff --git a/app/module/user_role_accesses/service/user_role_accesses.service.go b/app/module/user_role_accesses/service/user_role_accesses.service.go index c103c3f..379f7ff 100644 --- a/app/module/user_role_accesses/service/user_role_accesses.service.go +++ b/app/module/user_role_accesses/service/user_role_accesses.service.go @@ -2,11 +2,11 @@ package service import ( "github.com/rs/zerolog" - "go-humas-be/app/module/user_role_accesses/mapper" - "go-humas-be/app/module/user_role_accesses/repository" - "go-humas-be/app/module/user_role_accesses/request" - "go-humas-be/app/module/user_role_accesses/response" - "go-humas-be/utils/paginator" + "web-medols-be/app/module/user_role_accesses/mapper" + "web-medols-be/app/module/user_role_accesses/repository" + "web-medols-be/app/module/user_role_accesses/request" + "web-medols-be/app/module/user_role_accesses/response" + "web-medols-be/utils/paginator" ) // UserRoleAccessesService diff --git a/app/module/user_role_accesses/user_role_accesses.module.go b/app/module/user_role_accesses/user_role_accesses.module.go index 62eea8f..e473866 100644 --- a/app/module/user_role_accesses/user_role_accesses.module.go +++ b/app/module/user_role_accesses/user_role_accesses.module.go @@ -2,10 +2,10 @@ package user_role_accesses import ( "github.com/gofiber/fiber/v2" - "go-humas-be/app/module/user_role_accesses/controller" - "go-humas-be/app/module/user_role_accesses/repository" - "go-humas-be/app/module/user_role_accesses/service" "go.uber.org/fx" + "web-medols-be/app/module/user_role_accesses/controller" + "web-medols-be/app/module/user_role_accesses/repository" + "web-medols-be/app/module/user_role_accesses/service" ) // struct of UserRoleAccessesRouter @@ -50,4 +50,4 @@ func (_i *UserRoleAccessesRouter) RegisterUserRoleAccessesRoutes() { router.Put("/:id", userRoleAccessesController.Update) router.Delete("/:id", userRoleAccessesController.Delete) }) -} \ No newline at end of file +} diff --git a/app/module/user_role_level_details/controller/controller.go b/app/module/user_role_level_details/controller/controller.go index b9ad9c2..4bcc65e 100644 --- a/app/module/user_role_level_details/controller/controller.go +++ b/app/module/user_role_level_details/controller/controller.go @@ -1,6 +1,6 @@ package controller -import "go-humas-be/app/module/user_role_level_details/service" +import "web-medols-be/app/module/user_role_level_details/service" type Controller struct { UserRoleLevelDetails UserRoleLevelDetailsController diff --git a/app/module/user_role_level_details/controller/user_role_level_details.controller.go b/app/module/user_role_level_details/controller/user_role_level_details.controller.go index a1073a8..5454e8a 100644 --- a/app/module/user_role_level_details/controller/user_role_level_details.controller.go +++ b/app/module/user_role_level_details/controller/user_role_level_details.controller.go @@ -2,13 +2,13 @@ package controller import ( "github.com/gofiber/fiber/v2" - "go-humas-be/app/module/user_role_level_details/request" - "go-humas-be/app/module/user_role_level_details/service" - "go-humas-be/utils/paginator" "strconv" + "web-medols-be/app/module/user_role_level_details/request" + "web-medols-be/app/module/user_role_level_details/service" + "web-medols-be/utils/paginator" - utilRes "go-humas-be/utils/response" - utilVal "go-humas-be/utils/validator" + utilRes "web-medols-be/utils/response" + utilVal "web-medols-be/utils/validator" ) type userRoleLevelDetailsController struct { diff --git a/app/module/user_role_level_details/mapper/user_role_level_details.mapper.go b/app/module/user_role_level_details/mapper/user_role_level_details.mapper.go index c5b3bef..9ade682 100644 --- a/app/module/user_role_level_details/mapper/user_role_level_details.mapper.go +++ b/app/module/user_role_level_details/mapper/user_role_level_details.mapper.go @@ -1,8 +1,8 @@ package mapper import ( - "go-humas-be/app/database/entity" - res "go-humas-be/app/module/user_role_level_details/response" + "web-medols-be/app/database/entity" + res "web-medols-be/app/module/user_role_level_details/response" ) func UserRoleLevelDetailsResponseMapper(userRoleLevelDetailsReq *entity.UserRoleLevelDetails) (userRoleLevelDetailsRes *res.UserRoleLevelDetailsResponse) { diff --git a/app/module/user_role_level_details/repository/user_role_level_details.repository.go b/app/module/user_role_level_details/repository/user_role_level_details.repository.go index 0d7c684..d9826dd 100644 --- a/app/module/user_role_level_details/repository/user_role_level_details.repository.go +++ b/app/module/user_role_level_details/repository/user_role_level_details.repository.go @@ -1,10 +1,10 @@ package repository import ( - "go-humas-be/app/database" - "go-humas-be/app/database/entity" - "go-humas-be/app/module/user_role_level_details/request" - "go-humas-be/utils/paginator" + "web-medols-be/app/database" + "web-medols-be/app/database/entity" + "web-medols-be/app/module/user_role_level_details/request" + "web-medols-be/utils/paginator" ) type userRoleLevelDetailsRepository struct { diff --git a/app/module/user_role_level_details/request/user_role_level_details.request.go b/app/module/user_role_level_details/request/user_role_level_details.request.go index 6345742..05c80f3 100644 --- a/app/module/user_role_level_details/request/user_role_level_details.request.go +++ b/app/module/user_role_level_details/request/user_role_level_details.request.go @@ -1,9 +1,9 @@ package request import ( - "go-humas-be/app/database/entity" - "go-humas-be/utils/paginator" "time" + "web-medols-be/app/database/entity" + "web-medols-be/utils/paginator" ) type UserRoleLevelDetailsGeneric interface { diff --git a/app/module/user_role_level_details/service/user_role_level_details.service.go b/app/module/user_role_level_details/service/user_role_level_details.service.go index 786cb8c..9929967 100644 --- a/app/module/user_role_level_details/service/user_role_level_details.service.go +++ b/app/module/user_role_level_details/service/user_role_level_details.service.go @@ -2,11 +2,11 @@ package service import ( "github.com/rs/zerolog" - "go-humas-be/app/module/user_role_level_details/mapper" - "go-humas-be/app/module/user_role_level_details/repository" - "go-humas-be/app/module/user_role_level_details/request" - "go-humas-be/app/module/user_role_level_details/response" - "go-humas-be/utils/paginator" + "web-medols-be/app/module/user_role_level_details/mapper" + "web-medols-be/app/module/user_role_level_details/repository" + "web-medols-be/app/module/user_role_level_details/request" + "web-medols-be/app/module/user_role_level_details/response" + "web-medols-be/utils/paginator" ) // UserRoleLevelDetailsService diff --git a/app/module/user_role_level_details/user_role_level_details.module.go b/app/module/user_role_level_details/user_role_level_details.module.go index 9e0c2db..b37d765 100644 --- a/app/module/user_role_level_details/user_role_level_details.module.go +++ b/app/module/user_role_level_details/user_role_level_details.module.go @@ -2,10 +2,10 @@ package user_role_level_details import ( "github.com/gofiber/fiber/v2" - "go-humas-be/app/module/user_role_level_details/controller" - "go-humas-be/app/module/user_role_level_details/repository" - "go-humas-be/app/module/user_role_level_details/service" "go.uber.org/fx" + "web-medols-be/app/module/user_role_level_details/controller" + "web-medols-be/app/module/user_role_level_details/repository" + "web-medols-be/app/module/user_role_level_details/service" ) // struct of UserRoleLevelDetailsRouter diff --git a/app/module/user_roles/controller/controller.go b/app/module/user_roles/controller/controller.go index 6ac8af5..41a3fc8 100644 --- a/app/module/user_roles/controller/controller.go +++ b/app/module/user_roles/controller/controller.go @@ -2,7 +2,7 @@ package controller import ( "github.com/rs/zerolog" - "go-humas-be/app/module/user_roles/service" + "web-medols-be/app/module/user_roles/service" ) type Controller struct { diff --git a/app/module/user_roles/controller/user_roles.controller.go b/app/module/user_roles/controller/user_roles.controller.go index 66e781a..d3a0724 100644 --- a/app/module/user_roles/controller/user_roles.controller.go +++ b/app/module/user_roles/controller/user_roles.controller.go @@ -3,12 +3,12 @@ package controller import ( "github.com/gofiber/fiber/v2" "github.com/rs/zerolog" - "go-humas-be/app/module/user_roles/request" - "go-humas-be/app/module/user_roles/service" - "go-humas-be/utils/paginator" - utilRes "go-humas-be/utils/response" - utilVal "go-humas-be/utils/validator" "strconv" + "web-medols-be/app/module/user_roles/request" + "web-medols-be/app/module/user_roles/service" + "web-medols-be/utils/paginator" + utilRes "web-medols-be/utils/response" + utilVal "web-medols-be/utils/validator" ) type userRolesController struct { diff --git a/app/module/user_roles/mapper/user_roles.mapper.go b/app/module/user_roles/mapper/user_roles.mapper.go index 9e02e35..990e68e 100644 --- a/app/module/user_roles/mapper/user_roles.mapper.go +++ b/app/module/user_roles/mapper/user_roles.mapper.go @@ -1,8 +1,8 @@ package mapper import ( - "go-humas-be/app/database/entity" - res "go-humas-be/app/module/user_roles/response" + "web-medols-be/app/database/entity" + res "web-medols-be/app/module/user_roles/response" ) func UserRolesResponseMapper(userRolesReq *entity.UserRoles) (userRolesRes *res.UserRolesResponse) { diff --git a/app/module/user_roles/repository/user_roles.repository.go b/app/module/user_roles/repository/user_roles.repository.go index 148de42..e8424ba 100644 --- a/app/module/user_roles/repository/user_roles.repository.go +++ b/app/module/user_roles/repository/user_roles.repository.go @@ -3,12 +3,12 @@ package repository import ( "fmt" "github.com/rs/zerolog" - "go-humas-be/app/database" - "go-humas-be/app/database/entity" - "go-humas-be/app/module/user_roles/request" - "go-humas-be/utils/paginator" - utilSvc "go-humas-be/utils/service" "strings" + "web-medols-be/app/database" + "web-medols-be/app/database/entity" + "web-medols-be/app/module/user_roles/request" + "web-medols-be/utils/paginator" + utilSvc "web-medols-be/utils/service" ) type userRolesRepository struct { diff --git a/app/module/user_roles/request/user_roles.request.go b/app/module/user_roles/request/user_roles.request.go index b1b8025..8e498f5 100644 --- a/app/module/user_roles/request/user_roles.request.go +++ b/app/module/user_roles/request/user_roles.request.go @@ -1,11 +1,11 @@ package request import ( - "go-humas-be/app/database/entity" - userRoleAccessReq "go-humas-be/app/module/user_role_accesses/request" - "go-humas-be/utils/paginator" "strconv" "time" + "web-medols-be/app/database/entity" + userRoleAccessReq "web-medols-be/app/module/user_role_accesses/request" + "web-medols-be/utils/paginator" ) type UserRolesGeneric interface { diff --git a/app/module/user_roles/service/user_roles.service.go b/app/module/user_roles/service/user_roles.service.go index dff12f2..12ac9b8 100644 --- a/app/module/user_roles/service/user_roles.service.go +++ b/app/module/user_roles/service/user_roles.service.go @@ -2,17 +2,17 @@ package service import ( "github.com/rs/zerolog" - "go-humas-be/app/database/entity" - userLevelsRepository "go-humas-be/app/module/user_levels/repository" - userRoleAccessRepository "go-humas-be/app/module/user_role_accesses/repository" - userRoleLevelDetailsRepository "go-humas-be/app/module/user_role_level_details/repository" - "go-humas-be/app/module/user_roles/mapper" - "go-humas-be/app/module/user_roles/repository" - "go-humas-be/app/module/user_roles/request" - "go-humas-be/app/module/user_roles/response" - usersRepository "go-humas-be/app/module/users/repository" - "go-humas-be/utils/paginator" - utilSvc "go-humas-be/utils/service" + "web-medols-be/app/database/entity" + userLevelsRepository "web-medols-be/app/module/user_levels/repository" + userRoleAccessRepository "web-medols-be/app/module/user_role_accesses/repository" + userRoleLevelDetailsRepository "web-medols-be/app/module/user_role_level_details/repository" + "web-medols-be/app/module/user_roles/mapper" + "web-medols-be/app/module/user_roles/repository" + "web-medols-be/app/module/user_roles/request" + "web-medols-be/app/module/user_roles/response" + usersRepository "web-medols-be/app/module/users/repository" + "web-medols-be/utils/paginator" + utilSvc "web-medols-be/utils/service" ) // UserRolesService diff --git a/app/module/user_roles/user_roles.module.go b/app/module/user_roles/user_roles.module.go index 674c6e3..1f9d86d 100644 --- a/app/module/user_roles/user_roles.module.go +++ b/app/module/user_roles/user_roles.module.go @@ -2,10 +2,10 @@ package user_roles import ( "github.com/gofiber/fiber/v2" - "go-humas-be/app/module/user_roles/controller" - "go-humas-be/app/module/user_roles/repository" - "go-humas-be/app/module/user_roles/service" "go.uber.org/fx" + "web-medols-be/app/module/user_roles/controller" + "web-medols-be/app/module/user_roles/repository" + "web-medols-be/app/module/user_roles/service" ) // struct of UserRolesRouter diff --git a/app/module/users/controller/controller.go b/app/module/users/controller/controller.go index 5def7a5..8768992 100644 --- a/app/module/users/controller/controller.go +++ b/app/module/users/controller/controller.go @@ -1,6 +1,6 @@ package controller -import "go-humas-be/app/module/users/service" +import "web-medols-be/app/module/users/service" type Controller struct { Users UsersController @@ -10,4 +10,4 @@ func NewController(UsersService service.UsersService) *Controller { return &Controller{ Users: NewUsersController(UsersService), } -} \ No newline at end of file +} diff --git a/app/module/users/controller/users.controller.go b/app/module/users/controller/users.controller.go index cb63983..3856df6 100644 --- a/app/module/users/controller/users.controller.go +++ b/app/module/users/controller/users.controller.go @@ -3,13 +3,14 @@ package controller import ( "github.com/gofiber/fiber/v2" _ "github.com/gofiber/fiber/v2" - "go-humas-be/app/module/users/request" - "go-humas-be/app/module/users/service" - "go-humas-be/utils/paginator" "strconv" + "web-medols-be/app/middleware" + "web-medols-be/app/module/users/request" + "web-medols-be/app/module/users/service" + "web-medols-be/utils/paginator" - utilRes "go-humas-be/utils/response" - utilVal "go-humas-be/utils/validator" + utilRes "web-medols-be/utils/response" + utilVal "web-medols-be/utils/validator" ) type usersController struct { @@ -76,7 +77,10 @@ func (_i *usersController) All(c *fiber.Ctx) error { req := reqContext.ToParamRequest() req.Pagination = paginate - usersData, paging, err := _i.usersService.All(req) + // Get ClientId from context + clientId := middleware.GetClientID(c) + + usersData, paging, err := _i.usersService.All(clientId, req) if err != nil { return err } @@ -106,7 +110,10 @@ func (_i *usersController) Show(c *fiber.Ctx) error { return err } - usersData, err := _i.usersService.Show(uint(id)) + // Get ClientId from context + clientId := middleware.GetClientID(c) + + usersData, err := _i.usersService.Show(clientId, uint(id)) if err != nil { return err } @@ -132,7 +139,10 @@ func (_i *usersController) Show(c *fiber.Ctx) error { func (_i *usersController) ShowByUsername(c *fiber.Ctx) error { username := c.Params("username") - usersData, err := _i.usersService.ShowByUsername(username) + // Get ClientId from context + clientId := middleware.GetClientID(c) + + usersData, err := _i.usersService.ShowByUsername(clientId, username) if err != nil { return err } @@ -157,7 +167,11 @@ func (_i *usersController) ShowByUsername(c *fiber.Ctx) error { // @Router /users/info [get] func (_i *usersController) ShowInfo(c *fiber.Ctx) error { authToken := c.Get("Authorization") - dataResult, err := _i.usersService.ShowUserInfo(authToken) + + // Get ClientId from context + clientId := middleware.GetClientID(c) + + dataResult, err := _i.usersService.ShowUserInfo(clientId, authToken) if err != nil { return err } @@ -190,7 +204,10 @@ func (_i *usersController) Save(c *fiber.Ctx) error { authToken := c.Get("Authorization") - dataResult, err := _i.usersService.Save(*req, authToken) + // Get ClientId from context + clientId := middleware.GetClientID(c) + + dataResult, err := _i.usersService.Save(clientId, *req, authToken) if err != nil { return err } @@ -226,7 +243,10 @@ func (_i *usersController) Update(c *fiber.Ctx) error { return err } - err = _i.usersService.Update(uint(id), *req) + // Get ClientId from context + clientId := middleware.GetClientID(c) + + err = _i.usersService.Update(clientId, uint(id), *req) if err != nil { return err } @@ -323,7 +343,10 @@ func (_i *usersController) Delete(c *fiber.Ctx) error { return err } - err = _i.usersService.Delete(uint(id)) + // Get ClientId from context + clientId := middleware.GetClientID(c) + + err = _i.usersService.Delete(clientId, uint(id)) if err != nil { return err } @@ -355,7 +378,10 @@ func (_i *usersController) SavePassword(c *fiber.Ctx) error { authToken := c.Get("Authorization") - err := _i.usersService.SavePassword(*req, authToken) + // Get ClientId from context + clientId := middleware.GetClientID(c) + + err := _i.usersService.SavePassword(clientId, *req, authToken) if err != nil { return err } @@ -413,7 +439,10 @@ func (_i *usersController) ForgotPassword(c *fiber.Ctx) error { return err } - err := _i.usersService.ForgotPassword(*req) + // Get ClientId from context + clientId := middleware.GetClientID(c) + + err := _i.usersService.ForgotPassword(clientId, *req) if err != nil { return err } @@ -500,7 +529,10 @@ func (_i *usersController) EmailValidation(c *fiber.Ctx) error { return err } - messageResponse, err := _i.usersService.EmailValidationPreLogin(*req) + // Get ClientId from context + clientId := middleware.GetClientID(c) + + messageResponse, err := _i.usersService.EmailValidationPreLogin(clientId, *req) if err != nil { return err } diff --git a/app/module/users/mapper/users.mapper.go b/app/module/users/mapper/users.mapper.go index f6878ee..d226c71 100644 --- a/app/module/users/mapper/users.mapper.go +++ b/app/module/users/mapper/users.mapper.go @@ -1,9 +1,9 @@ package mapper import ( - "go-humas-be/app/database/entity/users" - userLevelsRepository "go-humas-be/app/module/user_levels/repository" - res "go-humas-be/app/module/users/response" + "web-medols-be/app/database/entity/users" + userLevelsRepository "web-medols-be/app/module/user_levels/repository" + res "web-medols-be/app/module/users/response" ) func UsersResponseMapper(usersReq *users.Users, userLevelsRepo userLevelsRepository.UserLevelsRepository) (usersRes *res.UsersResponse) { diff --git a/app/module/users/repository/users.repository.go b/app/module/users/repository/users.repository.go index d453854..d03a615 100644 --- a/app/module/users/repository/users.repository.go +++ b/app/module/users/repository/users.repository.go @@ -3,13 +3,14 @@ package repository import ( "encoding/json" "fmt" + "github.com/google/uuid" "github.com/rs/zerolog" - "go-humas-be/app/database" - "go-humas-be/app/database/entity" - "go-humas-be/app/database/entity/users" - "go-humas-be/app/module/users/request" - "go-humas-be/utils/paginator" "strings" + "web-medols-be/app/database" + "web-medols-be/app/database/entity" + "web-medols-be/app/database/entity/users" + "web-medols-be/app/module/users/request" + "web-medols-be/utils/paginator" ) type usersRepository struct { @@ -19,13 +20,13 @@ type usersRepository struct { // UsersRepository define interface of IUsersRepository type UsersRepository interface { - GetAll(req request.UsersQueryRequest) (userss []*users.Users, paging paginator.Pagination, err error) - FindOne(id uint) (users *users.Users, err error) + GetAll(clientId *uuid.UUID, req request.UsersQueryRequest) (userss []*users.Users, paging paginator.Pagination, err error) + FindOne(clientId *uuid.UUID, id uint) (users *users.Users, err error) FindByKeycloakId(keycloakId string) (users *users.Users, err error) - FindByUsername(username string) (users *users.Users, err error) + FindByUsername(clientId *uuid.UUID, username string) (users *users.Users, err error) Create(users *users.Users) (userReturn *users.Users, err error) - Update(id uint, users *users.Users) (err error) - Delete(id uint) (err error) + Update(clientId *uuid.UUID, id uint, users *users.Users) (err error) + Delete(clientId *uuid.UUID, id uint) (err error) CreateForgotPassword(forgotPasswords *entity.ForgotPasswords) (err error) UpdateForgotPassword(id uint, forgotPasswords *entity.ForgotPasswords) (err error) FindForgotPassword(keycloakId string, code string) (forgotPasswords *entity.ForgotPasswords, err error) @@ -42,10 +43,16 @@ func NewUsersRepository(db *database.Database, log zerolog.Logger) UsersReposito } // implement interface of IUsersRepository -func (_i *usersRepository) GetAll(req request.UsersQueryRequest) (userss []*users.Users, paging paginator.Pagination, err error) { +func (_i *usersRepository) GetAll(clientId *uuid.UUID, req request.UsersQueryRequest) (userss []*users.Users, paging paginator.Pagination, err error) { var count int64 query := _i.DB.DB.Model(&users.Users{}) + + // Add ClientId filter + if clientId != nil { + query = query.Where("client_id = ?", clientId) + } + query = query.Where("is_active = ?", true) if req.Username != nil && *req.Username != "" { @@ -109,8 +116,15 @@ func (_i *usersRepository) GetAll(req request.UsersQueryRequest) (userss []*user return } -func (_i *usersRepository) FindOne(id uint) (users *users.Users, err error) { - if err := _i.DB.DB.Preload("UserLevel").First(&users, id).Error; err != nil { +func (_i *usersRepository) FindOne(clientId *uuid.UUID, id uint) (users *users.Users, err error) { + query := _i.DB.DB.Where("id = ?", id) + + // Add ClientId filter + if clientId != nil { + query = query.Where("client_id = ?", clientId) + } + + if err := query.Preload("UserLevel").First(&users).Error; err != nil { return nil, err } @@ -118,15 +132,23 @@ func (_i *usersRepository) FindOne(id uint) (users *users.Users, err error) { } func (_i *usersRepository) FindByKeycloakId(keycloakId string) (users *users.Users, err error) { - if err := _i.DB.DB.Where("keycloak_id = ?", keycloakId).Preload("UserLevel").First(&users).Error; err != nil { + query := _i.DB.DB.Where("keycloak_id = ?", keycloakId) + if err := query.Preload("UserLevel").First(&users).Error; err != nil { return nil, err } return users, nil } -func (_i *usersRepository) FindByUsername(username string) (users *users.Users, err error) { - if err := _i.DB.DB.Where("username = ?", username).Preload("UserLevel").First(&users).Error; err != nil { +func (_i *usersRepository) FindByUsername(clientId *uuid.UUID, username string) (users *users.Users, err error) { + query := _i.DB.DB.Where("username = ?", username) + + // Add ClientId filter + if clientId != nil { + query = query.Where("client_id = ?", clientId) + } + + if err := query.Preload("UserLevel").First(&users).Error; err != nil { return nil, err } @@ -138,20 +160,26 @@ func (_i *usersRepository) Create(users *users.Users) (userReturn *users.Users, return users, result.Error } -func (_i *usersRepository) Update(id uint, userReturn *users.Users) (err error) { +func (_i *usersRepository) Update(clientId *uuid.UUID, id uint, userReturn *users.Users) (err error) { userReturnMap, err := StructToMap(userReturn) delete(userReturnMap, "user_levels") _i.Log.Info().Interface("Update", userReturnMap).Msg("") if err != nil { return err } - return _i.DB.DB.Model(&users.Users{}). - Where(&users.Users{ID: id}). - Updates(userReturnMap).Error + query := _i.DB.DB.Model(&users.Users{}).Where(&users.Users{ID: id}) + if clientId != nil { + query = query.Where("client_id = ?", clientId) + } + return query.Updates(userReturnMap).Error } -func (_i *usersRepository) Delete(id uint) error { - return _i.DB.DB.Delete(&users.Users{}, id).Error +func (_i *usersRepository) Delete(clientId *uuid.UUID, id uint) error { + query := _i.DB.DB.Model(&users.Users{}).Where("id = ?", id) + if clientId != nil { + query = query.Where("client_id = ?", clientId) + } + return query.Delete(&users.Users{}).Error } func (_i *usersRepository) CreateForgotPassword(forgotPasswords *entity.ForgotPasswords) (err error) { diff --git a/app/module/users/request/users.request.go b/app/module/users/request/users.request.go index 02ef8f4..66228f1 100644 --- a/app/module/users/request/users.request.go +++ b/app/module/users/request/users.request.go @@ -1,10 +1,10 @@ package request import ( - "go-humas-be/app/database/entity/users" - "go-humas-be/utils/paginator" "strconv" "time" + "web-medols-be/app/database/entity/users" + "web-medols-be/utils/paginator" ) type UsersGeneric interface { diff --git a/app/module/users/service/users.service.go b/app/module/users/service/users.service.go index d2d296c..d99a3df 100644 --- a/app/module/users/service/users.service.go +++ b/app/module/users/service/users.service.go @@ -6,19 +6,20 @@ import ( "encoding/json" "fmt" "github.com/Nerzal/gocloak/v13" + "github.com/google/uuid" "github.com/rs/zerolog" - "go-humas-be/app/database/entity" - "go-humas-be/app/database/entity/users" - userLevelsRepository "go-humas-be/app/module/user_levels/repository" - "go-humas-be/app/module/users/mapper" - "go-humas-be/app/module/users/repository" - "go-humas-be/app/module/users/request" - "go-humas-be/app/module/users/response" - "go-humas-be/config/config" - "go-humas-be/utils/paginator" - utilSvc "go-humas-be/utils/service" "strings" "time" + "web-medols-be/app/database/entity" + "web-medols-be/app/database/entity/users" + userLevelsRepository "web-medols-be/app/module/user_levels/repository" + "web-medols-be/app/module/users/mapper" + "web-medols-be/app/module/users/repository" + "web-medols-be/app/module/users/request" + "web-medols-be/app/module/users/response" + "web-medols-be/config/config" + "web-medols-be/utils/paginator" + utilSvc "web-medols-be/utils/service" ) // UsersService @@ -32,19 +33,19 @@ type usersService struct { // UsersService define interface of IUsersService type UsersService interface { - All(req request.UsersQueryRequest) (users []*response.UsersResponse, paging paginator.Pagination, err error) - Show(id uint) (users *response.UsersResponse, err error) - ShowByUsername(username string) (users *response.UsersResponse, err error) - ShowUserInfo(authToken string) (users *response.UsersResponse, err error) - Save(req request.UsersCreateRequest, authToken string) (userReturn *users.Users, err error) + All(clientId *uuid.UUID, req request.UsersQueryRequest) (users []*response.UsersResponse, paging paginator.Pagination, err error) + Show(clientId *uuid.UUID, id uint) (users *response.UsersResponse, err error) + ShowByUsername(clientId *uuid.UUID, username string) (users *response.UsersResponse, err error) + ShowUserInfo(clientId *uuid.UUID, authToken string) (users *response.UsersResponse, err error) + Save(clientId *uuid.UUID, req request.UsersCreateRequest, authToken string) (userReturn *users.Users, err error) Login(req request.UserLogin) (res *gocloak.JWT, err error) ParetoLogin(req request.UserLogin) (res *response.ParetoLoginResponse, err error) - Update(id uint, req request.UsersUpdateRequest) (err error) - Delete(id uint) error - SavePassword(req request.UserSavePassword, authToken string) (err error) + Update(clientId *uuid.UUID, id uint, req request.UsersUpdateRequest) (err error) + Delete(clientId *uuid.UUID, id uint) error + SavePassword(clientId *uuid.UUID, req request.UserSavePassword, authToken string) (err error) ResetPassword(req request.UserResetPassword) (err error) - ForgotPassword(req request.UserForgotPassword) (err error) - EmailValidationPreLogin(req request.UserEmailValidationRequest) (msgResponse *string, err error) + ForgotPassword(clientId *uuid.UUID, req request.UserForgotPassword) (err error) + EmailValidationPreLogin(clientId *uuid.UUID, req request.UserEmailValidationRequest) (msgResponse *string, err error) SetupEmail(req request.UserEmailValidationRequest) (msgResponse *string, err error) OtpRequest(req request.UserOtpRequest) (err error) OtpValidation(req request.UserOtpValidation) (err error) @@ -65,8 +66,8 @@ func NewUsersService(repo repository.UsersRepository, userLevelsRepo userLevelsR } // All implement interface of UsersService -func (_i *usersService) All(req request.UsersQueryRequest) (users []*response.UsersResponse, paging paginator.Pagination, err error) { - results, paging, err := _i.Repo.GetAll(req) +func (_i *usersService) All(clientId *uuid.UUID, req request.UsersQueryRequest) (users []*response.UsersResponse, paging paginator.Pagination, err error) { + results, paging, err := _i.Repo.GetAll(clientId, req) if err != nil { return } @@ -78,8 +79,8 @@ func (_i *usersService) All(req request.UsersQueryRequest) (users []*response.Us return } -func (_i *usersService) Show(id uint) (users *response.UsersResponse, err error) { - result, err := _i.Repo.FindOne(id) +func (_i *usersService) Show(clientId *uuid.UUID, id uint) (users *response.UsersResponse, err error) { + result, err := _i.Repo.FindOne(clientId, id) if err != nil { return nil, err } @@ -87,8 +88,8 @@ func (_i *usersService) Show(id uint) (users *response.UsersResponse, err error) return mapper.UsersResponseMapper(result, _i.UserLevelsRepo), nil } -func (_i *usersService) ShowByUsername(username string) (users *response.UsersResponse, err error) { - result, err := _i.Repo.FindByUsername(username) +func (_i *usersService) ShowByUsername(clientId *uuid.UUID, username string) (users *response.UsersResponse, err error) { + result, err := _i.Repo.FindByUsername(clientId, username) if err != nil { return nil, err } @@ -96,13 +97,13 @@ func (_i *usersService) ShowByUsername(username string) (users *response.UsersRe return mapper.UsersResponseMapper(result, _i.UserLevelsRepo), nil } -func (_i *usersService) ShowUserInfo(authToken string) (users *response.UsersResponse, err error) { +func (_i *usersService) ShowUserInfo(clientId *uuid.UUID, authToken string) (users *response.UsersResponse, err error) { userInfo := utilSvc.GetUserInfo(_i.Log, _i.Repo, authToken) return mapper.UsersResponseMapper(userInfo, _i.UserLevelsRepo), nil } -func (_i *usersService) Save(req request.UsersCreateRequest, authToken string) (userReturn *users.Users, err error) { +func (_i *usersService) Save(clientId *uuid.UUID, req request.UsersCreateRequest, authToken string) (userReturn *users.Users, err error) { _i.Log.Info().Interface("data", req).Msg("") newReq := req.ToEntity() @@ -121,6 +122,9 @@ func (_i *usersService) Save(req request.UsersCreateRequest, authToken string) ( newReq.KeycloakId = &keycloakId newReq.TempPassword = &req.Password + // Set ClientId on entity + newReq.ClientId = clientId + return _i.Repo.Create(newReq) } @@ -214,11 +218,11 @@ func (_i *usersService) ParetoLogin(req request.UserLogin) (res *response.Pareto return resLogin, nil } -func (_i *usersService) Update(id uint, req request.UsersUpdateRequest) (err error) { +func (_i *usersService) Update(clientId *uuid.UUID, id uint, req request.UsersUpdateRequest) (err error) { _i.Log.Info().Interface("data", req).Msg("") newReq := req.ToEntity() - findUser, err := _i.Repo.FindOne(id) + findUser, err := _i.Repo.FindOne(clientId, id) if err != nil { return err } @@ -228,21 +232,24 @@ func (_i *usersService) Update(id uint, req request.UsersUpdateRequest) (err err return err } - return _i.Repo.Update(id, newReq) + // Set ClientId on entity + newReq.ClientId = clientId + + return _i.Repo.Update(clientId, id, newReq) } -func (_i *usersService) Delete(id uint) error { - result, err := _i.Repo.FindOne(id) +func (_i *usersService) Delete(clientId *uuid.UUID, id uint) error { + result, err := _i.Repo.FindOne(clientId, id) if err != nil { return err } isActive := false result.IsActive = &isActive - return _i.Repo.Update(id, result) + return _i.Repo.Update(clientId, id, result) } -func (_i *usersService) SavePassword(req request.UserSavePassword, authToken string) (err error) { +func (_i *usersService) SavePassword(clientId *uuid.UUID, req request.UserSavePassword, authToken string) (err error) { _i.Log.Info().Interface("data", req).Msg("") _i.Log.Info().Interface("AUTH TOKEN", authToken).Msg("") @@ -303,10 +310,10 @@ func (_i *usersService) ResetPassword(req request.UserResetPassword) (err error) } } -func (_i *usersService) ForgotPassword(req request.UserForgotPassword) (err error) { +func (_i *usersService) ForgotPassword(clientId *uuid.UUID, req request.UserForgotPassword) (err error) { _i.Log.Info().Interface("data", req).Msg("") - user, err := _i.Repo.FindByUsername(req.Username) + user, err := _i.Repo.FindByUsername(clientId, req.Username) if err != nil { return err } @@ -400,7 +407,7 @@ func (_i *usersService) OtpValidation(req request.UserOtpValidation) (err error) } } -func (_i *usersService) EmailValidationPreLogin(req request.UserEmailValidationRequest) (msgResponse *string, err error) { +func (_i *usersService) EmailValidationPreLogin(clientId *uuid.UUID, req request.UserEmailValidationRequest) (msgResponse *string, err error) { _i.Log.Info().Interface("data", req).Msg("") var loginResponse *gocloak.JWT @@ -410,7 +417,7 @@ func (_i *usersService) EmailValidationPreLogin(req request.UserEmailValidationR return nil, fmt.Errorf("username / password incorrect") } - findUser, err := _i.Repo.FindByUsername(*req.Username) + findUser, err := _i.Repo.FindByUsername(clientId, *req.Username) if findUser == nil || err != nil { return nil, fmt.Errorf("username / password incorrect") } diff --git a/app/module/users/users.module.go b/app/module/users/users.module.go index 26673fb..216a320 100644 --- a/app/module/users/users.module.go +++ b/app/module/users/users.module.go @@ -2,10 +2,10 @@ package users import ( "github.com/gofiber/fiber/v2" - "go-humas-be/app/module/users/controller" - "go-humas-be/app/module/users/repository" - "go-humas-be/app/module/users/service" "go.uber.org/fx" + "web-medols-be/app/module/users/controller" + "web-medols-be/app/module/users/repository" + "web-medols-be/app/module/users/service" ) // struct of UsersRouter diff --git a/app/router/api.go b/app/router/api.go index bfd1295..4c9ecc6 100644 --- a/app/router/api.go +++ b/app/router/api.go @@ -3,31 +3,32 @@ package router import ( swagger "github.com/arsmn/fiber-swagger/v2" "github.com/gofiber/fiber/v2" - "go-humas-be/app/module/activity_logs" - "go-humas-be/app/module/advertisement" - "go-humas-be/app/module/article_approvals" - "go-humas-be/app/module/article_categories" - "go-humas-be/app/module/article_category_details" - "go-humas-be/app/module/article_comments" - "go-humas-be/app/module/article_files" - "go-humas-be/app/module/article_nulis_ai" - "go-humas-be/app/module/articles" - "go-humas-be/app/module/cities" - "go-humas-be/app/module/custom_static_pages" - "go-humas-be/app/module/districts" - "go-humas-be/app/module/feedbacks" - "go-humas-be/app/module/magazine_files" - "go-humas-be/app/module/magazines" - "go-humas-be/app/module/master_menus" - "go-humas-be/app/module/master_modules" - "go-humas-be/app/module/provinces" - "go-humas-be/app/module/subscription" - "go-humas-be/app/module/user_levels" - "go-humas-be/app/module/user_role_accesses" - "go-humas-be/app/module/user_roles" - "go-humas-be/app/module/users" - "go-humas-be/config/config" - _ "go-humas-be/docs/swagger" + "web-medols-be/app/module/activity_logs" + "web-medols-be/app/module/advertisement" + "web-medols-be/app/module/article_approvals" + "web-medols-be/app/module/article_categories" + "web-medols-be/app/module/article_category_details" + "web-medols-be/app/module/article_comments" + "web-medols-be/app/module/article_files" + "web-medols-be/app/module/article_nulis_ai" + "web-medols-be/app/module/articles" + "web-medols-be/app/module/cities" + "web-medols-be/app/module/clients" + "web-medols-be/app/module/custom_static_pages" + "web-medols-be/app/module/districts" + "web-medols-be/app/module/feedbacks" + "web-medols-be/app/module/magazine_files" + "web-medols-be/app/module/magazines" + "web-medols-be/app/module/master_menus" + "web-medols-be/app/module/master_modules" + "web-medols-be/app/module/provinces" + "web-medols-be/app/module/subscription" + "web-medols-be/app/module/user_levels" + "web-medols-be/app/module/user_role_accesses" + "web-medols-be/app/module/user_roles" + "web-medols-be/app/module/users" + "web-medols-be/config/config" + _ "web-medols-be/docs/swagger" ) type Router struct { @@ -44,6 +45,7 @@ type Router struct { ArticlesRouter *articles.ArticlesRouter ArticleNulisAIRouter *article_nulis_ai.ArticleNulisAIRouter CitiesRouter *cities.CitiesRouter + ClientsRouter *clients.ClientsRouter CustomStaticPagesRouter *custom_static_pages.CustomStaticPagesRouter DistrictsRouter *districts.DistrictsRouter FeedbacksRouter *feedbacks.FeedbacksRouter @@ -73,6 +75,7 @@ func NewRouter( articlesRouter *articles.ArticlesRouter, articleNulisRouter *article_nulis_ai.ArticleNulisAIRouter, citiesRouter *cities.CitiesRouter, + clientsRouter *clients.ClientsRouter, customStaticPagesRouter *custom_static_pages.CustomStaticPagesRouter, districtsRouter *districts.DistrictsRouter, feedbacksRouter *feedbacks.FeedbacksRouter, @@ -100,6 +103,7 @@ func NewRouter( ArticlesRouter: articlesRouter, ArticleNulisAIRouter: articleNulisRouter, CitiesRouter: citiesRouter, + ClientsRouter: clientsRouter, CustomStaticPagesRouter: customStaticPagesRouter, DistrictsRouter: districtsRouter, FeedbacksRouter: feedbacksRouter, @@ -137,6 +141,7 @@ func (r *Router) Register() { r.ArticleCommentsRouter.RegisterArticleCommentsRoutes() r.ArticleNulisAIRouter.RegisterArticleNulisAIRoutes() r.CitiesRouter.RegisterCitiesRoutes() + r.ClientsRouter.RegisterClientsRoutes() r.CustomStaticPagesRouter.RegisterCustomStaticPagesRoutes() r.DistrictsRouter.RegisterDistrictsRoutes() r.FeedbacksRouter.RegisterFeedbacksRoutes() diff --git a/config/logger/index.logger.go b/config/logger/index.logger.go index beac391..6b7e72d 100644 --- a/config/logger/index.logger.go +++ b/config/logger/index.logger.go @@ -3,8 +3,8 @@ package logger import ( "github.com/rs/zerolog" "github.com/rs/zerolog/log" - "go-humas-be/config/config" "os" + "web-medols-be/config/config" ) // NewLogger : initialize logger diff --git a/config/toml/config.toml b/config/toml/config.toml index 2ed3205..d0ce50b 100644 --- a/config/toml/config.toml +++ b/config/toml/config.toml @@ -12,10 +12,10 @@ production = false body-limit = 1048576000 # "100 * 1024 * 1024" [db.postgres] -dsn = "postgresql://humas_user:HumasDB@2024@38.47.180.165:5432/humas_db" # ://:@:/ +dsn = "postgresql://medols_user:MedolsDB@2025@38.47.180.165:5432/medols_db" # ://:@:/ log-mode = "NONE" -migrate = false -seed = false +migrate = true +seed = true [logger] log-dir = "debug.log" diff --git a/config/webserver/webserver.config.go b/config/webserver/webserver.config.go index 30eaa76..0906b27 100644 --- a/config/webserver/webserver.config.go +++ b/config/webserver/webserver.config.go @@ -8,18 +8,18 @@ import ( "github.com/gofiber/fiber/v2" futils "github.com/gofiber/fiber/v2/utils" "github.com/rs/zerolog" - "go-humas-be/app/database" - "go-humas-be/app/database/seeds" - md "go-humas-be/app/middleware" - articlesService "go-humas-be/app/module/articles/service" - "go-humas-be/app/router" - "go-humas-be/config/config" - "go-humas-be/utils/response" "go.uber.org/fx" "os" "runtime" "strings" "time" + "web-medols-be/app/database" + "web-medols-be/app/database/seeds" + md "web-medols-be/app/middleware" + articlesService "web-medols-be/app/module/articles/service" + "web-medols-be/app/router" + "web-medols-be/config/config" + "web-medols-be/utils/response" ) // NewFiber : initialize the webserver diff --git a/docker-compose.yml b/docker-compose.yml index 3fc9790..9a868ec 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,12 +1,12 @@ version: "3.8" services: - web-humas-be: - image: registry.gitlab.com/hanifsalafi/web-humas-be:dev + web-medols-be: + image: registry.gitlab.com/hanifsalafi/web-medols-be:dev build: context: . dockerfile: Dockerfile volumes: - - ./data/web-humas-be/logs:/app + - ./data/web-medols-be/logs:/app ports: - "8800:8800" \ No newline at end of file diff --git a/docs/swagger/docs.go b/docs/swagger/docs.go index 99d9ee3..c90d8a6 100644 --- a/docs/swagger/docs.go +++ b/docs/swagger/docs.go @@ -3337,6 +3337,13 @@ const docTemplate = `{ ], "summary": "Get all Articles", "parameters": [ + { + "type": "string", + "description": "Insert the X-Client-Key", + "name": "X-Client-Key", + "in": "header", + "required": true + }, { "type": "string", "name": "category", @@ -4432,6 +4439,307 @@ const docTemplate = `{ } } }, + "/clients": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "description": "API for getting all Clients", + "tags": [ + "Clients" + ], + "summary": "Get all Clients", + "parameters": [ + { + "type": "integer", + "name": "createdBy", + "in": "query" + }, + { + "type": "string", + "name": "name", + "in": "query" + }, + { + "type": "integer", + "name": "count", + "in": "query" + }, + { + "type": "integer", + "name": "limit", + "in": "query" + }, + { + "type": "integer", + "name": "nextPage", + "in": "query" + }, + { + "type": "integer", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "name": "previousPage", + "in": "query" + }, + { + "type": "string", + "name": "sort", + "in": "query" + }, + { + "type": "string", + "name": "sortBy", + "in": "query" + }, + { + "type": "integer", + "name": "totalPage", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.Response" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/response.BadRequestError" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/response.UnauthorizedError" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/response.InternalServerError" + } + } + } + }, + "post": { + "security": [ + { + "Bearer": [] + } + ], + "description": "API for create Clients", + "tags": [ + "Clients" + ], + "summary": "Create Clients", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cAdd access token here\u003e", + "description": "Insert your access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "description": "Required payload", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.ClientsCreateRequest" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.Response" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/response.BadRequestError" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/response.UnauthorizedError" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/response.InternalServerError" + } + } + } + } + }, + "/clients/{id}": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "description": "API for getting one Clients", + "tags": [ + "Clients" + ], + "summary": "Get one Clients", + "parameters": [ + { + "type": "integer", + "description": "Clients ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.Response" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/response.BadRequestError" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/response.UnauthorizedError" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/response.InternalServerError" + } + } + } + }, + "put": { + "security": [ + { + "Bearer": [] + } + ], + "description": "API for update Clients", + "tags": [ + "Clients" + ], + "summary": "update Clients", + "parameters": [ + { + "description": "Required payload", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.ClientsUpdateRequest" + } + }, + { + "type": "string", + "description": "Clients ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.Response" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/response.BadRequestError" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/response.UnauthorizedError" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/response.InternalServerError" + } + } + } + }, + "delete": { + "security": [ + { + "Bearer": [] + } + ], + "description": "API for delete Clients", + "tags": [ + "Clients" + ], + "summary": "delete Clients", + "parameters": [ + { + "type": "string", + "description": "Clients ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.Response" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/response.BadRequestError" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/response.UnauthorizedError" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/response.InternalServerError" + } + } + } + } + }, "/custom-static-pages": { "get": { "security": [ @@ -10600,6 +10908,34 @@ const docTemplate = `{ } } }, + "request.ClientsCreateRequest": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "createdById": { + "type": "integer" + }, + "name": { + "type": "string" + } + } + }, + "request.ClientsUpdateRequest": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "createdById": { + "type": "integer" + }, + "name": { + "type": "string" + } + } + }, "request.CustomStaticPagesCreateRequest": { "type": "object", "required": [ diff --git a/docs/swagger/swagger.json b/docs/swagger/swagger.json index a8a9ad8..f6e0f5d 100644 --- a/docs/swagger/swagger.json +++ b/docs/swagger/swagger.json @@ -3326,6 +3326,13 @@ ], "summary": "Get all Articles", "parameters": [ + { + "type": "string", + "description": "Insert the X-Client-Key", + "name": "X-Client-Key", + "in": "header", + "required": true + }, { "type": "string", "name": "category", @@ -4421,6 +4428,307 @@ } } }, + "/clients": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "description": "API for getting all Clients", + "tags": [ + "Clients" + ], + "summary": "Get all Clients", + "parameters": [ + { + "type": "integer", + "name": "createdBy", + "in": "query" + }, + { + "type": "string", + "name": "name", + "in": "query" + }, + { + "type": "integer", + "name": "count", + "in": "query" + }, + { + "type": "integer", + "name": "limit", + "in": "query" + }, + { + "type": "integer", + "name": "nextPage", + "in": "query" + }, + { + "type": "integer", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "name": "previousPage", + "in": "query" + }, + { + "type": "string", + "name": "sort", + "in": "query" + }, + { + "type": "string", + "name": "sortBy", + "in": "query" + }, + { + "type": "integer", + "name": "totalPage", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.Response" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/response.BadRequestError" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/response.UnauthorizedError" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/response.InternalServerError" + } + } + } + }, + "post": { + "security": [ + { + "Bearer": [] + } + ], + "description": "API for create Clients", + "tags": [ + "Clients" + ], + "summary": "Create Clients", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cAdd access token here\u003e", + "description": "Insert your access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "description": "Required payload", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.ClientsCreateRequest" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.Response" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/response.BadRequestError" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/response.UnauthorizedError" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/response.InternalServerError" + } + } + } + } + }, + "/clients/{id}": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "description": "API for getting one Clients", + "tags": [ + "Clients" + ], + "summary": "Get one Clients", + "parameters": [ + { + "type": "integer", + "description": "Clients ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.Response" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/response.BadRequestError" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/response.UnauthorizedError" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/response.InternalServerError" + } + } + } + }, + "put": { + "security": [ + { + "Bearer": [] + } + ], + "description": "API for update Clients", + "tags": [ + "Clients" + ], + "summary": "update Clients", + "parameters": [ + { + "description": "Required payload", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.ClientsUpdateRequest" + } + }, + { + "type": "string", + "description": "Clients ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.Response" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/response.BadRequestError" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/response.UnauthorizedError" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/response.InternalServerError" + } + } + } + }, + "delete": { + "security": [ + { + "Bearer": [] + } + ], + "description": "API for delete Clients", + "tags": [ + "Clients" + ], + "summary": "delete Clients", + "parameters": [ + { + "type": "string", + "description": "Clients ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.Response" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/response.BadRequestError" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/response.UnauthorizedError" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/response.InternalServerError" + } + } + } + } + }, "/custom-static-pages": { "get": { "security": [ @@ -10589,6 +10897,34 @@ } } }, + "request.ClientsCreateRequest": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "createdById": { + "type": "integer" + }, + "name": { + "type": "string" + } + } + }, + "request.ClientsUpdateRequest": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "createdById": { + "type": "integer" + }, + "name": { + "type": "string" + } + } + }, "request.CustomStaticPagesCreateRequest": { "type": "object", "required": [ diff --git a/docs/swagger/swagger.yaml b/docs/swagger/swagger.yaml index e1bc8ad..87ae218 100644 --- a/docs/swagger/swagger.yaml +++ b/docs/swagger/swagger.yaml @@ -400,6 +400,24 @@ definitions: - id - prov_id type: object + request.ClientsCreateRequest: + properties: + createdById: + type: integer + name: + type: string + required: + - name + type: object + request.ClientsUpdateRequest: + properties: + createdById: + type: integer + name: + type: string + required: + - name + type: object request.CustomStaticPagesCreateRequest: properties: description: @@ -3058,6 +3076,11 @@ paths: get: description: API for getting all Articles parameters: + - description: Insert the X-Client-Key + in: header + name: X-Client-Key + required: true + type: string - in: query name: category type: string @@ -3762,6 +3785,196 @@ paths: summary: Update Cities tags: - Untags + /clients: + get: + description: API for getting all Clients + parameters: + - in: query + name: createdBy + type: integer + - in: query + name: name + type: string + - in: query + name: count + type: integer + - in: query + name: limit + type: integer + - in: query + name: nextPage + type: integer + - in: query + name: page + type: integer + - in: query + name: previousPage + type: integer + - in: query + name: sort + type: string + - in: query + name: sortBy + type: string + - in: query + name: totalPage + type: integer + responses: + "200": + description: OK + schema: + $ref: '#/definitions/response.Response' + "400": + description: Bad Request + schema: + $ref: '#/definitions/response.BadRequestError' + "401": + description: Unauthorized + schema: + $ref: '#/definitions/response.UnauthorizedError' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/response.InternalServerError' + security: + - Bearer: [] + summary: Get all Clients + tags: + - Clients + post: + description: API for create Clients + parameters: + - default: Bearer + description: Insert your access token + in: header + name: Authorization + required: true + type: string + - description: Required payload + in: body + name: payload + required: true + schema: + $ref: '#/definitions/request.ClientsCreateRequest' + responses: + "200": + description: OK + schema: + $ref: '#/definitions/response.Response' + "400": + description: Bad Request + schema: + $ref: '#/definitions/response.BadRequestError' + "401": + description: Unauthorized + schema: + $ref: '#/definitions/response.UnauthorizedError' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/response.InternalServerError' + security: + - Bearer: [] + summary: Create Clients + tags: + - Clients + /clients/{id}: + delete: + description: API for delete Clients + parameters: + - description: Clients ID + in: path + name: id + required: true + type: string + responses: + "200": + description: OK + schema: + $ref: '#/definitions/response.Response' + "400": + description: Bad Request + schema: + $ref: '#/definitions/response.BadRequestError' + "401": + description: Unauthorized + schema: + $ref: '#/definitions/response.UnauthorizedError' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/response.InternalServerError' + security: + - Bearer: [] + summary: delete Clients + tags: + - Clients + get: + description: API for getting one Clients + parameters: + - description: Clients ID + in: path + name: id + required: true + type: integer + responses: + "200": + description: OK + schema: + $ref: '#/definitions/response.Response' + "400": + description: Bad Request + schema: + $ref: '#/definitions/response.BadRequestError' + "401": + description: Unauthorized + schema: + $ref: '#/definitions/response.UnauthorizedError' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/response.InternalServerError' + security: + - Bearer: [] + summary: Get one Clients + tags: + - Clients + put: + description: API for update Clients + parameters: + - description: Required payload + in: body + name: payload + required: true + schema: + $ref: '#/definitions/request.ClientsUpdateRequest' + - description: Clients ID + in: path + name: id + required: true + type: string + responses: + "200": + description: OK + schema: + $ref: '#/definitions/response.Response' + "400": + description: Bad Request + schema: + $ref: '#/definitions/response.BadRequestError' + "401": + description: Unauthorized + schema: + $ref: '#/definitions/response.UnauthorizedError' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/response.InternalServerError' + security: + - Bearer: [] + summary: update Clients + tags: + - Clients /custom-static-pages: get: description: API for getting all CustomStaticPages diff --git a/go.mod b/go.mod index 6558233..cc1fa6d 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module go-humas-be +module web-medols-be go 1.21.6 diff --git a/main.go b/main.go index f666cd2..faa3ab3 100644 --- a/main.go +++ b/main.go @@ -2,38 +2,39 @@ package main import ( fxzerolog "github.com/efectn/fx-zerolog" - "go-humas-be/app/database" - "go-humas-be/app/middleware" - "go-humas-be/app/module/activity_logs" - "go-humas-be/app/module/advertisement" - "go-humas-be/app/module/article_approvals" - "go-humas-be/app/module/article_categories" - "go-humas-be/app/module/article_category_details" - "go-humas-be/app/module/article_comments" - "go-humas-be/app/module/article_files" - "go-humas-be/app/module/article_nulis_ai" - "go-humas-be/app/module/articles" - "go-humas-be/app/module/cities" - "go-humas-be/app/module/custom_static_pages" - "go-humas-be/app/module/districts" - "go-humas-be/app/module/feedbacks" - "go-humas-be/app/module/magazine_files" - "go-humas-be/app/module/magazines" - "go-humas-be/app/module/master_menus" - "go-humas-be/app/module/master_modules" - "go-humas-be/app/module/provinces" - "go-humas-be/app/module/subscription" - "go-humas-be/app/module/user_levels" - "go-humas-be/app/module/user_role_accesses" - "go-humas-be/app/module/user_role_level_details" - "go-humas-be/app/module/user_roles" - "go-humas-be/app/module/users" - "go-humas-be/app/router" - "go-humas-be/config/config" - "go-humas-be/config/logger" - "go-humas-be/config/webserver" "go.uber.org/fx" "time" + "web-medols-be/app/database" + "web-medols-be/app/middleware" + "web-medols-be/app/module/activity_logs" + "web-medols-be/app/module/advertisement" + "web-medols-be/app/module/article_approvals" + "web-medols-be/app/module/article_categories" + "web-medols-be/app/module/article_category_details" + "web-medols-be/app/module/article_comments" + "web-medols-be/app/module/article_files" + "web-medols-be/app/module/article_nulis_ai" + "web-medols-be/app/module/articles" + "web-medols-be/app/module/cities" + "web-medols-be/app/module/clients" + "web-medols-be/app/module/custom_static_pages" + "web-medols-be/app/module/districts" + "web-medols-be/app/module/feedbacks" + "web-medols-be/app/module/magazine_files" + "web-medols-be/app/module/magazines" + "web-medols-be/app/module/master_menus" + "web-medols-be/app/module/master_modules" + "web-medols-be/app/module/provinces" + "web-medols-be/app/module/subscription" + "web-medols-be/app/module/user_levels" + "web-medols-be/app/module/user_role_accesses" + "web-medols-be/app/module/user_role_level_details" + "web-medols-be/app/module/user_roles" + "web-medols-be/app/module/users" + "web-medols-be/app/router" + "web-medols-be/config/config" + "web-medols-be/config/logger" + "web-medols-be/config/webserver" ) func main() { @@ -70,6 +71,7 @@ func main() { article_comments.NewArticleCommentsModule, article_nulis_ai.NewArticleNulisAIModule, cities.NewCitiesModule, + clients.NewClientsModule, custom_static_pages.NewCustomStaticPagesModule, districts.NewDistrictsModule, feedbacks.NewFeedbacksModule, diff --git a/utils/middleware/client_utils.go b/utils/middleware/client_utils.go new file mode 100644 index 0000000..866352b --- /dev/null +++ b/utils/middleware/client_utils.go @@ -0,0 +1,56 @@ +package middleware + +import ( + "github.com/gofiber/fiber/v2" + "github.com/google/uuid" + "gorm.io/gorm" + "web-medols-be/app/middleware" +) + +// AddClientFilter adds client_id filter to GORM query +func AddClientFilter(db *gorm.DB, c *fiber.Ctx) *gorm.DB { + if c == nil { + return db + } + clientID := middleware.GetClientID(c) + if clientID != nil { + return db.Where("client_id = ?", clientID) + } + return db +} + +// SetClientID sets client_id in the given struct if it has a ClientId field +func SetClientID(c *fiber.Ctx, model interface{}) { + if c == nil { + return + } + clientID := middleware.GetClientID(c) + if clientID != nil { + // Use reflection to set ClientId field if it exists + if setter, ok := model.(interface{ SetClientID(*uuid.UUID) }); ok { + setter.SetClientID(clientID) + } + } +} + +// ValidateClientAccess validates if the current client has access to the resource +func ValidateClientAccess(db *gorm.DB, c *fiber.Ctx, tableName string, resourceID interface{}) error { + if c == nil { + return nil // Skip validation for background jobs + } + clientID := middleware.GetClientID(c) + if clientID == nil { + return fiber.NewError(fiber.StatusUnauthorized, "Client not authenticated") + } + + var count int64 + if err := db.Table(tableName).Where("id = ? AND client_id = ?", resourceID, clientID).Count(&count).Error; err != nil { + return err + } + + if count == 0 { + return fiber.NewError(fiber.StatusForbidden, "Access denied to this resource") + } + + return nil +} diff --git a/utils/response/index.response.go b/utils/response/index.response.go index 82e9e91..d94a063 100644 --- a/utils/response/index.response.go +++ b/utils/response/index.response.go @@ -5,8 +5,8 @@ import ( validator "github.com/go-playground/validator/v10" "github.com/gofiber/fiber/v2" "github.com/rs/zerolog/log" - val "go-humas-be/utils/validator" "strings" + val "web-medols-be/utils/validator" ) // Alias for any slice diff --git a/utils/service/user_utils.service.go b/utils/service/user_utils.service.go index 13e39d1..09d74d5 100644 --- a/utils/service/user_utils.service.go +++ b/utils/service/user_utils.service.go @@ -3,10 +3,10 @@ package service import ( "github.com/golang-jwt/jwt/v5" "github.com/rs/zerolog" - "go-humas-be/app/database/entity/users" - "go-humas-be/app/module/users/repository" "strings" "time" + "web-medols-be/app/database/entity/users" + "web-medols-be/app/module/users/repository" ) func GetUserInfo(log zerolog.Logger, repo repository.UsersRepository, bearerToken string) *users.Users {