feat: update major
This commit is contained in:
parent
a40fb1086f
commit
58bb26f7b9
|
|
@ -20,8 +20,8 @@ build-2:
|
||||||
script:
|
script:
|
||||||
- docker login -u $DEPLOY_USERNAME -p $DEPLOY_TOKEN 103.82.242.92:8900
|
- docker login -u $DEPLOY_USERNAME -p $DEPLOY_TOKEN 103.82.242.92:8900
|
||||||
- docker-compose build
|
- docker-compose build
|
||||||
- docker tag registry.gitlab.com/hanifsalafi/web-humas-be:dev 103.82.242.92:8900/humas/web-humas-be:dev
|
- docker tag registry.gitlab.com/hanifsalafi/web-medols-be:dev 103.82.242.92:8900/medols/web-medols-be:dev
|
||||||
- docker push 103.82.242.92:8900/humas/web-humas-be:dev
|
- docker push 103.82.242.92:8900/medols/web-medols-be:dev
|
||||||
|
|
||||||
deploy:
|
deploy:
|
||||||
stage: deploy
|
stage: deploy
|
||||||
|
|
@ -30,4 +30,4 @@ deploy:
|
||||||
services:
|
services:
|
||||||
- docker:dind
|
- docker:dind
|
||||||
script:
|
script:
|
||||||
- curl --user $JENKINS_USER:$JENKINS_PWD http://38.47.180.165:8080/job/autodeploy-humas-be/build?token=autodeployhumas
|
- curl --user $JENKINS_USER:$JENKINS_PWD http://38.47.180.165:8080/job/autodeploy-medols-be/build?token=autodeploymedols
|
||||||
|
|
@ -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">
|
<project version="4">
|
||||||
<component name="ProjectModuleManager">
|
<component name="ProjectModuleManager">
|
||||||
<modules>
|
<modules>
|
||||||
<module fileurl="file://$PROJECT_DIR$/.idea/go-humas-be.iml" filepath="$PROJECT_DIR$/.idea/go-humas-be.iml" />
|
<module fileurl="file://$PROJECT_DIR$/.idea/web-medols-be.iml" filepath="$PROJECT_DIR$/.idea/web-medols-be.iml" />
|
||||||
</modules>
|
</modules>
|
||||||
</component>
|
</component>
|
||||||
</project>
|
</project>
|
||||||
|
|
@ -1,13 +1,17 @@
|
||||||
package entity
|
package entity
|
||||||
|
|
||||||
import "time"
|
import (
|
||||||
|
"github.com/google/uuid"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
type ActivityLogs struct {
|
type ActivityLogs struct {
|
||||||
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
|
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
|
||||||
ActivityTypeId int `json:"activity_type_id" gorm:"type:int4"`
|
ActivityTypeId int `json:"activity_type_id" gorm:"type:int4"`
|
||||||
Url string `json:"url" gorm:"type:varchar"`
|
Url string `json:"url" gorm:"type:varchar"`
|
||||||
VisitorIp *string `json:"visitor_ip" gorm:"type:varchar"`
|
VisitorIp *string `json:"visitor_ip" gorm:"type:varchar"`
|
||||||
ArticleId *uint `json:"article_id" gorm:"type:int4"`
|
ArticleId *uint `json:"article_id" gorm:"type:int4"`
|
||||||
UserId *uint `json:"user_id" gorm:"type:int4"`
|
UserId *uint `json:"user_id" gorm:"type:int4"`
|
||||||
CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
|
ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"`
|
||||||
|
CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,18 +1,22 @@
|
||||||
package entity
|
package entity
|
||||||
|
|
||||||
import "time"
|
import (
|
||||||
|
"github.com/google/uuid"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
type Advertisement struct {
|
type Advertisement struct {
|
||||||
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
|
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
|
||||||
Title string `json:"title" gorm:"type:varchar"`
|
Title string `json:"title" gorm:"type:varchar"`
|
||||||
Description string `json:"description" gorm:"type:varchar"`
|
Description string `json:"description" gorm:"type:varchar"`
|
||||||
RedirectLink string `json:"redirect_link" gorm:"type:varchar"`
|
RedirectLink string `json:"redirect_link" gorm:"type:varchar"`
|
||||||
ContentFilePath *string `json:"content_file_path" gorm:"type:varchar"`
|
ContentFilePath *string `json:"content_file_path" gorm:"type:varchar"`
|
||||||
ContentFileName *string `json:"content_file_name" gorm:"type:varchar"`
|
ContentFileName *string `json:"content_file_name" gorm:"type:varchar"`
|
||||||
Placement string `json:"placement" gorm:"type:varchar"`
|
Placement string `json:"placement" gorm:"type:varchar"`
|
||||||
StatusId int `json:"status_id" gorm:"type:int4"`
|
StatusId int `json:"status_id" gorm:"type:int4"`
|
||||||
IsPublish bool `json:"is_publish" gorm:"type:bool"`
|
IsPublish bool `json:"is_publish" gorm:"type:bool"`
|
||||||
IsActive bool `json:"is_active" gorm:"type:bool;default:true"`
|
ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"`
|
||||||
CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
|
IsActive bool `json:"is_active" gorm:"type:bool;default:true"`
|
||||||
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`
|
CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
|
||||||
|
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,17 @@
|
||||||
package entity
|
package entity
|
||||||
|
|
||||||
import "time"
|
import (
|
||||||
|
"github.com/google/uuid"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
type ArticleApprovals struct {
|
type ArticleApprovals struct {
|
||||||
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
|
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
|
||||||
ArticleId uint `json:"article_id" gorm:"type:int4"`
|
ArticleId uint `json:"article_id" gorm:"type:int4"`
|
||||||
ApprovalBy uint `json:"approval_by" gorm:"type:int4"`
|
ApprovalBy uint `json:"approval_by" gorm:"type:int4"`
|
||||||
StatusId int `json:"status_id" gorm:"type:int4"`
|
StatusId int `json:"status_id" gorm:"type:int4"`
|
||||||
Message string `json:"message" gorm:"type:varchar"`
|
Message string `json:"message" gorm:"type:varchar"`
|
||||||
ApprovalAtLevel *int `json:"approval_at_level" gorm:"type:int4"`
|
ApprovalAtLevel *int `json:"approval_at_level" gorm:"type:int4"`
|
||||||
CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
|
ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"`
|
||||||
|
CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,9 @@
|
||||||
package entity
|
package entity
|
||||||
|
|
||||||
import "time"
|
import (
|
||||||
|
"github.com/google/uuid"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
type ArticleCategories struct {
|
type ArticleCategories struct {
|
||||||
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
|
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
|
||||||
|
|
@ -16,6 +19,7 @@ type ArticleCategories struct {
|
||||||
StatusId int `json:"status_id" gorm:"type:int4;default:1"`
|
StatusId int `json:"status_id" gorm:"type:int4;default:1"`
|
||||||
IsPublish *bool `json:"is_publish" gorm:"type:bool;default:false"`
|
IsPublish *bool `json:"is_publish" gorm:"type:bool;default:false"`
|
||||||
PublishedAt *time.Time `json:"published_at" gorm:"type:timestamp"`
|
PublishedAt *time.Time `json:"published_at" gorm:"type:timestamp"`
|
||||||
|
ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"`
|
||||||
IsActive *bool `json:"is_active" gorm:"type:bool;default:true"`
|
IsActive *bool `json:"is_active" gorm:"type:bool;default:true"`
|
||||||
CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
|
CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
|
||||||
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`
|
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,9 @@
|
||||||
package article_category_details
|
package article_category_details
|
||||||
|
|
||||||
import (
|
import (
|
||||||
entity "go-humas-be/app/database/entity"
|
"github.com/google/uuid"
|
||||||
"time"
|
"time"
|
||||||
|
entity "web-medols-be/app/database/entity"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ArticleCategoryDetails struct {
|
type ArticleCategoryDetails struct {
|
||||||
|
|
@ -10,6 +11,7 @@ type ArticleCategoryDetails struct {
|
||||||
ArticleId uint `json:"article_id" gorm:"type:int4"`
|
ArticleId uint `json:"article_id" gorm:"type:int4"`
|
||||||
CategoryId int `json:"category_id" gorm:"type:int4"`
|
CategoryId int `json:"category_id" gorm:"type:int4"`
|
||||||
Category *entity.ArticleCategories `json:"category" gorm:"foreignKey:CategoryId;references:ID"`
|
Category *entity.ArticleCategories `json:"category" gorm:"foreignKey:CategoryId;references:ID"`
|
||||||
|
ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"`
|
||||||
IsActive bool `json:"is_active" gorm:"type:bool"`
|
IsActive bool `json:"is_active" gorm:"type:bool"`
|
||||||
CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
|
CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
|
||||||
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`
|
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,9 @@
|
||||||
package entity
|
package entity
|
||||||
|
|
||||||
import "time"
|
import (
|
||||||
|
"github.com/google/uuid"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
type ArticleComments struct {
|
type ArticleComments struct {
|
||||||
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
|
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
|
||||||
|
|
@ -11,6 +14,7 @@ type ArticleComments struct {
|
||||||
IsPublic bool `json:"is_public" gorm:"type:bool;default:false"`
|
IsPublic bool `json:"is_public" gorm:"type:bool;default:false"`
|
||||||
StatusId int `json:"status_id" gorm:"type:int4;default:0"`
|
StatusId int `json:"status_id" gorm:"type:int4;default:0"`
|
||||||
ApprovedAt *time.Time `json:"approved_at" gorm:"type:timestamp"`
|
ApprovedAt *time.Time `json:"approved_at" gorm:"type:timestamp"`
|
||||||
|
ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"`
|
||||||
IsActive bool `json:"is_active" gorm:"type:bool"`
|
IsActive bool `json:"is_active" gorm:"type:bool"`
|
||||||
CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
|
CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
|
||||||
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`
|
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,9 @@
|
||||||
package entity
|
package entity
|
||||||
|
|
||||||
import "time"
|
import (
|
||||||
|
"github.com/google/uuid"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
type ArticleFiles struct {
|
type ArticleFiles struct {
|
||||||
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
|
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
|
||||||
|
|
@ -19,6 +22,7 @@ type ArticleFiles struct {
|
||||||
StatusId int `json:"status_id" gorm:"type:int4"`
|
StatusId int `json:"status_id" gorm:"type:int4"`
|
||||||
IsPublish *bool `json:"is_publish" gorm:"type:bool;default:false"`
|
IsPublish *bool `json:"is_publish" gorm:"type:bool;default:false"`
|
||||||
PublishedAt *time.Time `json:"published_at" gorm:"type:timestamp"`
|
PublishedAt *time.Time `json:"published_at" gorm:"type:timestamp"`
|
||||||
|
ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"`
|
||||||
IsActive bool `json:"is_active" gorm:"type:bool;default:true"`
|
IsActive bool `json:"is_active" gorm:"type:bool;default:true"`
|
||||||
CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
|
CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
|
||||||
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`
|
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,9 @@
|
||||||
package entity
|
package entity
|
||||||
|
|
||||||
import "time"
|
import (
|
||||||
|
"github.com/google/uuid"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
type Articles struct {
|
type Articles struct {
|
||||||
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
|
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
|
||||||
|
|
@ -29,6 +32,7 @@ type Articles struct {
|
||||||
IsDraft *bool `json:"is_draft" gorm:"type:bool;default:false"`
|
IsDraft *bool `json:"is_draft" gorm:"type:bool;default:false"`
|
||||||
DraftedAt *time.Time `json:"drafted_at" gorm:"type:timestamp"`
|
DraftedAt *time.Time `json:"drafted_at" gorm:"type:timestamp"`
|
||||||
PublishSchedule *string `json:"publish_schedule" gorm:"type:varchar"`
|
PublishSchedule *string `json:"publish_schedule" gorm:"type:varchar"`
|
||||||
|
ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"`
|
||||||
IsActive *bool `json:"is_active" gorm:"type:bool;default:true"`
|
IsActive *bool `json:"is_active" gorm:"type:bool;default:true"`
|
||||||
CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
|
CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
|
||||||
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`
|
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,9 @@
|
||||||
package entity
|
package entity
|
||||||
|
|
||||||
import "time"
|
import (
|
||||||
|
"github.com/google/uuid"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
type AuditTrails struct {
|
type AuditTrails struct {
|
||||||
ID uint `gorm:"primaryKey"`
|
ID uint `gorm:"primaryKey"`
|
||||||
|
|
@ -13,5 +16,6 @@ type AuditTrails struct {
|
||||||
RequestBody string
|
RequestBody string
|
||||||
ResponseBody string
|
ResponseBody string
|
||||||
DurationMs int64
|
DurationMs int64
|
||||||
|
ClientId *uuid.UUID
|
||||||
CreatedAt time.Time
|
CreatedAt time.Time
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
package entity
|
||||||
|
|
||||||
import "time"
|
import (
|
||||||
|
"github.com/google/uuid"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
type CsrfTokenRecords struct {
|
type CsrfTokenRecords struct {
|
||||||
ID uint `gorm:"primaryKey"`
|
ID uint `gorm:"primaryKey"`
|
||||||
Token string `gorm:"uniqueIndex;size:255"`
|
Token string `gorm:"uniqueIndex;size:255"`
|
||||||
Value []byte `gorm:"value"`
|
Value []byte `gorm:"value"`
|
||||||
ExpireAt time.Time `gorm:"index"`
|
ExpireAt time.Time `gorm:"index"`
|
||||||
|
ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"`
|
||||||
CreatedAt time.Time
|
CreatedAt time.Time
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,18 @@
|
||||||
package entity
|
package entity
|
||||||
|
|
||||||
import "time"
|
import (
|
||||||
|
"github.com/google/uuid"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
type CustomStaticPages struct {
|
type CustomStaticPages struct {
|
||||||
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
|
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
|
||||||
Title string `json:"title" gorm:"type:varchar"`
|
Title string `json:"title" gorm:"type:varchar"`
|
||||||
Description string `json:"description" gorm:"type:varchar"`
|
Description string `json:"description" gorm:"type:varchar"`
|
||||||
Slug string `json:"slug" gorm:"type:varchar"`
|
Slug string `json:"slug" gorm:"type:varchar"`
|
||||||
HtmlBody string `json:"html_body" gorm:"type:text"`
|
HtmlBody string `json:"html_body" gorm:"type:text"`
|
||||||
IsActive bool `json:"is_active" gorm:"type:bool"`
|
IsActive bool `json:"is_active" gorm:"type:bool"`
|
||||||
CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
|
ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"`
|
||||||
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`
|
CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
|
||||||
|
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,9 @@
|
||||||
package entity
|
package entity
|
||||||
|
|
||||||
import "time"
|
import (
|
||||||
|
"github.com/google/uuid"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
type Feedbacks struct {
|
type Feedbacks struct {
|
||||||
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
|
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
|
||||||
|
|
@ -10,6 +13,7 @@ type Feedbacks struct {
|
||||||
StatusId int `json:"status_id" gorm:"type:int4;default:0"`
|
StatusId int `json:"status_id" gorm:"type:int4;default:0"`
|
||||||
ApprovedAt *time.Time `json:"approved_at" gorm:"type:timestamp"`
|
ApprovedAt *time.Time `json:"approved_at" gorm:"type:timestamp"`
|
||||||
ReplyMessage *string `json:"reply_message" gorm:"type:varchar"`
|
ReplyMessage *string `json:"reply_message" gorm:"type:varchar"`
|
||||||
|
ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"`
|
||||||
IsActive bool `json:"is_active" gorm:"type:bool;default:true"`
|
IsActive bool `json:"is_active" gorm:"type:bool;default:true"`
|
||||||
CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
|
CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
|
||||||
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`
|
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,16 @@
|
||||||
package entity
|
package entity
|
||||||
|
|
||||||
import "time"
|
import (
|
||||||
|
"github.com/google/uuid"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
type ForgotPasswords struct {
|
type ForgotPasswords struct {
|
||||||
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
|
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
|
||||||
KeycloakID string `json:"keycloak_id" gorm:"type:varchar"`
|
KeycloakID string `json:"keycloak_id" gorm:"type:varchar"`
|
||||||
CodeRequest string `json:"code_request" gorm:"type:varchar"`
|
CodeRequest string `json:"code_request" gorm:"type:varchar"`
|
||||||
IsActive bool `json:"is_active" gorm:"type:bool"`
|
ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"`
|
||||||
CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
|
IsActive bool `json:"is_active" gorm:"type:bool"`
|
||||||
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`
|
CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
|
||||||
|
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,9 @@
|
||||||
package entity
|
package entity
|
||||||
|
|
||||||
import "time"
|
import (
|
||||||
|
"github.com/google/uuid"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
type MagazineFiles struct {
|
type MagazineFiles struct {
|
||||||
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
|
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
|
||||||
|
|
@ -18,6 +21,7 @@ type MagazineFiles struct {
|
||||||
HeightPixel *string `json:"height_pixel" gorm:"type:varchar"`
|
HeightPixel *string `json:"height_pixel" gorm:"type:varchar"`
|
||||||
Size *string `json:"size" gorm:"type:varchar"`
|
Size *string `json:"size" gorm:"type:varchar"`
|
||||||
PublishedAt *time.Time `json:"published_at" gorm:"type:timestamp"`
|
PublishedAt *time.Time `json:"published_at" gorm:"type:timestamp"`
|
||||||
|
ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"`
|
||||||
IsActive bool `json:"is_active" gorm:"type:bool"`
|
IsActive bool `json:"is_active" gorm:"type:bool"`
|
||||||
CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
|
CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
|
||||||
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`
|
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,9 @@
|
||||||
package entity
|
package entity
|
||||||
|
|
||||||
import "time"
|
import (
|
||||||
|
"github.com/google/uuid"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
type Magazines struct {
|
type Magazines struct {
|
||||||
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
|
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
|
||||||
|
|
@ -14,6 +17,7 @@ type Magazines struct {
|
||||||
StatusId int `json:"status_id" gorm:"type:int4"`
|
StatusId int `json:"status_id" gorm:"type:int4"`
|
||||||
IsPublish *bool `json:"is_publish" gorm:"type:bool"`
|
IsPublish *bool `json:"is_publish" gorm:"type:bool"`
|
||||||
PublishedAt *time.Time `json:"published_at" gorm:"type:timestamp"`
|
PublishedAt *time.Time `json:"published_at" gorm:"type:timestamp"`
|
||||||
|
ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"`
|
||||||
IsActive bool `json:"is_active" gorm:"type:bool"`
|
IsActive bool `json:"is_active" gorm:"type:bool"`
|
||||||
CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
|
CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
|
||||||
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`
|
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`
|
||||||
|
|
|
||||||
|
|
@ -1,18 +1,22 @@
|
||||||
package entity
|
package entity
|
||||||
|
|
||||||
import "time"
|
import (
|
||||||
|
"github.com/google/uuid"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
type MasterMenus struct {
|
type MasterMenus struct {
|
||||||
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
|
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
|
||||||
Name string `json:"name" gorm:"type:varchar"`
|
Name string `json:"name" gorm:"type:varchar"`
|
||||||
Description string `json:"description" gorm:"type:varchar"`
|
Description string `json:"description" gorm:"type:varchar"`
|
||||||
ModuleId int `json:"module_id" gorm:"type:int4"`
|
ModuleId int `json:"module_id" gorm:"type:int4"`
|
||||||
ParentMenuId *int `json:"parent_menu_id" gorm:"type:int4"`
|
ParentMenuId *int `json:"parent_menu_id" gorm:"type:int4"`
|
||||||
Icon *string `json:"icon" gorm:"type:varchar"`
|
Icon *string `json:"icon" gorm:"type:varchar"`
|
||||||
Group string `json:"group" gorm:"type:varchar"`
|
Group string `json:"group" gorm:"type:varchar"`
|
||||||
Position *int `json:"position" gorm:"type:int4"`
|
Position *int `json:"position" gorm:"type:int4"`
|
||||||
StatusId int `json:"status_id" gorm:"type:int4"`
|
StatusId int `json:"status_id" gorm:"type:int4"`
|
||||||
IsActive *bool `json:"is_active" gorm:"type:bool;default:true"`
|
ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"`
|
||||||
CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
|
IsActive *bool `json:"is_active" gorm:"type:bool;default:true"`
|
||||||
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`
|
CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
|
||||||
|
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,18 @@
|
||||||
package entity
|
package entity
|
||||||
|
|
||||||
import "time"
|
import (
|
||||||
|
"github.com/google/uuid"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
type MasterModules struct {
|
type MasterModules struct {
|
||||||
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
|
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
|
||||||
Name string `json:"name" gorm:"type:varchar"`
|
Name string `json:"name" gorm:"type:varchar"`
|
||||||
Description string `json:"description" gorm:"type:varchar"`
|
Description string `json:"description" gorm:"type:varchar"`
|
||||||
PathUrl string `json:"path_url" gorm:"type:varchar"`
|
PathUrl string `json:"path_url" gorm:"type:varchar"`
|
||||||
StatusId int `json:"status_id" gorm:"type:int4"`
|
StatusId int `json:"status_id" gorm:"type:int4"`
|
||||||
IsActive *bool `json:"is_active" gorm:"type:bool;default:true"`
|
ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"`
|
||||||
CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
|
IsActive *bool `json:"is_active" gorm:"type:bool;default:true"`
|
||||||
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`
|
CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
|
||||||
|
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,18 @@
|
||||||
package entity
|
package entity
|
||||||
|
|
||||||
import "time"
|
import (
|
||||||
|
"github.com/google/uuid"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
type OneTimePasswords struct {
|
type OneTimePasswords struct {
|
||||||
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
|
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
|
||||||
Email string `json:"email" gorm:"type:varchar"`
|
Email string `json:"email" gorm:"type:varchar"`
|
||||||
Name *string `json:"name" gorm:"type:varchar"`
|
Name *string `json:"name" gorm:"type:varchar"`
|
||||||
Identity *string `json:"identity" gorm:"type:varchar"`
|
Identity *string `json:"identity" gorm:"type:varchar"`
|
||||||
OtpCode string `json:"otp_code" gorm:"type:varchar"`
|
OtpCode string `json:"otp_code" gorm:"type:varchar"`
|
||||||
ValidUntil time.Time `json:"valid_until" gorm:"default:(NOW() + INTERVAL '10 minutes')"`
|
ValidUntil time.Time `json:"valid_until" gorm:"default:(NOW() + INTERVAL '10 minutes')"`
|
||||||
IsActive bool `json:"is_active" gorm:"type:bool"`
|
ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"`
|
||||||
CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
|
IsActive bool `json:"is_active" gorm:"type:bool"`
|
||||||
|
CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,15 @@
|
||||||
package entity
|
package entity
|
||||||
|
|
||||||
import "time"
|
import (
|
||||||
|
"github.com/google/uuid"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
type Subscription struct {
|
type Subscription struct {
|
||||||
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
|
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
|
||||||
Email string `json:"email" gorm:"type:varchar"`
|
Email string `json:"email" gorm:"type:varchar"`
|
||||||
IsActive bool `json:"is_active" gorm:"type:bool;default:true"`
|
ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"`
|
||||||
CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
|
IsActive bool `json:"is_active" gorm:"type:bool;default:true"`
|
||||||
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`
|
CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
|
||||||
|
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,21 @@
|
||||||
package entity
|
package entity
|
||||||
|
|
||||||
import "time"
|
import (
|
||||||
|
"github.com/google/uuid"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
type UserLevels struct {
|
type UserLevels struct {
|
||||||
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
|
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
|
||||||
Name string `json:"name" gorm:"type:varchar"`
|
Name string `json:"name" gorm:"type:varchar"`
|
||||||
AliasName string `json:"alias_name" gorm:"type:varchar"`
|
AliasName string `json:"alias_name" gorm:"type:varchar"`
|
||||||
LevelNumber int `json:"level_number" gorm:"type:int4"`
|
LevelNumber int `json:"level_number" gorm:"type:int4"`
|
||||||
ParentLevelId *int `json:"parent_level_id" gorm:"type:int4"`
|
ParentLevelId *int `json:"parent_level_id" gorm:"type:int4"`
|
||||||
ProvinceId *int `json:"province_id" gorm:"type:int4"`
|
ProvinceId *int `json:"province_id" gorm:"type:int4"`
|
||||||
Group *string `json:"group" gorm:"type:varchar"`
|
Group *string `json:"group" gorm:"type:varchar"`
|
||||||
IsApprovalActive *bool `json:"is_approval_active" gorm:"type:bool;default:false"`
|
IsApprovalActive *bool `json:"is_approval_active" gorm:"type:bool;default:false"`
|
||||||
IsActive *bool `json:"is_active" gorm:"type:bool"`
|
ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"`
|
||||||
CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
|
IsActive *bool `json:"is_active" gorm:"type:bool"`
|
||||||
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`
|
CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
|
||||||
|
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,18 +1,22 @@
|
||||||
package entity
|
package entity
|
||||||
|
|
||||||
import "time"
|
import (
|
||||||
|
"github.com/google/uuid"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
type UserRoleAccesses struct {
|
type UserRoleAccesses struct {
|
||||||
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
|
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
|
||||||
UserRoleId uint `json:"user_role_id" gorm:"type:int4"`
|
UserRoleId uint `json:"user_role_id" gorm:"type:int4"`
|
||||||
MenuId int `json:"menu_id" gorm:"type:int4"`
|
MenuId int `json:"menu_id" gorm:"type:int4"`
|
||||||
IsViewEnabled bool `json:"is_view_enabled" gorm:"type:bool"`
|
IsViewEnabled bool `json:"is_view_enabled" gorm:"type:bool"`
|
||||||
IsInsertEnabled bool `json:"is_insert_enabled" gorm:"type:bool"`
|
IsInsertEnabled bool `json:"is_insert_enabled" gorm:"type:bool"`
|
||||||
IsUpdateEnabled bool `json:"is_update_enabled" gorm:"type:bool"`
|
IsUpdateEnabled bool `json:"is_update_enabled" gorm:"type:bool"`
|
||||||
IsDeleteEnabled bool `json:"is_delete_enabled" gorm:"type:bool"`
|
IsDeleteEnabled bool `json:"is_delete_enabled" gorm:"type:bool"`
|
||||||
IsApprovalEnabled bool `json:"is_approval_enabled" gorm:"type:bool"`
|
IsApprovalEnabled bool `json:"is_approval_enabled" gorm:"type:bool"`
|
||||||
IsAdminEnabled bool `json:"is_admin_enabled" gorm:"type:bool"`
|
IsAdminEnabled bool `json:"is_admin_enabled" gorm:"type:bool"`
|
||||||
IsActive *bool `json:"is_active" gorm:"type:bool;default:true"`
|
IsActive *bool `json:"is_active" gorm:"type:bool;default:true"`
|
||||||
CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
|
ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"`
|
||||||
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`
|
CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
|
||||||
|
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,16 @@
|
||||||
package entity
|
package entity
|
||||||
|
|
||||||
import "time"
|
import (
|
||||||
|
"github.com/google/uuid"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
type UserRoleLevelDetails struct {
|
type UserRoleLevelDetails struct {
|
||||||
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
|
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
|
||||||
UserRoleId uint `json:"user_role_id" gorm:"type:int4"`
|
UserRoleId uint `json:"user_role_id" gorm:"type:int4"`
|
||||||
UserLevelId uint `json:"user_level_id" gorm:"type:int4"`
|
UserLevelId uint `json:"user_level_id" gorm:"type:int4"`
|
||||||
IsActive *bool `json:"is_active" gorm:"type:bool;default:true"`
|
ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"`
|
||||||
CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
|
IsActive *bool `json:"is_active" gorm:"type:bool;default:true"`
|
||||||
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`
|
CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
|
||||||
|
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,20 @@
|
||||||
package entity
|
package entity
|
||||||
|
|
||||||
import "time"
|
import (
|
||||||
|
"github.com/google/uuid"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
type UserRoles struct {
|
type UserRoles struct {
|
||||||
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
|
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
|
||||||
Name string `json:"name" gorm:"type:varchar"`
|
Name string `json:"name" gorm:"type:varchar"`
|
||||||
Description string `json:"description" gorm:"type:varchar"`
|
Description string `json:"description" gorm:"type:varchar"`
|
||||||
Code string `json:"code" gorm:"type:varchar"`
|
Code string `json:"code" gorm:"type:varchar"`
|
||||||
StatusId int `json:"status_id" gorm:"type:int4;default:1"`
|
StatusId int `json:"status_id" gorm:"type:int4;default:1"`
|
||||||
CreatedById *uint `json:"created_by_id" gorm:"type:int4"`
|
CreatedById *uint `json:"created_by_id" gorm:"type:int4"`
|
||||||
UserLevelId uint `json:"user_level_id" gorm:"type:int4"`
|
UserLevelId uint `json:"user_level_id" gorm:"type:int4"`
|
||||||
IsActive *bool `json:"is_active" gorm:"type:bool;default:true"`
|
ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"`
|
||||||
CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
|
IsActive *bool `json:"is_active" gorm:"type:bool;default:true"`
|
||||||
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`
|
CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
|
||||||
|
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,9 @@
|
||||||
package users
|
package users
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"go-humas-be/app/database/entity"
|
"github.com/google/uuid"
|
||||||
"time"
|
"time"
|
||||||
|
"web-medols-be/app/database/entity"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Users struct {
|
type Users struct {
|
||||||
|
|
@ -29,6 +30,7 @@ type Users struct {
|
||||||
ProfilePicturePath *string `json:"profile_picture_path" gorm:"type:varchar"`
|
ProfilePicturePath *string `json:"profile_picture_path" gorm:"type:varchar"`
|
||||||
TempPassword *string `json:"temp_password" gorm:"type:varchar"`
|
TempPassword *string `json:"temp_password" gorm:"type:varchar"`
|
||||||
IsEmailUpdated *bool `json:"is_email_updated" gorm:"type:bool;default:false"`
|
IsEmailUpdated *bool `json:"is_email_updated" gorm:"type:bool;default:false"`
|
||||||
|
ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"`
|
||||||
IsActive *bool `json:"is_active" gorm:"type:bool;default:true"`
|
IsActive *bool `json:"is_active" gorm:"type:bool;default:true"`
|
||||||
CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
|
CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
|
||||||
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`
|
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`
|
||||||
|
|
|
||||||
|
|
@ -2,13 +2,13 @@ package database
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
"go-humas-be/app/database/entity"
|
|
||||||
"go-humas-be/app/database/entity/article_category_details"
|
|
||||||
"go-humas-be/app/database/entity/users"
|
|
||||||
"go-humas-be/config/config"
|
|
||||||
"gorm.io/driver/postgres"
|
"gorm.io/driver/postgres"
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
"gorm.io/gorm/logger"
|
"gorm.io/gorm/logger"
|
||||||
|
"web-medols-be/app/database/entity"
|
||||||
|
"web-medols-be/app/database/entity/article_category_details"
|
||||||
|
"web-medols-be/app/database/entity/users"
|
||||||
|
"web-medols-be/config/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Database setup database with gorm
|
// Database setup database with gorm
|
||||||
|
|
@ -95,6 +95,7 @@ func Models() []interface{} {
|
||||||
entity.ArticleNulisAI{},
|
entity.ArticleNulisAI{},
|
||||||
entity.AuditTrails{},
|
entity.AuditTrails{},
|
||||||
entity.Cities{},
|
entity.Cities{},
|
||||||
|
entity.Clients{},
|
||||||
entity.CsrfTokenRecords{},
|
entity.CsrfTokenRecords{},
|
||||||
entity.CustomStaticPages{},
|
entity.CustomStaticPages{},
|
||||||
entity.Districts{},
|
entity.Districts{},
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
package seeds
|
package seeds
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"go-humas-be/app/database/entity"
|
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
|
"web-medols-be/app/database/entity"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ActivityLogsSeeder struct{}
|
type ActivityLogsSeeder struct{}
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
package seeds
|
package seeds
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"go-humas-be/app/database/entity"
|
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
|
"web-medols-be/app/database/entity"
|
||||||
)
|
)
|
||||||
|
|
||||||
type MasterApprovalStatusesSeeder struct{}
|
type MasterApprovalStatusesSeeder struct{}
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
package seeds
|
package seeds
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"go-humas-be/app/database/entity"
|
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
|
"web-medols-be/app/database/entity"
|
||||||
)
|
)
|
||||||
|
|
||||||
type MasterStatusesSeeder struct{}
|
type MasterStatusesSeeder struct{}
|
||||||
|
|
|
||||||
|
|
@ -3,12 +3,12 @@ package middleware
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
"go-humas-be/app/database/entity"
|
|
||||||
utilSvc "go-humas-be/utils/service"
|
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
"log"
|
"log"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
"web-medols-be/app/database/entity"
|
||||||
|
utilSvc "web-medols-be/utils/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
func AuditTrailsMiddleware(db *gorm.DB) fiber.Handler {
|
func AuditTrailsMiddleware(db *gorm.DB) fiber.Handler {
|
||||||
|
|
|
||||||
|
|
@ -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 (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"go-humas-be/app/database/entity"
|
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
"time"
|
"time"
|
||||||
|
"web-medols-be/app/database/entity"
|
||||||
)
|
)
|
||||||
|
|
||||||
type PostgresStorage struct {
|
type PostgresStorage struct {
|
||||||
|
|
|
||||||
|
|
@ -3,11 +3,11 @@ package middleware
|
||||||
import (
|
import (
|
||||||
"github.com/gofiber/fiber/v2/middleware/csrf"
|
"github.com/gofiber/fiber/v2/middleware/csrf"
|
||||||
"github.com/gofiber/fiber/v2/middleware/session"
|
"github.com/gofiber/fiber/v2/middleware/session"
|
||||||
"go-humas-be/app/database"
|
|
||||||
"go-humas-be/config/config"
|
|
||||||
utilsSvc "go-humas-be/utils"
|
|
||||||
"log"
|
"log"
|
||||||
"time"
|
"time"
|
||||||
|
"web-medols-be/app/database"
|
||||||
|
"web-medols-be/config/config"
|
||||||
|
utilsSvc "web-medols-be/utils"
|
||||||
|
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
"github.com/gofiber/fiber/v2/middleware/compress"
|
"github.com/gofiber/fiber/v2/middleware/compress"
|
||||||
|
|
@ -59,7 +59,7 @@ func (m *Middleware) Register(db *database.Database) {
|
||||||
Next: utilsSvc.IsEnabled(m.Cfg.Middleware.Cors.Enable),
|
Next: utilsSvc.IsEnabled(m.Cfg.Middleware.Cors.Enable),
|
||||||
AllowOrigins: "http://localhost:3000, http://localhost:4000, https://kontenhumas.com, https://mediapool.id, https://polrinews-project.vercel.app, http://127.0.0.1:3000, http://10.200.202.141",
|
AllowOrigins: "http://localhost:3000, http://localhost:4000, https://kontenhumas.com, https://mediapool.id, https://polrinews-project.vercel.app, http://127.0.0.1:3000, http://10.200.202.141",
|
||||||
AllowMethods: "HEAD, GET, POST, PUT, DELETE, OPTION, PATCH",
|
AllowMethods: "HEAD, GET, POST, PUT, DELETE, OPTION, PATCH",
|
||||||
AllowHeaders: "Origin, Content-Type, Accept, Accept-Language, Authorization, X-Requested-With, Access-Control-Request-Method, Access-Control-Request-Headers, Access-Control-Allow-Origin, Access-Control-Allow-Credentials, X-Csrf-Token, Cookie, Set-Cookie",
|
AllowHeaders: "Origin, Content-Type, Accept, Accept-Language, Authorization, X-Requested-With, Access-Control-Request-Method, Access-Control-Request-Headers, Access-Control-Allow-Origin, Access-Control-Allow-Credentials, X-Csrf-Token, Cookie, Set-Cookie, X-Client-Key",
|
||||||
ExposeHeaders: "Content-Length, Content-Type",
|
ExposeHeaders: "Content-Length, Content-Type",
|
||||||
AllowCredentials: true,
|
AllowCredentials: true,
|
||||||
MaxAge: 12,
|
MaxAge: 12,
|
||||||
|
|
@ -125,6 +125,9 @@ func (m *Middleware) Register(db *database.Database) {
|
||||||
|
|
||||||
//===============================
|
//===============================
|
||||||
|
|
||||||
|
// Client middleware - must be applied before other business logic
|
||||||
|
m.App.Use(ClientMiddleware(db.DB))
|
||||||
|
|
||||||
m.App.Use(AuditTrailsMiddleware(db.DB))
|
m.App.Use(AuditTrailsMiddleware(db.DB))
|
||||||
StartAuditTrailCleanup(db.DB, m.Cfg.Middleware.AuditTrails.Retention)
|
StartAuditTrailCleanup(db.DB, m.Cfg.Middleware.AuditTrails.Retention)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,10 +2,10 @@ package activity_logs
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
"go-humas-be/app/module/activity_logs/controller"
|
|
||||||
"go-humas-be/app/module/activity_logs/repository"
|
|
||||||
"go-humas-be/app/module/activity_logs/service"
|
|
||||||
"go.uber.org/fx"
|
"go.uber.org/fx"
|
||||||
|
"web-medols-be/app/module/activity_logs/controller"
|
||||||
|
"web-medols-be/app/module/activity_logs/repository"
|
||||||
|
"web-medols-be/app/module/activity_logs/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
// struct of ActivityLogsRouter
|
// struct of ActivityLogsRouter
|
||||||
|
|
|
||||||
|
|
@ -3,13 +3,14 @@ package controller
|
||||||
import (
|
import (
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
"go-humas-be/app/module/activity_logs/request"
|
|
||||||
"go-humas-be/app/module/activity_logs/service"
|
|
||||||
"go-humas-be/utils/paginator"
|
|
||||||
utilRes "go-humas-be/utils/response"
|
|
||||||
utilVal "go-humas-be/utils/validator"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
"web-medols-be/app/middleware"
|
||||||
|
"web-medols-be/app/module/activity_logs/request"
|
||||||
|
"web-medols-be/app/module/activity_logs/service"
|
||||||
|
"web-medols-be/utils/paginator"
|
||||||
|
utilRes "web-medols-be/utils/response"
|
||||||
|
utilVal "web-medols-be/utils/validator"
|
||||||
)
|
)
|
||||||
|
|
||||||
type activityLogsController struct {
|
type activityLogsController struct {
|
||||||
|
|
@ -51,6 +52,8 @@ func (_i *activityLogsController) All(c *fiber.Ctx) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
clientId := middleware.GetClientID(c)
|
||||||
|
|
||||||
reqContext := request.ActivityLogsQueryRequestContext{
|
reqContext := request.ActivityLogsQueryRequestContext{
|
||||||
ActivityTypeId: c.Query("activityTypeId"),
|
ActivityTypeId: c.Query("activityTypeId"),
|
||||||
Url: c.Query("url"),
|
Url: c.Query("url"),
|
||||||
|
|
@ -60,7 +63,7 @@ func (_i *activityLogsController) All(c *fiber.Ctx) error {
|
||||||
req := reqContext.ToParamRequest()
|
req := reqContext.ToParamRequest()
|
||||||
req.Pagination = paginate
|
req.Pagination = paginate
|
||||||
|
|
||||||
activityLogsData, paging, err := _i.activityLogsService.All(req)
|
activityLogsData, paging, err := _i.activityLogsService.All(clientId, req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -90,7 +93,9 @@ func (_i *activityLogsController) Show(c *fiber.Ctx) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
activityLogsData, err := _i.activityLogsService.Show(uint(id))
|
clientId := middleware.GetClientID(c)
|
||||||
|
|
||||||
|
activityLogsData, err := _i.activityLogsService.Show(clientId, uint(id))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -121,6 +126,8 @@ func (_i *activityLogsController) Save(c *fiber.Ctx) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
clientId := middleware.GetClientID(c)
|
||||||
|
|
||||||
var authToken *string
|
var authToken *string
|
||||||
getTokenFromHeader := c.Get("Authorization")
|
getTokenFromHeader := c.Get("Authorization")
|
||||||
if getTokenFromHeader == "" {
|
if getTokenFromHeader == "" {
|
||||||
|
|
@ -130,7 +137,7 @@ func (_i *activityLogsController) Save(c *fiber.Ctx) error {
|
||||||
}
|
}
|
||||||
visitorIp := GetVisitorIP(c)
|
visitorIp := GetVisitorIP(c)
|
||||||
req.VisitorIp = &visitorIp
|
req.VisitorIp = &visitorIp
|
||||||
dataResult, err := _i.activityLogsService.Save(*req, authToken)
|
dataResult, err := _i.activityLogsService.Save(clientId, *req, authToken)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -166,7 +173,9 @@ func (_i *activityLogsController) Update(c *fiber.Ctx) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = _i.activityLogsService.Update(uint(id), *req)
|
clientId := middleware.GetClientID(c)
|
||||||
|
|
||||||
|
err = _i.activityLogsService.Update(clientId, uint(id), *req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -195,7 +204,9 @@ func (_i *activityLogsController) Delete(c *fiber.Ctx) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = _i.activityLogsService.Delete(uint(id))
|
clientId := middleware.GetClientID(c)
|
||||||
|
|
||||||
|
err = _i.activityLogsService.Delete(clientId, uint(id))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -218,7 +229,10 @@ func (_i *activityLogsController) Delete(c *fiber.Ctx) error {
|
||||||
// @Router /activity-logs/statistics [get]
|
// @Router /activity-logs/statistics [get]
|
||||||
func (_i *activityLogsController) GetActivityStats(c *fiber.Ctx) error {
|
func (_i *activityLogsController) GetActivityStats(c *fiber.Ctx) error {
|
||||||
_i.Log.Info().Interface("GetActivityStats", "checker controller").Msg("")
|
_i.Log.Info().Interface("GetActivityStats", "checker controller").Msg("")
|
||||||
activityStatsData, err := _i.activityLogsService.GetActivityStats()
|
|
||||||
|
clientId := middleware.GetClientID(c)
|
||||||
|
|
||||||
|
activityStatsData, err := _i.activityLogsService.GetActivityStats(clientId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ package controller
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
"go-humas-be/app/module/activity_logs/service"
|
"web-medols-be/app/module/activity_logs/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Controller struct {
|
type Controller struct {
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
package mapper
|
package mapper
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"go-humas-be/app/database/entity"
|
"web-medols-be/app/database/entity"
|
||||||
res "go-humas-be/app/module/activity_logs/response"
|
res "web-medols-be/app/module/activity_logs/response"
|
||||||
)
|
)
|
||||||
|
|
||||||
func ActivityLogsResponseMapper(activityLogsReq *entity.ActivityLogs) (activityLogsRes *res.ActivityLogsResponse) {
|
func ActivityLogsResponseMapper(activityLogsReq *entity.ActivityLogs) (activityLogsRes *res.ActivityLogsResponse) {
|
||||||
|
|
|
||||||
|
|
@ -2,13 +2,14 @@ package repository
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/google/uuid"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
"go-humas-be/app/database"
|
|
||||||
"go-humas-be/app/database/entity"
|
|
||||||
"go-humas-be/app/module/activity_logs/request"
|
|
||||||
"go-humas-be/utils/paginator"
|
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
"web-medols-be/app/database"
|
||||||
|
"web-medols-be/app/database/entity"
|
||||||
|
"web-medols-be/app/module/activity_logs/request"
|
||||||
|
"web-medols-be/utils/paginator"
|
||||||
)
|
)
|
||||||
|
|
||||||
type activityLogsRepository struct {
|
type activityLogsRepository struct {
|
||||||
|
|
@ -18,14 +19,14 @@ type activityLogsRepository struct {
|
||||||
|
|
||||||
// ActivityLogsRepository define interface of IActivityLogsRepository
|
// ActivityLogsRepository define interface of IActivityLogsRepository
|
||||||
type ActivityLogsRepository interface {
|
type ActivityLogsRepository interface {
|
||||||
GetAll(req request.ActivityLogsQueryRequest) (activityLogss []*entity.ActivityLogs, paging paginator.Pagination, err error)
|
GetAll(clientId *uuid.UUID, req request.ActivityLogsQueryRequest) (activityLogss []*entity.ActivityLogs, paging paginator.Pagination, err error)
|
||||||
FindOne(id uint) (activityLogs *entity.ActivityLogs, err error)
|
FindOne(clientId *uuid.UUID, id uint) (activityLogs *entity.ActivityLogs, err error)
|
||||||
Create(activityLogs *entity.ActivityLogs) (activityLogsReturn *entity.ActivityLogs, err error)
|
Create(activityLogs *entity.ActivityLogs) (activityLogsReturn *entity.ActivityLogs, err error)
|
||||||
Update(id uint, activityLogs *entity.ActivityLogs) (err error)
|
Update(clientId *uuid.UUID, id uint, activityLogs *entity.ActivityLogs) (err error)
|
||||||
Delete(id uint) (err error)
|
Delete(clientId *uuid.UUID, id uint) (err error)
|
||||||
CountUniqueVisitorAllTime() (count int64, err error)
|
CountUniqueVisitorAllTime(clientId *uuid.UUID) (count int64, err error)
|
||||||
CountUniqueVisitorToday() (count int64, err error)
|
CountUniqueVisitorToday(clientId *uuid.UUID) (count int64, err error)
|
||||||
CountTotalViewAllTime() (count int64, err error)
|
CountTotalViewAllTime(clientId *uuid.UUID) (count int64, err error)
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewActivityLogsRepository(db *database.Database, logger zerolog.Logger) ActivityLogsRepository {
|
func NewActivityLogsRepository(db *database.Database, logger zerolog.Logger) ActivityLogsRepository {
|
||||||
|
|
@ -36,11 +37,16 @@ func NewActivityLogsRepository(db *database.Database, logger zerolog.Logger) Act
|
||||||
}
|
}
|
||||||
|
|
||||||
// implement interface of IActivityLogsRepository
|
// implement interface of IActivityLogsRepository
|
||||||
func (_i *activityLogsRepository) GetAll(req request.ActivityLogsQueryRequest) (activityLogss []*entity.ActivityLogs, paging paginator.Pagination, err error) {
|
func (_i *activityLogsRepository) GetAll(clientId *uuid.UUID, req request.ActivityLogsQueryRequest) (activityLogss []*entity.ActivityLogs, paging paginator.Pagination, err error) {
|
||||||
var count int64
|
var count int64
|
||||||
|
|
||||||
query := _i.DB.DB.Model(&entity.ActivityLogs{})
|
query := _i.DB.DB.Model(&entity.ActivityLogs{})
|
||||||
|
|
||||||
|
// Add ClientId filter
|
||||||
|
if clientId != nil {
|
||||||
|
query = query.Where("client_id = ?", clientId)
|
||||||
|
}
|
||||||
|
|
||||||
if req.ActivityTypeId != nil {
|
if req.ActivityTypeId != nil {
|
||||||
query = query.Where("activity_type_id = ?", req.ActivityTypeId)
|
query = query.Where("activity_type_id = ?", req.ActivityTypeId)
|
||||||
}
|
}
|
||||||
|
|
@ -77,8 +83,15 @@ func (_i *activityLogsRepository) GetAll(req request.ActivityLogsQueryRequest) (
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *activityLogsRepository) FindOne(id uint) (activityLogs *entity.ActivityLogs, err error) {
|
func (_i *activityLogsRepository) FindOne(clientId *uuid.UUID, id uint) (activityLogs *entity.ActivityLogs, err error) {
|
||||||
if err := _i.DB.DB.First(&activityLogs, id).Error; err != nil {
|
query := _i.DB.DB.Where("id = ?", id)
|
||||||
|
|
||||||
|
// Add ClientId filter
|
||||||
|
if clientId != nil {
|
||||||
|
query = query.Where("client_id = ?", clientId)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := query.First(&activityLogs).Error; err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -90,43 +103,47 @@ func (_i *activityLogsRepository) Create(activityLogs *entity.ActivityLogs) (act
|
||||||
return activityLogs, result.Error
|
return activityLogs, result.Error
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *activityLogsRepository) Update(id uint, activityLogs *entity.ActivityLogs) (err error) {
|
func (_i *activityLogsRepository) Update(clientId *uuid.UUID, id uint, activityLogs *entity.ActivityLogs) (err error) {
|
||||||
return _i.DB.DB.Model(&entity.ActivityLogs{}).
|
query := _i.DB.DB.Model(&entity.ActivityLogs{}).Where(&entity.ActivityLogs{ID: id})
|
||||||
Where(&entity.ActivityLogs{ID: id}).
|
if clientId != nil {
|
||||||
Updates(activityLogs).Error
|
query = query.Where("client_id = ?", clientId)
|
||||||
|
}
|
||||||
|
return query.Updates(activityLogs).Error
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *activityLogsRepository) Delete(id uint) error {
|
func (_i *activityLogsRepository) Delete(clientId *uuid.UUID, id uint) error {
|
||||||
return _i.DB.DB.Delete(&entity.ActivityLogs{}, id).Error
|
query := _i.DB.DB.Model(&entity.ActivityLogs{}).Where("id = ?", id)
|
||||||
|
if clientId != nil {
|
||||||
|
query = query.Where("client_id = ?", clientId)
|
||||||
|
}
|
||||||
|
return query.Delete(&entity.ActivityLogs{}).Error
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *activityLogsRepository) CountUniqueVisitorAllTime() (count int64, err error) {
|
func (_i *activityLogsRepository) CountUniqueVisitorAllTime(clientId *uuid.UUID) (count int64, err error) {
|
||||||
err = _i.DB.DB.
|
query := _i.DB.DB.Model(&entity.ActivityLogs{})
|
||||||
Model(&entity.ActivityLogs{}).
|
if clientId != nil {
|
||||||
Distinct("visitor_ip").
|
query = query.Where("client_id = ?", clientId)
|
||||||
Count(&count).Error
|
}
|
||||||
|
err = query.Distinct("visitor_ip").Count(&count).Error
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *activityLogsRepository) CountTotalViewAllTime() (count int64, err error) {
|
func (_i *activityLogsRepository) CountTotalViewAllTime(clientId *uuid.UUID) (count int64, err error) {
|
||||||
err = _i.DB.DB.
|
query := _i.DB.DB.Model(&entity.ActivityLogs{}).Where("activity_type_id = ?", 2)
|
||||||
Model(&entity.ActivityLogs{}).
|
if clientId != nil {
|
||||||
Where("activity_type_id = ?", 2).
|
query = query.Where("client_id = ?", clientId)
|
||||||
Count(&count).Error
|
}
|
||||||
|
err = query.Count(&count).Error
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *activityLogsRepository) CountUniqueVisitorToday() (count int64, err error) {
|
func (_i *activityLogsRepository) CountUniqueVisitorToday(clientId *uuid.UUID) (count int64, err error) {
|
||||||
tenMinutesAgo := time.Now().Add(-10 * time.Minute)
|
tenMinutesAgo := time.Now().Add(-10 * time.Minute)
|
||||||
|
|
||||||
err = _i.DB.DB.
|
query := _i.DB.DB.Model(&entity.AuditTrails{}).Where("created_at >= ?", tenMinutesAgo)
|
||||||
Model(&entity.AuditTrails{}).
|
if clientId != nil {
|
||||||
Where("created_at >= ?", tenMinutesAgo).
|
query = query.Where("client_id = ?", clientId)
|
||||||
Select("ip").
|
}
|
||||||
Group("ip").
|
err = query.Select("ip").Group("ip").Count(&count).Error
|
||||||
Count(&count).Error
|
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
package request
|
package request
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"go-humas-be/app/database/entity"
|
|
||||||
"go-humas-be/utils/paginator"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
|
"web-medols-be/app/database/entity"
|
||||||
|
"web-medols-be/utils/paginator"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ActivityLogsGeneric interface {
|
type ActivityLogsGeneric interface {
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,17 @@
|
||||||
package service
|
package service
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/google/uuid"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
"go-humas-be/app/database/entity"
|
"web-medols-be/app/database/entity"
|
||||||
"go-humas-be/app/module/activity_logs/mapper"
|
"web-medols-be/app/module/activity_logs/mapper"
|
||||||
"go-humas-be/app/module/activity_logs/repository"
|
"web-medols-be/app/module/activity_logs/repository"
|
||||||
"go-humas-be/app/module/activity_logs/request"
|
"web-medols-be/app/module/activity_logs/request"
|
||||||
"go-humas-be/app/module/activity_logs/response"
|
"web-medols-be/app/module/activity_logs/response"
|
||||||
"go-humas-be/app/module/articles/service"
|
"web-medols-be/app/module/articles/service"
|
||||||
usersRepository "go-humas-be/app/module/users/repository"
|
usersRepository "web-medols-be/app/module/users/repository"
|
||||||
"go-humas-be/utils/paginator"
|
"web-medols-be/utils/paginator"
|
||||||
utilSvc "go-humas-be/utils/service"
|
utilSvc "web-medols-be/utils/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ActivityLogsService
|
// ActivityLogsService
|
||||||
|
|
@ -23,12 +24,12 @@ type activityLogsService struct {
|
||||||
|
|
||||||
// ActivityLogsService define interface of IActivityLogsService
|
// ActivityLogsService define interface of IActivityLogsService
|
||||||
type ActivityLogsService interface {
|
type ActivityLogsService interface {
|
||||||
All(req request.ActivityLogsQueryRequest) (activityLogs []*response.ActivityLogsResponse, paging paginator.Pagination, err error)
|
All(clientId *uuid.UUID, req request.ActivityLogsQueryRequest) (activityLogs []*response.ActivityLogsResponse, paging paginator.Pagination, err error)
|
||||||
Show(id uint) (activityLogs *response.ActivityLogsResponse, err error)
|
Show(clientId *uuid.UUID, id uint) (activityLogs *response.ActivityLogsResponse, err error)
|
||||||
Save(req request.ActivityLogsCreateRequest, authToken *string) (activityLogs *entity.ActivityLogs, err error)
|
Save(clientId *uuid.UUID, req request.ActivityLogsCreateRequest, authToken *string) (activityLogs *entity.ActivityLogs, err error)
|
||||||
Update(id uint, req request.ActivityLogsUpdateRequest) (err error)
|
Update(clientId *uuid.UUID, id uint, req request.ActivityLogsUpdateRequest) (err error)
|
||||||
Delete(id uint) error
|
Delete(clientId *uuid.UUID, id uint) error
|
||||||
GetActivityStats() (activityStats *response.ActivityStatsResponse, err error)
|
GetActivityStats(clientId *uuid.UUID) (activityStats *response.ActivityStatsResponse, err error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewActivityLogsService init ActivityLogsService
|
// NewActivityLogsService init ActivityLogsService
|
||||||
|
|
@ -43,8 +44,8 @@ func NewActivityLogsService(repo repository.ActivityLogsRepository, log zerolog.
|
||||||
}
|
}
|
||||||
|
|
||||||
// All implement interface of ActivityLogsService
|
// All implement interface of ActivityLogsService
|
||||||
func (_i *activityLogsService) All(req request.ActivityLogsQueryRequest) (activityLogss []*response.ActivityLogsResponse, paging paginator.Pagination, err error) {
|
func (_i *activityLogsService) All(clientId *uuid.UUID, req request.ActivityLogsQueryRequest) (activityLogss []*response.ActivityLogsResponse, paging paginator.Pagination, err error) {
|
||||||
results, paging, err := _i.Repo.GetAll(req)
|
results, paging, err := _i.Repo.GetAll(clientId, req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
@ -56,8 +57,8 @@ func (_i *activityLogsService) All(req request.ActivityLogsQueryRequest) (activi
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *activityLogsService) Show(id uint) (activityLogs *response.ActivityLogsResponse, err error) {
|
func (_i *activityLogsService) Show(clientId *uuid.UUID, id uint) (activityLogs *response.ActivityLogsResponse, err error) {
|
||||||
result, err := _i.Repo.FindOne(id)
|
result, err := _i.Repo.FindOne(clientId, id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
@ -65,11 +66,15 @@ func (_i *activityLogsService) Show(id uint) (activityLogs *response.ActivityLog
|
||||||
return mapper.ActivityLogsResponseMapper(result), nil
|
return mapper.ActivityLogsResponseMapper(result), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *activityLogsService) Save(req request.ActivityLogsCreateRequest, authToken *string) (activityLogs *entity.ActivityLogs, err error) {
|
func (_i *activityLogsService) Save(clientId *uuid.UUID, req request.ActivityLogsCreateRequest, authToken *string) (activityLogs *entity.ActivityLogs, err error) {
|
||||||
_i.Log.Info().Interface("data", req).Msg("")
|
_i.Log.Info().Interface("data", req).Msg("")
|
||||||
|
|
||||||
newReq := req.ToEntity()
|
newReq := req.ToEntity()
|
||||||
|
|
||||||
|
if clientId != nil {
|
||||||
|
newReq.ClientId = clientId
|
||||||
|
}
|
||||||
|
|
||||||
if authToken != nil {
|
if authToken != nil {
|
||||||
createdBy := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, *authToken)
|
createdBy := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, *authToken)
|
||||||
newReq.UserId = &createdBy.ID
|
newReq.UserId = &createdBy.ID
|
||||||
|
|
@ -81,7 +86,7 @@ func (_i *activityLogsService) Save(req request.ActivityLogsCreateRequest, authT
|
||||||
}
|
}
|
||||||
|
|
||||||
// update article
|
// update article
|
||||||
err = _i.ArticleService.UpdateActivityCount(*req.ArticleId, req.ActivityTypeId)
|
err = _i.ArticleService.UpdateActivityCount(clientId, *req.ArticleId, req.ActivityTypeId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
@ -89,26 +94,30 @@ func (_i *activityLogsService) Save(req request.ActivityLogsCreateRequest, authT
|
||||||
return result, nil
|
return result, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *activityLogsService) Update(id uint, req request.ActivityLogsUpdateRequest) (err error) {
|
func (_i *activityLogsService) Update(clientId *uuid.UUID, id uint, req request.ActivityLogsUpdateRequest) (err error) {
|
||||||
_i.Log.Info().Interface("data", req).Msg("")
|
_i.Log.Info().Interface("data", req).Msg("")
|
||||||
return _i.Repo.Update(id, req.ToEntity())
|
newReq := req.ToEntity()
|
||||||
|
if clientId != nil {
|
||||||
|
newReq.ClientId = clientId
|
||||||
|
}
|
||||||
|
return _i.Repo.Update(clientId, id, newReq)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *activityLogsService) Delete(id uint) error {
|
func (_i *activityLogsService) Delete(clientId *uuid.UUID, id uint) error {
|
||||||
return _i.Repo.Delete(id)
|
return _i.Repo.Delete(clientId, id)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *activityLogsService) GetActivityStats() (activityStats *response.ActivityStatsResponse, err error) {
|
func (_i *activityLogsService) GetActivityStats(clientId *uuid.UUID) (activityStats *response.ActivityStatsResponse, err error) {
|
||||||
_i.Log.Info().Interface("GetActivityStats", "checker").Msg("")
|
_i.Log.Info().Interface("GetActivityStats", "checker").Msg("")
|
||||||
countUniqueVisitorAllTime, err := _i.Repo.CountUniqueVisitorAllTime()
|
countUniqueVisitorAllTime, err := _i.Repo.CountUniqueVisitorAllTime(clientId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
countUniqueVisitorToday, err := _i.Repo.CountUniqueVisitorToday()
|
countUniqueVisitorToday, err := _i.Repo.CountUniqueVisitorToday(clientId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
countTotalViewAllTime, err := _i.Repo.CountTotalViewAllTime()
|
countTotalViewAllTime, err := _i.Repo.CountTotalViewAllTime(clientId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,10 +2,10 @@ package advertisement
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
"go-humas-be/app/module/advertisement/controller"
|
|
||||||
"go-humas-be/app/module/advertisement/repository"
|
|
||||||
"go-humas-be/app/module/advertisement/service"
|
|
||||||
"go.uber.org/fx"
|
"go.uber.org/fx"
|
||||||
|
"web-medols-be/app/module/advertisement/controller"
|
||||||
|
"web-medols-be/app/module/advertisement/repository"
|
||||||
|
"web-medols-be/app/module/advertisement/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
// struct of AdvertisementRouter
|
// struct of AdvertisementRouter
|
||||||
|
|
|
||||||
|
|
@ -3,13 +3,14 @@ package controller
|
||||||
import (
|
import (
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
"go-humas-be/app/module/advertisement/request"
|
|
||||||
"go-humas-be/app/module/advertisement/service"
|
|
||||||
"go-humas-be/utils/paginator"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"web-medols-be/app/middleware"
|
||||||
|
"web-medols-be/app/module/advertisement/request"
|
||||||
|
"web-medols-be/app/module/advertisement/service"
|
||||||
|
"web-medols-be/utils/paginator"
|
||||||
|
|
||||||
utilRes "go-humas-be/utils/response"
|
utilRes "web-medols-be/utils/response"
|
||||||
utilVal "go-humas-be/utils/validator"
|
utilVal "web-medols-be/utils/validator"
|
||||||
)
|
)
|
||||||
|
|
||||||
type advertisementController struct {
|
type advertisementController struct {
|
||||||
|
|
@ -53,6 +54,8 @@ func (_i *advertisementController) All(c *fiber.Ctx) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
clientId := middleware.GetClientID(c)
|
||||||
|
|
||||||
reqContext := request.AdvertisementQueryRequestContext{
|
reqContext := request.AdvertisementQueryRequestContext{
|
||||||
Title: c.Query("title"),
|
Title: c.Query("title"),
|
||||||
Description: c.Query("description"),
|
Description: c.Query("description"),
|
||||||
|
|
@ -63,7 +66,7 @@ func (_i *advertisementController) All(c *fiber.Ctx) error {
|
||||||
req := reqContext.ToParamRequest()
|
req := reqContext.ToParamRequest()
|
||||||
req.Pagination = paginate
|
req.Pagination = paginate
|
||||||
|
|
||||||
advertisementData, paging, err := _i.advertisementService.All(req)
|
advertisementData, paging, err := _i.advertisementService.All(clientId, req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -93,7 +96,9 @@ func (_i *advertisementController) Show(c *fiber.Ctx) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
advertisementData, err := _i.advertisementService.Show(uint(id))
|
clientId := middleware.GetClientID(c)
|
||||||
|
|
||||||
|
advertisementData, err := _i.advertisementService.Show(clientId, uint(id))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -124,7 +129,9 @@ func (_i *advertisementController) Save(c *fiber.Ctx) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
dataResult, err := _i.advertisementService.Save(*req)
|
clientId := middleware.GetClientID(c)
|
||||||
|
|
||||||
|
dataResult, err := _i.advertisementService.Save(clientId, *req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -156,7 +163,9 @@ func (_i *advertisementController) Upload(c *fiber.Ctx) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = _i.advertisementService.Upload(c, uint(id))
|
clientId := middleware.GetClientID(c)
|
||||||
|
|
||||||
|
err = _i.advertisementService.Upload(clientId, c, uint(id))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -191,7 +200,9 @@ func (_i *advertisementController) Update(c *fiber.Ctx) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = _i.advertisementService.Update(uint(id), *req)
|
clientId := middleware.GetClientID(c)
|
||||||
|
|
||||||
|
err = _i.advertisementService.Update(clientId, uint(id), *req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -227,7 +238,9 @@ func (_i *advertisementController) UpdatePublish(c *fiber.Ctx) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = _i.advertisementService.UpdatePublish(uint(id), isPublish)
|
clientId := middleware.GetClientID(c)
|
||||||
|
|
||||||
|
err = _i.advertisementService.UpdatePublish(clientId, uint(id), isPublish)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -256,7 +269,9 @@ func (_i *advertisementController) Delete(c *fiber.Ctx) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = _i.advertisementService.Delete(uint(id))
|
clientId := middleware.GetClientID(c)
|
||||||
|
|
||||||
|
err = _i.advertisementService.Delete(clientId, uint(id))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -279,5 +294,6 @@ func (_i *advertisementController) Delete(c *fiber.Ctx) error {
|
||||||
// @Failure 500 {object} response.InternalServerError
|
// @Failure 500 {object} response.InternalServerError
|
||||||
// @Router /advertisement/viewer/{filename} [get]
|
// @Router /advertisement/viewer/{filename} [get]
|
||||||
func (_i *advertisementController) Viewer(c *fiber.Ctx) error {
|
func (_i *advertisementController) Viewer(c *fiber.Ctx) error {
|
||||||
return _i.advertisementService.Viewer(c)
|
clientId := middleware.GetClientID(c)
|
||||||
|
return _i.advertisementService.Viewer(clientId, c)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ package controller
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
"go-humas-be/app/module/advertisement/service"
|
"web-medols-be/app/module/advertisement/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Controller struct {
|
type Controller struct {
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
package mapper
|
package mapper
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"go-humas-be/app/database/entity"
|
"web-medols-be/app/database/entity"
|
||||||
res "go-humas-be/app/module/advertisement/response"
|
res "web-medols-be/app/module/advertisement/response"
|
||||||
)
|
)
|
||||||
|
|
||||||
func AdvertisementResponseMapper(advertisementReq *entity.Advertisement, host string) (advertisementRes *res.AdvertisementResponse) {
|
func AdvertisementResponseMapper(advertisementReq *entity.Advertisement, host string) (advertisementRes *res.AdvertisementResponse) {
|
||||||
|
|
|
||||||
|
|
@ -2,13 +2,14 @@ package repository
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/google/uuid"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
"go-humas-be/app/database"
|
|
||||||
"go-humas-be/app/database/entity"
|
|
||||||
"go-humas-be/app/module/advertisement/request"
|
|
||||||
"go-humas-be/utils/paginator"
|
|
||||||
utilSvc "go-humas-be/utils/service"
|
|
||||||
"strings"
|
"strings"
|
||||||
|
"web-medols-be/app/database"
|
||||||
|
"web-medols-be/app/database/entity"
|
||||||
|
"web-medols-be/app/module/advertisement/request"
|
||||||
|
"web-medols-be/utils/paginator"
|
||||||
|
utilSvc "web-medols-be/utils/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
type advertisementRepository struct {
|
type advertisementRepository struct {
|
||||||
|
|
@ -18,12 +19,12 @@ type advertisementRepository struct {
|
||||||
|
|
||||||
// AdvertisementRepository define interface of IAdvertisementRepository
|
// AdvertisementRepository define interface of IAdvertisementRepository
|
||||||
type AdvertisementRepository interface {
|
type AdvertisementRepository interface {
|
||||||
GetAll(req request.AdvertisementQueryRequest) (advertisements []*entity.Advertisement, paging paginator.Pagination, err error)
|
GetAll(clientId *uuid.UUID, req request.AdvertisementQueryRequest) (advertisements []*entity.Advertisement, paging paginator.Pagination, err error)
|
||||||
FindOne(id uint) (advertisement *entity.Advertisement, err error)
|
FindOne(clientId *uuid.UUID, id uint) (advertisement *entity.Advertisement, err error)
|
||||||
FindByFilename(contentFilename string) (advertisement *entity.Advertisement, err error)
|
FindByFilename(clientId *uuid.UUID, contentFilename string) (advertisement *entity.Advertisement, err error)
|
||||||
Create(advertisement *entity.Advertisement) (advertisementReturn *entity.Advertisement, err error)
|
Create(advertisement *entity.Advertisement) (advertisementReturn *entity.Advertisement, err error)
|
||||||
Update(id uint, advertisement *entity.Advertisement) (err error)
|
Update(clientId *uuid.UUID, id uint, advertisement *entity.Advertisement) (err error)
|
||||||
Delete(id uint) (err error)
|
Delete(clientId *uuid.UUID, id uint) (err error)
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewAdvertisementRepository(db *database.Database, logger zerolog.Logger) AdvertisementRepository {
|
func NewAdvertisementRepository(db *database.Database, logger zerolog.Logger) AdvertisementRepository {
|
||||||
|
|
@ -34,10 +35,16 @@ func NewAdvertisementRepository(db *database.Database, logger zerolog.Logger) Ad
|
||||||
}
|
}
|
||||||
|
|
||||||
// implement interface of IAdvertisementRepository
|
// implement interface of IAdvertisementRepository
|
||||||
func (_i *advertisementRepository) GetAll(req request.AdvertisementQueryRequest) (advertisements []*entity.Advertisement, paging paginator.Pagination, err error) {
|
func (_i *advertisementRepository) GetAll(clientId *uuid.UUID, req request.AdvertisementQueryRequest) (advertisements []*entity.Advertisement, paging paginator.Pagination, err error) {
|
||||||
var count int64
|
var count int64
|
||||||
|
|
||||||
query := _i.DB.DB.Model(&entity.Advertisement{})
|
query := _i.DB.DB.Model(&entity.Advertisement{})
|
||||||
|
|
||||||
|
// Add ClientId filter
|
||||||
|
if clientId != nil {
|
||||||
|
query = query.Where("client_id = ?", clientId)
|
||||||
|
}
|
||||||
|
|
||||||
query = query.Where("is_active = ?", true)
|
query = query.Where("is_active = ?", true)
|
||||||
|
|
||||||
if req.Title != nil && *req.Title != "" {
|
if req.Title != nil && *req.Title != "" {
|
||||||
|
|
@ -82,17 +89,30 @@ func (_i *advertisementRepository) GetAll(req request.AdvertisementQueryRequest)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *advertisementRepository) FindOne(id uint) (advertisement *entity.Advertisement, err error) {
|
func (_i *advertisementRepository) FindOne(clientId *uuid.UUID, id uint) (advertisement *entity.Advertisement, err error) {
|
||||||
if err := _i.DB.DB.First(&advertisement, id).Error; err != nil {
|
query := _i.DB.DB.Where("id = ?", id)
|
||||||
|
|
||||||
|
// Add ClientId filter
|
||||||
|
if clientId != nil {
|
||||||
|
query = query.Where("client_id = ?", clientId)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := query.First(&advertisement).Error; err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return advertisement, nil
|
return advertisement, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *advertisementRepository) FindByFilename(contentFilename string) (advertisement *entity.Advertisement, err error) {
|
func (_i *advertisementRepository) FindByFilename(clientId *uuid.UUID, contentFilename string) (advertisement *entity.Advertisement, err error) {
|
||||||
|
query := _i.DB.DB.Where("content_file_name = ?", contentFilename)
|
||||||
|
|
||||||
if err := _i.DB.DB.Where("content_file_name = ?", contentFilename).First(&advertisement).Error; err != nil {
|
// Add ClientId filter
|
||||||
|
if clientId != nil {
|
||||||
|
query = query.Where("client_id = ?", clientId)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := query.First(&advertisement).Error; err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -104,16 +124,22 @@ func (_i *advertisementRepository) Create(advertisement *entity.Advertisement) (
|
||||||
return advertisement, result.Error
|
return advertisement, result.Error
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *advertisementRepository) Update(id uint, advertisement *entity.Advertisement) (err error) {
|
func (_i *advertisementRepository) Update(clientId *uuid.UUID, id uint, advertisement *entity.Advertisement) (err error) {
|
||||||
advertisementMap, err := utilSvc.StructToMap(advertisement)
|
advertisementMap, err := utilSvc.StructToMap(advertisement)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return _i.DB.DB.Model(&entity.Advertisement{}).
|
query := _i.DB.DB.Model(&entity.Advertisement{}).Where(&entity.Advertisement{ID: id})
|
||||||
Where(&entity.Advertisement{ID: id}).
|
if clientId != nil {
|
||||||
Updates(advertisementMap).Error
|
query = query.Where("client_id = ?", clientId)
|
||||||
|
}
|
||||||
|
return query.Updates(advertisementMap).Error
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *advertisementRepository) Delete(id uint) error {
|
func (_i *advertisementRepository) Delete(clientId *uuid.UUID, id uint) error {
|
||||||
return _i.DB.DB.Delete(&entity.Advertisement{}, id).Error
|
query := _i.DB.DB.Model(&entity.Advertisement{}).Where("id = ?", id)
|
||||||
|
if clientId != nil {
|
||||||
|
query = query.Where("client_id = ?", clientId)
|
||||||
|
}
|
||||||
|
return query.Delete(&entity.Advertisement{}).Error
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
package request
|
package request
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"go-humas-be/app/database/entity"
|
|
||||||
"go-humas-be/utils/paginator"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
|
"web-medols-be/app/database/entity"
|
||||||
|
"web-medols-be/utils/paginator"
|
||||||
)
|
)
|
||||||
|
|
||||||
type AdvertisementGeneric interface {
|
type AdvertisementGeneric interface {
|
||||||
|
|
|
||||||
|
|
@ -4,17 +4,9 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
|
"github.com/google/uuid"
|
||||||
"github.com/minio/minio-go/v7"
|
"github.com/minio/minio-go/v7"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
"go-humas-be/app/database/entity"
|
|
||||||
"go-humas-be/app/module/advertisement/mapper"
|
|
||||||
"go-humas-be/app/module/advertisement/repository"
|
|
||||||
"go-humas-be/app/module/advertisement/request"
|
|
||||||
"go-humas-be/app/module/advertisement/response"
|
|
||||||
usersRepository "go-humas-be/app/module/users/repository"
|
|
||||||
config "go-humas-be/config/config"
|
|
||||||
minioStorage "go-humas-be/config/config"
|
|
||||||
"go-humas-be/utils/paginator"
|
|
||||||
"io"
|
"io"
|
||||||
"log"
|
"log"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
|
|
@ -23,6 +15,15 @@ import (
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
"web-medols-be/app/database/entity"
|
||||||
|
"web-medols-be/app/module/advertisement/mapper"
|
||||||
|
"web-medols-be/app/module/advertisement/repository"
|
||||||
|
"web-medols-be/app/module/advertisement/request"
|
||||||
|
"web-medols-be/app/module/advertisement/response"
|
||||||
|
usersRepository "web-medols-be/app/module/users/repository"
|
||||||
|
config "web-medols-be/config/config"
|
||||||
|
minioStorage "web-medols-be/config/config"
|
||||||
|
"web-medols-be/utils/paginator"
|
||||||
)
|
)
|
||||||
|
|
||||||
// AdvertisementService
|
// AdvertisementService
|
||||||
|
|
@ -36,14 +37,14 @@ type advertisementService struct {
|
||||||
|
|
||||||
// AdvertisementService define interface of IAdvertisementService
|
// AdvertisementService define interface of IAdvertisementService
|
||||||
type AdvertisementService interface {
|
type AdvertisementService interface {
|
||||||
All(req request.AdvertisementQueryRequest) (advertisement []*response.AdvertisementResponse, paging paginator.Pagination, err error)
|
All(clientId *uuid.UUID, req request.AdvertisementQueryRequest) (advertisement []*response.AdvertisementResponse, paging paginator.Pagination, err error)
|
||||||
Show(id uint) (advertisement *response.AdvertisementResponse, err error)
|
Show(clientId *uuid.UUID, id uint) (advertisement *response.AdvertisementResponse, err error)
|
||||||
Save(req request.AdvertisementCreateRequest) (advertisement *entity.Advertisement, err error)
|
Save(clientId *uuid.UUID, req request.AdvertisementCreateRequest) (advertisement *entity.Advertisement, err error)
|
||||||
Upload(c *fiber.Ctx, id uint) (err error)
|
Upload(clientId *uuid.UUID, c *fiber.Ctx, id uint) (err error)
|
||||||
Update(id uint, req request.AdvertisementUpdateRequest) (err error)
|
Update(clientId *uuid.UUID, id uint, req request.AdvertisementUpdateRequest) (err error)
|
||||||
UpdatePublish(id uint, isPublish bool) (err error)
|
UpdatePublish(clientId *uuid.UUID, id uint, isPublish bool) (err error)
|
||||||
Delete(id uint) error
|
Delete(clientId *uuid.UUID, id uint) error
|
||||||
Viewer(c *fiber.Ctx) (err error)
|
Viewer(clientId *uuid.UUID, c *fiber.Ctx) (err error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewAdvertisementService init AdvertisementService
|
// NewAdvertisementService init AdvertisementService
|
||||||
|
|
@ -59,8 +60,8 @@ func NewAdvertisementService(repo repository.AdvertisementRepository, minioStora
|
||||||
}
|
}
|
||||||
|
|
||||||
// All implement interface of AdvertisementService
|
// All implement interface of AdvertisementService
|
||||||
func (_i *advertisementService) All(req request.AdvertisementQueryRequest) (advertisements []*response.AdvertisementResponse, paging paginator.Pagination, err error) {
|
func (_i *advertisementService) All(clientId *uuid.UUID, req request.AdvertisementQueryRequest) (advertisements []*response.AdvertisementResponse, paging paginator.Pagination, err error) {
|
||||||
results, paging, err := _i.Repo.GetAll(req)
|
results, paging, err := _i.Repo.GetAll(clientId, req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
@ -73,8 +74,8 @@ func (_i *advertisementService) All(req request.AdvertisementQueryRequest) (adve
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *advertisementService) Show(id uint) (advertisement *response.AdvertisementResponse, err error) {
|
func (_i *advertisementService) Show(clientId *uuid.UUID, id uint) (advertisement *response.AdvertisementResponse, err error) {
|
||||||
result, err := _i.Repo.FindOne(id)
|
result, err := _i.Repo.FindOne(clientId, id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
@ -83,13 +84,18 @@ func (_i *advertisementService) Show(id uint) (advertisement *response.Advertise
|
||||||
return mapper.AdvertisementResponseMapper(result, host), nil
|
return mapper.AdvertisementResponseMapper(result, host), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *advertisementService) Save(req request.AdvertisementCreateRequest) (advertisement *entity.Advertisement, err error) {
|
func (_i *advertisementService) Save(clientId *uuid.UUID, req request.AdvertisementCreateRequest) (advertisement *entity.Advertisement, err error) {
|
||||||
_i.Log.Info().Interface("data", req).Msg("")
|
_i.Log.Info().Interface("data", req).Msg("")
|
||||||
newReq := req.ToEntity()
|
newReq := req.ToEntity()
|
||||||
|
|
||||||
|
if clientId != nil {
|
||||||
|
newReq.ClientId = clientId
|
||||||
|
}
|
||||||
|
|
||||||
return _i.Repo.Create(newReq)
|
return _i.Repo.Create(newReq)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *advertisementService) Upload(c *fiber.Ctx, id uint) (err error) {
|
func (_i *advertisementService) Upload(clientId *uuid.UUID, c *fiber.Ctx, id uint) (err error) {
|
||||||
bucketName := _i.MinioStorage.Cfg.ObjectStorage.MinioStorage.BucketName
|
bucketName := _i.MinioStorage.Cfg.ObjectStorage.MinioStorage.BucketName
|
||||||
|
|
||||||
form, err := c.MultipartForm()
|
form, err := c.MultipartForm()
|
||||||
|
|
@ -102,7 +108,7 @@ func (_i *advertisementService) Upload(c *fiber.Ctx, id uint) (err error) {
|
||||||
// Create minio connection.
|
// Create minio connection.
|
||||||
minioClient, err := _i.MinioStorage.ConnectMinio()
|
minioClient, err := _i.MinioStorage.ConnectMinio()
|
||||||
|
|
||||||
result, err := _i.Repo.FindOne(id)
|
result, err := _i.Repo.FindOne(clientId, id)
|
||||||
|
|
||||||
if result == nil {
|
if result == nil {
|
||||||
// Return status 400. Id not found.
|
// Return status 400. Id not found.
|
||||||
|
|
@ -154,7 +160,7 @@ func (_i *advertisementService) Upload(c *fiber.Ctx, id uint) (err error) {
|
||||||
result.ContentFileName = &newFilename
|
result.ContentFileName = &newFilename
|
||||||
result.ContentFilePath = &objectName
|
result.ContentFilePath = &objectName
|
||||||
|
|
||||||
err = _i.Repo.Update(id, result)
|
err = _i.Repo.Update(clientId, id, result)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -170,12 +176,16 @@ func (_i *advertisementService) Upload(c *fiber.Ctx, id uint) (err error) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *advertisementService) Update(id uint, req request.AdvertisementUpdateRequest) (err error) {
|
func (_i *advertisementService) Update(clientId *uuid.UUID, id uint, req request.AdvertisementUpdateRequest) (err error) {
|
||||||
_i.Log.Info().Interface("data", req).Msg("")
|
_i.Log.Info().Interface("data", req).Msg("")
|
||||||
return _i.Repo.Update(id, req.ToEntity())
|
newReq := req.ToEntity()
|
||||||
|
if clientId != nil {
|
||||||
|
newReq.ClientId = clientId
|
||||||
|
}
|
||||||
|
return _i.Repo.Update(clientId, id, newReq)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *advertisementService) UpdatePublish(id uint, isPublish bool) (err error) {
|
func (_i *advertisementService) UpdatePublish(clientId *uuid.UUID, id uint, isPublish bool) (err error) {
|
||||||
_i.Log.Info().Str("timestamp", time.Now().
|
_i.Log.Info().Str("timestamp", time.Now().
|
||||||
Format(time.RFC3339)).Str("Service:Resource", "UpdatePublish").
|
Format(time.RFC3339)).Str("Service:Resource", "UpdatePublish").
|
||||||
Interface("ids", id).Msg("")
|
Interface("ids", id).Msg("")
|
||||||
|
|
@ -183,7 +193,7 @@ func (_i *advertisementService) UpdatePublish(id uint, isPublish bool) (err erro
|
||||||
Format(time.RFC3339)).Str("Service:Resource", "UpdatePublish").
|
Format(time.RFC3339)).Str("Service:Resource", "UpdatePublish").
|
||||||
Interface("isPublish", isPublish).Msg("")
|
Interface("isPublish", isPublish).Msg("")
|
||||||
|
|
||||||
result, err := _i.Repo.FindOne(id)
|
result, err := _i.Repo.FindOne(clientId, id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -194,21 +204,24 @@ func (_i *advertisementService) UpdatePublish(id uint, isPublish bool) (err erro
|
||||||
Format(time.RFC3339)).Str("Service:Resource", "UpdatePublish").
|
Format(time.RFC3339)).Str("Service:Resource", "UpdatePublish").
|
||||||
Interface("result", result).Msg("")
|
Interface("result", result).Msg("")
|
||||||
|
|
||||||
return _i.Repo.Update(id, result)
|
return _i.Repo.Update(clientId, id, result)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *advertisementService) Delete(id uint) error {
|
func (_i *advertisementService) Delete(clientId *uuid.UUID, id uint) error {
|
||||||
result, err := _i.Repo.FindOne(id)
|
result, err := _i.Repo.FindOne(clientId, id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
result.IsActive = false
|
result.IsActive = false
|
||||||
return _i.Repo.Update(id, result)
|
if clientId != nil {
|
||||||
|
result.ClientId = clientId
|
||||||
|
}
|
||||||
|
return _i.Repo.Update(clientId, id, result)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *advertisementService) Viewer(c *fiber.Ctx) (err error) {
|
func (_i *advertisementService) Viewer(clientId *uuid.UUID, c *fiber.Ctx) (err error) {
|
||||||
filename := c.Params("filename")
|
filename := c.Params("filename")
|
||||||
result, err := _i.Repo.FindByFilename(filename)
|
result, err := _i.Repo.FindByFilename(clientId, filename)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,10 +2,10 @@ package article_approvals
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
"go-humas-be/app/module/article_approvals/controller"
|
|
||||||
"go-humas-be/app/module/article_approvals/repository"
|
|
||||||
"go-humas-be/app/module/article_approvals/service"
|
|
||||||
"go.uber.org/fx"
|
"go.uber.org/fx"
|
||||||
|
"web-medols-be/app/module/article_approvals/controller"
|
||||||
|
"web-medols-be/app/module/article_approvals/repository"
|
||||||
|
"web-medols-be/app/module/article_approvals/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
// struct of ArticleApprovalsRouter
|
// struct of ArticleApprovalsRouter
|
||||||
|
|
|
||||||
|
|
@ -3,13 +3,14 @@ package controller
|
||||||
import (
|
import (
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
"go-humas-be/app/module/article_approvals/request"
|
|
||||||
"go-humas-be/app/module/article_approvals/service"
|
|
||||||
"go-humas-be/utils/paginator"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"web-medols-be/app/middleware"
|
||||||
|
"web-medols-be/app/module/article_approvals/request"
|
||||||
|
"web-medols-be/app/module/article_approvals/service"
|
||||||
|
"web-medols-be/utils/paginator"
|
||||||
|
|
||||||
utilRes "go-humas-be/utils/response"
|
utilRes "web-medols-be/utils/response"
|
||||||
utilVal "go-humas-be/utils/validator"
|
utilVal "web-medols-be/utils/validator"
|
||||||
)
|
)
|
||||||
|
|
||||||
type articleApprovalsController struct {
|
type articleApprovalsController struct {
|
||||||
|
|
@ -122,7 +123,11 @@ func (_i *articleApprovalsController) Save(c *fiber.Ctx) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
authToken := c.Get("Authorization")
|
authToken := c.Get("Authorization")
|
||||||
dataResult, err := _i.articleApprovalsService.Save(*req, authToken)
|
|
||||||
|
// Get ClientId from context
|
||||||
|
clientId := middleware.GetClientID(c)
|
||||||
|
|
||||||
|
dataResult, err := _i.articleApprovalsService.Save(clientId, *req, authToken)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ package controller
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
"go-humas-be/app/module/article_approvals/service"
|
"web-medols-be/app/module/article_approvals/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Controller struct {
|
type Controller struct {
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
package mapper
|
package mapper
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"go-humas-be/app/database/entity"
|
"web-medols-be/app/database/entity"
|
||||||
res "go-humas-be/app/module/article_approvals/response"
|
res "web-medols-be/app/module/article_approvals/response"
|
||||||
)
|
)
|
||||||
|
|
||||||
func ArticleApprovalsResponseMapper(articleApprovalsReq *entity.ArticleApprovals) (articleApprovalsRes *res.ArticleApprovalsResponse) {
|
func ArticleApprovalsResponseMapper(articleApprovalsReq *entity.ArticleApprovals) (articleApprovalsRes *res.ArticleApprovalsResponse) {
|
||||||
|
|
|
||||||
|
|
@ -3,12 +3,12 @@ package repository
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
"go-humas-be/app/database"
|
|
||||||
"go-humas-be/app/database/entity"
|
|
||||||
"go-humas-be/app/module/article_approvals/request"
|
|
||||||
"go-humas-be/utils/paginator"
|
|
||||||
utilSvc "go-humas-be/utils/service"
|
|
||||||
"strings"
|
"strings"
|
||||||
|
"web-medols-be/app/database"
|
||||||
|
"web-medols-be/app/database/entity"
|
||||||
|
"web-medols-be/app/module/article_approvals/request"
|
||||||
|
"web-medols-be/utils/paginator"
|
||||||
|
utilSvc "web-medols-be/utils/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
type articleApprovalsRepository struct {
|
type articleApprovalsRepository struct {
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
package request
|
package request
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"go-humas-be/app/database/entity"
|
|
||||||
"go-humas-be/utils/paginator"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"web-medols-be/app/database/entity"
|
||||||
|
"web-medols-be/utils/paginator"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ArticleApprovalsGeneric interface {
|
type ArticleApprovalsGeneric interface {
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,18 @@
|
||||||
package service
|
package service
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/google/uuid"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
"go-humas-be/app/database/entity"
|
"web-medols-be/app/database/entity"
|
||||||
"go-humas-be/app/module/article_approvals/mapper"
|
"web-medols-be/app/module/article_approvals/mapper"
|
||||||
"go-humas-be/app/module/article_approvals/repository"
|
"web-medols-be/app/module/article_approvals/repository"
|
||||||
"go-humas-be/app/module/article_approvals/request"
|
"web-medols-be/app/module/article_approvals/request"
|
||||||
"go-humas-be/app/module/article_approvals/response"
|
"web-medols-be/app/module/article_approvals/response"
|
||||||
articlesService "go-humas-be/app/module/articles/service"
|
articlesService "web-medols-be/app/module/articles/service"
|
||||||
usersRepository "go-humas-be/app/module/users/repository"
|
usersRepository "web-medols-be/app/module/users/repository"
|
||||||
"go-humas-be/utils/paginator"
|
"web-medols-be/utils/paginator"
|
||||||
|
|
||||||
utilSvc "go-humas-be/utils/service"
|
utilSvc "web-medols-be/utils/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ArticleApprovalsService
|
// ArticleApprovalsService
|
||||||
|
|
@ -26,7 +27,7 @@ type articleApprovalsService struct {
|
||||||
type ArticleApprovalsService interface {
|
type ArticleApprovalsService interface {
|
||||||
All(req request.ArticleApprovalsQueryRequest) (articleApprovals []*response.ArticleApprovalsResponse, paging paginator.Pagination, err error)
|
All(req request.ArticleApprovalsQueryRequest) (articleApprovals []*response.ArticleApprovalsResponse, paging paginator.Pagination, err error)
|
||||||
Show(id uint) (articleApprovals *response.ArticleApprovalsResponse, err error)
|
Show(id uint) (articleApprovals *response.ArticleApprovalsResponse, err error)
|
||||||
Save(req request.ArticleApprovalsCreateRequest, authToken string) (articleApprovals *entity.ArticleApprovals, err error)
|
Save(clientId *uuid.UUID, req request.ArticleApprovalsCreateRequest, authToken string) (articleApprovals *entity.ArticleApprovals, err error)
|
||||||
Update(id uint, req request.ArticleApprovalsUpdateRequest) (err error)
|
Update(id uint, req request.ArticleApprovalsUpdateRequest) (err error)
|
||||||
Delete(id uint) error
|
Delete(id uint) error
|
||||||
}
|
}
|
||||||
|
|
@ -65,7 +66,7 @@ func (_i *articleApprovalsService) Show(id uint) (articleApprovals *response.Art
|
||||||
return mapper.ArticleApprovalsResponseMapper(result), nil
|
return mapper.ArticleApprovalsResponseMapper(result), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articleApprovalsService) Save(req request.ArticleApprovalsCreateRequest, authToken string) (articleApprovals *entity.ArticleApprovals, err error) {
|
func (_i *articleApprovalsService) Save(clientId *uuid.UUID, req request.ArticleApprovalsCreateRequest, authToken string) (articleApprovals *entity.ArticleApprovals, err error) {
|
||||||
_i.Log.Info().Interface("data", req).Msg("")
|
_i.Log.Info().Interface("data", req).Msg("")
|
||||||
|
|
||||||
newReq := req.ToEntity()
|
newReq := req.ToEntity()
|
||||||
|
|
@ -77,7 +78,7 @@ func (_i *articleApprovalsService) Save(req request.ArticleApprovalsCreateReques
|
||||||
approvalByUserLevelId := createdBy.UserLevelId
|
approvalByUserLevelId := createdBy.UserLevelId
|
||||||
approvalParentLevelId := createdBy.UserLevel.ParentLevelId
|
approvalParentLevelId := createdBy.UserLevel.ParentLevelId
|
||||||
|
|
||||||
err = _i.ArticlesService.UpdateApproval(newReq.ArticleId, newReq.StatusId, int(approvalByUserLevelId), *newReq.ApprovalAtLevel, *approvalParentLevelId)
|
err = _i.ArticlesService.UpdateApproval(clientId, newReq.ArticleId, newReq.StatusId, int(approvalByUserLevelId), *newReq.ApprovalAtLevel, *approvalParentLevelId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,10 +2,10 @@ package article_categories
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
"go-humas-be/app/module/article_categories/controller"
|
|
||||||
"go-humas-be/app/module/article_categories/repository"
|
|
||||||
"go-humas-be/app/module/article_categories/service"
|
|
||||||
"go.uber.org/fx"
|
"go.uber.org/fx"
|
||||||
|
"web-medols-be/app/module/article_categories/controller"
|
||||||
|
"web-medols-be/app/module/article_categories/repository"
|
||||||
|
"web-medols-be/app/module/article_categories/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
// struct of ArticleCategoriesRouter
|
// struct of ArticleCategoriesRouter
|
||||||
|
|
|
||||||
|
|
@ -2,13 +2,14 @@ package controller
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
"go-humas-be/app/module/article_categories/request"
|
|
||||||
"go-humas-be/app/module/article_categories/service"
|
|
||||||
"go-humas-be/utils/paginator"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"web-medols-be/app/middleware"
|
||||||
|
"web-medols-be/app/module/article_categories/request"
|
||||||
|
"web-medols-be/app/module/article_categories/service"
|
||||||
|
"web-medols-be/utils/paginator"
|
||||||
|
|
||||||
utilRes "go-humas-be/utils/response"
|
utilRes "web-medols-be/utils/response"
|
||||||
utilVal "go-humas-be/utils/validator"
|
utilVal "web-medols-be/utils/validator"
|
||||||
)
|
)
|
||||||
|
|
||||||
type articleCategoriesController struct {
|
type articleCategoriesController struct {
|
||||||
|
|
@ -53,6 +54,7 @@ func (_i *articleCategoriesController) All(c *fiber.Ctx) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
authToken := c.Get("Authorization")
|
authToken := c.Get("Authorization")
|
||||||
|
clientId := middleware.GetClientID(c)
|
||||||
|
|
||||||
reqContext := request.ArticleCategoriesQueryRequestContext{
|
reqContext := request.ArticleCategoriesQueryRequestContext{
|
||||||
Title: c.Query("title"),
|
Title: c.Query("title"),
|
||||||
|
|
@ -64,7 +66,7 @@ func (_i *articleCategoriesController) All(c *fiber.Ctx) error {
|
||||||
req := reqContext.ToParamRequest()
|
req := reqContext.ToParamRequest()
|
||||||
req.Pagination = paginate
|
req.Pagination = paginate
|
||||||
|
|
||||||
articleCategoriesData, paging, err := _i.articleCategoriesService.All(req, authToken)
|
articleCategoriesData, paging, err := _i.articleCategoriesService.All(clientId, req, authToken)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -94,7 +96,9 @@ func (_i *articleCategoriesController) Show(c *fiber.Ctx) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
articleCategoriesData, err := _i.articleCategoriesService.Show(uint(id))
|
clientId := middleware.GetClientID(c)
|
||||||
|
|
||||||
|
articleCategoriesData, err := _i.articleCategoriesService.Show(clientId, uint(id))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -123,7 +127,9 @@ func (_i *articleCategoriesController) ShowByOldId(c *fiber.Ctx) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
articleCategoriesData, err := _i.articleCategoriesService.ShowByOldId(uint(id))
|
clientId := middleware.GetClientID(c)
|
||||||
|
|
||||||
|
articleCategoriesData, err := _i.articleCategoriesService.ShowByOldId(clientId, uint(id))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -148,8 +154,9 @@ func (_i *articleCategoriesController) ShowByOldId(c *fiber.Ctx) error {
|
||||||
// @Router /article-categories/slug/{slug} [get]
|
// @Router /article-categories/slug/{slug} [get]
|
||||||
func (_i *articleCategoriesController) ShowBySlug(c *fiber.Ctx) error {
|
func (_i *articleCategoriesController) ShowBySlug(c *fiber.Ctx) error {
|
||||||
slug := c.Params("slug")
|
slug := c.Params("slug")
|
||||||
|
clientId := middleware.GetClientID(c)
|
||||||
|
|
||||||
articleCategoriesData, err := _i.articleCategoriesService.ShowBySlug(slug)
|
articleCategoriesData, err := _i.articleCategoriesService.ShowBySlug(clientId, slug)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -181,7 +188,9 @@ func (_i *articleCategoriesController) Save(c *fiber.Ctx) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
authToken := c.Get("Authorization")
|
authToken := c.Get("Authorization")
|
||||||
dataResult, err := _i.articleCategoriesService.Save(*req, authToken)
|
clientId := middleware.GetClientID(c)
|
||||||
|
|
||||||
|
dataResult, err := _i.articleCategoriesService.Save(clientId, *req, authToken)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -208,7 +217,8 @@ func (_i *articleCategoriesController) Save(c *fiber.Ctx) error {
|
||||||
// @Failure 500 {object} response.InternalServerError
|
// @Failure 500 {object} response.InternalServerError
|
||||||
// @Router /article-categories/thumbnail/{id} [post]
|
// @Router /article-categories/thumbnail/{id} [post]
|
||||||
func (_i *articleCategoriesController) SaveThumbnail(c *fiber.Ctx) error {
|
func (_i *articleCategoriesController) SaveThumbnail(c *fiber.Ctx) error {
|
||||||
err := _i.articleCategoriesService.SaveThumbnail(c)
|
clientId := middleware.GetClientID(c)
|
||||||
|
err := _i.articleCategoriesService.SaveThumbnail(clientId, c)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -243,7 +253,8 @@ func (_i *articleCategoriesController) Update(c *fiber.Ctx) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = _i.articleCategoriesService.Update(uint(id), *req)
|
clientId := middleware.GetClientID(c)
|
||||||
|
err = _i.articleCategoriesService.Update(clientId, uint(id), *req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -272,7 +283,8 @@ func (_i *articleCategoriesController) Delete(c *fiber.Ctx) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = _i.articleCategoriesService.Delete(uint(id))
|
clientId := middleware.GetClientID(c)
|
||||||
|
err = _i.articleCategoriesService.Delete(clientId, uint(id))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
package controller
|
package controller
|
||||||
|
|
||||||
import "go-humas-be/app/module/article_categories/service"
|
import "web-medols-be/app/module/article_categories/service"
|
||||||
|
|
||||||
type Controller struct {
|
type Controller struct {
|
||||||
ArticleCategories ArticleCategoriesController
|
ArticleCategories ArticleCategoriesController
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
package mapper
|
package mapper
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"go-humas-be/app/database/entity"
|
|
||||||
res "go-humas-be/app/module/article_categories/response"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
"web-medols-be/app/database/entity"
|
||||||
|
res "web-medols-be/app/module/article_categories/response"
|
||||||
)
|
)
|
||||||
|
|
||||||
func ArticleCategoriesResponseMapper(articleCategoriesReq *entity.ArticleCategories, host string) (articleCategoriesRes *res.ArticleCategoriesResponse) {
|
func ArticleCategoriesResponseMapper(articleCategoriesReq *entity.ArticleCategories, host string) (articleCategoriesRes *res.ArticleCategoriesResponse) {
|
||||||
|
|
|
||||||
|
|
@ -2,13 +2,14 @@ package repository
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/google/uuid"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
"go-humas-be/app/database"
|
|
||||||
"go-humas-be/app/database/entity"
|
|
||||||
"go-humas-be/app/module/article_categories/request"
|
|
||||||
"go-humas-be/utils/paginator"
|
|
||||||
utilSvc "go-humas-be/utils/service"
|
|
||||||
"strings"
|
"strings"
|
||||||
|
"web-medols-be/app/database"
|
||||||
|
"web-medols-be/app/database/entity"
|
||||||
|
"web-medols-be/app/module/article_categories/request"
|
||||||
|
"web-medols-be/utils/paginator"
|
||||||
|
utilSvc "web-medols-be/utils/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
type articleCategoriesRepository struct {
|
type articleCategoriesRepository struct {
|
||||||
|
|
@ -18,13 +19,13 @@ type articleCategoriesRepository struct {
|
||||||
|
|
||||||
// ArticleCategoriesRepository define interface of IArticleCategoriesRepository
|
// ArticleCategoriesRepository define interface of IArticleCategoriesRepository
|
||||||
type ArticleCategoriesRepository interface {
|
type ArticleCategoriesRepository interface {
|
||||||
GetAll(req request.ArticleCategoriesQueryRequest) (articleCategoriess []*entity.ArticleCategories, paging paginator.Pagination, err error)
|
GetAll(clientId *uuid.UUID, req request.ArticleCategoriesQueryRequest) (articleCategoriess []*entity.ArticleCategories, paging paginator.Pagination, err error)
|
||||||
FindOne(id uint) (articleCategories *entity.ArticleCategories, err error)
|
FindOne(clientId *uuid.UUID, id uint) (articleCategories *entity.ArticleCategories, err error)
|
||||||
FindOneByOldId(id uint) (articleCategories *entity.ArticleCategories, err error)
|
FindOneByOldId(clientId *uuid.UUID, id uint) (articleCategories *entity.ArticleCategories, err error)
|
||||||
FindOneBySlug(slug string) (articleCategories *entity.ArticleCategories, err error)
|
FindOneBySlug(clientId *uuid.UUID, slug string) (articleCategories *entity.ArticleCategories, err error)
|
||||||
Create(articleCategories *entity.ArticleCategories) (articleCategoriesReturn *entity.ArticleCategories, err error)
|
Create(articleCategories *entity.ArticleCategories) (articleCategoriesReturn *entity.ArticleCategories, err error)
|
||||||
Update(id uint, articleCategories *entity.ArticleCategories) (err error)
|
Update(clientId *uuid.UUID, id uint, articleCategories *entity.ArticleCategories) (err error)
|
||||||
Delete(id uint) (err error)
|
Delete(clientId *uuid.UUID, id uint) (err error)
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewArticleCategoriesRepository(db *database.Database, log zerolog.Logger) ArticleCategoriesRepository {
|
func NewArticleCategoriesRepository(db *database.Database, log zerolog.Logger) ArticleCategoriesRepository {
|
||||||
|
|
@ -35,16 +36,26 @@ func NewArticleCategoriesRepository(db *database.Database, log zerolog.Logger) A
|
||||||
}
|
}
|
||||||
|
|
||||||
// implement interface of IArticleCategoriesRepository
|
// implement interface of IArticleCategoriesRepository
|
||||||
func (_i *articleCategoriesRepository) GetAll(req request.ArticleCategoriesQueryRequest) (articleCategoriess []*entity.ArticleCategories, paging paginator.Pagination, err error) {
|
func (_i *articleCategoriesRepository) GetAll(clientId *uuid.UUID, req request.ArticleCategoriesQueryRequest) (articleCategoriess []*entity.ArticleCategories, paging paginator.Pagination, err error) {
|
||||||
var count int64
|
var count int64
|
||||||
|
|
||||||
query := _i.DB.DB.Model(&entity.ArticleCategories{})
|
query := _i.DB.DB.Model(&entity.ArticleCategories{})
|
||||||
|
|
||||||
|
// Add ClientId filter
|
||||||
|
if clientId != nil {
|
||||||
|
query = query.Where("article_categories.client_id = ?", clientId)
|
||||||
|
}
|
||||||
|
|
||||||
if req.UserLevelId != nil {
|
if req.UserLevelId != nil {
|
||||||
query = _i.DB.DB.Model(&entity.ArticleCategories{}).
|
query = _i.DB.DB.Model(&entity.ArticleCategories{}).
|
||||||
Joins("LEFT JOIN users ON article_categories.created_by_id = users.id").
|
Joins("LEFT JOIN users ON article_categories.created_by_id = users.id").
|
||||||
Joins("LEFT JOIN user_levels ON users.user_level_id = user_levels.id").
|
Joins("LEFT JOIN user_levels ON users.user_level_id = user_levels.id").
|
||||||
Where("user_levels.id = ? or user_levels.parent_level_id = ?", *req.UserLevelId, *req.UserLevelId)
|
Where("user_levels.id = ? or user_levels.parent_level_id = ?", *req.UserLevelId, *req.UserLevelId)
|
||||||
|
|
||||||
|
// Add ClientId filter for joined query
|
||||||
|
if clientId != nil {
|
||||||
|
query = query.Where("article_categories.client_id = ?", clientId)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
query = query.Where("article_categories.is_active = ?", true)
|
query = query.Where("article_categories.is_active = ?", true)
|
||||||
|
|
@ -90,24 +101,45 @@ func (_i *articleCategoriesRepository) GetAll(req request.ArticleCategoriesQuery
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articleCategoriesRepository) FindOne(id uint) (articleCategories *entity.ArticleCategories, err error) {
|
func (_i *articleCategoriesRepository) FindOne(clientId *uuid.UUID, id uint) (articleCategories *entity.ArticleCategories, err error) {
|
||||||
if err := _i.DB.DB.First(&articleCategories, id).Error; err != nil {
|
query := _i.DB.DB.Where("id = ?", id)
|
||||||
|
|
||||||
|
// Add ClientId filter
|
||||||
|
if clientId != nil {
|
||||||
|
query = query.Where("client_id = ?", clientId)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := query.First(&articleCategories).Error; err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return articleCategories, nil
|
return articleCategories, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articleCategoriesRepository) FindOneByOldId(id uint) (articleCategories *entity.ArticleCategories, err error) {
|
func (_i *articleCategoriesRepository) FindOneByOldId(clientId *uuid.UUID, id uint) (articleCategories *entity.ArticleCategories, err error) {
|
||||||
if err := _i.DB.DB.Where("old_category_id = ?", id).First(&articleCategories).Error; err != nil {
|
query := _i.DB.DB.Where("old_category_id = ?", id)
|
||||||
|
|
||||||
|
// Add ClientId filter
|
||||||
|
if clientId != nil {
|
||||||
|
query = query.Where("client_id = ?", clientId)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := query.First(&articleCategories).Error; err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return articleCategories, nil
|
return articleCategories, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articleCategoriesRepository) FindOneBySlug(slug string) (articleCategories *entity.ArticleCategories, err error) {
|
func (_i *articleCategoriesRepository) FindOneBySlug(clientId *uuid.UUID, slug string) (articleCategories *entity.ArticleCategories, err error) {
|
||||||
if err := _i.DB.DB.Where("slug = ?", slug).First(&articleCategories).Error; err != nil {
|
query := _i.DB.DB.Where("slug = ?", slug)
|
||||||
|
|
||||||
|
// Add ClientId filter
|
||||||
|
if clientId != nil {
|
||||||
|
query = query.Where("client_id = ?", clientId)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := query.First(&articleCategories).Error; err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -119,16 +151,22 @@ func (_i *articleCategoriesRepository) Create(articleCategories *entity.ArticleC
|
||||||
return articleCategories, result.Error
|
return articleCategories, result.Error
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articleCategoriesRepository) Update(id uint, articleCategories *entity.ArticleCategories) (err error) {
|
func (_i *articleCategoriesRepository) Update(clientId *uuid.UUID, id uint, articleCategories *entity.ArticleCategories) (err error) {
|
||||||
articleCategoriesMap, err := utilSvc.StructToMap(articleCategories)
|
articleCategoriesMap, err := utilSvc.StructToMap(articleCategories)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return _i.DB.DB.Model(&entity.ArticleCategories{}).
|
query := _i.DB.DB.Model(&entity.ArticleCategories{}).Where(&entity.ArticleCategories{ID: id})
|
||||||
Where(&entity.ArticleCategories{ID: id}).
|
if clientId != nil {
|
||||||
Updates(articleCategoriesMap).Error
|
query = query.Where("client_id = ?", clientId)
|
||||||
|
}
|
||||||
|
return query.Updates(articleCategoriesMap).Error
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articleCategoriesRepository) Delete(id uint) error {
|
func (_i *articleCategoriesRepository) Delete(clientId *uuid.UUID, id uint) error {
|
||||||
return _i.DB.DB.Delete(&entity.ArticleCategories{}, id).Error
|
query := _i.DB.DB.Model(&entity.ArticleCategories{}).Where("id = ?", id)
|
||||||
|
if clientId != nil {
|
||||||
|
query = query.Where("client_id = ?", clientId)
|
||||||
|
}
|
||||||
|
return query.Delete(&entity.ArticleCategories{}).Error
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
package request
|
package request
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"go-humas-be/app/database/entity"
|
|
||||||
"go-humas-be/utils/paginator"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
|
"web-medols-be/app/database/entity"
|
||||||
|
"web-medols-be/utils/paginator"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ArticleCategoriesGeneric interface {
|
type ArticleCategoriesGeneric interface {
|
||||||
|
|
|
||||||
|
|
@ -3,18 +3,9 @@ package service
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
|
"github.com/google/uuid"
|
||||||
"github.com/minio/minio-go/v7"
|
"github.com/minio/minio-go/v7"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
"go-humas-be/app/database/entity"
|
|
||||||
"go-humas-be/app/module/article_categories/mapper"
|
|
||||||
"go-humas-be/app/module/article_categories/repository"
|
|
||||||
"go-humas-be/app/module/article_categories/request"
|
|
||||||
"go-humas-be/app/module/article_categories/response"
|
|
||||||
usersRepository "go-humas-be/app/module/users/repository"
|
|
||||||
config "go-humas-be/config/config"
|
|
||||||
minioStorage "go-humas-be/config/config"
|
|
||||||
"go-humas-be/utils/paginator"
|
|
||||||
utilSvc "go-humas-be/utils/service"
|
|
||||||
"io"
|
"io"
|
||||||
"log"
|
"log"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
|
|
@ -23,6 +14,16 @@ import (
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
"web-medols-be/app/database/entity"
|
||||||
|
"web-medols-be/app/module/article_categories/mapper"
|
||||||
|
"web-medols-be/app/module/article_categories/repository"
|
||||||
|
"web-medols-be/app/module/article_categories/request"
|
||||||
|
"web-medols-be/app/module/article_categories/response"
|
||||||
|
usersRepository "web-medols-be/app/module/users/repository"
|
||||||
|
config "web-medols-be/config/config"
|
||||||
|
minioStorage "web-medols-be/config/config"
|
||||||
|
"web-medols-be/utils/paginator"
|
||||||
|
utilSvc "web-medols-be/utils/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ArticleCategoriesService
|
// ArticleCategoriesService
|
||||||
|
|
@ -36,14 +37,14 @@ type articleCategoriesService struct {
|
||||||
|
|
||||||
// ArticleCategoriesService define interface of IArticleCategoriesService
|
// ArticleCategoriesService define interface of IArticleCategoriesService
|
||||||
type ArticleCategoriesService interface {
|
type ArticleCategoriesService interface {
|
||||||
All(req request.ArticleCategoriesQueryRequest, authToken string) (articleCategories []*response.ArticleCategoriesResponse, paging paginator.Pagination, err error)
|
All(clientId *uuid.UUID, req request.ArticleCategoriesQueryRequest, authToken string) (articleCategories []*response.ArticleCategoriesResponse, paging paginator.Pagination, err error)
|
||||||
Show(id uint) (articleCategories *response.ArticleCategoriesResponse, err error)
|
Show(clientId *uuid.UUID, id uint) (articleCategories *response.ArticleCategoriesResponse, err error)
|
||||||
ShowByOldId(id uint) (articleCategories *response.ArticleCategoriesResponse, err error)
|
ShowByOldId(clientId *uuid.UUID, id uint) (articleCategories *response.ArticleCategoriesResponse, err error)
|
||||||
ShowBySlug(slug string) (articleCategories *response.ArticleCategoriesResponse, err error)
|
ShowBySlug(clientId *uuid.UUID, slug string) (articleCategories *response.ArticleCategoriesResponse, err error)
|
||||||
Save(req request.ArticleCategoriesCreateRequest, authToken string) (articleCategories *entity.ArticleCategories, err error)
|
Save(clientId *uuid.UUID, req request.ArticleCategoriesCreateRequest, authToken string) (articleCategories *entity.ArticleCategories, err error)
|
||||||
SaveThumbnail(c *fiber.Ctx) (err error)
|
SaveThumbnail(clientId *uuid.UUID, c *fiber.Ctx) (err error)
|
||||||
Update(id uint, req request.ArticleCategoriesUpdateRequest) (err error)
|
Update(clientId *uuid.UUID, id uint, req request.ArticleCategoriesUpdateRequest) (err error)
|
||||||
Delete(id uint) error
|
Delete(clientId *uuid.UUID, id uint) error
|
||||||
Viewer(c *fiber.Ctx) error
|
Viewer(c *fiber.Ctx) error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -60,7 +61,7 @@ func NewArticleCategoriesService(repo repository.ArticleCategoriesRepository, us
|
||||||
}
|
}
|
||||||
|
|
||||||
// All implement interface of ArticleCategoriesService
|
// All implement interface of ArticleCategoriesService
|
||||||
func (_i *articleCategoriesService) All(req request.ArticleCategoriesQueryRequest, authToken string) (articleCategoriess []*response.ArticleCategoriesResponse, paging paginator.Pagination, err error) {
|
func (_i *articleCategoriesService) All(clientId *uuid.UUID, req request.ArticleCategoriesQueryRequest, authToken string) (articleCategoriess []*response.ArticleCategoriesResponse, paging paginator.Pagination, err error) {
|
||||||
createdBy := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
|
createdBy := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
|
||||||
if createdBy != nil {
|
if createdBy != nil {
|
||||||
if createdBy.UserLevel.LevelNumber > 1 {
|
if createdBy.UserLevel.LevelNumber > 1 {
|
||||||
|
|
@ -68,7 +69,7 @@ func (_i *articleCategoriesService) All(req request.ArticleCategoriesQueryReques
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
results, paging, err := _i.Repo.GetAll(req)
|
results, paging, err := _i.Repo.GetAll(clientId, req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
@ -81,8 +82,8 @@ func (_i *articleCategoriesService) All(req request.ArticleCategoriesQueryReques
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articleCategoriesService) Show(id uint) (articleCategories *response.ArticleCategoriesResponse, err error) {
|
func (_i *articleCategoriesService) Show(clientId *uuid.UUID, id uint) (articleCategories *response.ArticleCategoriesResponse, err error) {
|
||||||
result, err := _i.Repo.FindOne(id)
|
result, err := _i.Repo.FindOne(clientId, id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
@ -90,8 +91,8 @@ func (_i *articleCategoriesService) Show(id uint) (articleCategories *response.A
|
||||||
return mapper.ArticleCategoriesResponseMapper(result, host), nil
|
return mapper.ArticleCategoriesResponseMapper(result, host), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articleCategoriesService) ShowByOldId(id uint) (articleCategories *response.ArticleCategoriesResponse, err error) {
|
func (_i *articleCategoriesService) ShowByOldId(clientId *uuid.UUID, id uint) (articleCategories *response.ArticleCategoriesResponse, err error) {
|
||||||
result, err := _i.Repo.FindOneByOldId(id)
|
result, err := _i.Repo.FindOneByOldId(clientId, id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
@ -99,8 +100,8 @@ func (_i *articleCategoriesService) ShowByOldId(id uint) (articleCategories *res
|
||||||
return mapper.ArticleCategoriesResponseMapper(result, host), nil
|
return mapper.ArticleCategoriesResponseMapper(result, host), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articleCategoriesService) ShowBySlug(slug string) (articleCategories *response.ArticleCategoriesResponse, err error) {
|
func (_i *articleCategoriesService) ShowBySlug(clientId *uuid.UUID, slug string) (articleCategories *response.ArticleCategoriesResponse, err error) {
|
||||||
result, err := _i.Repo.FindOneBySlug(slug)
|
result, err := _i.Repo.FindOneBySlug(clientId, slug)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
@ -108,10 +109,14 @@ func (_i *articleCategoriesService) ShowBySlug(slug string) (articleCategories *
|
||||||
return mapper.ArticleCategoriesResponseMapper(result, host), nil
|
return mapper.ArticleCategoriesResponseMapper(result, host), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articleCategoriesService) Save(req request.ArticleCategoriesCreateRequest, authToken string) (articleCategories *entity.ArticleCategories, err error) {
|
func (_i *articleCategoriesService) Save(clientId *uuid.UUID, req request.ArticleCategoriesCreateRequest, authToken string) (articleCategories *entity.ArticleCategories, err error) {
|
||||||
_i.Log.Info().Interface("data", req).Msg("")
|
_i.Log.Info().Interface("data", req).Msg("")
|
||||||
newReq := req.ToEntity()
|
newReq := req.ToEntity()
|
||||||
|
|
||||||
|
if clientId != nil {
|
||||||
|
newReq.ClientId = clientId
|
||||||
|
}
|
||||||
|
|
||||||
if req.CreatedById != nil {
|
if req.CreatedById != nil {
|
||||||
createdBy, err := _i.UsersRepo.FindOne(*req.CreatedById)
|
createdBy, err := _i.UsersRepo.FindOne(*req.CreatedById)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -126,8 +131,7 @@ func (_i *articleCategoriesService) Save(req request.ArticleCategoriesCreateRequ
|
||||||
return _i.Repo.Create(newReq)
|
return _i.Repo.Create(newReq)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articleCategoriesService) SaveThumbnail(c *fiber.Ctx) (err error) {
|
func (_i *articleCategoriesService) SaveThumbnail(clientId *uuid.UUID, c *fiber.Ctx) (err error) {
|
||||||
|
|
||||||
id, err := strconv.ParseUint(c.Params("id"), 10, 0)
|
id, err := strconv.ParseUint(c.Params("id"), 10, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
@ -153,7 +157,6 @@ func (_i *articleCategoriesService) SaveThumbnail(c *fiber.Ctx) (err error) {
|
||||||
|
|
||||||
// Iterasi semua file yang diunggah
|
// Iterasi semua file yang diunggah
|
||||||
for _, file := range files {
|
for _, file := range files {
|
||||||
|
|
||||||
_i.Log.Info().Str("timestamp", time.Now().
|
_i.Log.Info().Str("timestamp", time.Now().
|
||||||
Format(time.RFC3339)).Str("Service:Resource", "Uploader:: loop1").
|
Format(time.RFC3339)).Str("Service:Resource", "Uploader:: loop1").
|
||||||
Interface("data", file).Msg("")
|
Interface("data", file).Msg("")
|
||||||
|
|
@ -175,9 +178,9 @@ func (_i *articleCategoriesService) SaveThumbnail(c *fiber.Ctx) (err error) {
|
||||||
newFilename := newFilenameWithoutExt + "." + extension
|
newFilename := newFilenameWithoutExt + "." + extension
|
||||||
objectName := "articles/category/thumbnail/" + newFilename
|
objectName := "articles/category/thumbnail/" + newFilename
|
||||||
|
|
||||||
findCategory, err := _i.Repo.FindOne(uint(id))
|
findCategory, err := _i.Repo.FindOne(clientId, uint(id))
|
||||||
findCategory.ThumbnailPath = &objectName
|
findCategory.ThumbnailPath = &objectName
|
||||||
err = _i.Repo.Update(uint(id), findCategory)
|
err = _i.Repo.Update(clientId, uint(id), findCategory)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -192,10 +195,13 @@ func (_i *articleCategoriesService) SaveThumbnail(c *fiber.Ctx) (err error) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articleCategoriesService) Update(id uint, req request.ArticleCategoriesUpdateRequest) (err error) {
|
func (_i *articleCategoriesService) Update(clientId *uuid.UUID, id uint, req request.ArticleCategoriesUpdateRequest) (err error) {
|
||||||
_i.Log.Info().Interface("data", req).Msg("")
|
_i.Log.Info().Interface("data", req).Msg("")
|
||||||
|
|
||||||
newReq := req.ToEntity()
|
newReq := req.ToEntity()
|
||||||
|
if clientId != nil {
|
||||||
|
newReq.ClientId = clientId
|
||||||
|
}
|
||||||
if req.CreatedById != nil {
|
if req.CreatedById != nil {
|
||||||
createdBy, err := _i.UsersRepo.FindOne(*req.CreatedById)
|
createdBy, err := _i.UsersRepo.FindOne(*req.CreatedById)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -204,23 +210,26 @@ func (_i *articleCategoriesService) Update(id uint, req request.ArticleCategorie
|
||||||
newReq.CreatedById = &createdBy.ID
|
newReq.CreatedById = &createdBy.ID
|
||||||
}
|
}
|
||||||
|
|
||||||
return _i.Repo.Update(id, newReq)
|
return _i.Repo.Update(clientId, id, newReq)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articleCategoriesService) Delete(id uint) error {
|
func (_i *articleCategoriesService) Delete(clientId *uuid.UUID, id uint) error {
|
||||||
result, err := _i.Repo.FindOne(id)
|
result, err := _i.Repo.FindOne(clientId, id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
isActive := false
|
isActive := false
|
||||||
result.IsActive = &isActive
|
result.IsActive = &isActive
|
||||||
return _i.Repo.Update(id, result)
|
if clientId != nil {
|
||||||
|
result.ClientId = clientId
|
||||||
|
}
|
||||||
|
return _i.Repo.Update(clientId, id, result)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articleCategoriesService) Viewer(c *fiber.Ctx) (err error) {
|
func (_i *articleCategoriesService) Viewer(c *fiber.Ctx) (err error) {
|
||||||
id, err := strconv.ParseUint(c.Params("id"), 10, 0)
|
id, err := strconv.ParseUint(c.Params("id"), 10, 0)
|
||||||
result, err := _i.Repo.FindOne(uint(id))
|
result, err := _i.Repo.FindOne(nil, uint(id))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,10 +2,10 @@ package article_category_details
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
"go-humas-be/app/module/article_category_details/controller"
|
|
||||||
"go-humas-be/app/module/article_category_details/repository"
|
|
||||||
"go-humas-be/app/module/article_category_details/service"
|
|
||||||
"go.uber.org/fx"
|
"go.uber.org/fx"
|
||||||
|
"web-medols-be/app/module/article_category_details/controller"
|
||||||
|
"web-medols-be/app/module/article_category_details/repository"
|
||||||
|
"web-medols-be/app/module/article_category_details/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
// struct of ArticleCategoryDetailsRouter
|
// struct of ArticleCategoryDetailsRouter
|
||||||
|
|
|
||||||
|
|
@ -2,13 +2,13 @@ package controller
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
"go-humas-be/app/module/article_category_details/request"
|
|
||||||
"go-humas-be/app/module/article_category_details/service"
|
|
||||||
"go-humas-be/utils/paginator"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"web-medols-be/app/module/article_category_details/request"
|
||||||
|
"web-medols-be/app/module/article_category_details/service"
|
||||||
|
"web-medols-be/utils/paginator"
|
||||||
|
|
||||||
utilRes "go-humas-be/utils/response"
|
utilRes "web-medols-be/utils/response"
|
||||||
utilVal "go-humas-be/utils/validator"
|
utilVal "web-medols-be/utils/validator"
|
||||||
)
|
)
|
||||||
|
|
||||||
type articleCategoryDetailsController struct {
|
type articleCategoryDetailsController struct {
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
package controller
|
package controller
|
||||||
|
|
||||||
import "go-humas-be/app/module/article_category_details/service"
|
import "web-medols-be/app/module/article_category_details/service"
|
||||||
|
|
||||||
type Controller struct {
|
type Controller struct {
|
||||||
ArticleCategoryDetails ArticleCategoryDetailsController
|
ArticleCategoryDetails ArticleCategoryDetailsController
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
package mapper
|
package mapper
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"go-humas-be/app/database/entity/article_category_details"
|
"web-medols-be/app/database/entity/article_category_details"
|
||||||
res "go-humas-be/app/module/article_category_details/response"
|
res "web-medols-be/app/module/article_category_details/response"
|
||||||
)
|
)
|
||||||
|
|
||||||
func ArticleCategoryDetailsResponseMapper(articleCategoryDetailsReq *article_category_details.ArticleCategoryDetails) (articleCategoryDetailsRes *res.ArticleCategoryDetailsResponse) {
|
func ArticleCategoryDetailsResponseMapper(articleCategoryDetailsReq *article_category_details.ArticleCategoryDetails) (articleCategoryDetailsRes *res.ArticleCategoryDetailsResponse) {
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
package repository
|
package repository
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"go-humas-be/app/database"
|
"web-medols-be/app/database"
|
||||||
"go-humas-be/app/database/entity/article_category_details"
|
"web-medols-be/app/database/entity/article_category_details"
|
||||||
"go-humas-be/app/module/article_category_details/request"
|
"web-medols-be/app/module/article_category_details/request"
|
||||||
"go-humas-be/utils/paginator"
|
"web-medols-be/utils/paginator"
|
||||||
)
|
)
|
||||||
|
|
||||||
type articleCategoryDetailsRepository struct {
|
type articleCategoryDetailsRepository struct {
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
package request
|
package request
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"go-humas-be/app/database/entity/article_category_details"
|
|
||||||
"go-humas-be/utils/paginator"
|
|
||||||
"time"
|
"time"
|
||||||
|
"web-medols-be/app/database/entity/article_category_details"
|
||||||
|
"web-medols-be/utils/paginator"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ArticleCategoryDetailsGeneric interface {
|
type ArticleCategoryDetailsGeneric interface {
|
||||||
|
|
|
||||||
|
|
@ -2,11 +2,11 @@ package service
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
"go-humas-be/app/module/article_category_details/mapper"
|
"web-medols-be/app/module/article_category_details/mapper"
|
||||||
"go-humas-be/app/module/article_category_details/repository"
|
"web-medols-be/app/module/article_category_details/repository"
|
||||||
"go-humas-be/app/module/article_category_details/request"
|
"web-medols-be/app/module/article_category_details/request"
|
||||||
"go-humas-be/app/module/article_category_details/response"
|
"web-medols-be/app/module/article_category_details/response"
|
||||||
"go-humas-be/utils/paginator"
|
"web-medols-be/utils/paginator"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ArticleCategoryDetailsService
|
// ArticleCategoryDetailsService
|
||||||
|
|
|
||||||
|
|
@ -2,10 +2,10 @@ package article_comments
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
"go-humas-be/app/module/article_comments/controller"
|
|
||||||
"go-humas-be/app/module/article_comments/repository"
|
|
||||||
"go-humas-be/app/module/article_comments/service"
|
|
||||||
"go.uber.org/fx"
|
"go.uber.org/fx"
|
||||||
|
"web-medols-be/app/module/article_comments/controller"
|
||||||
|
"web-medols-be/app/module/article_comments/repository"
|
||||||
|
"web-medols-be/app/module/article_comments/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
// struct of ArticleCommentsRouter
|
// struct of ArticleCommentsRouter
|
||||||
|
|
|
||||||
|
|
@ -3,12 +3,13 @@ package controller
|
||||||
import (
|
import (
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
"go-humas-be/app/module/article_comments/request"
|
|
||||||
"go-humas-be/app/module/article_comments/service"
|
|
||||||
"go-humas-be/utils/paginator"
|
|
||||||
utilRes "go-humas-be/utils/response"
|
|
||||||
utilVal "go-humas-be/utils/validator"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"web-medols-be/app/middleware"
|
||||||
|
"web-medols-be/app/module/article_comments/request"
|
||||||
|
"web-medols-be/app/module/article_comments/service"
|
||||||
|
"web-medols-be/utils/paginator"
|
||||||
|
utilRes "web-medols-be/utils/response"
|
||||||
|
utilVal "web-medols-be/utils/validator"
|
||||||
)
|
)
|
||||||
|
|
||||||
type articleCommentsController struct {
|
type articleCommentsController struct {
|
||||||
|
|
@ -45,6 +46,9 @@ func NewArticleCommentsController(articleCommentsService service.ArticleComments
|
||||||
// @Failure 500 {object} response.InternalServerError
|
// @Failure 500 {object} response.InternalServerError
|
||||||
// @Router /article-comments [get]
|
// @Router /article-comments [get]
|
||||||
func (_i *articleCommentsController) All(c *fiber.Ctx) error {
|
func (_i *articleCommentsController) All(c *fiber.Ctx) error {
|
||||||
|
// Get ClientId from context
|
||||||
|
clientId := middleware.GetClientID(c)
|
||||||
|
|
||||||
paginate, err := paginator.Paginate(c)
|
paginate, err := paginator.Paginate(c)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
@ -60,7 +64,7 @@ func (_i *articleCommentsController) All(c *fiber.Ctx) error {
|
||||||
req := reqContext.ToParamRequest()
|
req := reqContext.ToParamRequest()
|
||||||
req.Pagination = paginate
|
req.Pagination = paginate
|
||||||
|
|
||||||
articleCommentsData, paging, err := _i.articleCommentsService.All(req)
|
articleCommentsData, paging, err := _i.articleCommentsService.All(clientId, req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -85,12 +89,15 @@ func (_i *articleCommentsController) All(c *fiber.Ctx) error {
|
||||||
// @Failure 500 {object} response.InternalServerError
|
// @Failure 500 {object} response.InternalServerError
|
||||||
// @Router /article-comments/{id} [get]
|
// @Router /article-comments/{id} [get]
|
||||||
func (_i *articleCommentsController) Show(c *fiber.Ctx) error {
|
func (_i *articleCommentsController) Show(c *fiber.Ctx) error {
|
||||||
|
// Get ClientId from context
|
||||||
|
clientId := middleware.GetClientID(c)
|
||||||
|
|
||||||
id, err := strconv.ParseUint(c.Params("id"), 10, 0)
|
id, err := strconv.ParseUint(c.Params("id"), 10, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
articleCommentsData, err := _i.articleCommentsService.Show(uint(id))
|
articleCommentsData, err := _i.articleCommentsService.Show(clientId, uint(id))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -116,13 +123,16 @@ func (_i *articleCommentsController) Show(c *fiber.Ctx) error {
|
||||||
// @Failure 500 {object} response.InternalServerError
|
// @Failure 500 {object} response.InternalServerError
|
||||||
// @Router /article-comments [post]
|
// @Router /article-comments [post]
|
||||||
func (_i *articleCommentsController) Save(c *fiber.Ctx) error {
|
func (_i *articleCommentsController) Save(c *fiber.Ctx) error {
|
||||||
|
// Get ClientId from context
|
||||||
|
clientId := middleware.GetClientID(c)
|
||||||
|
|
||||||
req := new(request.ArticleCommentsCreateRequest)
|
req := new(request.ArticleCommentsCreateRequest)
|
||||||
if err := utilVal.ParseAndValidate(c, req); err != nil {
|
if err := utilVal.ParseAndValidate(c, req); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
authToken := c.Get("Authorization")
|
authToken := c.Get("Authorization")
|
||||||
dataResult, err := _i.articleCommentsService.Save(*req, authToken)
|
dataResult, err := _i.articleCommentsService.Save(clientId, *req, authToken)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -148,6 +158,9 @@ func (_i *articleCommentsController) Save(c *fiber.Ctx) error {
|
||||||
// @Failure 500 {object} response.InternalServerError
|
// @Failure 500 {object} response.InternalServerError
|
||||||
// @Router /article-comments/{id} [put]
|
// @Router /article-comments/{id} [put]
|
||||||
func (_i *articleCommentsController) Update(c *fiber.Ctx) error {
|
func (_i *articleCommentsController) Update(c *fiber.Ctx) error {
|
||||||
|
// Get ClientId from context
|
||||||
|
clientId := middleware.GetClientID(c)
|
||||||
|
|
||||||
id, err := strconv.ParseUint(c.Params("id"), 10, 0)
|
id, err := strconv.ParseUint(c.Params("id"), 10, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
@ -158,7 +171,7 @@ func (_i *articleCommentsController) Update(c *fiber.Ctx) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = _i.articleCommentsService.Update(uint(id), *req)
|
err = _i.articleCommentsService.Update(clientId, uint(id), *req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -182,12 +195,15 @@ func (_i *articleCommentsController) Update(c *fiber.Ctx) error {
|
||||||
// @Failure 500 {object} response.InternalServerError
|
// @Failure 500 {object} response.InternalServerError
|
||||||
// @Router /article-comments/{id} [delete]
|
// @Router /article-comments/{id} [delete]
|
||||||
func (_i *articleCommentsController) Delete(c *fiber.Ctx) error {
|
func (_i *articleCommentsController) Delete(c *fiber.Ctx) error {
|
||||||
|
// Get ClientId from context
|
||||||
|
clientId := middleware.GetClientID(c)
|
||||||
|
|
||||||
id, err := strconv.ParseUint(c.Params("id"), 10, 0)
|
id, err := strconv.ParseUint(c.Params("id"), 10, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = _i.articleCommentsService.Delete(uint(id))
|
err = _i.articleCommentsService.Delete(clientId, uint(id))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -211,12 +227,15 @@ func (_i *articleCommentsController) Delete(c *fiber.Ctx) error {
|
||||||
// @Failure 500 {object} response.InternalServerError
|
// @Failure 500 {object} response.InternalServerError
|
||||||
// @Router /article-comments/approval [post]
|
// @Router /article-comments/approval [post]
|
||||||
func (_i *articleCommentsController) Approval(c *fiber.Ctx) error {
|
func (_i *articleCommentsController) Approval(c *fiber.Ctx) error {
|
||||||
|
// Get ClientId from context
|
||||||
|
clientId := middleware.GetClientID(c)
|
||||||
|
|
||||||
req := new(request.ArticleCommentsApprovalRequest)
|
req := new(request.ArticleCommentsApprovalRequest)
|
||||||
if err := utilVal.ParseAndValidate(c, req); err != nil {
|
if err := utilVal.ParseAndValidate(c, req); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err := _i.articleCommentsService.Approval(req.ID, *req)
|
err := _i.articleCommentsService.Approval(clientId, req.ID, *req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ package controller
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
"go-humas-be/app/module/article_comments/service"
|
"web-medols-be/app/module/article_comments/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Controller struct {
|
type Controller struct {
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,18 @@
|
||||||
package mapper
|
package mapper
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"go-humas-be/app/database/entity"
|
"github.com/google/uuid"
|
||||||
res "go-humas-be/app/module/article_comments/response"
|
"web-medols-be/app/database/entity"
|
||||||
usersRepository "go-humas-be/app/module/users/repository"
|
res "web-medols-be/app/module/article_comments/response"
|
||||||
|
usersRepository "web-medols-be/app/module/users/repository"
|
||||||
)
|
)
|
||||||
|
|
||||||
func ArticleCommentsResponseMapper(articleCommentsReq *entity.ArticleComments, usersRepo usersRepository.UsersRepository) (articleCommentsRes *res.ArticleCommentsResponse) {
|
func ArticleCommentsResponseMapper(clientId *uuid.UUID, articleCommentsReq *entity.ArticleComments, usersRepo usersRepository.UsersRepository) (articleCommentsRes *res.ArticleCommentsResponse) {
|
||||||
if articleCommentsReq != nil {
|
if articleCommentsReq != nil {
|
||||||
|
|
||||||
commentFromName := ""
|
commentFromName := ""
|
||||||
if articleCommentsReq.CommentFrom != nil {
|
if articleCommentsReq.CommentFrom != nil {
|
||||||
findUser, _ := usersRepo.FindOne(*articleCommentsReq.CommentFrom)
|
findUser, _ := usersRepo.FindOne(clientId, *articleCommentsReq.CommentFrom)
|
||||||
if findUser != nil {
|
if findUser != nil {
|
||||||
commentFromName = findUser.Fullname
|
commentFromName = findUser.Fullname
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,13 +2,14 @@ package repository
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/google/uuid"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
"go-humas-be/app/database"
|
|
||||||
"go-humas-be/app/database/entity"
|
|
||||||
"go-humas-be/app/module/article_comments/request"
|
|
||||||
"go-humas-be/utils/paginator"
|
|
||||||
utilSvc "go-humas-be/utils/service"
|
|
||||||
"strings"
|
"strings"
|
||||||
|
"web-medols-be/app/database"
|
||||||
|
"web-medols-be/app/database/entity"
|
||||||
|
"web-medols-be/app/module/article_comments/request"
|
||||||
|
"web-medols-be/utils/paginator"
|
||||||
|
utilSvc "web-medols-be/utils/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
type articleCommentsRepository struct {
|
type articleCommentsRepository struct {
|
||||||
|
|
@ -18,11 +19,11 @@ type articleCommentsRepository struct {
|
||||||
|
|
||||||
// ArticleCommentsRepository define interface of IArticleCommentsRepository
|
// ArticleCommentsRepository define interface of IArticleCommentsRepository
|
||||||
type ArticleCommentsRepository interface {
|
type ArticleCommentsRepository interface {
|
||||||
GetAll(req request.ArticleCommentsQueryRequest) (articleCommentss []*entity.ArticleComments, paging paginator.Pagination, err error)
|
GetAll(clientId *uuid.UUID, req request.ArticleCommentsQueryRequest) (articleCommentss []*entity.ArticleComments, paging paginator.Pagination, err error)
|
||||||
FindOne(id uint) (articleComments *entity.ArticleComments, err error)
|
FindOne(clientId *uuid.UUID, id uint) (articleComments *entity.ArticleComments, err error)
|
||||||
Create(articleComments *entity.ArticleComments) (articleCommentsReturn *entity.ArticleComments, err error)
|
Create(clientId *uuid.UUID, articleComments *entity.ArticleComments) (articleCommentsReturn *entity.ArticleComments, err error)
|
||||||
Update(id uint, articleComments *entity.ArticleComments) (err error)
|
Update(clientId *uuid.UUID, id uint, articleComments *entity.ArticleComments) (err error)
|
||||||
Delete(id uint) (err error)
|
Delete(clientId *uuid.UUID, id uint) (err error)
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewArticleCommentsRepository(db *database.Database, logger zerolog.Logger) ArticleCommentsRepository {
|
func NewArticleCommentsRepository(db *database.Database, logger zerolog.Logger) ArticleCommentsRepository {
|
||||||
|
|
@ -33,12 +34,17 @@ func NewArticleCommentsRepository(db *database.Database, logger zerolog.Logger)
|
||||||
}
|
}
|
||||||
|
|
||||||
// implement interface of IArticleCommentsRepository
|
// implement interface of IArticleCommentsRepository
|
||||||
func (_i *articleCommentsRepository) GetAll(req request.ArticleCommentsQueryRequest) (articleCommentss []*entity.ArticleComments, paging paginator.Pagination, err error) {
|
func (_i *articleCommentsRepository) GetAll(clientId *uuid.UUID, req request.ArticleCommentsQueryRequest) (articleCommentss []*entity.ArticleComments, paging paginator.Pagination, err error) {
|
||||||
var count int64
|
var count int64
|
||||||
|
|
||||||
query := _i.DB.DB.Model(&entity.ArticleComments{})
|
query := _i.DB.DB.Model(&entity.ArticleComments{})
|
||||||
query = query.Where("is_active = ?", true)
|
query = query.Where("is_active = ?", true)
|
||||||
|
|
||||||
|
// Add client filter
|
||||||
|
if clientId != nil {
|
||||||
|
query = query.Where("client_id = ?", clientId)
|
||||||
|
}
|
||||||
|
|
||||||
if req.Message != nil && *req.Message != "" {
|
if req.Message != nil && *req.Message != "" {
|
||||||
message := strings.ToLower(*req.Message)
|
message := strings.ToLower(*req.Message)
|
||||||
query = query.Where("LOWER(message) LIKE ?", "%"+strings.ToLower(message)+"%")
|
query = query.Where("LOWER(message) LIKE ?", "%"+strings.ToLower(message)+"%")
|
||||||
|
|
@ -78,20 +84,39 @@ func (_i *articleCommentsRepository) GetAll(req request.ArticleCommentsQueryRequ
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articleCommentsRepository) FindOne(id uint) (articleComments *entity.ArticleComments, err error) {
|
func (_i *articleCommentsRepository) FindOne(clientId *uuid.UUID, id uint) (articleComments *entity.ArticleComments, err error) {
|
||||||
if err := _i.DB.DB.First(&articleComments, id).Error; err != nil {
|
query := _i.DB.DB
|
||||||
|
if clientId != nil {
|
||||||
|
query = query.Where("client_id = ?", clientId)
|
||||||
|
}
|
||||||
|
if err := query.First(&articleComments, id).Error; err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return articleComments, nil
|
return articleComments, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articleCommentsRepository) Create(articleComments *entity.ArticleComments) (articleCommentsReturn *entity.ArticleComments, err error) {
|
func (_i *articleCommentsRepository) Create(clientId *uuid.UUID, articleComments *entity.ArticleComments) (articleCommentsReturn *entity.ArticleComments, err error) {
|
||||||
|
// Set client ID
|
||||||
|
if clientId != nil {
|
||||||
|
articleComments.ClientId = clientId
|
||||||
|
}
|
||||||
result := _i.DB.DB.Create(articleComments)
|
result := _i.DB.DB.Create(articleComments)
|
||||||
return articleComments, result.Error
|
return articleComments, result.Error
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articleCommentsRepository) Update(id uint, articleComments *entity.ArticleComments) (err error) {
|
func (_i *articleCommentsRepository) Update(clientId *uuid.UUID, id uint, articleComments *entity.ArticleComments) (err error) {
|
||||||
|
// Validate client access
|
||||||
|
if clientId != nil {
|
||||||
|
var count int64
|
||||||
|
if err := _i.DB.DB.Model(&entity.ArticleComments{}).Where("id = ? AND client_id = ?", id, clientId).Count(&count).Error; err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if count == 0 {
|
||||||
|
return fmt.Errorf("access denied to this resource")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
articleCommentsMap, err := utilSvc.StructToMap(articleComments)
|
articleCommentsMap, err := utilSvc.StructToMap(articleComments)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
@ -101,6 +126,17 @@ func (_i *articleCommentsRepository) Update(id uint, articleComments *entity.Art
|
||||||
Updates(articleCommentsMap).Error
|
Updates(articleCommentsMap).Error
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articleCommentsRepository) Delete(id uint) error {
|
func (_i *articleCommentsRepository) Delete(clientId *uuid.UUID, id uint) error {
|
||||||
|
// Validate client access
|
||||||
|
if clientId != nil {
|
||||||
|
var count int64
|
||||||
|
if err := _i.DB.DB.Model(&entity.ArticleComments{}).Where("id = ? AND client_id = ?", id, clientId).Count(&count).Error; err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if count == 0 {
|
||||||
|
return fmt.Errorf("access denied to this resource")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return _i.DB.DB.Delete(&entity.ArticleComments{}, id).Error
|
return _i.DB.DB.Delete(&entity.ArticleComments{}, id).Error
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
package request
|
package request
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"go-humas-be/app/database/entity"
|
|
||||||
"go-humas-be/utils/paginator"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
|
"web-medols-be/app/database/entity"
|
||||||
|
"web-medols-be/utils/paginator"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ArticleCommentsGeneric interface {
|
type ArticleCommentsGeneric interface {
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,17 @@
|
||||||
package service
|
package service
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/google/uuid"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
"go-humas-be/app/database/entity"
|
"web-medols-be/app/database/entity"
|
||||||
"go-humas-be/app/module/article_comments/mapper"
|
"web-medols-be/app/module/article_comments/mapper"
|
||||||
"go-humas-be/app/module/article_comments/repository"
|
"web-medols-be/app/module/article_comments/repository"
|
||||||
"go-humas-be/app/module/article_comments/request"
|
"web-medols-be/app/module/article_comments/request"
|
||||||
"go-humas-be/app/module/article_comments/response"
|
"web-medols-be/app/module/article_comments/response"
|
||||||
usersRepository "go-humas-be/app/module/users/repository"
|
usersRepository "web-medols-be/app/module/users/repository"
|
||||||
"go-humas-be/utils/paginator"
|
"web-medols-be/utils/paginator"
|
||||||
|
|
||||||
utilSvc "go-humas-be/utils/service"
|
utilSvc "web-medols-be/utils/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ArticleCommentsService
|
// ArticleCommentsService
|
||||||
|
|
@ -22,12 +23,12 @@ type articleCommentsService struct {
|
||||||
|
|
||||||
// ArticleCommentsService define interface of IArticleCommentsService
|
// ArticleCommentsService define interface of IArticleCommentsService
|
||||||
type ArticleCommentsService interface {
|
type ArticleCommentsService interface {
|
||||||
All(req request.ArticleCommentsQueryRequest) (articleComments []*response.ArticleCommentsResponse, paging paginator.Pagination, err error)
|
All(clientId *uuid.UUID, req request.ArticleCommentsQueryRequest) (articleComments []*response.ArticleCommentsResponse, paging paginator.Pagination, err error)
|
||||||
Show(id uint) (articleComments *response.ArticleCommentsResponse, err error)
|
Show(clientId *uuid.UUID, id uint) (articleComments *response.ArticleCommentsResponse, err error)
|
||||||
Save(req request.ArticleCommentsCreateRequest, authToken string) (articleComments *entity.ArticleComments, err error)
|
Save(clientId *uuid.UUID, req request.ArticleCommentsCreateRequest, authToken string) (articleComments *entity.ArticleComments, err error)
|
||||||
Update(id uint, req request.ArticleCommentsUpdateRequest) (err error)
|
Update(clientId *uuid.UUID, id uint, req request.ArticleCommentsUpdateRequest) (err error)
|
||||||
Delete(id uint) error
|
Delete(clientId *uuid.UUID, id uint) error
|
||||||
Approval(id uint, req request.ArticleCommentsApprovalRequest) (err error)
|
Approval(clientId *uuid.UUID, id uint, req request.ArticleCommentsApprovalRequest) (err error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewArticleCommentsService init ArticleCommentsService
|
// NewArticleCommentsService init ArticleCommentsService
|
||||||
|
|
@ -41,29 +42,29 @@ func NewArticleCommentsService(repo repository.ArticleCommentsRepository, log ze
|
||||||
}
|
}
|
||||||
|
|
||||||
// All implement interface of ArticleCommentsService
|
// All implement interface of ArticleCommentsService
|
||||||
func (_i *articleCommentsService) All(req request.ArticleCommentsQueryRequest) (articleCommentss []*response.ArticleCommentsResponse, paging paginator.Pagination, err error) {
|
func (_i *articleCommentsService) All(clientId *uuid.UUID, req request.ArticleCommentsQueryRequest) (articleCommentss []*response.ArticleCommentsResponse, paging paginator.Pagination, err error) {
|
||||||
results, paging, err := _i.Repo.GetAll(req)
|
results, paging, err := _i.Repo.GetAll(clientId, req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, result := range results {
|
for _, result := range results {
|
||||||
articleCommentss = append(articleCommentss, mapper.ArticleCommentsResponseMapper(result, _i.UsersRepo))
|
articleCommentss = append(articleCommentss, mapper.ArticleCommentsResponseMapper(clientId, result, _i.UsersRepo))
|
||||||
}
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articleCommentsService) Show(id uint) (articleComments *response.ArticleCommentsResponse, err error) {
|
func (_i *articleCommentsService) Show(clientId *uuid.UUID, id uint) (articleComments *response.ArticleCommentsResponse, err error) {
|
||||||
result, err := _i.Repo.FindOne(id)
|
result, err := _i.Repo.FindOne(clientId, id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return mapper.ArticleCommentsResponseMapper(result, _i.UsersRepo), nil
|
return mapper.ArticleCommentsResponseMapper(clientId, result, _i.UsersRepo), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articleCommentsService) Save(req request.ArticleCommentsCreateRequest, authToken string) (articleComments *entity.ArticleComments, err error) {
|
func (_i *articleCommentsService) Save(clientId *uuid.UUID, req request.ArticleCommentsCreateRequest, authToken string) (articleComments *entity.ArticleComments, err error) {
|
||||||
_i.Log.Info().Interface("data", req).Msg("")
|
_i.Log.Info().Interface("data", req).Msg("")
|
||||||
|
|
||||||
newReq := req.ToEntity()
|
newReq := req.ToEntity()
|
||||||
|
|
@ -72,25 +73,25 @@ func (_i *articleCommentsService) Save(req request.ArticleCommentsCreateRequest,
|
||||||
newReq.CommentFrom = &createdBy.ID
|
newReq.CommentFrom = &createdBy.ID
|
||||||
newReq.IsActive = true
|
newReq.IsActive = true
|
||||||
|
|
||||||
return _i.Repo.Create(newReq)
|
return _i.Repo.Create(clientId, newReq)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articleCommentsService) Update(id uint, req request.ArticleCommentsUpdateRequest) (err error) {
|
func (_i *articleCommentsService) Update(clientId *uuid.UUID, id uint, req request.ArticleCommentsUpdateRequest) (err error) {
|
||||||
_i.Log.Info().Interface("data", req).Msg("")
|
_i.Log.Info().Interface("data", req).Msg("")
|
||||||
return _i.Repo.Update(id, req.ToEntity())
|
return _i.Repo.Update(clientId, id, req.ToEntity())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articleCommentsService) Delete(id uint) error {
|
func (_i *articleCommentsService) Delete(clientId *uuid.UUID, id uint) error {
|
||||||
result, err := _i.Repo.FindOne(id)
|
result, err := _i.Repo.FindOne(clientId, id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
result.IsActive = false
|
result.IsActive = false
|
||||||
return _i.Repo.Update(id, result)
|
return _i.Repo.Update(clientId, id, result)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articleCommentsService) Approval(id uint, req request.ArticleCommentsApprovalRequest) (err error) {
|
func (_i *articleCommentsService) Approval(clientId *uuid.UUID, id uint, req request.ArticleCommentsApprovalRequest) (err error) {
|
||||||
_i.Log.Info().Interface("data", req).Msg("")
|
_i.Log.Info().Interface("data", req).Msg("")
|
||||||
newReq := req.ToEntity()
|
newReq := req.ToEntity()
|
||||||
|
|
||||||
|
|
@ -100,5 +101,5 @@ func (_i *articleCommentsService) Approval(id uint, req request.ArticleCommentsA
|
||||||
newReq.IsPublic = false
|
newReq.IsPublic = false
|
||||||
}
|
}
|
||||||
|
|
||||||
return _i.Repo.Update(id, newReq)
|
return _i.Repo.Update(clientId, id, newReq)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,10 +2,10 @@ package article_files
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
"go-humas-be/app/module/article_files/controller"
|
|
||||||
"go-humas-be/app/module/article_files/repository"
|
|
||||||
"go-humas-be/app/module/article_files/service"
|
|
||||||
"go.uber.org/fx"
|
"go.uber.org/fx"
|
||||||
|
"web-medols-be/app/module/article_files/controller"
|
||||||
|
"web-medols-be/app/module/article_files/repository"
|
||||||
|
"web-medols-be/app/module/article_files/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
// struct of ArticleFilesRouter
|
// struct of ArticleFilesRouter
|
||||||
|
|
|
||||||
|
|
@ -3,12 +3,13 @@ package controller
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
"go-humas-be/app/module/article_files/request"
|
|
||||||
"go-humas-be/app/module/article_files/service"
|
|
||||||
"go-humas-be/utils/paginator"
|
|
||||||
utilRes "go-humas-be/utils/response"
|
|
||||||
utilVal "go-humas-be/utils/validator"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"web-medols-be/app/middleware"
|
||||||
|
"web-medols-be/app/module/article_files/request"
|
||||||
|
"web-medols-be/app/module/article_files/service"
|
||||||
|
"web-medols-be/utils/paginator"
|
||||||
|
utilRes "web-medols-be/utils/response"
|
||||||
|
utilVal "web-medols-be/utils/validator"
|
||||||
)
|
)
|
||||||
|
|
||||||
type articleFilesController struct {
|
type articleFilesController struct {
|
||||||
|
|
@ -44,6 +45,9 @@ func NewArticleFilesController(articleFilesService service.ArticleFilesService)
|
||||||
// @Failure 500 {object} response.InternalServerError
|
// @Failure 500 {object} response.InternalServerError
|
||||||
// @Router /article-files [get]
|
// @Router /article-files [get]
|
||||||
func (_i *articleFilesController) All(c *fiber.Ctx) error {
|
func (_i *articleFilesController) All(c *fiber.Ctx) error {
|
||||||
|
// Get ClientId from context
|
||||||
|
clientId := middleware.GetClientID(c)
|
||||||
|
|
||||||
paginate, err := paginator.Paginate(c)
|
paginate, err := paginator.Paginate(c)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
@ -58,7 +62,7 @@ func (_i *articleFilesController) All(c *fiber.Ctx) error {
|
||||||
req := reqContext.ToParamRequest()
|
req := reqContext.ToParamRequest()
|
||||||
req.Pagination = paginate
|
req.Pagination = paginate
|
||||||
|
|
||||||
articleFilesData, paging, err := _i.articleFilesService.All(req)
|
articleFilesData, paging, err := _i.articleFilesService.All(clientId, req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -83,12 +87,15 @@ func (_i *articleFilesController) All(c *fiber.Ctx) error {
|
||||||
// @Failure 500 {object} response.InternalServerError
|
// @Failure 500 {object} response.InternalServerError
|
||||||
// @Router /article-files/{id} [get]
|
// @Router /article-files/{id} [get]
|
||||||
func (_i *articleFilesController) Show(c *fiber.Ctx) error {
|
func (_i *articleFilesController) Show(c *fiber.Ctx) error {
|
||||||
|
// Get ClientId from context
|
||||||
|
clientId := middleware.GetClientID(c)
|
||||||
|
|
||||||
id, err := strconv.ParseUint(c.Params("id"), 10, 0)
|
id, err := strconv.ParseUint(c.Params("id"), 10, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
articleFilesData, err := _i.articleFilesService.Show(uint(id))
|
articleFilesData, err := _i.articleFilesService.Show(clientId, uint(id))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -115,12 +122,15 @@ func (_i *articleFilesController) Show(c *fiber.Ctx) error {
|
||||||
// @Failure 500 {object} response.InternalServerError
|
// @Failure 500 {object} response.InternalServerError
|
||||||
// @Router /article-files/{articleId} [post]
|
// @Router /article-files/{articleId} [post]
|
||||||
func (_i *articleFilesController) Save(c *fiber.Ctx) error {
|
func (_i *articleFilesController) Save(c *fiber.Ctx) error {
|
||||||
|
// Get ClientId from context
|
||||||
|
clientId := middleware.GetClientID(c)
|
||||||
|
|
||||||
id, err := strconv.ParseUint(c.Params("articleId"), 10, 0)
|
id, err := strconv.ParseUint(c.Params("articleId"), 10, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = _i.articleFilesService.Save(c, uint(id))
|
err = _i.articleFilesService.Save(clientId, c, uint(id))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -145,6 +155,9 @@ func (_i *articleFilesController) Save(c *fiber.Ctx) error {
|
||||||
// @Failure 500 {object} response.InternalServerError
|
// @Failure 500 {object} response.InternalServerError
|
||||||
// @Router /article-files/{id} [put]
|
// @Router /article-files/{id} [put]
|
||||||
func (_i *articleFilesController) Update(c *fiber.Ctx) error {
|
func (_i *articleFilesController) Update(c *fiber.Ctx) error {
|
||||||
|
// Get ClientId from context
|
||||||
|
clientId := middleware.GetClientID(c)
|
||||||
|
|
||||||
id, err := strconv.ParseUint(c.Params("id"), 10, 0)
|
id, err := strconv.ParseUint(c.Params("id"), 10, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
@ -155,7 +168,7 @@ func (_i *articleFilesController) Update(c *fiber.Ctx) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = _i.articleFilesService.Update(uint(id), *req)
|
err = _i.articleFilesService.Update(clientId, uint(id), *req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -179,12 +192,15 @@ func (_i *articleFilesController) Update(c *fiber.Ctx) error {
|
||||||
// @Failure 500 {object} response.InternalServerError
|
// @Failure 500 {object} response.InternalServerError
|
||||||
// @Router /article-files/{id} [delete]
|
// @Router /article-files/{id} [delete]
|
||||||
func (_i *articleFilesController) Delete(c *fiber.Ctx) error {
|
func (_i *articleFilesController) Delete(c *fiber.Ctx) error {
|
||||||
|
// Get ClientId from context
|
||||||
|
clientId := middleware.GetClientID(c)
|
||||||
|
|
||||||
id, err := strconv.ParseUint(c.Params("id"), 10, 0)
|
id, err := strconv.ParseUint(c.Params("id"), 10, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = _i.articleFilesService.Delete(uint(id))
|
err = _i.articleFilesService.Delete(clientId, uint(id))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -207,7 +223,10 @@ func (_i *articleFilesController) Delete(c *fiber.Ctx) error {
|
||||||
// @Failure 500 {object} response.InternalServerError
|
// @Failure 500 {object} response.InternalServerError
|
||||||
// @Router /article-files/viewer/{filename} [get]
|
// @Router /article-files/viewer/{filename} [get]
|
||||||
func (_i *articleFilesController) Viewer(c *fiber.Ctx) error {
|
func (_i *articleFilesController) Viewer(c *fiber.Ctx) error {
|
||||||
return _i.articleFilesService.Viewer(c)
|
// Get ClientId from context
|
||||||
|
clientId := middleware.GetClientID(c)
|
||||||
|
|
||||||
|
return _i.articleFilesService.Viewer(clientId, c)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetUploadStatus ArticleFiles
|
// GetUploadStatus ArticleFiles
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
package controller
|
package controller
|
||||||
|
|
||||||
import "go-humas-be/app/module/article_files/service"
|
import "web-medols-be/app/module/article_files/service"
|
||||||
|
|
||||||
type Controller struct {
|
type Controller struct {
|
||||||
ArticleFiles ArticleFilesController
|
ArticleFiles ArticleFilesController
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
package mapper
|
package mapper
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"go-humas-be/app/database/entity"
|
"web-medols-be/app/database/entity"
|
||||||
res "go-humas-be/app/module/article_files/response"
|
res "web-medols-be/app/module/article_files/response"
|
||||||
)
|
)
|
||||||
|
|
||||||
func ArticleFilesResponseMapper(articleFilesReq *entity.ArticleFiles, host string) (articleFilesRes *res.ArticleFilesResponse) {
|
func ArticleFilesResponseMapper(articleFilesReq *entity.ArticleFiles, host string) (articleFilesRes *res.ArticleFilesResponse) {
|
||||||
|
|
|
||||||
|
|
@ -2,12 +2,13 @@ package repository
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"go-humas-be/app/database"
|
"github.com/google/uuid"
|
||||||
"go-humas-be/app/database/entity"
|
|
||||||
"go-humas-be/app/module/article_files/request"
|
|
||||||
"go-humas-be/utils/paginator"
|
|
||||||
utilSvc "go-humas-be/utils/service"
|
|
||||||
"strings"
|
"strings"
|
||||||
|
"web-medols-be/app/database"
|
||||||
|
"web-medols-be/app/database/entity"
|
||||||
|
"web-medols-be/app/module/article_files/request"
|
||||||
|
"web-medols-be/utils/paginator"
|
||||||
|
utilSvc "web-medols-be/utils/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
type articleFilesRepository struct {
|
type articleFilesRepository struct {
|
||||||
|
|
@ -16,13 +17,13 @@ type articleFilesRepository struct {
|
||||||
|
|
||||||
// ArticleFilesRepository define interface of IArticleFilesRepository
|
// ArticleFilesRepository define interface of IArticleFilesRepository
|
||||||
type ArticleFilesRepository interface {
|
type ArticleFilesRepository interface {
|
||||||
GetAll(req request.ArticleFilesQueryRequest) (articleFiless []*entity.ArticleFiles, paging paginator.Pagination, err error)
|
GetAll(clientId *uuid.UUID, req request.ArticleFilesQueryRequest) (articleFiless []*entity.ArticleFiles, paging paginator.Pagination, err error)
|
||||||
FindOne(id uint) (articleFiles *entity.ArticleFiles, err error)
|
FindOne(clientId *uuid.UUID, id uint) (articleFiles *entity.ArticleFiles, err error)
|
||||||
FindByArticle(articleId uint) (articleFiles []*entity.ArticleFiles, err error)
|
FindByArticle(clientId *uuid.UUID, articleId uint) (articleFiles []*entity.ArticleFiles, err error)
|
||||||
FindByFilename(filename string) (articleFiles *entity.ArticleFiles, err error)
|
FindByFilename(clientId *uuid.UUID, filename string) (articleFiles *entity.ArticleFiles, err error)
|
||||||
Create(articleFiles *entity.ArticleFiles) (err error)
|
Create(clientId *uuid.UUID, articleFiles *entity.ArticleFiles) (err error)
|
||||||
Update(id uint, articleFiles *entity.ArticleFiles) (err error)
|
Update(clientId *uuid.UUID, id uint, articleFiles *entity.ArticleFiles) (err error)
|
||||||
Delete(id uint) (err error)
|
Delete(clientId *uuid.UUID, id uint) (err error)
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewArticleFilesRepository(db *database.Database) ArticleFilesRepository {
|
func NewArticleFilesRepository(db *database.Database) ArticleFilesRepository {
|
||||||
|
|
@ -32,12 +33,17 @@ func NewArticleFilesRepository(db *database.Database) ArticleFilesRepository {
|
||||||
}
|
}
|
||||||
|
|
||||||
// implement interface of IArticleFilesRepository
|
// implement interface of IArticleFilesRepository
|
||||||
func (_i *articleFilesRepository) GetAll(req request.ArticleFilesQueryRequest) (articleFiless []*entity.ArticleFiles, paging paginator.Pagination, err error) {
|
func (_i *articleFilesRepository) GetAll(clientId *uuid.UUID, req request.ArticleFilesQueryRequest) (articleFiless []*entity.ArticleFiles, paging paginator.Pagination, err error) {
|
||||||
var count int64
|
var count int64
|
||||||
|
|
||||||
query := _i.DB.DB.Model(&entity.ArticleFiles{})
|
query := _i.DB.DB.Model(&entity.ArticleFiles{})
|
||||||
query = query.Where("is_active = ?", true)
|
query = query.Where("is_active = ?", true)
|
||||||
|
|
||||||
|
// Add client filter
|
||||||
|
if clientId != nil {
|
||||||
|
query = query.Where("client_id = ?", clientId)
|
||||||
|
}
|
||||||
|
|
||||||
if req.ArticleId != nil {
|
if req.ArticleId != nil {
|
||||||
query = query.Where("article_id = ?", req.ArticleId)
|
query = query.Where("article_id = ?", req.ArticleId)
|
||||||
}
|
}
|
||||||
|
|
@ -74,36 +80,62 @@ func (_i *articleFilesRepository) GetAll(req request.ArticleFilesQueryRequest) (
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articleFilesRepository) FindOne(id uint) (articleFiles *entity.ArticleFiles, err error) {
|
func (_i *articleFilesRepository) FindOne(clientId *uuid.UUID, id uint) (articleFiles *entity.ArticleFiles, err error) {
|
||||||
if err := _i.DB.DB.First(&articleFiles, id).Error; err != nil {
|
query := _i.DB.DB
|
||||||
|
if clientId != nil {
|
||||||
|
query = query.Where("client_id = ?", clientId)
|
||||||
|
}
|
||||||
|
if err := query.First(&articleFiles, id).Error; err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return articleFiles, nil
|
return articleFiles, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articleFilesRepository) FindByArticle(articleId uint) (articleFiles []*entity.ArticleFiles, err error) {
|
func (_i *articleFilesRepository) FindByArticle(clientId *uuid.UUID, articleId uint) (articleFiles []*entity.ArticleFiles, err error) {
|
||||||
if err := _i.DB.DB.Where("article_id = ?", articleId).Find(&articleFiles).Error; err != nil {
|
query := _i.DB.DB.Where("article_id = ?", articleId)
|
||||||
|
if clientId != nil {
|
||||||
|
query = query.Where("client_id = ?", clientId)
|
||||||
|
}
|
||||||
|
if err := query.Find(&articleFiles).Error; err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return articleFiles, nil
|
return articleFiles, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articleFilesRepository) FindByFilename(articleFilename string) (articleFiles *entity.ArticleFiles, err error) {
|
func (_i *articleFilesRepository) FindByFilename(clientId *uuid.UUID, articleFilename string) (articleFiles *entity.ArticleFiles, err error) {
|
||||||
|
query := _i.DB.DB.Where("file_name = ?", articleFilename)
|
||||||
if err := _i.DB.DB.Where("file_name = ?", articleFilename).First(&articleFiles).Error; err != nil {
|
if clientId != nil {
|
||||||
|
query = query.Where("client_id = ?", clientId)
|
||||||
|
}
|
||||||
|
if err := query.First(&articleFiles).Error; err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return articleFiles, nil
|
return articleFiles, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articleFilesRepository) Create(articleFiles *entity.ArticleFiles) (err error) {
|
func (_i *articleFilesRepository) Create(clientId *uuid.UUID, articleFiles *entity.ArticleFiles) (err error) {
|
||||||
|
// Set client ID
|
||||||
|
if clientId != nil {
|
||||||
|
articleFiles.ClientId = clientId
|
||||||
|
}
|
||||||
return _i.DB.DB.Create(articleFiles).Error
|
return _i.DB.DB.Create(articleFiles).Error
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articleFilesRepository) Update(id uint, articleFiles *entity.ArticleFiles) (err error) {
|
func (_i *articleFilesRepository) Update(clientId *uuid.UUID, id uint, articleFiles *entity.ArticleFiles) (err error) {
|
||||||
|
// Validate client access
|
||||||
|
if clientId != nil {
|
||||||
|
var count int64
|
||||||
|
if err := _i.DB.DB.Model(&entity.ArticleFiles{}).Where("id = ? AND client_id = ?", id, clientId).Count(&count).Error; err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if count == 0 {
|
||||||
|
return fmt.Errorf("access denied to this resource")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
articleFilesMap, err := utilSvc.StructToMap(articleFiles)
|
articleFilesMap, err := utilSvc.StructToMap(articleFiles)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
@ -113,6 +145,17 @@ func (_i *articleFilesRepository) Update(id uint, articleFiles *entity.ArticleFi
|
||||||
Updates(articleFilesMap).Error
|
Updates(articleFilesMap).Error
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articleFilesRepository) Delete(id uint) error {
|
func (_i *articleFilesRepository) Delete(clientId *uuid.UUID, id uint) error {
|
||||||
|
// Validate client access
|
||||||
|
if clientId != nil {
|
||||||
|
var count int64
|
||||||
|
if err := _i.DB.DB.Model(&entity.ArticleFiles{}).Where("id = ? AND client_id = ?", id, clientId).Count(&count).Error; err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if count == 0 {
|
||||||
|
return fmt.Errorf("access denied to this resource")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return _i.DB.DB.Delete(&entity.ArticleFiles{}, id).Error
|
return _i.DB.DB.Delete(&entity.ArticleFiles{}, id).Error
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
package request
|
package request
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"go-humas-be/app/database/entity"
|
|
||||||
"go-humas-be/utils/paginator"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
|
"web-medols-be/app/database/entity"
|
||||||
|
"web-medols-be/utils/paginator"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ArticleFilesGeneric interface {
|
type ArticleFilesGeneric interface {
|
||||||
|
|
|
||||||
|
|
@ -4,15 +4,9 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
|
"github.com/google/uuid"
|
||||||
"github.com/minio/minio-go/v7"
|
"github.com/minio/minio-go/v7"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
"go-humas-be/app/module/article_files/mapper"
|
|
||||||
"go-humas-be/app/module/article_files/repository"
|
|
||||||
"go-humas-be/app/module/article_files/request"
|
|
||||||
"go-humas-be/app/module/article_files/response"
|
|
||||||
config "go-humas-be/config/config"
|
|
||||||
minioStorage "go-humas-be/config/config"
|
|
||||||
"go-humas-be/utils/paginator"
|
|
||||||
"io"
|
"io"
|
||||||
"log"
|
"log"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
|
|
@ -24,6 +18,13 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
"web-medols-be/app/module/article_files/mapper"
|
||||||
|
"web-medols-be/app/module/article_files/repository"
|
||||||
|
"web-medols-be/app/module/article_files/request"
|
||||||
|
"web-medols-be/app/module/article_files/response"
|
||||||
|
config "web-medols-be/config/config"
|
||||||
|
minioStorage "web-medols-be/config/config"
|
||||||
|
"web-medols-be/utils/paginator"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ArticleFilesService
|
// ArticleFilesService
|
||||||
|
|
@ -36,14 +37,14 @@ type articleFilesService struct {
|
||||||
|
|
||||||
// ArticleFilesService define interface of IArticleFilesService
|
// ArticleFilesService define interface of IArticleFilesService
|
||||||
type ArticleFilesService interface {
|
type ArticleFilesService interface {
|
||||||
All(req request.ArticleFilesQueryRequest) (articleFiles []*response.ArticleFilesResponse, paging paginator.Pagination, err error)
|
All(clientId *uuid.UUID, req request.ArticleFilesQueryRequest) (articleFiles []*response.ArticleFilesResponse, paging paginator.Pagination, err error)
|
||||||
Show(id uint) (articleFiles *response.ArticleFilesResponse, err error)
|
Show(clientId *uuid.UUID, id uint) (articleFiles *response.ArticleFilesResponse, err error)
|
||||||
Save(c *fiber.Ctx, id uint) error
|
Save(clientId *uuid.UUID, c *fiber.Ctx, id uint) error
|
||||||
SaveAsync(c *fiber.Ctx, id uint) error
|
SaveAsync(clientId *uuid.UUID, c *fiber.Ctx, id uint) error
|
||||||
Update(id uint, req request.ArticleFilesUpdateRequest) (err error)
|
Update(clientId *uuid.UUID, id uint, req request.ArticleFilesUpdateRequest) (err error)
|
||||||
GetUploadStatus(c *fiber.Ctx) (progress int, err error)
|
GetUploadStatus(c *fiber.Ctx) (progress int, err error)
|
||||||
Delete(id uint) error
|
Delete(clientId *uuid.UUID, id uint) error
|
||||||
Viewer(c *fiber.Ctx) error
|
Viewer(clientId *uuid.UUID, c *fiber.Ctx) error
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewArticleFilesService init ArticleFilesService
|
// NewArticleFilesService init ArticleFilesService
|
||||||
|
|
@ -69,8 +70,8 @@ type progressWriter struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// All implement interface of ArticleFilesService
|
// All implement interface of ArticleFilesService
|
||||||
func (_i *articleFilesService) All(req request.ArticleFilesQueryRequest) (articleFiless []*response.ArticleFilesResponse, paging paginator.Pagination, err error) {
|
func (_i *articleFilesService) All(clientId *uuid.UUID, req request.ArticleFilesQueryRequest) (articleFiless []*response.ArticleFilesResponse, paging paginator.Pagination, err error) {
|
||||||
results, paging, err := _i.Repo.GetAll(req)
|
results, paging, err := _i.Repo.GetAll(clientId, req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
@ -84,8 +85,8 @@ func (_i *articleFilesService) All(req request.ArticleFilesQueryRequest) (articl
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articleFilesService) Show(id uint) (articleFiles *response.ArticleFilesResponse, err error) {
|
func (_i *articleFilesService) Show(clientId *uuid.UUID, id uint) (articleFiles *response.ArticleFilesResponse, err error) {
|
||||||
result, err := _i.Repo.FindOne(id)
|
result, err := _i.Repo.FindOne(clientId, id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
@ -95,7 +96,7 @@ func (_i *articleFilesService) Show(id uint) (articleFiles *response.ArticleFile
|
||||||
return mapper.ArticleFilesResponseMapper(result, host), nil
|
return mapper.ArticleFilesResponseMapper(result, host), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articleFilesService) SaveAsync(c *fiber.Ctx, id uint) (err error) {
|
func (_i *articleFilesService) SaveAsync(clientId *uuid.UUID, c *fiber.Ctx, id uint) (err error) {
|
||||||
bucketName := _i.MinioStorage.Cfg.ObjectStorage.MinioStorage.BucketName
|
bucketName := _i.MinioStorage.Cfg.ObjectStorage.MinioStorage.BucketName
|
||||||
|
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
|
|
@ -159,7 +160,7 @@ func (_i *articleFilesService) SaveAsync(c *fiber.Ctx, id uint) (err error) {
|
||||||
Size: &fileSize,
|
Size: &fileSize,
|
||||||
}
|
}
|
||||||
|
|
||||||
err = _i.Repo.Create(req.ToEntity())
|
err = _i.Repo.Create(clientId, req.ToEntity())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -194,7 +195,7 @@ func (_i *articleFilesService) SaveAsync(c *fiber.Ctx, id uint) (err error) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articleFilesService) Save(c *fiber.Ctx, id uint) (err error) {
|
func (_i *articleFilesService) Save(clientId *uuid.UUID, c *fiber.Ctx, id uint) (err error) {
|
||||||
bucketName := _i.MinioStorage.Cfg.ObjectStorage.MinioStorage.BucketName
|
bucketName := _i.MinioStorage.Cfg.ObjectStorage.MinioStorage.BucketName
|
||||||
|
|
||||||
form, err := c.MultipartForm()
|
form, err := c.MultipartForm()
|
||||||
|
|
@ -256,7 +257,7 @@ func (_i *articleFilesService) Save(c *fiber.Ctx, id uint) (err error) {
|
||||||
Size: &fileSize,
|
Size: &fileSize,
|
||||||
}
|
}
|
||||||
|
|
||||||
err = _i.Repo.Create(req.ToEntity())
|
err = _i.Repo.Create(clientId, req.ToEntity())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -276,23 +277,23 @@ func (_i *articleFilesService) Save(c *fiber.Ctx, id uint) (err error) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articleFilesService) Update(id uint, req request.ArticleFilesUpdateRequest) (err error) {
|
func (_i *articleFilesService) Update(clientId *uuid.UUID, id uint, req request.ArticleFilesUpdateRequest) (err error) {
|
||||||
_i.Log.Info().Interface("data", req).Msg("")
|
_i.Log.Info().Interface("data", req).Msg("")
|
||||||
return _i.Repo.Update(id, req.ToEntity())
|
return _i.Repo.Update(clientId, id, req.ToEntity())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articleFilesService) Delete(id uint) error {
|
func (_i *articleFilesService) Delete(clientId *uuid.UUID, id uint) error {
|
||||||
result, err := _i.Repo.FindOne(id)
|
result, err := _i.Repo.FindOne(clientId, id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
result.IsActive = false
|
result.IsActive = false
|
||||||
return _i.Repo.Update(id, result)
|
return _i.Repo.Update(clientId, id, result)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articleFilesService) Viewer(c *fiber.Ctx) (err error) {
|
func (_i *articleFilesService) Viewer(clientId *uuid.UUID, c *fiber.Ctx) (err error) {
|
||||||
filename := c.Params("filename")
|
filename := c.Params("filename")
|
||||||
result, err := _i.Repo.FindByFilename(filename)
|
result, err := _i.Repo.FindByFilename(clientId, filename)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,10 +2,10 @@ package article_nulis_ai
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
"go-humas-be/app/module/article_nulis_ai/controller"
|
|
||||||
"go-humas-be/app/module/article_nulis_ai/repository"
|
|
||||||
"go-humas-be/app/module/article_nulis_ai/service"
|
|
||||||
"go.uber.org/fx"
|
"go.uber.org/fx"
|
||||||
|
"web-medols-be/app/module/article_nulis_ai/controller"
|
||||||
|
"web-medols-be/app/module/article_nulis_ai/repository"
|
||||||
|
"web-medols-be/app/module/article_nulis_ai/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
// struct of ArticleNulisAIRouter
|
// struct of ArticleNulisAIRouter
|
||||||
|
|
|
||||||
|
|
@ -3,12 +3,12 @@ package controller
|
||||||
import (
|
import (
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
"go-humas-be/app/module/article_nulis_ai/request"
|
|
||||||
"go-humas-be/app/module/article_nulis_ai/service"
|
|
||||||
"go-humas-be/utils/paginator"
|
|
||||||
utilRes "go-humas-be/utils/response"
|
|
||||||
utilVal "go-humas-be/utils/validator"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"web-medols-be/app/module/article_nulis_ai/request"
|
||||||
|
"web-medols-be/app/module/article_nulis_ai/service"
|
||||||
|
"web-medols-be/utils/paginator"
|
||||||
|
utilRes "web-medols-be/utils/response"
|
||||||
|
utilVal "web-medols-be/utils/validator"
|
||||||
)
|
)
|
||||||
|
|
||||||
type articleNulisAIController struct {
|
type articleNulisAIController struct {
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ package controller
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
"go-humas-be/app/module/article_nulis_ai/service"
|
"web-medols-be/app/module/article_nulis_ai/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Controller struct {
|
type Controller struct {
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
package mapper
|
package mapper
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"go-humas-be/app/database/entity"
|
"web-medols-be/app/database/entity"
|
||||||
res "go-humas-be/app/module/article_nulis_ai/response"
|
res "web-medols-be/app/module/article_nulis_ai/response"
|
||||||
)
|
)
|
||||||
|
|
||||||
func ArticleNulisAIResponseMapper(articleNulisAIReq *entity.ArticleNulisAI) (articleNulisAIRes *res.ArticleNulisAIResponse) {
|
func ArticleNulisAIResponseMapper(articleNulisAIReq *entity.ArticleNulisAI) (articleNulisAIRes *res.ArticleNulisAIResponse) {
|
||||||
|
|
|
||||||
|
|
@ -3,11 +3,11 @@ package repository
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
"go-humas-be/app/database"
|
|
||||||
"go-humas-be/app/database/entity"
|
|
||||||
"go-humas-be/app/module/article_nulis_ai/request"
|
|
||||||
"go-humas-be/utils/paginator"
|
|
||||||
"strings"
|
"strings"
|
||||||
|
"web-medols-be/app/database"
|
||||||
|
"web-medols-be/app/database/entity"
|
||||||
|
"web-medols-be/app/module/article_nulis_ai/request"
|
||||||
|
"web-medols-be/utils/paginator"
|
||||||
)
|
)
|
||||||
|
|
||||||
type articleNulisAIRepository struct {
|
type articleNulisAIRepository struct {
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
package request
|
package request
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"go-humas-be/app/database/entity"
|
|
||||||
"go-humas-be/utils/paginator"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
|
"web-medols-be/app/database/entity"
|
||||||
|
"web-medols-be/utils/paginator"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ArticleNulisAIGeneric interface {
|
type ArticleNulisAIGeneric interface {
|
||||||
|
|
|
||||||
|
|
@ -2,17 +2,17 @@ package service
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
"go-humas-be/app/database/entity"
|
"web-medols-be/app/database/entity"
|
||||||
"go-humas-be/app/module/article_nulis_ai/mapper"
|
"web-medols-be/app/module/article_nulis_ai/mapper"
|
||||||
"go-humas-be/app/module/article_nulis_ai/repository"
|
"web-medols-be/app/module/article_nulis_ai/repository"
|
||||||
"go-humas-be/app/module/article_nulis_ai/request"
|
"web-medols-be/app/module/article_nulis_ai/request"
|
||||||
"go-humas-be/app/module/article_nulis_ai/response"
|
"web-medols-be/app/module/article_nulis_ai/response"
|
||||||
articlesRepository "go-humas-be/app/module/articles/repository"
|
articlesRepository "web-medols-be/app/module/articles/repository"
|
||||||
articles "go-humas-be/app/module/articles/request"
|
articles "web-medols-be/app/module/articles/request"
|
||||||
usersRepository "go-humas-be/app/module/users/repository"
|
usersRepository "web-medols-be/app/module/users/repository"
|
||||||
"go-humas-be/utils/paginator"
|
"web-medols-be/utils/paginator"
|
||||||
|
|
||||||
utilSvc "go-humas-be/utils/service"
|
utilSvc "web-medols-be/utils/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ArticleNulisAIService
|
// ArticleNulisAIService
|
||||||
|
|
@ -96,7 +96,7 @@ func (_i *articleNulisAIService) Publish(req request.ArticleNulisAICreateRequest
|
||||||
newArticleReq := articleReq.ToEntity()
|
newArticleReq := articleReq.ToEntity()
|
||||||
newArticleReq.CreatedById = &createdBy.ID
|
newArticleReq.CreatedById = &createdBy.ID
|
||||||
|
|
||||||
_, err = _i.ArticlesRepo.Create(newArticleReq)
|
_, err = _i.ArticlesRepo.Create(nil, newArticleReq)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -2,10 +2,10 @@ package articles
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
"go-humas-be/app/module/articles/controller"
|
|
||||||
"go-humas-be/app/module/articles/repository"
|
|
||||||
"go-humas-be/app/module/articles/service"
|
|
||||||
"go.uber.org/fx"
|
"go.uber.org/fx"
|
||||||
|
"web-medols-be/app/module/articles/controller"
|
||||||
|
"web-medols-be/app/module/articles/repository"
|
||||||
|
"web-medols-be/app/module/articles/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ArticlesRouter struct of ArticlesRouter
|
// ArticlesRouter struct of ArticlesRouter
|
||||||
|
|
|
||||||
|
|
@ -2,17 +2,20 @@ package controller
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
"go-humas-be/app/module/articles/request"
|
"github.com/rs/zerolog"
|
||||||
"go-humas-be/app/module/articles/service"
|
|
||||||
"go-humas-be/utils/paginator"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"web-medols-be/app/middleware"
|
||||||
|
"web-medols-be/app/module/articles/request"
|
||||||
|
"web-medols-be/app/module/articles/service"
|
||||||
|
"web-medols-be/utils/paginator"
|
||||||
|
|
||||||
utilRes "go-humas-be/utils/response"
|
utilRes "web-medols-be/utils/response"
|
||||||
utilVal "go-humas-be/utils/validator"
|
utilVal "web-medols-be/utils/validator"
|
||||||
)
|
)
|
||||||
|
|
||||||
type articlesController struct {
|
type articlesController struct {
|
||||||
articlesService service.ArticlesService
|
articlesService service.ArticlesService
|
||||||
|
Log zerolog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
type ArticlesController interface {
|
type ArticlesController interface {
|
||||||
|
|
@ -31,9 +34,10 @@ type ArticlesController interface {
|
||||||
PublishScheduling(c *fiber.Ctx) error
|
PublishScheduling(c *fiber.Ctx) error
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewArticlesController(articlesService service.ArticlesService) ArticlesController {
|
func NewArticlesController(articlesService service.ArticlesService, log zerolog.Logger) ArticlesController {
|
||||||
return &articlesController{
|
return &articlesController{
|
||||||
articlesService: articlesService,
|
articlesService: articlesService,
|
||||||
|
Log: log,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -42,6 +46,7 @@ func NewArticlesController(articlesService service.ArticlesService) ArticlesCont
|
||||||
// @Description API for getting all Articles
|
// @Description API for getting all Articles
|
||||||
// @Tags Articles
|
// @Tags Articles
|
||||||
// @Security Bearer
|
// @Security Bearer
|
||||||
|
// @Param X-Client-Key header string true "Insert the X-Client-Key"
|
||||||
// @Param req query request.ArticlesQueryRequest false "query parameters"
|
// @Param req query request.ArticlesQueryRequest false "query parameters"
|
||||||
// @Param req query paginator.Pagination false "pagination parameters"
|
// @Param req query paginator.Pagination false "pagination parameters"
|
||||||
// @Success 200 {object} response.Response
|
// @Success 200 {object} response.Response
|
||||||
|
|
@ -70,7 +75,12 @@ func (_i *articlesController) All(c *fiber.Ctx) error {
|
||||||
req := reqContext.ToParamRequest()
|
req := reqContext.ToParamRequest()
|
||||||
req.Pagination = paginate
|
req.Pagination = paginate
|
||||||
|
|
||||||
articlesData, paging, err := _i.articlesService.All(req)
|
// Get ClientId from context
|
||||||
|
clientId := middleware.GetClientID(c)
|
||||||
|
|
||||||
|
_i.Log.Info().Interface("clientId", clientId).Msg("")
|
||||||
|
|
||||||
|
articlesData, paging, err := _i.articlesService.All(clientId, req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -100,7 +110,10 @@ func (_i *articlesController) Show(c *fiber.Ctx) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
articlesData, err := _i.articlesService.Show(uint(id))
|
// Get ClientId from context
|
||||||
|
clientId := middleware.GetClientID(c)
|
||||||
|
|
||||||
|
articlesData, err := _i.articlesService.Show(clientId, uint(id))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -129,7 +142,10 @@ func (_i *articlesController) ShowByOldId(c *fiber.Ctx) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
articlesData, err := _i.articlesService.ShowByOldId(uint(id))
|
// Get ClientId from context
|
||||||
|
clientId := middleware.GetClientID(c)
|
||||||
|
|
||||||
|
articlesData, err := _i.articlesService.ShowByOldId(clientId, uint(id))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -161,7 +177,11 @@ func (_i *articlesController) Save(c *fiber.Ctx) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
authToken := c.Get("Authorization")
|
authToken := c.Get("Authorization")
|
||||||
dataResult, err := _i.articlesService.Save(*req, authToken)
|
|
||||||
|
// Get ClientId from context
|
||||||
|
clientId := middleware.GetClientID(c)
|
||||||
|
|
||||||
|
dataResult, err := _i.articlesService.Save(clientId, *req, authToken)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -188,7 +208,10 @@ func (_i *articlesController) Save(c *fiber.Ctx) error {
|
||||||
// @Failure 500 {object} response.InternalServerError
|
// @Failure 500 {object} response.InternalServerError
|
||||||
// @Router /articles/thumbnail/{id} [post]
|
// @Router /articles/thumbnail/{id} [post]
|
||||||
func (_i *articlesController) SaveThumbnail(c *fiber.Ctx) error {
|
func (_i *articlesController) SaveThumbnail(c *fiber.Ctx) error {
|
||||||
err := _i.articlesService.SaveThumbnail(c)
|
// Get ClientId from context
|
||||||
|
clientId := middleware.GetClientID(c)
|
||||||
|
|
||||||
|
err := _i.articlesService.SaveThumbnail(clientId, c)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -223,7 +246,10 @@ func (_i *articlesController) Update(c *fiber.Ctx) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = _i.articlesService.Update(uint(id), *req)
|
// Get ClientId from context
|
||||||
|
clientId := middleware.GetClientID(c)
|
||||||
|
|
||||||
|
err = _i.articlesService.Update(clientId, uint(id), *req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -258,7 +284,10 @@ func (_i *articlesController) UpdateBanner(c *fiber.Ctx) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = _i.articlesService.UpdateBanner(uint(id), isBanner)
|
// Get ClientId from context
|
||||||
|
clientId := middleware.GetClientID(c)
|
||||||
|
|
||||||
|
err = _i.articlesService.UpdateBanner(clientId, uint(id), isBanner)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -287,7 +316,10 @@ func (_i *articlesController) Delete(c *fiber.Ctx) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = _i.articlesService.Delete(uint(id))
|
// Get ClientId from context
|
||||||
|
clientId := middleware.GetClientID(c)
|
||||||
|
|
||||||
|
err = _i.articlesService.Delete(clientId, uint(id))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -310,7 +342,10 @@ func (_i *articlesController) Delete(c *fiber.Ctx) error {
|
||||||
// @Failure 500 {object} response.InternalServerError
|
// @Failure 500 {object} response.InternalServerError
|
||||||
// @Router /articles/thumbnail/viewer/{thumbnailName} [get]
|
// @Router /articles/thumbnail/viewer/{thumbnailName} [get]
|
||||||
func (_i *articlesController) Viewer(c *fiber.Ctx) error {
|
func (_i *articlesController) Viewer(c *fiber.Ctx) error {
|
||||||
return _i.articlesService.Viewer(c)
|
// Get ClientId from context
|
||||||
|
clientId := middleware.GetClientID(c)
|
||||||
|
|
||||||
|
return _i.articlesService.Viewer(clientId, c)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SummaryStats Articles
|
// SummaryStats Articles
|
||||||
|
|
@ -327,7 +362,10 @@ func (_i *articlesController) Viewer(c *fiber.Ctx) error {
|
||||||
func (_i *articlesController) SummaryStats(c *fiber.Ctx) error {
|
func (_i *articlesController) SummaryStats(c *fiber.Ctx) error {
|
||||||
authToken := c.Get("Authorization")
|
authToken := c.Get("Authorization")
|
||||||
|
|
||||||
response, err := _i.articlesService.SummaryStats(authToken)
|
// Get ClientId from context
|
||||||
|
clientId := middleware.GetClientID(c)
|
||||||
|
|
||||||
|
response, err := _i.articlesService.SummaryStats(clientId, authToken)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -357,7 +395,10 @@ func (_i *articlesController) ArticlePerUserLevelStats(c *fiber.Ctx) error {
|
||||||
startDate := c.Query("startDate")
|
startDate := c.Query("startDate")
|
||||||
endDate := c.Query("endDate")
|
endDate := c.Query("endDate")
|
||||||
|
|
||||||
response, err := _i.articlesService.ArticlePerUserLevelStats(authToken, &startDate, &endDate)
|
// Get ClientId from context
|
||||||
|
clientId := middleware.GetClientID(c)
|
||||||
|
|
||||||
|
response, err := _i.articlesService.ArticlePerUserLevelStats(clientId, authToken, &startDate, &endDate)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -389,7 +430,10 @@ func (_i *articlesController) ArticleMonthlyStats(c *fiber.Ctx) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
response, err := _i.articlesService.ArticleMonthlyStats(authToken, &yearInt)
|
// Get ClientId from context
|
||||||
|
clientId := middleware.GetClientID(c)
|
||||||
|
|
||||||
|
response, err := _i.articlesService.ArticleMonthlyStats(clientId, authToken, &yearInt)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -422,7 +466,10 @@ func (_i *articlesController) PublishScheduling(c *fiber.Ctx) error {
|
||||||
}
|
}
|
||||||
date := c.Query("date")
|
date := c.Query("date")
|
||||||
|
|
||||||
err = _i.articlesService.PublishScheduling(uint(id), date)
|
// Get ClientId from context
|
||||||
|
clientId := middleware.GetClientID(c)
|
||||||
|
|
||||||
|
err = _i.articlesService.PublishScheduling(clientId, uint(id), date)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,16 @@
|
||||||
package controller
|
package controller
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"go-humas-be/app/module/articles/service"
|
"github.com/rs/zerolog"
|
||||||
|
"web-medols-be/app/module/articles/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Controller struct {
|
type Controller struct {
|
||||||
Articles ArticlesController
|
Articles ArticlesController
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewController(ArticlesService service.ArticlesService) *Controller {
|
func NewController(ArticlesService service.ArticlesService, log zerolog.Logger) *Controller {
|
||||||
return &Controller{
|
return &Controller{
|
||||||
Articles: NewArticlesController(ArticlesService),
|
Articles: NewArticlesController(ArticlesService, log),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,22 +1,24 @@
|
||||||
package mapper
|
package mapper
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/google/uuid"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
"go-humas-be/app/database/entity"
|
"web-medols-be/app/database/entity"
|
||||||
articleCategoriesMapper "go-humas-be/app/module/article_categories/mapper"
|
articleCategoriesMapper "web-medols-be/app/module/article_categories/mapper"
|
||||||
articleCategoriesRepository "go-humas-be/app/module/article_categories/repository"
|
articleCategoriesRepository "web-medols-be/app/module/article_categories/repository"
|
||||||
articleCategoriesResponse "go-humas-be/app/module/article_categories/response"
|
articleCategoriesResponse "web-medols-be/app/module/article_categories/response"
|
||||||
articleCategoryDetailsRepository "go-humas-be/app/module/article_category_details/repository"
|
articleCategoryDetailsRepository "web-medols-be/app/module/article_category_details/repository"
|
||||||
articleFilesMapper "go-humas-be/app/module/article_files/mapper"
|
articleFilesMapper "web-medols-be/app/module/article_files/mapper"
|
||||||
articleFilesRepository "go-humas-be/app/module/article_files/repository"
|
articleFilesRepository "web-medols-be/app/module/article_files/repository"
|
||||||
articleFilesResponse "go-humas-be/app/module/article_files/response"
|
articleFilesResponse "web-medols-be/app/module/article_files/response"
|
||||||
res "go-humas-be/app/module/articles/response"
|
res "web-medols-be/app/module/articles/response"
|
||||||
usersRepository "go-humas-be/app/module/users/repository"
|
usersRepository "web-medols-be/app/module/users/repository"
|
||||||
)
|
)
|
||||||
|
|
||||||
func ArticlesResponseMapper(
|
func ArticlesResponseMapper(
|
||||||
log zerolog.Logger,
|
log zerolog.Logger,
|
||||||
host string,
|
host string,
|
||||||
|
clientId *uuid.UUID,
|
||||||
articlesReq *entity.Articles,
|
articlesReq *entity.Articles,
|
||||||
articleCategoriesRepo articleCategoriesRepository.ArticleCategoriesRepository,
|
articleCategoriesRepo articleCategoriesRepository.ArticleCategoriesRepository,
|
||||||
articleCategoryDetailsRepo articleCategoryDetailsRepository.ArticleCategoryDetailsRepository,
|
articleCategoryDetailsRepo articleCategoryDetailsRepository.ArticleCategoryDetailsRepository,
|
||||||
|
|
@ -42,7 +44,7 @@ func ArticlesResponseMapper(
|
||||||
log.Info().Interface("articleCategoriesArr", articleCategoriesArr).Msg("")
|
log.Info().Interface("articleCategoriesArr", articleCategoriesArr).Msg("")
|
||||||
}
|
}
|
||||||
|
|
||||||
articleFiles, _ := articleFilesRepo.FindByArticle(articlesReq.ID)
|
articleFiles, _ := articleFilesRepo.FindByArticle(clientId, articlesReq.ID)
|
||||||
var articleFilesArr []*articleFilesResponse.ArticleFilesResponse
|
var articleFilesArr []*articleFilesResponse.ArticleFilesResponse
|
||||||
if articleFiles != nil && len(articleFiles) > 0 {
|
if articleFiles != nil && len(articleFiles) > 0 {
|
||||||
for _, result := range articleFiles {
|
for _, result := range articleFiles {
|
||||||
|
|
|
||||||
|
|
@ -2,15 +2,16 @@ package repository
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/google/uuid"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
"go-humas-be/app/database"
|
|
||||||
"go-humas-be/app/database/entity"
|
|
||||||
"go-humas-be/app/module/articles/request"
|
|
||||||
"go-humas-be/app/module/articles/response"
|
|
||||||
"go-humas-be/utils/paginator"
|
|
||||||
utilSvc "go-humas-be/utils/service"
|
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
"web-medols-be/app/database"
|
||||||
|
"web-medols-be/app/database/entity"
|
||||||
|
"web-medols-be/app/module/articles/request"
|
||||||
|
"web-medols-be/app/module/articles/response"
|
||||||
|
"web-medols-be/utils/paginator"
|
||||||
|
utilSvc "web-medols-be/utils/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
type articlesRepository struct {
|
type articlesRepository struct {
|
||||||
|
|
@ -20,18 +21,18 @@ type articlesRepository struct {
|
||||||
|
|
||||||
// ArticlesRepository define interface of IArticlesRepository
|
// ArticlesRepository define interface of IArticlesRepository
|
||||||
type ArticlesRepository interface {
|
type ArticlesRepository interface {
|
||||||
GetAll(req request.ArticlesQueryRequest) (articless []*entity.Articles, paging paginator.Pagination, err error)
|
GetAll(clientId *uuid.UUID, req request.ArticlesQueryRequest) (articless []*entity.Articles, paging paginator.Pagination, err error)
|
||||||
GetAllPublishSchedule() (articless []*entity.Articles, err error)
|
GetAllPublishSchedule(clientId *uuid.UUID) (articless []*entity.Articles, err error)
|
||||||
FindOne(id uint) (articles *entity.Articles, err error)
|
FindOne(clientId *uuid.UUID, id uint) (articles *entity.Articles, err error)
|
||||||
FindByFilename(thumbnailName string) (articleReturn *entity.Articles, err error)
|
FindByFilename(clientId *uuid.UUID, thumbnailName string) (articleReturn *entity.Articles, err error)
|
||||||
FindByOldId(oldId uint) (articles *entity.Articles, err error)
|
FindByOldId(clientId *uuid.UUID, oldId uint) (articles *entity.Articles, err error)
|
||||||
Create(articles *entity.Articles) (articleReturn *entity.Articles, err error)
|
Create(clientId *uuid.UUID, articles *entity.Articles) (articleReturn *entity.Articles, err error)
|
||||||
Update(id uint, articles *entity.Articles) (err error)
|
Update(clientId *uuid.UUID, id uint, articles *entity.Articles) (err error)
|
||||||
UpdateSkipNull(id uint, articles *entity.Articles) (err error)
|
UpdateSkipNull(clientId *uuid.UUID, id uint, articles *entity.Articles) (err error)
|
||||||
Delete(id uint) (err error)
|
Delete(clientId *uuid.UUID, id uint) (err error)
|
||||||
SummaryStats(userID uint) (articleSummaryStats *response.ArticleSummaryStats, err error)
|
SummaryStats(clientId *uuid.UUID, userID uint) (articleSummaryStats *response.ArticleSummaryStats, err error)
|
||||||
ArticlePerUserLevelStats(userLevelId *uint, levelNumber *int, startDate *time.Time, endDate *time.Time) (articlePerUserLevelStats []*response.ArticlePerUserLevelStats, err error)
|
ArticlePerUserLevelStats(clientId *uuid.UUID, userLevelId *uint, levelNumber *int, startDate *time.Time, endDate *time.Time) (articlePerUserLevelStats []*response.ArticlePerUserLevelStats, err error)
|
||||||
ArticleMonthlyStats(userLevelId *uint, levelNumber *int, year int) (articleMontlyStats []*response.ArticleMonthlyStats, err error)
|
ArticleMonthlyStats(clientId *uuid.UUID, userLevelId *uint, levelNumber *int, year int) (articleMontlyStats []*response.ArticleMonthlyStats, err error)
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewArticlesRepository(db *database.Database, log zerolog.Logger) ArticlesRepository {
|
func NewArticlesRepository(db *database.Database, log zerolog.Logger) ArticlesRepository {
|
||||||
|
|
@ -42,10 +43,16 @@ func NewArticlesRepository(db *database.Database, log zerolog.Logger) ArticlesRe
|
||||||
}
|
}
|
||||||
|
|
||||||
// implement interface of IArticlesRepository
|
// implement interface of IArticlesRepository
|
||||||
func (_i *articlesRepository) GetAll(req request.ArticlesQueryRequest) (articless []*entity.Articles, paging paginator.Pagination, err error) {
|
func (_i *articlesRepository) GetAll(clientId *uuid.UUID, req request.ArticlesQueryRequest) (articless []*entity.Articles, paging paginator.Pagination, err error) {
|
||||||
var count int64
|
var count int64
|
||||||
|
|
||||||
query := _i.DB.DB.Model(&entity.Articles{})
|
query := _i.DB.DB.Model(&entity.Articles{})
|
||||||
|
|
||||||
|
// Add client filter
|
||||||
|
if clientId != nil {
|
||||||
|
query = query.Where("client_id = ?", clientId)
|
||||||
|
}
|
||||||
|
|
||||||
if req.CategoryId != nil {
|
if req.CategoryId != nil {
|
||||||
query = query.Joins("JOIN article_category_details acd ON acd.article_id = articles.id").
|
query = query.Joins("JOIN article_category_details acd ON acd.article_id = articles.id").
|
||||||
Where("acd.category_id = ?", req.CategoryId)
|
Where("acd.category_id = ?", req.CategoryId)
|
||||||
|
|
@ -109,44 +116,76 @@ func (_i *articlesRepository) GetAll(req request.ArticlesQueryRequest) (articles
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articlesRepository) GetAllPublishSchedule() (articles []*entity.Articles, err error) {
|
func (_i *articlesRepository) GetAllPublishSchedule(clientId *uuid.UUID) (articles []*entity.Articles, err error) {
|
||||||
err = _i.DB.DB.Where("publish_schedule IS NOT NULL").Find(&articles).Error
|
query := _i.DB.DB.Where("publish_schedule IS NOT NULL")
|
||||||
|
if clientId != nil {
|
||||||
|
query = query.Where("client_id = ?", clientId)
|
||||||
|
}
|
||||||
|
err = query.Find(&articles).Error
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return articles, nil
|
return articles, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articlesRepository) FindOne(id uint) (articles *entity.Articles, err error) {
|
func (_i *articlesRepository) FindOne(clientId *uuid.UUID, id uint) (articles *entity.Articles, err error) {
|
||||||
if err := _i.DB.DB.First(&articles, id).Error; err != nil {
|
query := _i.DB.DB
|
||||||
|
if clientId != nil {
|
||||||
|
query = query.Where("client_id = ?", clientId)
|
||||||
|
}
|
||||||
|
if err := query.First(&articles, id).Error; err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return articles, nil
|
return articles, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articlesRepository) FindByFilename(thumbnailName string) (articles *entity.Articles, err error) {
|
func (_i *articlesRepository) FindByFilename(clientId *uuid.UUID, thumbnailName string) (articles *entity.Articles, err error) {
|
||||||
if err := _i.DB.DB.Where("thumbnail_name = ?", thumbnailName).First(&articles).Error; err != nil {
|
query := _i.DB.DB.Where("thumbnail_name = ?", thumbnailName)
|
||||||
|
if clientId != nil {
|
||||||
|
query = query.Where("client_id = ?", clientId)
|
||||||
|
}
|
||||||
|
if err := query.First(&articles).Error; err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return articles, nil
|
return articles, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articlesRepository) FindByOldId(oldId uint) (articles *entity.Articles, err error) {
|
func (_i *articlesRepository) FindByOldId(clientId *uuid.UUID, oldId uint) (articles *entity.Articles, err error) {
|
||||||
if err := _i.DB.DB.Where("old_id = ?", oldId).First(&articles).Error; err != nil {
|
query := _i.DB.DB.Where("old_id = ?", oldId)
|
||||||
|
if clientId != nil {
|
||||||
|
query = query.Where("client_id = ?", clientId)
|
||||||
|
}
|
||||||
|
if err := query.First(&articles).Error; err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return articles, nil
|
return articles, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articlesRepository) Create(articles *entity.Articles) (articleReturn *entity.Articles, err error) {
|
func (_i *articlesRepository) Create(clientId *uuid.UUID, articles *entity.Articles) (articleReturn *entity.Articles, err error) {
|
||||||
|
// Set client ID
|
||||||
|
if clientId != nil {
|
||||||
|
articles.ClientId = clientId
|
||||||
|
}
|
||||||
|
|
||||||
result := _i.DB.DB.Create(articles)
|
result := _i.DB.DB.Create(articles)
|
||||||
return articles, result.Error
|
return articles, result.Error
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articlesRepository) Update(id uint, articles *entity.Articles) (err error) {
|
func (_i *articlesRepository) Update(clientId *uuid.UUID, id uint, articles *entity.Articles) (err error) {
|
||||||
|
// Validate client access
|
||||||
|
if clientId != nil {
|
||||||
|
var count int64
|
||||||
|
if err := _i.DB.DB.Model(&entity.Articles{}).Where("id = ? AND client_id = ?", id, clientId).Count(&count).Error; err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if count == 0 {
|
||||||
|
return fmt.Errorf("access denied to this resource")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
articlesMap, err := utilSvc.StructToMap(articles)
|
articlesMap, err := utilSvc.StructToMap(articles)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
@ -156,23 +195,45 @@ func (_i *articlesRepository) Update(id uint, articles *entity.Articles) (err er
|
||||||
Updates(articlesMap).Error
|
Updates(articlesMap).Error
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articlesRepository) UpdateSkipNull(id uint, articles *entity.Articles) (err error) {
|
func (_i *articlesRepository) UpdateSkipNull(clientId *uuid.UUID, id uint, articles *entity.Articles) (err error) {
|
||||||
|
// Validate client access
|
||||||
|
if clientId != nil {
|
||||||
|
var count int64
|
||||||
|
if err := _i.DB.DB.Model(&entity.Articles{}).Where("id = ? AND client_id = ?", id, clientId).Count(&count).Error; err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if count == 0 {
|
||||||
|
return fmt.Errorf("access denied to this resource")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return _i.DB.DB.Model(&entity.Articles{}).
|
return _i.DB.DB.Model(&entity.Articles{}).
|
||||||
Where(&entity.Articles{ID: id}).
|
Where(&entity.Articles{ID: id}).
|
||||||
Updates(articles).Error
|
Updates(articles).Error
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articlesRepository) Delete(id uint) error {
|
func (_i *articlesRepository) Delete(clientId *uuid.UUID, id uint) error {
|
||||||
|
// Validate client access
|
||||||
|
if clientId != nil {
|
||||||
|
var count int64
|
||||||
|
if err := _i.DB.DB.Model(&entity.Articles{}).Where("id = ? AND client_id = ?", id, clientId).Count(&count).Error; err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if count == 0 {
|
||||||
|
return fmt.Errorf("access denied to this resource")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return _i.DB.DB.Delete(&entity.Articles{}, id).Error
|
return _i.DB.DB.Delete(&entity.Articles{}, id).Error
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articlesRepository) SummaryStats(userID uint) (articleSummaryStats *response.ArticleSummaryStats, err error) {
|
func (_i *articlesRepository) SummaryStats(clientId *uuid.UUID, userID uint) (articleSummaryStats *response.ArticleSummaryStats, err error) {
|
||||||
now := time.Now()
|
now := time.Now()
|
||||||
startOfDay := now.Truncate(24 * time.Hour)
|
startOfDay := now.Truncate(24 * time.Hour)
|
||||||
startOfWeek := now.AddDate(0, 0, -int(now.Weekday())+1).Truncate(24 * time.Hour)
|
startOfWeek := now.AddDate(0, 0, -int(now.Weekday())+1).Truncate(24 * time.Hour)
|
||||||
|
|
||||||
// Query
|
// Query
|
||||||
err = _i.DB.DB.Model(&entity.Articles{}).
|
query := _i.DB.DB.Model(&entity.Articles{}).
|
||||||
Select(
|
Select(
|
||||||
"COUNT(*) AS total_all, "+
|
"COUNT(*) AS total_all, "+
|
||||||
"COALESCE(SUM(view_count), 0) AS total_views, "+
|
"COALESCE(SUM(view_count), 0) AS total_views, "+
|
||||||
|
|
@ -182,13 +243,19 @@ func (_i *articlesRepository) SummaryStats(userID uint) (articleSummaryStats *re
|
||||||
"COUNT(CASE WHEN created_at >= ? THEN 1 END) AS total_this_week",
|
"COUNT(CASE WHEN created_at >= ? THEN 1 END) AS total_this_week",
|
||||||
startOfDay, startOfWeek,
|
startOfDay, startOfWeek,
|
||||||
).
|
).
|
||||||
Where("created_by_id = ?", userID).
|
Where("created_by_id = ?", userID)
|
||||||
Scan(&articleSummaryStats).Error
|
|
||||||
|
// Add client filter
|
||||||
|
if clientId != nil {
|
||||||
|
query = query.Where("client_id = ?", clientId)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = query.Scan(&articleSummaryStats).Error
|
||||||
|
|
||||||
return articleSummaryStats, err
|
return articleSummaryStats, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articlesRepository) ArticlePerUserLevelStats(userLevelId *uint, levelNumber *int, startDate *time.Time, endDate *time.Time) (articlePerUserLevelStats []*response.ArticlePerUserLevelStats, err error) {
|
func (_i *articlesRepository) ArticlePerUserLevelStats(clientId *uuid.UUID, userLevelId *uint, levelNumber *int, startDate *time.Time, endDate *time.Time) (articlePerUserLevelStats []*response.ArticlePerUserLevelStats, err error) {
|
||||||
|
|
||||||
levelNumberTop := 1
|
levelNumberTop := 1
|
||||||
|
|
||||||
|
|
@ -198,6 +265,11 @@ func (_i *articlesRepository) ArticlePerUserLevelStats(userLevelId *uint, levelN
|
||||||
Joins("LEFT JOIN user_levels ON users.user_level_id = user_levels.id").
|
Joins("LEFT JOIN user_levels ON users.user_level_id = user_levels.id").
|
||||||
Where("articles.is_active = true")
|
Where("articles.is_active = true")
|
||||||
|
|
||||||
|
// Add client filter
|
||||||
|
if clientId != nil {
|
||||||
|
query = query.Where("articles.client_id = ?", clientId)
|
||||||
|
}
|
||||||
|
|
||||||
if userLevelId != nil && *levelNumber != levelNumberTop {
|
if userLevelId != nil && *levelNumber != levelNumberTop {
|
||||||
query = query.Where("user_levels.id = ? or user_levels.parent_level_id = ?", *userLevelId, *userLevelId)
|
query = query.Where("user_levels.id = ? or user_levels.parent_level_id = ?", *userLevelId, *userLevelId)
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -229,12 +301,14 @@ func (_i *articlesRepository) ArticlePerUserLevelStats(userLevelId *uint, levelN
|
||||||
FROM articles
|
FROM articles
|
||||||
JOIN users ON articles.created_by_id = users.id
|
JOIN users ON articles.created_by_id = users.id
|
||||||
JOIN LevelHierarchy lh ON users.user_level_id = lh.id
|
JOIN LevelHierarchy lh ON users.user_level_id = lh.id
|
||||||
WHERE articles.is_active = true AND lh.level_2_id > 0
|
WHERE articles.is_active = true AND lh.level_2_id > 0`)
|
||||||
GROUP BY
|
|
||||||
lh.level_2_id,
|
// Add client filter to raw query
|
||||||
lh.level_2_name
|
if clientId != nil {
|
||||||
ORDER BY
|
query = query.Where("articles.client_id = ?", clientId)
|
||||||
total_article DESC`)
|
}
|
||||||
|
|
||||||
|
query = query.Group("lh.level_2_id, lh.level_2_name").Order("total_article DESC")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Apply date filters if provided
|
// Apply date filters if provided
|
||||||
|
|
@ -253,7 +327,7 @@ func (_i *articlesRepository) ArticlePerUserLevelStats(userLevelId *uint, levelN
|
||||||
return articlePerUserLevelStats, err
|
return articlePerUserLevelStats, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articlesRepository) ArticleMonthlyStats(userLevelId *uint, levelNumber *int, year int) (articleMontlyStats []*response.ArticleMonthlyStats, err error) {
|
func (_i *articlesRepository) ArticleMonthlyStats(clientId *uuid.UUID, userLevelId *uint, levelNumber *int, year int) (articleMontlyStats []*response.ArticleMonthlyStats, err error) {
|
||||||
levelNumberTop := 1
|
levelNumberTop := 1
|
||||||
|
|
||||||
if year < 1900 || year > 2100 {
|
if year < 1900 || year > 2100 {
|
||||||
|
|
@ -275,6 +349,11 @@ func (_i *articlesRepository) ArticleMonthlyStats(userLevelId *uint, levelNumber
|
||||||
"SUM(share_count) as total_share").
|
"SUM(share_count) as total_share").
|
||||||
Where("EXTRACT(YEAR FROM created_at) = ?", year)
|
Where("EXTRACT(YEAR FROM created_at) = ?", year)
|
||||||
|
|
||||||
|
// Add client filter
|
||||||
|
if clientId != nil {
|
||||||
|
query = query.Where("client_id = ?", clientId)
|
||||||
|
}
|
||||||
|
|
||||||
if userLevelId != nil && *levelNumber != levelNumberTop {
|
if userLevelId != nil && *levelNumber != levelNumberTop {
|
||||||
query = _i.DB.DB.Model(&entity.Articles{}).
|
query = _i.DB.DB.Model(&entity.Articles{}).
|
||||||
Select("EXTRACT(MONTH FROM articles.created_at) as month, EXTRACT(DAY FROM articles.created_at) as day, "+
|
Select("EXTRACT(MONTH FROM articles.created_at) as month, EXTRACT(DAY FROM articles.created_at) as day, "+
|
||||||
|
|
@ -286,6 +365,11 @@ func (_i *articlesRepository) ArticleMonthlyStats(userLevelId *uint, levelNumber
|
||||||
Where("articles.is_active = true").
|
Where("articles.is_active = true").
|
||||||
Where("EXTRACT(YEAR FROM articles.created_at) = ?", year).
|
Where("EXTRACT(YEAR FROM articles.created_at) = ?", year).
|
||||||
Where("(user_levels.id = ? OR user_levels.parent_level_id = ?)", *userLevelId, *userLevelId)
|
Where("(user_levels.id = ? OR user_levels.parent_level_id = ?)", *userLevelId, *userLevelId)
|
||||||
|
|
||||||
|
// Add client filter
|
||||||
|
if clientId != nil {
|
||||||
|
query = query.Where("articles.client_id = ?", clientId)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
err = query.Group("month, day").Scan(&results).Error
|
err = query.Group("month, day").Scan(&results).Error
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
package request
|
package request
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"go-humas-be/app/database/entity"
|
|
||||||
"go-humas-be/utils/paginator"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
|
"web-medols-be/app/database/entity"
|
||||||
|
"web-medols-be/utils/paginator"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ArticlesGeneric interface {
|
type ArticlesGeneric interface {
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
package response
|
package response
|
||||||
|
|
||||||
import (
|
import (
|
||||||
articleCategoriesResponse "go-humas-be/app/module/article_categories/response"
|
|
||||||
articleFilesResponse "go-humas-be/app/module/article_files/response"
|
|
||||||
"time"
|
"time"
|
||||||
|
articleCategoriesResponse "web-medols-be/app/module/article_categories/response"
|
||||||
|
articleFilesResponse "web-medols-be/app/module/article_files/response"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ArticlesResponse struct {
|
type ArticlesResponse struct {
|
||||||
|
|
|
||||||
|
|
@ -5,23 +5,9 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
|
"github.com/google/uuid"
|
||||||
"github.com/minio/minio-go/v7"
|
"github.com/minio/minio-go/v7"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
"go-humas-be/app/database/entity"
|
|
||||||
articleApprovalsRepository "go-humas-be/app/module/article_approvals/repository"
|
|
||||||
articleCategoriesRepository "go-humas-be/app/module/article_categories/repository"
|
|
||||||
articleCategoryDetailsRepository "go-humas-be/app/module/article_category_details/repository"
|
|
||||||
articleCategoryDetailsReq "go-humas-be/app/module/article_category_details/request"
|
|
||||||
articleFilesRepository "go-humas-be/app/module/article_files/repository"
|
|
||||||
"go-humas-be/app/module/articles/mapper"
|
|
||||||
"go-humas-be/app/module/articles/repository"
|
|
||||||
"go-humas-be/app/module/articles/request"
|
|
||||||
"go-humas-be/app/module/articles/response"
|
|
||||||
usersRepository "go-humas-be/app/module/users/repository"
|
|
||||||
config "go-humas-be/config/config"
|
|
||||||
minioStorage "go-humas-be/config/config"
|
|
||||||
"go-humas-be/utils/paginator"
|
|
||||||
utilSvc "go-humas-be/utils/service"
|
|
||||||
"io"
|
"io"
|
||||||
"log"
|
"log"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
|
|
@ -30,6 +16,21 @@ import (
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
"web-medols-be/app/database/entity"
|
||||||
|
articleApprovalsRepository "web-medols-be/app/module/article_approvals/repository"
|
||||||
|
articleCategoriesRepository "web-medols-be/app/module/article_categories/repository"
|
||||||
|
articleCategoryDetailsRepository "web-medols-be/app/module/article_category_details/repository"
|
||||||
|
articleCategoryDetailsReq "web-medols-be/app/module/article_category_details/request"
|
||||||
|
articleFilesRepository "web-medols-be/app/module/article_files/repository"
|
||||||
|
"web-medols-be/app/module/articles/mapper"
|
||||||
|
"web-medols-be/app/module/articles/repository"
|
||||||
|
"web-medols-be/app/module/articles/request"
|
||||||
|
"web-medols-be/app/module/articles/response"
|
||||||
|
usersRepository "web-medols-be/app/module/users/repository"
|
||||||
|
config "web-medols-be/config/config"
|
||||||
|
minioStorage "web-medols-be/config/config"
|
||||||
|
"web-medols-be/utils/paginator"
|
||||||
|
utilSvc "web-medols-be/utils/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ArticlesService
|
// ArticlesService
|
||||||
|
|
@ -47,21 +48,21 @@ type articlesService struct {
|
||||||
|
|
||||||
// ArticlesService define interface of IArticlesService
|
// ArticlesService define interface of IArticlesService
|
||||||
type ArticlesService interface {
|
type ArticlesService interface {
|
||||||
All(req request.ArticlesQueryRequest) (articles []*response.ArticlesResponse, paging paginator.Pagination, err error)
|
All(clientId *uuid.UUID, req request.ArticlesQueryRequest) (articles []*response.ArticlesResponse, paging paginator.Pagination, err error)
|
||||||
Show(id uint) (articles *response.ArticlesResponse, err error)
|
Show(clientId *uuid.UUID, id uint) (articles *response.ArticlesResponse, err error)
|
||||||
ShowByOldId(oldId uint) (articles *response.ArticlesResponse, err error)
|
ShowByOldId(clientId *uuid.UUID, oldId uint) (articles *response.ArticlesResponse, err error)
|
||||||
Save(req request.ArticlesCreateRequest, authToken string) (articles *entity.Articles, err error)
|
Save(clientId *uuid.UUID, req request.ArticlesCreateRequest, authToken string) (articles *entity.Articles, err error)
|
||||||
SaveThumbnail(c *fiber.Ctx) (err error)
|
SaveThumbnail(clientId *uuid.UUID, c *fiber.Ctx) (err error)
|
||||||
Update(id uint, req request.ArticlesUpdateRequest) (err error)
|
Update(clientId *uuid.UUID, id uint, req request.ArticlesUpdateRequest) (err error)
|
||||||
Delete(id uint) error
|
Delete(clientId *uuid.UUID, id uint) error
|
||||||
UpdateActivityCount(id uint, activityTypeId int) (err error)
|
UpdateActivityCount(clientId *uuid.UUID, id uint, activityTypeId int) (err error)
|
||||||
UpdateApproval(id uint, statusId int, userLevelId int, userLevelNumber int, userParentLevelId int) (err error)
|
UpdateApproval(clientId *uuid.UUID, id uint, statusId int, userLevelId int, userLevelNumber int, userParentLevelId int) (err error)
|
||||||
UpdateBanner(id uint, isBanner bool) error
|
UpdateBanner(clientId *uuid.UUID, id uint, isBanner bool) error
|
||||||
Viewer(c *fiber.Ctx) error
|
Viewer(clientId *uuid.UUID, c *fiber.Ctx) error
|
||||||
SummaryStats(authToken string) (summaryStats *response.ArticleSummaryStats, err error)
|
SummaryStats(clientId *uuid.UUID, authToken string) (summaryStats *response.ArticleSummaryStats, err error)
|
||||||
ArticlePerUserLevelStats(authToken string, startDate *string, endDate *string) (articlePerUserLevelStats []*response.ArticlePerUserLevelStats, err error)
|
ArticlePerUserLevelStats(clientId *uuid.UUID, authToken string, startDate *string, endDate *string) (articlePerUserLevelStats []*response.ArticlePerUserLevelStats, err error)
|
||||||
ArticleMonthlyStats(authToken string, year *int) (articleMonthlyStats []*response.ArticleMonthlyStats, err error)
|
ArticleMonthlyStats(clientId *uuid.UUID, authToken string, year *int) (articleMonthlyStats []*response.ArticleMonthlyStats, err error)
|
||||||
PublishScheduling(id uint, publishSchedule string) error
|
PublishScheduling(clientId *uuid.UUID, id uint, publishSchedule string) error
|
||||||
ExecuteScheduling() error
|
ExecuteScheduling() error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -92,7 +93,7 @@ func NewArticlesService(
|
||||||
}
|
}
|
||||||
|
|
||||||
// All implement interface of ArticlesService
|
// All implement interface of ArticlesService
|
||||||
func (_i *articlesService) All(req request.ArticlesQueryRequest) (articless []*response.ArticlesResponse, paging paginator.Pagination, err error) {
|
func (_i *articlesService) All(clientId *uuid.UUID, req request.ArticlesQueryRequest) (articless []*response.ArticlesResponse, paging paginator.Pagination, err error) {
|
||||||
if req.Category != nil {
|
if req.Category != nil {
|
||||||
findCategory, err := _i.ArticleCategoriesRepo.FindOneBySlug(*req.Category)
|
findCategory, err := _i.ArticleCategoriesRepo.FindOneBySlug(*req.Category)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -101,7 +102,7 @@ func (_i *articlesService) All(req request.ArticlesQueryRequest) (articless []*r
|
||||||
req.CategoryId = &findCategory.ID
|
req.CategoryId = &findCategory.ID
|
||||||
}
|
}
|
||||||
|
|
||||||
results, paging, err := _i.Repo.GetAll(req)
|
results, paging, err := _i.Repo.GetAll(clientId, req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
@ -113,36 +114,36 @@ func (_i *articlesService) All(req request.ArticlesQueryRequest) (articless []*r
|
||||||
host := _i.Cfg.App.Domain
|
host := _i.Cfg.App.Domain
|
||||||
|
|
||||||
for _, result := range results {
|
for _, result := range results {
|
||||||
articleRes := mapper.ArticlesResponseMapper(_i.Log, host, result, _i.ArticleCategoriesRepo, _i.ArticleCategoryDetailsRepo, _i.ArticleFilesRepo, _i.UsersRepo)
|
articleRes := mapper.ArticlesResponseMapper(_i.Log, host, clientId, result, _i.ArticleCategoriesRepo, _i.ArticleCategoryDetailsRepo, _i.ArticleFilesRepo, _i.UsersRepo)
|
||||||
articless = append(articless, articleRes)
|
articless = append(articless, articleRes)
|
||||||
}
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articlesService) Show(id uint) (articles *response.ArticlesResponse, err error) {
|
func (_i *articlesService) Show(clientId *uuid.UUID, id uint) (articles *response.ArticlesResponse, err error) {
|
||||||
result, err := _i.Repo.FindOne(id)
|
result, err := _i.Repo.FindOne(clientId, id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
host := _i.Cfg.App.Domain
|
host := _i.Cfg.App.Domain
|
||||||
|
|
||||||
return mapper.ArticlesResponseMapper(_i.Log, host, result, _i.ArticleCategoriesRepo, _i.ArticleCategoryDetailsRepo, _i.ArticleFilesRepo, _i.UsersRepo), nil
|
return mapper.ArticlesResponseMapper(_i.Log, host, clientId, result, _i.ArticleCategoriesRepo, _i.ArticleCategoryDetailsRepo, _i.ArticleFilesRepo, _i.UsersRepo), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articlesService) ShowByOldId(oldId uint) (articles *response.ArticlesResponse, err error) {
|
func (_i *articlesService) ShowByOldId(clientId *uuid.UUID, oldId uint) (articles *response.ArticlesResponse, err error) {
|
||||||
result, err := _i.Repo.FindByOldId(oldId)
|
result, err := _i.Repo.FindByOldId(clientId, oldId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
host := _i.Cfg.App.Domain
|
host := _i.Cfg.App.Domain
|
||||||
|
|
||||||
return mapper.ArticlesResponseMapper(_i.Log, host, result, _i.ArticleCategoriesRepo, _i.ArticleCategoryDetailsRepo, _i.ArticleFilesRepo, _i.UsersRepo), nil
|
return mapper.ArticlesResponseMapper(_i.Log, host, clientId, result, _i.ArticleCategoriesRepo, _i.ArticleCategoryDetailsRepo, _i.ArticleFilesRepo, _i.UsersRepo), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articlesService) Save(req request.ArticlesCreateRequest, authToken string) (articles *entity.Articles, err error) {
|
func (_i *articlesService) Save(clientId *uuid.UUID, req request.ArticlesCreateRequest, authToken string) (articles *entity.Articles, err error) {
|
||||||
_i.Log.Info().Interface("data", req).Msg("")
|
_i.Log.Info().Interface("data", req).Msg("")
|
||||||
newReq := req.ToEntity()
|
newReq := req.ToEntity()
|
||||||
|
|
||||||
|
|
@ -207,7 +208,7 @@ func (_i *articlesService) Save(req request.ArticlesCreateRequest, authToken str
|
||||||
newReq.PublishedAt = nil
|
newReq.PublishedAt = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
saveArticleRes, err := _i.Repo.Create(newReq)
|
saveArticleRes, err := _i.Repo.Create(clientId, newReq)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
@ -278,7 +279,7 @@ func (_i *articlesService) Save(req request.ArticlesCreateRequest, authToken str
|
||||||
return saveArticleRes, nil
|
return saveArticleRes, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articlesService) SaveThumbnail(c *fiber.Ctx) (err error) {
|
func (_i *articlesService) SaveThumbnail(clientId *uuid.UUID, c *fiber.Ctx) (err error) {
|
||||||
|
|
||||||
id, err := strconv.ParseUint(c.Params("id"), 10, 0)
|
id, err := strconv.ParseUint(c.Params("id"), 10, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -333,10 +334,10 @@ func (_i *articlesService) SaveThumbnail(c *fiber.Ctx) (err error) {
|
||||||
newFilename := newFilenameWithoutExt + "." + extension
|
newFilename := newFilenameWithoutExt + "." + extension
|
||||||
objectName := fmt.Sprintf("articles/thumbnail/%d/%d/%s", now.Year(), now.Month(), newFilename)
|
objectName := fmt.Sprintf("articles/thumbnail/%d/%d/%s", now.Year(), now.Month(), newFilename)
|
||||||
|
|
||||||
findCategory, err := _i.Repo.FindOne(uint(id))
|
findCategory, err := _i.Repo.FindOne(clientId, uint(id))
|
||||||
findCategory.ThumbnailName = &newFilename
|
findCategory.ThumbnailName = &newFilename
|
||||||
findCategory.ThumbnailPath = &objectName
|
findCategory.ThumbnailPath = &objectName
|
||||||
err = _i.Repo.Update(uint(id), findCategory)
|
err = _i.Repo.Update(clientId, uint(id), findCategory)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -351,7 +352,7 @@ func (_i *articlesService) SaveThumbnail(c *fiber.Ctx) (err error) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articlesService) Update(id uint, req request.ArticlesUpdateRequest) (err error) {
|
func (_i *articlesService) Update(clientId *uuid.UUID, id uint, req request.ArticlesUpdateRequest) (err error) {
|
||||||
_i.Log.Info().Interface("data", req).Msg("")
|
_i.Log.Info().Interface("data", req).Msg("")
|
||||||
newReq := req.ToEntity()
|
newReq := req.ToEntity()
|
||||||
|
|
||||||
|
|
@ -364,27 +365,27 @@ func (_i *articlesService) Update(id uint, req request.ArticlesUpdateRequest) (e
|
||||||
newReq.CreatedAt = parsedTime
|
newReq.CreatedAt = parsedTime
|
||||||
}
|
}
|
||||||
|
|
||||||
return _i.Repo.UpdateSkipNull(id, newReq)
|
return _i.Repo.UpdateSkipNull(clientId, id, newReq)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articlesService) Delete(id uint) error {
|
func (_i *articlesService) Delete(clientId *uuid.UUID, id uint) error {
|
||||||
result, err := _i.Repo.FindOne(id)
|
result, err := _i.Repo.FindOne(clientId, id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
isActive := false
|
isActive := false
|
||||||
result.IsActive = &isActive
|
result.IsActive = &isActive
|
||||||
return _i.Repo.Update(id, result)
|
return _i.Repo.Update(clientId, id, result)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articlesService) Viewer(c *fiber.Ctx) (err error) {
|
func (_i *articlesService) Viewer(clientId *uuid.UUID, c *fiber.Ctx) (err error) {
|
||||||
thumbnailName := c.Params("thumbnailName")
|
thumbnailName := c.Params("thumbnailName")
|
||||||
|
|
||||||
emptyImage := "empty-image.jpg"
|
emptyImage := "empty-image.jpg"
|
||||||
searchThumbnail := emptyImage
|
searchThumbnail := emptyImage
|
||||||
if thumbnailName != emptyImage {
|
if thumbnailName != emptyImage {
|
||||||
result, err := _i.Repo.FindByFilename(thumbnailName)
|
result, err := _i.Repo.FindByFilename(clientId, thumbnailName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -439,8 +440,8 @@ func (_i *articlesService) Viewer(c *fiber.Ctx) (err error) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articlesService) UpdateActivityCount(id uint, activityTypeId int) error {
|
func (_i *articlesService) UpdateActivityCount(clientId *uuid.UUID, id uint, activityTypeId int) error {
|
||||||
result, err := _i.Repo.FindOne(id)
|
result, err := _i.Repo.FindOne(clientId, id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -468,20 +469,20 @@ func (_i *articlesService) UpdateActivityCount(id uint, activityTypeId int) erro
|
||||||
result.ViewCount = &viewCount
|
result.ViewCount = &viewCount
|
||||||
result.ShareCount = &shareCount
|
result.ShareCount = &shareCount
|
||||||
result.CommentCount = &commentCount
|
result.CommentCount = &commentCount
|
||||||
return _i.Repo.Update(id, result)
|
return _i.Repo.Update(clientId, id, result)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articlesService) SummaryStats(authToken string) (summaryStats *response.ArticleSummaryStats, err error) {
|
func (_i *articlesService) SummaryStats(clientId *uuid.UUID, authToken string) (summaryStats *response.ArticleSummaryStats, err error) {
|
||||||
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
|
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
|
||||||
|
|
||||||
result, err := _i.Repo.SummaryStats(user.ID)
|
result, err := _i.Repo.SummaryStats(clientId, user.ID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return result, nil
|
return result, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articlesService) ArticlePerUserLevelStats(authToken string, startDate *string, endDate *string) (articlePerUserLevelStats []*response.ArticlePerUserLevelStats, err error) {
|
func (_i *articlesService) ArticlePerUserLevelStats(clientId *uuid.UUID, authToken string, startDate *string, endDate *string) (articlePerUserLevelStats []*response.ArticlePerUserLevelStats, err error) {
|
||||||
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
|
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
|
||||||
|
|
||||||
_i.Log.Info().Str("timestamp", time.Now().
|
_i.Log.Info().Str("timestamp", time.Now().
|
||||||
|
|
@ -506,14 +507,14 @@ func (_i *articlesService) ArticlePerUserLevelStats(authToken string, startDate
|
||||||
Format(time.RFC3339)).Str("Service:Resource", "articlesService:ArticlePerUserLevelStats").
|
Format(time.RFC3339)).Str("Service:Resource", "articlesService:ArticlePerUserLevelStats").
|
||||||
Interface("userLevelNumber", userLevelNumber).Msg("")
|
Interface("userLevelNumber", userLevelNumber).Msg("")
|
||||||
|
|
||||||
result, err := _i.Repo.ArticlePerUserLevelStats(userLevelId, userLevelNumber, nil, nil)
|
result, err := _i.Repo.ArticlePerUserLevelStats(clientId, userLevelId, userLevelNumber, nil, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return result, nil
|
return result, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articlesService) ArticleMonthlyStats(authToken string, year *int) (articleMonthlyStats []*response.ArticleMonthlyStats, err error) {
|
func (_i *articlesService) ArticleMonthlyStats(clientId *uuid.UUID, authToken string, year *int) (articleMonthlyStats []*response.ArticleMonthlyStats, err error) {
|
||||||
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
|
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
|
||||||
|
|
||||||
var userLevelId *uint
|
var userLevelId *uint
|
||||||
|
|
@ -524,15 +525,15 @@ func (_i *articlesService) ArticleMonthlyStats(authToken string, year *int) (art
|
||||||
userLevelNumber = &user.UserLevel.LevelNumber
|
userLevelNumber = &user.UserLevel.LevelNumber
|
||||||
}
|
}
|
||||||
|
|
||||||
result, err := _i.Repo.ArticleMonthlyStats(userLevelId, userLevelNumber, *year)
|
result, err := _i.Repo.ArticleMonthlyStats(clientId, userLevelId, userLevelNumber, *year)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return result, nil
|
return result, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articlesService) UpdateApproval(id uint, statusId int, userLevelId int, userLevelNumber int, userParentLevelId int) (err error) {
|
func (_i *articlesService) UpdateApproval(clientId *uuid.UUID, id uint, statusId int, userLevelId int, userLevelNumber int, userParentLevelId int) (err error) {
|
||||||
result, err := _i.Repo.FindOne(id)
|
result, err := _i.Repo.FindOne(clientId, id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -576,7 +577,7 @@ func (_i *articlesService) UpdateApproval(id uint, statusId int, userLevelId int
|
||||||
result.HasApprovedBy = nil
|
result.HasApprovedBy = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
err = _i.Repo.Update(id, result)
|
err = _i.Repo.Update(clientId, id, result)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -584,26 +585,27 @@ func (_i *articlesService) UpdateApproval(id uint, statusId int, userLevelId int
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articlesService) PublishScheduling(id uint, publishSchedule string) error {
|
func (_i *articlesService) PublishScheduling(clientId *uuid.UUID, id uint, publishSchedule string) error {
|
||||||
result, err := _i.Repo.FindOne(id)
|
result, err := _i.Repo.FindOne(clientId, id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
result.PublishSchedule = &publishSchedule
|
result.PublishSchedule = &publishSchedule
|
||||||
return _i.Repo.Update(id, result)
|
return _i.Repo.Update(clientId, id, result)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articlesService) UpdateBanner(id uint, isBanner bool) error {
|
func (_i *articlesService) UpdateBanner(clientId *uuid.UUID, id uint, isBanner bool) error {
|
||||||
result, err := _i.Repo.FindOne(id)
|
result, err := _i.Repo.FindOne(clientId, id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
result.IsBanner = &isBanner
|
result.IsBanner = &isBanner
|
||||||
return _i.Repo.Update(id, result)
|
return _i.Repo.Update(clientId, id, result)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_i *articlesService) ExecuteScheduling() error {
|
func (_i *articlesService) ExecuteScheduling() error {
|
||||||
articles, err := _i.Repo.GetAllPublishSchedule()
|
// For background jobs, we don't have context, so pass nil for clientId
|
||||||
|
articles, err := _i.Repo.GetAllPublishSchedule(nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -631,7 +633,8 @@ func (_i *articlesService) ExecuteScheduling() error {
|
||||||
article.PublishedAt = &now
|
article.PublishedAt = &now
|
||||||
article.StatusId = &statusIdTwo
|
article.StatusId = &statusIdTwo
|
||||||
|
|
||||||
if err := _i.Repo.Update(article.ID, article); err != nil {
|
// For background jobs, we don't have context, so pass nil for clientId
|
||||||
|
if err := _i.Repo.UpdateSkipNull(nil, article.ID, article); err != nil {
|
||||||
_i.Log.Info().Str("timestamp", time.Now().
|
_i.Log.Info().Str("timestamp", time.Now().
|
||||||
Format(time.RFC3339)).Str("Service:articlesService", "Methods:ExecuteScheduling").
|
Format(time.RFC3339)).Str("Service:articlesService", "Methods:ExecuteScheduling").
|
||||||
Interface("Failed to publish Article ID : ", article.ID).Msg("")
|
Interface("Failed to publish Article ID : ", article.ID).Msg("")
|
||||||
|
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue