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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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
import "time"
import (
"github.com/google/uuid"
"time"
)
type CsrfTokenRecords struct {
ID uint `gorm:"primaryKey"`
Token string `gorm:"uniqueIndex;size:255"`
Value []byte `gorm:"value"`
ExpireAt time.Time `gorm:"index"`
ID uint `gorm:"primaryKey"`
Token string `gorm:"uniqueIndex;size:255"`
Value []byte `gorm:"value"`
ExpireAt time.Time `gorm:"index"`
ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"`
CreatedAt time.Time
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -2,13 +2,13 @@ package database
import (
"github.com/rs/zerolog"
"go-humas-be/app/database/entity"
"go-humas-be/app/database/entity/article_category_details"
"go-humas-be/app/database/entity/users"
"go-humas-be/config/config"
"gorm.io/driver/postgres"
"gorm.io/gorm"
"gorm.io/gorm/logger"
"web-medols-be/app/database/entity"
"web-medols-be/app/database/entity/article_category_details"
"web-medols-be/app/database/entity/users"
"web-medols-be/config/config"
)
// Database setup database with gorm
@ -95,6 +95,7 @@ func Models() []interface{} {
entity.ArticleNulisAI{},
entity.AuditTrails{},
entity.Cities{},
entity.Clients{},
entity.CsrfTokenRecords{},
entity.CustomStaticPages{},
entity.Districts{},

View File

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

View File

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

View File

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

View File

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

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 (
"fmt"
"go-humas-be/app/database/entity"
"gorm.io/gorm"
"time"
"web-medols-be/app/database/entity"
)
type PostgresStorage struct {

View File

@ -3,11 +3,11 @@ package middleware
import (
"github.com/gofiber/fiber/v2/middleware/csrf"
"github.com/gofiber/fiber/v2/middleware/session"
"go-humas-be/app/database"
"go-humas-be/config/config"
utilsSvc "go-humas-be/utils"
"log"
"time"
"web-medols-be/app/database"
"web-medols-be/config/config"
utilsSvc "web-medols-be/utils"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/compress"
@ -59,7 +59,7 @@ func (m *Middleware) Register(db *database.Database) {
Next: utilsSvc.IsEnabled(m.Cfg.Middleware.Cors.Enable),
AllowOrigins: "http://localhost:3000, http://localhost:4000, https://kontenhumas.com, https://mediapool.id, https://polrinews-project.vercel.app, http://127.0.0.1:3000, http://10.200.202.141",
AllowMethods: "HEAD, GET, POST, PUT, DELETE, OPTION, PATCH",
AllowHeaders: "Origin, Content-Type, Accept, Accept-Language, Authorization, X-Requested-With, Access-Control-Request-Method, Access-Control-Request-Headers, Access-Control-Allow-Origin, Access-Control-Allow-Credentials, X-Csrf-Token, Cookie, Set-Cookie",
AllowHeaders: "Origin, Content-Type, Accept, Accept-Language, Authorization, X-Requested-With, Access-Control-Request-Method, Access-Control-Request-Headers, Access-Control-Allow-Origin, Access-Control-Allow-Credentials, X-Csrf-Token, Cookie, Set-Cookie, X-Client-Key",
ExposeHeaders: "Content-Length, Content-Type",
AllowCredentials: true,
MaxAge: 12,
@ -125,6 +125,9 @@ func (m *Middleware) Register(db *database.Database) {
//===============================
// Client middleware - must be applied before other business logic
m.App.Use(ClientMiddleware(db.DB))
m.App.Use(AuditTrailsMiddleware(db.DB))
StartAuditTrailCleanup(db.DB, m.Cfg.Middleware.AuditTrails.Retention)

View File

@ -2,10 +2,10 @@ package activity_logs
import (
"github.com/gofiber/fiber/v2"
"go-humas-be/app/module/activity_logs/controller"
"go-humas-be/app/module/activity_logs/repository"
"go-humas-be/app/module/activity_logs/service"
"go.uber.org/fx"
"web-medols-be/app/module/activity_logs/controller"
"web-medols-be/app/module/activity_logs/repository"
"web-medols-be/app/module/activity_logs/service"
)
// struct of ActivityLogsRouter

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -2,10 +2,10 @@ package advertisement
import (
"github.com/gofiber/fiber/v2"
"go-humas-be/app/module/advertisement/controller"
"go-humas-be/app/module/advertisement/repository"
"go-humas-be/app/module/advertisement/service"
"go.uber.org/fx"
"web-medols-be/app/module/advertisement/controller"
"web-medols-be/app/module/advertisement/repository"
"web-medols-be/app/module/advertisement/service"
)
// struct of AdvertisementRouter

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -2,10 +2,10 @@ package article_approvals
import (
"github.com/gofiber/fiber/v2"
"go-humas-be/app/module/article_approvals/controller"
"go-humas-be/app/module/article_approvals/repository"
"go-humas-be/app/module/article_approvals/service"
"go.uber.org/fx"
"web-medols-be/app/module/article_approvals/controller"
"web-medols-be/app/module/article_approvals/repository"
"web-medols-be/app/module/article_approvals/service"
)
// struct of ArticleApprovalsRouter

View File

@ -3,13 +3,14 @@ package controller
import (
"github.com/gofiber/fiber/v2"
"github.com/rs/zerolog"
"go-humas-be/app/module/article_approvals/request"
"go-humas-be/app/module/article_approvals/service"
"go-humas-be/utils/paginator"
"strconv"
"web-medols-be/app/middleware"
"web-medols-be/app/module/article_approvals/request"
"web-medols-be/app/module/article_approvals/service"
"web-medols-be/utils/paginator"
utilRes "go-humas-be/utils/response"
utilVal "go-humas-be/utils/validator"
utilRes "web-medols-be/utils/response"
utilVal "web-medols-be/utils/validator"
)
type articleApprovalsController struct {
@ -122,7 +123,11 @@ func (_i *articleApprovalsController) Save(c *fiber.Ctx) error {
}
authToken := c.Get("Authorization")
dataResult, err := _i.articleApprovalsService.Save(*req, authToken)
// Get ClientId from context
clientId := middleware.GetClientID(c)
dataResult, err := _i.articleApprovalsService.Save(clientId, *req, authToken)
if err != nil {
return err
}

View File

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

View File

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

View File

@ -3,12 +3,12 @@ package repository
import (
"fmt"
"github.com/rs/zerolog"
"go-humas-be/app/database"
"go-humas-be/app/database/entity"
"go-humas-be/app/module/article_approvals/request"
"go-humas-be/utils/paginator"
utilSvc "go-humas-be/utils/service"
"strings"
"web-medols-be/app/database"
"web-medols-be/app/database/entity"
"web-medols-be/app/module/article_approvals/request"
"web-medols-be/utils/paginator"
utilSvc "web-medols-be/utils/service"
)
type articleApprovalsRepository struct {

View File

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

View File

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

View File

@ -2,10 +2,10 @@ package article_categories
import (
"github.com/gofiber/fiber/v2"
"go-humas-be/app/module/article_categories/controller"
"go-humas-be/app/module/article_categories/repository"
"go-humas-be/app/module/article_categories/service"
"go.uber.org/fx"
"web-medols-be/app/module/article_categories/controller"
"web-medols-be/app/module/article_categories/repository"
"web-medols-be/app/module/article_categories/service"
)
// struct of ArticleCategoriesRouter

View File

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

View File

@ -1,6 +1,6 @@
package controller
import "go-humas-be/app/module/article_categories/service"
import "web-medols-be/app/module/article_categories/service"
type Controller struct {
ArticleCategories ArticleCategoriesController

View File

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

View File

@ -2,13 +2,14 @@ package repository
import (
"fmt"
"github.com/google/uuid"
"github.com/rs/zerolog"
"go-humas-be/app/database"
"go-humas-be/app/database/entity"
"go-humas-be/app/module/article_categories/request"
"go-humas-be/utils/paginator"
utilSvc "go-humas-be/utils/service"
"strings"
"web-medols-be/app/database"
"web-medols-be/app/database/entity"
"web-medols-be/app/module/article_categories/request"
"web-medols-be/utils/paginator"
utilSvc "web-medols-be/utils/service"
)
type articleCategoriesRepository struct {
@ -18,13 +19,13 @@ type articleCategoriesRepository struct {
// ArticleCategoriesRepository define interface of IArticleCategoriesRepository
type ArticleCategoriesRepository interface {
GetAll(req request.ArticleCategoriesQueryRequest) (articleCategoriess []*entity.ArticleCategories, paging paginator.Pagination, err error)
FindOne(id uint) (articleCategories *entity.ArticleCategories, err error)
FindOneByOldId(id uint) (articleCategories *entity.ArticleCategories, err error)
FindOneBySlug(slug string) (articleCategories *entity.ArticleCategories, err error)
GetAll(clientId *uuid.UUID, req request.ArticleCategoriesQueryRequest) (articleCategoriess []*entity.ArticleCategories, paging paginator.Pagination, err error)
FindOne(clientId *uuid.UUID, id uint) (articleCategories *entity.ArticleCategories, err error)
FindOneByOldId(clientId *uuid.UUID, id uint) (articleCategories *entity.ArticleCategories, err error)
FindOneBySlug(clientId *uuid.UUID, slug string) (articleCategories *entity.ArticleCategories, err error)
Create(articleCategories *entity.ArticleCategories) (articleCategoriesReturn *entity.ArticleCategories, err error)
Update(id uint, articleCategories *entity.ArticleCategories) (err error)
Delete(id uint) (err error)
Update(clientId *uuid.UUID, id uint, articleCategories *entity.ArticleCategories) (err error)
Delete(clientId *uuid.UUID, id uint) (err error)
}
func NewArticleCategoriesRepository(db *database.Database, log zerolog.Logger) ArticleCategoriesRepository {
@ -35,16 +36,26 @@ func NewArticleCategoriesRepository(db *database.Database, log zerolog.Logger) A
}
// implement interface of IArticleCategoriesRepository
func (_i *articleCategoriesRepository) GetAll(req request.ArticleCategoriesQueryRequest) (articleCategoriess []*entity.ArticleCategories, paging paginator.Pagination, err error) {
func (_i *articleCategoriesRepository) GetAll(clientId *uuid.UUID, req request.ArticleCategoriesQueryRequest) (articleCategoriess []*entity.ArticleCategories, paging paginator.Pagination, err error) {
var count int64
query := _i.DB.DB.Model(&entity.ArticleCategories{})
// Add ClientId filter
if clientId != nil {
query = query.Where("article_categories.client_id = ?", clientId)
}
if req.UserLevelId != nil {
query = _i.DB.DB.Model(&entity.ArticleCategories{}).
Joins("LEFT JOIN users ON article_categories.created_by_id = users.id").
Joins("LEFT JOIN user_levels ON users.user_level_id = user_levels.id").
Where("user_levels.id = ? or user_levels.parent_level_id = ?", *req.UserLevelId, *req.UserLevelId)
// Add ClientId filter for joined query
if clientId != nil {
query = query.Where("article_categories.client_id = ?", clientId)
}
}
query = query.Where("article_categories.is_active = ?", true)
@ -90,24 +101,45 @@ func (_i *articleCategoriesRepository) GetAll(req request.ArticleCategoriesQuery
return
}
func (_i *articleCategoriesRepository) FindOne(id uint) (articleCategories *entity.ArticleCategories, err error) {
if err := _i.DB.DB.First(&articleCategories, id).Error; err != nil {
func (_i *articleCategoriesRepository) FindOne(clientId *uuid.UUID, id uint) (articleCategories *entity.ArticleCategories, err error) {
query := _i.DB.DB.Where("id = ?", id)
// Add ClientId filter
if clientId != nil {
query = query.Where("client_id = ?", clientId)
}
if err := query.First(&articleCategories).Error; err != nil {
return nil, err
}
return articleCategories, nil
}
func (_i *articleCategoriesRepository) FindOneByOldId(id uint) (articleCategories *entity.ArticleCategories, err error) {
if err := _i.DB.DB.Where("old_category_id = ?", id).First(&articleCategories).Error; err != nil {
func (_i *articleCategoriesRepository) FindOneByOldId(clientId *uuid.UUID, id uint) (articleCategories *entity.ArticleCategories, err error) {
query := _i.DB.DB.Where("old_category_id = ?", id)
// Add ClientId filter
if clientId != nil {
query = query.Where("client_id = ?", clientId)
}
if err := query.First(&articleCategories).Error; err != nil {
return nil, err
}
return articleCategories, nil
}
func (_i *articleCategoriesRepository) FindOneBySlug(slug string) (articleCategories *entity.ArticleCategories, err error) {
if err := _i.DB.DB.Where("slug = ?", slug).First(&articleCategories).Error; err != nil {
func (_i *articleCategoriesRepository) FindOneBySlug(clientId *uuid.UUID, slug string) (articleCategories *entity.ArticleCategories, err error) {
query := _i.DB.DB.Where("slug = ?", slug)
// Add ClientId filter
if clientId != nil {
query = query.Where("client_id = ?", clientId)
}
if err := query.First(&articleCategories).Error; err != nil {
return nil, err
}
@ -119,16 +151,22 @@ func (_i *articleCategoriesRepository) Create(articleCategories *entity.ArticleC
return articleCategories, result.Error
}
func (_i *articleCategoriesRepository) Update(id uint, articleCategories *entity.ArticleCategories) (err error) {
func (_i *articleCategoriesRepository) Update(clientId *uuid.UUID, id uint, articleCategories *entity.ArticleCategories) (err error) {
articleCategoriesMap, err := utilSvc.StructToMap(articleCategories)
if err != nil {
return err
}
return _i.DB.DB.Model(&entity.ArticleCategories{}).
Where(&entity.ArticleCategories{ID: id}).
Updates(articleCategoriesMap).Error
query := _i.DB.DB.Model(&entity.ArticleCategories{}).Where(&entity.ArticleCategories{ID: id})
if clientId != nil {
query = query.Where("client_id = ?", clientId)
}
return query.Updates(articleCategoriesMap).Error
}
func (_i *articleCategoriesRepository) Delete(id uint) error {
return _i.DB.DB.Delete(&entity.ArticleCategories{}, id).Error
func (_i *articleCategoriesRepository) Delete(clientId *uuid.UUID, id uint) error {
query := _i.DB.DB.Model(&entity.ArticleCategories{}).Where("id = ?", id)
if clientId != nil {
query = query.Where("client_id = ?", clientId)
}
return query.Delete(&entity.ArticleCategories{}).Error
}

View File

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

View File

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

View File

@ -2,10 +2,10 @@ package article_category_details
import (
"github.com/gofiber/fiber/v2"
"go-humas-be/app/module/article_category_details/controller"
"go-humas-be/app/module/article_category_details/repository"
"go-humas-be/app/module/article_category_details/service"
"go.uber.org/fx"
"web-medols-be/app/module/article_category_details/controller"
"web-medols-be/app/module/article_category_details/repository"
"web-medols-be/app/module/article_category_details/service"
)
// struct of ArticleCategoryDetailsRouter

View File

@ -2,13 +2,13 @@ package controller
import (
"github.com/gofiber/fiber/v2"
"go-humas-be/app/module/article_category_details/request"
"go-humas-be/app/module/article_category_details/service"
"go-humas-be/utils/paginator"
"strconv"
"web-medols-be/app/module/article_category_details/request"
"web-medols-be/app/module/article_category_details/service"
"web-medols-be/utils/paginator"
utilRes "go-humas-be/utils/response"
utilVal "go-humas-be/utils/validator"
utilRes "web-medols-be/utils/response"
utilVal "web-medols-be/utils/validator"
)
type articleCategoryDetailsController struct {

View File

@ -1,6 +1,6 @@
package controller
import "go-humas-be/app/module/article_category_details/service"
import "web-medols-be/app/module/article_category_details/service"
type Controller struct {
ArticleCategoryDetails ArticleCategoryDetailsController

View File

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

View File

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

View File

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

View File

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

View File

@ -2,10 +2,10 @@ package article_comments
import (
"github.com/gofiber/fiber/v2"
"go-humas-be/app/module/article_comments/controller"
"go-humas-be/app/module/article_comments/repository"
"go-humas-be/app/module/article_comments/service"
"go.uber.org/fx"
"web-medols-be/app/module/article_comments/controller"
"web-medols-be/app/module/article_comments/repository"
"web-medols-be/app/module/article_comments/service"
)
// struct of ArticleCommentsRouter

View File

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

View File

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

View File

@ -1,17 +1,18 @@
package mapper
import (
"go-humas-be/app/database/entity"
res "go-humas-be/app/module/article_comments/response"
usersRepository "go-humas-be/app/module/users/repository"
"github.com/google/uuid"
"web-medols-be/app/database/entity"
res "web-medols-be/app/module/article_comments/response"
usersRepository "web-medols-be/app/module/users/repository"
)
func ArticleCommentsResponseMapper(articleCommentsReq *entity.ArticleComments, usersRepo usersRepository.UsersRepository) (articleCommentsRes *res.ArticleCommentsResponse) {
func ArticleCommentsResponseMapper(clientId *uuid.UUID, articleCommentsReq *entity.ArticleComments, usersRepo usersRepository.UsersRepository) (articleCommentsRes *res.ArticleCommentsResponse) {
if articleCommentsReq != nil {
commentFromName := ""
if articleCommentsReq.CommentFrom != nil {
findUser, _ := usersRepo.FindOne(*articleCommentsReq.CommentFrom)
findUser, _ := usersRepo.FindOne(clientId, *articleCommentsReq.CommentFrom)
if findUser != nil {
commentFromName = findUser.Fullname
}

View File

@ -2,13 +2,14 @@ package repository
import (
"fmt"
"github.com/google/uuid"
"github.com/rs/zerolog"
"go-humas-be/app/database"
"go-humas-be/app/database/entity"
"go-humas-be/app/module/article_comments/request"
"go-humas-be/utils/paginator"
utilSvc "go-humas-be/utils/service"
"strings"
"web-medols-be/app/database"
"web-medols-be/app/database/entity"
"web-medols-be/app/module/article_comments/request"
"web-medols-be/utils/paginator"
utilSvc "web-medols-be/utils/service"
)
type articleCommentsRepository struct {
@ -18,11 +19,11 @@ type articleCommentsRepository struct {
// ArticleCommentsRepository define interface of IArticleCommentsRepository
type ArticleCommentsRepository interface {
GetAll(req request.ArticleCommentsQueryRequest) (articleCommentss []*entity.ArticleComments, paging paginator.Pagination, err error)
FindOne(id uint) (articleComments *entity.ArticleComments, err error)
Create(articleComments *entity.ArticleComments) (articleCommentsReturn *entity.ArticleComments, err error)
Update(id uint, articleComments *entity.ArticleComments) (err error)
Delete(id uint) (err error)
GetAll(clientId *uuid.UUID, req request.ArticleCommentsQueryRequest) (articleCommentss []*entity.ArticleComments, paging paginator.Pagination, err error)
FindOne(clientId *uuid.UUID, id uint) (articleComments *entity.ArticleComments, err error)
Create(clientId *uuid.UUID, articleComments *entity.ArticleComments) (articleCommentsReturn *entity.ArticleComments, err error)
Update(clientId *uuid.UUID, id uint, articleComments *entity.ArticleComments) (err error)
Delete(clientId *uuid.UUID, id uint) (err error)
}
func NewArticleCommentsRepository(db *database.Database, logger zerolog.Logger) ArticleCommentsRepository {
@ -33,12 +34,17 @@ func NewArticleCommentsRepository(db *database.Database, logger zerolog.Logger)
}
// implement interface of IArticleCommentsRepository
func (_i *articleCommentsRepository) GetAll(req request.ArticleCommentsQueryRequest) (articleCommentss []*entity.ArticleComments, paging paginator.Pagination, err error) {
func (_i *articleCommentsRepository) GetAll(clientId *uuid.UUID, req request.ArticleCommentsQueryRequest) (articleCommentss []*entity.ArticleComments, paging paginator.Pagination, err error) {
var count int64
query := _i.DB.DB.Model(&entity.ArticleComments{})
query = query.Where("is_active = ?", true)
// Add client filter
if clientId != nil {
query = query.Where("client_id = ?", clientId)
}
if req.Message != nil && *req.Message != "" {
message := strings.ToLower(*req.Message)
query = query.Where("LOWER(message) LIKE ?", "%"+strings.ToLower(message)+"%")
@ -78,20 +84,39 @@ func (_i *articleCommentsRepository) GetAll(req request.ArticleCommentsQueryRequ
return
}
func (_i *articleCommentsRepository) FindOne(id uint) (articleComments *entity.ArticleComments, err error) {
if err := _i.DB.DB.First(&articleComments, id).Error; err != nil {
func (_i *articleCommentsRepository) FindOne(clientId *uuid.UUID, id uint) (articleComments *entity.ArticleComments, err error) {
query := _i.DB.DB
if clientId != nil {
query = query.Where("client_id = ?", clientId)
}
if err := query.First(&articleComments, id).Error; err != nil {
return nil, err
}
return articleComments, nil
}
func (_i *articleCommentsRepository) Create(articleComments *entity.ArticleComments) (articleCommentsReturn *entity.ArticleComments, err error) {
func (_i *articleCommentsRepository) Create(clientId *uuid.UUID, articleComments *entity.ArticleComments) (articleCommentsReturn *entity.ArticleComments, err error) {
// Set client ID
if clientId != nil {
articleComments.ClientId = clientId
}
result := _i.DB.DB.Create(articleComments)
return articleComments, result.Error
}
func (_i *articleCommentsRepository) Update(id uint, articleComments *entity.ArticleComments) (err error) {
func (_i *articleCommentsRepository) Update(clientId *uuid.UUID, id uint, articleComments *entity.ArticleComments) (err error) {
// Validate client access
if clientId != nil {
var count int64
if err := _i.DB.DB.Model(&entity.ArticleComments{}).Where("id = ? AND client_id = ?", id, clientId).Count(&count).Error; err != nil {
return err
}
if count == 0 {
return fmt.Errorf("access denied to this resource")
}
}
articleCommentsMap, err := utilSvc.StructToMap(articleComments)
if err != nil {
return err
@ -101,6 +126,17 @@ func (_i *articleCommentsRepository) Update(id uint, articleComments *entity.Art
Updates(articleCommentsMap).Error
}
func (_i *articleCommentsRepository) Delete(id uint) error {
func (_i *articleCommentsRepository) Delete(clientId *uuid.UUID, id uint) error {
// Validate client access
if clientId != nil {
var count int64
if err := _i.DB.DB.Model(&entity.ArticleComments{}).Where("id = ? AND client_id = ?", id, clientId).Count(&count).Error; err != nil {
return err
}
if count == 0 {
return fmt.Errorf("access denied to this resource")
}
}
return _i.DB.DB.Delete(&entity.ArticleComments{}, id).Error
}

View File

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

View File

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

View File

@ -2,10 +2,10 @@ package article_files
import (
"github.com/gofiber/fiber/v2"
"go-humas-be/app/module/article_files/controller"
"go-humas-be/app/module/article_files/repository"
"go-humas-be/app/module/article_files/service"
"go.uber.org/fx"
"web-medols-be/app/module/article_files/controller"
"web-medols-be/app/module/article_files/repository"
"web-medols-be/app/module/article_files/service"
)
// struct of ArticleFilesRouter

View File

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

View File

@ -1,6 +1,6 @@
package controller
import "go-humas-be/app/module/article_files/service"
import "web-medols-be/app/module/article_files/service"
type Controller struct {
ArticleFiles ArticleFilesController

View File

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

View File

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

View File

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

View File

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

View File

@ -2,10 +2,10 @@ package article_nulis_ai
import (
"github.com/gofiber/fiber/v2"
"go-humas-be/app/module/article_nulis_ai/controller"
"go-humas-be/app/module/article_nulis_ai/repository"
"go-humas-be/app/module/article_nulis_ai/service"
"go.uber.org/fx"
"web-medols-be/app/module/article_nulis_ai/controller"
"web-medols-be/app/module/article_nulis_ai/repository"
"web-medols-be/app/module/article_nulis_ai/service"
)
// struct of ArticleNulisAIRouter

View File

@ -3,12 +3,12 @@ package controller
import (
"github.com/gofiber/fiber/v2"
"github.com/rs/zerolog"
"go-humas-be/app/module/article_nulis_ai/request"
"go-humas-be/app/module/article_nulis_ai/service"
"go-humas-be/utils/paginator"
utilRes "go-humas-be/utils/response"
utilVal "go-humas-be/utils/validator"
"strconv"
"web-medols-be/app/module/article_nulis_ai/request"
"web-medols-be/app/module/article_nulis_ai/service"
"web-medols-be/utils/paginator"
utilRes "web-medols-be/utils/response"
utilVal "web-medols-be/utils/validator"
)
type articleNulisAIController struct {

View File

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

View File

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

View File

@ -3,11 +3,11 @@ package repository
import (
"fmt"
"github.com/rs/zerolog"
"go-humas-be/app/database"
"go-humas-be/app/database/entity"
"go-humas-be/app/module/article_nulis_ai/request"
"go-humas-be/utils/paginator"
"strings"
"web-medols-be/app/database"
"web-medols-be/app/database/entity"
"web-medols-be/app/module/article_nulis_ai/request"
"web-medols-be/utils/paginator"
)
type articleNulisAIRepository struct {

View File

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

View File

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

View File

@ -2,10 +2,10 @@ package articles
import (
"github.com/gofiber/fiber/v2"
"go-humas-be/app/module/articles/controller"
"go-humas-be/app/module/articles/repository"
"go-humas-be/app/module/articles/service"
"go.uber.org/fx"
"web-medols-be/app/module/articles/controller"
"web-medols-be/app/module/articles/repository"
"web-medols-be/app/module/articles/service"
)
// ArticlesRouter struct of ArticlesRouter

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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