feat: update major
This commit is contained in:
parent
a40fb1086f
commit
58bb26f7b9
|
|
@ -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
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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()"`
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()"`
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()"`
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()"`
|
||||
|
|
|
|||
|
|
@ -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()"`
|
||||
|
|
|
|||
|
|
@ -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()"`
|
||||
|
|
|
|||
|
|
@ -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()"`
|
||||
|
|
|
|||
|
|
@ -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()"`
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()"`
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()"`
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()"`
|
||||
|
|
|
|||
|
|
@ -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()"`
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()"`
|
||||
|
|
|
|||
|
|
@ -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()"`
|
||||
|
|
|
|||
|
|
@ -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()"`
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()"`
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()"`
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()"`
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()"`
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()"`
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()"`
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()"`
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()"`
|
||||
|
|
|
|||
|
|
@ -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{},
|
||||
|
|
|
|||
|
|
@ -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{}
|
||||
|
|
|
|||
|
|
@ -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{}
|
||||
|
|
|
|||
|
|
@ -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{}
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
package controller
|
||||
|
||||
import "go-humas-be/app/module/article_categories/service"
|
||||
import "web-medols-be/app/module/article_categories/service"
|
||||
|
||||
type Controller struct {
|
||||
ArticleCategories ArticleCategoriesController
|
||||
|
|
@ -10,4 +10,4 @@ func NewController(ArticleCategoriesService service.ArticleCategoriesService) *C
|
|||
return &Controller{
|
||||
ArticleCategories: NewArticleCategoriesController(ArticleCategoriesService),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
package controller
|
||||
|
||||
import "go-humas-be/app/module/article_category_details/service"
|
||||
import "web-medols-be/app/module/article_category_details/service"
|
||||
|
||||
type Controller struct {
|
||||
ArticleCategoryDetails ArticleCategoryDetailsController
|
||||
|
|
@ -10,4 +10,4 @@ func NewController(ArticleCategoryDetailsService service.ArticleCategoryDetailsS
|
|||
return &Controller{
|
||||
ArticleCategoryDetails: NewArticleCategoryDetailsController(ArticleCategoryDetailsService),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
package controller
|
||||
|
||||
import "go-humas-be/app/module/article_files/service"
|
||||
import "web-medols-be/app/module/article_files/service"
|
||||
|
||||
type Controller struct {
|
||||
ArticleFiles ArticleFilesController
|
||||
|
|
@ -10,4 +10,4 @@ func NewController(ArticleFilesService service.ArticleFilesService) *Controller
|
|||
return &Controller{
|
||||
ArticleFiles: NewArticleFilesController(ArticleFilesService),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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
Loading…
Reference in New Issue