initial commit
This commit is contained in:
parent
4d9b323691
commit
53e56ea285
|
|
@ -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-medols-be/build?token=autodeploymedols
|
- curl --user $JENKINS_USER:$JENKINS_PWD http://38.47.180.165:8080/job/autodeploy-netidhub-be/build?token=autodeploynetidhub
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
package article_category_details
|
package article_category_details
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
entity "netidhub-saas-be/app/database/entity"
|
||||||
"time"
|
"time"
|
||||||
entity "web-medols-be/app/database/entity"
|
|
||||||
|
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,26 @@
|
||||||
|
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"`
|
||||||
|
Description *string `json:"description" gorm:"type:text"`
|
||||||
|
ClientType string `json:"client_type" gorm:"type:varchar;default:'sub_client'"` // 'parent_client', 'sub_client', 'standalone'
|
||||||
|
ParentClientId *uuid.UUID `json:"parent_client_id" gorm:"type:UUID;index"`
|
||||||
|
ParentClient *Clients `json:"parent_client,omitempty" gorm:"foreignKey:ParentClientId;references:ID"`
|
||||||
|
SubClients []Clients `json:"sub_clients,omitempty" gorm:"foreignKey:ParentClientId;references:ID"`
|
||||||
|
|
||||||
|
// Metadata
|
||||||
|
Settings *string `json:"settings" gorm:"type:jsonb"` // JSON for custom settings
|
||||||
|
MaxUsers *int `json:"max_users" gorm:"type:int4"` // Limit for sub clients
|
||||||
|
MaxStorage *int64 `json:"max_storage" gorm:"type:int8"` // In bytes
|
||||||
|
|
||||||
|
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,15 +0,0 @@
|
||||||
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()"`
|
|
||||||
}
|
|
||||||
|
|
@ -0,0 +1,38 @@
|
||||||
|
package entity
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/google/uuid"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// UserClientAccess represents many-to-many relationship between Users and Clients
|
||||||
|
// This allows users to have access to multiple clients (multi-tenant access)
|
||||||
|
type UserClientAccess struct {
|
||||||
|
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
|
||||||
|
UserId uint `json:"user_id" gorm:"type:int4;not null;index:idx_user_client_access"`
|
||||||
|
ClientId uuid.UUID `json:"client_id" gorm:"type:UUID;not null;index:idx_user_client_access"`
|
||||||
|
|
||||||
|
// Access control
|
||||||
|
AccessType string `json:"access_type" gorm:"type:varchar;default:'read'"` // 'read', 'write', 'admin', 'owner'
|
||||||
|
CanManage *bool `json:"can_manage" gorm:"type:bool;default:false"` // Can manage client settings
|
||||||
|
CanDelegate *bool `json:"can_delegate" gorm:"type:bool;default:false"` // Can give access to other users
|
||||||
|
|
||||||
|
// If user has access to parent, they automatically have access to all sub-clients
|
||||||
|
IncludeSubClients *bool `json:"include_sub_clients" gorm:"type:bool;default:false"`
|
||||||
|
|
||||||
|
// Relationships
|
||||||
|
User *Users `json:"user,omitempty" gorm:"foreignKey:UserId;references:ID"`
|
||||||
|
Client *Clients `json:"client,omitempty" gorm:"foreignKey:ClientId;references:ID"`
|
||||||
|
|
||||||
|
GrantedById *uint `json:"granted_by_id" gorm:"type:int4"` // Who granted this access
|
||||||
|
GrantedBy *Users `json:"granted_by,omitempty" gorm:"foreignKey:GrantedById;references:ID"`
|
||||||
|
|
||||||
|
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()"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// TableName overrides the table name
|
||||||
|
func (UserClientAccess) TableName() string {
|
||||||
|
return "user_client_access"
|
||||||
|
}
|
||||||
|
|
@ -29,7 +29,12 @@ 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"`
|
|
||||||
|
// Multi-tenant access control
|
||||||
|
IsSuperAdmin *bool `json:"is_super_admin" gorm:"type:bool;default:false"` // Platform super admin (access all clients)
|
||||||
|
ClientId *uuid.UUID `json:"client_id" gorm:"type:UUID"` // Primary/default client
|
||||||
|
ClientAccesses []UserClientAccess `json:"client_accesses,omitempty" gorm:"foreignKey:UserId;references:ID"` // Multiple client access
|
||||||
|
|
||||||
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,8 +2,8 @@ package users
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
|
"netidhub-saas-be/app/database/entity"
|
||||||
"time"
|
"time"
|
||||||
"web-medols-be/app/database/entity"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Users struct {
|
type Users struct {
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
package database
|
package database
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"web-medols-be/app/database/entity"
|
"netidhub-saas-be/app/database/entity"
|
||||||
"web-medols-be/app/database/entity/article_category_details"
|
"netidhub-saas-be/app/database/entity/article_category_details"
|
||||||
"web-medols-be/config/config"
|
"netidhub-saas-be/config/config"
|
||||||
|
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
"gorm.io/driver/postgres"
|
"gorm.io/driver/postgres"
|
||||||
|
|
@ -122,6 +122,7 @@ func Models() []interface{} {
|
||||||
entity.UserRoleAccesses{},
|
entity.UserRoleAccesses{},
|
||||||
entity.Users{},
|
entity.Users{},
|
||||||
entity.UserRoleLevelDetails{},
|
entity.UserRoleLevelDetails{},
|
||||||
|
entity.UserClientAccess{}, // New: Multi-client access for users
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ package seeds
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
"web-medols-be/app/database/entity"
|
"netidhub-saas-be/app/database/entity"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ActivityLogsSeeder struct{}
|
type ActivityLogsSeeder struct{}
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ package seeds
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
"web-medols-be/app/database/entity"
|
"netidhub-saas-be/app/database/entity"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ApprovalWorkflowsSeeder struct{}
|
type ApprovalWorkflowsSeeder struct{}
|
||||||
|
|
@ -109,4 +109,4 @@ func (ApprovalWorkflowsSeeder) Count(conn *gorm.DB) (int, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
return int(workflowCount + stepCount), nil
|
return int(workflowCount + stepCount), nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ package seeds
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
"web-medols-be/app/database/entity"
|
"netidhub-saas-be/app/database/entity"
|
||||||
)
|
)
|
||||||
|
|
||||||
type MasterApprovalStatusesSeeder struct{}
|
type MasterApprovalStatusesSeeder struct{}
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ package seeds
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
"web-medols-be/app/database/entity"
|
"netidhub-saas-be/app/database/entity"
|
||||||
)
|
)
|
||||||
|
|
||||||
type MasterStatusesSeeder struct{}
|
type MasterStatusesSeeder struct{}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
package seeds
|
package seeds
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"web-medols-be/app/database/entity"
|
"netidhub-saas-be/app/database/entity"
|
||||||
|
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
)
|
)
|
||||||
|
|
@ -13,8 +13,8 @@ func CreateNoApprovalWorkflow() *entity.ApprovalWorkflows {
|
||||||
Description: &[]string{"Workflow for clients that don't require approval process"}[0],
|
Description: &[]string{"Workflow for clients that don't require approval process"}[0],
|
||||||
IsDefault: &[]bool{false}[0],
|
IsDefault: &[]bool{false}[0],
|
||||||
IsActive: &[]bool{true}[0],
|
IsActive: &[]bool{true}[0],
|
||||||
RequiresApproval: &[]bool{false}[0], // This is the key field
|
RequiresApproval: &[]bool{false}[0], // This is the key field
|
||||||
AutoPublish: &[]bool{true}[0], // Auto publish articles
|
AutoPublish: &[]bool{true}[0], // Auto publish articles
|
||||||
Steps: []entity.ApprovalWorkflowSteps{}, // No steps needed
|
Steps: []entity.ApprovalWorkflowSteps{}, // No steps needed
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -23,14 +23,14 @@ func CreateNoApprovalWorkflow() *entity.ApprovalWorkflows {
|
||||||
func CreateClientApprovalSettings(clientId string, requiresApproval bool) *entity.ClientApprovalSettings {
|
func CreateClientApprovalSettings(clientId string, requiresApproval bool) *entity.ClientApprovalSettings {
|
||||||
clientUUID, _ := uuid.Parse(clientId)
|
clientUUID, _ := uuid.Parse(clientId)
|
||||||
return &entity.ClientApprovalSettings{
|
return &entity.ClientApprovalSettings{
|
||||||
ClientId: clientUUID,
|
ClientId: clientUUID,
|
||||||
RequiresApproval: &[]bool{requiresApproval}[0],
|
RequiresApproval: &[]bool{requiresApproval}[0],
|
||||||
AutoPublishArticles: &[]bool{!requiresApproval}[0], // Auto publish if no approval needed
|
AutoPublishArticles: &[]bool{!requiresApproval}[0], // Auto publish if no approval needed
|
||||||
IsActive: &[]bool{true}[0],
|
IsActive: &[]bool{true}[0],
|
||||||
ApprovalExemptUsers: []uint{},
|
ApprovalExemptUsers: []uint{},
|
||||||
ApprovalExemptRoles: []uint{},
|
ApprovalExemptRoles: []uint{},
|
||||||
ApprovalExemptCategories: []uint{},
|
ApprovalExemptCategories: []uint{},
|
||||||
RequireApprovalFor: []string{},
|
RequireApprovalFor: []string{},
|
||||||
SkipApprovalFor: []string{},
|
SkipApprovalFor: []string{},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,10 +5,10 @@ import (
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
"log"
|
"log"
|
||||||
|
"netidhub-saas-be/app/database/entity"
|
||||||
|
utilSvc "netidhub-saas-be/utils/service"
|
||||||
"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 {
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,9 @@
|
||||||
package middleware
|
package middleware
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"netidhub-saas-be/app/database/entity"
|
||||||
|
"netidhub-saas-be/utils/client"
|
||||||
"strings"
|
"strings"
|
||||||
"web-medols-be/app/database/entity"
|
|
||||||
|
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
|
|
@ -10,8 +11,12 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
ClientKeyHeader = "X-Client-Key"
|
ClientKeyHeader = "X-Client-Key"
|
||||||
ClientContextKey = "client_id"
|
ClientContextKey = "client_id"
|
||||||
|
UserIDContextKey = "user_id"
|
||||||
|
IsSuperAdminContextKey = "is_super_admin"
|
||||||
|
AccessibleClientIDsKey = "accessible_client_ids"
|
||||||
|
CurrentClientIDKey = "current_client_id"
|
||||||
)
|
)
|
||||||
|
|
||||||
// excludedPaths contains paths that don't require client key validation
|
// excludedPaths contains paths that don't require client key validation
|
||||||
|
|
@ -57,6 +62,7 @@ func isPathExcluded(path string) bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
// ClientMiddleware extracts and validates the Client Key from request headers
|
// ClientMiddleware extracts and validates the Client Key from request headers
|
||||||
|
// Enhanced to support multi-client access and super admin
|
||||||
func ClientMiddleware(db *gorm.DB) fiber.Handler {
|
func ClientMiddleware(db *gorm.DB) fiber.Handler {
|
||||||
return func(c *fiber.Ctx) error {
|
return func(c *fiber.Ctx) error {
|
||||||
// Check if path should be excluded from client key validation
|
// Check if path should be excluded from client key validation
|
||||||
|
|
@ -64,19 +70,65 @@ func ClientMiddleware(db *gorm.DB) fiber.Handler {
|
||||||
return c.Next()
|
return c.Next()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Extract Client Key from header
|
// Check if user ID exists in context (set by auth middleware)
|
||||||
clientKey := c.Get(ClientKeyHeader)
|
userID := c.Locals(UserIDContextKey)
|
||||||
|
if userID != nil {
|
||||||
if clientKey == "" {
|
// User authenticated - use multi-client logic
|
||||||
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
|
return handleAuthenticatedUser(c, db, userID)
|
||||||
"success": false,
|
|
||||||
"code": 400,
|
|
||||||
"messages": []string{"Client Key is required in header: " + ClientKeyHeader},
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse UUID
|
// Fallback to X-Client-Key validation (backward compatibility)
|
||||||
clientUUID, err := uuid.Parse(clientKey)
|
return handleClientKeyValidation(c, db)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// handleAuthenticatedUser handles request from authenticated users
|
||||||
|
func handleAuthenticatedUser(c *fiber.Ctx, db *gorm.DB, userID interface{}) error {
|
||||||
|
userId, ok := userID.(uint)
|
||||||
|
if !ok {
|
||||||
|
return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{
|
||||||
|
"success": false,
|
||||||
|
"code": 401,
|
||||||
|
"messages": []string{"Invalid user ID in context"},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get user details
|
||||||
|
var user entity.Users
|
||||||
|
if err := db.Select("id, is_super_admin, client_id").
|
||||||
|
Where("id = ?", userId).
|
||||||
|
First(&user).Error; err != nil {
|
||||||
|
return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{
|
||||||
|
"success": false,
|
||||||
|
"code": 401,
|
||||||
|
"messages": []string{"User not found"},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Store super admin status
|
||||||
|
isSuperAdmin := user.IsSuperAdmin != nil && *user.IsSuperAdmin
|
||||||
|
c.Locals(IsSuperAdminContextKey, isSuperAdmin)
|
||||||
|
|
||||||
|
// Get accessible client IDs for this user
|
||||||
|
accessibleClientIDs, err := client.GetAccessibleClientIDs(db, userId, isSuperAdmin)
|
||||||
|
if err != nil {
|
||||||
|
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
|
||||||
|
"success": false,
|
||||||
|
"code": 500,
|
||||||
|
"messages": []string{"Error retrieving client access"},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Store accessible client IDs in context
|
||||||
|
c.Locals(AccessibleClientIDsKey, accessibleClientIDs)
|
||||||
|
|
||||||
|
// Determine current client ID (from header or user's primary client)
|
||||||
|
var currentClientID *uuid.UUID
|
||||||
|
clientKeyHeader := c.Get(ClientKeyHeader)
|
||||||
|
|
||||||
|
if clientKeyHeader != "" {
|
||||||
|
// User specified a client via header
|
||||||
|
clientUUID, err := uuid.Parse(clientKeyHeader)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
|
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
|
||||||
"success": false,
|
"success": false,
|
||||||
|
|
@ -85,31 +137,75 @@ func ClientMiddleware(db *gorm.DB) fiber.Handler {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// Validate client exists and is active
|
// Verify user has access to this client
|
||||||
var client entity.Clients
|
hasAccess, err := client.HasAccessToClient(db, userId, clientUUID, isSuperAdmin)
|
||||||
if err := db.Where("id = ? AND is_active = ?", clientUUID, true).First(&client).Error; err != nil {
|
if err != nil || !hasAccess {
|
||||||
if err == gorm.ErrRecordNotFound {
|
return c.Status(fiber.StatusForbidden).JSON(fiber.Map{
|
||||||
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,
|
"success": false,
|
||||||
"code": 500,
|
"code": 403,
|
||||||
"messages": []string{"Error validating Client Key"},
|
"messages": []string{"Access denied to this client"},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// Store client ID in context for use in handlers
|
currentClientID = &clientUUID
|
||||||
c.Locals(ClientContextKey, clientUUID)
|
} else if user.ClientId != nil {
|
||||||
|
// Use user's primary client
|
||||||
return c.Next()
|
currentClientID = user.ClientId
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Store current client ID
|
||||||
|
if currentClientID != nil {
|
||||||
|
c.Locals(CurrentClientIDKey, *currentClientID)
|
||||||
|
c.Locals(ClientContextKey, *currentClientID) // Backward compatibility
|
||||||
|
}
|
||||||
|
|
||||||
|
return c.Next()
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetClientID retrieves the client ID from the context
|
// handleClientKeyValidation validates X-Client-Key header (backward compatibility)
|
||||||
|
func handleClientKeyValidation(c *fiber.Ctx, db *gorm.DB) error {
|
||||||
|
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},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
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"},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
var clientEntity entity.Clients
|
||||||
|
if err := db.Where("id = ? AND is_active = ?", clientUUID, true).First(&clientEntity).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"},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
c.Locals(ClientContextKey, clientUUID)
|
||||||
|
c.Locals(CurrentClientIDKey, clientUUID)
|
||||||
|
|
||||||
|
return c.Next()
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetClientID retrieves the client ID from the context (backward compatibility)
|
||||||
func GetClientID(c *fiber.Ctx) *uuid.UUID {
|
func GetClientID(c *fiber.Ctx) *uuid.UUID {
|
||||||
if clientID, ok := c.Locals(ClientContextKey).(uuid.UUID); ok {
|
if clientID, ok := c.Locals(ClientContextKey).(uuid.UUID); ok {
|
||||||
return &clientID
|
return &clientID
|
||||||
|
|
@ -117,6 +213,30 @@ func GetClientID(c *fiber.Ctx) *uuid.UUID {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetAccessibleClientIDs retrieves all accessible client IDs from context
|
||||||
|
func GetAccessibleClientIDs(c *fiber.Ctx) []uuid.UUID {
|
||||||
|
if clientIDs, ok := c.Locals(AccessibleClientIDsKey).([]uuid.UUID); ok {
|
||||||
|
return clientIDs
|
||||||
|
}
|
||||||
|
return nil // nil = super admin or no restriction
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetCurrentClientID retrieves the current working client ID from context
|
||||||
|
func GetCurrentClientID(c *fiber.Ctx) *uuid.UUID {
|
||||||
|
if clientID, ok := c.Locals(CurrentClientIDKey).(uuid.UUID); ok {
|
||||||
|
return &clientID
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsSuperAdmin checks if the current user is a super admin
|
||||||
|
func IsSuperAdmin(c *fiber.Ctx) bool {
|
||||||
|
if isSuperAdmin, ok := c.Locals(IsSuperAdminContextKey).(bool); ok {
|
||||||
|
return isSuperAdmin
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
// AddExcludedPath adds a new path to the excluded paths list
|
// AddExcludedPath adds a new path to the excluded paths list
|
||||||
func AddExcludedPath(path string) {
|
func AddExcludedPath(path string) {
|
||||||
excludedPaths = append(excludedPaths, path)
|
excludedPaths = append(excludedPaths, path)
|
||||||
|
|
|
||||||
|
|
@ -3,8 +3,8 @@ package middleware
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
|
"netidhub-saas-be/app/database/entity"
|
||||||
"time"
|
"time"
|
||||||
"web-medols-be/app/database/entity"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type PostgresStorage struct {
|
type PostgresStorage struct {
|
||||||
|
|
|
||||||
|
|
@ -2,10 +2,10 @@ package middleware
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"log"
|
"log"
|
||||||
|
"netidhub-saas-be/app/database"
|
||||||
|
"netidhub-saas-be/config/config"
|
||||||
|
utilsSvc "netidhub-saas-be/utils"
|
||||||
"time"
|
"time"
|
||||||
"web-medols-be/app/database"
|
|
||||||
"web-medols-be/config/config"
|
|
||||||
utilsSvc "web-medols-be/utils"
|
|
||||||
|
|
||||||
"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"
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
package middleware
|
package middleware
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"web-medols-be/app/database/entity/users"
|
"netidhub-saas-be/app/database/entity/users"
|
||||||
"web-medols-be/app/module/users/repository"
|
"netidhub-saas-be/app/module/users/repository"
|
||||||
utilSvc "web-medols-be/utils/service"
|
utilSvc "netidhub-saas-be/utils/service"
|
||||||
|
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
package activity_logs
|
package activity_logs
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"web-medols-be/app/module/activity_logs/controller"
|
"netidhub-saas-be/app/module/activity_logs/controller"
|
||||||
"web-medols-be/app/module/activity_logs/repository"
|
"netidhub-saas-be/app/module/activity_logs/repository"
|
||||||
"web-medols-be/app/module/activity_logs/service"
|
"netidhub-saas-be/app/module/activity_logs/service"
|
||||||
|
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
"go.uber.org/fx"
|
"go.uber.org/fx"
|
||||||
|
|
|
||||||
|
|
@ -3,12 +3,12 @@ package controller
|
||||||
import (
|
import (
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"web-medols-be/app/middleware"
|
"netidhub-saas-be/app/middleware"
|
||||||
"web-medols-be/app/module/activity_logs/request"
|
"netidhub-saas-be/app/module/activity_logs/request"
|
||||||
"web-medols-be/app/module/activity_logs/service"
|
"netidhub-saas-be/app/module/activity_logs/service"
|
||||||
"web-medols-be/utils/paginator"
|
"netidhub-saas-be/utils/paginator"
|
||||||
utilRes "web-medols-be/utils/response"
|
utilRes "netidhub-saas-be/utils/response"
|
||||||
utilVal "web-medols-be/utils/validator"
|
utilVal "netidhub-saas-be/utils/validator"
|
||||||
|
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ package controller
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
"web-medols-be/app/module/activity_logs/service"
|
"netidhub-saas-be/app/module/activity_logs/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Controller struct {
|
type Controller struct {
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
package mapper
|
package mapper
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"web-medols-be/app/database/entity"
|
"netidhub-saas-be/app/database/entity"
|
||||||
res "web-medols-be/app/module/activity_logs/response"
|
res "netidhub-saas-be/app/module/activity_logs/response"
|
||||||
)
|
)
|
||||||
|
|
||||||
func ActivityLogsResponseMapper(activityLogsReq *entity.ActivityLogs) (activityLogsRes *res.ActivityLogsResponse) {
|
func ActivityLogsResponseMapper(activityLogsReq *entity.ActivityLogs) (activityLogsRes *res.ActivityLogsResponse) {
|
||||||
|
|
|
||||||
|
|
@ -4,12 +4,12 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
|
"netidhub-saas-be/app/database"
|
||||||
|
"netidhub-saas-be/app/database/entity"
|
||||||
|
"netidhub-saas-be/app/module/activity_logs/request"
|
||||||
|
"netidhub-saas-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 {
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
package request
|
package request
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"netidhub-saas-be/app/database/entity"
|
||||||
|
"netidhub-saas-be/utils/paginator"
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
"web-medols-be/app/database/entity"
|
|
||||||
"web-medols-be/utils/paginator"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type ActivityLogsGeneric interface {
|
type ActivityLogsGeneric interface {
|
||||||
|
|
|
||||||
|
|
@ -3,15 +3,15 @@ package service
|
||||||
import (
|
import (
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
"web-medols-be/app/database/entity"
|
"netidhub-saas-be/app/database/entity"
|
||||||
"web-medols-be/app/module/activity_logs/mapper"
|
"netidhub-saas-be/app/module/activity_logs/mapper"
|
||||||
"web-medols-be/app/module/activity_logs/repository"
|
"netidhub-saas-be/app/module/activity_logs/repository"
|
||||||
"web-medols-be/app/module/activity_logs/request"
|
"netidhub-saas-be/app/module/activity_logs/request"
|
||||||
"web-medols-be/app/module/activity_logs/response"
|
"netidhub-saas-be/app/module/activity_logs/response"
|
||||||
"web-medols-be/app/module/articles/service"
|
"netidhub-saas-be/app/module/articles/service"
|
||||||
usersRepository "web-medols-be/app/module/users/repository"
|
usersRepository "netidhub-saas-be/app/module/users/repository"
|
||||||
"web-medols-be/utils/paginator"
|
"netidhub-saas-be/utils/paginator"
|
||||||
utilSvc "web-medols-be/utils/service"
|
utilSvc "netidhub-saas-be/utils/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ActivityLogsService
|
// ActivityLogsService
|
||||||
|
|
|
||||||
|
|
@ -3,9 +3,9 @@ package advertisement
|
||||||
import (
|
import (
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
"go.uber.org/fx"
|
"go.uber.org/fx"
|
||||||
"web-medols-be/app/module/advertisement/controller"
|
"netidhub-saas-be/app/module/advertisement/controller"
|
||||||
"web-medols-be/app/module/advertisement/repository"
|
"netidhub-saas-be/app/module/advertisement/repository"
|
||||||
"web-medols-be/app/module/advertisement/service"
|
"netidhub-saas-be/app/module/advertisement/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
// struct of AdvertisementRouter
|
// struct of AdvertisementRouter
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,17 @@
|
||||||
package controller
|
package controller
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"netidhub-saas-be/app/middleware"
|
||||||
|
"netidhub-saas-be/app/module/advertisement/request"
|
||||||
|
"netidhub-saas-be/app/module/advertisement/service"
|
||||||
|
"netidhub-saas-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"
|
|
||||||
|
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
|
|
||||||
utilRes "web-medols-be/utils/response"
|
utilRes "netidhub-saas-be/utils/response"
|
||||||
utilVal "web-medols-be/utils/validator"
|
utilVal "netidhub-saas-be/utils/validator"
|
||||||
)
|
)
|
||||||
|
|
||||||
type advertisementController struct {
|
type advertisementController struct {
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ package controller
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
"web-medols-be/app/module/advertisement/service"
|
"netidhub-saas-be/app/module/advertisement/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Controller struct {
|
type Controller struct {
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
package mapper
|
package mapper
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"web-medols-be/app/database/entity"
|
"netidhub-saas-be/app/database/entity"
|
||||||
res "web-medols-be/app/module/advertisement/response"
|
res "netidhub-saas-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) {
|
||||||
|
|
|
||||||
|
|
@ -4,12 +4,12 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
|
"netidhub-saas-be/app/database"
|
||||||
|
"netidhub-saas-be/app/database/entity"
|
||||||
|
"netidhub-saas-be/app/module/advertisement/request"
|
||||||
|
"netidhub-saas-be/utils/paginator"
|
||||||
|
utilSvc "netidhub-saas-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 {
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
package request
|
package request
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"netidhub-saas-be/app/database/entity"
|
||||||
|
"netidhub-saas-be/utils/paginator"
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
"web-medols-be/app/database/entity"
|
|
||||||
"web-medols-be/utils/paginator"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type AdvertisementGeneric interface {
|
type AdvertisementGeneric interface {
|
||||||
|
|
|
||||||
|
|
@ -11,19 +11,19 @@ import (
|
||||||
"log"
|
"log"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"mime"
|
"mime"
|
||||||
|
"netidhub-saas-be/app/database/entity"
|
||||||
|
"netidhub-saas-be/app/module/advertisement/mapper"
|
||||||
|
"netidhub-saas-be/app/module/advertisement/repository"
|
||||||
|
"netidhub-saas-be/app/module/advertisement/request"
|
||||||
|
"netidhub-saas-be/app/module/advertisement/response"
|
||||||
|
usersRepository "netidhub-saas-be/app/module/users/repository"
|
||||||
|
config "netidhub-saas-be/config/config"
|
||||||
|
minioStorage "netidhub-saas-be/config/config"
|
||||||
|
"netidhub-saas-be/utils/paginator"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"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
|
||||||
|
|
|
||||||
|
|
@ -3,9 +3,9 @@ package approval_workflow_steps
|
||||||
import (
|
import (
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
"go.uber.org/fx"
|
"go.uber.org/fx"
|
||||||
"web-medols-be/app/module/approval_workflow_steps/controller"
|
"netidhub-saas-be/app/module/approval_workflow_steps/controller"
|
||||||
"web-medols-be/app/module/approval_workflow_steps/repository"
|
"netidhub-saas-be/app/module/approval_workflow_steps/repository"
|
||||||
"web-medols-be/app/module/approval_workflow_steps/service"
|
"netidhub-saas-be/app/module/approval_workflow_steps/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ApprovalWorkflowStepsRouter struct of ApprovalWorkflowStepsRouter
|
// ApprovalWorkflowStepsRouter struct of ApprovalWorkflowStepsRouter
|
||||||
|
|
@ -54,4 +54,4 @@ func (_i *ApprovalWorkflowStepsRouter) RegisterApprovalWorkflowStepsRoutes() {
|
||||||
router.Post("/bulk", approvalWorkflowStepsController.BulkSave)
|
router.Post("/bulk", approvalWorkflowStepsController.BulkSave)
|
||||||
router.Put("/workflow/:workflowId/reorder", approvalWorkflowStepsController.Reorder)
|
router.Put("/workflow/:workflowId/reorder", approvalWorkflowStepsController.Reorder)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,14 @@
|
||||||
package controller
|
package controller
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"netidhub-saas-be/app/database/entity"
|
||||||
|
"netidhub-saas-be/app/middleware"
|
||||||
|
"netidhub-saas-be/app/module/approval_workflow_steps/request"
|
||||||
|
"netidhub-saas-be/app/module/approval_workflow_steps/service"
|
||||||
|
"netidhub-saas-be/utils/paginator"
|
||||||
|
utilRes "netidhub-saas-be/utils/response"
|
||||||
|
utilVal "netidhub-saas-be/utils/validator"
|
||||||
"strconv"
|
"strconv"
|
||||||
"web-medols-be/app/database/entity"
|
|
||||||
"web-medols-be/app/middleware"
|
|
||||||
"web-medols-be/app/module/approval_workflow_steps/request"
|
|
||||||
"web-medols-be/app/module/approval_workflow_steps/service"
|
|
||||||
"web-medols-be/utils/paginator"
|
|
||||||
utilRes "web-medols-be/utils/response"
|
|
||||||
utilVal "web-medols-be/utils/validator"
|
|
||||||
|
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
|
|
|
||||||
|
|
@ -3,9 +3,9 @@ package mapper
|
||||||
import (
|
import (
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
"web-medols-be/app/database/entity"
|
"netidhub-saas-be/app/database/entity"
|
||||||
res "web-medols-be/app/module/approval_workflow_steps/response"
|
res "netidhub-saas-be/app/module/approval_workflow_steps/response"
|
||||||
usersRepository "web-medols-be/app/module/users/repository"
|
usersRepository "netidhub-saas-be/app/module/users/repository"
|
||||||
)
|
)
|
||||||
|
|
||||||
func ApprovalWorkflowStepsResponseMapper(
|
func ApprovalWorkflowStepsResponseMapper(
|
||||||
|
|
@ -28,17 +28,17 @@ func ApprovalWorkflowStepsResponseMapper(
|
||||||
}
|
}
|
||||||
|
|
||||||
approvalWorkflowStepsRes = &res.ApprovalWorkflowStepsResponse{
|
approvalWorkflowStepsRes = &res.ApprovalWorkflowStepsResponse{
|
||||||
ID: approvalWorkflowStepsReq.ID,
|
ID: approvalWorkflowStepsReq.ID,
|
||||||
WorkflowID: approvalWorkflowStepsReq.WorkflowId,
|
WorkflowID: approvalWorkflowStepsReq.WorkflowId,
|
||||||
StepName: approvalWorkflowStepsReq.StepName,
|
StepName: approvalWorkflowStepsReq.StepName,
|
||||||
StepOrder: approvalWorkflowStepsReq.StepOrder,
|
StepOrder: approvalWorkflowStepsReq.StepOrder,
|
||||||
ApproverRoleID: approvalWorkflowStepsReq.RequiredUserLevelId,
|
ApproverRoleID: approvalWorkflowStepsReq.RequiredUserLevelId,
|
||||||
IsOptional: isOptional,
|
IsOptional: isOptional,
|
||||||
RequiresComment: false, // Default value
|
RequiresComment: false, // Default value
|
||||||
AutoApprove: autoApprove,
|
AutoApprove: autoApprove,
|
||||||
TimeoutHours: approvalWorkflowStepsReq.AutoApproveAfterHours,
|
TimeoutHours: approvalWorkflowStepsReq.AutoApproveAfterHours,
|
||||||
CreatedAt: approvalWorkflowStepsReq.CreatedAt,
|
CreatedAt: approvalWorkflowStepsReq.CreatedAt,
|
||||||
UpdatedAt: approvalWorkflowStepsReq.UpdatedAt,
|
UpdatedAt: approvalWorkflowStepsReq.UpdatedAt,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -72,4 +72,4 @@ func ApprovalWorkflowStepsSummaryResponseMapper(
|
||||||
}
|
}
|
||||||
|
|
||||||
return approvalWorkflowStepsRes
|
return approvalWorkflowStepsRes
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,10 +2,10 @@ package repository
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"web-medols-be/app/database"
|
"netidhub-saas-be/app/database"
|
||||||
"web-medols-be/app/database/entity"
|
"netidhub-saas-be/app/database/entity"
|
||||||
"web-medols-be/app/module/approval_workflow_steps/request"
|
"netidhub-saas-be/app/module/approval_workflow_steps/request"
|
||||||
"web-medols-be/utils/paginator"
|
"netidhub-saas-be/utils/paginator"
|
||||||
|
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
|
|
|
||||||
|
|
@ -3,11 +3,11 @@ package service
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"web-medols-be/app/database/entity"
|
"netidhub-saas-be/app/database/entity"
|
||||||
"web-medols-be/app/module/approval_workflow_steps/repository"
|
"netidhub-saas-be/app/module/approval_workflow_steps/repository"
|
||||||
"web-medols-be/app/module/approval_workflow_steps/request"
|
"netidhub-saas-be/app/module/approval_workflow_steps/request"
|
||||||
workflowRepo "web-medols-be/app/module/approval_workflows/repository"
|
workflowRepo "netidhub-saas-be/app/module/approval_workflows/repository"
|
||||||
"web-medols-be/utils/paginator"
|
"netidhub-saas-be/utils/paginator"
|
||||||
|
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
|
|
|
||||||
|
|
@ -3,9 +3,9 @@ package approval_workflows
|
||||||
import (
|
import (
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
"go.uber.org/fx"
|
"go.uber.org/fx"
|
||||||
"web-medols-be/app/module/approval_workflows/controller"
|
"netidhub-saas-be/app/module/approval_workflows/controller"
|
||||||
"web-medols-be/app/module/approval_workflows/repository"
|
"netidhub-saas-be/app/module/approval_workflows/repository"
|
||||||
"web-medols-be/app/module/approval_workflows/service"
|
"netidhub-saas-be/app/module/approval_workflows/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ApprovalWorkflowsRouter struct of ApprovalWorkflowsRouter
|
// ApprovalWorkflowsRouter struct of ApprovalWorkflowsRouter
|
||||||
|
|
@ -57,4 +57,4 @@ func (_i *ApprovalWorkflowsRouter) RegisterApprovalWorkflowsRoutes() {
|
||||||
router.Put("/:id/deactivate", approvalWorkflowsController.Deactivate)
|
router.Put("/:id/deactivate", approvalWorkflowsController.Deactivate)
|
||||||
router.Delete("/:id", approvalWorkflowsController.Delete)
|
router.Delete("/:id", approvalWorkflowsController.Delete)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,15 +3,15 @@ package controller
|
||||||
import (
|
import (
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
|
"netidhub-saas-be/app/database/entity"
|
||||||
|
"netidhub-saas-be/app/middleware"
|
||||||
|
"netidhub-saas-be/app/module/approval_workflows/request"
|
||||||
|
"netidhub-saas-be/app/module/approval_workflows/service"
|
||||||
|
"netidhub-saas-be/utils/paginator"
|
||||||
"strconv"
|
"strconv"
|
||||||
"web-medols-be/app/database/entity"
|
|
||||||
"web-medols-be/app/middleware"
|
|
||||||
"web-medols-be/app/module/approval_workflows/request"
|
|
||||||
"web-medols-be/app/module/approval_workflows/service"
|
|
||||||
"web-medols-be/utils/paginator"
|
|
||||||
|
|
||||||
utilRes "web-medols-be/utils/response"
|
utilRes "netidhub-saas-be/utils/response"
|
||||||
utilVal "web-medols-be/utils/validator"
|
utilVal "netidhub-saas-be/utils/validator"
|
||||||
)
|
)
|
||||||
|
|
||||||
type approvalWorkflowsController struct {
|
type approvalWorkflowsController struct {
|
||||||
|
|
@ -478,4 +478,4 @@ func (_i *approvalWorkflowsController) UpdateWithSteps(c *fiber.Ctx) error {
|
||||||
Success: true,
|
Success: true,
|
||||||
Messages: utilRes.Messages{"ApprovalWorkflows with steps successfully updated"},
|
Messages: utilRes.Messages{"ApprovalWorkflows with steps successfully updated"},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,12 +3,12 @@ package mapper
|
||||||
import (
|
import (
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
"web-medols-be/app/database/entity"
|
"netidhub-saas-be/app/database/entity"
|
||||||
approvalWorkflowStepsMapper "web-medols-be/app/module/approval_workflow_steps/mapper"
|
approvalWorkflowStepsMapper "netidhub-saas-be/app/module/approval_workflow_steps/mapper"
|
||||||
approvalWorkflowStepsRepository "web-medols-be/app/module/approval_workflow_steps/repository"
|
approvalWorkflowStepsRepository "netidhub-saas-be/app/module/approval_workflow_steps/repository"
|
||||||
approvalWorkflowStepsResponse "web-medols-be/app/module/approval_workflow_steps/response"
|
approvalWorkflowStepsResponse "netidhub-saas-be/app/module/approval_workflow_steps/response"
|
||||||
res "web-medols-be/app/module/approval_workflows/response"
|
res "netidhub-saas-be/app/module/approval_workflows/response"
|
||||||
usersRepository "web-medols-be/app/module/users/repository"
|
usersRepository "netidhub-saas-be/app/module/users/repository"
|
||||||
)
|
)
|
||||||
|
|
||||||
func ApprovalWorkflowsResponseMapper(
|
func ApprovalWorkflowsResponseMapper(
|
||||||
|
|
@ -39,8 +39,6 @@ func ApprovalWorkflowsResponseMapper(
|
||||||
isActive = *approvalWorkflowsReq.IsActive
|
isActive = *approvalWorkflowsReq.IsActive
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
approvalWorkflowsRes = &res.ApprovalWorkflowsResponse{
|
approvalWorkflowsRes = &res.ApprovalWorkflowsResponse{
|
||||||
ID: approvalWorkflowsReq.ID,
|
ID: approvalWorkflowsReq.ID,
|
||||||
Name: approvalWorkflowsReq.Name,
|
Name: approvalWorkflowsReq.Name,
|
||||||
|
|
@ -123,4 +121,4 @@ func ApprovalWorkflowsSummaryResponseMapper(
|
||||||
}
|
}
|
||||||
|
|
||||||
return approvalWorkflowsRes
|
return approvalWorkflowsRes
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,14 +2,14 @@ package repository
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
"web-medols-be/app/database"
|
"netidhub-saas-be/app/database"
|
||||||
"web-medols-be/app/database/entity"
|
"netidhub-saas-be/app/database/entity"
|
||||||
approvalWorkflowStepsEntity "web-medols-be/app/database/entity"
|
approvalWorkflowStepsEntity "netidhub-saas-be/app/database/entity"
|
||||||
"web-medols-be/app/module/approval_workflows/request"
|
"netidhub-saas-be/app/module/approval_workflows/request"
|
||||||
"web-medols-be/utils/paginator"
|
"netidhub-saas-be/utils/paginator"
|
||||||
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
type approvalWorkflowsRepository struct {
|
type approvalWorkflowsRepository struct {
|
||||||
|
|
@ -176,21 +176,21 @@ func (_i *approvalWorkflowsRepository) GetDefault(clientId *uuid.UUID) (workflow
|
||||||
// GetWorkflowSteps gets all steps for a specific workflow
|
// GetWorkflowSteps gets all steps for a specific workflow
|
||||||
func (_i *approvalWorkflowsRepository) GetWorkflowSteps(clientId *uuid.UUID, workflowId uint) (steps []*entity.ApprovalWorkflowSteps, err error) {
|
func (_i *approvalWorkflowsRepository) GetWorkflowSteps(clientId *uuid.UUID, workflowId uint) (steps []*entity.ApprovalWorkflowSteps, err error) {
|
||||||
query := _i.DB.DB.Model(&approvalWorkflowStepsEntity.ApprovalWorkflowSteps{})
|
query := _i.DB.DB.Model(&approvalWorkflowStepsEntity.ApprovalWorkflowSteps{})
|
||||||
|
|
||||||
// Join with approval_workflows to check client_id
|
// Join with approval_workflows to check client_id
|
||||||
query = query.Joins("JOIN approval_workflows ON approval_workflow_steps.workflow_id = approval_workflows.id")
|
query = query.Joins("JOIN approval_workflows ON approval_workflow_steps.workflow_id = approval_workflows.id")
|
||||||
|
|
||||||
if clientId != nil {
|
if clientId != nil {
|
||||||
query = query.Where("approval_workflows.client_id = ?", clientId)
|
query = query.Where("approval_workflows.client_id = ?", clientId)
|
||||||
}
|
}
|
||||||
|
|
||||||
query = query.Where("approval_workflow_steps.workflow_id = ?", workflowId)
|
query = query.Where("approval_workflow_steps.workflow_id = ?", workflowId)
|
||||||
query = query.Where("approval_workflows.is_active = ?", true)
|
query = query.Where("approval_workflows.is_active = ?", true)
|
||||||
query = query.Order("approval_workflow_steps.step_order ASC")
|
query = query.Order("approval_workflow_steps.step_order ASC")
|
||||||
|
|
||||||
// Preload the RequiredUserLevel relation
|
// Preload the RequiredUserLevel relation
|
||||||
query = query.Preload("RequiredUserLevel")
|
query = query.Preload("RequiredUserLevel")
|
||||||
|
|
||||||
err = query.Find(&steps).Error
|
err = query.Find(&steps).Error
|
||||||
return steps, err
|
return steps, err
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
package request
|
package request
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"netidhub-saas-be/app/database/entity"
|
||||||
|
"netidhub-saas-be/utils/paginator"
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
"web-medols-be/app/database/entity"
|
|
||||||
"web-medols-be/utils/paginator"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type ApprovalWorkflowsGeneric interface {
|
type ApprovalWorkflowsGeneric interface {
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
package response
|
package response
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
approvalWorkflowStepsResponse "netidhub-saas-be/app/module/approval_workflow_steps/response"
|
||||||
"time"
|
"time"
|
||||||
approvalWorkflowStepsResponse "web-medols-be/app/module/approval_workflow_steps/response"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type ApprovalWorkflowsResponse struct {
|
type ApprovalWorkflowsResponse struct {
|
||||||
|
|
@ -40,9 +40,9 @@ type ApprovalWorkflowsSummaryResponse struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
type ApprovalWorkflowsStatsResponse struct {
|
type ApprovalWorkflowsStatsResponse struct {
|
||||||
TotalWorkflows int `json:"totalWorkflows"`
|
TotalWorkflows int `json:"totalWorkflows"`
|
||||||
ActiveWorkflows int `json:"activeWorkflows"`
|
ActiveWorkflows int `json:"activeWorkflows"`
|
||||||
InactiveWorkflows int `json:"inactiveWorkflows"`
|
InactiveWorkflows int `json:"inactiveWorkflows"`
|
||||||
TotalSteps int `json:"totalSteps"`
|
TotalSteps int `json:"totalSteps"`
|
||||||
AverageStepsPerFlow int `json:"averageStepsPerFlow"`
|
AverageStepsPerFlow int `json:"averageStepsPerFlow"`
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,17 +5,17 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
"web-medols-be/app/database/entity"
|
"netidhub-saas-be/app/database/entity"
|
||||||
"web-medols-be/app/module/approval_workflows/repository"
|
stepRepo "netidhub-saas-be/app/module/approval_workflow_steps/repository"
|
||||||
"web-medols-be/app/module/approval_workflows/request"
|
"netidhub-saas-be/app/module/approval_workflows/repository"
|
||||||
stepRepo "web-medols-be/app/module/approval_workflow_steps/repository"
|
"netidhub-saas-be/app/module/approval_workflows/request"
|
||||||
"web-medols-be/utils/paginator"
|
"netidhub-saas-be/utils/paginator"
|
||||||
)
|
)
|
||||||
|
|
||||||
type approvalWorkflowsService struct {
|
type approvalWorkflowsService struct {
|
||||||
ApprovalWorkflowsRepository repository.ApprovalWorkflowsRepository
|
ApprovalWorkflowsRepository repository.ApprovalWorkflowsRepository
|
||||||
ApprovalWorkflowStepsRepository stepRepo.ApprovalWorkflowStepsRepository
|
ApprovalWorkflowStepsRepository stepRepo.ApprovalWorkflowStepsRepository
|
||||||
Log zerolog.Logger
|
Log zerolog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
// ApprovalWorkflowsService define interface of IApprovalWorkflowsService
|
// ApprovalWorkflowsService define interface of IApprovalWorkflowsService
|
||||||
|
|
@ -316,4 +316,4 @@ func (_i *approvalWorkflowsService) CanDeleteWorkflow(clientId *uuid.UUID, id ui
|
||||||
// TODO: Implement check for active approval flows
|
// TODO: Implement check for active approval flows
|
||||||
|
|
||||||
return true, "", nil
|
return true, "", nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,9 +3,9 @@ package article_approval_flows
|
||||||
import (
|
import (
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
"go.uber.org/fx"
|
"go.uber.org/fx"
|
||||||
"web-medols-be/app/module/article_approval_flows/controller"
|
"netidhub-saas-be/app/module/article_approval_flows/controller"
|
||||||
"web-medols-be/app/module/article_approval_flows/repository"
|
"netidhub-saas-be/app/module/article_approval_flows/repository"
|
||||||
"web-medols-be/app/module/article_approval_flows/service"
|
"netidhub-saas-be/app/module/article_approval_flows/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ArticleApprovalFlowsRouter struct of ArticleApprovalFlowsRouter
|
// ArticleApprovalFlowsRouter struct of ArticleApprovalFlowsRouter
|
||||||
|
|
@ -58,4 +58,4 @@ func (_i *ArticleApprovalFlowsRouter) RegisterArticleApprovalFlowsRoutes() {
|
||||||
router.Put("/:id/request-revision", articleApprovalFlowsController.RequestRevision)
|
router.Put("/:id/request-revision", articleApprovalFlowsController.RequestRevision)
|
||||||
router.Put("/:id/resubmit", articleApprovalFlowsController.Resubmit)
|
router.Put("/:id/resubmit", articleApprovalFlowsController.Resubmit)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,19 +1,19 @@
|
||||||
package controller
|
package controller
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"netidhub-saas-be/app/middleware"
|
||||||
|
"netidhub-saas-be/app/module/article_approval_flows/request"
|
||||||
|
"netidhub-saas-be/app/module/article_approval_flows/service"
|
||||||
|
usersRepository "netidhub-saas-be/app/module/users/repository"
|
||||||
|
"netidhub-saas-be/utils/paginator"
|
||||||
|
utilSvc "netidhub-saas-be/utils/service"
|
||||||
"strconv"
|
"strconv"
|
||||||
"web-medols-be/app/middleware"
|
|
||||||
"web-medols-be/app/module/article_approval_flows/request"
|
|
||||||
"web-medols-be/app/module/article_approval_flows/service"
|
|
||||||
usersRepository "web-medols-be/app/module/users/repository"
|
|
||||||
"web-medols-be/utils/paginator"
|
|
||||||
utilSvc "web-medols-be/utils/service"
|
|
||||||
|
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
|
|
||||||
utilRes "web-medols-be/utils/response"
|
utilRes "netidhub-saas-be/utils/response"
|
||||||
utilVal "web-medols-be/utils/validator"
|
utilVal "netidhub-saas-be/utils/validator"
|
||||||
)
|
)
|
||||||
|
|
||||||
type articleApprovalFlowsController struct {
|
type articleApprovalFlowsController struct {
|
||||||
|
|
|
||||||
|
|
@ -1,18 +1,18 @@
|
||||||
package mapper
|
package mapper
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"time"
|
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
"web-medols-be/app/database/entity"
|
"netidhub-saas-be/app/database/entity"
|
||||||
articleApprovalStepLogsResponse "web-medols-be/app/module/article_approval_step_logs/response"
|
approvalWorkflowsRepository "netidhub-saas-be/app/module/approval_workflows/repository"
|
||||||
articleApprovalStepLogsRepository "web-medols-be/app/module/article_approval_step_logs/repository"
|
approvalWorkflowsResponse "netidhub-saas-be/app/module/approval_workflows/response"
|
||||||
approvalWorkflowsRepository "web-medols-be/app/module/approval_workflows/repository"
|
res "netidhub-saas-be/app/module/article_approval_flows/response"
|
||||||
approvalWorkflowsResponse "web-medols-be/app/module/approval_workflows/response"
|
articleApprovalStepLogsRepository "netidhub-saas-be/app/module/article_approval_step_logs/repository"
|
||||||
articlesRepository "web-medols-be/app/module/articles/repository"
|
articleApprovalStepLogsResponse "netidhub-saas-be/app/module/article_approval_step_logs/response"
|
||||||
articlesResponse "web-medols-be/app/module/articles/response"
|
articlesRepository "netidhub-saas-be/app/module/articles/repository"
|
||||||
usersRepository "web-medols-be/app/module/users/repository"
|
articlesResponse "netidhub-saas-be/app/module/articles/response"
|
||||||
res "web-medols-be/app/module/article_approval_flows/response"
|
usersRepository "netidhub-saas-be/app/module/users/repository"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
func ArticleApprovalFlowsResponseMapper(
|
func ArticleApprovalFlowsResponseMapper(
|
||||||
|
|
@ -26,8 +26,6 @@ func ArticleApprovalFlowsResponseMapper(
|
||||||
usersRepo usersRepository.UsersRepository,
|
usersRepo usersRepository.UsersRepository,
|
||||||
) (articleApprovalFlowsRes *res.ArticleApprovalFlowsResponse) {
|
) (articleApprovalFlowsRes *res.ArticleApprovalFlowsResponse) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Get article information
|
// Get article information
|
||||||
var articleRes *articlesResponse.ArticlesResponse
|
var articleRes *articlesResponse.ArticlesResponse
|
||||||
if articleApprovalFlowsReq.ArticleId != 0 {
|
if articleApprovalFlowsReq.ArticleId != 0 {
|
||||||
|
|
@ -84,21 +82,21 @@ func ArticleApprovalFlowsResponseMapper(
|
||||||
}
|
}
|
||||||
|
|
||||||
articleApprovalFlowsRes = &res.ArticleApprovalFlowsResponse{
|
articleApprovalFlowsRes = &res.ArticleApprovalFlowsResponse{
|
||||||
ID: articleApprovalFlowsReq.ID,
|
ID: articleApprovalFlowsReq.ID,
|
||||||
ArticleID: articleApprovalFlowsReq.ArticleId,
|
ArticleID: articleApprovalFlowsReq.ArticleId,
|
||||||
WorkflowID: articleApprovalFlowsReq.WorkflowId,
|
WorkflowID: articleApprovalFlowsReq.WorkflowId,
|
||||||
CurrentStep: articleApprovalFlowsReq.CurrentStep,
|
CurrentStep: articleApprovalFlowsReq.CurrentStep,
|
||||||
Status: statusStr,
|
Status: statusStr,
|
||||||
SubmittedBy: articleApprovalFlowsReq.SubmittedById,
|
SubmittedBy: articleApprovalFlowsReq.SubmittedById,
|
||||||
SubmittedAt: articleApprovalFlowsReq.SubmittedAt,
|
SubmittedAt: articleApprovalFlowsReq.SubmittedAt,
|
||||||
CompletedAt: articleApprovalFlowsReq.CompletedAt,
|
CompletedAt: articleApprovalFlowsReq.CompletedAt,
|
||||||
RejectionReason: articleApprovalFlowsReq.RejectionReason,
|
RejectionReason: articleApprovalFlowsReq.RejectionReason,
|
||||||
RevisionReason: articleApprovalFlowsReq.RevisionMessage,
|
RevisionReason: articleApprovalFlowsReq.RevisionMessage,
|
||||||
CreatedAt: articleApprovalFlowsReq.CreatedAt,
|
CreatedAt: articleApprovalFlowsReq.CreatedAt,
|
||||||
UpdatedAt: articleApprovalFlowsReq.UpdatedAt,
|
UpdatedAt: articleApprovalFlowsReq.UpdatedAt,
|
||||||
Article: articleRes,
|
Article: articleRes,
|
||||||
Workflow: approvalWorkflowRes,
|
Workflow: approvalWorkflowRes,
|
||||||
StepLogs: stepLogsArr,
|
StepLogs: stepLogsArr,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -164,7 +162,6 @@ func ArticleApprovalFlowsDetailResponseMapper(
|
||||||
IsActive: *approvalWorkflow.IsActive,
|
IsActive: *approvalWorkflow.IsActive,
|
||||||
CreatedAt: approvalWorkflow.CreatedAt,
|
CreatedAt: approvalWorkflow.CreatedAt,
|
||||||
UpdatedAt: approvalWorkflow.UpdatedAt,
|
UpdatedAt: approvalWorkflow.UpdatedAt,
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -187,22 +184,22 @@ func ArticleApprovalFlowsDetailResponseMapper(
|
||||||
}
|
}
|
||||||
|
|
||||||
articleApprovalFlowsRes = &res.ArticleApprovalFlowsDetailResponse{
|
articleApprovalFlowsRes = &res.ArticleApprovalFlowsDetailResponse{
|
||||||
ID: articleApprovalFlowsReq.ID,
|
ID: articleApprovalFlowsReq.ID,
|
||||||
ArticleID: articleApprovalFlowsReq.ArticleId,
|
ArticleID: articleApprovalFlowsReq.ArticleId,
|
||||||
WorkflowID: articleApprovalFlowsReq.WorkflowId,
|
WorkflowID: articleApprovalFlowsReq.WorkflowId,
|
||||||
CurrentStep: articleApprovalFlowsReq.CurrentStep,
|
CurrentStep: articleApprovalFlowsReq.CurrentStep,
|
||||||
Status: statusStr,
|
Status: statusStr,
|
||||||
SubmittedBy: articleApprovalFlowsReq.SubmittedById,
|
SubmittedBy: articleApprovalFlowsReq.SubmittedById,
|
||||||
SubmittedByName: submittedByName,
|
SubmittedByName: submittedByName,
|
||||||
SubmittedAt: articleApprovalFlowsReq.SubmittedAt,
|
SubmittedAt: articleApprovalFlowsReq.SubmittedAt,
|
||||||
CompletedAt: articleApprovalFlowsReq.CompletedAt,
|
CompletedAt: articleApprovalFlowsReq.CompletedAt,
|
||||||
RejectionReason: articleApprovalFlowsReq.RejectionReason,
|
RejectionReason: articleApprovalFlowsReq.RejectionReason,
|
||||||
RevisionReason: articleApprovalFlowsReq.RevisionMessage,
|
RevisionReason: articleApprovalFlowsReq.RevisionMessage,
|
||||||
CreatedAt: articleApprovalFlowsReq.CreatedAt,
|
CreatedAt: articleApprovalFlowsReq.CreatedAt,
|
||||||
UpdatedAt: articleApprovalFlowsReq.UpdatedAt,
|
UpdatedAt: articleApprovalFlowsReq.UpdatedAt,
|
||||||
Article: articleRes,
|
Article: articleRes,
|
||||||
Workflow: approvalWorkflowRes,
|
Workflow: approvalWorkflowRes,
|
||||||
StepLogs: stepLogsArr,
|
StepLogs: stepLogsArr,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -254,4 +251,4 @@ func ArticleApprovalFlowsSummaryResponseMapper(
|
||||||
}
|
}
|
||||||
|
|
||||||
return articleApprovalFlowsRes
|
return articleApprovalFlowsRes
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,11 +2,11 @@ package repository
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"netidhub-saas-be/app/database"
|
||||||
|
"netidhub-saas-be/app/database/entity"
|
||||||
|
"netidhub-saas-be/app/module/article_approval_flows/request"
|
||||||
|
"netidhub-saas-be/utils/paginator"
|
||||||
"time"
|
"time"
|
||||||
"web-medols-be/app/database"
|
|
||||||
"web-medols-be/app/database/entity"
|
|
||||||
"web-medols-be/app/module/article_approval_flows/request"
|
|
||||||
"web-medols-be/utils/paginator"
|
|
||||||
|
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
package request
|
package request
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"netidhub-saas-be/utils/paginator"
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
"web-medols-be/utils/paginator"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type ArticleApprovalFlowsGeneric interface {
|
type ArticleApprovalFlowsGeneric interface {
|
||||||
|
|
@ -11,14 +11,14 @@ type ArticleApprovalFlowsGeneric interface {
|
||||||
}
|
}
|
||||||
|
|
||||||
type ArticleApprovalFlowsQueryRequest struct {
|
type ArticleApprovalFlowsQueryRequest struct {
|
||||||
ArticleId *int `json:"articleId"`
|
ArticleId *int `json:"articleId"`
|
||||||
WorkflowId *int `json:"workflowId"`
|
WorkflowId *int `json:"workflowId"`
|
||||||
StatusId *int `json:"statusId"`
|
StatusId *int `json:"statusId"`
|
||||||
SubmittedBy *int `json:"submittedBy"`
|
SubmittedBy *int `json:"submittedBy"`
|
||||||
CurrentStep *int `json:"currentStep"`
|
CurrentStep *int `json:"currentStep"`
|
||||||
DateFrom *time.Time `json:"dateFrom"`
|
DateFrom *time.Time `json:"dateFrom"`
|
||||||
DateTo *time.Time `json:"dateTo"`
|
DateTo *time.Time `json:"dateTo"`
|
||||||
Pagination *paginator.Pagination `json:"pagination"`
|
Pagination *paginator.Pagination `json:"pagination"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type SubmitForApprovalRequest struct {
|
type SubmitForApprovalRequest struct {
|
||||||
|
|
@ -43,13 +43,13 @@ type ResubmitRequest struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
type ArticleApprovalFlowsQueryRequestContext struct {
|
type ArticleApprovalFlowsQueryRequestContext struct {
|
||||||
ArticleId string `json:"articleId"`
|
ArticleId string `json:"articleId"`
|
||||||
WorkflowId string `json:"workflowId"`
|
WorkflowId string `json:"workflowId"`
|
||||||
StatusId string `json:"statusId"`
|
StatusId string `json:"statusId"`
|
||||||
SubmittedBy string `json:"submittedBy"`
|
SubmittedBy string `json:"submittedBy"`
|
||||||
CurrentStep string `json:"currentStep"`
|
CurrentStep string `json:"currentStep"`
|
||||||
DateFrom string `json:"dateFrom"`
|
DateFrom string `json:"dateFrom"`
|
||||||
DateTo string `json:"dateTo"`
|
DateTo string `json:"dateTo"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (req ArticleApprovalFlowsQueryRequestContext) ToParamRequest() ArticleApprovalFlowsQueryRequest {
|
func (req ArticleApprovalFlowsQueryRequestContext) ToParamRequest() ArticleApprovalFlowsQueryRequest {
|
||||||
|
|
@ -112,4 +112,4 @@ func (req ArticleApprovalFlowsQueryRequestContext) ToParamRequest() ArticleAppro
|
||||||
DateFrom: dateFrom,
|
DateFrom: dateFrom,
|
||||||
DateTo: dateTo,
|
DateTo: dateTo,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
package response
|
package response
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
approvalWorkflowsResponse "netidhub-saas-be/app/module/approval_workflows/response"
|
||||||
|
articleApprovalStepLogsResponse "netidhub-saas-be/app/module/article_approval_step_logs/response"
|
||||||
|
articlesResponse "netidhub-saas-be/app/module/articles/response"
|
||||||
"time"
|
"time"
|
||||||
articlesResponse "web-medols-be/app/module/articles/response"
|
|
||||||
approvalWorkflowsResponse "web-medols-be/app/module/approval_workflows/response"
|
|
||||||
articleApprovalStepLogsResponse "web-medols-be/app/module/article_approval_step_logs/response"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type ArticleApprovalFlowsResponse struct {
|
type ArticleApprovalFlowsResponse struct {
|
||||||
|
|
@ -25,9 +25,9 @@ type ArticleApprovalFlowsResponse struct {
|
||||||
UpdatedAt time.Time `json:"updatedAt"`
|
UpdatedAt time.Time `json:"updatedAt"`
|
||||||
|
|
||||||
// Relations
|
// Relations
|
||||||
Article *articlesResponse.ArticlesResponse `json:"article,omitempty"`
|
Article *articlesResponse.ArticlesResponse `json:"article,omitempty"`
|
||||||
Workflow *approvalWorkflowsResponse.ApprovalWorkflowsResponse `json:"workflow,omitempty"`
|
Workflow *approvalWorkflowsResponse.ApprovalWorkflowsResponse `json:"workflow,omitempty"`
|
||||||
StepLogs []*articleApprovalStepLogsResponse.ArticleApprovalStepLogsResponse `json:"stepLogs,omitempty"`
|
StepLogs []*articleApprovalStepLogsResponse.ArticleApprovalStepLogsResponse `json:"stepLogs,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type ArticleApprovalFlowsDetailResponse struct {
|
type ArticleApprovalFlowsDetailResponse struct {
|
||||||
|
|
@ -49,9 +49,9 @@ type ArticleApprovalFlowsDetailResponse struct {
|
||||||
UpdatedAt time.Time `json:"updatedAt"`
|
UpdatedAt time.Time `json:"updatedAt"`
|
||||||
|
|
||||||
// Relations with full details
|
// Relations with full details
|
||||||
Article *articlesResponse.ArticlesResponse `json:"article"`
|
Article *articlesResponse.ArticlesResponse `json:"article"`
|
||||||
Workflow *approvalWorkflowsResponse.ApprovalWorkflowsWithStepsResponse `json:"workflow"`
|
Workflow *approvalWorkflowsResponse.ApprovalWorkflowsWithStepsResponse `json:"workflow"`
|
||||||
StepLogs []*articleApprovalStepLogsResponse.ArticleApprovalStepLogsResponse `json:"stepLogs"`
|
StepLogs []*articleApprovalStepLogsResponse.ArticleApprovalStepLogsResponse `json:"stepLogs"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type ArticleApprovalFlowsSummaryResponse struct {
|
type ArticleApprovalFlowsSummaryResponse struct {
|
||||||
|
|
@ -69,16 +69,16 @@ type ArticleApprovalFlowsSummaryResponse struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
type ApprovalQueueResponse struct {
|
type ApprovalQueueResponse struct {
|
||||||
ID uint `json:"id"`
|
ID uint `json:"id"`
|
||||||
ArticleID uint `json:"articleId"`
|
ArticleID uint `json:"articleId"`
|
||||||
ArticleTitle string `json:"articleTitle"`
|
ArticleTitle string `json:"articleTitle"`
|
||||||
ArticleAuthor string `json:"articleAuthor"`
|
ArticleAuthor string `json:"articleAuthor"`
|
||||||
WorkflowName string `json:"workflowName"`
|
WorkflowName string `json:"workflowName"`
|
||||||
CurrentStepName string `json:"currentStepName"`
|
CurrentStepName string `json:"currentStepName"`
|
||||||
SubmittedAt time.Time `json:"submittedAt"`
|
SubmittedAt time.Time `json:"submittedAt"`
|
||||||
DaysWaiting int `json:"daysWaiting"`
|
DaysWaiting int `json:"daysWaiting"`
|
||||||
Priority string `json:"priority"`
|
Priority string `json:"priority"`
|
||||||
RequiresComment bool `json:"requiresComment"`
|
RequiresComment bool `json:"requiresComment"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type ApprovalDashboardStatsResponse struct {
|
type ApprovalDashboardStatsResponse struct {
|
||||||
|
|
@ -108,4 +108,4 @@ type ApprovalAnalyticsResponse struct {
|
||||||
TotalRevisions int `json:"totalRevisions"`
|
TotalRevisions int `json:"totalRevisions"`
|
||||||
ApprovalRate float64 `json:"approvalRate"`
|
ApprovalRate float64 `json:"approvalRate"`
|
||||||
AverageApprovalTime float64 `json:"averageApprovalTime"` // in hours
|
AverageApprovalTime float64 `json:"averageApprovalTime"` // in hours
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,16 +2,16 @@ package service
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
"netidhub-saas-be/app/database/entity"
|
||||||
|
approvalWorkflowStepsRepo "netidhub-saas-be/app/module/approval_workflow_steps/repository"
|
||||||
|
approvalWorkflowsRepo "netidhub-saas-be/app/module/approval_workflows/repository"
|
||||||
|
"netidhub-saas-be/app/module/article_approval_flows/repository"
|
||||||
|
"netidhub-saas-be/app/module/article_approval_flows/request"
|
||||||
|
approvalStepLogsRepo "netidhub-saas-be/app/module/article_approval_step_logs/repository"
|
||||||
|
articlesRepo "netidhub-saas-be/app/module/articles/repository"
|
||||||
|
usersRepo "netidhub-saas-be/app/module/users/repository"
|
||||||
|
"netidhub-saas-be/utils/paginator"
|
||||||
"time"
|
"time"
|
||||||
"web-medols-be/app/database/entity"
|
|
||||||
approvalWorkflowStepsRepo "web-medols-be/app/module/approval_workflow_steps/repository"
|
|
||||||
approvalWorkflowsRepo "web-medols-be/app/module/approval_workflows/repository"
|
|
||||||
"web-medols-be/app/module/article_approval_flows/repository"
|
|
||||||
"web-medols-be/app/module/article_approval_flows/request"
|
|
||||||
approvalStepLogsRepo "web-medols-be/app/module/article_approval_step_logs/repository"
|
|
||||||
articlesRepo "web-medols-be/app/module/articles/repository"
|
|
||||||
usersRepo "web-medols-be/app/module/users/repository"
|
|
||||||
"web-medols-be/utils/paginator"
|
|
||||||
|
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
package article_approval_step_logs
|
package article_approval_step_logs
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"web-medols-be/app/module/article_approval_step_logs/controller"
|
"netidhub-saas-be/app/module/article_approval_step_logs/controller"
|
||||||
"web-medols-be/app/module/article_approval_step_logs/repository"
|
"netidhub-saas-be/app/module/article_approval_step_logs/repository"
|
||||||
"web-medols-be/app/module/article_approval_step_logs/service"
|
"netidhub-saas-be/app/module/article_approval_step_logs/service"
|
||||||
|
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
"go.uber.org/fx"
|
"go.uber.org/fx"
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,13 @@
|
||||||
package controller
|
package controller
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"netidhub-saas-be/app/middleware"
|
||||||
|
"netidhub-saas-be/app/module/article_approval_step_logs/request"
|
||||||
|
"netidhub-saas-be/app/module/article_approval_step_logs/service"
|
||||||
|
"netidhub-saas-be/utils/paginator"
|
||||||
|
utilRes "netidhub-saas-be/utils/response"
|
||||||
|
utilVal "netidhub-saas-be/utils/validator"
|
||||||
"strconv"
|
"strconv"
|
||||||
"web-medols-be/app/middleware"
|
|
||||||
"web-medols-be/app/module/article_approval_step_logs/request"
|
|
||||||
"web-medols-be/app/module/article_approval_step_logs/service"
|
|
||||||
"web-medols-be/utils/paginator"
|
|
||||||
utilRes "web-medols-be/utils/response"
|
|
||||||
utilVal "web-medols-be/utils/validator"
|
|
||||||
|
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
package mapper
|
package mapper
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"web-medols-be/app/database/entity"
|
"netidhub-saas-be/app/database/entity"
|
||||||
res "web-medols-be/app/module/article_approval_step_logs/response"
|
res "netidhub-saas-be/app/module/article_approval_step_logs/response"
|
||||||
usersRepository "web-medols-be/app/module/users/repository"
|
usersRepository "netidhub-saas-be/app/module/users/repository"
|
||||||
|
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
|
|
|
||||||
|
|
@ -2,11 +2,11 @@ package repository
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"netidhub-saas-be/app/database"
|
||||||
|
"netidhub-saas-be/app/database/entity"
|
||||||
|
"netidhub-saas-be/app/module/article_approval_step_logs/request"
|
||||||
|
"netidhub-saas-be/utils/paginator"
|
||||||
"time"
|
"time"
|
||||||
"web-medols-be/app/database"
|
|
||||||
"web-medols-be/app/database/entity"
|
|
||||||
"web-medols-be/app/module/article_approval_step_logs/request"
|
|
||||||
"web-medols-be/utils/paginator"
|
|
||||||
|
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
package request
|
package request
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"netidhub-saas-be/app/database/entity"
|
||||||
|
"netidhub-saas-be/utils/paginator"
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
"web-medols-be/app/database/entity"
|
|
||||||
"web-medols-be/utils/paginator"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type CreateArticleApprovalStepLogsRequest struct {
|
type CreateArticleApprovalStepLogsRequest struct {
|
||||||
|
|
|
||||||
|
|
@ -1,47 +1,47 @@
|
||||||
package response
|
package response
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
approvalWorkflowStepsResponse "netidhub-saas-be/app/module/approval_workflow_steps/response"
|
||||||
|
articlesResponse "netidhub-saas-be/app/module/articles/response"
|
||||||
|
usersResponse "netidhub-saas-be/app/module/users/response"
|
||||||
"time"
|
"time"
|
||||||
approvalWorkflowStepsResponse "web-medols-be/app/module/approval_workflow_steps/response"
|
|
||||||
articlesResponse "web-medols-be/app/module/articles/response"
|
|
||||||
usersResponse "web-medols-be/app/module/users/response"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type ArticleApprovalStepLogsResponse struct {
|
type ArticleApprovalStepLogsResponse struct {
|
||||||
ID uint `json:"id"`
|
ID uint `json:"id"`
|
||||||
ApprovalFlowId uint `json:"approvalFlowId"`
|
ApprovalFlowId uint `json:"approvalFlowId"`
|
||||||
StepOrder int `json:"stepOrder"`
|
StepOrder int `json:"stepOrder"`
|
||||||
StepName string `json:"stepName"`
|
StepName string `json:"stepName"`
|
||||||
ApprovedById *uint `json:"approvedById"`
|
ApprovedById *uint `json:"approvedById"`
|
||||||
Action string `json:"action"`
|
Action string `json:"action"`
|
||||||
Message *string `json:"message"`
|
Message *string `json:"message"`
|
||||||
ProcessedAt time.Time `json:"processedAt"`
|
ProcessedAt time.Time `json:"processedAt"`
|
||||||
UserLevelId uint `json:"userLevelId"`
|
UserLevelId uint `json:"userLevelId"`
|
||||||
ClientId *string `json:"clientId"`
|
ClientId *string `json:"clientId"`
|
||||||
CreatedAt time.Time `json:"createdAt"`
|
CreatedAt time.Time `json:"createdAt"`
|
||||||
|
|
||||||
// Relations
|
// Relations
|
||||||
ApprovedBy *usersResponse.UsersResponse `json:"approvedBy,omitempty"`
|
ApprovedBy *usersResponse.UsersResponse `json:"approvedBy,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type ArticleApprovalStepLogsDetailResponse struct {
|
type ArticleApprovalStepLogsDetailResponse struct {
|
||||||
ID uint `json:"id"`
|
ID uint `json:"id"`
|
||||||
ArticleApprovalFlowID uint `json:"articleApprovalFlowId"`
|
ArticleApprovalFlowID uint `json:"articleApprovalFlowId"`
|
||||||
WorkflowStepID uint `json:"workflowStepId"`
|
WorkflowStepID uint `json:"workflowStepId"`
|
||||||
ApproverUserID *uint `json:"approverUserId"`
|
ApproverUserID *uint `json:"approverUserId"`
|
||||||
ApprovalStatusID uint `json:"approvalStatusId"`
|
ApprovalStatusID uint `json:"approvalStatusId"`
|
||||||
ApprovalStatusName *string `json:"approvalStatusName,omitempty"`
|
ApprovalStatusName *string `json:"approvalStatusName,omitempty"`
|
||||||
Comments *string `json:"comments"`
|
Comments *string `json:"comments"`
|
||||||
ApprovedAt *time.Time `json:"approvedAt"`
|
ApprovedAt *time.Time `json:"approvedAt"`
|
||||||
DueDate *time.Time `json:"dueDate"`
|
DueDate *time.Time `json:"dueDate"`
|
||||||
IsAutoApproved bool `json:"isAutoApproved"`
|
IsAutoApproved bool `json:"isAutoApproved"`
|
||||||
CreatedAt time.Time `json:"createdAt"`
|
CreatedAt time.Time `json:"createdAt"`
|
||||||
UpdatedAt time.Time `json:"updatedAt"`
|
UpdatedAt time.Time `json:"updatedAt"`
|
||||||
|
|
||||||
// Relations with full details
|
// Relations with full details
|
||||||
WorkflowStep *approvalWorkflowStepsResponse.ApprovalWorkflowStepsResponse `json:"workflowStep,omitempty"`
|
WorkflowStep *approvalWorkflowStepsResponse.ApprovalWorkflowStepsResponse `json:"workflowStep,omitempty"`
|
||||||
ApproverUser *usersResponse.UsersResponse `json:"approverUser,omitempty"`
|
ApproverUser *usersResponse.UsersResponse `json:"approverUser,omitempty"`
|
||||||
Article *articlesResponse.ArticlesResponse `json:"article,omitempty"`
|
Article *articlesResponse.ArticlesResponse `json:"article,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type ArticleApprovalStepLogsSummaryResponse struct {
|
type ArticleApprovalStepLogsSummaryResponse struct {
|
||||||
|
|
@ -58,12 +58,12 @@ type ArticleApprovalStepLogsSummaryResponse struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
type ApprovalHistoryResponse struct {
|
type ApprovalHistoryResponse struct {
|
||||||
ArticleID uint `json:"articleId"`
|
ArticleID uint `json:"articleId"`
|
||||||
ArticleTitle string `json:"articleTitle"`
|
ArticleTitle string `json:"articleTitle"`
|
||||||
WorkflowName string `json:"workflowName"`
|
WorkflowName string `json:"workflowName"`
|
||||||
StartedAt time.Time `json:"startedAt"`
|
StartedAt time.Time `json:"startedAt"`
|
||||||
CompletedAt *time.Time `json:"completedAt"`
|
CompletedAt *time.Time `json:"completedAt"`
|
||||||
CurrentStep *string `json:"currentStep"`
|
CurrentStep *string `json:"currentStep"`
|
||||||
Steps []ArticleApprovalStepLogsSummaryResponse `json:"steps"`
|
Steps []ArticleApprovalStepLogsSummaryResponse `json:"steps"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -88,4 +88,4 @@ type UserApprovalStatsResponse struct {
|
||||||
RejectedCount int `json:"rejectedCount"`
|
RejectedCount int `json:"rejectedCount"`
|
||||||
AverageProcessingTime float64 `json:"averageProcessingTime"` // in hours
|
AverageProcessingTime float64 `json:"averageProcessingTime"` // in hours
|
||||||
OverdueCount int `json:"overdueCount"`
|
OverdueCount int `json:"overdueCount"`
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,13 +3,13 @@ package service
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"netidhub-saas-be/app/database/entity"
|
||||||
|
stepRepo "netidhub-saas-be/app/module/approval_workflow_steps/repository"
|
||||||
|
flowRepo "netidhub-saas-be/app/module/article_approval_flows/repository"
|
||||||
|
"netidhub-saas-be/app/module/article_approval_step_logs/repository"
|
||||||
|
"netidhub-saas-be/app/module/article_approval_step_logs/request"
|
||||||
|
"netidhub-saas-be/utils/paginator"
|
||||||
"time"
|
"time"
|
||||||
"web-medols-be/app/database/entity"
|
|
||||||
stepRepo "web-medols-be/app/module/approval_workflow_steps/repository"
|
|
||||||
flowRepo "web-medols-be/app/module/article_approval_flows/repository"
|
|
||||||
"web-medols-be/app/module/article_approval_step_logs/repository"
|
|
||||||
"web-medols-be/app/module/article_approval_step_logs/request"
|
|
||||||
"web-medols-be/utils/paginator"
|
|
||||||
|
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
|
|
|
||||||
|
|
@ -3,9 +3,9 @@ package article_approvals
|
||||||
import (
|
import (
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
"go.uber.org/fx"
|
"go.uber.org/fx"
|
||||||
"web-medols-be/app/module/article_approvals/controller"
|
"netidhub-saas-be/app/module/article_approvals/controller"
|
||||||
"web-medols-be/app/module/article_approvals/repository"
|
"netidhub-saas-be/app/module/article_approvals/repository"
|
||||||
"web-medols-be/app/module/article_approvals/service"
|
"netidhub-saas-be/app/module/article_approvals/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
// struct of ArticleApprovalsRouter
|
// struct of ArticleApprovalsRouter
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,17 @@
|
||||||
package controller
|
package controller
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"netidhub-saas-be/app/middleware"
|
||||||
|
"netidhub-saas-be/app/module/article_approvals/request"
|
||||||
|
"netidhub-saas-be/app/module/article_approvals/service"
|
||||||
|
"netidhub-saas-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"
|
|
||||||
|
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
|
|
||||||
utilRes "web-medols-be/utils/response"
|
utilRes "netidhub-saas-be/utils/response"
|
||||||
utilVal "web-medols-be/utils/validator"
|
utilVal "netidhub-saas-be/utils/validator"
|
||||||
)
|
)
|
||||||
|
|
||||||
type articleApprovalsController struct {
|
type articleApprovalsController struct {
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ package controller
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
"web-medols-be/app/module/article_approvals/service"
|
"netidhub-saas-be/app/module/article_approvals/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Controller struct {
|
type Controller struct {
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
package mapper
|
package mapper
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"web-medols-be/app/database/entity"
|
"netidhub-saas-be/app/database/entity"
|
||||||
res "web-medols-be/app/module/article_approvals/response"
|
res "netidhub-saas-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"
|
||||||
|
"netidhub-saas-be/app/database"
|
||||||
|
"netidhub-saas-be/app/database/entity"
|
||||||
|
"netidhub-saas-be/app/module/article_approvals/request"
|
||||||
|
"netidhub-saas-be/utils/paginator"
|
||||||
|
utilSvc "netidhub-saas-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 (
|
||||||
|
"netidhub-saas-be/app/database/entity"
|
||||||
|
"netidhub-saas-be/utils/paginator"
|
||||||
"strconv"
|
"strconv"
|
||||||
"web-medols-be/app/database/entity"
|
|
||||||
"web-medols-be/utils/paginator"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type ArticleApprovalsGeneric interface {
|
type ArticleApprovalsGeneric interface {
|
||||||
|
|
|
||||||
|
|
@ -3,16 +3,16 @@ package service
|
||||||
import (
|
import (
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
"web-medols-be/app/database/entity"
|
"netidhub-saas-be/app/database/entity"
|
||||||
"web-medols-be/app/module/article_approvals/mapper"
|
"netidhub-saas-be/app/module/article_approvals/mapper"
|
||||||
"web-medols-be/app/module/article_approvals/repository"
|
"netidhub-saas-be/app/module/article_approvals/repository"
|
||||||
"web-medols-be/app/module/article_approvals/request"
|
"netidhub-saas-be/app/module/article_approvals/request"
|
||||||
"web-medols-be/app/module/article_approvals/response"
|
"netidhub-saas-be/app/module/article_approvals/response"
|
||||||
articlesService "web-medols-be/app/module/articles/service"
|
articlesService "netidhub-saas-be/app/module/articles/service"
|
||||||
usersRepository "web-medols-be/app/module/users/repository"
|
usersRepository "netidhub-saas-be/app/module/users/repository"
|
||||||
"web-medols-be/utils/paginator"
|
"netidhub-saas-be/utils/paginator"
|
||||||
|
|
||||||
utilSvc "web-medols-be/utils/service"
|
utilSvc "netidhub-saas-be/utils/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ArticleApprovalsService
|
// ArticleApprovalsService
|
||||||
|
|
|
||||||
|
|
@ -3,9 +3,9 @@ package article_categories
|
||||||
import (
|
import (
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
"go.uber.org/fx"
|
"go.uber.org/fx"
|
||||||
"web-medols-be/app/module/article_categories/controller"
|
"netidhub-saas-be/app/module/article_categories/controller"
|
||||||
"web-medols-be/app/module/article_categories/repository"
|
"netidhub-saas-be/app/module/article_categories/repository"
|
||||||
"web-medols-be/app/module/article_categories/service"
|
"netidhub-saas-be/app/module/article_categories/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
// struct of ArticleCategoriesRouter
|
// struct of ArticleCategoriesRouter
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,16 @@
|
||||||
package controller
|
package controller
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"netidhub-saas-be/app/middleware"
|
||||||
|
"netidhub-saas-be/app/module/article_categories/request"
|
||||||
|
"netidhub-saas-be/app/module/article_categories/service"
|
||||||
|
"netidhub-saas-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"
|
|
||||||
|
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
|
|
||||||
utilRes "web-medols-be/utils/response"
|
utilRes "netidhub-saas-be/utils/response"
|
||||||
utilVal "web-medols-be/utils/validator"
|
utilVal "netidhub-saas-be/utils/validator"
|
||||||
)
|
)
|
||||||
|
|
||||||
type articleCategoriesController struct {
|
type articleCategoriesController struct {
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
package controller
|
package controller
|
||||||
|
|
||||||
import "web-medols-be/app/module/article_categories/service"
|
import "netidhub-saas-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 (
|
||||||
|
"netidhub-saas-be/app/database/entity"
|
||||||
|
res "netidhub-saas-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) {
|
||||||
|
|
|
||||||
|
|
@ -4,12 +4,12 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
|
"netidhub-saas-be/app/database"
|
||||||
|
"netidhub-saas-be/app/database/entity"
|
||||||
|
"netidhub-saas-be/app/module/article_categories/request"
|
||||||
|
"netidhub-saas-be/utils/paginator"
|
||||||
|
utilSvc "netidhub-saas-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 {
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
package request
|
package request
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"netidhub-saas-be/app/database/entity"
|
||||||
|
"netidhub-saas-be/utils/paginator"
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
"web-medols-be/app/database/entity"
|
|
||||||
"web-medols-be/utils/paginator"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type ArticleCategoriesGeneric interface {
|
type ArticleCategoriesGeneric interface {
|
||||||
|
|
|
||||||
|
|
@ -10,20 +10,20 @@ import (
|
||||||
"log"
|
"log"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"mime"
|
"mime"
|
||||||
|
"netidhub-saas-be/app/database/entity"
|
||||||
|
"netidhub-saas-be/app/module/article_categories/mapper"
|
||||||
|
"netidhub-saas-be/app/module/article_categories/repository"
|
||||||
|
"netidhub-saas-be/app/module/article_categories/request"
|
||||||
|
"netidhub-saas-be/app/module/article_categories/response"
|
||||||
|
usersRepository "netidhub-saas-be/app/module/users/repository"
|
||||||
|
config "netidhub-saas-be/config/config"
|
||||||
|
minioStorage "netidhub-saas-be/config/config"
|
||||||
|
"netidhub-saas-be/utils/paginator"
|
||||||
|
utilSvc "netidhub-saas-be/utils/service"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"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
|
||||||
|
|
|
||||||
|
|
@ -3,9 +3,9 @@ package article_category_details
|
||||||
import (
|
import (
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
"go.uber.org/fx"
|
"go.uber.org/fx"
|
||||||
"web-medols-be/app/module/article_category_details/controller"
|
"netidhub-saas-be/app/module/article_category_details/controller"
|
||||||
"web-medols-be/app/module/article_category_details/repository"
|
"netidhub-saas-be/app/module/article_category_details/repository"
|
||||||
"web-medols-be/app/module/article_category_details/service"
|
"netidhub-saas-be/app/module/article_category_details/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
// struct of ArticleCategoryDetailsRouter
|
// struct of ArticleCategoryDetailsRouter
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,15 @@
|
||||||
package controller
|
package controller
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"netidhub-saas-be/app/module/article_category_details/request"
|
||||||
|
"netidhub-saas-be/app/module/article_category_details/service"
|
||||||
|
"netidhub-saas-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"
|
|
||||||
|
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
|
|
||||||
utilRes "web-medols-be/utils/response"
|
utilRes "netidhub-saas-be/utils/response"
|
||||||
utilVal "web-medols-be/utils/validator"
|
utilVal "netidhub-saas-be/utils/validator"
|
||||||
)
|
)
|
||||||
|
|
||||||
type articleCategoryDetailsController struct {
|
type articleCategoryDetailsController struct {
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
package controller
|
package controller
|
||||||
|
|
||||||
import "web-medols-be/app/module/article_category_details/service"
|
import "netidhub-saas-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 (
|
||||||
"web-medols-be/app/database/entity/article_category_details"
|
"netidhub-saas-be/app/database/entity/article_category_details"
|
||||||
res "web-medols-be/app/module/article_category_details/response"
|
res "netidhub-saas-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 (
|
||||||
"web-medols-be/app/database"
|
"netidhub-saas-be/app/database"
|
||||||
"web-medols-be/app/database/entity/article_category_details"
|
"netidhub-saas-be/app/database/entity/article_category_details"
|
||||||
"web-medols-be/app/module/article_category_details/request"
|
"netidhub-saas-be/app/module/article_category_details/request"
|
||||||
"web-medols-be/utils/paginator"
|
"netidhub-saas-be/utils/paginator"
|
||||||
)
|
)
|
||||||
|
|
||||||
type articleCategoryDetailsRepository struct {
|
type articleCategoryDetailsRepository struct {
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
package request
|
package request
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"netidhub-saas-be/app/database/entity/article_category_details"
|
||||||
|
"netidhub-saas-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"
|
||||||
"web-medols-be/app/module/article_category_details/mapper"
|
"netidhub-saas-be/app/module/article_category_details/mapper"
|
||||||
"web-medols-be/app/module/article_category_details/repository"
|
"netidhub-saas-be/app/module/article_category_details/repository"
|
||||||
"web-medols-be/app/module/article_category_details/request"
|
"netidhub-saas-be/app/module/article_category_details/request"
|
||||||
"web-medols-be/app/module/article_category_details/response"
|
"netidhub-saas-be/app/module/article_category_details/response"
|
||||||
"web-medols-be/utils/paginator"
|
"netidhub-saas-be/utils/paginator"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ArticleCategoryDetailsService
|
// ArticleCategoryDetailsService
|
||||||
|
|
|
||||||
|
|
@ -3,9 +3,9 @@ package article_comments
|
||||||
import (
|
import (
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
"go.uber.org/fx"
|
"go.uber.org/fx"
|
||||||
"web-medols-be/app/module/article_comments/controller"
|
"netidhub-saas-be/app/module/article_comments/controller"
|
||||||
"web-medols-be/app/module/article_comments/repository"
|
"netidhub-saas-be/app/module/article_comments/repository"
|
||||||
"web-medols-be/app/module/article_comments/service"
|
"netidhub-saas-be/app/module/article_comments/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
// struct of ArticleCommentsRouter
|
// struct of ArticleCommentsRouter
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,13 @@
|
||||||
package controller
|
package controller
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"netidhub-saas-be/app/middleware"
|
||||||
|
"netidhub-saas-be/app/module/article_comments/request"
|
||||||
|
"netidhub-saas-be/app/module/article_comments/service"
|
||||||
|
"netidhub-saas-be/utils/paginator"
|
||||||
|
utilRes "netidhub-saas-be/utils/response"
|
||||||
|
utilVal "netidhub-saas-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"
|
|
||||||
|
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ package controller
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
"web-medols-be/app/module/article_comments/service"
|
"netidhub-saas-be/app/module/article_comments/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Controller struct {
|
type Controller struct {
|
||||||
|
|
|
||||||
|
|
@ -2,9 +2,9 @@ package mapper
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
"web-medols-be/app/database/entity"
|
"netidhub-saas-be/app/database/entity"
|
||||||
res "web-medols-be/app/module/article_comments/response"
|
res "netidhub-saas-be/app/module/article_comments/response"
|
||||||
usersRepository "web-medols-be/app/module/users/repository"
|
usersRepository "netidhub-saas-be/app/module/users/repository"
|
||||||
)
|
)
|
||||||
|
|
||||||
func ArticleCommentsResponseMapper(clientId *uuid.UUID, articleCommentsReq *entity.ArticleComments, usersRepo usersRepository.UsersRepository) (articleCommentsRes *res.ArticleCommentsResponse) {
|
func ArticleCommentsResponseMapper(clientId *uuid.UUID, articleCommentsReq *entity.ArticleComments, usersRepo usersRepository.UsersRepository) (articleCommentsRes *res.ArticleCommentsResponse) {
|
||||||
|
|
|
||||||
|
|
@ -4,12 +4,12 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
|
"netidhub-saas-be/app/database"
|
||||||
|
"netidhub-saas-be/app/database/entity"
|
||||||
|
"netidhub-saas-be/app/module/article_comments/request"
|
||||||
|
"netidhub-saas-be/utils/paginator"
|
||||||
|
utilSvc "netidhub-saas-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 {
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
package request
|
package request
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"netidhub-saas-be/app/database/entity"
|
||||||
|
"netidhub-saas-be/utils/paginator"
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
"web-medols-be/app/database/entity"
|
|
||||||
"web-medols-be/utils/paginator"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type ArticleCommentsGeneric interface {
|
type ArticleCommentsGeneric interface {
|
||||||
|
|
|
||||||
|
|
@ -3,15 +3,15 @@ package service
|
||||||
import (
|
import (
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
"web-medols-be/app/database/entity"
|
"netidhub-saas-be/app/database/entity"
|
||||||
"web-medols-be/app/module/article_comments/mapper"
|
"netidhub-saas-be/app/module/article_comments/mapper"
|
||||||
"web-medols-be/app/module/article_comments/repository"
|
"netidhub-saas-be/app/module/article_comments/repository"
|
||||||
"web-medols-be/app/module/article_comments/request"
|
"netidhub-saas-be/app/module/article_comments/request"
|
||||||
"web-medols-be/app/module/article_comments/response"
|
"netidhub-saas-be/app/module/article_comments/response"
|
||||||
usersRepository "web-medols-be/app/module/users/repository"
|
usersRepository "netidhub-saas-be/app/module/users/repository"
|
||||||
"web-medols-be/utils/paginator"
|
"netidhub-saas-be/utils/paginator"
|
||||||
|
|
||||||
utilSvc "web-medols-be/utils/service"
|
utilSvc "netidhub-saas-be/utils/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ArticleCommentsService
|
// ArticleCommentsService
|
||||||
|
|
|
||||||
|
|
@ -3,9 +3,9 @@ package article_files
|
||||||
import (
|
import (
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
"go.uber.org/fx"
|
"go.uber.org/fx"
|
||||||
"web-medols-be/app/module/article_files/controller"
|
"netidhub-saas-be/app/module/article_files/controller"
|
||||||
"web-medols-be/app/module/article_files/repository"
|
"netidhub-saas-be/app/module/article_files/repository"
|
||||||
"web-medols-be/app/module/article_files/service"
|
"netidhub-saas-be/app/module/article_files/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
// struct of ArticleFilesRouter
|
// struct of ArticleFilesRouter
|
||||||
|
|
|
||||||
|
|
@ -2,13 +2,13 @@ package controller
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"netidhub-saas-be/app/middleware"
|
||||||
|
"netidhub-saas-be/app/module/article_files/request"
|
||||||
|
"netidhub-saas-be/app/module/article_files/service"
|
||||||
|
"netidhub-saas-be/utils/paginator"
|
||||||
|
utilRes "netidhub-saas-be/utils/response"
|
||||||
|
utilVal "netidhub-saas-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"
|
|
||||||
|
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
package controller
|
package controller
|
||||||
|
|
||||||
import "web-medols-be/app/module/article_files/service"
|
import "netidhub-saas-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 (
|
||||||
"web-medols-be/app/database/entity"
|
"netidhub-saas-be/app/database/entity"
|
||||||
res "web-medols-be/app/module/article_files/response"
|
res "netidhub-saas-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) {
|
||||||
|
|
|
||||||
|
|
@ -3,12 +3,12 @@ package repository
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
|
"netidhub-saas-be/app/database"
|
||||||
|
"netidhub-saas-be/app/database/entity"
|
||||||
|
"netidhub-saas-be/app/module/article_files/request"
|
||||||
|
"netidhub-saas-be/utils/paginator"
|
||||||
|
utilSvc "netidhub-saas-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 {
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
package request
|
package request
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"netidhub-saas-be/app/database/entity"
|
||||||
|
"netidhub-saas-be/utils/paginator"
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
"web-medols-be/app/database/entity"
|
|
||||||
"web-medols-be/utils/paginator"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type ArticleFilesGeneric interface {
|
type ArticleFilesGeneric interface {
|
||||||
|
|
|
||||||
|
|
@ -12,19 +12,19 @@ import (
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"mime"
|
"mime"
|
||||||
"mime/multipart"
|
"mime/multipart"
|
||||||
|
"netidhub-saas-be/app/module/article_files/mapper"
|
||||||
|
"netidhub-saas-be/app/module/article_files/repository"
|
||||||
|
"netidhub-saas-be/app/module/article_files/request"
|
||||||
|
"netidhub-saas-be/app/module/article_files/response"
|
||||||
|
config "netidhub-saas-be/config/config"
|
||||||
|
minioStorage "netidhub-saas-be/config/config"
|
||||||
|
"netidhub-saas-be/utils/paginator"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strconv"
|
"strconv"
|
||||||
"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
|
||||||
|
|
|
||||||
|
|
@ -3,9 +3,9 @@ package article_nulis_ai
|
||||||
import (
|
import (
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
"go.uber.org/fx"
|
"go.uber.org/fx"
|
||||||
"web-medols-be/app/module/article_nulis_ai/controller"
|
"netidhub-saas-be/app/module/article_nulis_ai/controller"
|
||||||
"web-medols-be/app/module/article_nulis_ai/repository"
|
"netidhub-saas-be/app/module/article_nulis_ai/repository"
|
||||||
"web-medols-be/app/module/article_nulis_ai/service"
|
"netidhub-saas-be/app/module/article_nulis_ai/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
// struct of ArticleNulisAIRouter
|
// struct of ArticleNulisAIRouter
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,12 @@
|
||||||
package controller
|
package controller
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"netidhub-saas-be/app/module/article_nulis_ai/request"
|
||||||
|
"netidhub-saas-be/app/module/article_nulis_ai/service"
|
||||||
|
"netidhub-saas-be/utils/paginator"
|
||||||
|
utilRes "netidhub-saas-be/utils/response"
|
||||||
|
utilVal "netidhub-saas-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"
|
|
||||||
|
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ package controller
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
"web-medols-be/app/module/article_nulis_ai/service"
|
"netidhub-saas-be/app/module/article_nulis_ai/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Controller struct {
|
type Controller struct {
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
package mapper
|
package mapper
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"web-medols-be/app/database/entity"
|
"netidhub-saas-be/app/database/entity"
|
||||||
res "web-medols-be/app/module/article_nulis_ai/response"
|
res "netidhub-saas-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"
|
||||||
|
"netidhub-saas-be/app/database"
|
||||||
|
"netidhub-saas-be/app/database/entity"
|
||||||
|
"netidhub-saas-be/app/module/article_nulis_ai/request"
|
||||||
|
"netidhub-saas-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 (
|
||||||
|
"netidhub-saas-be/app/database/entity"
|
||||||
|
"netidhub-saas-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"
|
||||||
"web-medols-be/app/database/entity"
|
"netidhub-saas-be/app/database/entity"
|
||||||
"web-medols-be/app/module/article_nulis_ai/mapper"
|
"netidhub-saas-be/app/module/article_nulis_ai/mapper"
|
||||||
"web-medols-be/app/module/article_nulis_ai/repository"
|
"netidhub-saas-be/app/module/article_nulis_ai/repository"
|
||||||
"web-medols-be/app/module/article_nulis_ai/request"
|
"netidhub-saas-be/app/module/article_nulis_ai/request"
|
||||||
"web-medols-be/app/module/article_nulis_ai/response"
|
"netidhub-saas-be/app/module/article_nulis_ai/response"
|
||||||
articlesRepository "web-medols-be/app/module/articles/repository"
|
articlesRepository "netidhub-saas-be/app/module/articles/repository"
|
||||||
articles "web-medols-be/app/module/articles/request"
|
articles "netidhub-saas-be/app/module/articles/request"
|
||||||
usersRepository "web-medols-be/app/module/users/repository"
|
usersRepository "netidhub-saas-be/app/module/users/repository"
|
||||||
"web-medols-be/utils/paginator"
|
"netidhub-saas-be/utils/paginator"
|
||||||
|
|
||||||
utilSvc "web-medols-be/utils/service"
|
utilSvc "netidhub-saas-be/utils/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ArticleNulisAIService
|
// ArticleNulisAIService
|
||||||
|
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue