feat: update major

This commit is contained in:
hanif salafi 2025-07-02 13:03:52 +07:00
parent a40fb1086f
commit 58bb26f7b9
234 changed files with 3802 additions and 1484 deletions

View File

@ -20,8 +20,8 @@ build-2:
script: script:
- docker login -u $DEPLOY_USERNAME -p $DEPLOY_TOKEN 103.82.242.92:8900 - docker login -u $DEPLOY_USERNAME -p $DEPLOY_TOKEN 103.82.242.92:8900
- docker-compose build - docker-compose build
- docker tag registry.gitlab.com/hanifsalafi/web-humas-be:dev 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/humas/web-humas-be:dev - docker push 103.82.242.92:8900/medols/web-medols-be:dev
deploy: deploy:
stage: deploy stage: deploy
@ -30,4 +30,4 @@ deploy:
services: services:
- docker:dind - docker:dind
script: script:
- curl --user $JENKINS_USER:$JENKINS_PWD http://38.47.180.165:8080/job/autodeploy-humas-be/build?token=autodeployhumas - curl --user $JENKINS_USER:$JENKINS_PWD http://38.47.180.165:8080/job/autodeploy-medols-be/build?token=autodeploymedols

View File

@ -1,9 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
<component name="Go" enabled="true" />
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

View File

@ -2,7 +2,7 @@
<project version="4"> <project version="4">
<component name="ProjectModuleManager"> <component name="ProjectModuleManager">
<modules> <modules>
<module fileurl="file://$PROJECT_DIR$/.idea/go-humas-be.iml" filepath="$PROJECT_DIR$/.idea/go-humas-be.iml" /> <module fileurl="file://$PROJECT_DIR$/.idea/web-medols-be.iml" filepath="$PROJECT_DIR$/.idea/web-medols-be.iml" />
</modules> </modules>
</component> </component>
</project> </project>

View File

@ -1,13 +1,17 @@
package entity package entity
import "time" import (
"github.com/google/uuid"
"time"
)
type ActivityLogs struct { type ActivityLogs struct {
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
ActivityTypeId int `json:"activity_type_id" gorm:"type:int4"` ActivityTypeId int `json:"activity_type_id" gorm:"type:int4"`
Url string `json:"url" gorm:"type:varchar"` Url string `json:"url" gorm:"type:varchar"`
VisitorIp *string `json:"visitor_ip" gorm:"type:varchar"` VisitorIp *string `json:"visitor_ip" gorm:"type:varchar"`
ArticleId *uint `json:"article_id" gorm:"type:int4"` ArticleId *uint `json:"article_id" gorm:"type:int4"`
UserId *uint `json:"user_id" gorm:"type:int4"` UserId *uint `json:"user_id" gorm:"type:int4"`
CreatedAt time.Time `json:"created_at" gorm:"default:now()"` ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"`
CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
} }

View File

@ -1,18 +1,22 @@
package entity package entity
import "time" import (
"github.com/google/uuid"
"time"
)
type Advertisement struct { type Advertisement struct {
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
Title string `json:"title" gorm:"type:varchar"` Title string `json:"title" gorm:"type:varchar"`
Description string `json:"description" gorm:"type:varchar"` Description string `json:"description" gorm:"type:varchar"`
RedirectLink string `json:"redirect_link" gorm:"type:varchar"` RedirectLink string `json:"redirect_link" gorm:"type:varchar"`
ContentFilePath *string `json:"content_file_path" gorm:"type:varchar"` ContentFilePath *string `json:"content_file_path" gorm:"type:varchar"`
ContentFileName *string `json:"content_file_name" gorm:"type:varchar"` ContentFileName *string `json:"content_file_name" gorm:"type:varchar"`
Placement string `json:"placement" gorm:"type:varchar"` Placement string `json:"placement" gorm:"type:varchar"`
StatusId int `json:"status_id" gorm:"type:int4"` StatusId int `json:"status_id" gorm:"type:int4"`
IsPublish bool `json:"is_publish" gorm:"type:bool"` IsPublish bool `json:"is_publish" 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()"` IsActive bool `json:"is_active" gorm:"type:bool;default:true"`
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`
} }

View File

@ -1,13 +1,17 @@
package entity package entity
import "time" import (
"github.com/google/uuid"
"time"
)
type ArticleApprovals struct { type ArticleApprovals struct {
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
ArticleId uint `json:"article_id" gorm:"type:int4"` ArticleId uint `json:"article_id" gorm:"type:int4"`
ApprovalBy uint `json:"approval_by" gorm:"type:int4"` ApprovalBy uint `json:"approval_by" gorm:"type:int4"`
StatusId int `json:"status_id" gorm:"type:int4"` StatusId int `json:"status_id" gorm:"type:int4"`
Message string `json:"message" gorm:"type:varchar"` Message string `json:"message" gorm:"type:varchar"`
ApprovalAtLevel *int `json:"approval_at_level" gorm:"type:int4"` ApprovalAtLevel *int `json:"approval_at_level" gorm:"type:int4"`
CreatedAt time.Time `json:"created_at" gorm:"default:now()"` ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"`
CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
} }

View File

@ -1,6 +1,9 @@
package entity package entity
import "time" import (
"github.com/google/uuid"
"time"
)
type ArticleCategories struct { type ArticleCategories struct {
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` 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"` StatusId int `json:"status_id" gorm:"type:int4;default:1"`
IsPublish *bool `json:"is_publish" gorm:"type:bool;default:false"` IsPublish *bool `json:"is_publish" gorm:"type:bool;default:false"`
PublishedAt *time.Time `json:"published_at" gorm:"type:timestamp"` 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"` IsActive *bool `json:"is_active" gorm:"type:bool;default:true"`
CreatedAt time.Time `json:"created_at" gorm:"default:now()"` CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`

View File

@ -1,8 +1,9 @@
package article_category_details package article_category_details
import ( import (
entity "go-humas-be/app/database/entity" "github.com/google/uuid"
"time" "time"
entity "web-medols-be/app/database/entity"
) )
type ArticleCategoryDetails struct { type ArticleCategoryDetails struct {
@ -10,6 +11,7 @@ type ArticleCategoryDetails struct {
ArticleId uint `json:"article_id" gorm:"type:int4"` ArticleId uint `json:"article_id" gorm:"type:int4"`
CategoryId int `json:"category_id" gorm:"type:int4"` CategoryId int `json:"category_id" gorm:"type:int4"`
Category *entity.ArticleCategories `json:"category" gorm:"foreignKey:CategoryId;references:ID"` 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"` IsActive bool `json:"is_active" gorm:"type:bool"`
CreatedAt time.Time `json:"created_at" gorm:"default:now()"` CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`

View File

@ -1,6 +1,9 @@
package entity package entity
import "time" import (
"github.com/google/uuid"
"time"
)
type ArticleComments struct { type ArticleComments struct {
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` 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"` IsPublic bool `json:"is_public" gorm:"type:bool;default:false"`
StatusId int `json:"status_id" gorm:"type:int4;default:0"` StatusId int `json:"status_id" gorm:"type:int4;default:0"`
ApprovedAt *time.Time `json:"approved_at" gorm:"type:timestamp"` 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"` IsActive bool `json:"is_active" gorm:"type:bool"`
CreatedAt time.Time `json:"created_at" gorm:"default:now()"` CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`

View File

@ -1,6 +1,9 @@
package entity package entity
import "time" import (
"github.com/google/uuid"
"time"
)
type ArticleFiles struct { type ArticleFiles struct {
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
@ -19,6 +22,7 @@ type ArticleFiles struct {
StatusId int `json:"status_id" gorm:"type:int4"` StatusId int `json:"status_id" gorm:"type:int4"`
IsPublish *bool `json:"is_publish" gorm:"type:bool;default:false"` IsPublish *bool `json:"is_publish" gorm:"type:bool;default:false"`
PublishedAt *time.Time `json:"published_at" gorm:"type:timestamp"` 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"` IsActive bool `json:"is_active" gorm:"type:bool;default:true"`
CreatedAt time.Time `json:"created_at" gorm:"default:now()"` CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`

View File

@ -1,6 +1,9 @@
package entity package entity
import "time" import (
"github.com/google/uuid"
"time"
)
type Articles struct { type Articles struct {
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` 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"` IsDraft *bool `json:"is_draft" gorm:"type:bool;default:false"`
DraftedAt *time.Time `json:"drafted_at" gorm:"type:timestamp"` DraftedAt *time.Time `json:"drafted_at" gorm:"type:timestamp"`
PublishSchedule *string `json:"publish_schedule" gorm:"type:varchar"` 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"` IsActive *bool `json:"is_active" gorm:"type:bool;default:true"`
CreatedAt time.Time `json:"created_at" gorm:"default:now()"` CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`

View File

@ -1,6 +1,9 @@
package entity package entity
import "time" import (
"github.com/google/uuid"
"time"
)
type AuditTrails struct { type AuditTrails struct {
ID uint `gorm:"primaryKey"` ID uint `gorm:"primaryKey"`
@ -13,5 +16,6 @@ type AuditTrails struct {
RequestBody string RequestBody string
ResponseBody string ResponseBody string
DurationMs int64 DurationMs int64
ClientId *uuid.UUID
CreatedAt time.Time CreatedAt time.Time
} }

View File

@ -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()"`
}

View File

@ -1,11 +1,15 @@
package entity package entity
import "time" import (
"github.com/google/uuid"
"time"
)
type CsrfTokenRecords struct { type CsrfTokenRecords struct {
ID uint `gorm:"primaryKey"` ID uint `gorm:"primaryKey"`
Token string `gorm:"uniqueIndex;size:255"` Token string `gorm:"uniqueIndex;size:255"`
Value []byte `gorm:"value"` Value []byte `gorm:"value"`
ExpireAt time.Time `gorm:"index"` ExpireAt time.Time `gorm:"index"`
ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"`
CreatedAt time.Time CreatedAt time.Time
} }

View File

@ -1,14 +1,18 @@
package entity package entity
import "time" import (
"github.com/google/uuid"
"time"
)
type CustomStaticPages struct { type CustomStaticPages struct {
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
Title string `json:"title" gorm:"type:varchar"` Title string `json:"title" gorm:"type:varchar"`
Description string `json:"description" gorm:"type:varchar"` Description string `json:"description" gorm:"type:varchar"`
Slug string `json:"slug" gorm:"type:varchar"` Slug string `json:"slug" gorm:"type:varchar"`
HtmlBody string `json:"html_body" gorm:"type:text"` HtmlBody string `json:"html_body" gorm:"type:text"`
IsActive bool `json:"is_active" gorm:"type:bool"` IsActive bool `json:"is_active" gorm:"type:bool"`
CreatedAt time.Time `json:"created_at" gorm:"default:now()"` ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"`
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`
} }

View File

@ -1,6 +1,9 @@
package entity package entity
import "time" import (
"github.com/google/uuid"
"time"
)
type Feedbacks struct { type Feedbacks struct {
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` 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"` StatusId int `json:"status_id" gorm:"type:int4;default:0"`
ApprovedAt *time.Time `json:"approved_at" gorm:"type:timestamp"` ApprovedAt *time.Time `json:"approved_at" gorm:"type:timestamp"`
ReplyMessage *string `json:"reply_message" gorm:"type:varchar"` 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"` IsActive bool `json:"is_active" gorm:"type:bool;default:true"`
CreatedAt time.Time `json:"created_at" gorm:"default:now()"` CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`

View File

@ -1,12 +1,16 @@
package entity package entity
import "time" import (
"github.com/google/uuid"
"time"
)
type ForgotPasswords struct { type ForgotPasswords struct {
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
KeycloakID string `json:"keycloak_id" gorm:"type:varchar"` KeycloakID string `json:"keycloak_id" gorm:"type:varchar"`
CodeRequest string `json:"code_request" gorm:"type:varchar"` CodeRequest string `json:"code_request" gorm:"type:varchar"`
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()"` IsActive bool `json:"is_active" gorm:"type:bool"`
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`
} }

View File

@ -1,6 +1,9 @@
package entity package entity
import "time" import (
"github.com/google/uuid"
"time"
)
type MagazineFiles struct { type MagazineFiles struct {
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
@ -18,6 +21,7 @@ type MagazineFiles struct {
HeightPixel *string `json:"height_pixel" gorm:"type:varchar"` HeightPixel *string `json:"height_pixel" gorm:"type:varchar"`
Size *string `json:"size" gorm:"type:varchar"` Size *string `json:"size" gorm:"type:varchar"`
PublishedAt *time.Time `json:"published_at" gorm:"type:timestamp"` 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"` IsActive bool `json:"is_active" gorm:"type:bool"`
CreatedAt time.Time `json:"created_at" gorm:"default:now()"` CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`

View File

@ -1,6 +1,9 @@
package entity package entity
import "time" import (
"github.com/google/uuid"
"time"
)
type Magazines struct { type Magazines struct {
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
@ -14,6 +17,7 @@ type Magazines struct {
StatusId int `json:"status_id" gorm:"type:int4"` StatusId int `json:"status_id" gorm:"type:int4"`
IsPublish *bool `json:"is_publish" gorm:"type:bool"` IsPublish *bool `json:"is_publish" gorm:"type:bool"`
PublishedAt *time.Time `json:"published_at" gorm:"type:timestamp"` 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"` IsActive bool `json:"is_active" gorm:"type:bool"`
CreatedAt time.Time `json:"created_at" gorm:"default:now()"` CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`

View File

@ -1,18 +1,22 @@
package entity package entity
import "time" import (
"github.com/google/uuid"
"time"
)
type MasterMenus struct { type MasterMenus struct {
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
Name string `json:"name" gorm:"type:varchar"` Name string `json:"name" gorm:"type:varchar"`
Description string `json:"description" gorm:"type:varchar"` Description string `json:"description" gorm:"type:varchar"`
ModuleId int `json:"module_id" gorm:"type:int4"` ModuleId int `json:"module_id" gorm:"type:int4"`
ParentMenuId *int `json:"parent_menu_id" gorm:"type:int4"` ParentMenuId *int `json:"parent_menu_id" gorm:"type:int4"`
Icon *string `json:"icon" gorm:"type:varchar"` Icon *string `json:"icon" gorm:"type:varchar"`
Group string `json:"group" gorm:"type:varchar"` Group string `json:"group" gorm:"type:varchar"`
Position *int `json:"position" gorm:"type:int4"` Position *int `json:"position" gorm:"type:int4"`
StatusId int `json:"status_id" gorm:"type:int4"` StatusId int `json:"status_id" gorm:"type:int4"`
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()"` IsActive *bool `json:"is_active" gorm:"type:bool;default:true"`
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`
} }

View File

@ -1,14 +1,18 @@
package entity package entity
import "time" import (
"github.com/google/uuid"
"time"
)
type MasterModules struct { type MasterModules struct {
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
Name string `json:"name" gorm:"type:varchar"` Name string `json:"name" gorm:"type:varchar"`
Description string `json:"description" gorm:"type:varchar"` Description string `json:"description" gorm:"type:varchar"`
PathUrl string `json:"path_url" gorm:"type:varchar"` PathUrl string `json:"path_url" gorm:"type:varchar"`
StatusId int `json:"status_id" gorm:"type:int4"` StatusId int `json:"status_id" gorm:"type:int4"`
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()"` IsActive *bool `json:"is_active" gorm:"type:bool;default:true"`
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`
} }

View File

@ -1,14 +1,18 @@
package entity package entity
import "time" import (
"github.com/google/uuid"
"time"
)
type OneTimePasswords struct { type OneTimePasswords struct {
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
Email string `json:"email" gorm:"type:varchar"` Email string `json:"email" gorm:"type:varchar"`
Name *string `json:"name" gorm:"type:varchar"` Name *string `json:"name" gorm:"type:varchar"`
Identity *string `json:"identity" gorm:"type:varchar"` Identity *string `json:"identity" gorm:"type:varchar"`
OtpCode string `json:"otp_code" gorm:"type:varchar"` OtpCode string `json:"otp_code" gorm:"type:varchar"`
ValidUntil time.Time `json:"valid_until" gorm:"default:(NOW() + INTERVAL '10 minutes')"` ValidUntil time.Time `json:"valid_until" gorm:"default:(NOW() + INTERVAL '10 minutes')"`
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()"` IsActive bool `json:"is_active" gorm:"type:bool"`
CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
} }

View File

@ -1,11 +1,15 @@
package entity package entity
import "time" import (
"github.com/google/uuid"
"time"
)
type Subscription struct { type Subscription struct {
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
Email string `json:"email" gorm:"type:varchar"` Email string `json:"email" gorm:"type:varchar"`
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()"` IsActive bool `json:"is_active" gorm:"type:bool;default:true"`
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`
} }

View File

@ -1,17 +1,21 @@
package entity package entity
import "time" import (
"github.com/google/uuid"
"time"
)
type UserLevels struct { type UserLevels struct {
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
Name string `json:"name" gorm:"type:varchar"` Name string `json:"name" gorm:"type:varchar"`
AliasName string `json:"alias_name" gorm:"type:varchar"` AliasName string `json:"alias_name" gorm:"type:varchar"`
LevelNumber int `json:"level_number" gorm:"type:int4"` LevelNumber int `json:"level_number" gorm:"type:int4"`
ParentLevelId *int `json:"parent_level_id" gorm:"type:int4"` ParentLevelId *int `json:"parent_level_id" gorm:"type:int4"`
ProvinceId *int `json:"province_id" gorm:"type:int4"` ProvinceId *int `json:"province_id" gorm:"type:int4"`
Group *string `json:"group" gorm:"type:varchar"` Group *string `json:"group" gorm:"type:varchar"`
IsApprovalActive *bool `json:"is_approval_active" gorm:"type:bool;default:false"` IsApprovalActive *bool `json:"is_approval_active" gorm:"type:bool;default:false"`
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()"` IsActive *bool `json:"is_active" gorm:"type:bool"`
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`
} }

View File

@ -1,18 +1,22 @@
package entity package entity
import "time" import (
"github.com/google/uuid"
"time"
)
type UserRoleAccesses struct { type UserRoleAccesses struct {
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
UserRoleId uint `json:"user_role_id" gorm:"type:int4"` UserRoleId uint `json:"user_role_id" gorm:"type:int4"`
MenuId int `json:"menu_id" gorm:"type:int4"` MenuId int `json:"menu_id" gorm:"type:int4"`
IsViewEnabled bool `json:"is_view_enabled" gorm:"type:bool"` IsViewEnabled bool `json:"is_view_enabled" gorm:"type:bool"`
IsInsertEnabled bool `json:"is_insert_enabled" gorm:"type:bool"` IsInsertEnabled bool `json:"is_insert_enabled" gorm:"type:bool"`
IsUpdateEnabled bool `json:"is_update_enabled" gorm:"type:bool"` IsUpdateEnabled bool `json:"is_update_enabled" gorm:"type:bool"`
IsDeleteEnabled bool `json:"is_delete_enabled" gorm:"type:bool"` IsDeleteEnabled bool `json:"is_delete_enabled" gorm:"type:bool"`
IsApprovalEnabled bool `json:"is_approval_enabled" gorm:"type:bool"` IsApprovalEnabled bool `json:"is_approval_enabled" gorm:"type:bool"`
IsAdminEnabled bool `json:"is_admin_enabled" gorm:"type:bool"` IsAdminEnabled bool `json:"is_admin_enabled" gorm:"type:bool"`
IsActive *bool `json:"is_active" gorm:"type:bool;default:true"` IsActive *bool `json:"is_active" gorm:"type:bool;default:true"`
CreatedAt time.Time `json:"created_at" gorm:"default:now()"` ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"`
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`
} }

View File

@ -1,12 +1,16 @@
package entity package entity
import "time" import (
"github.com/google/uuid"
"time"
)
type UserRoleLevelDetails struct { type UserRoleLevelDetails struct {
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
UserRoleId uint `json:"user_role_id" gorm:"type:int4"` UserRoleId uint `json:"user_role_id" gorm:"type:int4"`
UserLevelId uint `json:"user_level_id" gorm:"type:int4"` UserLevelId uint `json:"user_level_id" gorm:"type:int4"`
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()"` IsActive *bool `json:"is_active" gorm:"type:bool;default:true"`
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`
} }

View File

@ -1,16 +1,20 @@
package entity package entity
import "time" import (
"github.com/google/uuid"
"time"
)
type UserRoles struct { type UserRoles struct {
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
Name string `json:"name" gorm:"type:varchar"` Name string `json:"name" gorm:"type:varchar"`
Description string `json:"description" gorm:"type:varchar"` Description string `json:"description" gorm:"type:varchar"`
Code string `json:"code" gorm:"type:varchar"` Code string `json:"code" gorm:"type:varchar"`
StatusId int `json:"status_id" gorm:"type:int4;default:1"` StatusId int `json:"status_id" gorm:"type:int4;default:1"`
CreatedById *uint `json:"created_by_id" gorm:"type:int4"` CreatedById *uint `json:"created_by_id" gorm:"type:int4"`
UserLevelId uint `json:"user_level_id" gorm:"type:int4"` UserLevelId uint `json:"user_level_id" gorm:"type:int4"`
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()"` IsActive *bool `json:"is_active" gorm:"type:bool;default:true"`
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`
} }

View File

@ -1,8 +1,9 @@
package users package users
import ( import (
"go-humas-be/app/database/entity" "github.com/google/uuid"
"time" "time"
"web-medols-be/app/database/entity"
) )
type Users struct { type Users struct {
@ -29,6 +30,7 @@ type Users struct {
ProfilePicturePath *string `json:"profile_picture_path" gorm:"type:varchar"` ProfilePicturePath *string `json:"profile_picture_path" gorm:"type:varchar"`
TempPassword *string `json:"temp_password" gorm:"type:varchar"` TempPassword *string `json:"temp_password" gorm:"type:varchar"`
IsEmailUpdated *bool `json:"is_email_updated" gorm:"type:bool;default:false"` 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"` IsActive *bool `json:"is_active" gorm:"type:bool;default:true"`
CreatedAt time.Time `json:"created_at" gorm:"default:now()"` CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`

View File

@ -2,13 +2,13 @@ package database
import ( import (
"github.com/rs/zerolog" "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/driver/postgres"
"gorm.io/gorm" "gorm.io/gorm"
"gorm.io/gorm/logger" "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 // Database setup database with gorm
@ -95,6 +95,7 @@ func Models() []interface{} {
entity.ArticleNulisAI{}, entity.ArticleNulisAI{},
entity.AuditTrails{}, entity.AuditTrails{},
entity.Cities{}, entity.Cities{},
entity.Clients{},
entity.CsrfTokenRecords{}, entity.CsrfTokenRecords{},
entity.CustomStaticPages{}, entity.CustomStaticPages{},
entity.Districts{}, entity.Districts{},

View File

@ -1,8 +1,8 @@
package seeds package seeds
import ( import (
"go-humas-be/app/database/entity"
"gorm.io/gorm" "gorm.io/gorm"
"web-medols-be/app/database/entity"
) )
type ActivityLogsSeeder struct{} type ActivityLogsSeeder struct{}

View File

@ -1,8 +1,8 @@
package seeds package seeds
import ( import (
"go-humas-be/app/database/entity"
"gorm.io/gorm" "gorm.io/gorm"
"web-medols-be/app/database/entity"
) )
type MasterApprovalStatusesSeeder struct{} type MasterApprovalStatusesSeeder struct{}

View File

@ -1,8 +1,8 @@
package seeds package seeds
import ( import (
"go-humas-be/app/database/entity"
"gorm.io/gorm" "gorm.io/gorm"
"web-medols-be/app/database/entity"
) )
type MasterStatusesSeeder struct{} type MasterStatusesSeeder struct{}

View File

@ -3,12 +3,12 @@ package middleware
import ( import (
"encoding/json" "encoding/json"
"github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2"
"go-humas-be/app/database/entity"
utilSvc "go-humas-be/utils/service"
"gorm.io/gorm" "gorm.io/gorm"
"log" "log"
"strings" "strings"
"time" "time"
"web-medols-be/app/database/entity"
utilSvc "web-medols-be/utils/service"
) )
func AuditTrailsMiddleware(db *gorm.DB) fiber.Handler { func AuditTrailsMiddleware(db *gorm.DB) fiber.Handler {

View File

@ -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
}

View File

@ -2,9 +2,9 @@ package middleware
import ( import (
"fmt" "fmt"
"go-humas-be/app/database/entity"
"gorm.io/gorm" "gorm.io/gorm"
"time" "time"
"web-medols-be/app/database/entity"
) )
type PostgresStorage struct { type PostgresStorage struct {

View File

@ -3,11 +3,11 @@ package middleware
import ( import (
"github.com/gofiber/fiber/v2/middleware/csrf" "github.com/gofiber/fiber/v2/middleware/csrf"
"github.com/gofiber/fiber/v2/middleware/session" "github.com/gofiber/fiber/v2/middleware/session"
"go-humas-be/app/database"
"go-humas-be/config/config"
utilsSvc "go-humas-be/utils"
"log" "log"
"time" "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"
"github.com/gofiber/fiber/v2/middleware/compress" "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), 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", 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", 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", ExposeHeaders: "Content-Length, Content-Type",
AllowCredentials: true, AllowCredentials: true,
MaxAge: 12, 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)) m.App.Use(AuditTrailsMiddleware(db.DB))
StartAuditTrailCleanup(db.DB, m.Cfg.Middleware.AuditTrails.Retention) StartAuditTrailCleanup(db.DB, m.Cfg.Middleware.AuditTrails.Retention)

View File

@ -2,10 +2,10 @@ package activity_logs
import ( import (
"github.com/gofiber/fiber/v2" "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" "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 // struct of ActivityLogsRouter

View File

@ -3,13 +3,14 @@ package controller
import ( import (
"github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2"
"github.com/rs/zerolog" "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" "strconv"
"strings" "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 { type activityLogsController struct {
@ -51,6 +52,8 @@ func (_i *activityLogsController) All(c *fiber.Ctx) error {
return err return err
} }
clientId := middleware.GetClientID(c)
reqContext := request.ActivityLogsQueryRequestContext{ reqContext := request.ActivityLogsQueryRequestContext{
ActivityTypeId: c.Query("activityTypeId"), ActivityTypeId: c.Query("activityTypeId"),
Url: c.Query("url"), Url: c.Query("url"),
@ -60,7 +63,7 @@ func (_i *activityLogsController) All(c *fiber.Ctx) error {
req := reqContext.ToParamRequest() req := reqContext.ToParamRequest()
req.Pagination = paginate req.Pagination = paginate
activityLogsData, paging, err := _i.activityLogsService.All(req) activityLogsData, paging, err := _i.activityLogsService.All(clientId, req)
if err != nil { if err != nil {
return err return err
} }
@ -90,7 +93,9 @@ func (_i *activityLogsController) Show(c *fiber.Ctx) error {
return err return err
} }
activityLogsData, err := _i.activityLogsService.Show(uint(id)) clientId := middleware.GetClientID(c)
activityLogsData, err := _i.activityLogsService.Show(clientId, uint(id))
if err != nil { if err != nil {
return err return err
} }
@ -121,6 +126,8 @@ func (_i *activityLogsController) Save(c *fiber.Ctx) error {
return err return err
} }
clientId := middleware.GetClientID(c)
var authToken *string var authToken *string
getTokenFromHeader := c.Get("Authorization") getTokenFromHeader := c.Get("Authorization")
if getTokenFromHeader == "" { if getTokenFromHeader == "" {
@ -130,7 +137,7 @@ func (_i *activityLogsController) Save(c *fiber.Ctx) error {
} }
visitorIp := GetVisitorIP(c) visitorIp := GetVisitorIP(c)
req.VisitorIp = &visitorIp req.VisitorIp = &visitorIp
dataResult, err := _i.activityLogsService.Save(*req, authToken) dataResult, err := _i.activityLogsService.Save(clientId, *req, authToken)
if err != nil { if err != nil {
return err return err
} }
@ -166,7 +173,9 @@ func (_i *activityLogsController) Update(c *fiber.Ctx) error {
return err return err
} }
err = _i.activityLogsService.Update(uint(id), *req) clientId := middleware.GetClientID(c)
err = _i.activityLogsService.Update(clientId, uint(id), *req)
if err != nil { if err != nil {
return err return err
} }
@ -195,7 +204,9 @@ func (_i *activityLogsController) Delete(c *fiber.Ctx) error {
return err return err
} }
err = _i.activityLogsService.Delete(uint(id)) clientId := middleware.GetClientID(c)
err = _i.activityLogsService.Delete(clientId, uint(id))
if err != nil { if err != nil {
return err return err
} }
@ -218,7 +229,10 @@ func (_i *activityLogsController) Delete(c *fiber.Ctx) error {
// @Router /activity-logs/statistics [get] // @Router /activity-logs/statistics [get]
func (_i *activityLogsController) GetActivityStats(c *fiber.Ctx) error { func (_i *activityLogsController) GetActivityStats(c *fiber.Ctx) error {
_i.Log.Info().Interface("GetActivityStats", "checker controller").Msg("") _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 { if err != nil {
return err return err
} }

View File

@ -2,7 +2,7 @@ package controller
import ( import (
"github.com/rs/zerolog" "github.com/rs/zerolog"
"go-humas-be/app/module/activity_logs/service" "web-medols-be/app/module/activity_logs/service"
) )
type Controller struct { type Controller struct {

View File

@ -1,8 +1,8 @@
package mapper package mapper
import ( import (
"go-humas-be/app/database/entity" "web-medols-be/app/database/entity"
res "go-humas-be/app/module/activity_logs/response" res "web-medols-be/app/module/activity_logs/response"
) )
func ActivityLogsResponseMapper(activityLogsReq *entity.ActivityLogs) (activityLogsRes *res.ActivityLogsResponse) { func ActivityLogsResponseMapper(activityLogsReq *entity.ActivityLogs) (activityLogsRes *res.ActivityLogsResponse) {

View File

@ -2,13 +2,14 @@ package repository
import ( import (
"fmt" "fmt"
"github.com/google/uuid"
"github.com/rs/zerolog" "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" "strings"
"time" "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 { type activityLogsRepository struct {
@ -18,14 +19,14 @@ type activityLogsRepository struct {
// ActivityLogsRepository define interface of IActivityLogsRepository // ActivityLogsRepository define interface of IActivityLogsRepository
type ActivityLogsRepository interface { type ActivityLogsRepository interface {
GetAll(req request.ActivityLogsQueryRequest) (activityLogss []*entity.ActivityLogs, paging paginator.Pagination, err error) GetAll(clientId *uuid.UUID, req request.ActivityLogsQueryRequest) (activityLogss []*entity.ActivityLogs, paging paginator.Pagination, err error)
FindOne(id uint) (activityLogs *entity.ActivityLogs, err error) FindOne(clientId *uuid.UUID, id uint) (activityLogs *entity.ActivityLogs, err error)
Create(activityLogs *entity.ActivityLogs) (activityLogsReturn *entity.ActivityLogs, err error) Create(activityLogs *entity.ActivityLogs) (activityLogsReturn *entity.ActivityLogs, err error)
Update(id uint, activityLogs *entity.ActivityLogs) (err error) Update(clientId *uuid.UUID, id uint, activityLogs *entity.ActivityLogs) (err error)
Delete(id uint) (err error) Delete(clientId *uuid.UUID, id uint) (err error)
CountUniqueVisitorAllTime() (count int64, err error) CountUniqueVisitorAllTime(clientId *uuid.UUID) (count int64, err error)
CountUniqueVisitorToday() (count int64, err error) CountUniqueVisitorToday(clientId *uuid.UUID) (count int64, err error)
CountTotalViewAllTime() (count int64, err error) CountTotalViewAllTime(clientId *uuid.UUID) (count int64, err error)
} }
func NewActivityLogsRepository(db *database.Database, logger zerolog.Logger) ActivityLogsRepository { 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 // 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 var count int64
query := _i.DB.DB.Model(&entity.ActivityLogs{}) query := _i.DB.DB.Model(&entity.ActivityLogs{})
// Add ClientId filter
if clientId != nil {
query = query.Where("client_id = ?", clientId)
}
if req.ActivityTypeId != nil { if req.ActivityTypeId != nil {
query = query.Where("activity_type_id = ?", req.ActivityTypeId) query = query.Where("activity_type_id = ?", req.ActivityTypeId)
} }
@ -77,8 +83,15 @@ func (_i *activityLogsRepository) GetAll(req request.ActivityLogsQueryRequest) (
return return
} }
func (_i *activityLogsRepository) FindOne(id uint) (activityLogs *entity.ActivityLogs, err error) { func (_i *activityLogsRepository) FindOne(clientId *uuid.UUID, id uint) (activityLogs *entity.ActivityLogs, err error) {
if err := _i.DB.DB.First(&activityLogs, id).Error; err != nil { 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 return nil, err
} }
@ -90,43 +103,47 @@ func (_i *activityLogsRepository) Create(activityLogs *entity.ActivityLogs) (act
return activityLogs, result.Error return activityLogs, result.Error
} }
func (_i *activityLogsRepository) Update(id uint, activityLogs *entity.ActivityLogs) (err error) { func (_i *activityLogsRepository) Update(clientId *uuid.UUID, id uint, activityLogs *entity.ActivityLogs) (err error) {
return _i.DB.DB.Model(&entity.ActivityLogs{}). query := _i.DB.DB.Model(&entity.ActivityLogs{}).Where(&entity.ActivityLogs{ID: id})
Where(&entity.ActivityLogs{ID: id}). if clientId != nil {
Updates(activityLogs).Error query = query.Where("client_id = ?", clientId)
}
return query.Updates(activityLogs).Error
} }
func (_i *activityLogsRepository) Delete(id uint) error { func (_i *activityLogsRepository) Delete(clientId *uuid.UUID, id uint) error {
return _i.DB.DB.Delete(&entity.ActivityLogs{}, id).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) { func (_i *activityLogsRepository) CountUniqueVisitorAllTime(clientId *uuid.UUID) (count int64, err error) {
err = _i.DB.DB. query := _i.DB.DB.Model(&entity.ActivityLogs{})
Model(&entity.ActivityLogs{}). if clientId != nil {
Distinct("visitor_ip"). query = query.Where("client_id = ?", clientId)
Count(&count).Error }
err = query.Distinct("visitor_ip").Count(&count).Error
return return
} }
func (_i *activityLogsRepository) CountTotalViewAllTime() (count int64, err error) { func (_i *activityLogsRepository) CountTotalViewAllTime(clientId *uuid.UUID) (count int64, err error) {
err = _i.DB.DB. query := _i.DB.DB.Model(&entity.ActivityLogs{}).Where("activity_type_id = ?", 2)
Model(&entity.ActivityLogs{}). if clientId != nil {
Where("activity_type_id = ?", 2). query = query.Where("client_id = ?", clientId)
Count(&count).Error }
err = query.Count(&count).Error
return 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) tenMinutesAgo := time.Now().Add(-10 * time.Minute)
err = _i.DB.DB. query := _i.DB.DB.Model(&entity.AuditTrails{}).Where("created_at >= ?", tenMinutesAgo)
Model(&entity.AuditTrails{}). if clientId != nil {
Where("created_at >= ?", tenMinutesAgo). query = query.Where("client_id = ?", clientId)
Select("ip"). }
Group("ip"). err = query.Select("ip").Group("ip").Count(&count).Error
Count(&count).Error
return return
} }

View File

@ -1,10 +1,10 @@
package request package request
import ( import (
"go-humas-be/app/database/entity"
"go-humas-be/utils/paginator"
"strconv" "strconv"
"time" "time"
"web-medols-be/app/database/entity"
"web-medols-be/utils/paginator"
) )
type ActivityLogsGeneric interface { type ActivityLogsGeneric interface {

View File

@ -1,16 +1,17 @@
package service package service
import ( import (
"github.com/google/uuid"
"github.com/rs/zerolog" "github.com/rs/zerolog"
"go-humas-be/app/database/entity" "web-medols-be/app/database/entity"
"go-humas-be/app/module/activity_logs/mapper" "web-medols-be/app/module/activity_logs/mapper"
"go-humas-be/app/module/activity_logs/repository" "web-medols-be/app/module/activity_logs/repository"
"go-humas-be/app/module/activity_logs/request" "web-medols-be/app/module/activity_logs/request"
"go-humas-be/app/module/activity_logs/response" "web-medols-be/app/module/activity_logs/response"
"go-humas-be/app/module/articles/service" "web-medols-be/app/module/articles/service"
usersRepository "go-humas-be/app/module/users/repository" usersRepository "web-medols-be/app/module/users/repository"
"go-humas-be/utils/paginator" "web-medols-be/utils/paginator"
utilSvc "go-humas-be/utils/service" utilSvc "web-medols-be/utils/service"
) )
// ActivityLogsService // ActivityLogsService
@ -23,12 +24,12 @@ type activityLogsService struct {
// ActivityLogsService define interface of IActivityLogsService // ActivityLogsService define interface of IActivityLogsService
type ActivityLogsService interface { type ActivityLogsService interface {
All(req request.ActivityLogsQueryRequest) (activityLogs []*response.ActivityLogsResponse, paging paginator.Pagination, err error) All(clientId *uuid.UUID, req request.ActivityLogsQueryRequest) (activityLogs []*response.ActivityLogsResponse, paging paginator.Pagination, err error)
Show(id uint) (activityLogs *response.ActivityLogsResponse, err error) Show(clientId *uuid.UUID, id uint) (activityLogs *response.ActivityLogsResponse, err error)
Save(req request.ActivityLogsCreateRequest, authToken *string) (activityLogs *entity.ActivityLogs, err error) Save(clientId *uuid.UUID, req request.ActivityLogsCreateRequest, authToken *string) (activityLogs *entity.ActivityLogs, err error)
Update(id uint, req request.ActivityLogsUpdateRequest) (err error) Update(clientId *uuid.UUID, id uint, req request.ActivityLogsUpdateRequest) (err error)
Delete(id uint) error Delete(clientId *uuid.UUID, id uint) error
GetActivityStats() (activityStats *response.ActivityStatsResponse, err error) GetActivityStats(clientId *uuid.UUID) (activityStats *response.ActivityStatsResponse, err error)
} }
// NewActivityLogsService init ActivityLogsService // NewActivityLogsService init ActivityLogsService
@ -43,8 +44,8 @@ func NewActivityLogsService(repo repository.ActivityLogsRepository, log zerolog.
} }
// All implement interface of ActivityLogsService // All implement interface of ActivityLogsService
func (_i *activityLogsService) All(req request.ActivityLogsQueryRequest) (activityLogss []*response.ActivityLogsResponse, paging paginator.Pagination, err error) { func (_i *activityLogsService) All(clientId *uuid.UUID, req request.ActivityLogsQueryRequest) (activityLogss []*response.ActivityLogsResponse, paging paginator.Pagination, err error) {
results, paging, err := _i.Repo.GetAll(req) results, paging, err := _i.Repo.GetAll(clientId, req)
if err != nil { if err != nil {
return return
} }
@ -56,8 +57,8 @@ func (_i *activityLogsService) All(req request.ActivityLogsQueryRequest) (activi
return return
} }
func (_i *activityLogsService) Show(id uint) (activityLogs *response.ActivityLogsResponse, err error) { func (_i *activityLogsService) Show(clientId *uuid.UUID, id uint) (activityLogs *response.ActivityLogsResponse, err error) {
result, err := _i.Repo.FindOne(id) result, err := _i.Repo.FindOne(clientId, id)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -65,11 +66,15 @@ func (_i *activityLogsService) Show(id uint) (activityLogs *response.ActivityLog
return mapper.ActivityLogsResponseMapper(result), nil 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("") _i.Log.Info().Interface("data", req).Msg("")
newReq := req.ToEntity() newReq := req.ToEntity()
if clientId != nil {
newReq.ClientId = clientId
}
if authToken != nil { if authToken != nil {
createdBy := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, *authToken) createdBy := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, *authToken)
newReq.UserId = &createdBy.ID newReq.UserId = &createdBy.ID
@ -81,7 +86,7 @@ func (_i *activityLogsService) Save(req request.ActivityLogsCreateRequest, authT
} }
// update article // update article
err = _i.ArticleService.UpdateActivityCount(*req.ArticleId, req.ActivityTypeId) err = _i.ArticleService.UpdateActivityCount(clientId, *req.ArticleId, req.ActivityTypeId)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -89,26 +94,30 @@ func (_i *activityLogsService) Save(req request.ActivityLogsCreateRequest, authT
return result, nil 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("") _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 { func (_i *activityLogsService) Delete(clientId *uuid.UUID, id uint) error {
return _i.Repo.Delete(id) 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("") _i.Log.Info().Interface("GetActivityStats", "checker").Msg("")
countUniqueVisitorAllTime, err := _i.Repo.CountUniqueVisitorAllTime() countUniqueVisitorAllTime, err := _i.Repo.CountUniqueVisitorAllTime(clientId)
if err != nil { if err != nil {
return nil, err return nil, err
} }
countUniqueVisitorToday, err := _i.Repo.CountUniqueVisitorToday() countUniqueVisitorToday, err := _i.Repo.CountUniqueVisitorToday(clientId)
if err != nil { if err != nil {
return nil, err return nil, err
} }
countTotalViewAllTime, err := _i.Repo.CountTotalViewAllTime() countTotalViewAllTime, err := _i.Repo.CountTotalViewAllTime(clientId)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -2,10 +2,10 @@ package advertisement
import ( import (
"github.com/gofiber/fiber/v2" "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" "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 // struct of AdvertisementRouter

View File

@ -3,13 +3,14 @@ package controller
import ( import (
"github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2"
"github.com/rs/zerolog" "github.com/rs/zerolog"
"go-humas-be/app/module/advertisement/request"
"go-humas-be/app/module/advertisement/service"
"go-humas-be/utils/paginator"
"strconv" "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" utilRes "web-medols-be/utils/response"
utilVal "go-humas-be/utils/validator" utilVal "web-medols-be/utils/validator"
) )
type advertisementController struct { type advertisementController struct {
@ -53,6 +54,8 @@ func (_i *advertisementController) All(c *fiber.Ctx) error {
return err return err
} }
clientId := middleware.GetClientID(c)
reqContext := request.AdvertisementQueryRequestContext{ reqContext := request.AdvertisementQueryRequestContext{
Title: c.Query("title"), Title: c.Query("title"),
Description: c.Query("description"), Description: c.Query("description"),
@ -63,7 +66,7 @@ func (_i *advertisementController) All(c *fiber.Ctx) error {
req := reqContext.ToParamRequest() req := reqContext.ToParamRequest()
req.Pagination = paginate req.Pagination = paginate
advertisementData, paging, err := _i.advertisementService.All(req) advertisementData, paging, err := _i.advertisementService.All(clientId, req)
if err != nil { if err != nil {
return err return err
} }
@ -93,7 +96,9 @@ func (_i *advertisementController) Show(c *fiber.Ctx) error {
return err return err
} }
advertisementData, err := _i.advertisementService.Show(uint(id)) clientId := middleware.GetClientID(c)
advertisementData, err := _i.advertisementService.Show(clientId, uint(id))
if err != nil { if err != nil {
return err return err
} }
@ -124,7 +129,9 @@ func (_i *advertisementController) Save(c *fiber.Ctx) error {
return err return err
} }
dataResult, err := _i.advertisementService.Save(*req) clientId := middleware.GetClientID(c)
dataResult, err := _i.advertisementService.Save(clientId, *req)
if err != nil { if err != nil {
return err return err
} }
@ -156,7 +163,9 @@ func (_i *advertisementController) Upload(c *fiber.Ctx) error {
return err return err
} }
err = _i.advertisementService.Upload(c, uint(id)) clientId := middleware.GetClientID(c)
err = _i.advertisementService.Upload(clientId, c, uint(id))
if err != nil { if err != nil {
return err return err
} }
@ -191,7 +200,9 @@ func (_i *advertisementController) Update(c *fiber.Ctx) error {
return err return err
} }
err = _i.advertisementService.Update(uint(id), *req) clientId := middleware.GetClientID(c)
err = _i.advertisementService.Update(clientId, uint(id), *req)
if err != nil { if err != nil {
return err return err
} }
@ -227,7 +238,9 @@ func (_i *advertisementController) UpdatePublish(c *fiber.Ctx) error {
return err return err
} }
err = _i.advertisementService.UpdatePublish(uint(id), isPublish) clientId := middleware.GetClientID(c)
err = _i.advertisementService.UpdatePublish(clientId, uint(id), isPublish)
if err != nil { if err != nil {
return err return err
} }
@ -256,7 +269,9 @@ func (_i *advertisementController) Delete(c *fiber.Ctx) error {
return err return err
} }
err = _i.advertisementService.Delete(uint(id)) clientId := middleware.GetClientID(c)
err = _i.advertisementService.Delete(clientId, uint(id))
if err != nil { if err != nil {
return err return err
} }
@ -279,5 +294,6 @@ func (_i *advertisementController) Delete(c *fiber.Ctx) error {
// @Failure 500 {object} response.InternalServerError // @Failure 500 {object} response.InternalServerError
// @Router /advertisement/viewer/{filename} [get] // @Router /advertisement/viewer/{filename} [get]
func (_i *advertisementController) Viewer(c *fiber.Ctx) error { func (_i *advertisementController) Viewer(c *fiber.Ctx) error {
return _i.advertisementService.Viewer(c) clientId := middleware.GetClientID(c)
return _i.advertisementService.Viewer(clientId, c)
} }

View File

@ -2,7 +2,7 @@ package controller
import ( import (
"github.com/rs/zerolog" "github.com/rs/zerolog"
"go-humas-be/app/module/advertisement/service" "web-medols-be/app/module/advertisement/service"
) )
type Controller struct { type Controller struct {

View File

@ -1,8 +1,8 @@
package mapper package mapper
import ( import (
"go-humas-be/app/database/entity" "web-medols-be/app/database/entity"
res "go-humas-be/app/module/advertisement/response" res "web-medols-be/app/module/advertisement/response"
) )
func AdvertisementResponseMapper(advertisementReq *entity.Advertisement, host string) (advertisementRes *res.AdvertisementResponse) { func AdvertisementResponseMapper(advertisementReq *entity.Advertisement, host string) (advertisementRes *res.AdvertisementResponse) {

View File

@ -2,13 +2,14 @@ package repository
import ( import (
"fmt" "fmt"
"github.com/google/uuid"
"github.com/rs/zerolog" "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" "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 { type advertisementRepository struct {
@ -18,12 +19,12 @@ type advertisementRepository struct {
// AdvertisementRepository define interface of IAdvertisementRepository // AdvertisementRepository define interface of IAdvertisementRepository
type AdvertisementRepository interface { type AdvertisementRepository interface {
GetAll(req request.AdvertisementQueryRequest) (advertisements []*entity.Advertisement, paging paginator.Pagination, err error) GetAll(clientId *uuid.UUID, req request.AdvertisementQueryRequest) (advertisements []*entity.Advertisement, paging paginator.Pagination, err error)
FindOne(id uint) (advertisement *entity.Advertisement, err error) FindOne(clientId *uuid.UUID, id uint) (advertisement *entity.Advertisement, err error)
FindByFilename(contentFilename string) (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) Create(advertisement *entity.Advertisement) (advertisementReturn *entity.Advertisement, err error)
Update(id uint, advertisement *entity.Advertisement) (err error) Update(clientId *uuid.UUID, id uint, advertisement *entity.Advertisement) (err error)
Delete(id uint) (err error) Delete(clientId *uuid.UUID, id uint) (err error)
} }
func NewAdvertisementRepository(db *database.Database, logger zerolog.Logger) AdvertisementRepository { 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 // 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 var count int64
query := _i.DB.DB.Model(&entity.Advertisement{}) 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) query = query.Where("is_active = ?", true)
if req.Title != nil && *req.Title != "" { if req.Title != nil && *req.Title != "" {
@ -82,17 +89,30 @@ func (_i *advertisementRepository) GetAll(req request.AdvertisementQueryRequest)
return return
} }
func (_i *advertisementRepository) FindOne(id uint) (advertisement *entity.Advertisement, err error) { func (_i *advertisementRepository) FindOne(clientId *uuid.UUID, id uint) (advertisement *entity.Advertisement, err error) {
if err := _i.DB.DB.First(&advertisement, id).Error; err != nil { 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 nil, err
} }
return advertisement, nil 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 return nil, err
} }
@ -104,16 +124,22 @@ func (_i *advertisementRepository) Create(advertisement *entity.Advertisement) (
return advertisement, result.Error 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) advertisementMap, err := utilSvc.StructToMap(advertisement)
if err != nil { if err != nil {
return err return err
} }
return _i.DB.DB.Model(&entity.Advertisement{}). query := _i.DB.DB.Model(&entity.Advertisement{}).Where(&entity.Advertisement{ID: id})
Where(&entity.Advertisement{ID: id}). if clientId != nil {
Updates(advertisementMap).Error query = query.Where("client_id = ?", clientId)
}
return query.Updates(advertisementMap).Error
} }
func (_i *advertisementRepository) Delete(id uint) error { func (_i *advertisementRepository) Delete(clientId *uuid.UUID, id uint) error {
return _i.DB.DB.Delete(&entity.Advertisement{}, id).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
} }

View File

@ -1,10 +1,10 @@
package request package request
import ( import (
"go-humas-be/app/database/entity"
"go-humas-be/utils/paginator"
"strconv" "strconv"
"time" "time"
"web-medols-be/app/database/entity"
"web-medols-be/utils/paginator"
) )
type AdvertisementGeneric interface { type AdvertisementGeneric interface {

View File

@ -4,17 +4,9 @@ import (
"context" "context"
"fmt" "fmt"
"github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2"
"github.com/google/uuid"
"github.com/minio/minio-go/v7" "github.com/minio/minio-go/v7"
"github.com/rs/zerolog" "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" "io"
"log" "log"
"math/rand" "math/rand"
@ -23,6 +15,15 @@ import (
"strconv" "strconv"
"strings" "strings"
"time" "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 // AdvertisementService
@ -36,14 +37,14 @@ type advertisementService struct {
// AdvertisementService define interface of IAdvertisementService // AdvertisementService define interface of IAdvertisementService
type AdvertisementService interface { type AdvertisementService interface {
All(req request.AdvertisementQueryRequest) (advertisement []*response.AdvertisementResponse, paging paginator.Pagination, err error) All(clientId *uuid.UUID, req request.AdvertisementQueryRequest) (advertisement []*response.AdvertisementResponse, paging paginator.Pagination, err error)
Show(id uint) (advertisement *response.AdvertisementResponse, err error) Show(clientId *uuid.UUID, id uint) (advertisement *response.AdvertisementResponse, err error)
Save(req request.AdvertisementCreateRequest) (advertisement *entity.Advertisement, err error) Save(clientId *uuid.UUID, req request.AdvertisementCreateRequest) (advertisement *entity.Advertisement, err error)
Upload(c *fiber.Ctx, id uint) (err error) Upload(clientId *uuid.UUID, c *fiber.Ctx, id uint) (err error)
Update(id uint, req request.AdvertisementUpdateRequest) (err error) Update(clientId *uuid.UUID, id uint, req request.AdvertisementUpdateRequest) (err error)
UpdatePublish(id uint, isPublish bool) (err error) UpdatePublish(clientId *uuid.UUID, id uint, isPublish bool) (err error)
Delete(id uint) error Delete(clientId *uuid.UUID, id uint) error
Viewer(c *fiber.Ctx) (err error) Viewer(clientId *uuid.UUID, c *fiber.Ctx) (err error)
} }
// NewAdvertisementService init AdvertisementService // NewAdvertisementService init AdvertisementService
@ -59,8 +60,8 @@ func NewAdvertisementService(repo repository.AdvertisementRepository, minioStora
} }
// All implement interface of AdvertisementService // All implement interface of AdvertisementService
func (_i *advertisementService) All(req request.AdvertisementQueryRequest) (advertisements []*response.AdvertisementResponse, paging paginator.Pagination, err error) { func (_i *advertisementService) All(clientId *uuid.UUID, req request.AdvertisementQueryRequest) (advertisements []*response.AdvertisementResponse, paging paginator.Pagination, err error) {
results, paging, err := _i.Repo.GetAll(req) results, paging, err := _i.Repo.GetAll(clientId, req)
if err != nil { if err != nil {
return return
} }
@ -73,8 +74,8 @@ func (_i *advertisementService) All(req request.AdvertisementQueryRequest) (adve
return return
} }
func (_i *advertisementService) Show(id uint) (advertisement *response.AdvertisementResponse, err error) { func (_i *advertisementService) Show(clientId *uuid.UUID, id uint) (advertisement *response.AdvertisementResponse, err error) {
result, err := _i.Repo.FindOne(id) result, err := _i.Repo.FindOne(clientId, id)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -83,13 +84,18 @@ func (_i *advertisementService) Show(id uint) (advertisement *response.Advertise
return mapper.AdvertisementResponseMapper(result, host), nil 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("") _i.Log.Info().Interface("data", req).Msg("")
newReq := req.ToEntity() newReq := req.ToEntity()
if clientId != nil {
newReq.ClientId = clientId
}
return _i.Repo.Create(newReq) 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 bucketName := _i.MinioStorage.Cfg.ObjectStorage.MinioStorage.BucketName
form, err := c.MultipartForm() form, err := c.MultipartForm()
@ -102,7 +108,7 @@ func (_i *advertisementService) Upload(c *fiber.Ctx, id uint) (err error) {
// Create minio connection. // Create minio connection.
minioClient, err := _i.MinioStorage.ConnectMinio() minioClient, err := _i.MinioStorage.ConnectMinio()
result, err := _i.Repo.FindOne(id) result, err := _i.Repo.FindOne(clientId, id)
if result == nil { if result == nil {
// Return status 400. Id not found. // 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.ContentFileName = &newFilename
result.ContentFilePath = &objectName result.ContentFilePath = &objectName
err = _i.Repo.Update(id, result) err = _i.Repo.Update(clientId, id, result)
if err != nil { if err != nil {
return err return err
} }
@ -170,12 +176,16 @@ func (_i *advertisementService) Upload(c *fiber.Ctx, id uint) (err error) {
return 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("") _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(). _i.Log.Info().Str("timestamp", time.Now().
Format(time.RFC3339)).Str("Service:Resource", "UpdatePublish"). Format(time.RFC3339)).Str("Service:Resource", "UpdatePublish").
Interface("ids", id).Msg("") 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"). Format(time.RFC3339)).Str("Service:Resource", "UpdatePublish").
Interface("isPublish", isPublish).Msg("") Interface("isPublish", isPublish).Msg("")
result, err := _i.Repo.FindOne(id) result, err := _i.Repo.FindOne(clientId, id)
if err != nil { if err != nil {
return err return err
} }
@ -194,21 +204,24 @@ func (_i *advertisementService) UpdatePublish(id uint, isPublish bool) (err erro
Format(time.RFC3339)).Str("Service:Resource", "UpdatePublish"). Format(time.RFC3339)).Str("Service:Resource", "UpdatePublish").
Interface("result", result).Msg("") Interface("result", result).Msg("")
return _i.Repo.Update(id, result) return _i.Repo.Update(clientId, id, result)
} }
func (_i *advertisementService) Delete(id uint) error { func (_i *advertisementService) Delete(clientId *uuid.UUID, id uint) error {
result, err := _i.Repo.FindOne(id) result, err := _i.Repo.FindOne(clientId, id)
if err != nil { if err != nil {
return err return err
} }
result.IsActive = false 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") filename := c.Params("filename")
result, err := _i.Repo.FindByFilename(filename) result, err := _i.Repo.FindByFilename(clientId, filename)
if err != nil { if err != nil {
return err return err
} }

View File

@ -2,10 +2,10 @@ package article_approvals
import ( import (
"github.com/gofiber/fiber/v2" "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" "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 // struct of ArticleApprovalsRouter

View File

@ -3,13 +3,14 @@ package controller
import ( import (
"github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2"
"github.com/rs/zerolog" "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" "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" utilRes "web-medols-be/utils/response"
utilVal "go-humas-be/utils/validator" utilVal "web-medols-be/utils/validator"
) )
type articleApprovalsController struct { type articleApprovalsController struct {
@ -122,7 +123,11 @@ func (_i *articleApprovalsController) Save(c *fiber.Ctx) error {
} }
authToken := c.Get("Authorization") 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 { if err != nil {
return err return err
} }

View File

@ -2,7 +2,7 @@ package controller
import ( import (
"github.com/rs/zerolog" "github.com/rs/zerolog"
"go-humas-be/app/module/article_approvals/service" "web-medols-be/app/module/article_approvals/service"
) )
type Controller struct { type Controller struct {

View File

@ -1,8 +1,8 @@
package mapper package mapper
import ( import (
"go-humas-be/app/database/entity" "web-medols-be/app/database/entity"
res "go-humas-be/app/module/article_approvals/response" res "web-medols-be/app/module/article_approvals/response"
) )
func ArticleApprovalsResponseMapper(articleApprovalsReq *entity.ArticleApprovals) (articleApprovalsRes *res.ArticleApprovalsResponse) { func ArticleApprovalsResponseMapper(articleApprovalsReq *entity.ArticleApprovals) (articleApprovalsRes *res.ArticleApprovalsResponse) {

View File

@ -3,12 +3,12 @@ package repository
import ( import (
"fmt" "fmt"
"github.com/rs/zerolog" "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" "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 { type articleApprovalsRepository struct {

View File

@ -1,9 +1,9 @@
package request package request
import ( import (
"go-humas-be/app/database/entity"
"go-humas-be/utils/paginator"
"strconv" "strconv"
"web-medols-be/app/database/entity"
"web-medols-be/utils/paginator"
) )
type ArticleApprovalsGeneric interface { type ArticleApprovalsGeneric interface {

View File

@ -1,17 +1,18 @@
package service package service
import ( import (
"github.com/google/uuid"
"github.com/rs/zerolog" "github.com/rs/zerolog"
"go-humas-be/app/database/entity" "web-medols-be/app/database/entity"
"go-humas-be/app/module/article_approvals/mapper" "web-medols-be/app/module/article_approvals/mapper"
"go-humas-be/app/module/article_approvals/repository" "web-medols-be/app/module/article_approvals/repository"
"go-humas-be/app/module/article_approvals/request" "web-medols-be/app/module/article_approvals/request"
"go-humas-be/app/module/article_approvals/response" "web-medols-be/app/module/article_approvals/response"
articlesService "go-humas-be/app/module/articles/service" articlesService "web-medols-be/app/module/articles/service"
usersRepository "go-humas-be/app/module/users/repository" usersRepository "web-medols-be/app/module/users/repository"
"go-humas-be/utils/paginator" "web-medols-be/utils/paginator"
utilSvc "go-humas-be/utils/service" utilSvc "web-medols-be/utils/service"
) )
// ArticleApprovalsService // ArticleApprovalsService
@ -26,7 +27,7 @@ type articleApprovalsService struct {
type ArticleApprovalsService interface { type ArticleApprovalsService interface {
All(req request.ArticleApprovalsQueryRequest) (articleApprovals []*response.ArticleApprovalsResponse, paging paginator.Pagination, err error) All(req request.ArticleApprovalsQueryRequest) (articleApprovals []*response.ArticleApprovalsResponse, paging paginator.Pagination, err error)
Show(id uint) (articleApprovals *response.ArticleApprovalsResponse, 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) Update(id uint, req request.ArticleApprovalsUpdateRequest) (err error)
Delete(id uint) error Delete(id uint) error
} }
@ -65,7 +66,7 @@ func (_i *articleApprovalsService) Show(id uint) (articleApprovals *response.Art
return mapper.ArticleApprovalsResponseMapper(result), nil 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("") _i.Log.Info().Interface("data", req).Msg("")
newReq := req.ToEntity() newReq := req.ToEntity()
@ -77,7 +78,7 @@ func (_i *articleApprovalsService) Save(req request.ArticleApprovalsCreateReques
approvalByUserLevelId := createdBy.UserLevelId approvalByUserLevelId := createdBy.UserLevelId
approvalParentLevelId := createdBy.UserLevel.ParentLevelId 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 { if err != nil {
return nil, err return nil, err
} }

View File

@ -2,10 +2,10 @@ package article_categories
import ( import (
"github.com/gofiber/fiber/v2" "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" "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 // struct of ArticleCategoriesRouter

View File

@ -2,13 +2,14 @@ package controller
import ( import (
"github.com/gofiber/fiber/v2" "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" "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" utilRes "web-medols-be/utils/response"
utilVal "go-humas-be/utils/validator" utilVal "web-medols-be/utils/validator"
) )
type articleCategoriesController struct { type articleCategoriesController struct {
@ -53,6 +54,7 @@ func (_i *articleCategoriesController) All(c *fiber.Ctx) error {
} }
authToken := c.Get("Authorization") authToken := c.Get("Authorization")
clientId := middleware.GetClientID(c)
reqContext := request.ArticleCategoriesQueryRequestContext{ reqContext := request.ArticleCategoriesQueryRequestContext{
Title: c.Query("title"), Title: c.Query("title"),
@ -64,7 +66,7 @@ func (_i *articleCategoriesController) All(c *fiber.Ctx) error {
req := reqContext.ToParamRequest() req := reqContext.ToParamRequest()
req.Pagination = paginate req.Pagination = paginate
articleCategoriesData, paging, err := _i.articleCategoriesService.All(req, authToken) articleCategoriesData, paging, err := _i.articleCategoriesService.All(clientId, req, authToken)
if err != nil { if err != nil {
return err return err
} }
@ -94,7 +96,9 @@ func (_i *articleCategoriesController) Show(c *fiber.Ctx) error {
return err return err
} }
articleCategoriesData, err := _i.articleCategoriesService.Show(uint(id)) clientId := middleware.GetClientID(c)
articleCategoriesData, err := _i.articleCategoriesService.Show(clientId, uint(id))
if err != nil { if err != nil {
return err return err
} }
@ -123,7 +127,9 @@ func (_i *articleCategoriesController) ShowByOldId(c *fiber.Ctx) error {
return err return err
} }
articleCategoriesData, err := _i.articleCategoriesService.ShowByOldId(uint(id)) clientId := middleware.GetClientID(c)
articleCategoriesData, err := _i.articleCategoriesService.ShowByOldId(clientId, uint(id))
if err != nil { if err != nil {
return err return err
} }
@ -148,8 +154,9 @@ func (_i *articleCategoriesController) ShowByOldId(c *fiber.Ctx) error {
// @Router /article-categories/slug/{slug} [get] // @Router /article-categories/slug/{slug} [get]
func (_i *articleCategoriesController) ShowBySlug(c *fiber.Ctx) error { func (_i *articleCategoriesController) ShowBySlug(c *fiber.Ctx) error {
slug := c.Params("slug") slug := c.Params("slug")
clientId := middleware.GetClientID(c)
articleCategoriesData, err := _i.articleCategoriesService.ShowBySlug(slug) articleCategoriesData, err := _i.articleCategoriesService.ShowBySlug(clientId, slug)
if err != nil { if err != nil {
return err return err
} }
@ -181,7 +188,9 @@ func (_i *articleCategoriesController) Save(c *fiber.Ctx) error {
} }
authToken := c.Get("Authorization") 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 { if err != nil {
return err return err
} }
@ -208,7 +217,8 @@ func (_i *articleCategoriesController) Save(c *fiber.Ctx) error {
// @Failure 500 {object} response.InternalServerError // @Failure 500 {object} response.InternalServerError
// @Router /article-categories/thumbnail/{id} [post] // @Router /article-categories/thumbnail/{id} [post]
func (_i *articleCategoriesController) SaveThumbnail(c *fiber.Ctx) error { 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 { if err != nil {
return err return err
} }
@ -243,7 +253,8 @@ func (_i *articleCategoriesController) Update(c *fiber.Ctx) error {
return err return err
} }
err = _i.articleCategoriesService.Update(uint(id), *req) clientId := middleware.GetClientID(c)
err = _i.articleCategoriesService.Update(clientId, uint(id), *req)
if err != nil { if err != nil {
return err return err
} }
@ -272,7 +283,8 @@ func (_i *articleCategoriesController) Delete(c *fiber.Ctx) error {
return err return err
} }
err = _i.articleCategoriesService.Delete(uint(id)) clientId := middleware.GetClientID(c)
err = _i.articleCategoriesService.Delete(clientId, uint(id))
if err != nil { if err != nil {
return err return err
} }

View File

@ -1,6 +1,6 @@
package controller package controller
import "go-humas-be/app/module/article_categories/service" import "web-medols-be/app/module/article_categories/service"
type Controller struct { type Controller struct {
ArticleCategories ArticleCategoriesController ArticleCategories ArticleCategoriesController
@ -10,4 +10,4 @@ func NewController(ArticleCategoriesService service.ArticleCategoriesService) *C
return &Controller{ return &Controller{
ArticleCategories: NewArticleCategoriesController(ArticleCategoriesService), ArticleCategories: NewArticleCategoriesController(ArticleCategoriesService),
} }
} }

View File

@ -1,10 +1,10 @@
package mapper package mapper
import ( import (
"go-humas-be/app/database/entity"
res "go-humas-be/app/module/article_categories/response"
"strconv" "strconv"
"strings" "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) { func ArticleCategoriesResponseMapper(articleCategoriesReq *entity.ArticleCategories, host string) (articleCategoriesRes *res.ArticleCategoriesResponse) {

View File

@ -2,13 +2,14 @@ package repository
import ( import (
"fmt" "fmt"
"github.com/google/uuid"
"github.com/rs/zerolog" "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" "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 { type articleCategoriesRepository struct {
@ -18,13 +19,13 @@ type articleCategoriesRepository struct {
// ArticleCategoriesRepository define interface of IArticleCategoriesRepository // ArticleCategoriesRepository define interface of IArticleCategoriesRepository
type ArticleCategoriesRepository interface { type ArticleCategoriesRepository interface {
GetAll(req request.ArticleCategoriesQueryRequest) (articleCategoriess []*entity.ArticleCategories, paging paginator.Pagination, err error) GetAll(clientId *uuid.UUID, req request.ArticleCategoriesQueryRequest) (articleCategoriess []*entity.ArticleCategories, paging paginator.Pagination, err error)
FindOne(id uint) (articleCategories *entity.ArticleCategories, err error) FindOne(clientId *uuid.UUID, id uint) (articleCategories *entity.ArticleCategories, err error)
FindOneByOldId(id uint) (articleCategories *entity.ArticleCategories, err error) FindOneByOldId(clientId *uuid.UUID, id uint) (articleCategories *entity.ArticleCategories, err error)
FindOneBySlug(slug string) (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) Create(articleCategories *entity.ArticleCategories) (articleCategoriesReturn *entity.ArticleCategories, err error)
Update(id uint, articleCategories *entity.ArticleCategories) (err error) Update(clientId *uuid.UUID, id uint, articleCategories *entity.ArticleCategories) (err error)
Delete(id uint) (err error) Delete(clientId *uuid.UUID, id uint) (err error)
} }
func NewArticleCategoriesRepository(db *database.Database, log zerolog.Logger) ArticleCategoriesRepository { 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 // 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 var count int64
query := _i.DB.DB.Model(&entity.ArticleCategories{}) 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 { if req.UserLevelId != nil {
query = _i.DB.DB.Model(&entity.ArticleCategories{}). query = _i.DB.DB.Model(&entity.ArticleCategories{}).
Joins("LEFT JOIN users ON article_categories.created_by_id = users.id"). 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"). 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) 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) query = query.Where("article_categories.is_active = ?", true)
@ -90,24 +101,45 @@ func (_i *articleCategoriesRepository) GetAll(req request.ArticleCategoriesQuery
return return
} }
func (_i *articleCategoriesRepository) FindOne(id uint) (articleCategories *entity.ArticleCategories, err error) { func (_i *articleCategoriesRepository) FindOne(clientId *uuid.UUID, id uint) (articleCategories *entity.ArticleCategories, err error) {
if err := _i.DB.DB.First(&articleCategories, id).Error; err != nil { 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 nil, err
} }
return articleCategories, nil return articleCategories, nil
} }
func (_i *articleCategoriesRepository) FindOneByOldId(id uint) (articleCategories *entity.ArticleCategories, err error) { func (_i *articleCategoriesRepository) FindOneByOldId(clientId *uuid.UUID, id uint) (articleCategories *entity.ArticleCategories, err error) {
if err := _i.DB.DB.Where("old_category_id = ?", id).First(&articleCategories).Error; err != nil { 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 nil, err
} }
return articleCategories, nil return articleCategories, nil
} }
func (_i *articleCategoriesRepository) FindOneBySlug(slug string) (articleCategories *entity.ArticleCategories, err error) { func (_i *articleCategoriesRepository) FindOneBySlug(clientId *uuid.UUID, slug string) (articleCategories *entity.ArticleCategories, err error) {
if err := _i.DB.DB.Where("slug = ?", slug).First(&articleCategories).Error; err != nil { 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 return nil, err
} }
@ -119,16 +151,22 @@ func (_i *articleCategoriesRepository) Create(articleCategories *entity.ArticleC
return articleCategories, result.Error 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) articleCategoriesMap, err := utilSvc.StructToMap(articleCategories)
if err != nil { if err != nil {
return err return err
} }
return _i.DB.DB.Model(&entity.ArticleCategories{}). query := _i.DB.DB.Model(&entity.ArticleCategories{}).Where(&entity.ArticleCategories{ID: id})
Where(&entity.ArticleCategories{ID: id}). if clientId != nil {
Updates(articleCategoriesMap).Error query = query.Where("client_id = ?", clientId)
}
return query.Updates(articleCategoriesMap).Error
} }
func (_i *articleCategoriesRepository) Delete(id uint) error { func (_i *articleCategoriesRepository) Delete(clientId *uuid.UUID, id uint) error {
return _i.DB.DB.Delete(&entity.ArticleCategories{}, id).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
} }

View File

@ -1,10 +1,10 @@
package request package request
import ( import (
"go-humas-be/app/database/entity"
"go-humas-be/utils/paginator"
"strconv" "strconv"
"time" "time"
"web-medols-be/app/database/entity"
"web-medols-be/utils/paginator"
) )
type ArticleCategoriesGeneric interface { type ArticleCategoriesGeneric interface {

View File

@ -3,18 +3,9 @@ package service
import ( import (
"context" "context"
"github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2"
"github.com/google/uuid"
"github.com/minio/minio-go/v7" "github.com/minio/minio-go/v7"
"github.com/rs/zerolog" "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" "io"
"log" "log"
"math/rand" "math/rand"
@ -23,6 +14,16 @@ import (
"strconv" "strconv"
"strings" "strings"
"time" "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 // ArticleCategoriesService
@ -36,14 +37,14 @@ type articleCategoriesService struct {
// ArticleCategoriesService define interface of IArticleCategoriesService // ArticleCategoriesService define interface of IArticleCategoriesService
type ArticleCategoriesService interface { type ArticleCategoriesService interface {
All(req request.ArticleCategoriesQueryRequest, authToken string) (articleCategories []*response.ArticleCategoriesResponse, paging paginator.Pagination, err error) All(clientId *uuid.UUID, req request.ArticleCategoriesQueryRequest, authToken string) (articleCategories []*response.ArticleCategoriesResponse, paging paginator.Pagination, err error)
Show(id uint) (articleCategories *response.ArticleCategoriesResponse, err error) Show(clientId *uuid.UUID, id uint) (articleCategories *response.ArticleCategoriesResponse, err error)
ShowByOldId(id uint) (articleCategories *response.ArticleCategoriesResponse, err error) ShowByOldId(clientId *uuid.UUID, id uint) (articleCategories *response.ArticleCategoriesResponse, err error)
ShowBySlug(slug string) (articleCategories *response.ArticleCategoriesResponse, err error) ShowBySlug(clientId *uuid.UUID, slug string) (articleCategories *response.ArticleCategoriesResponse, err error)
Save(req request.ArticleCategoriesCreateRequest, authToken string) (articleCategories *entity.ArticleCategories, err error) Save(clientId *uuid.UUID, req request.ArticleCategoriesCreateRequest, authToken string) (articleCategories *entity.ArticleCategories, err error)
SaveThumbnail(c *fiber.Ctx) (err error) SaveThumbnail(clientId *uuid.UUID, c *fiber.Ctx) (err error)
Update(id uint, req request.ArticleCategoriesUpdateRequest) (err error) Update(clientId *uuid.UUID, id uint, req request.ArticleCategoriesUpdateRequest) (err error)
Delete(id uint) error Delete(clientId *uuid.UUID, id uint) error
Viewer(c *fiber.Ctx) error Viewer(c *fiber.Ctx) error
} }
@ -60,7 +61,7 @@ func NewArticleCategoriesService(repo repository.ArticleCategoriesRepository, us
} }
// All implement interface of ArticleCategoriesService // 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) createdBy := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if createdBy != nil { if createdBy != nil {
if createdBy.UserLevel.LevelNumber > 1 { 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 { if err != nil {
return return
} }
@ -81,8 +82,8 @@ func (_i *articleCategoriesService) All(req request.ArticleCategoriesQueryReques
return return
} }
func (_i *articleCategoriesService) Show(id uint) (articleCategories *response.ArticleCategoriesResponse, err error) { func (_i *articleCategoriesService) Show(clientId *uuid.UUID, id uint) (articleCategories *response.ArticleCategoriesResponse, err error) {
result, err := _i.Repo.FindOne(id) result, err := _i.Repo.FindOne(clientId, id)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -90,8 +91,8 @@ func (_i *articleCategoriesService) Show(id uint) (articleCategories *response.A
return mapper.ArticleCategoriesResponseMapper(result, host), nil return mapper.ArticleCategoriesResponseMapper(result, host), nil
} }
func (_i *articleCategoriesService) ShowByOldId(id uint) (articleCategories *response.ArticleCategoriesResponse, err error) { func (_i *articleCategoriesService) ShowByOldId(clientId *uuid.UUID, id uint) (articleCategories *response.ArticleCategoriesResponse, err error) {
result, err := _i.Repo.FindOneByOldId(id) result, err := _i.Repo.FindOneByOldId(clientId, id)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -99,8 +100,8 @@ func (_i *articleCategoriesService) ShowByOldId(id uint) (articleCategories *res
return mapper.ArticleCategoriesResponseMapper(result, host), nil return mapper.ArticleCategoriesResponseMapper(result, host), nil
} }
func (_i *articleCategoriesService) ShowBySlug(slug string) (articleCategories *response.ArticleCategoriesResponse, err error) { func (_i *articleCategoriesService) ShowBySlug(clientId *uuid.UUID, slug string) (articleCategories *response.ArticleCategoriesResponse, err error) {
result, err := _i.Repo.FindOneBySlug(slug) result, err := _i.Repo.FindOneBySlug(clientId, slug)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -108,10 +109,14 @@ func (_i *articleCategoriesService) ShowBySlug(slug string) (articleCategories *
return mapper.ArticleCategoriesResponseMapper(result, host), nil 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("") _i.Log.Info().Interface("data", req).Msg("")
newReq := req.ToEntity() newReq := req.ToEntity()
if clientId != nil {
newReq.ClientId = clientId
}
if req.CreatedById != nil { if req.CreatedById != nil {
createdBy, err := _i.UsersRepo.FindOne(*req.CreatedById) createdBy, err := _i.UsersRepo.FindOne(*req.CreatedById)
if err != nil { if err != nil {
@ -126,8 +131,7 @@ func (_i *articleCategoriesService) Save(req request.ArticleCategoriesCreateRequ
return _i.Repo.Create(newReq) 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) id, err := strconv.ParseUint(c.Params("id"), 10, 0)
if err != nil { if err != nil {
return err return err
@ -153,7 +157,6 @@ func (_i *articleCategoriesService) SaveThumbnail(c *fiber.Ctx) (err error) {
// Iterasi semua file yang diunggah // Iterasi semua file yang diunggah
for _, file := range files { for _, file := range files {
_i.Log.Info().Str("timestamp", time.Now(). _i.Log.Info().Str("timestamp", time.Now().
Format(time.RFC3339)).Str("Service:Resource", "Uploader:: loop1"). Format(time.RFC3339)).Str("Service:Resource", "Uploader:: loop1").
Interface("data", file).Msg("") Interface("data", file).Msg("")
@ -175,9 +178,9 @@ func (_i *articleCategoriesService) SaveThumbnail(c *fiber.Ctx) (err error) {
newFilename := newFilenameWithoutExt + "." + extension newFilename := newFilenameWithoutExt + "." + extension
objectName := "articles/category/thumbnail/" + newFilename objectName := "articles/category/thumbnail/" + newFilename
findCategory, err := _i.Repo.FindOne(uint(id)) findCategory, err := _i.Repo.FindOne(clientId, uint(id))
findCategory.ThumbnailPath = &objectName findCategory.ThumbnailPath = &objectName
err = _i.Repo.Update(uint(id), findCategory) err = _i.Repo.Update(clientId, uint(id), findCategory)
if err != nil { if err != nil {
return err return err
} }
@ -192,10 +195,13 @@ func (_i *articleCategoriesService) SaveThumbnail(c *fiber.Ctx) (err error) {
return 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("") _i.Log.Info().Interface("data", req).Msg("")
newReq := req.ToEntity() newReq := req.ToEntity()
if clientId != nil {
newReq.ClientId = clientId
}
if req.CreatedById != nil { if req.CreatedById != nil {
createdBy, err := _i.UsersRepo.FindOne(*req.CreatedById) createdBy, err := _i.UsersRepo.FindOne(*req.CreatedById)
if err != nil { if err != nil {
@ -204,23 +210,26 @@ func (_i *articleCategoriesService) Update(id uint, req request.ArticleCategorie
newReq.CreatedById = &createdBy.ID newReq.CreatedById = &createdBy.ID
} }
return _i.Repo.Update(id, newReq) return _i.Repo.Update(clientId, id, newReq)
} }
func (_i *articleCategoriesService) Delete(id uint) error { func (_i *articleCategoriesService) Delete(clientId *uuid.UUID, id uint) error {
result, err := _i.Repo.FindOne(id) result, err := _i.Repo.FindOne(clientId, id)
if err != nil { if err != nil {
return err return err
} }
isActive := false isActive := false
result.IsActive = &isActive 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) { func (_i *articleCategoriesService) Viewer(c *fiber.Ctx) (err error) {
id, err := strconv.ParseUint(c.Params("id"), 10, 0) 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 { if err != nil {
return err return err
} }

View File

@ -2,10 +2,10 @@ package article_category_details
import ( import (
"github.com/gofiber/fiber/v2" "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" "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 // struct of ArticleCategoryDetailsRouter

View File

@ -2,13 +2,13 @@ package controller
import ( import (
"github.com/gofiber/fiber/v2" "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" "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" utilRes "web-medols-be/utils/response"
utilVal "go-humas-be/utils/validator" utilVal "web-medols-be/utils/validator"
) )
type articleCategoryDetailsController struct { type articleCategoryDetailsController struct {

View File

@ -1,6 +1,6 @@
package controller 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 { type Controller struct {
ArticleCategoryDetails ArticleCategoryDetailsController ArticleCategoryDetails ArticleCategoryDetailsController
@ -10,4 +10,4 @@ func NewController(ArticleCategoryDetailsService service.ArticleCategoryDetailsS
return &Controller{ return &Controller{
ArticleCategoryDetails: NewArticleCategoryDetailsController(ArticleCategoryDetailsService), ArticleCategoryDetails: NewArticleCategoryDetailsController(ArticleCategoryDetailsService),
} }
} }

View File

@ -1,8 +1,8 @@
package mapper package mapper
import ( import (
"go-humas-be/app/database/entity/article_category_details" "web-medols-be/app/database/entity/article_category_details"
res "go-humas-be/app/module/article_category_details/response" res "web-medols-be/app/module/article_category_details/response"
) )
func ArticleCategoryDetailsResponseMapper(articleCategoryDetailsReq *article_category_details.ArticleCategoryDetails) (articleCategoryDetailsRes *res.ArticleCategoryDetailsResponse) { func ArticleCategoryDetailsResponseMapper(articleCategoryDetailsReq *article_category_details.ArticleCategoryDetails) (articleCategoryDetailsRes *res.ArticleCategoryDetailsResponse) {

View File

@ -1,10 +1,10 @@
package repository package repository
import ( import (
"go-humas-be/app/database" "web-medols-be/app/database"
"go-humas-be/app/database/entity/article_category_details" "web-medols-be/app/database/entity/article_category_details"
"go-humas-be/app/module/article_category_details/request" "web-medols-be/app/module/article_category_details/request"
"go-humas-be/utils/paginator" "web-medols-be/utils/paginator"
) )
type articleCategoryDetailsRepository struct { type articleCategoryDetailsRepository struct {

View File

@ -1,9 +1,9 @@
package request package request
import ( import (
"go-humas-be/app/database/entity/article_category_details"
"go-humas-be/utils/paginator"
"time" "time"
"web-medols-be/app/database/entity/article_category_details"
"web-medols-be/utils/paginator"
) )
type ArticleCategoryDetailsGeneric interface { type ArticleCategoryDetailsGeneric interface {

View File

@ -2,11 +2,11 @@ package service
import ( import (
"github.com/rs/zerolog" "github.com/rs/zerolog"
"go-humas-be/app/module/article_category_details/mapper" "web-medols-be/app/module/article_category_details/mapper"
"go-humas-be/app/module/article_category_details/repository" "web-medols-be/app/module/article_category_details/repository"
"go-humas-be/app/module/article_category_details/request" "web-medols-be/app/module/article_category_details/request"
"go-humas-be/app/module/article_category_details/response" "web-medols-be/app/module/article_category_details/response"
"go-humas-be/utils/paginator" "web-medols-be/utils/paginator"
) )
// ArticleCategoryDetailsService // ArticleCategoryDetailsService

View File

@ -2,10 +2,10 @@ package article_comments
import ( import (
"github.com/gofiber/fiber/v2" "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" "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 // struct of ArticleCommentsRouter

View File

@ -3,12 +3,13 @@ package controller
import ( import (
"github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2"
"github.com/rs/zerolog" "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" "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 { type articleCommentsController struct {
@ -45,6 +46,9 @@ func NewArticleCommentsController(articleCommentsService service.ArticleComments
// @Failure 500 {object} response.InternalServerError // @Failure 500 {object} response.InternalServerError
// @Router /article-comments [get] // @Router /article-comments [get]
func (_i *articleCommentsController) All(c *fiber.Ctx) error { func (_i *articleCommentsController) All(c *fiber.Ctx) error {
// Get ClientId from context
clientId := middleware.GetClientID(c)
paginate, err := paginator.Paginate(c) paginate, err := paginator.Paginate(c)
if err != nil { if err != nil {
return err return err
@ -60,7 +64,7 @@ func (_i *articleCommentsController) All(c *fiber.Ctx) error {
req := reqContext.ToParamRequest() req := reqContext.ToParamRequest()
req.Pagination = paginate req.Pagination = paginate
articleCommentsData, paging, err := _i.articleCommentsService.All(req) articleCommentsData, paging, err := _i.articleCommentsService.All(clientId, req)
if err != nil { if err != nil {
return err return err
} }
@ -85,12 +89,15 @@ func (_i *articleCommentsController) All(c *fiber.Ctx) error {
// @Failure 500 {object} response.InternalServerError // @Failure 500 {object} response.InternalServerError
// @Router /article-comments/{id} [get] // @Router /article-comments/{id} [get]
func (_i *articleCommentsController) Show(c *fiber.Ctx) error { 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) id, err := strconv.ParseUint(c.Params("id"), 10, 0)
if err != nil { if err != nil {
return err return err
} }
articleCommentsData, err := _i.articleCommentsService.Show(uint(id)) articleCommentsData, err := _i.articleCommentsService.Show(clientId, uint(id))
if err != nil { if err != nil {
return err return err
} }
@ -116,13 +123,16 @@ func (_i *articleCommentsController) Show(c *fiber.Ctx) error {
// @Failure 500 {object} response.InternalServerError // @Failure 500 {object} response.InternalServerError
// @Router /article-comments [post] // @Router /article-comments [post]
func (_i *articleCommentsController) Save(c *fiber.Ctx) error { func (_i *articleCommentsController) Save(c *fiber.Ctx) error {
// Get ClientId from context
clientId := middleware.GetClientID(c)
req := new(request.ArticleCommentsCreateRequest) req := new(request.ArticleCommentsCreateRequest)
if err := utilVal.ParseAndValidate(c, req); err != nil { if err := utilVal.ParseAndValidate(c, req); err != nil {
return err return err
} }
authToken := c.Get("Authorization") authToken := c.Get("Authorization")
dataResult, err := _i.articleCommentsService.Save(*req, authToken) dataResult, err := _i.articleCommentsService.Save(clientId, *req, authToken)
if err != nil { if err != nil {
return err return err
} }
@ -148,6 +158,9 @@ func (_i *articleCommentsController) Save(c *fiber.Ctx) error {
// @Failure 500 {object} response.InternalServerError // @Failure 500 {object} response.InternalServerError
// @Router /article-comments/{id} [put] // @Router /article-comments/{id} [put]
func (_i *articleCommentsController) Update(c *fiber.Ctx) error { 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) id, err := strconv.ParseUint(c.Params("id"), 10, 0)
if err != nil { if err != nil {
return err return err
@ -158,7 +171,7 @@ func (_i *articleCommentsController) Update(c *fiber.Ctx) error {
return err return err
} }
err = _i.articleCommentsService.Update(uint(id), *req) err = _i.articleCommentsService.Update(clientId, uint(id), *req)
if err != nil { if err != nil {
return err return err
} }
@ -182,12 +195,15 @@ func (_i *articleCommentsController) Update(c *fiber.Ctx) error {
// @Failure 500 {object} response.InternalServerError // @Failure 500 {object} response.InternalServerError
// @Router /article-comments/{id} [delete] // @Router /article-comments/{id} [delete]
func (_i *articleCommentsController) Delete(c *fiber.Ctx) error { 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) id, err := strconv.ParseUint(c.Params("id"), 10, 0)
if err != nil { if err != nil {
return err return err
} }
err = _i.articleCommentsService.Delete(uint(id)) err = _i.articleCommentsService.Delete(clientId, uint(id))
if err != nil { if err != nil {
return err return err
} }
@ -211,12 +227,15 @@ func (_i *articleCommentsController) Delete(c *fiber.Ctx) error {
// @Failure 500 {object} response.InternalServerError // @Failure 500 {object} response.InternalServerError
// @Router /article-comments/approval [post] // @Router /article-comments/approval [post]
func (_i *articleCommentsController) Approval(c *fiber.Ctx) error { func (_i *articleCommentsController) Approval(c *fiber.Ctx) error {
// Get ClientId from context
clientId := middleware.GetClientID(c)
req := new(request.ArticleCommentsApprovalRequest) req := new(request.ArticleCommentsApprovalRequest)
if err := utilVal.ParseAndValidate(c, req); err != nil { if err := utilVal.ParseAndValidate(c, req); err != nil {
return err return err
} }
err := _i.articleCommentsService.Approval(req.ID, *req) err := _i.articleCommentsService.Approval(clientId, req.ID, *req)
if err != nil { if err != nil {
return err return err
} }

View File

@ -2,7 +2,7 @@ package controller
import ( import (
"github.com/rs/zerolog" "github.com/rs/zerolog"
"go-humas-be/app/module/article_comments/service" "web-medols-be/app/module/article_comments/service"
) )
type Controller struct { type Controller struct {

View File

@ -1,17 +1,18 @@
package mapper package mapper
import ( import (
"go-humas-be/app/database/entity" "github.com/google/uuid"
res "go-humas-be/app/module/article_comments/response" "web-medols-be/app/database/entity"
usersRepository "go-humas-be/app/module/users/repository" 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 { if articleCommentsReq != nil {
commentFromName := "" commentFromName := ""
if articleCommentsReq.CommentFrom != nil { if articleCommentsReq.CommentFrom != nil {
findUser, _ := usersRepo.FindOne(*articleCommentsReq.CommentFrom) findUser, _ := usersRepo.FindOne(clientId, *articleCommentsReq.CommentFrom)
if findUser != nil { if findUser != nil {
commentFromName = findUser.Fullname commentFromName = findUser.Fullname
} }

View File

@ -2,13 +2,14 @@ package repository
import ( import (
"fmt" "fmt"
"github.com/google/uuid"
"github.com/rs/zerolog" "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" "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 { type articleCommentsRepository struct {
@ -18,11 +19,11 @@ type articleCommentsRepository struct {
// ArticleCommentsRepository define interface of IArticleCommentsRepository // ArticleCommentsRepository define interface of IArticleCommentsRepository
type ArticleCommentsRepository interface { type ArticleCommentsRepository interface {
GetAll(req request.ArticleCommentsQueryRequest) (articleCommentss []*entity.ArticleComments, paging paginator.Pagination, err error) GetAll(clientId *uuid.UUID, req request.ArticleCommentsQueryRequest) (articleCommentss []*entity.ArticleComments, paging paginator.Pagination, err error)
FindOne(id uint) (articleComments *entity.ArticleComments, err error) FindOne(clientId *uuid.UUID, id uint) (articleComments *entity.ArticleComments, err error)
Create(articleComments *entity.ArticleComments) (articleCommentsReturn *entity.ArticleComments, err error) Create(clientId *uuid.UUID, articleComments *entity.ArticleComments) (articleCommentsReturn *entity.ArticleComments, err error)
Update(id uint, articleComments *entity.ArticleComments) (err error) Update(clientId *uuid.UUID, id uint, articleComments *entity.ArticleComments) (err error)
Delete(id uint) (err error) Delete(clientId *uuid.UUID, id uint) (err error)
} }
func NewArticleCommentsRepository(db *database.Database, logger zerolog.Logger) ArticleCommentsRepository { 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 // 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 var count int64
query := _i.DB.DB.Model(&entity.ArticleComments{}) query := _i.DB.DB.Model(&entity.ArticleComments{})
query = query.Where("is_active = ?", true) query = query.Where("is_active = ?", true)
// Add client filter
if clientId != nil {
query = query.Where("client_id = ?", clientId)
}
if req.Message != nil && *req.Message != "" { if req.Message != nil && *req.Message != "" {
message := strings.ToLower(*req.Message) message := strings.ToLower(*req.Message)
query = query.Where("LOWER(message) LIKE ?", "%"+strings.ToLower(message)+"%") query = query.Where("LOWER(message) LIKE ?", "%"+strings.ToLower(message)+"%")
@ -78,20 +84,39 @@ func (_i *articleCommentsRepository) GetAll(req request.ArticleCommentsQueryRequ
return return
} }
func (_i *articleCommentsRepository) FindOne(id uint) (articleComments *entity.ArticleComments, err error) { func (_i *articleCommentsRepository) FindOne(clientId *uuid.UUID, id uint) (articleComments *entity.ArticleComments, err error) {
if err := _i.DB.DB.First(&articleComments, id).Error; err != nil { 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 nil, err
} }
return articleComments, nil 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) result := _i.DB.DB.Create(articleComments)
return articleComments, result.Error 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) articleCommentsMap, err := utilSvc.StructToMap(articleComments)
if err != nil { if err != nil {
return err return err
@ -101,6 +126,17 @@ func (_i *articleCommentsRepository) Update(id uint, articleComments *entity.Art
Updates(articleCommentsMap).Error 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 return _i.DB.DB.Delete(&entity.ArticleComments{}, id).Error
} }

View File

@ -1,10 +1,10 @@
package request package request
import ( import (
"go-humas-be/app/database/entity"
"go-humas-be/utils/paginator"
"strconv" "strconv"
"time" "time"
"web-medols-be/app/database/entity"
"web-medols-be/utils/paginator"
) )
type ArticleCommentsGeneric interface { type ArticleCommentsGeneric interface {

View File

@ -1,16 +1,17 @@
package service package service
import ( import (
"github.com/google/uuid"
"github.com/rs/zerolog" "github.com/rs/zerolog"
"go-humas-be/app/database/entity" "web-medols-be/app/database/entity"
"go-humas-be/app/module/article_comments/mapper" "web-medols-be/app/module/article_comments/mapper"
"go-humas-be/app/module/article_comments/repository" "web-medols-be/app/module/article_comments/repository"
"go-humas-be/app/module/article_comments/request" "web-medols-be/app/module/article_comments/request"
"go-humas-be/app/module/article_comments/response" "web-medols-be/app/module/article_comments/response"
usersRepository "go-humas-be/app/module/users/repository" usersRepository "web-medols-be/app/module/users/repository"
"go-humas-be/utils/paginator" "web-medols-be/utils/paginator"
utilSvc "go-humas-be/utils/service" utilSvc "web-medols-be/utils/service"
) )
// ArticleCommentsService // ArticleCommentsService
@ -22,12 +23,12 @@ type articleCommentsService struct {
// ArticleCommentsService define interface of IArticleCommentsService // ArticleCommentsService define interface of IArticleCommentsService
type ArticleCommentsService interface { type ArticleCommentsService interface {
All(req request.ArticleCommentsQueryRequest) (articleComments []*response.ArticleCommentsResponse, paging paginator.Pagination, err error) All(clientId *uuid.UUID, req request.ArticleCommentsQueryRequest) (articleComments []*response.ArticleCommentsResponse, paging paginator.Pagination, err error)
Show(id uint) (articleComments *response.ArticleCommentsResponse, err error) Show(clientId *uuid.UUID, id uint) (articleComments *response.ArticleCommentsResponse, err error)
Save(req request.ArticleCommentsCreateRequest, authToken string) (articleComments *entity.ArticleComments, err error) Save(clientId *uuid.UUID, req request.ArticleCommentsCreateRequest, authToken string) (articleComments *entity.ArticleComments, err error)
Update(id uint, req request.ArticleCommentsUpdateRequest) (err error) Update(clientId *uuid.UUID, id uint, req request.ArticleCommentsUpdateRequest) (err error)
Delete(id uint) error Delete(clientId *uuid.UUID, id uint) error
Approval(id uint, req request.ArticleCommentsApprovalRequest) (err error) Approval(clientId *uuid.UUID, id uint, req request.ArticleCommentsApprovalRequest) (err error)
} }
// NewArticleCommentsService init ArticleCommentsService // NewArticleCommentsService init ArticleCommentsService
@ -41,29 +42,29 @@ func NewArticleCommentsService(repo repository.ArticleCommentsRepository, log ze
} }
// All implement interface of ArticleCommentsService // All implement interface of ArticleCommentsService
func (_i *articleCommentsService) All(req request.ArticleCommentsQueryRequest) (articleCommentss []*response.ArticleCommentsResponse, paging paginator.Pagination, err error) { func (_i *articleCommentsService) All(clientId *uuid.UUID, req request.ArticleCommentsQueryRequest) (articleCommentss []*response.ArticleCommentsResponse, paging paginator.Pagination, err error) {
results, paging, err := _i.Repo.GetAll(req) results, paging, err := _i.Repo.GetAll(clientId, req)
if err != nil { if err != nil {
return return
} }
for _, result := range results { for _, result := range results {
articleCommentss = append(articleCommentss, mapper.ArticleCommentsResponseMapper(result, _i.UsersRepo)) articleCommentss = append(articleCommentss, mapper.ArticleCommentsResponseMapper(clientId, result, _i.UsersRepo))
} }
return return
} }
func (_i *articleCommentsService) Show(id uint) (articleComments *response.ArticleCommentsResponse, err error) { func (_i *articleCommentsService) Show(clientId *uuid.UUID, id uint) (articleComments *response.ArticleCommentsResponse, err error) {
result, err := _i.Repo.FindOne(id) result, err := _i.Repo.FindOne(clientId, id)
if err != nil { if err != nil {
return nil, err 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("") _i.Log.Info().Interface("data", req).Msg("")
newReq := req.ToEntity() newReq := req.ToEntity()
@ -72,25 +73,25 @@ func (_i *articleCommentsService) Save(req request.ArticleCommentsCreateRequest,
newReq.CommentFrom = &createdBy.ID newReq.CommentFrom = &createdBy.ID
newReq.IsActive = true 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("") _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 { func (_i *articleCommentsService) Delete(clientId *uuid.UUID, id uint) error {
result, err := _i.Repo.FindOne(id) result, err := _i.Repo.FindOne(clientId, id)
if err != nil { if err != nil {
return err return err
} }
result.IsActive = false 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("") _i.Log.Info().Interface("data", req).Msg("")
newReq := req.ToEntity() newReq := req.ToEntity()
@ -100,5 +101,5 @@ func (_i *articleCommentsService) Approval(id uint, req request.ArticleCommentsA
newReq.IsPublic = false newReq.IsPublic = false
} }
return _i.Repo.Update(id, newReq) return _i.Repo.Update(clientId, id, newReq)
} }

View File

@ -2,10 +2,10 @@ package article_files
import ( import (
"github.com/gofiber/fiber/v2" "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" "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 // struct of ArticleFilesRouter

View File

@ -3,12 +3,13 @@ package controller
import ( import (
"fmt" "fmt"
"github.com/gofiber/fiber/v2" "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" "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 { type articleFilesController struct {
@ -44,6 +45,9 @@ func NewArticleFilesController(articleFilesService service.ArticleFilesService)
// @Failure 500 {object} response.InternalServerError // @Failure 500 {object} response.InternalServerError
// @Router /article-files [get] // @Router /article-files [get]
func (_i *articleFilesController) All(c *fiber.Ctx) error { func (_i *articleFilesController) All(c *fiber.Ctx) error {
// Get ClientId from context
clientId := middleware.GetClientID(c)
paginate, err := paginator.Paginate(c) paginate, err := paginator.Paginate(c)
if err != nil { if err != nil {
return err return err
@ -58,7 +62,7 @@ func (_i *articleFilesController) All(c *fiber.Ctx) error {
req := reqContext.ToParamRequest() req := reqContext.ToParamRequest()
req.Pagination = paginate req.Pagination = paginate
articleFilesData, paging, err := _i.articleFilesService.All(req) articleFilesData, paging, err := _i.articleFilesService.All(clientId, req)
if err != nil { if err != nil {
return err return err
} }
@ -83,12 +87,15 @@ func (_i *articleFilesController) All(c *fiber.Ctx) error {
// @Failure 500 {object} response.InternalServerError // @Failure 500 {object} response.InternalServerError
// @Router /article-files/{id} [get] // @Router /article-files/{id} [get]
func (_i *articleFilesController) Show(c *fiber.Ctx) error { 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) id, err := strconv.ParseUint(c.Params("id"), 10, 0)
if err != nil { if err != nil {
return err return err
} }
articleFilesData, err := _i.articleFilesService.Show(uint(id)) articleFilesData, err := _i.articleFilesService.Show(clientId, uint(id))
if err != nil { if err != nil {
return err return err
} }
@ -115,12 +122,15 @@ func (_i *articleFilesController) Show(c *fiber.Ctx) error {
// @Failure 500 {object} response.InternalServerError // @Failure 500 {object} response.InternalServerError
// @Router /article-files/{articleId} [post] // @Router /article-files/{articleId} [post]
func (_i *articleFilesController) Save(c *fiber.Ctx) error { 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) id, err := strconv.ParseUint(c.Params("articleId"), 10, 0)
if err != nil { if err != nil {
return err return err
} }
err = _i.articleFilesService.Save(c, uint(id)) err = _i.articleFilesService.Save(clientId, c, uint(id))
if err != nil { if err != nil {
return err return err
} }
@ -145,6 +155,9 @@ func (_i *articleFilesController) Save(c *fiber.Ctx) error {
// @Failure 500 {object} response.InternalServerError // @Failure 500 {object} response.InternalServerError
// @Router /article-files/{id} [put] // @Router /article-files/{id} [put]
func (_i *articleFilesController) Update(c *fiber.Ctx) error { 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) id, err := strconv.ParseUint(c.Params("id"), 10, 0)
if err != nil { if err != nil {
return err return err
@ -155,7 +168,7 @@ func (_i *articleFilesController) Update(c *fiber.Ctx) error {
return err return err
} }
err = _i.articleFilesService.Update(uint(id), *req) err = _i.articleFilesService.Update(clientId, uint(id), *req)
if err != nil { if err != nil {
return err return err
} }
@ -179,12 +192,15 @@ func (_i *articleFilesController) Update(c *fiber.Ctx) error {
// @Failure 500 {object} response.InternalServerError // @Failure 500 {object} response.InternalServerError
// @Router /article-files/{id} [delete] // @Router /article-files/{id} [delete]
func (_i *articleFilesController) Delete(c *fiber.Ctx) error { 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) id, err := strconv.ParseUint(c.Params("id"), 10, 0)
if err != nil { if err != nil {
return err return err
} }
err = _i.articleFilesService.Delete(uint(id)) err = _i.articleFilesService.Delete(clientId, uint(id))
if err != nil { if err != nil {
return err return err
} }
@ -207,7 +223,10 @@ func (_i *articleFilesController) Delete(c *fiber.Ctx) error {
// @Failure 500 {object} response.InternalServerError // @Failure 500 {object} response.InternalServerError
// @Router /article-files/viewer/{filename} [get] // @Router /article-files/viewer/{filename} [get]
func (_i *articleFilesController) Viewer(c *fiber.Ctx) error { 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 // GetUploadStatus ArticleFiles

View File

@ -1,6 +1,6 @@
package controller package controller
import "go-humas-be/app/module/article_files/service" import "web-medols-be/app/module/article_files/service"
type Controller struct { type Controller struct {
ArticleFiles ArticleFilesController ArticleFiles ArticleFilesController
@ -10,4 +10,4 @@ func NewController(ArticleFilesService service.ArticleFilesService) *Controller
return &Controller{ return &Controller{
ArticleFiles: NewArticleFilesController(ArticleFilesService), ArticleFiles: NewArticleFilesController(ArticleFilesService),
} }
} }

View File

@ -1,8 +1,8 @@
package mapper package mapper
import ( import (
"go-humas-be/app/database/entity" "web-medols-be/app/database/entity"
res "go-humas-be/app/module/article_files/response" res "web-medols-be/app/module/article_files/response"
) )
func ArticleFilesResponseMapper(articleFilesReq *entity.ArticleFiles, host string) (articleFilesRes *res.ArticleFilesResponse) { func ArticleFilesResponseMapper(articleFilesReq *entity.ArticleFiles, host string) (articleFilesRes *res.ArticleFilesResponse) {

View File

@ -2,12 +2,13 @@ package repository
import ( import (
"fmt" "fmt"
"go-humas-be/app/database" "github.com/google/uuid"
"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"
"strings" "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 { type articleFilesRepository struct {
@ -16,13 +17,13 @@ type articleFilesRepository struct {
// ArticleFilesRepository define interface of IArticleFilesRepository // ArticleFilesRepository define interface of IArticleFilesRepository
type ArticleFilesRepository interface { type ArticleFilesRepository interface {
GetAll(req request.ArticleFilesQueryRequest) (articleFiless []*entity.ArticleFiles, paging paginator.Pagination, err error) GetAll(clientId *uuid.UUID, req request.ArticleFilesQueryRequest) (articleFiless []*entity.ArticleFiles, paging paginator.Pagination, err error)
FindOne(id uint) (articleFiles *entity.ArticleFiles, err error) FindOne(clientId *uuid.UUID, id uint) (articleFiles *entity.ArticleFiles, err error)
FindByArticle(articleId uint) (articleFiles []*entity.ArticleFiles, err error) FindByArticle(clientId *uuid.UUID, articleId uint) (articleFiles []*entity.ArticleFiles, err error)
FindByFilename(filename string) (articleFiles *entity.ArticleFiles, err error) FindByFilename(clientId *uuid.UUID, filename string) (articleFiles *entity.ArticleFiles, err error)
Create(articleFiles *entity.ArticleFiles) (err error) Create(clientId *uuid.UUID, articleFiles *entity.ArticleFiles) (err error)
Update(id uint, articleFiles *entity.ArticleFiles) (err error) Update(clientId *uuid.UUID, id uint, articleFiles *entity.ArticleFiles) (err error)
Delete(id uint) (err error) Delete(clientId *uuid.UUID, id uint) (err error)
} }
func NewArticleFilesRepository(db *database.Database) ArticleFilesRepository { func NewArticleFilesRepository(db *database.Database) ArticleFilesRepository {
@ -32,12 +33,17 @@ func NewArticleFilesRepository(db *database.Database) ArticleFilesRepository {
} }
// implement interface of IArticleFilesRepository // 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 var count int64
query := _i.DB.DB.Model(&entity.ArticleFiles{}) query := _i.DB.DB.Model(&entity.ArticleFiles{})
query = query.Where("is_active = ?", true) query = query.Where("is_active = ?", true)
// Add client filter
if clientId != nil {
query = query.Where("client_id = ?", clientId)
}
if req.ArticleId != nil { if req.ArticleId != nil {
query = query.Where("article_id = ?", req.ArticleId) query = query.Where("article_id = ?", req.ArticleId)
} }
@ -74,36 +80,62 @@ func (_i *articleFilesRepository) GetAll(req request.ArticleFilesQueryRequest) (
return return
} }
func (_i *articleFilesRepository) FindOne(id uint) (articleFiles *entity.ArticleFiles, err error) { func (_i *articleFilesRepository) FindOne(clientId *uuid.UUID, id uint) (articleFiles *entity.ArticleFiles, err error) {
if err := _i.DB.DB.First(&articleFiles, id).Error; err != nil { 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 nil, err
} }
return articleFiles, nil return articleFiles, nil
} }
func (_i *articleFilesRepository) FindByArticle(articleId uint) (articleFiles []*entity.ArticleFiles, err error) { func (_i *articleFilesRepository) FindByArticle(clientId *uuid.UUID, articleId uint) (articleFiles []*entity.ArticleFiles, err error) {
if err := _i.DB.DB.Where("article_id = ?", articleId).Find(&articleFiles).Error; err != nil { 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 nil, err
} }
return articleFiles, nil return articleFiles, nil
} }
func (_i *articleFilesRepository) FindByFilename(articleFilename string) (articleFiles *entity.ArticleFiles, err error) { func (_i *articleFilesRepository) FindByFilename(clientId *uuid.UUID, articleFilename string) (articleFiles *entity.ArticleFiles, err error) {
query := _i.DB.DB.Where("file_name = ?", articleFilename)
if err := _i.DB.DB.Where("file_name = ?", articleFilename).First(&articleFiles).Error; err != nil { if clientId != nil {
query = query.Where("client_id = ?", clientId)
}
if err := query.First(&articleFiles).Error; err != nil {
return nil, err return nil, err
} }
return articleFiles, nil 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 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) articleFilesMap, err := utilSvc.StructToMap(articleFiles)
if err != nil { if err != nil {
return err return err
@ -113,6 +145,17 @@ func (_i *articleFilesRepository) Update(id uint, articleFiles *entity.ArticleFi
Updates(articleFilesMap).Error 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 return _i.DB.DB.Delete(&entity.ArticleFiles{}, id).Error
} }

View File

@ -1,10 +1,10 @@
package request package request
import ( import (
"go-humas-be/app/database/entity"
"go-humas-be/utils/paginator"
"strconv" "strconv"
"time" "time"
"web-medols-be/app/database/entity"
"web-medols-be/utils/paginator"
) )
type ArticleFilesGeneric interface { type ArticleFilesGeneric interface {

View File

@ -4,15 +4,9 @@ import (
"context" "context"
"fmt" "fmt"
"github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2"
"github.com/google/uuid"
"github.com/minio/minio-go/v7" "github.com/minio/minio-go/v7"
"github.com/rs/zerolog" "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" "io"
"log" "log"
"math/rand" "math/rand"
@ -24,6 +18,13 @@ import (
"strings" "strings"
"sync" "sync"
"time" "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 // ArticleFilesService
@ -36,14 +37,14 @@ type articleFilesService struct {
// ArticleFilesService define interface of IArticleFilesService // ArticleFilesService define interface of IArticleFilesService
type ArticleFilesService interface { type ArticleFilesService interface {
All(req request.ArticleFilesQueryRequest) (articleFiles []*response.ArticleFilesResponse, paging paginator.Pagination, err error) All(clientId *uuid.UUID, req request.ArticleFilesQueryRequest) (articleFiles []*response.ArticleFilesResponse, paging paginator.Pagination, err error)
Show(id uint) (articleFiles *response.ArticleFilesResponse, err error) Show(clientId *uuid.UUID, id uint) (articleFiles *response.ArticleFilesResponse, err error)
Save(c *fiber.Ctx, id uint) error Save(clientId *uuid.UUID, c *fiber.Ctx, id uint) error
SaveAsync(c *fiber.Ctx, id uint) error SaveAsync(clientId *uuid.UUID, c *fiber.Ctx, id uint) error
Update(id uint, req request.ArticleFilesUpdateRequest) (err error) Update(clientId *uuid.UUID, id uint, req request.ArticleFilesUpdateRequest) (err error)
GetUploadStatus(c *fiber.Ctx) (progress int, err error) GetUploadStatus(c *fiber.Ctx) (progress int, err error)
Delete(id uint) error Delete(clientId *uuid.UUID, id uint) error
Viewer(c *fiber.Ctx) error Viewer(clientId *uuid.UUID, c *fiber.Ctx) error
} }
// NewArticleFilesService init ArticleFilesService // NewArticleFilesService init ArticleFilesService
@ -69,8 +70,8 @@ type progressWriter struct {
} }
// All implement interface of ArticleFilesService // All implement interface of ArticleFilesService
func (_i *articleFilesService) All(req request.ArticleFilesQueryRequest) (articleFiless []*response.ArticleFilesResponse, paging paginator.Pagination, err error) { func (_i *articleFilesService) All(clientId *uuid.UUID, req request.ArticleFilesQueryRequest) (articleFiless []*response.ArticleFilesResponse, paging paginator.Pagination, err error) {
results, paging, err := _i.Repo.GetAll(req) results, paging, err := _i.Repo.GetAll(clientId, req)
if err != nil { if err != nil {
return return
} }
@ -84,8 +85,8 @@ func (_i *articleFilesService) All(req request.ArticleFilesQueryRequest) (articl
return return
} }
func (_i *articleFilesService) Show(id uint) (articleFiles *response.ArticleFilesResponse, err error) { func (_i *articleFilesService) Show(clientId *uuid.UUID, id uint) (articleFiles *response.ArticleFilesResponse, err error) {
result, err := _i.Repo.FindOne(id) result, err := _i.Repo.FindOne(clientId, id)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -95,7 +96,7 @@ func (_i *articleFilesService) Show(id uint) (articleFiles *response.ArticleFile
return mapper.ArticleFilesResponseMapper(result, host), nil 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 bucketName := _i.MinioStorage.Cfg.ObjectStorage.MinioStorage.BucketName
ctx := context.Background() ctx := context.Background()
@ -159,7 +160,7 @@ func (_i *articleFilesService) SaveAsync(c *fiber.Ctx, id uint) (err error) {
Size: &fileSize, Size: &fileSize,
} }
err = _i.Repo.Create(req.ToEntity()) err = _i.Repo.Create(clientId, req.ToEntity())
if err != nil { if err != nil {
return err return err
} }
@ -194,7 +195,7 @@ func (_i *articleFilesService) SaveAsync(c *fiber.Ctx, id uint) (err error) {
return 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 bucketName := _i.MinioStorage.Cfg.ObjectStorage.MinioStorage.BucketName
form, err := c.MultipartForm() form, err := c.MultipartForm()
@ -256,7 +257,7 @@ func (_i *articleFilesService) Save(c *fiber.Ctx, id uint) (err error) {
Size: &fileSize, Size: &fileSize,
} }
err = _i.Repo.Create(req.ToEntity()) err = _i.Repo.Create(clientId, req.ToEntity())
if err != nil { if err != nil {
return err return err
} }
@ -276,23 +277,23 @@ func (_i *articleFilesService) Save(c *fiber.Ctx, id uint) (err error) {
return 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("") _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 { func (_i *articleFilesService) Delete(clientId *uuid.UUID, id uint) error {
result, err := _i.Repo.FindOne(id) result, err := _i.Repo.FindOne(clientId, id)
if err != nil { if err != nil {
return err return err
} }
result.IsActive = false 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") filename := c.Params("filename")
result, err := _i.Repo.FindByFilename(filename) result, err := _i.Repo.FindByFilename(clientId, filename)
if err != nil { if err != nil {
return err return err
} }

View File

@ -2,10 +2,10 @@ package article_nulis_ai
import ( import (
"github.com/gofiber/fiber/v2" "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" "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 // struct of ArticleNulisAIRouter

View File

@ -3,12 +3,12 @@ package controller
import ( import (
"github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2"
"github.com/rs/zerolog" "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" "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 { type articleNulisAIController struct {

View File

@ -2,7 +2,7 @@ package controller
import ( import (
"github.com/rs/zerolog" "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 { type Controller struct {

View File

@ -1,8 +1,8 @@
package mapper package mapper
import ( import (
"go-humas-be/app/database/entity" "web-medols-be/app/database/entity"
res "go-humas-be/app/module/article_nulis_ai/response" res "web-medols-be/app/module/article_nulis_ai/response"
) )
func ArticleNulisAIResponseMapper(articleNulisAIReq *entity.ArticleNulisAI) (articleNulisAIRes *res.ArticleNulisAIResponse) { func ArticleNulisAIResponseMapper(articleNulisAIReq *entity.ArticleNulisAI) (articleNulisAIRes *res.ArticleNulisAIResponse) {

View File

@ -3,11 +3,11 @@ package repository
import ( import (
"fmt" "fmt"
"github.com/rs/zerolog" "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" "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 { type articleNulisAIRepository struct {

View File

@ -1,10 +1,10 @@
package request package request
import ( import (
"go-humas-be/app/database/entity"
"go-humas-be/utils/paginator"
"strconv" "strconv"
"time" "time"
"web-medols-be/app/database/entity"
"web-medols-be/utils/paginator"
) )
type ArticleNulisAIGeneric interface { type ArticleNulisAIGeneric interface {

View File

@ -2,17 +2,17 @@ package service
import ( import (
"github.com/rs/zerolog" "github.com/rs/zerolog"
"go-humas-be/app/database/entity" "web-medols-be/app/database/entity"
"go-humas-be/app/module/article_nulis_ai/mapper" "web-medols-be/app/module/article_nulis_ai/mapper"
"go-humas-be/app/module/article_nulis_ai/repository" "web-medols-be/app/module/article_nulis_ai/repository"
"go-humas-be/app/module/article_nulis_ai/request" "web-medols-be/app/module/article_nulis_ai/request"
"go-humas-be/app/module/article_nulis_ai/response" "web-medols-be/app/module/article_nulis_ai/response"
articlesRepository "go-humas-be/app/module/articles/repository" articlesRepository "web-medols-be/app/module/articles/repository"
articles "go-humas-be/app/module/articles/request" articles "web-medols-be/app/module/articles/request"
usersRepository "go-humas-be/app/module/users/repository" usersRepository "web-medols-be/app/module/users/repository"
"go-humas-be/utils/paginator" "web-medols-be/utils/paginator"
utilSvc "go-humas-be/utils/service" utilSvc "web-medols-be/utils/service"
) )
// ArticleNulisAIService // ArticleNulisAIService
@ -96,7 +96,7 @@ func (_i *articleNulisAIService) Publish(req request.ArticleNulisAICreateRequest
newArticleReq := articleReq.ToEntity() newArticleReq := articleReq.ToEntity()
newArticleReq.CreatedById = &createdBy.ID newArticleReq.CreatedById = &createdBy.ID
_, err = _i.ArticlesRepo.Create(newArticleReq) _, err = _i.ArticlesRepo.Create(nil, newArticleReq)
if err != nil { if err != nil {
return err return err
} else { } else {

View File

@ -2,10 +2,10 @@ package articles
import ( import (
"github.com/gofiber/fiber/v2" "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" "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 // ArticlesRouter struct of ArticlesRouter

View File

@ -2,17 +2,20 @@ package controller
import ( import (
"github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2"
"go-humas-be/app/module/articles/request" "github.com/rs/zerolog"
"go-humas-be/app/module/articles/service"
"go-humas-be/utils/paginator"
"strconv" "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" utilRes "web-medols-be/utils/response"
utilVal "go-humas-be/utils/validator" utilVal "web-medols-be/utils/validator"
) )
type articlesController struct { type articlesController struct {
articlesService service.ArticlesService articlesService service.ArticlesService
Log zerolog.Logger
} }
type ArticlesController interface { type ArticlesController interface {
@ -31,9 +34,10 @@ type ArticlesController interface {
PublishScheduling(c *fiber.Ctx) error PublishScheduling(c *fiber.Ctx) error
} }
func NewArticlesController(articlesService service.ArticlesService) ArticlesController { func NewArticlesController(articlesService service.ArticlesService, log zerolog.Logger) ArticlesController {
return &articlesController{ return &articlesController{
articlesService: articlesService, articlesService: articlesService,
Log: log,
} }
} }
@ -42,6 +46,7 @@ func NewArticlesController(articlesService service.ArticlesService) ArticlesCont
// @Description API for getting all Articles // @Description API for getting all Articles
// @Tags Articles // @Tags Articles
// @Security Bearer // @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 request.ArticlesQueryRequest false "query parameters"
// @Param req query paginator.Pagination false "pagination parameters" // @Param req query paginator.Pagination false "pagination parameters"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
@ -70,7 +75,12 @@ func (_i *articlesController) All(c *fiber.Ctx) error {
req := reqContext.ToParamRequest() req := reqContext.ToParamRequest()
req.Pagination = paginate 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 { if err != nil {
return err return err
} }
@ -100,7 +110,10 @@ func (_i *articlesController) Show(c *fiber.Ctx) error {
return err 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 { if err != nil {
return err return err
} }
@ -129,7 +142,10 @@ func (_i *articlesController) ShowByOldId(c *fiber.Ctx) error {
return err 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 { if err != nil {
return err return err
} }
@ -161,7 +177,11 @@ func (_i *articlesController) Save(c *fiber.Ctx) error {
} }
authToken := c.Get("Authorization") 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 { if err != nil {
return err return err
} }
@ -188,7 +208,10 @@ func (_i *articlesController) Save(c *fiber.Ctx) error {
// @Failure 500 {object} response.InternalServerError // @Failure 500 {object} response.InternalServerError
// @Router /articles/thumbnail/{id} [post] // @Router /articles/thumbnail/{id} [post]
func (_i *articlesController) SaveThumbnail(c *fiber.Ctx) error { 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 { if err != nil {
return err return err
} }
@ -223,7 +246,10 @@ func (_i *articlesController) Update(c *fiber.Ctx) error {
return err 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 { if err != nil {
return err return err
} }
@ -258,7 +284,10 @@ func (_i *articlesController) UpdateBanner(c *fiber.Ctx) error {
return err 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 { if err != nil {
return err return err
} }
@ -287,7 +316,10 @@ func (_i *articlesController) Delete(c *fiber.Ctx) error {
return err 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 { if err != nil {
return err return err
} }
@ -310,7 +342,10 @@ func (_i *articlesController) Delete(c *fiber.Ctx) error {
// @Failure 500 {object} response.InternalServerError // @Failure 500 {object} response.InternalServerError
// @Router /articles/thumbnail/viewer/{thumbnailName} [get] // @Router /articles/thumbnail/viewer/{thumbnailName} [get]
func (_i *articlesController) Viewer(c *fiber.Ctx) error { 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 // SummaryStats Articles
@ -327,7 +362,10 @@ func (_i *articlesController) Viewer(c *fiber.Ctx) error {
func (_i *articlesController) SummaryStats(c *fiber.Ctx) error { func (_i *articlesController) SummaryStats(c *fiber.Ctx) error {
authToken := c.Get("Authorization") 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 { if err != nil {
return err return err
} }
@ -357,7 +395,10 @@ func (_i *articlesController) ArticlePerUserLevelStats(c *fiber.Ctx) error {
startDate := c.Query("startDate") startDate := c.Query("startDate")
endDate := c.Query("endDate") 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 { if err != nil {
return err return err
} }
@ -389,7 +430,10 @@ func (_i *articlesController) ArticleMonthlyStats(c *fiber.Ctx) error {
return err 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 { if err != nil {
return err return err
} }
@ -422,7 +466,10 @@ func (_i *articlesController) PublishScheduling(c *fiber.Ctx) error {
} }
date := c.Query("date") 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 { if err != nil {
return err return err
} }

View File

@ -1,15 +1,16 @@
package controller package controller
import ( import (
"go-humas-be/app/module/articles/service" "github.com/rs/zerolog"
"web-medols-be/app/module/articles/service"
) )
type Controller struct { type Controller struct {
Articles ArticlesController Articles ArticlesController
} }
func NewController(ArticlesService service.ArticlesService) *Controller { func NewController(ArticlesService service.ArticlesService, log zerolog.Logger) *Controller {
return &Controller{ return &Controller{
Articles: NewArticlesController(ArticlesService), Articles: NewArticlesController(ArticlesService, log),
} }
} }

View File

@ -1,22 +1,24 @@
package mapper package mapper
import ( import (
"github.com/google/uuid"
"github.com/rs/zerolog" "github.com/rs/zerolog"
"go-humas-be/app/database/entity" "web-medols-be/app/database/entity"
articleCategoriesMapper "go-humas-be/app/module/article_categories/mapper" articleCategoriesMapper "web-medols-be/app/module/article_categories/mapper"
articleCategoriesRepository "go-humas-be/app/module/article_categories/repository" articleCategoriesRepository "web-medols-be/app/module/article_categories/repository"
articleCategoriesResponse "go-humas-be/app/module/article_categories/response" articleCategoriesResponse "web-medols-be/app/module/article_categories/response"
articleCategoryDetailsRepository "go-humas-be/app/module/article_category_details/repository" articleCategoryDetailsRepository "web-medols-be/app/module/article_category_details/repository"
articleFilesMapper "go-humas-be/app/module/article_files/mapper" articleFilesMapper "web-medols-be/app/module/article_files/mapper"
articleFilesRepository "go-humas-be/app/module/article_files/repository" articleFilesRepository "web-medols-be/app/module/article_files/repository"
articleFilesResponse "go-humas-be/app/module/article_files/response" articleFilesResponse "web-medols-be/app/module/article_files/response"
res "go-humas-be/app/module/articles/response" res "web-medols-be/app/module/articles/response"
usersRepository "go-humas-be/app/module/users/repository" usersRepository "web-medols-be/app/module/users/repository"
) )
func ArticlesResponseMapper( func ArticlesResponseMapper(
log zerolog.Logger, log zerolog.Logger,
host string, host string,
clientId *uuid.UUID,
articlesReq *entity.Articles, articlesReq *entity.Articles,
articleCategoriesRepo articleCategoriesRepository.ArticleCategoriesRepository, articleCategoriesRepo articleCategoriesRepository.ArticleCategoriesRepository,
articleCategoryDetailsRepo articleCategoryDetailsRepository.ArticleCategoryDetailsRepository, articleCategoryDetailsRepo articleCategoryDetailsRepository.ArticleCategoryDetailsRepository,
@ -42,7 +44,7 @@ func ArticlesResponseMapper(
log.Info().Interface("articleCategoriesArr", articleCategoriesArr).Msg("") log.Info().Interface("articleCategoriesArr", articleCategoriesArr).Msg("")
} }
articleFiles, _ := articleFilesRepo.FindByArticle(articlesReq.ID) articleFiles, _ := articleFilesRepo.FindByArticle(clientId, articlesReq.ID)
var articleFilesArr []*articleFilesResponse.ArticleFilesResponse var articleFilesArr []*articleFilesResponse.ArticleFilesResponse
if articleFiles != nil && len(articleFiles) > 0 { if articleFiles != nil && len(articleFiles) > 0 {
for _, result := range articleFiles { for _, result := range articleFiles {

View File

@ -2,15 +2,16 @@ package repository
import ( import (
"fmt" "fmt"
"github.com/google/uuid"
"github.com/rs/zerolog" "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" "strings"
"time" "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 { type articlesRepository struct {
@ -20,18 +21,18 @@ type articlesRepository struct {
// ArticlesRepository define interface of IArticlesRepository // ArticlesRepository define interface of IArticlesRepository
type ArticlesRepository interface { type ArticlesRepository interface {
GetAll(req request.ArticlesQueryRequest) (articless []*entity.Articles, paging paginator.Pagination, err error) GetAll(clientId *uuid.UUID, req request.ArticlesQueryRequest) (articless []*entity.Articles, paging paginator.Pagination, err error)
GetAllPublishSchedule() (articless []*entity.Articles, err error) GetAllPublishSchedule(clientId *uuid.UUID) (articless []*entity.Articles, err error)
FindOne(id uint) (articles *entity.Articles, err error) FindOne(clientId *uuid.UUID, id uint) (articles *entity.Articles, err error)
FindByFilename(thumbnailName string) (articleReturn *entity.Articles, err error) FindByFilename(clientId *uuid.UUID, thumbnailName string) (articleReturn *entity.Articles, err error)
FindByOldId(oldId uint) (articles *entity.Articles, err error) FindByOldId(clientId *uuid.UUID, oldId uint) (articles *entity.Articles, err error)
Create(articles *entity.Articles) (articleReturn *entity.Articles, err error) Create(clientId *uuid.UUID, articles *entity.Articles) (articleReturn *entity.Articles, err error)
Update(id uint, articles *entity.Articles) (err error) Update(clientId *uuid.UUID, id uint, articles *entity.Articles) (err error)
UpdateSkipNull(id uint, articles *entity.Articles) (err error) UpdateSkipNull(clientId *uuid.UUID, id uint, articles *entity.Articles) (err error)
Delete(id uint) (err error) Delete(clientId *uuid.UUID, id uint) (err error)
SummaryStats(userID uint) (articleSummaryStats *response.ArticleSummaryStats, err error) SummaryStats(clientId *uuid.UUID, userID uint) (articleSummaryStats *response.ArticleSummaryStats, err error)
ArticlePerUserLevelStats(userLevelId *uint, levelNumber *int, startDate *time.Time, endDate *time.Time) (articlePerUserLevelStats []*response.ArticlePerUserLevelStats, err error) ArticlePerUserLevelStats(clientId *uuid.UUID, 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) ArticleMonthlyStats(clientId *uuid.UUID, userLevelId *uint, levelNumber *int, year int) (articleMontlyStats []*response.ArticleMonthlyStats, err error)
} }
func NewArticlesRepository(db *database.Database, log zerolog.Logger) ArticlesRepository { 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 // 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 var count int64
query := _i.DB.DB.Model(&entity.Articles{}) query := _i.DB.DB.Model(&entity.Articles{})
// Add client filter
if clientId != nil {
query = query.Where("client_id = ?", clientId)
}
if req.CategoryId != nil { if req.CategoryId != nil {
query = query.Joins("JOIN article_category_details acd ON acd.article_id = articles.id"). query = query.Joins("JOIN article_category_details acd ON acd.article_id = articles.id").
Where("acd.category_id = ?", req.CategoryId) Where("acd.category_id = ?", req.CategoryId)
@ -109,44 +116,76 @@ func (_i *articlesRepository) GetAll(req request.ArticlesQueryRequest) (articles
return return
} }
func (_i *articlesRepository) GetAllPublishSchedule() (articles []*entity.Articles, err error) { func (_i *articlesRepository) GetAllPublishSchedule(clientId *uuid.UUID) (articles []*entity.Articles, err error) {
err = _i.DB.DB.Where("publish_schedule IS NOT NULL").Find(&articles).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 { if err != nil {
return nil, err return nil, err
} }
return articles, nil return articles, nil
} }
func (_i *articlesRepository) FindOne(id uint) (articles *entity.Articles, err error) { func (_i *articlesRepository) FindOne(clientId *uuid.UUID, id uint) (articles *entity.Articles, err error) {
if err := _i.DB.DB.First(&articles, id).Error; err != nil { 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 nil, err
} }
return articles, nil return articles, nil
} }
func (_i *articlesRepository) FindByFilename(thumbnailName string) (articles *entity.Articles, err error) { func (_i *articlesRepository) FindByFilename(clientId *uuid.UUID, thumbnailName string) (articles *entity.Articles, err error) {
if err := _i.DB.DB.Where("thumbnail_name = ?", thumbnailName).First(&articles).Error; err != nil { 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 nil, err
} }
return articles, nil return articles, nil
} }
func (_i *articlesRepository) FindByOldId(oldId uint) (articles *entity.Articles, err error) { func (_i *articlesRepository) FindByOldId(clientId *uuid.UUID, oldId uint) (articles *entity.Articles, err error) {
if err := _i.DB.DB.Where("old_id = ?", oldId).First(&articles).Error; err != nil { 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 nil, err
} }
return articles, nil 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) result := _i.DB.DB.Create(articles)
return articles, result.Error 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) articlesMap, err := utilSvc.StructToMap(articles)
if err != nil { if err != nil {
return err return err
@ -156,23 +195,45 @@ func (_i *articlesRepository) Update(id uint, articles *entity.Articles) (err er
Updates(articlesMap).Error 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{}). return _i.DB.DB.Model(&entity.Articles{}).
Where(&entity.Articles{ID: id}). Where(&entity.Articles{ID: id}).
Updates(articles).Error 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 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() now := time.Now()
startOfDay := now.Truncate(24 * time.Hour) startOfDay := now.Truncate(24 * time.Hour)
startOfWeek := now.AddDate(0, 0, -int(now.Weekday())+1).Truncate(24 * time.Hour) startOfWeek := now.AddDate(0, 0, -int(now.Weekday())+1).Truncate(24 * time.Hour)
// Query // Query
err = _i.DB.DB.Model(&entity.Articles{}). query := _i.DB.DB.Model(&entity.Articles{}).
Select( Select(
"COUNT(*) AS total_all, "+ "COUNT(*) AS total_all, "+
"COALESCE(SUM(view_count), 0) AS total_views, "+ "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", "COUNT(CASE WHEN created_at >= ? THEN 1 END) AS total_this_week",
startOfDay, startOfWeek, startOfDay, startOfWeek,
). ).
Where("created_by_id = ?", userID). Where("created_by_id = ?", userID)
Scan(&articleSummaryStats).Error
// Add client filter
if clientId != nil {
query = query.Where("client_id = ?", clientId)
}
err = query.Scan(&articleSummaryStats).Error
return articleSummaryStats, err 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 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"). Joins("LEFT JOIN user_levels ON users.user_level_id = user_levels.id").
Where("articles.is_active = true") Where("articles.is_active = true")
// Add client filter
if clientId != nil {
query = query.Where("articles.client_id = ?", clientId)
}
if userLevelId != nil && *levelNumber != levelNumberTop { if userLevelId != nil && *levelNumber != levelNumberTop {
query = query.Where("user_levels.id = ? or user_levels.parent_level_id = ?", *userLevelId, *userLevelId) query = query.Where("user_levels.id = ? or user_levels.parent_level_id = ?", *userLevelId, *userLevelId)
} else { } else {
@ -229,12 +301,14 @@ func (_i *articlesRepository) ArticlePerUserLevelStats(userLevelId *uint, levelN
FROM articles FROM articles
JOIN users ON articles.created_by_id = users.id JOIN users ON articles.created_by_id = users.id
JOIN LevelHierarchy lh ON users.user_level_id = lh.id JOIN LevelHierarchy lh ON users.user_level_id = lh.id
WHERE articles.is_active = true AND lh.level_2_id > 0 WHERE articles.is_active = true AND lh.level_2_id > 0`)
GROUP BY
lh.level_2_id, // Add client filter to raw query
lh.level_2_name if clientId != nil {
ORDER BY query = query.Where("articles.client_id = ?", clientId)
total_article DESC`) }
query = query.Group("lh.level_2_id, lh.level_2_name").Order("total_article DESC")
} }
// Apply date filters if provided // Apply date filters if provided
@ -253,7 +327,7 @@ func (_i *articlesRepository) ArticlePerUserLevelStats(userLevelId *uint, levelN
return articlePerUserLevelStats, err 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 levelNumberTop := 1
if year < 1900 || year > 2100 { if year < 1900 || year > 2100 {
@ -275,6 +349,11 @@ func (_i *articlesRepository) ArticleMonthlyStats(userLevelId *uint, levelNumber
"SUM(share_count) as total_share"). "SUM(share_count) as total_share").
Where("EXTRACT(YEAR FROM created_at) = ?", year) Where("EXTRACT(YEAR FROM created_at) = ?", year)
// Add client filter
if clientId != nil {
query = query.Where("client_id = ?", clientId)
}
if userLevelId != nil && *levelNumber != levelNumberTop { if userLevelId != nil && *levelNumber != levelNumberTop {
query = _i.DB.DB.Model(&entity.Articles{}). query = _i.DB.DB.Model(&entity.Articles{}).
Select("EXTRACT(MONTH FROM articles.created_at) as month, EXTRACT(DAY FROM articles.created_at) as day, "+ 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("articles.is_active = true").
Where("EXTRACT(YEAR FROM articles.created_at) = ?", year). Where("EXTRACT(YEAR FROM articles.created_at) = ?", year).
Where("(user_levels.id = ? OR user_levels.parent_level_id = ?)", *userLevelId, *userLevelId) 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 err = query.Group("month, day").Scan(&results).Error

View File

@ -1,10 +1,10 @@
package request package request
import ( import (
"go-humas-be/app/database/entity"
"go-humas-be/utils/paginator"
"strconv" "strconv"
"time" "time"
"web-medols-be/app/database/entity"
"web-medols-be/utils/paginator"
) )
type ArticlesGeneric interface { type ArticlesGeneric interface {

View File

@ -1,9 +1,9 @@
package response package response
import ( import (
articleCategoriesResponse "go-humas-be/app/module/article_categories/response"
articleFilesResponse "go-humas-be/app/module/article_files/response"
"time" "time"
articleCategoriesResponse "web-medols-be/app/module/article_categories/response"
articleFilesResponse "web-medols-be/app/module/article_files/response"
) )
type ArticlesResponse struct { type ArticlesResponse struct {

View File

@ -5,23 +5,9 @@ import (
"errors" "errors"
"fmt" "fmt"
"github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2"
"github.com/google/uuid"
"github.com/minio/minio-go/v7" "github.com/minio/minio-go/v7"
"github.com/rs/zerolog" "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" "io"
"log" "log"
"math/rand" "math/rand"
@ -30,6 +16,21 @@ import (
"strconv" "strconv"
"strings" "strings"
"time" "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 // ArticlesService
@ -47,21 +48,21 @@ type articlesService struct {
// ArticlesService define interface of IArticlesService // ArticlesService define interface of IArticlesService
type ArticlesService interface { type ArticlesService interface {
All(req request.ArticlesQueryRequest) (articles []*response.ArticlesResponse, paging paginator.Pagination, err error) All(clientId *uuid.UUID, req request.ArticlesQueryRequest) (articles []*response.ArticlesResponse, paging paginator.Pagination, err error)
Show(id uint) (articles *response.ArticlesResponse, err error) Show(clientId *uuid.UUID, id uint) (articles *response.ArticlesResponse, err error)
ShowByOldId(oldId uint) (articles *response.ArticlesResponse, err error) ShowByOldId(clientId *uuid.UUID, oldId uint) (articles *response.ArticlesResponse, err error)
Save(req request.ArticlesCreateRequest, authToken string) (articles *entity.Articles, err error) Save(clientId *uuid.UUID, req request.ArticlesCreateRequest, authToken string) (articles *entity.Articles, err error)
SaveThumbnail(c *fiber.Ctx) (err error) SaveThumbnail(clientId *uuid.UUID, c *fiber.Ctx) (err error)
Update(id uint, req request.ArticlesUpdateRequest) (err error) Update(clientId *uuid.UUID, id uint, req request.ArticlesUpdateRequest) (err error)
Delete(id uint) error Delete(clientId *uuid.UUID, id uint) error
UpdateActivityCount(id uint, activityTypeId int) (err error) UpdateActivityCount(clientId *uuid.UUID, id uint, activityTypeId int) (err error)
UpdateApproval(id uint, statusId int, userLevelId int, userLevelNumber int, userParentLevelId int) (err error) UpdateApproval(clientId *uuid.UUID, id uint, statusId int, userLevelId int, userLevelNumber int, userParentLevelId int) (err error)
UpdateBanner(id uint, isBanner bool) error UpdateBanner(clientId *uuid.UUID, id uint, isBanner bool) error
Viewer(c *fiber.Ctx) error Viewer(clientId *uuid.UUID, c *fiber.Ctx) error
SummaryStats(authToken string) (summaryStats *response.ArticleSummaryStats, err error) SummaryStats(clientId *uuid.UUID, authToken string) (summaryStats *response.ArticleSummaryStats, err error)
ArticlePerUserLevelStats(authToken string, startDate *string, endDate *string) (articlePerUserLevelStats []*response.ArticlePerUserLevelStats, err error) ArticlePerUserLevelStats(clientId *uuid.UUID, authToken string, startDate *string, endDate *string) (articlePerUserLevelStats []*response.ArticlePerUserLevelStats, err error)
ArticleMonthlyStats(authToken string, year *int) (articleMonthlyStats []*response.ArticleMonthlyStats, err error) ArticleMonthlyStats(clientId *uuid.UUID, authToken string, year *int) (articleMonthlyStats []*response.ArticleMonthlyStats, err error)
PublishScheduling(id uint, publishSchedule string) error PublishScheduling(clientId *uuid.UUID, id uint, publishSchedule string) error
ExecuteScheduling() error ExecuteScheduling() error
} }
@ -92,7 +93,7 @@ func NewArticlesService(
} }
// All implement interface of ArticlesService // 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 { if req.Category != nil {
findCategory, err := _i.ArticleCategoriesRepo.FindOneBySlug(*req.Category) findCategory, err := _i.ArticleCategoriesRepo.FindOneBySlug(*req.Category)
if err != nil { if err != nil {
@ -101,7 +102,7 @@ func (_i *articlesService) All(req request.ArticlesQueryRequest) (articless []*r
req.CategoryId = &findCategory.ID req.CategoryId = &findCategory.ID
} }
results, paging, err := _i.Repo.GetAll(req) results, paging, err := _i.Repo.GetAll(clientId, req)
if err != nil { if err != nil {
return return
} }
@ -113,36 +114,36 @@ func (_i *articlesService) All(req request.ArticlesQueryRequest) (articless []*r
host := _i.Cfg.App.Domain host := _i.Cfg.App.Domain
for _, result := range results { 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) articless = append(articless, articleRes)
} }
return return
} }
func (_i *articlesService) Show(id uint) (articles *response.ArticlesResponse, err error) { func (_i *articlesService) Show(clientId *uuid.UUID, id uint) (articles *response.ArticlesResponse, err error) {
result, err := _i.Repo.FindOne(id) result, err := _i.Repo.FindOne(clientId, id)
if err != nil { if err != nil {
return nil, err return nil, err
} }
host := _i.Cfg.App.Domain 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) { func (_i *articlesService) ShowByOldId(clientId *uuid.UUID, oldId uint) (articles *response.ArticlesResponse, err error) {
result, err := _i.Repo.FindByOldId(oldId) result, err := _i.Repo.FindByOldId(clientId, oldId)
if err != nil { if err != nil {
return nil, err return nil, err
} }
host := _i.Cfg.App.Domain 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("") _i.Log.Info().Interface("data", req).Msg("")
newReq := req.ToEntity() newReq := req.ToEntity()
@ -207,7 +208,7 @@ func (_i *articlesService) Save(req request.ArticlesCreateRequest, authToken str
newReq.PublishedAt = nil newReq.PublishedAt = nil
} }
saveArticleRes, err := _i.Repo.Create(newReq) saveArticleRes, err := _i.Repo.Create(clientId, newReq)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -278,7 +279,7 @@ func (_i *articlesService) Save(req request.ArticlesCreateRequest, authToken str
return saveArticleRes, nil 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) id, err := strconv.ParseUint(c.Params("id"), 10, 0)
if err != nil { if err != nil {
@ -333,10 +334,10 @@ func (_i *articlesService) SaveThumbnail(c *fiber.Ctx) (err error) {
newFilename := newFilenameWithoutExt + "." + extension newFilename := newFilenameWithoutExt + "." + extension
objectName := fmt.Sprintf("articles/thumbnail/%d/%d/%s", now.Year(), now.Month(), newFilename) 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.ThumbnailName = &newFilename
findCategory.ThumbnailPath = &objectName findCategory.ThumbnailPath = &objectName
err = _i.Repo.Update(uint(id), findCategory) err = _i.Repo.Update(clientId, uint(id), findCategory)
if err != nil { if err != nil {
return err return err
} }
@ -351,7 +352,7 @@ func (_i *articlesService) SaveThumbnail(c *fiber.Ctx) (err error) {
return 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("") _i.Log.Info().Interface("data", req).Msg("")
newReq := req.ToEntity() newReq := req.ToEntity()
@ -364,27 +365,27 @@ func (_i *articlesService) Update(id uint, req request.ArticlesUpdateRequest) (e
newReq.CreatedAt = parsedTime newReq.CreatedAt = parsedTime
} }
return _i.Repo.UpdateSkipNull(id, newReq) return _i.Repo.UpdateSkipNull(clientId, id, newReq)
} }
func (_i *articlesService) Delete(id uint) error { func (_i *articlesService) Delete(clientId *uuid.UUID, id uint) error {
result, err := _i.Repo.FindOne(id) result, err := _i.Repo.FindOne(clientId, id)
if err != nil { if err != nil {
return err return err
} }
isActive := false isActive := false
result.IsActive = &isActive 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") thumbnailName := c.Params("thumbnailName")
emptyImage := "empty-image.jpg" emptyImage := "empty-image.jpg"
searchThumbnail := emptyImage searchThumbnail := emptyImage
if thumbnailName != emptyImage { if thumbnailName != emptyImage {
result, err := _i.Repo.FindByFilename(thumbnailName) result, err := _i.Repo.FindByFilename(clientId, thumbnailName)
if err != nil { if err != nil {
return err return err
} }
@ -439,8 +440,8 @@ func (_i *articlesService) Viewer(c *fiber.Ctx) (err error) {
return return
} }
func (_i *articlesService) UpdateActivityCount(id uint, activityTypeId int) error { func (_i *articlesService) UpdateActivityCount(clientId *uuid.UUID, id uint, activityTypeId int) error {
result, err := _i.Repo.FindOne(id) result, err := _i.Repo.FindOne(clientId, id)
if err != nil { if err != nil {
return err return err
} }
@ -468,20 +469,20 @@ func (_i *articlesService) UpdateActivityCount(id uint, activityTypeId int) erro
result.ViewCount = &viewCount result.ViewCount = &viewCount
result.ShareCount = &shareCount result.ShareCount = &shareCount
result.CommentCount = &commentCount 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) 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 { if err != nil {
return nil, err return nil, err
} }
return result, nil 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) user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
_i.Log.Info().Str("timestamp", time.Now(). _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"). Format(time.RFC3339)).Str("Service:Resource", "articlesService:ArticlePerUserLevelStats").
Interface("userLevelNumber", userLevelNumber).Msg("") 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 { if err != nil {
return nil, err return nil, err
} }
return result, nil 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) user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
var userLevelId *uint var userLevelId *uint
@ -524,15 +525,15 @@ func (_i *articlesService) ArticleMonthlyStats(authToken string, year *int) (art
userLevelNumber = &user.UserLevel.LevelNumber userLevelNumber = &user.UserLevel.LevelNumber
} }
result, err := _i.Repo.ArticleMonthlyStats(userLevelId, userLevelNumber, *year) result, err := _i.Repo.ArticleMonthlyStats(clientId, userLevelId, userLevelNumber, *year)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return result, nil return result, nil
} }
func (_i *articlesService) UpdateApproval(id uint, statusId int, userLevelId int, userLevelNumber int, userParentLevelId int) (err error) { func (_i *articlesService) UpdateApproval(clientId *uuid.UUID, id uint, statusId int, userLevelId int, userLevelNumber int, userParentLevelId int) (err error) {
result, err := _i.Repo.FindOne(id) result, err := _i.Repo.FindOne(clientId, id)
if err != nil { if err != nil {
return err return err
} }
@ -576,7 +577,7 @@ func (_i *articlesService) UpdateApproval(id uint, statusId int, userLevelId int
result.HasApprovedBy = nil result.HasApprovedBy = nil
} }
err = _i.Repo.Update(id, result) err = _i.Repo.Update(clientId, id, result)
if err != nil { if err != nil {
return err return err
} }
@ -584,26 +585,27 @@ func (_i *articlesService) UpdateApproval(id uint, statusId int, userLevelId int
return return
} }
func (_i *articlesService) PublishScheduling(id uint, publishSchedule string) error { func (_i *articlesService) PublishScheduling(clientId *uuid.UUID, id uint, publishSchedule string) error {
result, err := _i.Repo.FindOne(id) result, err := _i.Repo.FindOne(clientId, id)
if err != nil { if err != nil {
return err return err
} }
result.PublishSchedule = &publishSchedule 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 { func (_i *articlesService) UpdateBanner(clientId *uuid.UUID, id uint, isBanner bool) error {
result, err := _i.Repo.FindOne(id) result, err := _i.Repo.FindOne(clientId, id)
if err != nil { if err != nil {
return err return err
} }
result.IsBanner = &isBanner result.IsBanner = &isBanner
return _i.Repo.Update(id, result) return _i.Repo.Update(clientId, id, result)
} }
func (_i *articlesService) ExecuteScheduling() error { 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 { if err != nil {
return err return err
} }
@ -631,7 +633,8 @@ func (_i *articlesService) ExecuteScheduling() error {
article.PublishedAt = &now article.PublishedAt = &now
article.StatusId = &statusIdTwo 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(). _i.Log.Info().Str("timestamp", time.Now().
Format(time.RFC3339)).Str("Service:articlesService", "Methods:ExecuteScheduling"). Format(time.RFC3339)).Str("Service:articlesService", "Methods:ExecuteScheduling").
Interface("Failed to publish Article ID : ", article.ID).Msg("") Interface("Failed to publish Article ID : ", article.ID).Msg("")

Some files were not shown because too many files have changed in this diff Show More