major update

This commit is contained in:
hanif salafi 2025-10-01 10:10:18 +07:00
parent 53e56ea285
commit a18d5991b7
58 changed files with 6804 additions and 2470 deletions

View File

@ -0,0 +1,66 @@
# PowerShell script to add clientId extraction logic to service methods
# Usage: .\add_clientid_extraction.ps1 <file_path>
param(
[Parameter(Mandatory=$true)]
[string]$FilePath
)
if (-not (Test-Path $FilePath)) {
Write-Error "File not found: $FilePath"
exit 1
}
Write-Host "Adding clientId extraction logic to: $FilePath"
# Read file content
$Content = Get-Content $FilePath -Raw
# Pattern to find method definitions that need clientId extraction
$MethodPattern = 'func \(_i \*(\w+)Service\) (\w+)\(authToken string, ([^)]+)\)'
# Find all method matches
$Matches = [regex]::Matches($Content, $MethodPattern)
foreach ($Match in $Matches) {
$ServiceName = $Match.Groups[1].Value
$MethodName = $Match.Groups[2].Value
$Parameters = $Match.Groups[3].Value
Write-Host "Processing method: $MethodName"
# Skip methods that already have clientId extraction logic
if ($Content -match "func \(_i \*${ServiceName}Service\) ${MethodName}\(authToken string, ${Parameters}\) \{[^}]*Extract clientId from authToken") {
Write-Host " Skipping $MethodName - already has clientId extraction"
continue
}
# Create the clientId extraction logic
$ExtractionLogic = @"
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return nil, errors.New("clientId not found in auth token")
}
"@
# Replace the method opening with extraction logic
$OldMethodStart = "func (_i *${ServiceName}Service) ${MethodName}(authToken string, ${Parameters}) {"
$NewMethodStart = "func (_i *${ServiceName}Service) ${MethodName}(authToken string, ${Parameters}) {${ExtractionLogic}"
$Content = $Content -replace [regex]::Escape($OldMethodStart), $NewMethodStart
}
# Write updated content
Set-Content $FilePath $Content -NoNewline
Write-Host "ClientId extraction logic added to service methods."

View File

@ -0,0 +1,59 @@
# PowerShell script to add clientId extraction to remaining methods
# Usage: .\add_clientid_to_remaining.ps1 <file_path>
param(
[Parameter(Mandatory=$true)]
[string]$FilePath
)
if (-not (Test-Path $FilePath)) {
Write-Error "File not found: $FilePath"
exit 1
}
Write-Host "Adding clientId extraction to remaining methods in: $FilePath"
# Read file content
$Content = Get-Content $FilePath -Raw
# Find methods that use clientId but don't have extraction logic
$MethodPattern = 'func \(_i \*(\w+)Service\) (\w+)\(authToken string, ([^)]+)\) \{[^}]*return _i\.(\w+)Repository\.(\w+)\(clientId,'
$Matches = [regex]::Matches($Content, $MethodPattern)
foreach ($Match in $Matches) {
$ServiceName = $Match.Groups[1].Value
$MethodName = $Match.Groups[2].Value
$Parameters = $Match.Groups[3].Value
Write-Host "Adding clientId extraction to method: $MethodName"
# Create the clientId extraction logic
$ExtractionLogic = @"
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return nil, errors.New("clientId not found in auth token")
}
"@
# Replace the method opening with extraction logic
$OldMethodStart = "func (_i *${ServiceName}Service) ${MethodName}(authToken string, ${Parameters}) {"
$NewMethodStart = "func (_i *${ServiceName}Service) ${MethodName}(authToken string, ${Parameters}) {${ExtractionLogic}"
$Content = $Content -replace [regex]::Escape($OldMethodStart), $NewMethodStart
}
# Write updated content
Set-Content $FilePath $Content -NoNewline
Write-Host "ClientId extraction added to remaining methods."

View File

@ -86,7 +86,7 @@ func (_i *activityLogsService) Save(clientId *uuid.UUID, req request.ActivityLog
} }
// update article // update article
err = _i.ArticleService.UpdateActivityCount(clientId, *req.ArticleId, req.ActivityTypeId) err = _i.ArticleService.UpdateActivityCount(*authToken, *req.ArticleId, req.ActivityTypeId)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -2,7 +2,6 @@ package controller
import ( import (
"netidhub-saas-be/app/database/entity" "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/request"
"netidhub-saas-be/app/module/approval_workflow_steps/service" "netidhub-saas-be/app/module/approval_workflow_steps/service"
"netidhub-saas-be/utils/paginator" "netidhub-saas-be/utils/paginator"
@ -82,7 +81,7 @@ func NewApprovalWorkflowStepsController(approvalWorkflowStepsService service.App
// @Description API for getting all ApprovalWorkflowSteps // @Description API for getting all ApprovalWorkflowSteps
// @Tags ApprovalWorkflowSteps // @Tags ApprovalWorkflowSteps
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Param workflowId query int false "Workflow ID filter" // @Param workflowId query int false "Workflow ID filter"
// @Param stepOrder query int false "Step order filter" // @Param stepOrder query int false "Step order filter"
// @Param stepName query string false "Step name filter" // @Param stepName query string false "Step name filter"
@ -111,12 +110,12 @@ func (_i *approvalWorkflowStepsController) All(c *fiber.Ctx) error {
Limit: 10, Limit: 10,
} }
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
_i.Log.Info().Interface("clientId", clientId).Msg("") _i.Log.Info().Interface("authToken", authToken).Msg("")
approvalWorkflowStepsData, paging, err := _i.approvalWorkflowStepsService.GetAll(clientId, req) approvalWorkflowStepsData, paging, err := _i.approvalWorkflowStepsService.GetAll(authToken, req)
if err != nil { if err != nil {
return err return err
} }
@ -134,7 +133,7 @@ func (_i *approvalWorkflowStepsController) All(c *fiber.Ctx) error {
// @Description API for getting one ApprovalWorkflowSteps // @Description API for getting one ApprovalWorkflowSteps
// @Tags ApprovalWorkflowSteps // @Tags ApprovalWorkflowSteps
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Param id path int true "ApprovalWorkflowSteps ID" // @Param id path int true "ApprovalWorkflowSteps ID"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
@ -147,10 +146,10 @@ func (_i *approvalWorkflowStepsController) Show(c *fiber.Ctx) error {
return utilRes.ErrorBadRequest(c, "Invalid ID format") return utilRes.ErrorBadRequest(c, "Invalid ID format")
} }
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
approvalWorkflowStepsData, err := _i.approvalWorkflowStepsService.FindOne(clientId, uint(id)) approvalWorkflowStepsData, err := _i.approvalWorkflowStepsService.FindOne(authToken, uint(id))
if err != nil { if err != nil {
return err return err
} }
@ -167,7 +166,7 @@ func (_i *approvalWorkflowStepsController) Show(c *fiber.Ctx) error {
// @Description API for saving ApprovalWorkflowSteps // @Description API for saving ApprovalWorkflowSteps
// @Tags ApprovalWorkflowSteps // @Tags ApprovalWorkflowSteps
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Param payload body request.CreateApprovalWorkflowStepsRequest true "Required payload" // @Param payload body request.CreateApprovalWorkflowStepsRequest true "Required payload"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
@ -180,8 +179,8 @@ func (_i *approvalWorkflowStepsController) Save(c *fiber.Ctx) error {
return err return err
} }
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
// Convert request to entity // Convert request to entity
step := &entity.ApprovalWorkflowSteps{ step := &entity.ApprovalWorkflowSteps{
@ -192,7 +191,7 @@ func (_i *approvalWorkflowStepsController) Save(c *fiber.Ctx) error {
CanSkip: &req.IsOptional, CanSkip: &req.IsOptional,
} }
approvalWorkflowStepsData, err := _i.approvalWorkflowStepsService.Create(clientId, step) approvalWorkflowStepsData, err := _i.approvalWorkflowStepsService.Create(authToken, step)
if err != nil { if err != nil {
return err return err
} }
@ -209,7 +208,7 @@ func (_i *approvalWorkflowStepsController) Save(c *fiber.Ctx) error {
// @Description API for updating ApprovalWorkflowSteps // @Description API for updating ApprovalWorkflowSteps
// @Tags ApprovalWorkflowSteps // @Tags ApprovalWorkflowSteps
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Param id path int true "ApprovalWorkflowSteps ID" // @Param id path int true "ApprovalWorkflowSteps ID"
// @Param payload body request.UpdateApprovalWorkflowStepsRequest true "Required payload" // @Param payload body request.UpdateApprovalWorkflowStepsRequest true "Required payload"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
@ -228,8 +227,8 @@ func (_i *approvalWorkflowStepsController) Update(c *fiber.Ctx) error {
return err return err
} }
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
// Convert request to entity // Convert request to entity
step := &entity.ApprovalWorkflowSteps{} step := &entity.ApprovalWorkflowSteps{}
@ -246,7 +245,7 @@ func (_i *approvalWorkflowStepsController) Update(c *fiber.Ctx) error {
step.CanSkip = req.IsOptional step.CanSkip = req.IsOptional
} }
err = _i.approvalWorkflowStepsService.Update(clientId, uint(id), step) err = _i.approvalWorkflowStepsService.Update(authToken, uint(id), step)
if err != nil { if err != nil {
return err return err
} }
@ -262,7 +261,7 @@ func (_i *approvalWorkflowStepsController) Update(c *fiber.Ctx) error {
// @Description API for deleting ApprovalWorkflowSteps // @Description API for deleting ApprovalWorkflowSteps
// @Tags ApprovalWorkflowSteps // @Tags ApprovalWorkflowSteps
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Param id path int true "ApprovalWorkflowSteps ID" // @Param id path int true "ApprovalWorkflowSteps ID"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
@ -275,10 +274,10 @@ func (_i *approvalWorkflowStepsController) Delete(c *fiber.Ctx) error {
return utilRes.ErrorBadRequest(c, "Invalid ID format") return utilRes.ErrorBadRequest(c, "Invalid ID format")
} }
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
err = _i.approvalWorkflowStepsService.Delete(clientId, uint(id)) err = _i.approvalWorkflowStepsService.Delete(authToken, uint(id))
if err != nil { if err != nil {
return err return err
} }
@ -294,7 +293,7 @@ func (_i *approvalWorkflowStepsController) Delete(c *fiber.Ctx) error {
// @Description API for getting ApprovalWorkflowSteps by Workflow ID // @Description API for getting ApprovalWorkflowSteps by Workflow ID
// @Tags ApprovalWorkflowSteps // @Tags ApprovalWorkflowSteps
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Param workflowId path int true "Workflow ID" // @Param workflowId path int true "Workflow ID"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
@ -307,10 +306,10 @@ func (_i *approvalWorkflowStepsController) GetByWorkflow(c *fiber.Ctx) error {
return utilRes.ErrorBadRequest(c, "Invalid workflow ID format") return utilRes.ErrorBadRequest(c, "Invalid workflow ID format")
} }
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
approvalWorkflowStepsData, err := _i.approvalWorkflowStepsService.GetByWorkflowID(clientId, uint(workflowId)) approvalWorkflowStepsData, err := _i.approvalWorkflowStepsService.GetByWorkflowID(authToken, uint(workflowId))
if err != nil { if err != nil {
return err return err
} }
@ -327,7 +326,7 @@ func (_i *approvalWorkflowStepsController) GetByWorkflow(c *fiber.Ctx) error {
// @Description API for getting ApprovalWorkflowSteps by Role ID // @Description API for getting ApprovalWorkflowSteps by Role ID
// @Tags ApprovalWorkflowSteps // @Tags ApprovalWorkflowSteps
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Param roleId path int true "Role ID" // @Param roleId path int true "Role ID"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
@ -340,10 +339,10 @@ func (_i *approvalWorkflowStepsController) GetByRole(c *fiber.Ctx) error {
return utilRes.ErrorBadRequest(c, "Invalid role ID format") return utilRes.ErrorBadRequest(c, "Invalid role ID format")
} }
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
approvalWorkflowStepsData, err := _i.approvalWorkflowStepsService.GetByWorkflowID(clientId, uint(roleId)) approvalWorkflowStepsData, err := _i.approvalWorkflowStepsService.GetByWorkflowID(authToken, uint(roleId))
if err != nil { if err != nil {
return err return err
} }
@ -360,7 +359,7 @@ func (_i *approvalWorkflowStepsController) GetByRole(c *fiber.Ctx) error {
// @Description API for bulk creating ApprovalWorkflowSteps // @Description API for bulk creating ApprovalWorkflowSteps
// @Tags ApprovalWorkflowSteps // @Tags ApprovalWorkflowSteps
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Param payload body request.BulkCreateApprovalWorkflowStepsRequest true "Required payload" // @Param payload body request.BulkCreateApprovalWorkflowStepsRequest true "Required payload"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
@ -373,8 +372,8 @@ func (_i *approvalWorkflowStepsController) BulkSave(c *fiber.Ctx) error {
return err return err
} }
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
// Convert request to entities // Convert request to entities
var steps []*entity.ApprovalWorkflowSteps var steps []*entity.ApprovalWorkflowSteps
@ -389,7 +388,7 @@ func (_i *approvalWorkflowStepsController) BulkSave(c *fiber.Ctx) error {
steps = append(steps, step) steps = append(steps, step)
} }
approvalWorkflowStepsData, err := _i.approvalWorkflowStepsService.BulkCreate(clientId, req.WorkflowID, steps) approvalWorkflowStepsData, err := _i.approvalWorkflowStepsService.BulkCreate(authToken, req.WorkflowID, steps)
if err != nil { if err != nil {
return err return err
} }
@ -406,7 +405,7 @@ func (_i *approvalWorkflowStepsController) BulkSave(c *fiber.Ctx) error {
// @Description API for reordering ApprovalWorkflowSteps // @Description API for reordering ApprovalWorkflowSteps
// @Tags ApprovalWorkflowSteps // @Tags ApprovalWorkflowSteps
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Param workflowId path int true "Workflow ID" // @Param workflowId path int true "Workflow ID"
// @Param payload body request.ReorderApprovalWorkflowStepsRequest true "Required payload" // @Param payload body request.ReorderApprovalWorkflowStepsRequest true "Required payload"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
@ -425,13 +424,13 @@ func (_i *approvalWorkflowStepsController) Reorder(c *fiber.Ctx) error {
return err return err
} }
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
// Convert request to expected format // Convert request to expected format
stepOrders := req.ToStepOrders() stepOrders := req.ToStepOrders()
err = _i.approvalWorkflowStepsService.ReorderSteps(clientId, uint(workflowId), stepOrders) err = _i.approvalWorkflowStepsService.ReorderSteps(authToken, uint(workflowId), stepOrders)
if err != nil { if err != nil {
return err return err
} }

View File

@ -7,7 +7,9 @@ import (
"netidhub-saas-be/app/module/approval_workflow_steps/repository" "netidhub-saas-be/app/module/approval_workflow_steps/repository"
"netidhub-saas-be/app/module/approval_workflow_steps/request" "netidhub-saas-be/app/module/approval_workflow_steps/request"
workflowRepo "netidhub-saas-be/app/module/approval_workflows/repository" workflowRepo "netidhub-saas-be/app/module/approval_workflows/repository"
usersRepo "netidhub-saas-be/app/module/users/repository"
"netidhub-saas-be/utils/paginator" "netidhub-saas-be/utils/paginator"
utilSvc "netidhub-saas-be/utils/service"
"github.com/google/uuid" "github.com/google/uuid"
"github.com/rs/zerolog" "github.com/rs/zerolog"
@ -16,54 +18,99 @@ import (
type approvalWorkflowStepsService struct { type approvalWorkflowStepsService struct {
ApprovalWorkflowStepsRepository repository.ApprovalWorkflowStepsRepository ApprovalWorkflowStepsRepository repository.ApprovalWorkflowStepsRepository
ApprovalWorkflowsRepository workflowRepo.ApprovalWorkflowsRepository ApprovalWorkflowsRepository workflowRepo.ApprovalWorkflowsRepository
UsersRepository usersRepo.UsersRepository
Log zerolog.Logger Log zerolog.Logger
} }
// ApprovalWorkflowStepsService define interface of IApprovalWorkflowStepsService // ApprovalWorkflowStepsService define interface of IApprovalWorkflowStepsService
type ApprovalWorkflowStepsService interface { type ApprovalWorkflowStepsService interface {
// Basic CRUD // Basic CRUD
GetAll(clientId *uuid.UUID, req request.GetApprovalWorkflowStepsRequest) (steps []*entity.ApprovalWorkflowSteps, paging paginator.Pagination, err error) GetAll(authToken string, req request.GetApprovalWorkflowStepsRequest) (steps []*entity.ApprovalWorkflowSteps, paging paginator.Pagination, err error)
FindOne(clientId *uuid.UUID, id uint) (step *entity.ApprovalWorkflowSteps, err error) FindOne(authToken string, id uint) (step *entity.ApprovalWorkflowSteps, err error)
Create(clientId *uuid.UUID, step *entity.ApprovalWorkflowSteps) (stepReturn *entity.ApprovalWorkflowSteps, err error) Create(authToken string, step *entity.ApprovalWorkflowSteps) (stepReturn *entity.ApprovalWorkflowSteps, err error)
Update(clientId *uuid.UUID, id uint, step *entity.ApprovalWorkflowSteps) (err error) Update(authToken string, id uint, step *entity.ApprovalWorkflowSteps) (err error)
Delete(clientId *uuid.UUID, id uint) (err error) Delete(authToken string, id uint) (err error)
// Workflow steps management // Workflow steps management
GetByWorkflowID(clientId *uuid.UUID, workflowID uint) (steps []*entity.ApprovalWorkflowSteps, err error) GetByWorkflowID(authToken string, workflowID uint) (steps []*entity.ApprovalWorkflowSteps, err error)
// GetByRoleID(clientId *uuid.UUID, roleID uint) (steps []*entity.ApprovalWorkflowSteps, err error) // Not implemented yet // GetByRoleID(authToken string, roleID uint) (steps []*entity.ApprovalWorkflowSteps, err error) // Not implemented yet
BulkCreate(clientId *uuid.UUID, workflowID uint, steps []*entity.ApprovalWorkflowSteps) (stepsReturn []*entity.ApprovalWorkflowSteps, err error) BulkCreate(authToken string, workflowID uint, steps []*entity.ApprovalWorkflowSteps) (stepsReturn []*entity.ApprovalWorkflowSteps, err error)
ReorderSteps(clientId *uuid.UUID, workflowID uint, stepOrders []struct { ReorderSteps(authToken string, workflowID uint, stepOrders []struct {
ID uint ID uint
StepOrder int StepOrder int
}) (err error) }) (err error)
// Validation // Validation
ValidateStep(clientId *uuid.UUID, step *entity.ApprovalWorkflowSteps) (isValid bool, errors []string, err error) ValidateStep(authToken string, step *entity.ApprovalWorkflowSteps) (isValid bool, errors []string, err error)
CanDeleteStep(clientId *uuid.UUID, id uint) (canDelete bool, reason string, err error) CanDeleteStep(authToken string, id uint) (canDelete bool, reason string, err error)
ValidateStepOrder(clientId *uuid.UUID, workflowID uint, stepOrder int, excludeID *uint) (isValid bool, err error) ValidateStepOrder(authToken string, workflowID uint, stepOrder int, excludeID *uint) (isValid bool, err error)
} }
func NewApprovalWorkflowStepsService( func NewApprovalWorkflowStepsService(
approvalWorkflowStepsRepository repository.ApprovalWorkflowStepsRepository, approvalWorkflowStepsRepository repository.ApprovalWorkflowStepsRepository,
approvalWorkflowsRepository workflowRepo.ApprovalWorkflowsRepository, approvalWorkflowsRepository workflowRepo.ApprovalWorkflowsRepository,
usersRepository usersRepo.UsersRepository,
log zerolog.Logger, log zerolog.Logger,
) ApprovalWorkflowStepsService { ) ApprovalWorkflowStepsService {
return &approvalWorkflowStepsService{ return &approvalWorkflowStepsService{
ApprovalWorkflowStepsRepository: approvalWorkflowStepsRepository, ApprovalWorkflowStepsRepository: approvalWorkflowStepsRepository,
ApprovalWorkflowsRepository: approvalWorkflowsRepository, ApprovalWorkflowsRepository: approvalWorkflowsRepository,
UsersRepository: usersRepository,
Log: log, Log: log,
} }
} }
func (_i *approvalWorkflowStepsService) GetAll(clientId *uuid.UUID, req request.GetApprovalWorkflowStepsRequest) (steps []*entity.ApprovalWorkflowSteps, paging paginator.Pagination, err error) { func (_i *approvalWorkflowStepsService) GetAll(authToken string, req request.GetApprovalWorkflowStepsRequest) (steps []*entity.ApprovalWorkflowSteps, paging paginator.Pagination, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return nil, paginator.Pagination{}, errors.New("clientId not found in auth token")
}
return _i.ApprovalWorkflowStepsRepository.GetAll(clientId, req) return _i.ApprovalWorkflowStepsRepository.GetAll(clientId, req)
} }
func (_i *approvalWorkflowStepsService) FindOne(clientId *uuid.UUID, id uint) (step *entity.ApprovalWorkflowSteps, err error) { func (_i *approvalWorkflowStepsService) FindOne(authToken string, id uint) (step *entity.ApprovalWorkflowSteps, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return nil, errors.New("clientId not found in auth token")
}
return _i.ApprovalWorkflowStepsRepository.FindOne(clientId, id) return _i.ApprovalWorkflowStepsRepository.FindOne(clientId, id)
} }
func (_i *approvalWorkflowStepsService) Create(clientId *uuid.UUID, step *entity.ApprovalWorkflowSteps) (stepReturn *entity.ApprovalWorkflowSteps, err error) { func (_i *approvalWorkflowStepsService) Create(authToken string, step *entity.ApprovalWorkflowSteps) (stepReturn *entity.ApprovalWorkflowSteps, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return nil, errors.New("clientId not found in auth token")
}
// Validate workflow exists // Validate workflow exists
workflow, err := _i.ApprovalWorkflowsRepository.FindOne(clientId, step.WorkflowId) workflow, err := _i.ApprovalWorkflowsRepository.FindOne(clientId, step.WorkflowId)
if err != nil { if err != nil {
@ -74,7 +121,7 @@ func (_i *approvalWorkflowStepsService) Create(clientId *uuid.UUID, step *entity
} }
// Validate step order is unique within workflow // Validate step order is unique within workflow
isValid, err := _i.ValidateStepOrder(clientId, step.WorkflowId, step.StepOrder, nil) isValid, err := _i.ValidateStepOrder(authToken, step.WorkflowId, step.StepOrder, nil)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -83,7 +130,7 @@ func (_i *approvalWorkflowStepsService) Create(clientId *uuid.UUID, step *entity
} }
// Validate step data // Validate step data
isValid, validationErrors, err := _i.ValidateStep(clientId, step) isValid, validationErrors, err := _i.ValidateStep(authToken, step)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -94,7 +141,21 @@ func (_i *approvalWorkflowStepsService) Create(clientId *uuid.UUID, step *entity
return _i.ApprovalWorkflowStepsRepository.Create(clientId, step) return _i.ApprovalWorkflowStepsRepository.Create(clientId, step)
} }
func (_i *approvalWorkflowStepsService) Update(clientId *uuid.UUID, id uint, step *entity.ApprovalWorkflowSteps) (err error) { func (_i *approvalWorkflowStepsService) Update(authToken string, id uint, step *entity.ApprovalWorkflowSteps) (err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return errors.New("clientId not found in auth token")
}
// Check if step exists // Check if step exists
existingStep, err := _i.ApprovalWorkflowStepsRepository.FindOne(clientId, id) existingStep, err := _i.ApprovalWorkflowStepsRepository.FindOne(clientId, id)
if err != nil { if err != nil {
@ -106,7 +167,7 @@ func (_i *approvalWorkflowStepsService) Update(clientId *uuid.UUID, id uint, ste
// If step order is being changed, validate it's unique // If step order is being changed, validate it's unique
if step.StepOrder != 0 && step.StepOrder != existingStep.StepOrder { if step.StepOrder != 0 && step.StepOrder != existingStep.StepOrder {
isValid, err := _i.ValidateStepOrder(clientId, existingStep.WorkflowId, step.StepOrder, &id) isValid, err := _i.ValidateStepOrder(authToken, existingStep.WorkflowId, step.StepOrder, &id)
if err != nil { if err != nil {
return err return err
} }
@ -118,9 +179,23 @@ func (_i *approvalWorkflowStepsService) Update(clientId *uuid.UUID, id uint, ste
return _i.ApprovalWorkflowStepsRepository.Update(id, step) return _i.ApprovalWorkflowStepsRepository.Update(id, step)
} }
func (_i *approvalWorkflowStepsService) Delete(clientId *uuid.UUID, id uint) (err error) { func (_i *approvalWorkflowStepsService) Delete(authToken string, id uint) (err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return errors.New("clientId not found in auth token")
}
// Check if step can be deleted // Check if step can be deleted
canDelete, reason, err := _i.CanDeleteStep(clientId, id) canDelete, reason, err := _i.CanDeleteStep(authToken, id)
if err != nil { if err != nil {
return err return err
} }
@ -131,16 +206,44 @@ func (_i *approvalWorkflowStepsService) Delete(clientId *uuid.UUID, id uint) (er
return _i.ApprovalWorkflowStepsRepository.Delete(clientId, id) return _i.ApprovalWorkflowStepsRepository.Delete(clientId, id)
} }
func (_i *approvalWorkflowStepsService) GetByWorkflowID(clientId *uuid.UUID, workflowID uint) (steps []*entity.ApprovalWorkflowSteps, err error) { func (_i *approvalWorkflowStepsService) GetByWorkflowID(authToken string, workflowID uint) (steps []*entity.ApprovalWorkflowSteps, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return nil, errors.New("clientId not found in auth token")
}
return _i.ApprovalWorkflowStepsRepository.GetByWorkflowId(clientId, workflowID) return _i.ApprovalWorkflowStepsRepository.GetByWorkflowId(clientId, workflowID)
} }
// GetByRoleID method is not implemented in repository yet // GetByRoleID method is not implemented in repository yet
// func (_i *approvalWorkflowStepsService) GetByRoleID(clientId *uuid.UUID, roleID uint) (steps []*entity.ApprovalWorkflowSteps, err error) { // func (_i *approvalWorkflowStepsService) GetByRoleID(authToken string, roleID uint) (steps []*entity.ApprovalWorkflowSteps, err error) {
// return _i.ApprovalWorkflowStepsRepository.GetByRoleID(clientId, roleID) // return _i.ApprovalWorkflowStepsRepository.GetByRoleID(clientId, roleID)
// } // }
func (_i *approvalWorkflowStepsService) BulkCreate(clientId *uuid.UUID, workflowID uint, steps []*entity.ApprovalWorkflowSteps) (stepsReturn []*entity.ApprovalWorkflowSteps, err error) { func (_i *approvalWorkflowStepsService) BulkCreate(authToken string, workflowID uint, steps []*entity.ApprovalWorkflowSteps) (stepsReturn []*entity.ApprovalWorkflowSteps, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return nil, errors.New("clientId not found in auth token")
}
// Validate workflow exists // Validate workflow exists
workflow, err := _i.ApprovalWorkflowsRepository.FindOne(clientId, workflowID) workflow, err := _i.ApprovalWorkflowsRepository.FindOne(clientId, workflowID)
if err != nil { if err != nil {
@ -162,7 +265,7 @@ func (_i *approvalWorkflowStepsService) BulkCreate(clientId *uuid.UUID, workflow
stepOrders[step.StepOrder] = true stepOrders[step.StepOrder] = true
// Validate step order is unique in database // Validate step order is unique in database
isValid, err := _i.ValidateStepOrder(clientId, workflowID, step.StepOrder, nil) isValid, err := _i.ValidateStepOrder(authToken, workflowID, step.StepOrder, nil)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -198,10 +301,24 @@ func (_i *approvalWorkflowStepsService) BulkCreate(clientId *uuid.UUID, workflow
return nil, fmt.Errorf("BulkCreate method not implemented yet") return nil, fmt.Errorf("BulkCreate method not implemented yet")
} }
func (_i *approvalWorkflowStepsService) ReorderSteps(clientId *uuid.UUID, workflowID uint, stepOrders []struct { func (_i *approvalWorkflowStepsService) ReorderSteps(authToken string, workflowID uint, stepOrders []struct {
ID uint ID uint
StepOrder int StepOrder int
}) (err error) { }) (err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return errors.New("clientId not found in auth token")
}
// Validate workflow exists // Validate workflow exists
workflow, err := _i.ApprovalWorkflowsRepository.FindOne(clientId, workflowID) workflow, err := _i.ApprovalWorkflowsRepository.FindOne(clientId, workflowID)
if err != nil { if err != nil {
@ -245,7 +362,7 @@ func (_i *approvalWorkflowStepsService) ReorderSteps(clientId *uuid.UUID, workfl
return _i.ApprovalWorkflowStepsRepository.ReorderSteps(clientId, workflowID, stepOrderMaps) return _i.ApprovalWorkflowStepsRepository.ReorderSteps(clientId, workflowID, stepOrderMaps)
} }
func (_i *approvalWorkflowStepsService) ValidateStep(clientId *uuid.UUID, step *entity.ApprovalWorkflowSteps) (isValid bool, errors []string, err error) { func (_i *approvalWorkflowStepsService) ValidateStep(authToken string, step *entity.ApprovalWorkflowSteps) (isValid bool, errors []string, err error) {
var validationErrors []string var validationErrors []string
// Validate step name // Validate step name
@ -280,7 +397,21 @@ func (_i *approvalWorkflowStepsService) ValidateStep(clientId *uuid.UUID, step *
return len(validationErrors) == 0, validationErrors, nil return len(validationErrors) == 0, validationErrors, nil
} }
func (_i *approvalWorkflowStepsService) CanDeleteStep(clientId *uuid.UUID, id uint) (canDelete bool, reason string, err error) { func (_i *approvalWorkflowStepsService) CanDeleteStep(authToken string, id uint) (canDelete bool, reason string, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return false, "clientId not found in auth token", errors.New("clientId not found in auth token")
}
// Check if step exists // Check if step exists
step, err := _i.ApprovalWorkflowStepsRepository.FindOne(clientId, id) step, err := _i.ApprovalWorkflowStepsRepository.FindOne(clientId, id)
if err != nil { if err != nil {
@ -298,7 +429,21 @@ func (_i *approvalWorkflowStepsService) CanDeleteStep(clientId *uuid.UUID, id ui
return true, "", nil return true, "", nil
} }
func (_i *approvalWorkflowStepsService) ValidateStepOrder(clientId *uuid.UUID, workflowID uint, stepOrder int, excludeID *uint) (isValid bool, err error) { func (_i *approvalWorkflowStepsService) ValidateStepOrder(authToken string, workflowID uint, stepOrder int, excludeID *uint) (isValid bool, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return false, errors.New("clientId not found in auth token")
}
existingStep, err := _i.ApprovalWorkflowStepsRepository.FindByWorkflowAndStep(clientId, workflowID, stepOrder) existingStep, err := _i.ApprovalWorkflowStepsRepository.FindByWorkflowAndStep(clientId, workflowID, stepOrder)
if err != nil { if err != nil {
return false, err return false, err

View File

@ -1,15 +1,15 @@
package controller package controller
import ( import (
"github.com/gofiber/fiber/v2"
"github.com/rs/zerolog"
"netidhub-saas-be/app/database/entity" "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/request"
"netidhub-saas-be/app/module/approval_workflows/service" "netidhub-saas-be/app/module/approval_workflows/service"
"netidhub-saas-be/utils/paginator" "netidhub-saas-be/utils/paginator"
"strconv" "strconv"
"github.com/gofiber/fiber/v2"
"github.com/rs/zerolog"
utilRes "netidhub-saas-be/utils/response" utilRes "netidhub-saas-be/utils/response"
utilVal "netidhub-saas-be/utils/validator" utilVal "netidhub-saas-be/utils/validator"
) )
@ -46,7 +46,7 @@ func NewApprovalWorkflowsController(approvalWorkflowsService service.ApprovalWor
// @Description API for getting all ApprovalWorkflows // @Description API for getting all ApprovalWorkflows
// @Tags ApprovalWorkflows // @Tags ApprovalWorkflows
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Param req query request.ApprovalWorkflowsQueryRequest false "query parameters" // @Param req query request.ApprovalWorkflowsQueryRequest false "query parameters"
// @Param req query paginator.Pagination false "pagination parameters" // @Param req query paginator.Pagination false "pagination parameters"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
@ -69,12 +69,12 @@ func (_i *approvalWorkflowsController) All(c *fiber.Ctx) error {
req := reqContext.ToParamRequest() req := reqContext.ToParamRequest()
req.Pagination = paginate req.Pagination = paginate
// Get ClientId from context // Get authToken from context
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
_i.Log.Info().Interface("clientId", clientId).Msg("") _i.Log.Info().Interface("authToken", authToken).Msg("")
approvalWorkflowsData, paging, err := _i.approvalWorkflowsService.GetAll(clientId, req) approvalWorkflowsData, paging, err := _i.approvalWorkflowsService.GetAll(authToken, req)
if err != nil { if err != nil {
return err return err
} }
@ -92,7 +92,7 @@ func (_i *approvalWorkflowsController) All(c *fiber.Ctx) error {
// @Description API for getting one ApprovalWorkflows // @Description API for getting one ApprovalWorkflows
// @Tags ApprovalWorkflows // @Tags ApprovalWorkflows
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Param id path int true "ApprovalWorkflows ID" // @Param id path int true "ApprovalWorkflows ID"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
@ -105,10 +105,10 @@ func (_i *approvalWorkflowsController) Show(c *fiber.Ctx) error {
return utilRes.ErrorBadRequest(c, "Invalid ID format") return utilRes.ErrorBadRequest(c, "Invalid ID format")
} }
// Get ClientId from context // Get authToken from context
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
approvalWorkflowsData, err := _i.approvalWorkflowsService.FindOne(clientId, uint(id)) approvalWorkflowsData, err := _i.approvalWorkflowsService.FindOne(authToken, uint(id))
if err != nil { if err != nil {
return err return err
} }
@ -125,7 +125,7 @@ func (_i *approvalWorkflowsController) Show(c *fiber.Ctx) error {
// @Description API for saving ApprovalWorkflows // @Description API for saving ApprovalWorkflows
// @Tags ApprovalWorkflows // @Tags ApprovalWorkflows
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Param payload body request.ApprovalWorkflowsCreateRequest true "Required payload" // @Param payload body request.ApprovalWorkflowsCreateRequest true "Required payload"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
@ -138,14 +138,14 @@ func (_i *approvalWorkflowsController) Save(c *fiber.Ctx) error {
return err return err
} }
// Get ClientId from context // Get authToken from context
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
// Convert request to entity // Convert request to entity
workflow := req.ToEntity() workflow := req.ToEntity()
steps := req.ToStepsEntity() steps := req.ToStepsEntity()
approvalWorkflowsData, err := _i.approvalWorkflowsService.Create(clientId, workflow, steps) approvalWorkflowsData, err := _i.approvalWorkflowsService.Create(authToken, workflow, steps)
if err != nil { if err != nil {
return err return err
} }
@ -162,7 +162,7 @@ func (_i *approvalWorkflowsController) Save(c *fiber.Ctx) error {
// @Description API for updating ApprovalWorkflows // @Description API for updating ApprovalWorkflows
// @Tags ApprovalWorkflows // @Tags ApprovalWorkflows
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Param id path int true "ApprovalWorkflows ID" // @Param id path int true "ApprovalWorkflows ID"
// @Param payload body request.ApprovalWorkflowsUpdateRequest true "Required payload" // @Param payload body request.ApprovalWorkflowsUpdateRequest true "Required payload"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
@ -181,13 +181,13 @@ func (_i *approvalWorkflowsController) Update(c *fiber.Ctx) error {
return err return err
} }
// Get ClientId from context // Get authToken from context
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
// Convert request to entity // Convert request to entity
workflow := req.ToEntity() workflow := req.ToEntity()
err = _i.approvalWorkflowsService.Update(clientId, uint(id), workflow) err = _i.approvalWorkflowsService.Update(authToken, uint(id), workflow)
if err != nil { if err != nil {
return err return err
} }
@ -203,7 +203,7 @@ func (_i *approvalWorkflowsController) Update(c *fiber.Ctx) error {
// @Description API for deleting ApprovalWorkflows // @Description API for deleting ApprovalWorkflows
// @Tags ApprovalWorkflows // @Tags ApprovalWorkflows
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Param id path int true "ApprovalWorkflows ID" // @Param id path int true "ApprovalWorkflows ID"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
@ -216,10 +216,10 @@ func (_i *approvalWorkflowsController) Delete(c *fiber.Ctx) error {
return utilRes.ErrorBadRequest(c, "Invalid ID format") return utilRes.ErrorBadRequest(c, "Invalid ID format")
} }
// Get ClientId from context // Get authToken from context
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
err = _i.approvalWorkflowsService.Delete(clientId, uint(id)) err = _i.approvalWorkflowsService.Delete(authToken, uint(id))
if err != nil { if err != nil {
return err return err
} }
@ -235,17 +235,17 @@ func (_i *approvalWorkflowsController) Delete(c *fiber.Ctx) error {
// @Description API for getting default ApprovalWorkflows // @Description API for getting default ApprovalWorkflows
// @Tags ApprovalWorkflows // @Tags ApprovalWorkflows
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
// @Failure 401 {object} response.UnauthorizedError // @Failure 401 {object} response.UnauthorizedError
// @Failure 500 {object} response.InternalServerError // @Failure 500 {object} response.InternalServerError
// @Router /approval-workflows/default [get] // @Router /approval-workflows/default [get]
func (_i *approvalWorkflowsController) GetDefault(c *fiber.Ctx) error { func (_i *approvalWorkflowsController) GetDefault(c *fiber.Ctx) error {
// Get ClientId from context // Get authToken from context
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
approvalWorkflowsData, err := _i.approvalWorkflowsService.GetDefault(clientId) approvalWorkflowsData, err := _i.approvalWorkflowsService.GetDefault(authToken)
if err != nil { if err != nil {
return err return err
} }
@ -262,7 +262,7 @@ func (_i *approvalWorkflowsController) GetDefault(c *fiber.Ctx) error {
// @Description API for setting default ApprovalWorkflows // @Description API for setting default ApprovalWorkflows
// @Tags ApprovalWorkflows // @Tags ApprovalWorkflows
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Param id path int true "ApprovalWorkflows ID" // @Param id path int true "ApprovalWorkflows ID"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
@ -275,10 +275,10 @@ func (_i *approvalWorkflowsController) SetDefault(c *fiber.Ctx) error {
return utilRes.ErrorBadRequest(c, "Invalid ID format") return utilRes.ErrorBadRequest(c, "Invalid ID format")
} }
// Get ClientId from context // Get authToken from context
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
err = _i.approvalWorkflowsService.SetDefault(clientId, uint(id)) err = _i.approvalWorkflowsService.SetDefault(authToken, uint(id))
if err != nil { if err != nil {
return err return err
} }
@ -294,7 +294,7 @@ func (_i *approvalWorkflowsController) SetDefault(c *fiber.Ctx) error {
// @Description API for activating ApprovalWorkflows // @Description API for activating ApprovalWorkflows
// @Tags ApprovalWorkflows // @Tags ApprovalWorkflows
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Param id path int true "ApprovalWorkflows ID" // @Param id path int true "ApprovalWorkflows ID"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
@ -307,10 +307,10 @@ func (_i *approvalWorkflowsController) Activate(c *fiber.Ctx) error {
return utilRes.ErrorBadRequest(c, "Invalid ID format") return utilRes.ErrorBadRequest(c, "Invalid ID format")
} }
// Get ClientId from context // Get authToken from context
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
err = _i.approvalWorkflowsService.ActivateWorkflow(clientId, uint(id)) err = _i.approvalWorkflowsService.ActivateWorkflow(authToken, uint(id))
if err != nil { if err != nil {
return err return err
} }
@ -326,7 +326,7 @@ func (_i *approvalWorkflowsController) Activate(c *fiber.Ctx) error {
// @Description API for deactivating ApprovalWorkflows // @Description API for deactivating ApprovalWorkflows
// @Tags ApprovalWorkflows // @Tags ApprovalWorkflows
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Param id path int true "ApprovalWorkflows ID" // @Param id path int true "ApprovalWorkflows ID"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
@ -339,10 +339,10 @@ func (_i *approvalWorkflowsController) Deactivate(c *fiber.Ctx) error {
return utilRes.ErrorBadRequest(c, "Invalid ID format") return utilRes.ErrorBadRequest(c, "Invalid ID format")
} }
// Get ClientId from context // Get authToken from context
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
err = _i.approvalWorkflowsService.DeactivateWorkflow(clientId, uint(id)) err = _i.approvalWorkflowsService.DeactivateWorkflow(authToken, uint(id))
if err != nil { if err != nil {
return err return err
} }
@ -358,7 +358,7 @@ func (_i *approvalWorkflowsController) Deactivate(c *fiber.Ctx) error {
// @Description API for getting ApprovalWorkflows with steps // @Description API for getting ApprovalWorkflows with steps
// @Tags ApprovalWorkflows // @Tags ApprovalWorkflows
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Param id path int true "ApprovalWorkflows ID" // @Param id path int true "ApprovalWorkflows ID"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
@ -371,10 +371,10 @@ func (_i *approvalWorkflowsController) GetWithSteps(c *fiber.Ctx) error {
return utilRes.ErrorBadRequest(c, "Invalid ID format") return utilRes.ErrorBadRequest(c, "Invalid ID format")
} }
// Get ClientId from context // Get authToken from context
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
workflowData, stepsData, err := _i.approvalWorkflowsService.GetWorkflowWithSteps(clientId, uint(id)) workflowData, stepsData, err := _i.approvalWorkflowsService.GetWorkflowWithSteps(authToken, uint(id))
if err != nil { if err != nil {
return err return err
} }
@ -397,7 +397,7 @@ func (_i *approvalWorkflowsController) GetWithSteps(c *fiber.Ctx) error {
// @Description API for creating ApprovalWorkflows with steps // @Description API for creating ApprovalWorkflows with steps
// @Tags ApprovalWorkflows // @Tags ApprovalWorkflows
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Param req body request.ApprovalWorkflowsWithStepsCreateRequest true "ApprovalWorkflows with steps data" // @Param req body request.ApprovalWorkflowsWithStepsCreateRequest true "ApprovalWorkflows with steps data"
// @Success 201 {object} response.Response // @Success 201 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
@ -410,14 +410,14 @@ func (_i *approvalWorkflowsController) SaveWithSteps(c *fiber.Ctx) error {
return err return err
} }
// Get ClientId from context // Get authToken from context
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
// Convert request to entities // Convert request to entities
workflow := req.ToEntity() workflow := req.ToEntity()
steps := req.ToStepsEntity() steps := req.ToStepsEntity()
approvalWorkflowsData, err := _i.approvalWorkflowsService.CreateWorkflowWithSteps(clientId, workflow, steps) approvalWorkflowsData, err := _i.approvalWorkflowsService.CreateWorkflowWithSteps(authToken, workflow, steps)
if err != nil { if err != nil {
return err return err
} }
@ -434,7 +434,7 @@ func (_i *approvalWorkflowsController) SaveWithSteps(c *fiber.Ctx) error {
// @Description API for updating ApprovalWorkflows with steps // @Description API for updating ApprovalWorkflows with steps
// @Tags ApprovalWorkflows // @Tags ApprovalWorkflows
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Param id path int true "ApprovalWorkflows ID" // @Param id path int true "ApprovalWorkflows ID"
// @Param req body request.ApprovalWorkflowsWithStepsUpdateRequest true "ApprovalWorkflows with steps data" // @Param req body request.ApprovalWorkflowsWithStepsUpdateRequest true "ApprovalWorkflows with steps data"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
@ -453,8 +453,8 @@ func (_i *approvalWorkflowsController) UpdateWithSteps(c *fiber.Ctx) error {
return err return err
} }
// Get ClientId from context // Get authToken from context
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
// Convert request to entities // Convert request to entities
workflow := &entity.ApprovalWorkflows{ workflow := &entity.ApprovalWorkflows{
@ -469,7 +469,7 @@ func (_i *approvalWorkflowsController) UpdateWithSteps(c *fiber.Ctx) error {
steps[i] = stepReq.ToEntity(uint(id)) steps[i] = stepReq.ToEntity(uint(id))
} }
err = _i.approvalWorkflowsService.UpdateWorkflowWithSteps(clientId, uint(id), workflow, steps) err = _i.approvalWorkflowsService.UpdateWorkflowWithSteps(authToken, uint(id), workflow, steps)
if err != nil { if err != nil {
return err return err
} }

View File

@ -3,70 +3,118 @@ package service
import ( import (
"errors" "errors"
"fmt" "fmt"
"github.com/google/uuid"
"github.com/rs/zerolog"
"netidhub-saas-be/app/database/entity" "netidhub-saas-be/app/database/entity"
stepRepo "netidhub-saas-be/app/module/approval_workflow_steps/repository" stepRepo "netidhub-saas-be/app/module/approval_workflow_steps/repository"
"netidhub-saas-be/app/module/approval_workflows/repository" "netidhub-saas-be/app/module/approval_workflows/repository"
"netidhub-saas-be/app/module/approval_workflows/request" "netidhub-saas-be/app/module/approval_workflows/request"
usersRepo "netidhub-saas-be/app/module/users/repository"
"netidhub-saas-be/utils/paginator" "netidhub-saas-be/utils/paginator"
utilSvc "netidhub-saas-be/utils/service"
"github.com/google/uuid"
"github.com/rs/zerolog"
) )
type approvalWorkflowsService struct { type approvalWorkflowsService struct {
ApprovalWorkflowsRepository repository.ApprovalWorkflowsRepository ApprovalWorkflowsRepository repository.ApprovalWorkflowsRepository
ApprovalWorkflowStepsRepository stepRepo.ApprovalWorkflowStepsRepository ApprovalWorkflowStepsRepository stepRepo.ApprovalWorkflowStepsRepository
UsersRepository usersRepo.UsersRepository
Log zerolog.Logger Log zerolog.Logger
} }
// ApprovalWorkflowsService define interface of IApprovalWorkflowsService // ApprovalWorkflowsService define interface of IApprovalWorkflowsService
type ApprovalWorkflowsService interface { type ApprovalWorkflowsService interface {
// Basic CRUD // Basic CRUD
GetAll(clientId *uuid.UUID, req request.ApprovalWorkflowsQueryRequest) (workflows []*entity.ApprovalWorkflows, paging paginator.Pagination, err error) GetAll(authToken string, req request.ApprovalWorkflowsQueryRequest) (workflows []*entity.ApprovalWorkflows, paging paginator.Pagination, err error)
FindOne(clientId *uuid.UUID, id uint) (workflow *entity.ApprovalWorkflows, err error) FindOne(authToken string, id uint) (workflow *entity.ApprovalWorkflows, err error)
Create(clientId *uuid.UUID, workflow *entity.ApprovalWorkflows, steps []*entity.ApprovalWorkflowSteps) (workflowReturn *entity.ApprovalWorkflows, err error) Create(authToken string, workflow *entity.ApprovalWorkflows, steps []*entity.ApprovalWorkflowSteps) (workflowReturn *entity.ApprovalWorkflows, err error)
Update(clientId *uuid.UUID, id uint, workflow *entity.ApprovalWorkflows) (err error) Update(authToken string, id uint, workflow *entity.ApprovalWorkflows) (err error)
Delete(clientId *uuid.UUID, id uint) (err error) Delete(authToken string, id uint) (err error)
// Workflow management // Workflow management
GetDefault(clientId *uuid.UUID) (workflow *entity.ApprovalWorkflows, err error) GetDefault(authToken string) (workflow *entity.ApprovalWorkflows, err error)
SetDefault(clientId *uuid.UUID, id uint) (err error) SetDefault(authToken string, id uint) (err error)
ActivateWorkflow(clientId *uuid.UUID, id uint) (err error) ActivateWorkflow(authToken string, id uint) (err error)
DeactivateWorkflow(clientId *uuid.UUID, id uint) (err error) DeactivateWorkflow(authToken string, id uint) (err error)
// Workflow with steps // Workflow with steps
GetWorkflowWithSteps(clientId *uuid.UUID, id uint) (workflow *entity.ApprovalWorkflows, steps []*entity.ApprovalWorkflowSteps, err error) GetWorkflowWithSteps(authToken string, id uint) (workflow *entity.ApprovalWorkflows, steps []*entity.ApprovalWorkflowSteps, err error)
CreateWorkflowWithSteps(clientId *uuid.UUID, workflow *entity.ApprovalWorkflows, steps []*entity.ApprovalWorkflowSteps) (workflowReturn *entity.ApprovalWorkflows, err error) CreateWorkflowWithSteps(authToken string, workflow *entity.ApprovalWorkflows, steps []*entity.ApprovalWorkflowSteps) (workflowReturn *entity.ApprovalWorkflows, err error)
UpdateWorkflowWithSteps(clientId *uuid.UUID, id uint, workflow *entity.ApprovalWorkflows, steps []*entity.ApprovalWorkflowSteps) (err error) UpdateWorkflowWithSteps(authToken string, id uint, workflow *entity.ApprovalWorkflows, steps []*entity.ApprovalWorkflowSteps) (err error)
// Validation // Validation
ValidateWorkflow(clientId *uuid.UUID, workflow *entity.ApprovalWorkflows, steps []*entity.ApprovalWorkflowSteps) (isValid bool, errors []string, err error) ValidateWorkflow(authToken string, workflow *entity.ApprovalWorkflows, steps []*entity.ApprovalWorkflowSteps) (isValid bool, errors []string, err error)
CanDeleteWorkflow(clientId *uuid.UUID, id uint) (canDelete bool, reason string, err error) CanDeleteWorkflow(authToken string, id uint) (canDelete bool, reason string, err error)
} }
func NewApprovalWorkflowsService( func NewApprovalWorkflowsService(
approvalWorkflowsRepository repository.ApprovalWorkflowsRepository, approvalWorkflowsRepository repository.ApprovalWorkflowsRepository,
approvalWorkflowStepsRepository stepRepo.ApprovalWorkflowStepsRepository, approvalWorkflowStepsRepository stepRepo.ApprovalWorkflowStepsRepository,
usersRepository usersRepo.UsersRepository,
log zerolog.Logger, log zerolog.Logger,
) ApprovalWorkflowsService { ) ApprovalWorkflowsService {
return &approvalWorkflowsService{ return &approvalWorkflowsService{
ApprovalWorkflowsRepository: approvalWorkflowsRepository, ApprovalWorkflowsRepository: approvalWorkflowsRepository,
ApprovalWorkflowStepsRepository: approvalWorkflowStepsRepository, ApprovalWorkflowStepsRepository: approvalWorkflowStepsRepository,
UsersRepository: usersRepository,
Log: log, Log: log,
} }
} }
// Basic CRUD implementations // Basic CRUD implementations
func (_i *approvalWorkflowsService) GetAll(clientId *uuid.UUID, req request.ApprovalWorkflowsQueryRequest) (workflows []*entity.ApprovalWorkflows, paging paginator.Pagination, err error) { func (_i *approvalWorkflowsService) GetAll(authToken string, req request.ApprovalWorkflowsQueryRequest) (workflows []*entity.ApprovalWorkflows, paging paginator.Pagination, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return nil, paginator.Pagination{}, errors.New("clientId not found in auth token")
}
return _i.ApprovalWorkflowsRepository.GetAll(clientId, req) return _i.ApprovalWorkflowsRepository.GetAll(clientId, req)
} }
func (_i *approvalWorkflowsService) FindOne(clientId *uuid.UUID, id uint) (workflow *entity.ApprovalWorkflows, err error) { func (_i *approvalWorkflowsService) FindOne(authToken string, id uint) (workflow *entity.ApprovalWorkflows, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return nil, errors.New("clientId not found in auth token")
}
return _i.ApprovalWorkflowsRepository.FindOne(clientId, id) return _i.ApprovalWorkflowsRepository.FindOne(clientId, id)
} }
func (_i *approvalWorkflowsService) Create(clientId *uuid.UUID, workflow *entity.ApprovalWorkflows, steps []*entity.ApprovalWorkflowSteps) (workflowReturn *entity.ApprovalWorkflows, err error) { func (_i *approvalWorkflowsService) Create(authToken string, workflow *entity.ApprovalWorkflows, steps []*entity.ApprovalWorkflowSteps) (workflowReturn *entity.ApprovalWorkflows, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return nil, errors.New("clientId not found in auth token")
}
// Validate workflow and steps // Validate workflow and steps
isValid, validationErrors, err := _i.ValidateWorkflow(clientId, workflow, steps) isValid, validationErrors, err := _i.ValidateWorkflow(authToken, workflow, steps)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -96,7 +144,21 @@ func (_i *approvalWorkflowsService) Create(clientId *uuid.UUID, workflow *entity
return workflowReturn, nil return workflowReturn, nil
} }
func (_i *approvalWorkflowsService) Update(clientId *uuid.UUID, id uint, workflow *entity.ApprovalWorkflows) (err error) { func (_i *approvalWorkflowsService) Update(authToken string, id uint, workflow *entity.ApprovalWorkflows) (err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return errors.New("clientId not found in auth token")
}
// Check if workflow exists // Check if workflow exists
existingWorkflow, err := _i.ApprovalWorkflowsRepository.FindOne(clientId, id) existingWorkflow, err := _i.ApprovalWorkflowsRepository.FindOne(clientId, id)
if err != nil { if err != nil {
@ -110,9 +172,23 @@ func (_i *approvalWorkflowsService) Update(clientId *uuid.UUID, id uint, workflo
return _i.ApprovalWorkflowsRepository.Update(clientId, id, workflow) return _i.ApprovalWorkflowsRepository.Update(clientId, id, workflow)
} }
func (_i *approvalWorkflowsService) Delete(clientId *uuid.UUID, id uint) (err error) { func (_i *approvalWorkflowsService) Delete(authToken string, id uint) (err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return errors.New("clientId not found in auth token")
}
// Check if workflow can be deleted // Check if workflow can be deleted
canDelete, reason, err := _i.CanDeleteWorkflow(clientId, id) canDelete, reason, err := _i.CanDeleteWorkflow(authToken, id)
if err != nil { if err != nil {
return err return err
} }
@ -125,11 +201,39 @@ func (_i *approvalWorkflowsService) Delete(clientId *uuid.UUID, id uint) (err er
} }
// Workflow management // Workflow management
func (_i *approvalWorkflowsService) GetDefault(clientId *uuid.UUID) (workflow *entity.ApprovalWorkflows, err error) { func (_i *approvalWorkflowsService) GetDefault(authToken string) (workflow *entity.ApprovalWorkflows, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return nil, errors.New("clientId not found in auth token")
}
return _i.ApprovalWorkflowsRepository.FindDefault(clientId) return _i.ApprovalWorkflowsRepository.FindDefault(clientId)
} }
func (_i *approvalWorkflowsService) SetDefault(clientId *uuid.UUID, id uint) (err error) { func (_i *approvalWorkflowsService) SetDefault(authToken string, id uint) (err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return errors.New("clientId not found in auth token")
}
// Check if workflow exists and is active // Check if workflow exists and is active
workflow, err := _i.ApprovalWorkflowsRepository.FindOne(clientId, id) workflow, err := _i.ApprovalWorkflowsRepository.FindOne(clientId, id)
if err != nil { if err != nil {
@ -147,7 +251,21 @@ func (_i *approvalWorkflowsService) SetDefault(clientId *uuid.UUID, id uint) (er
return _i.ApprovalWorkflowsRepository.SetDefault(clientId, id) return _i.ApprovalWorkflowsRepository.SetDefault(clientId, id)
} }
func (_i *approvalWorkflowsService) ActivateWorkflow(clientId *uuid.UUID, id uint) (err error) { func (_i *approvalWorkflowsService) ActivateWorkflow(authToken string, id uint) (err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return errors.New("clientId not found in auth token")
}
// Validate workflow before activation // Validate workflow before activation
workflow, err := _i.ApprovalWorkflowsRepository.FindOne(clientId, id) workflow, err := _i.ApprovalWorkflowsRepository.FindOne(clientId, id)
if err != nil { if err != nil {
@ -164,7 +282,7 @@ func (_i *approvalWorkflowsService) ActivateWorkflow(clientId *uuid.UUID, id uin
return err return err
} }
isValid, validationErrors, err := _i.ValidateWorkflow(clientId, workflow, steps) isValid, validationErrors, err := _i.ValidateWorkflow(authToken, workflow, steps)
if err != nil { if err != nil {
return err return err
} }
@ -179,7 +297,21 @@ func (_i *approvalWorkflowsService) ActivateWorkflow(clientId *uuid.UUID, id uin
return _i.ApprovalWorkflowsRepository.Update(clientId, id, updateData) return _i.ApprovalWorkflowsRepository.Update(clientId, id, updateData)
} }
func (_i *approvalWorkflowsService) DeactivateWorkflow(clientId *uuid.UUID, id uint) (err error) { func (_i *approvalWorkflowsService) DeactivateWorkflow(authToken string, id uint) (err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return errors.New("clientId not found in auth token")
}
// Check if this is the default workflow // Check if this is the default workflow
defaultWorkflow, err := _i.ApprovalWorkflowsRepository.FindDefault(clientId) defaultWorkflow, err := _i.ApprovalWorkflowsRepository.FindDefault(clientId)
if err != nil { if err != nil {
@ -191,7 +323,7 @@ func (_i *approvalWorkflowsService) DeactivateWorkflow(clientId *uuid.UUID, id u
} }
// Check if workflow is being used in active approval flows // Check if workflow is being used in active approval flows
canDelete, reason, err := _i.CanDeleteWorkflow(clientId, id) canDelete, reason, err := _i.CanDeleteWorkflow(authToken, id)
if err != nil { if err != nil {
return err return err
} }
@ -207,7 +339,21 @@ func (_i *approvalWorkflowsService) DeactivateWorkflow(clientId *uuid.UUID, id u
} }
// Workflow with steps // Workflow with steps
func (_i *approvalWorkflowsService) GetWorkflowWithSteps(clientId *uuid.UUID, id uint) (workflow *entity.ApprovalWorkflows, steps []*entity.ApprovalWorkflowSteps, err error) { func (_i *approvalWorkflowsService) GetWorkflowWithSteps(authToken string, id uint) (workflow *entity.ApprovalWorkflows, steps []*entity.ApprovalWorkflowSteps, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return nil, nil, errors.New("clientId not found in auth token")
}
workflow, err = _i.ApprovalWorkflowsRepository.FindOne(clientId, id) workflow, err = _i.ApprovalWorkflowsRepository.FindOne(clientId, id)
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
@ -221,13 +367,41 @@ func (_i *approvalWorkflowsService) GetWorkflowWithSteps(clientId *uuid.UUID, id
return workflow, steps, nil return workflow, steps, nil
} }
func (_i *approvalWorkflowsService) CreateWorkflowWithSteps(clientId *uuid.UUID, workflow *entity.ApprovalWorkflows, steps []*entity.ApprovalWorkflowSteps) (workflowReturn *entity.ApprovalWorkflows, err error) { func (_i *approvalWorkflowsService) CreateWorkflowWithSteps(authToken string, workflow *entity.ApprovalWorkflows, steps []*entity.ApprovalWorkflowSteps) (workflowReturn *entity.ApprovalWorkflows, err error) {
return _i.Create(clientId, workflow, steps) // Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return nil, errors.New("clientId not found in auth token")
}
return _i.Create(authToken, workflow, steps)
} }
func (_i *approvalWorkflowsService) UpdateWorkflowWithSteps(clientId *uuid.UUID, id uint, workflow *entity.ApprovalWorkflows, steps []*entity.ApprovalWorkflowSteps) (err error) { func (_i *approvalWorkflowsService) UpdateWorkflowWithSteps(authToken string, id uint, workflow *entity.ApprovalWorkflows, steps []*entity.ApprovalWorkflowSteps) (err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return errors.New("clientId not found in auth token")
}
// Update workflow // Update workflow
err = _i.Update(clientId, id, workflow) err = _i.Update(authToken, id, workflow)
if err != nil { if err != nil {
return err return err
} }
@ -260,7 +434,7 @@ func (_i *approvalWorkflowsService) UpdateWorkflowWithSteps(clientId *uuid.UUID,
} }
// Validation // Validation
func (_i *approvalWorkflowsService) ValidateWorkflow(clientId *uuid.UUID, workflow *entity.ApprovalWorkflows, steps []*entity.ApprovalWorkflowSteps) (isValid bool, errors []string, err error) { func (_i *approvalWorkflowsService) ValidateWorkflow(authToken string, workflow *entity.ApprovalWorkflows, steps []*entity.ApprovalWorkflowSteps) (isValid bool, errors []string, err error) {
errors = make([]string, 0) errors = make([]string, 0)
// Validate workflow // Validate workflow
@ -299,7 +473,21 @@ func (_i *approvalWorkflowsService) ValidateWorkflow(clientId *uuid.UUID, workfl
return isValid, errors, nil return isValid, errors, nil
} }
func (_i *approvalWorkflowsService) CanDeleteWorkflow(clientId *uuid.UUID, id uint) (canDelete bool, reason string, err error) { func (_i *approvalWorkflowsService) CanDeleteWorkflow(authToken string, id uint) (canDelete bool, reason string, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return false, "clientId not found in auth token", errors.New("clientId not found in auth token")
}
// Check if workflow is default // Check if workflow is default
defaultWorkflow, err := _i.ApprovalWorkflowsRepository.FindDefault(clientId) defaultWorkflow, err := _i.ApprovalWorkflowsRepository.FindDefault(clientId)
if err != nil { if err != nil {

View File

@ -1,7 +1,6 @@
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/request"
"netidhub-saas-be/app/module/article_approval_flows/service" "netidhub-saas-be/app/module/article_approval_flows/service"
usersRepository "netidhub-saas-be/app/module/users/repository" usersRepository "netidhub-saas-be/app/module/users/repository"
@ -51,7 +50,7 @@ func NewArticleApprovalFlowsController(articleApprovalFlowsService service.Artic
// @Description API for getting all ArticleApprovalFlows // @Description API for getting all ArticleApprovalFlows
// @Tags ArticleApprovalFlows // @Tags ArticleApprovalFlows
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Param req query request.ArticleApprovalFlowsQueryRequest false "query parameters" // @Param req query request.ArticleApprovalFlowsQueryRequest false "query parameters"
// @Param req query paginator.Pagination false "pagination parameters" // @Param req query paginator.Pagination false "pagination parameters"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
@ -77,12 +76,12 @@ func (_i *articleApprovalFlowsController) All(c *fiber.Ctx) error {
req := reqContext.ToParamRequest() req := reqContext.ToParamRequest()
req.Pagination = paginate req.Pagination = paginate
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
_i.Log.Info().Interface("clientId", clientId).Msg("") _i.Log.Info().Interface("authToken", authToken).Msg("")
articleApprovalFlowsData, paging, err := _i.articleApprovalFlowsService.GetAll(clientId, req) articleApprovalFlowsData, paging, err := _i.articleApprovalFlowsService.GetAll(authToken, req)
if err != nil { if err != nil {
return err return err
} }
@ -100,7 +99,7 @@ func (_i *articleApprovalFlowsController) All(c *fiber.Ctx) error {
// @Description API for getting one ArticleApprovalFlows // @Description API for getting one ArticleApprovalFlows
// @Tags ArticleApprovalFlows // @Tags ArticleApprovalFlows
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Param id path int true "ArticleApprovalFlows ID" // @Param id path int true "ArticleApprovalFlows ID"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
@ -113,10 +112,10 @@ func (_i *articleApprovalFlowsController) Show(c *fiber.Ctx) error {
return utilRes.ErrorBadRequest(c, "Invalid ID format") return utilRes.ErrorBadRequest(c, "Invalid ID format")
} }
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
articleApprovalFlowsData, err := _i.articleApprovalFlowsService.FindOne(clientId, uint(id)) articleApprovalFlowsData, err := _i.articleApprovalFlowsService.FindOne(authToken, uint(id))
if err != nil { if err != nil {
return err return err
} }
@ -133,7 +132,7 @@ func (_i *articleApprovalFlowsController) Show(c *fiber.Ctx) error {
// @Description API for submitting article for approval // @Description API for submitting article for approval
// @Tags ArticleApprovalFlows // @Tags ArticleApprovalFlows
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>) // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param req body request.SubmitForApprovalRequest true "Submit for approval data" // @Param req body request.SubmitForApprovalRequest true "Submit for approval data"
// @Success 201 {object} response.Response // @Success 201 {object} response.Response
@ -151,9 +150,6 @@ func (_i *articleApprovalFlowsController) SubmitForApproval(c *fiber.Ctx) error
return err return err
} }
// Get ClientId from context
clientId := middleware.GetClientID(c)
// Get Authorization token from header and extract user ID // Get Authorization token from header and extract user ID
authToken := c.Get("Authorization") authToken := c.Get("Authorization")
if authToken == "" { if authToken == "" {
@ -170,7 +166,7 @@ func (_i *articleApprovalFlowsController) SubmitForApproval(c *fiber.Ctx) error
workflowIdVal := uint(*req.WorkflowId) workflowIdVal := uint(*req.WorkflowId)
workflowId = &workflowIdVal workflowId = &workflowIdVal
} }
articleApprovalFlowsData, err := _i.articleApprovalFlowsService.SubmitArticleForApproval(clientId, uint(req.ArticleId), user.ID, workflowId) articleApprovalFlowsData, err := _i.articleApprovalFlowsService.SubmitArticleForApproval(authToken, uint(req.ArticleId), user.ID, workflowId)
if err != nil { if err != nil {
return err return err
} }
@ -187,7 +183,7 @@ func (_i *articleApprovalFlowsController) SubmitForApproval(c *fiber.Ctx) error
// @Description API for approving article // @Description API for approving article
// @Tags ArticleApprovalFlows // @Tags ArticleApprovalFlows
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>) // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param id path int true "ArticleApprovalFlows ID" // @Param id path int true "ArticleApprovalFlows ID"
// @Param req body request.ApprovalActionRequest true "Approval action data" // @Param req body request.ApprovalActionRequest true "Approval action data"
@ -211,10 +207,7 @@ func (_i *articleApprovalFlowsController) Approve(c *fiber.Ctx) error {
return err return err
} }
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c)
// Get Authorization token from header and extract user ID
authToken := c.Get("Authorization") authToken := c.Get("Authorization")
if authToken == "" { if authToken == "" {
return utilRes.ErrorBadRequest(c, "Authorization token required") return utilRes.ErrorBadRequest(c, "Authorization token required")
@ -225,7 +218,7 @@ func (_i *articleApprovalFlowsController) Approve(c *fiber.Ctx) error {
return utilRes.ErrorBadRequest(c, "Invalid authorization token") return utilRes.ErrorBadRequest(c, "Invalid authorization token")
} }
err = _i.articleApprovalFlowsService.ApproveStep(clientId, uint(id), user.ID, req.Message) err = _i.articleApprovalFlowsService.ApproveStep(authToken, uint(id), user.ID, req.Message)
if err != nil { if err != nil {
return err return err
} }
@ -242,7 +235,7 @@ func (_i *articleApprovalFlowsController) Approve(c *fiber.Ctx) error {
// @Description API for rejecting article // @Description API for rejecting article
// @Tags ArticleApprovalFlows // @Tags ArticleApprovalFlows
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>) // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param id path int true "ArticleApprovalFlows ID" // @Param id path int true "ArticleApprovalFlows ID"
// @Param req body request.RejectionRequest true "Rejection data" // @Param req body request.RejectionRequest true "Rejection data"
@ -266,10 +259,7 @@ func (_i *articleApprovalFlowsController) Reject(c *fiber.Ctx) error {
return err return err
} }
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c)
// Get Authorization token from header and extract user ID
authToken := c.Get("Authorization") authToken := c.Get("Authorization")
if authToken == "" { if authToken == "" {
return utilRes.ErrorBadRequest(c, "Authorization token required") return utilRes.ErrorBadRequest(c, "Authorization token required")
@ -280,7 +270,7 @@ func (_i *articleApprovalFlowsController) Reject(c *fiber.Ctx) error {
return utilRes.ErrorBadRequest(c, "Invalid authorization token") return utilRes.ErrorBadRequest(c, "Invalid authorization token")
} }
err = _i.articleApprovalFlowsService.RejectArticle(clientId, uint(id), user.ID, req.Reason) err = _i.articleApprovalFlowsService.RejectArticle(authToken, uint(id), user.ID, req.Reason)
if err != nil { if err != nil {
return err return err
} }
@ -297,7 +287,7 @@ func (_i *articleApprovalFlowsController) Reject(c *fiber.Ctx) error {
// @Description API for requesting revision for article // @Description API for requesting revision for article
// @Tags ArticleApprovalFlows // @Tags ArticleApprovalFlows
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>) // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param id path int true "ArticleApprovalFlows ID" // @Param id path int true "ArticleApprovalFlows ID"
// @Param req body request.RevisionRequest true "Revision request data" // @Param req body request.RevisionRequest true "Revision request data"
@ -321,10 +311,7 @@ func (_i *articleApprovalFlowsController) RequestRevision(c *fiber.Ctx) error {
return err return err
} }
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c)
// Get Authorization token from header and extract user ID
authToken := c.Get("Authorization") authToken := c.Get("Authorization")
if authToken == "" { if authToken == "" {
return utilRes.ErrorBadRequest(c, "Authorization token required") return utilRes.ErrorBadRequest(c, "Authorization token required")
@ -335,7 +322,7 @@ func (_i *articleApprovalFlowsController) RequestRevision(c *fiber.Ctx) error {
return utilRes.ErrorBadRequest(c, "Invalid authorization token") return utilRes.ErrorBadRequest(c, "Invalid authorization token")
} }
err = _i.articleApprovalFlowsService.RequestRevision(clientId, uint(id), user.ID, req.Message) err = _i.articleApprovalFlowsService.RequestRevision(authToken, uint(id), user.ID, req.Message)
if err != nil { if err != nil {
return err return err
} }
@ -352,7 +339,7 @@ func (_i *articleApprovalFlowsController) RequestRevision(c *fiber.Ctx) error {
// @Description API for resubmitting article after revision // @Description API for resubmitting article after revision
// @Tags ArticleApprovalFlows // @Tags ArticleApprovalFlows
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>) // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param id path int true "ArticleApprovalFlows ID" // @Param id path int true "ArticleApprovalFlows ID"
// @Param req body request.ResubmitRequest true "Resubmit data" // @Param req body request.ResubmitRequest true "Resubmit data"
@ -376,10 +363,7 @@ func (_i *articleApprovalFlowsController) Resubmit(c *fiber.Ctx) error {
return err return err
} }
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c)
// Get Authorization token from header and extract user ID
authToken := c.Get("Authorization") authToken := c.Get("Authorization")
if authToken == "" { if authToken == "" {
return utilRes.ErrorBadRequest(c, "Authorization token required") return utilRes.ErrorBadRequest(c, "Authorization token required")
@ -390,7 +374,7 @@ func (_i *articleApprovalFlowsController) Resubmit(c *fiber.Ctx) error {
return utilRes.ErrorBadRequest(c, "Invalid authorization token") return utilRes.ErrorBadRequest(c, "Invalid authorization token")
} }
err = _i.articleApprovalFlowsService.ResubmitAfterRevision(clientId, uint(id), user.ID) err = _i.articleApprovalFlowsService.ResubmitAfterRevision(authToken, uint(id), user.ID)
if err != nil { if err != nil {
return err return err
} }
@ -407,7 +391,7 @@ func (_i *articleApprovalFlowsController) Resubmit(c *fiber.Ctx) error {
// @Description API for getting my approval queue // @Description API for getting my approval queue
// @Tags ArticleApprovalFlows // @Tags ArticleApprovalFlows
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>) // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param includePreview query bool false "Include article preview" // @Param includePreview query bool false "Include article preview"
// @Param urgentOnly query bool false "Show only urgent articles" // @Param urgentOnly query bool false "Show only urgent articles"
@ -423,10 +407,7 @@ func (_i *articleApprovalFlowsController) GetMyApprovalQueue(c *fiber.Ctx) error
return err return err
} }
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c)
// Get Authorization token from header and extract user level ID
authToken := c.Get("Authorization") authToken := c.Get("Authorization")
if authToken == "" { if authToken == "" {
return utilRes.ErrorBadRequest(c, "Authorization token required") return utilRes.ErrorBadRequest(c, "Authorization token required")
@ -441,7 +422,7 @@ func (_i *articleApprovalFlowsController) GetMyApprovalQueue(c *fiber.Ctx) error
includePreview := c.QueryBool("includePreview", false) includePreview := c.QueryBool("includePreview", false)
urgentOnly := c.QueryBool("urgentOnly", false) urgentOnly := c.QueryBool("urgentOnly", false)
approvalQueueData, paging, err := _i.articleApprovalFlowsService.GetMyApprovalQueue(clientId, user.UserLevelId, paginate.Page, paginate.Limit, includePreview, urgentOnly) approvalQueueData, paging, err := _i.articleApprovalFlowsService.GetMyApprovalQueue(authToken, user.UserLevelId, paginate.Page, paginate.Limit, includePreview, urgentOnly)
if err != nil { if err != nil {
return err return err
} }
@ -459,7 +440,7 @@ func (_i *articleApprovalFlowsController) GetMyApprovalQueue(c *fiber.Ctx) error
// @Description API for getting pending approvals // @Description API for getting pending approvals
// @Tags ArticleApprovalFlows // @Tags ArticleApprovalFlows
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>) // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param req query paginator.Pagination false "pagination parameters" // @Param req query paginator.Pagination false "pagination parameters"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
@ -473,10 +454,7 @@ func (_i *articleApprovalFlowsController) GetPendingApprovals(c *fiber.Ctx) erro
return err return err
} }
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c)
// Get Authorization token from header and extract user level ID
authToken := c.Get("Authorization") authToken := c.Get("Authorization")
if authToken == "" { if authToken == "" {
return utilRes.ErrorBadRequest(c, "Authorization token required") return utilRes.ErrorBadRequest(c, "Authorization token required")
@ -488,7 +466,7 @@ func (_i *articleApprovalFlowsController) GetPendingApprovals(c *fiber.Ctx) erro
} }
filters := make(map[string]interface{}) filters := make(map[string]interface{})
pendingApprovalsData, paging, err := _i.articleApprovalFlowsService.GetPendingApprovals(clientId, user.UserLevelId, paginate.Page, paginate.Limit, filters) pendingApprovalsData, paging, err := _i.articleApprovalFlowsService.GetPendingApprovals(authToken, user.UserLevelId, paginate.Page, paginate.Limit, filters)
if err != nil { if err != nil {
return err return err
} }
@ -506,7 +484,7 @@ func (_i *articleApprovalFlowsController) GetPendingApprovals(c *fiber.Ctx) erro
// @Description API for getting approval history // @Description API for getting approval history
// @Tags ArticleApprovalFlows // @Tags ArticleApprovalFlows
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Param articleId query int false "Article ID filter" // @Param articleId query int false "Article ID filter"
// @Param userId query int false "User ID filter" // @Param userId query int false "User ID filter"
// @Param req query paginator.Pagination false "pagination parameters" // @Param req query paginator.Pagination false "pagination parameters"
@ -538,10 +516,10 @@ func (_i *articleApprovalFlowsController) GetApprovalHistory(c *fiber.Ctx) error
// } // }
// } // }
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
approvalHistoryData, paging, err := _i.articleApprovalFlowsService.GetApprovalHistory(clientId, uint(articleId), paginate.Page, paginate.Limit) approvalHistoryData, paging, err := _i.articleApprovalFlowsService.GetApprovalHistory(authToken, uint(articleId), paginate.Page, paginate.Limit)
if err != nil { if err != nil {
return err return err
} }
@ -559,7 +537,7 @@ func (_i *articleApprovalFlowsController) GetApprovalHistory(c *fiber.Ctx) error
// @Description API for getting dashboard statistics // @Description API for getting dashboard statistics
// @Tags ArticleApprovalFlows // @Tags ArticleApprovalFlows
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>) // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
@ -567,10 +545,7 @@ func (_i *articleApprovalFlowsController) GetApprovalHistory(c *fiber.Ctx) error
// @Failure 500 {object} response.InternalServerError // @Failure 500 {object} response.InternalServerError
// @Router /article-approval-flows/dashboard-stats [get] // @Router /article-approval-flows/dashboard-stats [get]
func (_i *articleApprovalFlowsController) GetDashboardStats(c *fiber.Ctx) error { func (_i *articleApprovalFlowsController) GetDashboardStats(c *fiber.Ctx) error {
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c)
// Get Authorization token from header and extract user level ID
authToken := c.Get("Authorization") authToken := c.Get("Authorization")
if authToken == "" { if authToken == "" {
return utilRes.ErrorBadRequest(c, "Authorization token required") return utilRes.ErrorBadRequest(c, "Authorization token required")
@ -582,9 +557,8 @@ func (_i *articleApprovalFlowsController) GetDashboardStats(c *fiber.Ctx) error
} }
// TODO: Implement GetDashboardStats method in service // TODO: Implement GetDashboardStats method in service
_ = clientId // suppress unused variable warning
_ = user.UserLevelId // suppress unused variable warning _ = user.UserLevelId // suppress unused variable warning
// dashboardStatsData, err := _i.articleApprovalFlowsService.GetDashboardStats(clientId, user.UserLevelId) // dashboardStatsData, err := _i.articleApprovalFlowsService.GetDashboardStats(authToken, user.UserLevelId)
// if err != nil { // if err != nil {
// return err // return err
// } // }
@ -601,7 +575,7 @@ func (_i *articleApprovalFlowsController) GetDashboardStats(c *fiber.Ctx) error
// @Description API for getting workload statistics // @Description API for getting workload statistics
// @Tags ArticleApprovalFlows // @Tags ArticleApprovalFlows
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>) // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
@ -609,12 +583,11 @@ func (_i *articleApprovalFlowsController) GetDashboardStats(c *fiber.Ctx) error
// @Failure 500 {object} response.InternalServerError // @Failure 500 {object} response.InternalServerError
// @Router /article-approval-flows/workload-stats [get] // @Router /article-approval-flows/workload-stats [get]
func (_i *articleApprovalFlowsController) GetWorkloadStats(c *fiber.Ctx) error { func (_i *articleApprovalFlowsController) GetWorkloadStats(c *fiber.Ctx) error {
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) // authToken := c.Get("Authorization")
// TODO: Implement GetWorkloadStats method in service // TODO: Implement GetWorkloadStats method in service
_ = clientId // suppress unused variable warning // workloadStatsData, err := _i.articleApprovalFlowsService.GetWorkloadStats(authToken)
// workloadStatsData, err := _i.articleApprovalFlowsService.GetWorkloadStats(clientId)
// if err != nil { // if err != nil {
// return err // return err
// } // }
@ -631,7 +604,7 @@ func (_i *articleApprovalFlowsController) GetWorkloadStats(c *fiber.Ctx) error {
// @Description API for getting approval analytics // @Description API for getting approval analytics
// @Tags ArticleApprovalFlows // @Tags ArticleApprovalFlows
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>) // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param period query string false "Period filter (daily, weekly, monthly)" // @Param period query string false "Period filter (daily, weekly, monthly)"
// @Param startDate query string false "Start date filter (YYYY-MM-DD)" // @Param startDate query string false "Start date filter (YYYY-MM-DD)"
@ -646,12 +619,11 @@ func (_i *articleApprovalFlowsController) GetApprovalAnalytics(c *fiber.Ctx) err
// startDate := c.Query("startDate") // startDate := c.Query("startDate")
// endDate := c.Query("endDate") // endDate := c.Query("endDate")
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) // authToken := c.Get("Authorization")
// TODO: Implement GetApprovalAnalytics method in service // TODO: Implement GetApprovalAnalytics method in service
_ = clientId // suppress unused variable warning // analyticsData, err := _i.articleApprovalFlowsService.GetApprovalAnalytics(authToken, period, startDate, endDate)
// analyticsData, err := _i.articleApprovalFlowsService.GetApprovalAnalytics(clientId, period, startDate, endDate)
// if err != nil { // if err != nil {
// return err // return err
// } // }

View File

@ -11,6 +11,7 @@ import (
articlesRepo "netidhub-saas-be/app/module/articles/repository" articlesRepo "netidhub-saas-be/app/module/articles/repository"
usersRepo "netidhub-saas-be/app/module/users/repository" usersRepo "netidhub-saas-be/app/module/users/repository"
"netidhub-saas-be/utils/paginator" "netidhub-saas-be/utils/paginator"
utilSvc "netidhub-saas-be/utils/service"
"time" "time"
"github.com/google/uuid" "github.com/google/uuid"
@ -30,34 +31,34 @@ type articleApprovalFlowsService struct {
// ArticleApprovalFlowsService define interface of IArticleApprovalFlowsService // ArticleApprovalFlowsService define interface of IArticleApprovalFlowsService
type ArticleApprovalFlowsService interface { type ArticleApprovalFlowsService interface {
// Basic CRUD // Basic CRUD
GetAll(clientId *uuid.UUID, req request.ArticleApprovalFlowsQueryRequest) (flows []*entity.ArticleApprovalFlows, paging paginator.Pagination, err error) GetAll(authToken string, req request.ArticleApprovalFlowsQueryRequest) (flows []*entity.ArticleApprovalFlows, paging paginator.Pagination, err error)
FindOne(clientId *uuid.UUID, id uint) (flow *entity.ArticleApprovalFlows, err error) FindOne(authToken string, id uint) (flow *entity.ArticleApprovalFlows, err error)
Create(clientId *uuid.UUID, flow *entity.ArticleApprovalFlows) (flowReturn *entity.ArticleApprovalFlows, err error) Create(authToken string, flow *entity.ArticleApprovalFlows) (flowReturn *entity.ArticleApprovalFlows, err error)
Update(id uint, flow *entity.ArticleApprovalFlows) (err error) Update(id uint, flow *entity.ArticleApprovalFlows) (err error)
Delete(clientId *uuid.UUID, id uint) (err error) Delete(authToken string, id uint) (err error)
// Article submission and approval workflow // Article submission and approval workflow
SubmitArticleForApproval(clientId *uuid.UUID, articleId uint, submittedById uint, workflowId *uint) (flow *entity.ArticleApprovalFlows, err error) SubmitArticleForApproval(authToken string, articleId uint, submittedById uint, workflowId *uint) (flow *entity.ArticleApprovalFlows, err error)
ApproveStep(clientId *uuid.UUID, flowId uint, approvedById uint, message string) (err error) ApproveStep(authToken string, flowId uint, approvedById uint, message string) (err error)
RejectArticle(clientId *uuid.UUID, flowId uint, rejectedById uint, reason string) (err error) RejectArticle(authToken string, flowId uint, rejectedById uint, reason string) (err error)
RequestRevision(clientId *uuid.UUID, flowId uint, requestedById uint, revisionMessage string) (err error) RequestRevision(authToken string, flowId uint, requestedById uint, revisionMessage string) (err error)
ResubmitAfterRevision(clientId *uuid.UUID, flowId uint, resubmittedById uint) (err error) ResubmitAfterRevision(authToken string, flowId uint, resubmittedById uint) (err error)
// Dashboard and queue methods // Dashboard and queue methods
GetPendingApprovals(clientId *uuid.UUID, userLevelId uint, page, limit int, filters map[string]interface{}) (flows []*entity.ArticleApprovalFlows, paging paginator.Pagination, err error) GetPendingApprovals(authToken string, userLevelId uint, page, limit int, filters map[string]interface{}) (flows []*entity.ArticleApprovalFlows, paging paginator.Pagination, err error)
GetMyApprovalQueue(clientId *uuid.UUID, userLevelId uint, page, limit int, includePreview bool, urgentOnly bool) (flows []*entity.ArticleApprovalFlows, paging paginator.Pagination, err error) GetMyApprovalQueue(authToken string, userLevelId uint, page, limit int, includePreview bool, urgentOnly bool) (flows []*entity.ArticleApprovalFlows, paging paginator.Pagination, err error)
GetApprovalHistory(clientId *uuid.UUID, articleId uint, page, limit int) (logs []*entity.ArticleApprovalStepLogs, paging paginator.Pagination, err error) GetApprovalHistory(authToken string, articleId uint, page, limit int) (logs []*entity.ArticleApprovalStepLogs, paging paginator.Pagination, err error)
// Statistics and analytics // Statistics and analytics
GetPendingCountByLevel(clientId *uuid.UUID, userLevelId uint) (count int64, err error) GetPendingCountByLevel(authToken string, userLevelId uint) (count int64, err error)
GetOverdueCountByLevel(clientId *uuid.UUID, userLevelId uint) (count int64, err error) GetOverdueCountByLevel(authToken string, userLevelId uint) (count int64, err error)
GetApprovalStatistics(clientId *uuid.UUID, userLevelId uint, startDate, endDate time.Time) (stats map[string]interface{}, err error) GetApprovalStatistics(authToken string, userLevelId uint, startDate, endDate time.Time) (stats map[string]interface{}, err error)
GetWorkloadAnalytics(clientId *uuid.UUID, userLevelId uint) (analytics map[string]interface{}, err error) GetWorkloadAnalytics(authToken string, userLevelId uint) (analytics map[string]interface{}, err error)
// Workflow management // Workflow management
CanUserApproveStep(clientId *uuid.UUID, flowId uint, userId uint, userLevelId uint) (canApprove bool, reason string, err error) CanUserApproveStep(authToken string, flowId uint, userId uint, userLevelId uint) (canApprove bool, reason string, err error)
GetCurrentStepInfo(clientId *uuid.UUID, flowId uint) (stepInfo map[string]interface{}, err error) GetCurrentStepInfo(authToken string, flowId uint) (stepInfo map[string]interface{}, err error)
GetNextStepPreview(clientId *uuid.UUID, flowId uint) (nextStep *entity.ApprovalWorkflowSteps, err error) GetNextStepPreview(authToken string, flowId uint) (nextStep *entity.ApprovalWorkflowSteps, err error)
} }
func NewArticleApprovalFlowsService( func NewArticleApprovalFlowsService(
@ -81,14 +82,56 @@ func NewArticleApprovalFlowsService(
} }
// Basic CRUD implementations // Basic CRUD implementations
func (_i *articleApprovalFlowsService) GetAll(clientId *uuid.UUID, req request.ArticleApprovalFlowsQueryRequest) (flows []*entity.ArticleApprovalFlows, paging paginator.Pagination, err error) { func (_i *articleApprovalFlowsService) GetAll(authToken string, req request.ArticleApprovalFlowsQueryRequest) (flows []*entity.ArticleApprovalFlows, paging paginator.Pagination, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return nil, paginator.Pagination{}, errors.New("clientId not found in auth token")
}
return _i.ArticleApprovalFlowsRepository.GetAll(clientId, req) return _i.ArticleApprovalFlowsRepository.GetAll(clientId, req)
} }
func (_i *articleApprovalFlowsService) FindOne(clientId *uuid.UUID, id uint) (flow *entity.ArticleApprovalFlows, err error) { func (_i *articleApprovalFlowsService) FindOne(authToken string, id uint) (flow *entity.ArticleApprovalFlows, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return nil, errors.New("clientId not found in auth token")
}
return _i.ArticleApprovalFlowsRepository.FindOne(clientId, id) return _i.ArticleApprovalFlowsRepository.FindOne(clientId, id)
} }
func (_i *articleApprovalFlowsService) Create(clientId *uuid.UUID, flow *entity.ArticleApprovalFlows) (flowReturn *entity.ArticleApprovalFlows, err error) { func (_i *articleApprovalFlowsService) Create(authToken string, flow *entity.ArticleApprovalFlows) (flowReturn *entity.ArticleApprovalFlows, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return nil, errors.New("clientId not found in auth token")
}
return _i.ArticleApprovalFlowsRepository.Create(clientId, flow) return _i.ArticleApprovalFlowsRepository.Create(clientId, flow)
} }
@ -96,12 +139,40 @@ func (_i *articleApprovalFlowsService) Update(id uint, flow *entity.ArticleAppro
return _i.ArticleApprovalFlowsRepository.Update(id, flow) return _i.ArticleApprovalFlowsRepository.Update(id, flow)
} }
func (_i *articleApprovalFlowsService) Delete(clientId *uuid.UUID, id uint) (err error) { func (_i *articleApprovalFlowsService) Delete(authToken string, id uint) (err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return errors.New("clientId not found in auth token")
}
return _i.ArticleApprovalFlowsRepository.Delete(clientId, id) return _i.ArticleApprovalFlowsRepository.Delete(clientId, id)
} }
// Article submission and approval workflow // Article submission and approval workflow
func (_i *articleApprovalFlowsService) SubmitArticleForApproval(clientId *uuid.UUID, articleId uint, submittedById uint, workflowId *uint) (flow *entity.ArticleApprovalFlows, err error) { func (_i *articleApprovalFlowsService) SubmitArticleForApproval(authToken string, articleId uint, submittedById uint, workflowId *uint) (flow *entity.ArticleApprovalFlows, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return nil, errors.New("clientId not found in auth token")
}
// Check if article already has an active approval flow // Check if article already has an active approval flow
existingFlow, err := _i.ArticleApprovalFlowsRepository.FindActiveByArticleId(articleId) existingFlow, err := _i.ArticleApprovalFlowsRepository.FindActiveByArticleId(articleId)
if err == nil && existingFlow != nil { if err == nil && existingFlow != nil {
@ -170,7 +241,7 @@ func (_i *articleApprovalFlowsService) SubmitArticleForApproval(clientId *uuid.U
} }
// Process auto-skip logic based on user level // Process auto-skip logic based on user level
err = _i.processAutoSkipSteps(clientId, flow, submittedById) err = _i.processAutoSkipSteps(authToken, flow, submittedById)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -179,9 +250,23 @@ func (_i *articleApprovalFlowsService) SubmitArticleForApproval(clientId *uuid.U
} }
// processAutoSkipSteps handles automatic step skipping based on user level // processAutoSkipSteps handles automatic step skipping based on user level
func (_i *articleApprovalFlowsService) processAutoSkipSteps(clientId *uuid.UUID, flow *entity.ArticleApprovalFlows, submittedById uint) error { func (_i *articleApprovalFlowsService) processAutoSkipSteps(authToken string, flow *entity.ArticleApprovalFlows, submittedById uint) error {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return errors.New("clientId not found in auth token")
}
// Get user level of the submitter // Get user level of the submitter
userLevelId, err := _i.getUserLevelId(clientId, submittedById) userLevelId, err := _i.getUserLevelId(authToken, submittedById)
if err != nil { if err != nil {
return err return err
} }
@ -286,7 +371,21 @@ func (_i *articleApprovalFlowsService) processAutoSkipSteps(clientId *uuid.UUID,
} }
// getUserLevelId gets the user level ID for a given user // getUserLevelId gets the user level ID for a given user
func (_i *articleApprovalFlowsService) getUserLevelId(clientId *uuid.UUID, userId uint) (uint, error) { func (_i *articleApprovalFlowsService) getUserLevelId(authToken string, userId uint) (uint, error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return 0, errors.New("clientId not found in auth token")
}
// Get user from database to retrieve user level // Get user from database to retrieve user level
user, err := _i.UsersRepository.FindOne(clientId, userId) user, err := _i.UsersRepository.FindOne(clientId, userId)
if err != nil { if err != nil {
@ -333,7 +432,21 @@ func sortStepsByOrder(steps []*entity.ApprovalWorkflowSteps) {
} }
} }
func (_i *articleApprovalFlowsService) ApproveStep(clientId *uuid.UUID, flowId uint, approvedById uint, message string) (err error) { func (_i *articleApprovalFlowsService) ApproveStep(authToken string, flowId uint, approvedById uint, message string) (err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return errors.New("clientId not found in auth token")
}
// Get approval flow // Get approval flow
flow, err := _i.ArticleApprovalFlowsRepository.FindOne(clientId, flowId) flow, err := _i.ArticleApprovalFlowsRepository.FindOne(clientId, flowId)
if err != nil { if err != nil {
@ -445,7 +558,21 @@ func (_i *articleApprovalFlowsService) ApproveStep(clientId *uuid.UUID, flowId u
return nil return nil
} }
func (_i *articleApprovalFlowsService) RejectArticle(clientId *uuid.UUID, flowId uint, rejectedById uint, reason string) (err error) { func (_i *articleApprovalFlowsService) RejectArticle(authToken string, flowId uint, rejectedById uint, reason string) (err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return errors.New("clientId not found in auth token")
}
// Get approval flow // Get approval flow
flow, err := _i.ArticleApprovalFlowsRepository.FindOne(clientId, flowId) flow, err := _i.ArticleApprovalFlowsRepository.FindOne(clientId, flowId)
if err != nil { if err != nil {
@ -513,7 +640,21 @@ func (_i *articleApprovalFlowsService) RejectArticle(clientId *uuid.UUID, flowId
return nil return nil
} }
func (_i *articleApprovalFlowsService) RequestRevision(clientId *uuid.UUID, flowId uint, requestedById uint, revisionMessage string) (err error) { func (_i *articleApprovalFlowsService) RequestRevision(authToken string, flowId uint, requestedById uint, revisionMessage string) (err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return errors.New("clientId not found in auth token")
}
// Get approval flow // Get approval flow
flow, err := _i.ArticleApprovalFlowsRepository.FindOne(clientId, flowId) flow, err := _i.ArticleApprovalFlowsRepository.FindOne(clientId, flowId)
if err != nil { if err != nil {
@ -580,7 +721,21 @@ func (_i *articleApprovalFlowsService) RequestRevision(clientId *uuid.UUID, flow
return nil return nil
} }
func (_i *articleApprovalFlowsService) ResubmitAfterRevision(clientId *uuid.UUID, flowId uint, resubmittedById uint) (err error) { func (_i *articleApprovalFlowsService) ResubmitAfterRevision(authToken string, flowId uint, resubmittedById uint) (err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return errors.New("clientId not found in auth token")
}
// Get approval flow // Get approval flow
flow, err := _i.ArticleApprovalFlowsRepository.FindOne(clientId, flowId) flow, err := _i.ArticleApprovalFlowsRepository.FindOne(clientId, flowId)
if err != nil { if err != nil {
@ -643,28 +798,112 @@ func (_i *articleApprovalFlowsService) ResubmitAfterRevision(clientId *uuid.UUID
} }
// Dashboard and queue methods // Dashboard and queue methods
func (_i *articleApprovalFlowsService) GetPendingApprovals(clientId *uuid.UUID, userLevelId uint, page, limit int, filters map[string]interface{}) (flows []*entity.ArticleApprovalFlows, paging paginator.Pagination, err error) { func (_i *articleApprovalFlowsService) GetPendingApprovals(authToken string, userLevelId uint, page, limit int, filters map[string]interface{}) (flows []*entity.ArticleApprovalFlows, paging paginator.Pagination, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return nil, paginator.Pagination{}, errors.New("clientId not found in auth token")
}
return _i.ArticleApprovalFlowsRepository.GetPendingApprovals(clientId, userLevelId, page, limit, filters) return _i.ArticleApprovalFlowsRepository.GetPendingApprovals(clientId, userLevelId, page, limit, filters)
} }
func (_i *articleApprovalFlowsService) GetMyApprovalQueue(clientId *uuid.UUID, userLevelId uint, page, limit int, includePreview bool, urgentOnly bool) (flows []*entity.ArticleApprovalFlows, paging paginator.Pagination, err error) { func (_i *articleApprovalFlowsService) GetMyApprovalQueue(authToken string, userLevelId uint, page, limit int, includePreview bool, urgentOnly bool) (flows []*entity.ArticleApprovalFlows, paging paginator.Pagination, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return nil, paginator.Pagination{}, errors.New("clientId not found in auth token")
}
return _i.ArticleApprovalFlowsRepository.GetMyApprovalQueue(clientId, userLevelId, page, limit, includePreview, urgentOnly) return _i.ArticleApprovalFlowsRepository.GetMyApprovalQueue(clientId, userLevelId, page, limit, includePreview, urgentOnly)
} }
func (_i *articleApprovalFlowsService) GetApprovalHistory(clientId *uuid.UUID, articleId uint, page, limit int) (logs []*entity.ArticleApprovalStepLogs, paging paginator.Pagination, err error) { func (_i *articleApprovalFlowsService) GetApprovalHistory(authToken string, articleId uint, page, limit int) (logs []*entity.ArticleApprovalStepLogs, paging paginator.Pagination, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return nil, paginator.Pagination{}, errors.New("clientId not found in auth token")
}
return _i.ArticleApprovalStepLogsRepository.GetApprovalHistory(clientId, articleId, page, limit) return _i.ArticleApprovalStepLogsRepository.GetApprovalHistory(clientId, articleId, page, limit)
} }
// Statistics and analytics // Statistics and analytics
func (_i *articleApprovalFlowsService) GetPendingCountByLevel(clientId *uuid.UUID, userLevelId uint) (count int64, err error) { func (_i *articleApprovalFlowsService) GetPendingCountByLevel(authToken string, userLevelId uint) (count int64, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return 0, errors.New("clientId not found in auth token")
}
return _i.ArticleApprovalFlowsRepository.GetPendingCountByLevel(clientId, userLevelId) return _i.ArticleApprovalFlowsRepository.GetPendingCountByLevel(clientId, userLevelId)
} }
func (_i *articleApprovalFlowsService) GetOverdueCountByLevel(clientId *uuid.UUID, userLevelId uint) (count int64, err error) { func (_i *articleApprovalFlowsService) GetOverdueCountByLevel(authToken string, userLevelId uint) (count int64, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return 0, errors.New("clientId not found in auth token")
}
return _i.ArticleApprovalFlowsRepository.GetOverdueCountByLevel(clientId, userLevelId) return _i.ArticleApprovalFlowsRepository.GetOverdueCountByLevel(clientId, userLevelId)
} }
func (_i *articleApprovalFlowsService) GetApprovalStatistics(clientId *uuid.UUID, userLevelId uint, startDate, endDate time.Time) (stats map[string]interface{}, err error) { func (_i *articleApprovalFlowsService) GetApprovalStatistics(authToken string, userLevelId uint, startDate, endDate time.Time) (stats map[string]interface{}, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return nil, errors.New("clientId not found in auth token")
}
stats = make(map[string]interface{}) stats = make(map[string]interface{})
// Get approved count // Get approved count
@ -695,12 +934,40 @@ func (_i *articleApprovalFlowsService) GetApprovalStatistics(clientId *uuid.UUID
return stats, nil return stats, nil
} }
func (_i *articleApprovalFlowsService) GetWorkloadAnalytics(clientId *uuid.UUID, userLevelId uint) (analytics map[string]interface{}, err error) { func (_i *articleApprovalFlowsService) GetWorkloadAnalytics(authToken string, userLevelId uint) (analytics map[string]interface{}, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return nil, errors.New("clientId not found in auth token")
}
return _i.ArticleApprovalFlowsRepository.GetLevelWorkload(clientId, userLevelId) return _i.ArticleApprovalFlowsRepository.GetLevelWorkload(clientId, userLevelId)
} }
// Workflow management // Workflow management
func (_i *articleApprovalFlowsService) CanUserApproveStep(clientId *uuid.UUID, flowId uint, userId uint, userLevelId uint) (canApprove bool, reason string, err error) { func (_i *articleApprovalFlowsService) CanUserApproveStep(authToken string, flowId uint, userId uint, userLevelId uint) (canApprove bool, reason string, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return false, "clientId not found in auth token", errors.New("clientId not found in auth token")
}
// Get approval flow // Get approval flow
flow, err := _i.ArticleApprovalFlowsRepository.FindOne(clientId, flowId) flow, err := _i.ArticleApprovalFlowsRepository.FindOne(clientId, flowId)
if err != nil { if err != nil {
@ -738,7 +1005,21 @@ func (_i *articleApprovalFlowsService) CanUserApproveStep(clientId *uuid.UUID, f
return true, "", nil return true, "", nil
} }
func (_i *articleApprovalFlowsService) GetCurrentStepInfo(clientId *uuid.UUID, flowId uint) (stepInfo map[string]interface{}, err error) { func (_i *articleApprovalFlowsService) GetCurrentStepInfo(authToken string, flowId uint) (stepInfo map[string]interface{}, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return nil, errors.New("clientId not found in auth token")
}
stepInfo = make(map[string]interface{}) stepInfo = make(map[string]interface{})
// Get approval flow // Get approval flow
@ -767,7 +1048,21 @@ func (_i *articleApprovalFlowsService) GetCurrentStepInfo(clientId *uuid.UUID, f
return stepInfo, nil return stepInfo, nil
} }
func (_i *articleApprovalFlowsService) GetNextStepPreview(clientId *uuid.UUID, flowId uint) (nextStep *entity.ApprovalWorkflowSteps, err error) { func (_i *articleApprovalFlowsService) GetNextStepPreview(authToken string, flowId uint) (nextStep *entity.ApprovalWorkflowSteps, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return nil, errors.New("clientId not found in auth token")
}
// Get approval flow // Get approval flow
flow, err := _i.ArticleApprovalFlowsRepository.FindOne(clientId, flowId) flow, err := _i.ArticleApprovalFlowsRepository.FindOne(clientId, flowId)
if err != nil { if err != nil {

View File

@ -0,0 +1,817 @@
package service
import (
"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"
utilSvc "netidhub-saas-be/utils/service"
"time"
"github.com/google/uuid"
"github.com/rs/zerolog"
)
type articleApprovalFlowsService struct {
ArticleApprovalFlowsRepository repository.ArticleApprovalFlowsRepository
ApprovalWorkflowsRepository approvalWorkflowsRepo.ApprovalWorkflowsRepository
ApprovalWorkflowStepsRepository approvalWorkflowStepsRepo.ApprovalWorkflowStepsRepository
ArticleApprovalStepLogsRepository approvalStepLogsRepo.ArticleApprovalStepLogsRepository
ArticlesRepository articlesRepo.ArticlesRepository
UsersRepository usersRepo.UsersRepository
Log zerolog.Logger
}
// ArticleApprovalFlowsService define interface of IArticleApprovalFlowsService
type ArticleApprovalFlowsService interface {
// Basic CRUD
GetAll(authToken string, req request.ArticleApprovalFlowsQueryRequest) (flows []*entity.ArticleApprovalFlows, paging paginator.Pagination, err error)
FindOne(authToken string, id uint) (flow *entity.ArticleApprovalFlows, err error)
Create(authToken string, flow *entity.ArticleApprovalFlows) (flowReturn *entity.ArticleApprovalFlows, err error)
Update(id uint, flow *entity.ArticleApprovalFlows) (err error)
Delete(authToken string, id uint) (err error)
// Article submission and approval workflow
SubmitArticleForApproval(authToken string, articleId uint, submittedById uint, workflowId *uint) (flow *entity.ArticleApprovalFlows, err error)
ApproveStep(authToken string, flowId uint, approvedById uint, message string) (err error)
RejectArticle(authToken string, flowId uint, rejectedById uint, reason string) (err error)
RequestRevision(authToken string, flowId uint, requestedById uint, revisionMessage string) (err error)
ResubmitAfterRevision(authToken string, flowId uint, resubmittedById uint) (err error)
// Dashboard and queue methods
GetPendingApprovals(authToken string, userLevelId uint, page, limit int, filters map[string]interface{}) (flows []*entity.ArticleApprovalFlows, paging paginator.Pagination, err error)
GetMyApprovalQueue(authToken string, userLevelId uint, page, limit int, includePreview bool, urgentOnly bool) (flows []*entity.ArticleApprovalFlows, paging paginator.Pagination, err error)
GetApprovalHistory(authToken string, articleId uint, page, limit int) (logs []*entity.ArticleApprovalStepLogs, paging paginator.Pagination, err error)
// Statistics and analytics
GetPendingCountByLevel(authToken string, userLevelId uint) (count int64, err error)
GetOverdueCountByLevel(authToken string, userLevelId uint) (count int64, err error)
GetApprovalStatistics(authToken string, userLevelId uint, startDate, endDate time.Time) (stats map[string]interface{}, err error)
GetWorkloadAnalytics(authToken string, userLevelId uint) (analytics map[string]interface{}, err error)
// Workflow management
CanUserApproveStep(authToken string, flowId uint, userId uint, userLevelId uint) (canApprove bool, reason string, err error)
GetCurrentStepInfo(authToken string, flowId uint) (stepInfo map[string]interface{}, err error)
GetNextStepPreview(authToken string, flowId uint) (nextStep *entity.ApprovalWorkflowSteps, err error)
}
func NewArticleApprovalFlowsService(
articleApprovalFlowsRepository repository.ArticleApprovalFlowsRepository,
approvalWorkflowsRepository approvalWorkflowsRepo.ApprovalWorkflowsRepository,
approvalWorkflowStepsRepository approvalWorkflowStepsRepo.ApprovalWorkflowStepsRepository,
articleApprovalStepLogsRepository approvalStepLogsRepo.ArticleApprovalStepLogsRepository,
articlesRepository articlesRepo.ArticlesRepository,
usersRepository usersRepo.UsersRepository,
log zerolog.Logger,
) ArticleApprovalFlowsService {
return &articleApprovalFlowsService{
ArticleApprovalFlowsRepository: articleApprovalFlowsRepository,
ApprovalWorkflowsRepository: approvalWorkflowsRepository,
ApprovalWorkflowStepsRepository: approvalWorkflowStepsRepository,
ArticleApprovalStepLogsRepository: articleApprovalStepLogsRepository,
ArticlesRepository: articlesRepository,
UsersRepository: usersRepository,
Log: log,
}
}
// Basic CRUD implementations
func (_i *articleApprovalFlowsService) GetAll(authToken string, req request.ArticleApprovalFlowsQueryRequest) (flows []*entity.ArticleApprovalFlows, paging paginator.Pagination, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return nil, paginator.Pagination{}, errors.New("clientId not found in auth token")
}
return _i.ArticleApprovalFlowsRepository.GetAll(clientId, req)
}
func (_i *articleApprovalFlowsService) FindOne(authToken string, id uint) (flow *entity.ArticleApprovalFlows, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return nil, errors.New("clientId not found in auth token")
}
return _i.ArticleApprovalFlowsRepository.FindOne(clientId, id)
}
func (_i *articleApprovalFlowsService) Create(clientId *uuid.UUID, flow *entity.ArticleApprovalFlows) (flowReturn *entity.ArticleApprovalFlows, err error) {
return _i.ArticleApprovalFlowsRepository.Create(clientId, flow)
}
func (_i *articleApprovalFlowsService) Update(id uint, flow *entity.ArticleApprovalFlows) (err error) {
return _i.ArticleApprovalFlowsRepository.Update(id, flow)
}
func (_i *articleApprovalFlowsService) Delete(clientId *uuid.UUID, id uint) (err error) {
return _i.ArticleApprovalFlowsRepository.Delete(clientId, id)
}
// Article submission and approval workflow
func (_i *articleApprovalFlowsService) SubmitArticleForApproval(clientId *uuid.UUID, articleId uint, submittedById uint, workflowId *uint) (flow *entity.ArticleApprovalFlows, err error) {
// Check if article already has an active approval flow
existingFlow, err := _i.ArticleApprovalFlowsRepository.FindActiveByArticleId(articleId)
if err == nil && existingFlow != nil {
return nil, errors.New("article already has an active approval flow")
}
// Get workflow (use default if not specified)
var workflow *entity.ApprovalWorkflows
if workflowId != nil {
workflow, err = _i.ApprovalWorkflowsRepository.FindOne(clientId, *workflowId)
} else {
workflow, err = _i.ApprovalWorkflowsRepository.FindDefault(clientId)
}
if err != nil {
return nil, err
}
if workflow == nil {
return nil, errors.New("no workflow found")
}
if workflow.IsActive != nil && !*workflow.IsActive {
return nil, errors.New("workflow is not active")
}
// Get first step of workflow
firstStep, err := _i.ApprovalWorkflowStepsRepository.FindByWorkflowAndStep(clientId, workflow.ID, 1)
if err != nil {
return nil, err
}
if firstStep == nil {
return nil, errors.New("workflow has no steps")
}
// Create approval flow
flow = &entity.ArticleApprovalFlows{
ArticleId: articleId,
WorkflowId: workflow.ID,
CurrentStep: 1,
StatusId: 1, // pending
SubmittedById: submittedById,
SubmittedAt: time.Now(),
}
flow, err = _i.ArticleApprovalFlowsRepository.Create(clientId, flow)
if err != nil {
return nil, err
}
// Get current article data first
currentArticle, err := _i.ArticlesRepository.FindOne(clientId, articleId)
if err != nil {
return nil, err
}
// Update only the necessary fields
currentArticle.WorkflowId = &workflow.ID
currentArticle.CurrentApprovalStep = &flow.CurrentStep
currentArticle.StatusId = &[]int{1}[0] // pending approval
err = _i.ArticlesRepository.UpdateSkipNull(clientId, articleId, currentArticle)
if err != nil {
return nil, err
}
// Process auto-skip logic based on user level
err = _i.processAutoSkipSteps(clientId, flow, submittedById)
if err != nil {
return nil, err
}
return flow, nil
}
// processAutoSkipSteps handles automatic step skipping based on user level
func (_i *articleApprovalFlowsService) processAutoSkipSteps(clientId *uuid.UUID, flow *entity.ArticleApprovalFlows, submittedById uint) error {
// Get user level of the submitter
userLevelId, err := _i.getUserLevelId(clientId, submittedById)
if err != nil {
return err
}
// Get all workflow steps
steps, err := _i.ApprovalWorkflowStepsRepository.GetByWorkflowId(clientId, flow.WorkflowId)
if err != nil {
return err
}
// Sort steps by step order
sortStepsByOrder(steps)
// Process each step to determine if it should be auto-skipped
for _, step := range steps {
shouldSkip := _i.shouldSkipStep(userLevelId, step.RequiredUserLevelId)
if shouldSkip {
// Create skip log
stepLog := &entity.ArticleApprovalStepLogs{
ApprovalFlowId: flow.ID,
StepOrder: step.StepOrder,
StepName: step.StepName,
ApprovedById: &submittedById,
Action: "auto_skip",
Message: &[]string{"Step auto-skipped due to user level"}[0],
ProcessedAt: time.Now(),
UserLevelId: step.RequiredUserLevelId,
}
_, err = _i.ArticleApprovalStepLogsRepository.Create(clientId, stepLog)
if err != nil {
return err
}
// Update flow to next step (handle step order starting from 0)
nextStepOrder := step.StepOrder + 1
flow.CurrentStep = nextStepOrder
} else {
// Stop at first step that cannot be skipped
break
}
}
// Update flow with final current step
err = _i.ArticleApprovalFlowsRepository.Update(flow.ID, flow)
if err != nil {
return err
}
// Get current article data first
currentArticle, err := _i.ArticlesRepository.FindOne(clientId, flow.ArticleId)
if err != nil {
return err
}
// Update only the necessary fields
currentArticle.CurrentApprovalStep = &flow.CurrentStep
err = _i.ArticlesRepository.UpdateSkipNull(clientId, flow.ArticleId, currentArticle)
if err != nil {
return err
}
// Check if all steps were skipped (workflow complete)
// Find the highest step order
maxStepOrder := 0
for _, step := range steps {
if step.StepOrder > maxStepOrder {
maxStepOrder = step.StepOrder
}
}
if flow.CurrentStep > maxStepOrder {
// All steps completed, mark as approved
flow.StatusId = 2 // approved
flow.CurrentStep = 0 // Set to 0 to indicate completion
flow.CompletedAt = &[]time.Time{time.Now()}[0]
err = _i.ArticleApprovalFlowsRepository.Update(flow.ID, flow)
if err != nil {
return err
}
// Get current article data first
currentArticle, err := _i.ArticlesRepository.FindOne(clientId, flow.ArticleId)
if err != nil {
return err
}
// Update only the necessary fields
currentArticle.StatusId = &[]int{2}[0] // approved
currentArticle.CurrentApprovalStep = &[]int{0}[0] // Set to 0 to indicate completion
err = _i.ArticlesRepository.UpdateSkipNull(clientId, flow.ArticleId, currentArticle)
if err != nil {
return err
}
}
return nil
}
// getUserLevelId gets the user level ID for a given user
func (_i *articleApprovalFlowsService) getUserLevelId(clientId *uuid.UUID, userId uint) (uint, error) {
// Get user from database to retrieve user level
user, err := _i.UsersRepository.FindOne(clientId, userId)
if err != nil {
_i.Log.Error().Err(err).Uint("userId", userId).Msg("Failed to find user")
return 0, err
}
if user.UserLevel == nil {
_i.Log.Error().Uint("userId", userId).Msg("User has no user level")
return 0, errors.New("user has no user level")
}
_i.Log.Info().
Uint("userId", userId).
Uint("userLevelId", user.UserLevel.ID).
Str("userLevelName", user.UserLevel.Name).
Msg("Retrieved user level from database")
return user.UserLevel.ID, nil
}
// shouldSkipStep determines if a step should be auto-skipped based on user level
func (_i *articleApprovalFlowsService) shouldSkipStep(userLevelId, requiredLevelId uint) bool {
// Get user level details to compare level numbers
// User level with lower level_number (higher authority) can skip steps requiring higher level_number
// For now, we'll use a simple comparison based on IDs
// In production, this should compare level_number fields
// Simple logic: if user level ID is less than required level ID, they can skip
// This assumes level 1 (ID=1) has higher authority than level 2 (ID=2), etc.
return userLevelId < requiredLevelId
}
// sortStepsByOrder sorts workflow steps by their step order
func sortStepsByOrder(steps []*entity.ApprovalWorkflowSteps) {
// Simple bubble sort for step order
n := len(steps)
for i := 0; i < n-1; i++ {
for j := 0; j < n-i-1; j++ {
if steps[j].StepOrder > steps[j+1].StepOrder {
steps[j], steps[j+1] = steps[j+1], steps[j]
}
}
}
}
func (_i *articleApprovalFlowsService) ApproveStep(clientId *uuid.UUID, flowId uint, approvedById uint, message string) (err error) {
// Get approval flow
flow, err := _i.ArticleApprovalFlowsRepository.FindOne(clientId, flowId)
if err != nil {
return err
}
if flow == nil {
return errors.New("approval flow not found")
}
if flow.StatusId != 1 && flow.StatusId != 4 { // not pending or revision_requested
return errors.New("approval flow is not in pending state")
}
// Get current step
currentStep, err := _i.ApprovalWorkflowStepsRepository.FindByWorkflowAndStep(clientId, flow.WorkflowId, flow.CurrentStep)
if err != nil {
return err
}
if currentStep == nil {
return errors.New("current step not found")
}
// Create step log
stepLog := &entity.ArticleApprovalStepLogs{
ApprovalFlowId: flow.ID,
StepOrder: flow.CurrentStep,
StepName: currentStep.StepName,
ApprovedById: &approvedById,
Action: "approve",
Message: &message,
ProcessedAt: time.Now(),
UserLevelId: currentStep.RequiredUserLevelId,
}
_, err = _i.ArticleApprovalStepLogsRepository.Create(clientId, stepLog)
if err != nil {
return err
}
// Check if there's a next step
nextStep, err := _i.ApprovalWorkflowStepsRepository.GetNextStep(clientId, flow.WorkflowId, flow.CurrentStep)
if err != nil && err.Error() != "record not found" {
return err
}
if nextStep == nil || nextStep.ID == 0 {
// No next step - approval complete
flowUpdate := &entity.ArticleApprovalFlows{
StatusId: 2, // approved
CurrentStep: 0, // Set to 0 to indicate completion
CompletedAt: &[]time.Time{time.Now()}[0],
}
// Debug logging
_i.Log.Info().
Interface("flowUpdate :: ", flowUpdate).
Msg("Retrieved next step from database")
err = _i.ArticleApprovalFlowsRepository.Update(flowId, flowUpdate)
if err != nil {
return err
}
// Get current article data first
currentArticle, err := _i.ArticlesRepository.FindOne(clientId, flow.ArticleId)
if err != nil {
return err
}
// Update only the necessary fields
currentArticle.StatusId = &[]int{2}[0] // approved
currentArticle.CurrentApprovalStep = &[]int{0}[0] // Set to 0 to indicate completion
currentArticle.IsPublish = &[]bool{true}[0] // Set to true to indicate publication
currentArticle.IsDraft = &[]bool{false}[0] // Set to false to indicate publication
err = _i.ArticlesRepository.UpdateSkipNull(clientId, flow.ArticleId, currentArticle)
if err != nil {
return err
}
} else {
// Move to next step
flowUpdate := &entity.ArticleApprovalFlows{
CurrentStep: nextStep.StepOrder,
StatusId: 1, // pending
}
err = _i.ArticleApprovalFlowsRepository.Update(flowId, flowUpdate)
if err != nil {
return err
}
// Get current article data first
currentArticle, err := _i.ArticlesRepository.FindOne(clientId, flow.ArticleId)
if err != nil {
return err
}
// Update only the necessary fields
currentArticle.CurrentApprovalStep = &nextStep.StepOrder
err = _i.ArticlesRepository.UpdateSkipNull(clientId, flow.ArticleId, currentArticle)
if err != nil {
return err
}
}
return nil
}
func (_i *articleApprovalFlowsService) RejectArticle(clientId *uuid.UUID, flowId uint, rejectedById uint, reason string) (err error) {
// Get approval flow
flow, err := _i.ArticleApprovalFlowsRepository.FindOne(clientId, flowId)
if err != nil {
return err
}
if flow == nil {
return errors.New("approval flow not found")
}
if flow.StatusId != 1 && flow.StatusId != 4 { // not pending or revision_requested
return errors.New("approval flow is not in pending state")
}
// Get current step
currentStep, err := _i.ApprovalWorkflowStepsRepository.FindByWorkflowAndStep(clientId, flow.WorkflowId, flow.CurrentStep)
if err != nil {
return err
}
// Create step log
stepLog := &entity.ArticleApprovalStepLogs{
ApprovalFlowId: flow.ID,
StepOrder: flow.CurrentStep,
StepName: currentStep.StepName,
ApprovedById: &rejectedById,
Action: "reject",
Message: &reason,
ProcessedAt: time.Now(),
UserLevelId: currentStep.RequiredUserLevelId,
}
_, err = _i.ArticleApprovalStepLogsRepository.Create(clientId, stepLog)
if err != nil {
return err
}
// Update approval flow status
flowUpdate := &entity.ArticleApprovalFlows{
StatusId: 3, // rejected
RejectionReason: &reason,
CompletedAt: &[]time.Time{time.Now()}[0],
}
err = _i.ArticleApprovalFlowsRepository.Update(flowId, flowUpdate)
if err != nil {
return err
}
// Get current article data first
currentArticle, err := _i.ArticlesRepository.FindOne(clientId, flow.ArticleId)
if err != nil {
return err
}
// Update only the necessary fields
currentArticle.StatusId = &[]int{3}[0] // rejected
currentArticle.CurrentApprovalStep = nil
err = _i.ArticlesRepository.UpdateSkipNull(clientId, flow.ArticleId, currentArticle)
if err != nil {
return err
}
return nil
}
func (_i *articleApprovalFlowsService) RequestRevision(clientId *uuid.UUID, flowId uint, requestedById uint, revisionMessage string) (err error) {
// Get approval flow
flow, err := _i.ArticleApprovalFlowsRepository.FindOne(clientId, flowId)
if err != nil {
return err
}
if flow == nil {
return errors.New("approval flow not found")
}
if flow.StatusId != 1 { // not pending
return errors.New("approval flow is not in pending state")
}
// Get current step
currentStep, err := _i.ApprovalWorkflowStepsRepository.FindByWorkflowAndStep(clientId, flow.WorkflowId, flow.CurrentStep)
if err != nil {
return err
}
// Create step log
stepLog := &entity.ArticleApprovalStepLogs{
ApprovalFlowId: flow.ID,
StepOrder: flow.CurrentStep,
StepName: currentStep.StepName,
ApprovedById: &requestedById,
Action: "request_revision",
Message: &revisionMessage,
ProcessedAt: time.Now(),
UserLevelId: currentStep.RequiredUserLevelId,
}
_, err = _i.ArticleApprovalStepLogsRepository.Create(clientId, stepLog)
if err != nil {
return err
}
// Update approval flow status
flowUpdate := &entity.ArticleApprovalFlows{
StatusId: 4, // revision_requested
RevisionRequested: &[]bool{true}[0],
RevisionMessage: &revisionMessage,
}
err = _i.ArticleApprovalFlowsRepository.Update(flowId, flowUpdate)
if err != nil {
return err
}
// Get current article data first
currentArticle, err := _i.ArticlesRepository.FindOne(clientId, flow.ArticleId)
if err != nil {
return err
}
// Update only the necessary fields
currentArticle.StatusId = &[]int{4}[0] // revision_requested
err = _i.ArticlesRepository.UpdateSkipNull(clientId, flow.ArticleId, currentArticle)
if err != nil {
return err
}
return nil
}
func (_i *articleApprovalFlowsService) ResubmitAfterRevision(clientId *uuid.UUID, flowId uint, resubmittedById uint) (err error) {
// Get approval flow
flow, err := _i.ArticleApprovalFlowsRepository.FindOne(clientId, flowId)
if err != nil {
return err
}
if flow == nil {
return errors.New("approval flow not found")
}
if flow.StatusId != 4 { // not revision_requested
return errors.New("approval flow is not in revision requested state")
}
// Reset approval flow to pending
flowUpdate := &entity.ArticleApprovalFlows{
StatusId: 1, // pending
RevisionRequested: &[]bool{false}[0],
RevisionMessage: nil,
CurrentStep: 1, // restart from first step
}
err = _i.ArticleApprovalFlowsRepository.Update(flowId, flowUpdate)
if err != nil {
return err
}
// Get current article data first
currentArticle, err := _i.ArticlesRepository.FindOne(clientId, flow.ArticleId)
if err != nil {
return err
}
// Update only the necessary fields
currentArticle.StatusId = &[]int{1}[0] // pending approval
currentArticle.CurrentApprovalStep = &[]int{1}[0]
err = _i.ArticlesRepository.UpdateSkipNull(clientId, flow.ArticleId, currentArticle)
if err != nil {
return err
}
// Create resubmission log
stepLog := &entity.ArticleApprovalStepLogs{
ApprovalFlowId: flow.ID,
StepOrder: 1,
StepName: "Resubmission",
ApprovedById: &resubmittedById,
Action: "resubmit",
Message: &[]string{"Article resubmitted after revision"}[0],
ProcessedAt: time.Now(),
}
_, err = _i.ArticleApprovalStepLogsRepository.Create(clientId, stepLog)
if err != nil {
return err
}
return nil
}
// Dashboard and queue methods
func (_i *articleApprovalFlowsService) GetPendingApprovals(clientId *uuid.UUID, userLevelId uint, page, limit int, filters map[string]interface{}) (flows []*entity.ArticleApprovalFlows, paging paginator.Pagination, err error) {
return _i.ArticleApprovalFlowsRepository.GetPendingApprovals(clientId, userLevelId, page, limit, filters)
}
func (_i *articleApprovalFlowsService) GetMyApprovalQueue(clientId *uuid.UUID, userLevelId uint, page, limit int, includePreview bool, urgentOnly bool) (flows []*entity.ArticleApprovalFlows, paging paginator.Pagination, err error) {
return _i.ArticleApprovalFlowsRepository.GetMyApprovalQueue(clientId, userLevelId, page, limit, includePreview, urgentOnly)
}
func (_i *articleApprovalFlowsService) GetApprovalHistory(clientId *uuid.UUID, articleId uint, page, limit int) (logs []*entity.ArticleApprovalStepLogs, paging paginator.Pagination, err error) {
return _i.ArticleApprovalStepLogsRepository.GetApprovalHistory(clientId, articleId, page, limit)
}
// Statistics and analytics
func (_i *articleApprovalFlowsService) GetPendingCountByLevel(clientId *uuid.UUID, userLevelId uint) (count int64, err error) {
return _i.ArticleApprovalFlowsRepository.GetPendingCountByLevel(clientId, userLevelId)
}
func (_i *articleApprovalFlowsService) GetOverdueCountByLevel(clientId *uuid.UUID, userLevelId uint) (count int64, err error) {
return _i.ArticleApprovalFlowsRepository.GetOverdueCountByLevel(clientId, userLevelId)
}
func (_i *articleApprovalFlowsService) GetApprovalStatistics(clientId *uuid.UUID, userLevelId uint, startDate, endDate time.Time) (stats map[string]interface{}, err error) {
stats = make(map[string]interface{})
// Get approved count
approvedCount, err := _i.ArticleApprovalFlowsRepository.GetApprovedCountByPeriod(clientId, userLevelId, startDate, endDate)
if err != nil {
return nil, err
}
// Get rejected count
rejectedCount, err := _i.ArticleApprovalFlowsRepository.GetRejectedCountByPeriod(clientId, userLevelId, startDate, endDate)
if err != nil {
return nil, err
}
// Get revision request count
revisionCount, err := _i.ArticleApprovalFlowsRepository.GetRevisionRequestCountByPeriod(clientId, userLevelId, startDate, endDate)
if err != nil {
return nil, err
}
stats["approved_count"] = approvedCount
stats["rejected_count"] = rejectedCount
stats["revision_requested_count"] = revisionCount
stats["total_processed"] = approvedCount + rejectedCount + revisionCount
stats["period_start"] = startDate
stats["period_end"] = endDate
return stats, nil
}
func (_i *articleApprovalFlowsService) GetWorkloadAnalytics(clientId *uuid.UUID, userLevelId uint) (analytics map[string]interface{}, err error) {
return _i.ArticleApprovalFlowsRepository.GetLevelWorkload(clientId, userLevelId)
}
// Workflow management
func (_i *articleApprovalFlowsService) CanUserApproveStep(clientId *uuid.UUID, flowId uint, userId uint, userLevelId uint) (canApprove bool, reason string, err error) {
// Get approval flow
flow, err := _i.ArticleApprovalFlowsRepository.FindOne(clientId, flowId)
if err != nil {
return false, "", err
}
if flow == nil {
return false, "approval flow not found", nil
}
if flow.StatusId != 1 && flow.StatusId != 4 { // not pending or revision_requested
return false, "approval flow is not in pending state", nil
}
// Get current step
currentStep, err := _i.ApprovalWorkflowStepsRepository.FindByWorkflowAndStep(clientId, flow.WorkflowId, flow.CurrentStep)
if err != nil {
return false, "", err
}
if currentStep == nil {
return false, "current step not found", nil
}
// Check if user level matches required level
if currentStep.RequiredUserLevelId != userLevelId {
return false, "user level does not match required level for this step", nil
}
// Check if user submitted the article (cannot approve own submission)
if flow.SubmittedById == userId {
return false, "cannot approve own submission", nil
}
return true, "", nil
}
func (_i *articleApprovalFlowsService) GetCurrentStepInfo(clientId *uuid.UUID, flowId uint) (stepInfo map[string]interface{}, err error) {
stepInfo = make(map[string]interface{})
// Get approval flow
flow, err := _i.ArticleApprovalFlowsRepository.FindOne(clientId, flowId)
if err != nil {
return nil, err
}
if flow == nil {
return nil, errors.New("approval flow not found")
}
// Get current step
currentStep, err := _i.ApprovalWorkflowStepsRepository.FindByWorkflowAndStep(clientId, flow.WorkflowId, flow.CurrentStep)
if err != nil {
return nil, err
}
stepInfo["current_step"] = flow.CurrentStep
stepInfo["step_name"] = currentStep.StepName
stepInfo["required_user_level_id"] = currentStep.RequiredUserLevelId
stepInfo["can_skip"] = currentStep.CanSkip
stepInfo["auto_approve_after_hours"] = currentStep.AutoApproveAfterHours
stepInfo["status"] = flow.StatusId
return stepInfo, nil
}
func (_i *articleApprovalFlowsService) GetNextStepPreview(clientId *uuid.UUID, flowId uint) (nextStep *entity.ApprovalWorkflowSteps, err error) {
// Get approval flow
flow, err := _i.ArticleApprovalFlowsRepository.FindOne(clientId, flowId)
if err != nil {
return nil, err
}
if flow == nil {
return nil, errors.New("approval flow not found")
}
// Get next step
nextStep, err = _i.ApprovalWorkflowStepsRepository.GetNextStep(clientId, flow.WorkflowId, flow.CurrentStep)
if err != nil {
return nil, err
}
return nextStep, nil
}

View File

@ -78,7 +78,7 @@ func (_i *articleApprovalsService) Save(clientId *uuid.UUID, req request.Article
approvalByUserLevelId := createdBy.UserLevelId approvalByUserLevelId := createdBy.UserLevelId
approvalParentLevelId := createdBy.UserLevel.ParentLevelId approvalParentLevelId := createdBy.UserLevel.ParentLevelId
err = _i.ArticlesService.UpdateApproval(clientId, newReq.ArticleId, newReq.StatusId, int(approvalByUserLevelId), *newReq.ApprovalAtLevel, *approvalParentLevelId) err = _i.ArticlesService.UpdateApproval(authToken, newReq.ArticleId, newReq.StatusId, int(approvalByUserLevelId), *newReq.ApprovalAtLevel, *approvalParentLevelId)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -1,7 +1,6 @@
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/request"
"netidhub-saas-be/app/module/article_categories/service" "netidhub-saas-be/app/module/article_categories/service"
"netidhub-saas-be/utils/paginator" "netidhub-saas-be/utils/paginator"
@ -40,7 +39,7 @@ func NewArticleCategoriesController(articleCategoriesService service.ArticleCate
// @Description API for getting all ArticleCategories // @Description API for getting all ArticleCategories
// @Tags Article Categories // @Tags Article Categories
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string false "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>) // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param req query request.ArticleCategoriesQueryRequest false "query parameters" // @Param req query request.ArticleCategoriesQueryRequest false "query parameters"
// @Param req query paginator.Pagination false "pagination parameters" // @Param req query paginator.Pagination false "pagination parameters"
@ -56,7 +55,6 @@ func (_i *articleCategoriesController) All(c *fiber.Ctx) error {
} }
authToken := c.Get("Authorization") authToken := c.Get("Authorization")
clientId := middleware.GetClientID(c)
reqContext := request.ArticleCategoriesQueryRequestContext{ reqContext := request.ArticleCategoriesQueryRequestContext{
Title: c.Query("title"), Title: c.Query("title"),
@ -68,7 +66,7 @@ func (_i *articleCategoriesController) All(c *fiber.Ctx) error {
req := reqContext.ToParamRequest() req := reqContext.ToParamRequest()
req.Pagination = paginate req.Pagination = paginate
articleCategoriesData, paging, err := _i.articleCategoriesService.All(clientId, req, authToken) articleCategoriesData, paging, err := _i.articleCategoriesService.All(authToken, req)
if err != nil { if err != nil {
return err return err
} }
@ -86,7 +84,7 @@ func (_i *articleCategoriesController) All(c *fiber.Ctx) error {
// @Description API for getting one ArticleCategories // @Description API for getting one ArticleCategories
// @Tags Article Categories // @Tags Article Categories
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string false "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Param id path int true "ArticleCategories ID" // @Param id path int true "ArticleCategories ID"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
@ -99,9 +97,10 @@ func (_i *articleCategoriesController) Show(c *fiber.Ctx) error {
return err return err
} }
clientId := middleware.GetClientID(c) // Get Authorization token from header
authToken := c.Get("Authorization")
articleCategoriesData, err := _i.articleCategoriesService.Show(clientId, uint(id)) articleCategoriesData, err := _i.articleCategoriesService.Show(authToken, uint(id))
if err != nil { if err != nil {
return err return err
} }
@ -118,7 +117,7 @@ func (_i *articleCategoriesController) Show(c *fiber.Ctx) error {
// @Description API for getting one ArticleCategories // @Description API for getting one ArticleCategories
// @Tags Article Categories // @Tags Article Categories
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string false "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Param id path int true "ArticleCategories Old ID" // @Param id path int true "ArticleCategories Old ID"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
@ -131,9 +130,10 @@ func (_i *articleCategoriesController) ShowByOldId(c *fiber.Ctx) error {
return err return err
} }
clientId := middleware.GetClientID(c) // Get Authorization token from header
authToken := c.Get("Authorization")
articleCategoriesData, err := _i.articleCategoriesService.ShowByOldId(clientId, uint(id)) articleCategoriesData, err := _i.articleCategoriesService.ShowByOldId(authToken, uint(id))
if err != nil { if err != nil {
return err return err
} }
@ -150,7 +150,7 @@ func (_i *articleCategoriesController) ShowByOldId(c *fiber.Ctx) error {
// @Description API for getting one ArticleCategories // @Description API for getting one ArticleCategories
// @Tags Article Categories // @Tags Article Categories
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string false "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Param slug path string true "ArticleCategories Slug" // @Param slug path string true "ArticleCategories Slug"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
@ -159,9 +159,10 @@ func (_i *articleCategoriesController) ShowByOldId(c *fiber.Ctx) error {
// @Router /article-categories/slug/{slug} [get] // @Router /article-categories/slug/{slug} [get]
func (_i *articleCategoriesController) ShowBySlug(c *fiber.Ctx) error { func (_i *articleCategoriesController) ShowBySlug(c *fiber.Ctx) error {
slug := c.Params("slug") slug := c.Params("slug")
clientId := middleware.GetClientID(c) // Get Authorization token from header
authToken := c.Get("Authorization")
articleCategoriesData, err := _i.articleCategoriesService.ShowBySlug(clientId, slug) articleCategoriesData, err := _i.articleCategoriesService.ShowBySlug(authToken, slug)
if err != nil { if err != nil {
return err return err
} }
@ -178,8 +179,7 @@ func (_i *articleCategoriesController) ShowBySlug(c *fiber.Ctx) error {
// @Description API for create ArticleCategories // @Description API for create ArticleCategories
// @Tags Article Categories // @Tags Article Categories
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string false "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Param X-Csrf-Token header string false "Insert the X-Csrf-Token"
// @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>) // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param payload body request.ArticleCategoriesCreateRequest true "Required payload" // @Param payload body request.ArticleCategoriesCreateRequest true "Required payload"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
@ -194,9 +194,8 @@ func (_i *articleCategoriesController) Save(c *fiber.Ctx) error {
} }
authToken := c.Get("Authorization") authToken := c.Get("Authorization")
clientId := middleware.GetClientID(c)
dataResult, err := _i.articleCategoriesService.Save(clientId, *req, authToken) dataResult, err := _i.articleCategoriesService.Save(authToken, *req)
if err != nil { if err != nil {
return err return err
} }
@ -214,8 +213,7 @@ func (_i *articleCategoriesController) Save(c *fiber.Ctx) error {
// @Tags Article Categories // @Tags Article Categories
// @Security Bearer // @Security Bearer
// @Produce json // @Produce json
// @Param X-Client-Key header string false "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Param X-Csrf-Token header string false "Insert the X-Csrf-Token"
// @Param files formData file true "Upload thumbnail" // @Param files formData file true "Upload thumbnail"
// @Param id path int true "ArticleCategories ID" // @Param id path int true "ArticleCategories ID"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
@ -224,8 +222,9 @@ func (_i *articleCategoriesController) Save(c *fiber.Ctx) error {
// @Failure 500 {object} response.InternalServerError // @Failure 500 {object} response.InternalServerError
// @Router /article-categories/thumbnail/{id} [post] // @Router /article-categories/thumbnail/{id} [post]
func (_i *articleCategoriesController) SaveThumbnail(c *fiber.Ctx) error { func (_i *articleCategoriesController) SaveThumbnail(c *fiber.Ctx) error {
clientId := middleware.GetClientID(c) // Get Authorization token from header
err := _i.articleCategoriesService.SaveThumbnail(clientId, c) authToken := c.Get("Authorization")
err := _i.articleCategoriesService.SaveThumbnail(authToken, c)
if err != nil { if err != nil {
return err return err
} }
@ -241,8 +240,7 @@ func (_i *articleCategoriesController) SaveThumbnail(c *fiber.Ctx) error {
// @Description API for update ArticleCategories // @Description API for update ArticleCategories
// @Tags Article Categories // @Tags Article Categories
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string false "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Param X-Csrf-Token header string false "Insert the X-Csrf-Token"
// @Param payload body request.ArticleCategoriesUpdateRequest true "Required payload" // @Param payload body request.ArticleCategoriesUpdateRequest true "Required payload"
// @Param id path int true "ArticleCategories ID" // @Param id path int true "ArticleCategories ID"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
@ -261,8 +259,9 @@ func (_i *articleCategoriesController) Update(c *fiber.Ctx) error {
return err return err
} }
clientId := middleware.GetClientID(c) // Get Authorization token from header
err = _i.articleCategoriesService.Update(clientId, uint(id), *req) authToken := c.Get("Authorization")
err = _i.articleCategoriesService.Update(authToken, uint(id), *req)
if err != nil { if err != nil {
return err return err
} }
@ -278,8 +277,7 @@ func (_i *articleCategoriesController) Update(c *fiber.Ctx) error {
// @Description API for delete ArticleCategories // @Description API for delete ArticleCategories
// @Tags Article Categories // @Tags Article Categories
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string false "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Param X-Csrf-Token header string false "Insert the X-Csrf-Token"
// @Param id path int true "ArticleCategories ID" // @Param id path int true "ArticleCategories ID"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
@ -292,8 +290,9 @@ func (_i *articleCategoriesController) Delete(c *fiber.Ctx) error {
return err return err
} }
clientId := middleware.GetClientID(c) // Get Authorization token from header
err = _i.articleCategoriesService.Delete(clientId, uint(id)) authToken := c.Get("Authorization")
err = _i.articleCategoriesService.Delete(authToken, uint(id))
if err != nil { if err != nil {
return err return err
} }
@ -309,7 +308,7 @@ func (_i *articleCategoriesController) Delete(c *fiber.Ctx) error {
// @Description API for View Thumbnail of ArticleCategories // @Description API for View Thumbnail of ArticleCategories
// @Tags Article Categories // @Tags Article Categories
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string false "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Param id path string true "ArticleCategories ID" // @Param id path string true "ArticleCategories ID"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError

View File

@ -37,14 +37,14 @@ type articleCategoriesService struct {
// ArticleCategoriesService define interface of IArticleCategoriesService // ArticleCategoriesService define interface of IArticleCategoriesService
type ArticleCategoriesService interface { type ArticleCategoriesService interface {
All(clientId *uuid.UUID, req request.ArticleCategoriesQueryRequest, authToken string) (articleCategories []*response.ArticleCategoriesResponse, paging paginator.Pagination, err error) All(authToken string, req request.ArticleCategoriesQueryRequest) (articleCategories []*response.ArticleCategoriesResponse, paging paginator.Pagination, err error)
Show(clientId *uuid.UUID, id uint) (articleCategories *response.ArticleCategoriesResponse, err error) Show(authToken string, id uint) (articleCategories *response.ArticleCategoriesResponse, err error)
ShowByOldId(clientId *uuid.UUID, id uint) (articleCategories *response.ArticleCategoriesResponse, err error) ShowByOldId(authToken string, id uint) (articleCategories *response.ArticleCategoriesResponse, err error)
ShowBySlug(clientId *uuid.UUID, slug string) (articleCategories *response.ArticleCategoriesResponse, err error) ShowBySlug(authToken string, slug string) (articleCategories *response.ArticleCategoriesResponse, err error)
Save(clientId *uuid.UUID, req request.ArticleCategoriesCreateRequest, authToken string) (articleCategories *entity.ArticleCategories, err error) Save(authToken string, req request.ArticleCategoriesCreateRequest) (articleCategories *entity.ArticleCategories, err error)
SaveThumbnail(clientId *uuid.UUID, c *fiber.Ctx) (err error) SaveThumbnail(authToken string, c *fiber.Ctx) (err error)
Update(clientId *uuid.UUID, id uint, req request.ArticleCategoriesUpdateRequest) (err error) Update(authToken string, id uint, req request.ArticleCategoriesUpdateRequest) (err error)
Delete(clientId *uuid.UUID, id uint) error Delete(authToken string, id uint) error
Viewer(c *fiber.Ctx) error Viewer(c *fiber.Ctx) error
} }
@ -61,7 +61,17 @@ func NewArticleCategoriesService(repo repository.ArticleCategoriesRepository, us
} }
// All implement interface of ArticleCategoriesService // All implement interface of ArticleCategoriesService
func (_i *articleCategoriesService) All(clientId *uuid.UUID, req request.ArticleCategoriesQueryRequest, authToken string) (articleCategoriess []*response.ArticleCategoriesResponse, paging paginator.Pagination, err error) { func (_i *articleCategoriesService) All(authToken string, req request.ArticleCategoriesQueryRequest) (articleCategoriess []*response.ArticleCategoriesResponse, paging paginator.Pagination, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
createdBy := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken) createdBy := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if createdBy != nil { if createdBy != nil {
if createdBy.UserLevel.LevelNumber > 1 { if createdBy.UserLevel.LevelNumber > 1 {
@ -82,7 +92,17 @@ func (_i *articleCategoriesService) All(clientId *uuid.UUID, req request.Article
return return
} }
func (_i *articleCategoriesService) Show(clientId *uuid.UUID, id uint) (articleCategories *response.ArticleCategoriesResponse, err error) { func (_i *articleCategoriesService) Show(authToken string, id uint) (articleCategories *response.ArticleCategoriesResponse, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
result, err := _i.Repo.FindOne(clientId, id) result, err := _i.Repo.FindOne(clientId, id)
if err != nil { if err != nil {
return nil, err return nil, err
@ -91,7 +111,17 @@ func (_i *articleCategoriesService) Show(clientId *uuid.UUID, id uint) (articleC
return mapper.ArticleCategoriesResponseMapper(result, host), nil return mapper.ArticleCategoriesResponseMapper(result, host), nil
} }
func (_i *articleCategoriesService) ShowByOldId(clientId *uuid.UUID, id uint) (articleCategories *response.ArticleCategoriesResponse, err error) { func (_i *articleCategoriesService) ShowByOldId(authToken string, id uint) (articleCategories *response.ArticleCategoriesResponse, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
result, err := _i.Repo.FindOneByOldId(clientId, id) result, err := _i.Repo.FindOneByOldId(clientId, id)
if err != nil { if err != nil {
return nil, err return nil, err
@ -100,7 +130,17 @@ func (_i *articleCategoriesService) ShowByOldId(clientId *uuid.UUID, id uint) (a
return mapper.ArticleCategoriesResponseMapper(result, host), nil return mapper.ArticleCategoriesResponseMapper(result, host), nil
} }
func (_i *articleCategoriesService) ShowBySlug(clientId *uuid.UUID, slug string) (articleCategories *response.ArticleCategoriesResponse, err error) { func (_i *articleCategoriesService) ShowBySlug(authToken string, slug string) (articleCategories *response.ArticleCategoriesResponse, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
result, err := _i.Repo.FindOneBySlug(clientId, slug) result, err := _i.Repo.FindOneBySlug(clientId, slug)
if err != nil { if err != nil {
return nil, err return nil, err
@ -109,7 +149,17 @@ func (_i *articleCategoriesService) ShowBySlug(clientId *uuid.UUID, slug string)
return mapper.ArticleCategoriesResponseMapper(result, host), nil return mapper.ArticleCategoriesResponseMapper(result, host), nil
} }
func (_i *articleCategoriesService) Save(clientId *uuid.UUID, req request.ArticleCategoriesCreateRequest, authToken string) (articleCategories *entity.ArticleCategories, err error) { func (_i *articleCategoriesService) Save(authToken string, req request.ArticleCategoriesCreateRequest) (articleCategories *entity.ArticleCategories, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
_i.Log.Info().Interface("data", req).Msg("") _i.Log.Info().Interface("data", req).Msg("")
newReq := req.ToEntity() newReq := req.ToEntity()
@ -131,7 +181,17 @@ func (_i *articleCategoriesService) Save(clientId *uuid.UUID, req request.Articl
return _i.Repo.Create(newReq) return _i.Repo.Create(newReq)
} }
func (_i *articleCategoriesService) SaveThumbnail(clientId *uuid.UUID, c *fiber.Ctx) (err error) { func (_i *articleCategoriesService) SaveThumbnail(authToken string, c *fiber.Ctx) (err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
id, err := strconv.ParseUint(c.Params("id"), 10, 0) id, err := strconv.ParseUint(c.Params("id"), 10, 0)
if err != nil { if err != nil {
return err return err
@ -195,7 +255,17 @@ func (_i *articleCategoriesService) SaveThumbnail(clientId *uuid.UUID, c *fiber.
return return
} }
func (_i *articleCategoriesService) Update(clientId *uuid.UUID, id uint, req request.ArticleCategoriesUpdateRequest) (err error) { func (_i *articleCategoriesService) Update(authToken string, id uint, req request.ArticleCategoriesUpdateRequest) (err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
_i.Log.Info().Interface("data", req).Msg("") _i.Log.Info().Interface("data", req).Msg("")
newReq := req.ToEntity() newReq := req.ToEntity()
@ -213,7 +283,17 @@ func (_i *articleCategoriesService) Update(clientId *uuid.UUID, id uint, req req
return _i.Repo.Update(clientId, id, newReq) return _i.Repo.Update(clientId, id, newReq)
} }
func (_i *articleCategoriesService) Delete(clientId *uuid.UUID, id uint) error { func (_i *articleCategoriesService) Delete(authToken string, id uint) error {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
result, err := _i.Repo.FindOne(clientId, id) result, err := _i.Repo.FindOne(clientId, id)
if err != nil { if err != nil {
return err return err

View File

@ -2,7 +2,6 @@ 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/request"
"netidhub-saas-be/app/module/article_files/service" "netidhub-saas-be/app/module/article_files/service"
"netidhub-saas-be/utils/paginator" "netidhub-saas-be/utils/paginator"
@ -11,10 +10,12 @@ import (
"strconv" "strconv"
"github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2"
"github.com/rs/zerolog"
) )
type articleFilesController struct { type articleFilesController struct {
articleFilesService service.ArticleFilesService articleFilesService service.ArticleFilesService
Log zerolog.Logger
} }
type ArticleFilesController interface { type ArticleFilesController interface {
@ -27,9 +28,10 @@ type ArticleFilesController interface {
GetUploadStatus(c *fiber.Ctx) error GetUploadStatus(c *fiber.Ctx) error
} }
func NewArticleFilesController(articleFilesService service.ArticleFilesService) ArticleFilesController { func NewArticleFilesController(articleFilesService service.ArticleFilesService, log zerolog.Logger) ArticleFilesController {
return &articleFilesController{ return &articleFilesController{
articleFilesService: articleFilesService, articleFilesService: articleFilesService,
Log: log,
} }
} }
@ -38,7 +40,7 @@ func NewArticleFilesController(articleFilesService service.ArticleFilesService)
// @Description API for getting all ArticleFiles // @Description API for getting all ArticleFiles
// @Tags Article Files // @Tags Article Files
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string false "Insert the X-Client-Key" // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param req query request.ArticleFilesQueryRequest false "query parameters" // @Param req query request.ArticleFilesQueryRequest false "query parameters"
// @Param req query paginator.Pagination false "pagination parameters" // @Param req query paginator.Pagination false "pagination parameters"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
@ -47,8 +49,9 @@ func NewArticleFilesController(articleFilesService service.ArticleFilesService)
// @Failure 500 {object} response.InternalServerError // @Failure 500 {object} response.InternalServerError
// @Router /article-files [get] // @Router /article-files [get]
func (_i *articleFilesController) All(c *fiber.Ctx) error { func (_i *articleFilesController) All(c *fiber.Ctx) error {
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
_i.Log.Info().Str("authToken", authToken).Msg("")
paginate, err := paginator.Paginate(c) paginate, err := paginator.Paginate(c)
if err != nil { if err != nil {
@ -64,7 +67,7 @@ func (_i *articleFilesController) All(c *fiber.Ctx) error {
req := reqContext.ToParamRequest() req := reqContext.ToParamRequest()
req.Pagination = paginate req.Pagination = paginate
articleFilesData, paging, err := _i.articleFilesService.All(clientId, req) articleFilesData, paging, err := _i.articleFilesService.All(authToken, req)
if err != nil { if err != nil {
return err return err
} }
@ -82,7 +85,7 @@ func (_i *articleFilesController) All(c *fiber.Ctx) error {
// @Description API for getting one ArticleFiles // @Description API for getting one ArticleFiles
// @Tags Article Files // @Tags Article Files
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string false "Insert the X-Client-Key" // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param id path int true "ArticleFiles ID" // @Param id path int true "ArticleFiles ID"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
@ -90,15 +93,16 @@ func (_i *articleFilesController) All(c *fiber.Ctx) error {
// @Failure 500 {object} response.InternalServerError // @Failure 500 {object} response.InternalServerError
// @Router /article-files/{id} [get] // @Router /article-files/{id} [get]
func (_i *articleFilesController) Show(c *fiber.Ctx) error { func (_i *articleFilesController) Show(c *fiber.Ctx) error {
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
_i.Log.Info().Str("authToken", authToken).Msg("")
id, err := strconv.ParseUint(c.Params("id"), 10, 0) id, err := strconv.ParseUint(c.Params("id"), 10, 0)
if err != nil { if err != nil {
return err return err
} }
articleFilesData, err := _i.articleFilesService.Show(clientId, uint(id)) articleFilesData, err := _i.articleFilesService.Show(authToken, uint(id))
if err != nil { if err != nil {
return err return err
} }
@ -116,8 +120,7 @@ func (_i *articleFilesController) Show(c *fiber.Ctx) error {
// @Tags Article Files // @Tags Article Files
// @Security Bearer // @Security Bearer
// @Produce json // @Produce json
// @Param X-Client-Key header string false "Insert the X-Client-Key" // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param X-Csrf-Token header string false "Insert the X-Csrf-Token"
// @Param files formData file true "Upload file" multiple true // @Param files formData file true "Upload file" multiple true
// @Param articleId path int true "Article ID" // @Param articleId path int true "Article ID"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
@ -126,15 +129,16 @@ func (_i *articleFilesController) Show(c *fiber.Ctx) error {
// @Failure 500 {object} response.InternalServerError // @Failure 500 {object} response.InternalServerError
// @Router /article-files/{articleId} [post] // @Router /article-files/{articleId} [post]
func (_i *articleFilesController) Save(c *fiber.Ctx) error { func (_i *articleFilesController) Save(c *fiber.Ctx) error {
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
_i.Log.Info().Str("authToken", authToken).Msg("")
id, err := strconv.ParseUint(c.Params("articleId"), 10, 0) id, err := strconv.ParseUint(c.Params("articleId"), 10, 0)
if err != nil { if err != nil {
return err return err
} }
err = _i.articleFilesService.Save(clientId, c, uint(id)) err = _i.articleFilesService.Save(authToken, c, uint(id))
if err != nil { if err != nil {
return err return err
} }
@ -150,8 +154,7 @@ func (_i *articleFilesController) Save(c *fiber.Ctx) error {
// @Description API for update ArticleFiles // @Description API for update ArticleFiles
// @Tags Article Files // @Tags Article Files
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string false "Insert the X-Client-Key" // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param X-Csrf-Token header string false "Insert the X-Csrf-Token"
// @Param payload body request.ArticleFilesUpdateRequest true "Required payload" // @Param payload body request.ArticleFilesUpdateRequest true "Required payload"
// @Param id path int true "ArticleFiles ID" // @Param id path int true "ArticleFiles ID"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
@ -160,8 +163,9 @@ func (_i *articleFilesController) Save(c *fiber.Ctx) error {
// @Failure 500 {object} response.InternalServerError // @Failure 500 {object} response.InternalServerError
// @Router /article-files/{id} [put] // @Router /article-files/{id} [put]
func (_i *articleFilesController) Update(c *fiber.Ctx) error { func (_i *articleFilesController) Update(c *fiber.Ctx) error {
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
_i.Log.Info().Str("authToken", authToken).Msg("")
id, err := strconv.ParseUint(c.Params("id"), 10, 0) id, err := strconv.ParseUint(c.Params("id"), 10, 0)
if err != nil { if err != nil {
@ -173,7 +177,7 @@ func (_i *articleFilesController) Update(c *fiber.Ctx) error {
return err return err
} }
err = _i.articleFilesService.Update(clientId, uint(id), *req) err = _i.articleFilesService.Update(authToken, uint(id), *req)
if err != nil { if err != nil {
return err return err
} }
@ -189,8 +193,7 @@ func (_i *articleFilesController) Update(c *fiber.Ctx) error {
// @Description API for delete ArticleFiles // @Description API for delete ArticleFiles
// @Tags Article Files // @Tags Article Files
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string false "Insert the X-Client-Key" // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param X-Csrf-Token header string false "Insert the X-Csrf-Token"
// @Param id path int true "ArticleFiles ID" // @Param id path int true "ArticleFiles ID"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
@ -198,15 +201,16 @@ func (_i *articleFilesController) Update(c *fiber.Ctx) error {
// @Failure 500 {object} response.InternalServerError // @Failure 500 {object} response.InternalServerError
// @Router /article-files/{id} [delete] // @Router /article-files/{id} [delete]
func (_i *articleFilesController) Delete(c *fiber.Ctx) error { func (_i *articleFilesController) Delete(c *fiber.Ctx) error {
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
_i.Log.Info().Str("authToken", authToken).Msg("")
id, err := strconv.ParseUint(c.Params("id"), 10, 0) id, err := strconv.ParseUint(c.Params("id"), 10, 0)
if err != nil { if err != nil {
return err return err
} }
err = _i.articleFilesService.Delete(clientId, uint(id)) err = _i.articleFilesService.Delete(authToken, uint(id))
if err != nil { if err != nil {
return err return err
} }
@ -222,7 +226,7 @@ func (_i *articleFilesController) Delete(c *fiber.Ctx) error {
// @Description API for Viewer ArticleFiles // @Description API for Viewer ArticleFiles
// @Tags Article Files // @Tags Article Files
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string false "Insert the X-Client-Key" // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param filename path string true "Article File Name" // @Param filename path string true "Article File Name"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
@ -230,10 +234,11 @@ func (_i *articleFilesController) Delete(c *fiber.Ctx) error {
// @Failure 500 {object} response.InternalServerError // @Failure 500 {object} response.InternalServerError
// @Router /article-files/viewer/{filename} [get] // @Router /article-files/viewer/{filename} [get]
func (_i *articleFilesController) Viewer(c *fiber.Ctx) error { func (_i *articleFilesController) Viewer(c *fiber.Ctx) error {
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
_i.Log.Info().Str("authToken", authToken).Msg("")
return _i.articleFilesService.Viewer(clientId, c) return _i.articleFilesService.Viewer(authToken, c)
} }
// GetUploadStatus ArticleFiles // GetUploadStatus ArticleFiles

View File

@ -1,13 +1,16 @@
package controller package controller
import "netidhub-saas-be/app/module/article_files/service" import (
"github.com/rs/zerolog"
"netidhub-saas-be/app/module/article_files/service"
)
type Controller struct { type Controller struct {
ArticleFiles ArticleFilesController ArticleFiles ArticleFilesController
} }
func NewController(ArticleFilesService service.ArticleFilesService) *Controller { func NewController(ArticleFilesService service.ArticleFilesService, log zerolog.Logger) *Controller {
return &Controller{ return &Controller{
ArticleFiles: NewArticleFilesController(ArticleFilesService), ArticleFiles: NewArticleFilesController(ArticleFilesService, log),
} }
} }

View File

@ -16,9 +16,11 @@ import (
"netidhub-saas-be/app/module/article_files/repository" "netidhub-saas-be/app/module/article_files/repository"
"netidhub-saas-be/app/module/article_files/request" "netidhub-saas-be/app/module/article_files/request"
"netidhub-saas-be/app/module/article_files/response" "netidhub-saas-be/app/module/article_files/response"
usersRepository "netidhub-saas-be/app/module/users/repository"
config "netidhub-saas-be/config/config" config "netidhub-saas-be/config/config"
minioStorage "netidhub-saas-be/config/config" minioStorage "netidhub-saas-be/config/config"
"netidhub-saas-be/utils/paginator" "netidhub-saas-be/utils/paginator"
utilSvc "netidhub-saas-be/utils/service"
"os" "os"
"path/filepath" "path/filepath"
"strconv" "strconv"
@ -30,6 +32,7 @@ import (
// ArticleFilesService // ArticleFilesService
type articleFilesService struct { type articleFilesService struct {
Repo repository.ArticleFilesRepository Repo repository.ArticleFilesRepository
UsersRepo usersRepository.UsersRepository
Log zerolog.Logger Log zerolog.Logger
Cfg *config.Config Cfg *config.Config
MinioStorage *minioStorage.MinioStorage MinioStorage *minioStorage.MinioStorage
@ -37,21 +40,22 @@ type articleFilesService struct {
// ArticleFilesService define interface of IArticleFilesService // ArticleFilesService define interface of IArticleFilesService
type ArticleFilesService interface { type ArticleFilesService interface {
All(clientId *uuid.UUID, req request.ArticleFilesQueryRequest) (articleFiles []*response.ArticleFilesResponse, paging paginator.Pagination, err error) All(authToken string, req request.ArticleFilesQueryRequest) (articleFiles []*response.ArticleFilesResponse, paging paginator.Pagination, err error)
Show(clientId *uuid.UUID, id uint) (articleFiles *response.ArticleFilesResponse, err error) Show(authToken string, id uint) (articleFiles *response.ArticleFilesResponse, err error)
Save(clientId *uuid.UUID, c *fiber.Ctx, id uint) error Save(authToken string, c *fiber.Ctx, id uint) error
SaveAsync(clientId *uuid.UUID, c *fiber.Ctx, id uint) error SaveAsync(authToken string, c *fiber.Ctx, id uint) error
Update(clientId *uuid.UUID, id uint, req request.ArticleFilesUpdateRequest) (err error) Update(authToken string, id uint, req request.ArticleFilesUpdateRequest) (err error)
GetUploadStatus(c *fiber.Ctx) (progress int, err error) GetUploadStatus(c *fiber.Ctx) (progress int, err error)
Delete(clientId *uuid.UUID, id uint) error Delete(authToken string, id uint) error
Viewer(clientId *uuid.UUID, c *fiber.Ctx) error Viewer(authToken string, c *fiber.Ctx) error
} }
// NewArticleFilesService init ArticleFilesService // NewArticleFilesService init ArticleFilesService
func NewArticleFilesService(repo repository.ArticleFilesRepository, log zerolog.Logger, cfg *config.Config, minioStorage *minioStorage.MinioStorage) ArticleFilesService { func NewArticleFilesService(repo repository.ArticleFilesRepository, log zerolog.Logger, cfg *config.Config, minioStorage *minioStorage.MinioStorage, usersRepo usersRepository.UsersRepository) ArticleFilesService {
return &articleFilesService{ return &articleFilesService{
Repo: repo, Repo: repo,
UsersRepo: usersRepo,
Log: log, Log: log,
Cfg: cfg, Cfg: cfg,
MinioStorage: minioStorage, MinioStorage: minioStorage,
@ -70,7 +74,17 @@ type progressWriter struct {
} }
// All implement interface of ArticleFilesService // All implement interface of ArticleFilesService
func (_i *articleFilesService) All(clientId *uuid.UUID, req request.ArticleFilesQueryRequest) (articleFiless []*response.ArticleFilesResponse, paging paginator.Pagination, err error) { func (_i *articleFilesService) All(authToken string, req request.ArticleFilesQueryRequest) (articleFiless []*response.ArticleFilesResponse, paging paginator.Pagination, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
results, paging, err := _i.Repo.GetAll(clientId, req) results, paging, err := _i.Repo.GetAll(clientId, req)
if err != nil { if err != nil {
return return
@ -85,7 +99,17 @@ func (_i *articleFilesService) All(clientId *uuid.UUID, req request.ArticleFiles
return return
} }
func (_i *articleFilesService) Show(clientId *uuid.UUID, id uint) (articleFiles *response.ArticleFilesResponse, err error) { func (_i *articleFilesService) Show(authToken string, id uint) (articleFiles *response.ArticleFilesResponse, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
result, err := _i.Repo.FindOne(clientId, id) result, err := _i.Repo.FindOne(clientId, id)
if err != nil { if err != nil {
return nil, err return nil, err
@ -96,7 +120,17 @@ func (_i *articleFilesService) Show(clientId *uuid.UUID, id uint) (articleFiles
return mapper.ArticleFilesResponseMapper(result, host), nil return mapper.ArticleFilesResponseMapper(result, host), nil
} }
func (_i *articleFilesService) SaveAsync(clientId *uuid.UUID, c *fiber.Ctx, id uint) (err error) { func (_i *articleFilesService) SaveAsync(authToken string, c *fiber.Ctx, id uint) (err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
bucketName := _i.MinioStorage.Cfg.ObjectStorage.MinioStorage.BucketName bucketName := _i.MinioStorage.Cfg.ObjectStorage.MinioStorage.BucketName
ctx := context.Background() ctx := context.Background()
@ -195,7 +229,17 @@ func (_i *articleFilesService) SaveAsync(clientId *uuid.UUID, c *fiber.Ctx, id u
return return
} }
func (_i *articleFilesService) Save(clientId *uuid.UUID, c *fiber.Ctx, id uint) (err error) { func (_i *articleFilesService) Save(authToken string, c *fiber.Ctx, id uint) (err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
bucketName := _i.MinioStorage.Cfg.ObjectStorage.MinioStorage.BucketName bucketName := _i.MinioStorage.Cfg.ObjectStorage.MinioStorage.BucketName
form, err := c.MultipartForm() form, err := c.MultipartForm()
@ -277,12 +321,32 @@ func (_i *articleFilesService) Save(clientId *uuid.UUID, c *fiber.Ctx, id uint)
return return
} }
func (_i *articleFilesService) Update(clientId *uuid.UUID, id uint, req request.ArticleFilesUpdateRequest) (err error) { func (_i *articleFilesService) Update(authToken string, id uint, req request.ArticleFilesUpdateRequest) (err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
_i.Log.Info().Interface("data", req).Msg("") _i.Log.Info().Interface("data", req).Msg("")
return _i.Repo.Update(clientId, id, req.ToEntity()) return _i.Repo.Update(clientId, id, req.ToEntity())
} }
func (_i *articleFilesService) Delete(clientId *uuid.UUID, id uint) error { func (_i *articleFilesService) Delete(authToken string, id uint) error {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
result, err := _i.Repo.FindOne(clientId, id) result, err := _i.Repo.FindOne(clientId, id)
if err != nil { if err != nil {
return err return err
@ -291,7 +355,17 @@ func (_i *articleFilesService) Delete(clientId *uuid.UUID, id uint) error {
return _i.Repo.Update(clientId, id, result) return _i.Repo.Update(clientId, id, result)
} }
func (_i *articleFilesService) Viewer(clientId *uuid.UUID, c *fiber.Ctx) (err error) { func (_i *articleFilesService) Viewer(authToken string, c *fiber.Ctx) (err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
filename := c.Params("filename") filename := c.Params("filename")
result, err := _i.Repo.FindByFilename(clientId, filename) result, err := _i.Repo.FindByFilename(clientId, filename)
if err != nil { if err != nil {

View File

@ -1,7 +1,6 @@
package controller package controller
import ( import (
"netidhub-saas-be/app/middleware"
"netidhub-saas-be/app/module/articles/request" "netidhub-saas-be/app/module/articles/request"
"netidhub-saas-be/app/module/articles/service" "netidhub-saas-be/app/module/articles/service"
"netidhub-saas-be/utils/paginator" "netidhub-saas-be/utils/paginator"
@ -53,7 +52,6 @@ func NewArticlesController(articlesService service.ArticlesService, log zerolog.
// @Description API for getting all Articles // @Description API for getting all Articles
// @Tags Articles // @Tags Articles
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key"
// @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>) // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param req query request.ArticlesQueryRequest false "query parameters" // @Param req query request.ArticlesQueryRequest false "query parameters"
// @Param req query paginator.Pagination false "pagination parameters" // @Param req query paginator.Pagination false "pagination parameters"
@ -83,15 +81,11 @@ func (_i *articlesController) All(c *fiber.Ctx) error {
req := reqContext.ToParamRequest() req := reqContext.ToParamRequest()
req.Pagination = paginate req.Pagination = paginate
// Get ClientId from context
clientId := middleware.GetClientID(c)
// Get Authorization token from header // Get Authorization token from header
authToken := c.Get("Authorization") authToken := c.Get("Authorization")
_i.Log.Info().Interface("clientId", clientId).Msg("")
_i.Log.Info().Str("authToken", authToken).Msg("") _i.Log.Info().Str("authToken", authToken).Msg("")
articlesData, paging, err := _i.articlesService.All(clientId, authToken, req) articlesData, paging, err := _i.articlesService.All(authToken, req)
if err != nil { if err != nil {
return err return err
} }
@ -109,8 +103,7 @@ func (_i *articlesController) All(c *fiber.Ctx) error {
// @Description API for getting one Articles // @Description API for getting one Articles
// @Tags Articles // @Tags Articles
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param id path int true "Articles ID"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
// @Failure 401 {object} response.UnauthorizedError // @Failure 401 {object} response.UnauthorizedError
@ -122,10 +115,11 @@ func (_i *articlesController) Show(c *fiber.Ctx) error {
return err return err
} }
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
_i.Log.Info().Str("authToken", authToken).Msg("")
articlesData, err := _i.articlesService.Show(clientId, uint(id)) articlesData, err := _i.articlesService.Show(authToken, uint(id))
if err != nil { if err != nil {
return err return err
} }
@ -142,8 +136,7 @@ func (_i *articlesController) Show(c *fiber.Ctx) error {
// @Description API for getting one Articles // @Description API for getting one Articles
// @Tags Articles // @Tags Articles
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param id path int true "Articles Old ID"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
// @Failure 401 {object} response.UnauthorizedError // @Failure 401 {object} response.UnauthorizedError
@ -155,10 +148,11 @@ func (_i *articlesController) ShowByOldId(c *fiber.Ctx) error {
return err return err
} }
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
_i.Log.Info().Str("authToken", authToken).Msg("")
articlesData, err := _i.articlesService.ShowByOldId(clientId, uint(id)) articlesData, err := _i.articlesService.ShowByOldId(authToken, uint(id))
if err != nil { if err != nil {
return err return err
} }
@ -175,8 +169,6 @@ func (_i *articlesController) ShowByOldId(c *fiber.Ctx) error {
// @Description API for create Articles // @Description API for create Articles
// @Tags Articles // @Tags Articles
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string false "Insert the X-Client-Key"
// @Param X-Csrf-Token header string false "Insert the X-Csrf-Token"
// @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>) // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param payload body request.ArticlesCreateRequest true "Required payload" // @Param payload body request.ArticlesCreateRequest true "Required payload"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
@ -190,15 +182,11 @@ func (_i *articlesController) Save(c *fiber.Ctx) error {
return err return err
} }
// Get Authorization token from header
authToken := c.Get("Authorization") authToken := c.Get("Authorization")
_i.Log.Info().Str("authToken", authToken).Msg("")
// Get ClientId from context dataResult, err := _i.articlesService.Save(authToken, *req)
clientId := middleware.GetClientID(c)
_i.Log.Info().Interface("clientId", clientId).Msg("")
_i.Log.Info().Interface("authToken", authToken).Msg("")
dataResult, err := _i.articlesService.Save(clientId, *req, authToken)
if err != nil { if err != nil {
return err return err
} }
@ -216,9 +204,7 @@ func (_i *articlesController) Save(c *fiber.Ctx) error {
// @Tags Articles // @Tags Articles
// @Security Bearer // @Security Bearer
// @Produce json // @Produce json
// @Param X-Client-Key header string false "Insert the X-Client-Key" // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param X-Csrf-Token header string false "Insert the X-Csrf-Token"
// @Param files formData file true "Upload thumbnail"
// @Param id path int true "Articles ID" // @Param id path int true "Articles ID"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
@ -226,10 +212,11 @@ func (_i *articlesController) Save(c *fiber.Ctx) error {
// @Failure 500 {object} response.InternalServerError // @Failure 500 {object} response.InternalServerError
// @Router /articles/thumbnail/{id} [post] // @Router /articles/thumbnail/{id} [post]
func (_i *articlesController) SaveThumbnail(c *fiber.Ctx) error { func (_i *articlesController) SaveThumbnail(c *fiber.Ctx) error {
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
_i.Log.Info().Str("authToken", authToken).Msg("")
err := _i.articlesService.SaveThumbnail(clientId, c) err := _i.articlesService.SaveThumbnail(authToken, c)
if err != nil { if err != nil {
return err return err
} }
@ -245,9 +232,7 @@ func (_i *articlesController) SaveThumbnail(c *fiber.Ctx) error {
// @Description API for update Articles // @Description API for update Articles
// @Tags Articles // @Tags Articles
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string false "Insert the X-Client-Key" // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param X-Csrf-Token header string false "Insert the X-Csrf-Token"
// @Param payload body request.ArticlesUpdateRequest true "Required payload"
// @Param id path int true "Articles ID" // @Param id path int true "Articles ID"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
@ -265,10 +250,11 @@ func (_i *articlesController) Update(c *fiber.Ctx) error {
return err return err
} }
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
_i.Log.Info().Str("authToken", authToken).Msg("")
err = _i.articlesService.Update(clientId, uint(id), *req) err = _i.articlesService.Update(authToken, uint(id), *req)
if err != nil { if err != nil {
return err return err
} }
@ -284,8 +270,7 @@ func (_i *articlesController) Update(c *fiber.Ctx) error {
// @Description API for Update Banner Articles // @Description API for Update Banner Articles
// @Tags Articles // @Tags Articles
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string false "Insert the X-Client-Key" // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param X-Csrf-Token header string false "Insert the X-Csrf-Token"
// @Param id path int true "Articles ID" // @Param id path int true "Articles ID"
// @Param isBanner query bool true "Articles Banner Status" // @Param isBanner query bool true "Articles Banner Status"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
@ -304,10 +289,11 @@ func (_i *articlesController) UpdateBanner(c *fiber.Ctx) error {
return err return err
} }
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
_i.Log.Info().Str("authToken", authToken).Msg("")
err = _i.articlesService.UpdateBanner(clientId, uint(id), isBanner) err = _i.articlesService.UpdateBanner(authToken, uint(id), isBanner)
if err != nil { if err != nil {
return err return err
} }
@ -323,8 +309,7 @@ func (_i *articlesController) UpdateBanner(c *fiber.Ctx) error {
// @Description API for delete Articles // @Description API for delete Articles
// @Tags Articles // @Tags Articles
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string false "Insert the X-Client-Key" // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param X-Csrf-Token header string false "Insert the X-Csrf-Token"
// @Param id path int true "Articles ID" // @Param id path int true "Articles ID"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
@ -337,10 +322,11 @@ func (_i *articlesController) Delete(c *fiber.Ctx) error {
return err return err
} }
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
_i.Log.Info().Str("authToken", authToken).Msg("")
err = _i.articlesService.Delete(clientId, uint(id)) err = _i.articlesService.Delete(authToken, uint(id))
if err != nil { if err != nil {
return err return err
} }
@ -356,7 +342,7 @@ func (_i *articlesController) Delete(c *fiber.Ctx) error {
// @Description API for View Thumbnail of Article // @Description API for View Thumbnail of Article
// @Tags Articles // @Tags Articles
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string false "Insert the X-Client-Key" // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param thumbnailName path string true "Articles Thumbnail Name" // @Param thumbnailName path string true "Articles Thumbnail Name"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
@ -364,10 +350,11 @@ func (_i *articlesController) Delete(c *fiber.Ctx) error {
// @Failure 500 {object} response.InternalServerError // @Failure 500 {object} response.InternalServerError
// @Router /articles/thumbnail/viewer/{thumbnailName} [get] // @Router /articles/thumbnail/viewer/{thumbnailName} [get]
func (_i *articlesController) Viewer(c *fiber.Ctx) error { func (_i *articlesController) Viewer(c *fiber.Ctx) error {
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
_i.Log.Info().Str("authToken", authToken).Msg("")
return _i.articlesService.Viewer(clientId, c) return _i.articlesService.Viewer(authToken, c)
} }
// SummaryStats Articles // SummaryStats Articles
@ -382,12 +369,11 @@ func (_i *articlesController) Viewer(c *fiber.Ctx) error {
// @Failure 500 {object} response.InternalServerError // @Failure 500 {object} response.InternalServerError
// @Router /articles/statistic/summary [get] // @Router /articles/statistic/summary [get]
func (_i *articlesController) SummaryStats(c *fiber.Ctx) error { func (_i *articlesController) SummaryStats(c *fiber.Ctx) error {
// Get Authorization token from header
authToken := c.Get("Authorization") authToken := c.Get("Authorization")
_i.Log.Info().Str("authToken", authToken).Msg("")
// Get ClientId from context response, err := _i.articlesService.SummaryStats(authToken)
clientId := middleware.GetClientID(c)
response, err := _i.articlesService.SummaryStats(clientId, authToken)
if err != nil { if err != nil {
return err return err
} }
@ -413,14 +399,14 @@ func (_i *articlesController) SummaryStats(c *fiber.Ctx) error {
// @Failure 500 {object} response.InternalServerError // @Failure 500 {object} response.InternalServerError
// @Router /articles/statistic/user-levels [get] // @Router /articles/statistic/user-levels [get]
func (_i *articlesController) ArticlePerUserLevelStats(c *fiber.Ctx) error { func (_i *articlesController) ArticlePerUserLevelStats(c *fiber.Ctx) error {
// Get Authorization token from header
authToken := c.Get("Authorization") authToken := c.Get("Authorization")
_i.Log.Info().Str("authToken", authToken).Msg("")
startDate := c.Query("startDate") startDate := c.Query("startDate")
endDate := c.Query("endDate") endDate := c.Query("endDate")
// Get ClientId from context response, err := _i.articlesService.ArticlePerUserLevelStats(authToken, &startDate, &endDate)
clientId := middleware.GetClientID(c)
response, err := _i.articlesService.ArticlePerUserLevelStats(clientId, authToken, &startDate, &endDate)
if err != nil { if err != nil {
return err return err
} }
@ -445,17 +431,17 @@ func (_i *articlesController) ArticlePerUserLevelStats(c *fiber.Ctx) error {
// @Failure 500 {object} response.InternalServerError // @Failure 500 {object} response.InternalServerError
// @Router /articles/statistic/monthly [get] // @Router /articles/statistic/monthly [get]
func (_i *articlesController) ArticleMonthlyStats(c *fiber.Ctx) error { func (_i *articlesController) ArticleMonthlyStats(c *fiber.Ctx) error {
// Get Authorization token from header
authToken := c.Get("Authorization") authToken := c.Get("Authorization")
_i.Log.Info().Str("authToken", authToken).Msg("")
year := c.Query("year") year := c.Query("year")
yearInt, err := strconv.Atoi(year) yearInt, err := strconv.Atoi(year)
if err != nil { if err != nil {
return err return err
} }
// Get ClientId from context response, err := _i.articlesService.ArticleMonthlyStats(authToken, &yearInt)
clientId := middleware.GetClientID(c)
response, err := _i.articlesService.ArticleMonthlyStats(clientId, authToken, &yearInt)
if err != nil { if err != nil {
return err return err
} }
@ -472,8 +458,7 @@ func (_i *articlesController) ArticleMonthlyStats(c *fiber.Ctx) error {
// @Description API for Publish Schedule of Article // @Description API for Publish Schedule of Article
// @Tags Articles // @Tags Articles
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param X-Csrf-Token header string false "Insert the X-Csrf-Token"
// @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>) // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param id query int false "article id" // @Param id query int false "article id"
// @Param date query string false "publish date" // @Param date query string false "publish date"
@ -489,10 +474,11 @@ func (_i *articlesController) PublishScheduling(c *fiber.Ctx) error {
} }
date := c.Query("date") date := c.Query("date")
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
_i.Log.Info().Str("authToken", authToken).Msg("")
err = _i.articlesService.PublishScheduling(clientId, uint(id), date) err = _i.articlesService.PublishScheduling(authToken, uint(id), date)
if err != nil { if err != nil {
return err return err
} }
@ -508,8 +494,7 @@ func (_i *articlesController) PublishScheduling(c *fiber.Ctx) error {
// @Description API for submitting article for approval workflow // @Description API for submitting article for approval workflow
// @Tags Articles // @Tags Articles
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param X-Csrf-Token header string false "Insert the X-Csrf-Token"
// @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>) // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param id path int true "article id" // @Param id path int true "article id"
// @Param req body request.SubmitForApprovalRequest false "approval request data" // @Param req body request.SubmitForApprovalRequest false "approval request data"
@ -529,13 +514,11 @@ func (_i *articlesController) SubmitForApproval(c *fiber.Ctx) error {
return err return err
} }
// Get ClientId from context
clientId := middleware.GetClientID(c)
// Get Authorization token from header // Get Authorization token from header
authToken := c.Get("Authorization") authToken := c.Get("Authorization")
_i.Log.Info().Str("authToken", authToken).Msg("")
err = _i.articlesService.SubmitForApproval(clientId, uint(id), authToken, req.WorkflowId) err = _i.articlesService.SubmitForApproval(authToken, uint(id), req.WorkflowId)
if err != nil { if err != nil {
return err return err
} }
@ -551,7 +534,7 @@ func (_i *articlesController) SubmitForApproval(c *fiber.Ctx) error {
// @Description API for getting article approval status and workflow progress // @Description API for getting article approval status and workflow progress
// @Tags Articles // @Tags Articles
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string false "Insert the X-Client-Key" // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>) // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param id path int true "article id" // @Param id path int true "article id"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
@ -565,10 +548,11 @@ func (_i *articlesController) GetApprovalStatus(c *fiber.Ctx) error {
return err return err
} }
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
_i.Log.Info().Str("authToken", authToken).Msg("")
response, err := _i.articlesService.GetApprovalStatus(clientId, uint(id)) response, err := _i.articlesService.GetApprovalStatus(authToken, uint(id))
if err != nil { if err != nil {
return err return err
} }
@ -585,7 +569,7 @@ func (_i *articlesController) GetApprovalStatus(c *fiber.Ctx) error {
// @Description API for getting articles pending approval for current user level // @Description API for getting articles pending approval for current user level
// @Tags Articles // @Tags Articles
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string false "Insert the X-Client-Key" // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>) // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param page query int false "page number" // @Param page query int false "page number"
// @Param limit query int false "items per page" // @Param limit query int false "items per page"
@ -614,13 +598,11 @@ func (_i *articlesController) GetPendingApprovals(c *fiber.Ctx) error {
} }
} }
// Get ClientId from context
clientId := middleware.GetClientID(c)
// Get Authorization token from header // Get Authorization token from header
authToken := c.Get("Authorization") authToken := c.Get("Authorization")
_i.Log.Info().Str("authToken", authToken).Msg("")
response, paging, err := _i.articlesService.GetPendingApprovals(clientId, authToken, page, limit, typeId) // Updated with typeId filter response, paging, err := _i.articlesService.GetPendingApprovals(authToken, page, limit, typeId) // Updated with typeId filter
if err != nil { if err != nil {
return err return err
} }
@ -638,7 +620,7 @@ func (_i *articlesController) GetPendingApprovals(c *fiber.Ctx) error {
// @Description API for getting articles that are waiting for approval by the current user's level // @Description API for getting articles that are waiting for approval by the current user's level
// @Tags Articles // @Tags Articles
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Client Key" // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>) // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param page query int false "Page number" default(1) // @Param page query int false "Page number" default(1)
// @Param limit query int false "Items per page" default(10) // @Param limit query int false "Items per page" default(10)
@ -658,13 +640,11 @@ func (_i *articlesController) GetArticlesWaitingForApproval(c *fiber.Ctx) error
return err return err
} }
// Get ClientId from context
clientId := middleware.GetClientID(c)
// Get Authorization token from header // Get Authorization token from header
authToken := c.Get("Authorization") authToken := c.Get("Authorization")
_i.Log.Info().Str("authToken", authToken).Msg("")
responses, paging, err := _i.articlesService.GetArticlesWaitingForApproval(clientId, authToken, page, limit) responses, paging, err := _i.articlesService.GetArticlesWaitingForApproval(authToken, page, limit)
if err != nil { if err != nil {
return err return err
} }

View File

@ -55,34 +55,34 @@ type articlesService struct {
// ArticlesService define interface of IArticlesService // ArticlesService define interface of IArticlesService
type ArticlesService interface { type ArticlesService interface {
All(clientId *uuid.UUID, authToken string, req request.ArticlesQueryRequest) (articles []*response.ArticlesResponse, paging paginator.Pagination, err error) All(authToken string, req request.ArticlesQueryRequest) (articles []*response.ArticlesResponse, paging paginator.Pagination, err error)
Show(clientId *uuid.UUID, id uint) (articles *response.ArticlesResponse, err error) Show(authToken string, id uint) (articles *response.ArticlesResponse, err error)
ShowByOldId(clientId *uuid.UUID, oldId uint) (articles *response.ArticlesResponse, err error) ShowByOldId(authToken string, oldId uint) (articles *response.ArticlesResponse, err error)
Save(clientId *uuid.UUID, req request.ArticlesCreateRequest, authToken string) (articles *entity.Articles, err error) Save(authToken string, req request.ArticlesCreateRequest) (articles *entity.Articles, err error)
SaveThumbnail(clientId *uuid.UUID, c *fiber.Ctx) (err error) SaveThumbnail(authToken string, c *fiber.Ctx) (err error)
Update(clientId *uuid.UUID, id uint, req request.ArticlesUpdateRequest) (err error) Update(authToken string, id uint, req request.ArticlesUpdateRequest) (err error)
Delete(clientId *uuid.UUID, id uint) error Delete(authToken string, id uint) error
UpdateActivityCount(clientId *uuid.UUID, id uint, activityTypeId int) (err error) UpdateActivityCount(authToken string, id uint, activityTypeId int) (err error)
UpdateApproval(clientId *uuid.UUID, id uint, statusId int, userLevelId int, userLevelNumber int, userParentLevelId int) (err error) UpdateApproval(authToken string, id uint, statusId int, userLevelId int, userLevelNumber int, userParentLevelId int) (err error)
UpdateBanner(clientId *uuid.UUID, id uint, isBanner bool) error UpdateBanner(authToken string, id uint, isBanner bool) error
Viewer(clientId *uuid.UUID, c *fiber.Ctx) error Viewer(authToken string, c *fiber.Ctx) error
SummaryStats(clientId *uuid.UUID, authToken string) (summaryStats *response.ArticleSummaryStats, err error) SummaryStats(authToken string) (summaryStats *response.ArticleSummaryStats, err error)
ArticlePerUserLevelStats(clientId *uuid.UUID, authToken string, startDate *string, endDate *string) (articlePerUserLevelStats []*response.ArticlePerUserLevelStats, err error) ArticlePerUserLevelStats(authToken string, startDate *string, endDate *string) (articlePerUserLevelStats []*response.ArticlePerUserLevelStats, err error)
ArticleMonthlyStats(clientId *uuid.UUID, authToken string, year *int) (articleMonthlyStats []*response.ArticleMonthlyStats, err error) ArticleMonthlyStats(authToken string, year *int) (articleMonthlyStats []*response.ArticleMonthlyStats, err error)
PublishScheduling(clientId *uuid.UUID, id uint, publishSchedule string) error PublishScheduling(authToken string, id uint, publishSchedule string) error
ExecuteScheduling() error ExecuteScheduling() error
// Dynamic approval system methods // Dynamic approval system methods
SubmitForApproval(clientId *uuid.UUID, articleId uint, authToken string, workflowId *uint) error SubmitForApproval(authToken string, articleId uint, workflowId *uint) error
GetApprovalStatus(clientId *uuid.UUID, articleId uint) (*response.ArticleApprovalStatusResponse, error) GetApprovalStatus(authToken string, articleId uint) (*response.ArticleApprovalStatusResponse, error)
GetArticlesWaitingForApproval(clientId *uuid.UUID, authToken string, page, limit int) ([]*response.ArticleApprovalQueueResponse, paginator.Pagination, error) GetArticlesWaitingForApproval(authToken string, page, limit int) ([]*response.ArticleApprovalQueueResponse, paginator.Pagination, error)
GetPendingApprovals(clientId *uuid.UUID, authToken string, page, limit int, typeId *int) ([]*response.ArticleApprovalQueueResponse, paginator.Pagination, error) // Updated with typeId filter GetPendingApprovals(authToken string, page, limit int, typeId *int) ([]*response.ArticleApprovalQueueResponse, paginator.Pagination, error) // Updated with typeId filter
// No-approval system methods // No-approval system methods
CheckApprovalRequired(clientId *uuid.UUID, articleId uint, userId uint, userLevelId uint) (bool, error) CheckApprovalRequired(authToken string, articleId uint, userId uint, userLevelId uint) (bool, error)
AutoApproveArticle(clientId *uuid.UUID, articleId uint, reason string) error AutoApproveArticle(authToken string, articleId uint, reason string) error
GetClientApprovalSettings(clientId *uuid.UUID) (*response.ClientApprovalSettingsResponse, error) GetClientApprovalSettings(authToken string) (*response.ClientApprovalSettingsResponse, error)
SetArticleApprovalExempt(clientId *uuid.UUID, articleId uint, exempt bool, reason string) error SetArticleApprovalExempt(authToken string, articleId uint, exempt bool, reason string) error
} }
// NewArticlesService init ArticlesService // NewArticlesService init ArticlesService
@ -116,12 +116,17 @@ func NewArticlesService(
} }
// All implement interface of ArticlesService // All implement interface of ArticlesService
func (_i *articlesService) All(clientId *uuid.UUID, authToken string, req request.ArticlesQueryRequest) (articless []*response.ArticlesResponse, paging paginator.Pagination, err error) { func (_i *articlesService) All(authToken string, req request.ArticlesQueryRequest) (articless []*response.ArticlesResponse, paging paginator.Pagination, err error) {
// Extract userLevelId from authToken // Extract clientId and userLevelId from authToken
var clientId *uuid.UUID
var userLevelId *uint var userLevelId *uint
if authToken != "" { if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken) user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil { if user != nil {
if user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
userLevelId = &user.UserLevelId userLevelId = &user.UserLevelId
_i.Log.Info().Interface("userLevelId", userLevelId).Msg("Extracted userLevelId from auth token") _i.Log.Info().Interface("userLevelId", userLevelId).Msg("Extracted userLevelId from auth token")
} }
@ -154,7 +159,17 @@ func (_i *articlesService) All(clientId *uuid.UUID, authToken string, req reques
return return
} }
func (_i *articlesService) Show(clientId *uuid.UUID, id uint) (articles *response.ArticlesResponse, err error) { func (_i *articlesService) Show(authToken string, id uint) (articles *response.ArticlesResponse, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
result, err := _i.Repo.FindOne(clientId, id) result, err := _i.Repo.FindOne(clientId, id)
if err != nil { if err != nil {
return nil, err return nil, err
@ -165,7 +180,17 @@ func (_i *articlesService) Show(clientId *uuid.UUID, id uint) (articles *respons
return mapper.ArticlesResponseMapper(_i.Log, host, clientId, result, _i.ArticleCategoriesRepo, _i.ArticleCategoryDetailsRepo, _i.ArticleFilesRepo, _i.UsersRepo), nil return mapper.ArticlesResponseMapper(_i.Log, host, clientId, result, _i.ArticleCategoriesRepo, _i.ArticleCategoryDetailsRepo, _i.ArticleFilesRepo, _i.UsersRepo), nil
} }
func (_i *articlesService) ShowByOldId(clientId *uuid.UUID, oldId uint) (articles *response.ArticlesResponse, err error) { func (_i *articlesService) ShowByOldId(authToken string, oldId uint) (articles *response.ArticlesResponse, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
result, err := _i.Repo.FindByOldId(clientId, oldId) result, err := _i.Repo.FindByOldId(clientId, oldId)
if err != nil { if err != nil {
return nil, err return nil, err
@ -176,10 +201,20 @@ func (_i *articlesService) ShowByOldId(clientId *uuid.UUID, oldId uint) (article
return mapper.ArticlesResponseMapper(_i.Log, host, clientId, result, _i.ArticleCategoriesRepo, _i.ArticleCategoryDetailsRepo, _i.ArticleFilesRepo, _i.UsersRepo), nil return mapper.ArticlesResponseMapper(_i.Log, host, clientId, result, _i.ArticleCategoriesRepo, _i.ArticleCategoryDetailsRepo, _i.ArticleFilesRepo, _i.UsersRepo), nil
} }
func (_i *articlesService) Save(clientId *uuid.UUID, req request.ArticlesCreateRequest, authToken string) (articles *entity.Articles, err error) { func (_i *articlesService) Save(authToken string, req request.ArticlesCreateRequest) (articles *entity.Articles, err error) {
_i.Log.Info().Interface("data", req).Msg("") _i.Log.Info().Interface("data", req).Msg("")
newReq := req.ToEntity() newReq := req.ToEntity()
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
var userLevelNumber int var userLevelNumber int
var approvalLevelId int var approvalLevelId int
if req.CreatedById != nil { if req.CreatedById != nil {
@ -359,7 +394,16 @@ func (_i *articlesService) Save(clientId *uuid.UUID, req request.ArticlesCreateR
return saveArticleRes, nil return saveArticleRes, nil
} }
func (_i *articlesService) SaveThumbnail(clientId *uuid.UUID, c *fiber.Ctx) (err error) { func (_i *articlesService) SaveThumbnail(authToken string, c *fiber.Ctx) (err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
id, err := strconv.ParseUint(c.Params("id"), 10, 0) id, err := strconv.ParseUint(c.Params("id"), 10, 0)
if err != nil { if err != nil {
@ -432,10 +476,20 @@ func (_i *articlesService) SaveThumbnail(clientId *uuid.UUID, c *fiber.Ctx) (err
return return
} }
func (_i *articlesService) Update(clientId *uuid.UUID, id uint, req request.ArticlesUpdateRequest) (err error) { func (_i *articlesService) Update(authToken string, id uint, req request.ArticlesUpdateRequest) (err error) {
_i.Log.Info().Interface("data", req).Msg("") _i.Log.Info().Interface("data", req).Msg("")
newReq := req.ToEntity() newReq := req.ToEntity()
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if req.CreatedAt != nil { if req.CreatedAt != nil {
layout := "2006-01-02 15:04:05" layout := "2006-01-02 15:04:05"
parsedTime, err := time.Parse(layout, *req.CreatedAt) parsedTime, err := time.Parse(layout, *req.CreatedAt)
@ -448,11 +502,31 @@ func (_i *articlesService) Update(clientId *uuid.UUID, id uint, req request.Arti
return _i.Repo.UpdateSkipNull(clientId, id, newReq) return _i.Repo.UpdateSkipNull(clientId, id, newReq)
} }
func (_i *articlesService) Delete(clientId *uuid.UUID, id uint) error { func (_i *articlesService) Delete(authToken string, id uint) error {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
return _i.Repo.Delete(clientId, id) return _i.Repo.Delete(clientId, id)
} }
func (_i *articlesService) Viewer(clientId *uuid.UUID, c *fiber.Ctx) (err error) { func (_i *articlesService) Viewer(authToken string, c *fiber.Ctx) (err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
thumbnailName := c.Params("thumbnailName") thumbnailName := c.Params("thumbnailName")
emptyImage := "empty-image.jpg" emptyImage := "empty-image.jpg"
@ -513,7 +587,17 @@ func (_i *articlesService) Viewer(clientId *uuid.UUID, c *fiber.Ctx) (err error)
return return
} }
func (_i *articlesService) UpdateActivityCount(clientId *uuid.UUID, id uint, activityTypeId int) error { func (_i *articlesService) UpdateActivityCount(authToken string, id uint, activityTypeId int) error {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
result, err := _i.Repo.FindOne(clientId, id) result, err := _i.Repo.FindOne(clientId, id)
if err != nil { if err != nil {
return err return err
@ -545,7 +629,17 @@ func (_i *articlesService) UpdateActivityCount(clientId *uuid.UUID, id uint, act
return _i.Repo.Update(clientId, id, result) return _i.Repo.Update(clientId, id, result)
} }
func (_i *articlesService) SummaryStats(clientId *uuid.UUID, authToken string) (summaryStats *response.ArticleSummaryStats, err error) { func (_i *articlesService) SummaryStats(authToken string) (summaryStats *response.ArticleSummaryStats, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken) user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
result, err := _i.Repo.SummaryStats(clientId, user.ID) result, err := _i.Repo.SummaryStats(clientId, user.ID)
@ -555,7 +649,17 @@ func (_i *articlesService) SummaryStats(clientId *uuid.UUID, authToken string) (
return result, nil return result, nil
} }
func (_i *articlesService) ArticlePerUserLevelStats(clientId *uuid.UUID, authToken string, startDate *string, endDate *string) (articlePerUserLevelStats []*response.ArticlePerUserLevelStats, err error) { func (_i *articlesService) ArticlePerUserLevelStats(authToken string, startDate *string, endDate *string) (articlePerUserLevelStats []*response.ArticlePerUserLevelStats, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken) user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
_i.Log.Info().Str("timestamp", time.Now(). _i.Log.Info().Str("timestamp", time.Now().
@ -587,7 +691,17 @@ func (_i *articlesService) ArticlePerUserLevelStats(clientId *uuid.UUID, authTok
return result, nil return result, nil
} }
func (_i *articlesService) ArticleMonthlyStats(clientId *uuid.UUID, authToken string, year *int) (articleMonthlyStats []*response.ArticleMonthlyStats, err error) { func (_i *articlesService) ArticleMonthlyStats(authToken string, year *int) (articleMonthlyStats []*response.ArticleMonthlyStats, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken) user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
var userLevelId *uint var userLevelId *uint
@ -605,7 +719,17 @@ func (_i *articlesService) ArticleMonthlyStats(clientId *uuid.UUID, authToken st
return result, nil return result, nil
} }
func (_i *articlesService) UpdateApproval(clientId *uuid.UUID, id uint, statusId int, userLevelId int, userLevelNumber int, userParentLevelId int) (err error) { func (_i *articlesService) UpdateApproval(authToken string, id uint, statusId int, userLevelId int, userLevelNumber int, userParentLevelId int) (err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
result, err := _i.Repo.FindOne(clientId, id) result, err := _i.Repo.FindOne(clientId, id)
if err != nil { if err != nil {
return err return err
@ -658,7 +782,17 @@ func (_i *articlesService) UpdateApproval(clientId *uuid.UUID, id uint, statusId
return return
} }
func (_i *articlesService) PublishScheduling(clientId *uuid.UUID, id uint, publishSchedule string) error { func (_i *articlesService) PublishScheduling(authToken string, id uint, publishSchedule string) error {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
result, err := _i.Repo.FindOne(clientId, id) result, err := _i.Repo.FindOne(clientId, id)
if err != nil { if err != nil {
return err return err
@ -667,7 +801,17 @@ func (_i *articlesService) PublishScheduling(clientId *uuid.UUID, id uint, publi
return _i.Repo.Update(clientId, id, result) return _i.Repo.Update(clientId, id, result)
} }
func (_i *articlesService) UpdateBanner(clientId *uuid.UUID, id uint, isBanner bool) error { func (_i *articlesService) UpdateBanner(authToken string, id uint, isBanner bool) error {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
result, err := _i.Repo.FindOne(clientId, id) result, err := _i.Repo.FindOne(clientId, id)
if err != nil { if err != nil {
return err return err
@ -732,7 +876,17 @@ func getFileExtension(filename string) string {
} }
// SubmitForApproval submits an article for approval using the dynamic workflow system // SubmitForApproval submits an article for approval using the dynamic workflow system
func (_i *articlesService) SubmitForApproval(clientId *uuid.UUID, articleId uint, authToken string, workflowId *uint) error { func (_i *articlesService) SubmitForApproval(authToken string, articleId uint, workflowId *uint) error {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
// Extract user info from auth token // Extract user info from auth token
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken) user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user == nil { if user == nil {
@ -793,7 +947,17 @@ func (_i *articlesService) SubmitForApproval(clientId *uuid.UUID, articleId uint
} }
// GetApprovalStatus gets the current approval status of an article // GetApprovalStatus gets the current approval status of an article
func (_i *articlesService) GetApprovalStatus(clientId *uuid.UUID, articleId uint) (*response.ArticleApprovalStatusResponse, error) { func (_i *articlesService) GetApprovalStatus(authToken string, articleId uint) (*response.ArticleApprovalStatusResponse, error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
// Check if article exists // Check if article exists
_, err := _i.Repo.FindOne(clientId, articleId) _, err := _i.Repo.FindOne(clientId, articleId)
if err != nil { if err != nil {
@ -872,7 +1036,17 @@ func (_i *articlesService) GetApprovalStatus(clientId *uuid.UUID, articleId uint
} }
// GetPendingApprovals gets articles pending approval for a specific user level // GetPendingApprovals gets articles pending approval for a specific user level
func (_i *articlesService) GetPendingApprovals(clientId *uuid.UUID, authToken string, page, limit int, typeId *int) ([]*response.ArticleApprovalQueueResponse, paginator.Pagination, error) { func (_i *articlesService) GetPendingApprovals(authToken string, page, limit int, typeId *int) ([]*response.ArticleApprovalQueueResponse, paginator.Pagination, error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
// Extract user info from auth token // Extract user info from auth token
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken) user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user == nil { if user == nil {
@ -966,7 +1140,17 @@ func (_i *articlesService) GetPendingApprovals(clientId *uuid.UUID, authToken st
} }
// GetArticlesWaitingForApproval gets articles that are waiting for approval by a specific user level // GetArticlesWaitingForApproval gets articles that are waiting for approval by a specific user level
func (_i *articlesService) GetArticlesWaitingForApproval(clientId *uuid.UUID, authToken string, page, limit int) ([]*response.ArticleApprovalQueueResponse, paginator.Pagination, error) { func (_i *articlesService) GetArticlesWaitingForApproval(authToken string, page, limit int) ([]*response.ArticleApprovalQueueResponse, paginator.Pagination, error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
// Extract user info from auth token // Extract user info from auth token
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken) user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user == nil { if user == nil {
@ -1006,7 +1190,17 @@ func (_i *articlesService) GetArticlesWaitingForApproval(clientId *uuid.UUID, au
} }
// CheckApprovalRequired checks if an article requires approval based on client settings // CheckApprovalRequired checks if an article requires approval based on client settings
func (_i *articlesService) CheckApprovalRequired(clientId *uuid.UUID, articleId uint, userId uint, userLevelId uint) (bool, error) { func (_i *articlesService) CheckApprovalRequired(authToken string, articleId uint, userId uint, userLevelId uint) (bool, error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
// Get article to check category and other properties // Get article to check category and other properties
article, err := _i.Repo.FindOne(clientId, articleId) article, err := _i.Repo.FindOne(clientId, articleId)
if err != nil { if err != nil {
@ -1045,7 +1239,17 @@ func (_i *articlesService) CheckApprovalRequired(clientId *uuid.UUID, articleId
} }
// AutoApproveArticle automatically approves an article (for no-approval scenarios) // AutoApproveArticle automatically approves an article (for no-approval scenarios)
func (_i *articlesService) AutoApproveArticle(clientId *uuid.UUID, articleId uint, reason string) error { func (_i *articlesService) AutoApproveArticle(authToken string, articleId uint, reason string) error {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
article, err := _i.Repo.FindOne(clientId, articleId) article, err := _i.Repo.FindOne(clientId, articleId)
if err != nil { if err != nil {
return err return err
@ -1104,7 +1308,17 @@ func (_i *articlesService) AutoApproveArticle(clientId *uuid.UUID, articleId uin
} }
// GetClientApprovalSettings gets the approval settings for a client // GetClientApprovalSettings gets the approval settings for a client
func (_i *articlesService) GetClientApprovalSettings(clientId *uuid.UUID) (*response.ClientApprovalSettingsResponse, error) { func (_i *articlesService) GetClientApprovalSettings(authToken string) (*response.ClientApprovalSettingsResponse, error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
// This would require the ClientApprovalSettingsService // This would require the ClientApprovalSettingsService
// For now, return default settings // For now, return default settings
return &response.ClientApprovalSettingsResponse{ return &response.ClientApprovalSettingsResponse{
@ -1116,7 +1330,17 @@ func (_i *articlesService) GetClientApprovalSettings(clientId *uuid.UUID) (*resp
} }
// SetArticleApprovalExempt sets whether an article is exempt from approval // SetArticleApprovalExempt sets whether an article is exempt from approval
func (_i *articlesService) SetArticleApprovalExempt(clientId *uuid.UUID, articleId uint, exempt bool, reason string) error { func (_i *articlesService) SetArticleApprovalExempt(authToken string, articleId uint, exempt bool, reason string) error {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
updates := map[string]interface{}{ updates := map[string]interface{}{
"approval_exempt": &exempt, "approval_exempt": &exempt,
} }

View File

@ -1,7 +1,6 @@
package controller package controller
import ( import (
"netidhub-saas-be/app/middleware"
"netidhub-saas-be/app/module/bookmarks/request" "netidhub-saas-be/app/module/bookmarks/request"
"netidhub-saas-be/app/module/bookmarks/service" "netidhub-saas-be/app/module/bookmarks/service"
"netidhub-saas-be/utils/paginator" "netidhub-saas-be/utils/paginator"
@ -41,7 +40,7 @@ func NewBookmarksController(bookmarksService service.BookmarksService, log zerol
// @Description API for getting all Bookmarks // @Description API for getting all Bookmarks
// @Tags Bookmarks // @Tags Bookmarks
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>) // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param req query request.BookmarksQueryRequest false "query parameters" // @Param req query request.BookmarksQueryRequest false "query parameters"
// @Param req query paginator.Pagination false "pagination parameters" // @Param req query paginator.Pagination false "pagination parameters"
@ -62,15 +61,11 @@ func (_i *bookmarksController) All(c *fiber.Ctx) error {
req := reqContext.ToParamRequest() req := reqContext.ToParamRequest()
req.Pagination = paginate req.Pagination = paginate
// Get ClientId from context
clientId := middleware.GetClientID(c)
_i.Log.Info().Interface("clientId", clientId).Msg("")
// Get Authorization token from header // Get Authorization token from header
authToken := c.Get("Authorization") authToken := c.Get("Authorization")
_i.Log.Info().Str("authToken", authToken).Msg("")
bookmarksData, paging, err := _i.bookmarksService.All(clientId, authToken, req) bookmarksData, paging, err := _i.bookmarksService.All(authToken, req)
if err != nil { if err != nil {
return err return err
} }
@ -88,7 +83,7 @@ func (_i *bookmarksController) All(c *fiber.Ctx) error {
// @Description API for getting Bookmark by ID // @Description API for getting Bookmark by ID
// @Tags Bookmarks // @Tags Bookmarks
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>) // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param id path int true "Bookmark ID" // @Param id path int true "Bookmark ID"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
@ -105,12 +100,11 @@ func (_i *bookmarksController) Show(c *fiber.Ctx) error {
}) })
} }
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
_i.Log.Info().Str("authToken", authToken).Msg("")
_i.Log.Info().Interface("clientId", clientId).Msg("") bookmarkData, err := _i.bookmarksService.Show(authToken, uint(id))
bookmarkData, err := _i.bookmarksService.Show(clientId, uint(id))
if err != nil { if err != nil {
return err return err
} }
@ -127,7 +121,7 @@ func (_i *bookmarksController) Show(c *fiber.Ctx) error {
// @Description API for creating new Bookmark // @Description API for creating new Bookmark
// @Tags Bookmarks // @Tags Bookmarks
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>) // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param req body request.BookmarksCreateRequest true "Bookmark data" // @Param req body request.BookmarksCreateRequest true "Bookmark data"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
@ -153,15 +147,11 @@ func (_i *bookmarksController) Save(c *fiber.Ctx) error {
}) })
} }
// Get ClientId from context
clientId := middleware.GetClientID(c)
// Get Authorization token from header // Get Authorization token from header
authToken := c.Get("Authorization") authToken := c.Get("Authorization")
_i.Log.Info().Interface("clientId", clientId).Msg("")
_i.Log.Info().Str("authToken", authToken).Msg("") _i.Log.Info().Str("authToken", authToken).Msg("")
bookmarkData, err := _i.bookmarksService.Save(clientId, req, authToken) bookmarkData, err := _i.bookmarksService.Save(authToken, req)
if err != nil { if err != nil {
return err return err
} }
@ -178,7 +168,7 @@ func (_i *bookmarksController) Save(c *fiber.Ctx) error {
// @Description API for deleting Bookmark // @Description API for deleting Bookmark
// @Tags Bookmarks // @Tags Bookmarks
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>) // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param id path int true "Bookmark ID" // @Param id path int true "Bookmark ID"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
@ -195,12 +185,11 @@ func (_i *bookmarksController) Delete(c *fiber.Ctx) error {
}) })
} }
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
_i.Log.Info().Str("authToken", authToken).Msg("")
_i.Log.Info().Interface("clientId", clientId).Msg("") err = _i.bookmarksService.Delete(authToken, uint(id))
err = _i.bookmarksService.Delete(clientId, uint(id))
if err != nil { if err != nil {
return err return err
} }
@ -216,7 +205,7 @@ func (_i *bookmarksController) Delete(c *fiber.Ctx) error {
// @Description API for getting Bookmarks by User ID // @Description API for getting Bookmarks by User ID
// @Tags Bookmarks // @Tags Bookmarks
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>) // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param req query request.BookmarksQueryRequest false "query parameters" // @Param req query request.BookmarksQueryRequest false "query parameters"
// @Param req query paginator.Pagination false "pagination parameters" // @Param req query paginator.Pagination false "pagination parameters"
@ -237,15 +226,11 @@ func (_i *bookmarksController) GetByUserId(c *fiber.Ctx) error {
req := reqContext.ToParamRequest() req := reqContext.ToParamRequest()
req.Pagination = paginate req.Pagination = paginate
// Get ClientId from context
clientId := middleware.GetClientID(c)
// Get Authorization token from header // Get Authorization token from header
authToken := c.Get("Authorization") authToken := c.Get("Authorization")
_i.Log.Info().Interface("clientId", clientId).Msg("")
_i.Log.Info().Str("authToken", authToken).Msg("") _i.Log.Info().Str("authToken", authToken).Msg("")
bookmarksData, paging, err := _i.bookmarksService.GetByUserId(clientId, authToken, req) bookmarksData, paging, err := _i.bookmarksService.GetByUserId(authToken, req)
if err != nil { if err != nil {
return err return err
} }
@ -263,7 +248,7 @@ func (_i *bookmarksController) GetByUserId(c *fiber.Ctx) error {
// @Description API for toggling bookmark status for an article // @Description API for toggling bookmark status for an article
// @Tags Bookmarks // @Tags Bookmarks
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>) // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param articleId path int true "Article ID" // @Param articleId path int true "Article ID"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
@ -280,15 +265,11 @@ func (_i *bookmarksController) ToggleBookmark(c *fiber.Ctx) error {
}) })
} }
// Get ClientId from context
clientId := middleware.GetClientID(c)
// Get Authorization token from header // Get Authorization token from header
authToken := c.Get("Authorization") authToken := c.Get("Authorization")
_i.Log.Info().Interface("clientId", clientId).Msg("")
_i.Log.Info().Str("authToken", authToken).Msg("") _i.Log.Info().Str("authToken", authToken).Msg("")
isBookmarked, err := _i.bookmarksService.ToggleBookmark(clientId, authToken, uint(articleId)) isBookmarked, err := _i.bookmarksService.ToggleBookmark(authToken, uint(articleId))
if err != nil { if err != nil {
return err return err
} }
@ -313,7 +294,7 @@ func (_i *bookmarksController) ToggleBookmark(c *fiber.Ctx) error {
// @Description API for getting bookmark summary including total count and recent bookmarks // @Description API for getting bookmark summary including total count and recent bookmarks
// @Tags Bookmarks // @Tags Bookmarks
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>) // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
@ -321,15 +302,11 @@ func (_i *bookmarksController) ToggleBookmark(c *fiber.Ctx) error {
// @Failure 500 {object} response.InternalServerError // @Failure 500 {object} response.InternalServerError
// @Router /bookmarks/summary [get] // @Router /bookmarks/summary [get]
func (_i *bookmarksController) GetBookmarkSummary(c *fiber.Ctx) error { func (_i *bookmarksController) GetBookmarkSummary(c *fiber.Ctx) error {
// Get ClientId from context
clientId := middleware.GetClientID(c)
// Get Authorization token from header // Get Authorization token from header
authToken := c.Get("Authorization") authToken := c.Get("Authorization")
_i.Log.Info().Interface("clientId", clientId).Msg("")
_i.Log.Info().Str("authToken", authToken).Msg("") _i.Log.Info().Str("authToken", authToken).Msg("")
summaryData, err := _i.bookmarksService.GetBookmarkSummary(clientId, authToken) summaryData, err := _i.bookmarksService.GetBookmarkSummary(authToken)
if err != nil { if err != nil {
return err return err
} }

View File

@ -26,13 +26,13 @@ type bookmarksService struct {
// BookmarksService define interface of IBookmarksService // BookmarksService define interface of IBookmarksService
type BookmarksService interface { type BookmarksService interface {
All(clientId *uuid.UUID, authToken string, req request.BookmarksQueryRequest) (bookmarks []*response.BookmarksResponse, paging paginator.Pagination, err error) All(authToken string, req request.BookmarksQueryRequest) (bookmarks []*response.BookmarksResponse, paging paginator.Pagination, err error)
Show(clientId *uuid.UUID, id uint) (bookmark *response.BookmarksResponse, err error) Show(authToken string, id uint) (bookmark *response.BookmarksResponse, err error)
Save(clientId *uuid.UUID, req request.BookmarksCreateRequest, authToken string) (bookmark *entity.Bookmarks, err error) Save(authToken string, req request.BookmarksCreateRequest) (bookmark *entity.Bookmarks, err error)
Delete(clientId *uuid.UUID, id uint) error Delete(authToken string, id uint) error
GetByUserId(clientId *uuid.UUID, authToken string, req request.BookmarksQueryRequest) (bookmarks []*response.BookmarksResponse, paging paginator.Pagination, err error) GetByUserId(authToken string, req request.BookmarksQueryRequest) (bookmarks []*response.BookmarksResponse, paging paginator.Pagination, err error)
ToggleBookmark(clientId *uuid.UUID, authToken string, articleId uint) (isBookmarked bool, err error) ToggleBookmark(authToken string, articleId uint) (isBookmarked bool, err error)
GetBookmarkSummary(clientId *uuid.UUID, authToken string) (summary *response.BookmarksSummaryResponse, err error) GetBookmarkSummary(authToken string) (summary *response.BookmarksSummaryResponse, err error)
} }
// NewBookmarksService init BookmarksService // NewBookmarksService init BookmarksService
@ -51,7 +51,17 @@ func NewBookmarksService(
} }
// implement interface of IBookmarksService // implement interface of IBookmarksService
func (_i *bookmarksService) All(clientId *uuid.UUID, authToken string, req request.BookmarksQueryRequest) (bookmarks []*response.BookmarksResponse, paging paginator.Pagination, err error) { func (_i *bookmarksService) All(authToken string, req request.BookmarksQueryRequest) (bookmarks []*response.BookmarksResponse, paging paginator.Pagination, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken) user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user == nil { if user == nil {
_i.Log.Error().Msg("User not found from auth token") _i.Log.Error().Msg("User not found from auth token")
@ -74,7 +84,17 @@ func (_i *bookmarksService) All(clientId *uuid.UUID, authToken string, req reque
return bookmarks, paging, nil return bookmarks, paging, nil
} }
func (_i *bookmarksService) Show(clientId *uuid.UUID, id uint) (bookmark *response.BookmarksResponse, err error) { func (_i *bookmarksService) Show(authToken string, id uint) (bookmark *response.BookmarksResponse, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
bookmarkEntity, err := _i.Repo.FindOne(clientId, id) bookmarkEntity, err := _i.Repo.FindOne(clientId, id)
if err != nil { if err != nil {
_i.Log.Error().Err(err).Msg("Failed to show bookmark") _i.Log.Error().Err(err).Msg("Failed to show bookmark")
@ -85,7 +105,17 @@ func (_i *bookmarksService) Show(clientId *uuid.UUID, id uint) (bookmark *respon
return bookmark, nil return bookmark, nil
} }
func (_i *bookmarksService) Save(clientId *uuid.UUID, req request.BookmarksCreateRequest, authToken string) (bookmark *entity.Bookmarks, err error) { func (_i *bookmarksService) Save(authToken string, req request.BookmarksCreateRequest) (bookmark *entity.Bookmarks, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
// Extract user info from auth token // Extract user info from auth token
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken) user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user == nil { if user == nil {
@ -118,7 +148,17 @@ func (_i *bookmarksService) Save(clientId *uuid.UUID, req request.BookmarksCreat
return bookmark, nil return bookmark, nil
} }
func (_i *bookmarksService) Delete(clientId *uuid.UUID, id uint) error { func (_i *bookmarksService) Delete(authToken string, id uint) error {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
err := _i.Repo.Delete(clientId, id) err := _i.Repo.Delete(clientId, id)
if err != nil { if err != nil {
_i.Log.Error().Err(err).Msg("Failed to delete bookmark") _i.Log.Error().Err(err).Msg("Failed to delete bookmark")
@ -128,7 +168,17 @@ func (_i *bookmarksService) Delete(clientId *uuid.UUID, id uint) error {
return nil return nil
} }
func (_i *bookmarksService) GetByUserId(clientId *uuid.UUID, authToken string, req request.BookmarksQueryRequest) (bookmarks []*response.BookmarksResponse, paging paginator.Pagination, err error) { func (_i *bookmarksService) GetByUserId(authToken string, req request.BookmarksQueryRequest) (bookmarks []*response.BookmarksResponse, paging paginator.Pagination, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
// Extract user info from auth token // Extract user info from auth token
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken) user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user == nil { if user == nil {
@ -151,7 +201,17 @@ func (_i *bookmarksService) GetByUserId(clientId *uuid.UUID, authToken string, r
return bookmarks, paging, nil return bookmarks, paging, nil
} }
func (_i *bookmarksService) ToggleBookmark(clientId *uuid.UUID, authToken string, articleId uint) (isBookmarked bool, err error) { func (_i *bookmarksService) ToggleBookmark(authToken string, articleId uint) (isBookmarked bool, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
// Extract user info from auth token // Extract user info from auth token
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken) user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user == nil { if user == nil {
@ -194,7 +254,17 @@ func (_i *bookmarksService) ToggleBookmark(clientId *uuid.UUID, authToken string
return true, nil // Bookmark added return true, nil // Bookmark added
} }
func (_i *bookmarksService) GetBookmarkSummary(clientId *uuid.UUID, authToken string) (summary *response.BookmarksSummaryResponse, err error) { func (_i *bookmarksService) GetBookmarkSummary(authToken string) (summary *response.BookmarksSummaryResponse, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
// Extract user info from auth token // Extract user info from auth token
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken) user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user == nil { if user == nil {

View File

@ -2,7 +2,6 @@ package controller
import ( import (
"fmt" "fmt"
"netidhub-saas-be/app/middleware"
"netidhub-saas-be/app/module/client_approval_settings/request" "netidhub-saas-be/app/module/client_approval_settings/request"
"netidhub-saas-be/app/module/client_approval_settings/service" "netidhub-saas-be/app/module/client_approval_settings/service"
utilRes "netidhub-saas-be/utils/response" utilRes "netidhub-saas-be/utils/response"
@ -47,7 +46,7 @@ func NewClientApprovalSettingsController(
// @Description API for creating client approval settings // @Description API for creating client approval settings
// @Tags ClientApprovalSettings // @Tags ClientApprovalSettings
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Param payload body request.CreateClientApprovalSettingsRequest true "Required payload" // @Param payload body request.CreateClientApprovalSettingsRequest true "Required payload"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
@ -60,10 +59,10 @@ func (_i *clientApprovalSettingsController) CreateSettings(c *fiber.Ctx) error {
return err return err
} }
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
settings, err := _i.clientApprovalSettingsService.Create(clientId, *req) settings, err := _i.clientApprovalSettingsService.Create(authToken, *req)
if err != nil { if err != nil {
return err return err
} }
@ -80,17 +79,17 @@ func (_i *clientApprovalSettingsController) CreateSettings(c *fiber.Ctx) error {
// @Description API for getting client approval settings // @Description API for getting client approval settings
// @Tags ClientApprovalSettings // @Tags ClientApprovalSettings
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
// @Failure 401 {object} response.UnauthorizedError // @Failure 401 {object} response.UnauthorizedError
// @Failure 500 {object} response.InternalServerError // @Failure 500 {object} response.InternalServerError
// @Router /client-approval-settings [get] // @Router /client-approval-settings [get]
func (_i *clientApprovalSettingsController) GetSettings(c *fiber.Ctx) error { func (_i *clientApprovalSettingsController) GetSettings(c *fiber.Ctx) error {
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
settings, err := _i.clientApprovalSettingsService.GetByClientId(clientId) settings, err := _i.clientApprovalSettingsService.GetByClientId(authToken)
if err != nil { if err != nil {
return err return err
} }
@ -107,7 +106,7 @@ func (_i *clientApprovalSettingsController) GetSettings(c *fiber.Ctx) error {
// @Description API for updating client approval settings // @Description API for updating client approval settings
// @Tags ClientApprovalSettings // @Tags ClientApprovalSettings
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Param payload body request.UpdateClientApprovalSettingsRequest true "Required payload" // @Param payload body request.UpdateClientApprovalSettingsRequest true "Required payload"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
@ -120,10 +119,10 @@ func (_i *clientApprovalSettingsController) UpdateSettings(c *fiber.Ctx) error {
return err return err
} }
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
settings, err := _i.clientApprovalSettingsService.Update(clientId, *req) settings, err := _i.clientApprovalSettingsService.Update(authToken, *req)
if err != nil { if err != nil {
return err return err
} }
@ -140,17 +139,17 @@ func (_i *clientApprovalSettingsController) UpdateSettings(c *fiber.Ctx) error {
// @Description API for deleting client approval settings // @Description API for deleting client approval settings
// @Tags ClientApprovalSettings // @Tags ClientApprovalSettings
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
// @Failure 401 {object} response.UnauthorizedError // @Failure 401 {object} response.UnauthorizedError
// @Failure 500 {object} response.InternalServerError // @Failure 500 {object} response.InternalServerError
// @Router /client-approval-settings [delete] // @Router /client-approval-settings [delete]
func (_i *clientApprovalSettingsController) DeleteSettings(c *fiber.Ctx) error { func (_i *clientApprovalSettingsController) DeleteSettings(c *fiber.Ctx) error {
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
err := _i.clientApprovalSettingsService.Delete(clientId) err := _i.clientApprovalSettingsService.Delete(authToken)
if err != nil { if err != nil {
return err return err
} }
@ -166,7 +165,7 @@ func (_i *clientApprovalSettingsController) DeleteSettings(c *fiber.Ctx) error {
// @Description API for toggling approval requirement on/off // @Description API for toggling approval requirement on/off
// @Tags ClientApprovalSettings // @Tags ClientApprovalSettings
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Param payload body request.ToggleApprovalRequest true "Required payload" // @Param payload body request.ToggleApprovalRequest true "Required payload"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
@ -179,10 +178,10 @@ func (_i *clientApprovalSettingsController) ToggleApproval(c *fiber.Ctx) error {
return err return err
} }
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
err := _i.clientApprovalSettingsService.ToggleApprovalRequirement(clientId, req.RequiresApproval) err := _i.clientApprovalSettingsService.ToggleApprovalRequirement(authToken, req.RequiresApproval)
if err != nil { if err != nil {
return err return err
} }
@ -203,7 +202,7 @@ func (_i *clientApprovalSettingsController) ToggleApproval(c *fiber.Ctx) error {
// @Description API for enabling approval system with smooth transition // @Description API for enabling approval system with smooth transition
// @Tags ClientApprovalSettings // @Tags ClientApprovalSettings
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Param payload body request.EnableApprovalRequest true "Required payload" // @Param payload body request.EnableApprovalRequest true "Required payload"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
@ -216,10 +215,10 @@ func (_i *clientApprovalSettingsController) EnableApproval(c *fiber.Ctx) error {
return err return err
} }
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
err := _i.clientApprovalSettingsService.EnableApprovalWithTransition(clientId, req.DefaultWorkflowId) err := _i.clientApprovalSettingsService.EnableApprovalWithTransition(authToken, req.DefaultWorkflowId)
if err != nil { if err != nil {
return err return err
} }
@ -235,7 +234,7 @@ func (_i *clientApprovalSettingsController) EnableApproval(c *fiber.Ctx) error {
// @Description API for disabling approval system and auto-publish pending articles // @Description API for disabling approval system and auto-publish pending articles
// @Tags ClientApprovalSettings // @Tags ClientApprovalSettings
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Param payload body request.DisableApprovalRequest true "Required payload" // @Param payload body request.DisableApprovalRequest true "Required payload"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
@ -248,10 +247,10 @@ func (_i *clientApprovalSettingsController) DisableApproval(c *fiber.Ctx) error
return err return err
} }
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
err := _i.clientApprovalSettingsService.DisableApprovalWithAutoPublish(clientId, req.Reason) err := _i.clientApprovalSettingsService.DisableApprovalWithAutoPublish(authToken, req.Reason)
if err != nil { if err != nil {
return err return err
} }
@ -267,7 +266,7 @@ func (_i *clientApprovalSettingsController) DisableApproval(c *fiber.Ctx) error
// @Description API for setting default workflow for client // @Description API for setting default workflow for client
// @Tags ClientApprovalSettings // @Tags ClientApprovalSettings
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Param payload body request.SetDefaultWorkflowRequest true "Required payload" // @Param payload body request.SetDefaultWorkflowRequest true "Required payload"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
@ -280,10 +279,10 @@ func (_i *clientApprovalSettingsController) SetDefaultWorkflow(c *fiber.Ctx) err
return err return err
} }
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
err := _i.clientApprovalSettingsService.SetDefaultWorkflow(clientId, req.WorkflowId) err := _i.clientApprovalSettingsService.SetDefaultWorkflow(authToken, req.WorkflowId)
if err != nil { if err != nil {
return err return err
} }
@ -299,7 +298,7 @@ func (_i *clientApprovalSettingsController) SetDefaultWorkflow(c *fiber.Ctx) err
// @Description API for adding/removing users from approval exemption // @Description API for adding/removing users from approval exemption
// @Tags ClientApprovalSettings // @Tags ClientApprovalSettings
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Param action path string true "Action: add or remove" // @Param action path string true "Action: add or remove"
// @Param user_id path int true "User ID" // @Param user_id path int true "User ID"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
@ -320,13 +319,13 @@ func (_i *clientApprovalSettingsController) ManageExemptUsers(c *fiber.Ctx) erro
return utilRes.ErrorBadRequest(c, "Invalid user ID format") return utilRes.ErrorBadRequest(c, "Invalid user ID format")
} }
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
if action == "add" { if action == "add" {
err = _i.clientApprovalSettingsService.AddExemptUser(clientId, uint(userId)) err = _i.clientApprovalSettingsService.AddExemptUser(authToken, uint(userId))
} else { } else {
err = _i.clientApprovalSettingsService.RemoveExemptUser(clientId, uint(userId)) err = _i.clientApprovalSettingsService.RemoveExemptUser(authToken, uint(userId))
} }
if err != nil { if err != nil {
@ -344,7 +343,7 @@ func (_i *clientApprovalSettingsController) ManageExemptUsers(c *fiber.Ctx) erro
// @Description API for adding/removing roles from approval exemption // @Description API for adding/removing roles from approval exemption
// @Tags ClientApprovalSettings // @Tags ClientApprovalSettings
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Param action path string true "Action: add or remove" // @Param action path string true "Action: add or remove"
// @Param role_id path int true "Role ID" // @Param role_id path int true "Role ID"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
@ -365,13 +364,13 @@ func (_i *clientApprovalSettingsController) ManageExemptRoles(c *fiber.Ctx) erro
return utilRes.ErrorBadRequest(c, "Invalid role ID format") return utilRes.ErrorBadRequest(c, "Invalid role ID format")
} }
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
if action == "add" { if action == "add" {
err = _i.clientApprovalSettingsService.AddExemptRole(clientId, uint(roleId)) err = _i.clientApprovalSettingsService.AddExemptRole(authToken, uint(roleId))
} else { } else {
err = _i.clientApprovalSettingsService.RemoveExemptRole(clientId, uint(roleId)) err = _i.clientApprovalSettingsService.RemoveExemptRole(authToken, uint(roleId))
} }
if err != nil { if err != nil {
@ -389,7 +388,7 @@ func (_i *clientApprovalSettingsController) ManageExemptRoles(c *fiber.Ctx) erro
// @Description API for adding/removing categories from approval exemption // @Description API for adding/removing categories from approval exemption
// @Tags ClientApprovalSettings // @Tags ClientApprovalSettings
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key" // @Param Authorization header string true "Insert the Authorization"
// @Param action path string true "Action: add or remove" // @Param action path string true "Action: add or remove"
// @Param category_id path int true "Category ID" // @Param category_id path int true "Category ID"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
@ -410,13 +409,13 @@ func (_i *clientApprovalSettingsController) ManageExemptCategories(c *fiber.Ctx)
return utilRes.ErrorBadRequest(c, "Invalid category ID format") return utilRes.ErrorBadRequest(c, "Invalid category ID format")
} }
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
if action == "add" { if action == "add" {
err = _i.clientApprovalSettingsService.AddExemptCategory(clientId, uint(categoryId)) err = _i.clientApprovalSettingsService.AddExemptCategory(authToken, uint(categoryId))
} else { } else {
err = _i.clientApprovalSettingsService.RemoveExemptCategory(clientId, uint(categoryId)) err = _i.clientApprovalSettingsService.RemoveExemptCategory(authToken, uint(categoryId))
} }
if err != nil { if err != nil {

View File

@ -7,6 +7,8 @@ import (
"netidhub-saas-be/app/module/client_approval_settings/repository" "netidhub-saas-be/app/module/client_approval_settings/repository"
"netidhub-saas-be/app/module/client_approval_settings/request" "netidhub-saas-be/app/module/client_approval_settings/request"
"netidhub-saas-be/app/module/client_approval_settings/response" "netidhub-saas-be/app/module/client_approval_settings/response"
usersRepository "netidhub-saas-be/app/module/users/repository"
utilSvc "netidhub-saas-be/utils/service"
"github.com/google/uuid" "github.com/google/uuid"
"github.com/rs/zerolog" "github.com/rs/zerolog"
@ -14,41 +16,58 @@ import (
type clientApprovalSettingsService struct { type clientApprovalSettingsService struct {
clientApprovalSettingsRepo repository.ClientApprovalSettingsRepository clientApprovalSettingsRepo repository.ClientApprovalSettingsRepository
UsersRepo usersRepository.UsersRepository
Log zerolog.Logger Log zerolog.Logger
} }
type ClientApprovalSettingsService interface { type ClientApprovalSettingsService interface {
GetByClientId(clientId *uuid.UUID) (*response.ClientApprovalSettingsResponse, error) GetByClientId(authToken string) (*response.ClientApprovalSettingsResponse, error)
Create(clientId *uuid.UUID, req request.CreateClientApprovalSettingsRequest) (*response.ClientApprovalSettingsResponse, error) Create(authToken string, req request.CreateClientApprovalSettingsRequest) (*response.ClientApprovalSettingsResponse, error)
Update(clientId *uuid.UUID, req request.UpdateClientApprovalSettingsRequest) (*response.ClientApprovalSettingsResponse, error) Update(authToken string, req request.UpdateClientApprovalSettingsRequest) (*response.ClientApprovalSettingsResponse, error)
Delete(clientId *uuid.UUID) error Delete(authToken string) error
ToggleApprovalRequirement(clientId *uuid.UUID, requiresApproval bool) error ToggleApprovalRequirement(authToken string, requiresApproval bool) error
SetDefaultWorkflow(clientId *uuid.UUID, workflowId *uint) error SetDefaultWorkflow(authToken string, workflowId *uint) error
AddExemptUser(clientId *uuid.UUID, userId uint) error AddExemptUser(authToken string, userId uint) error
RemoveExemptUser(clientId *uuid.UUID, userId uint) error RemoveExemptUser(authToken string, userId uint) error
AddExemptRole(clientId *uuid.UUID, roleId uint) error AddExemptRole(authToken string, roleId uint) error
RemoveExemptRole(clientId *uuid.UUID, roleId uint) error RemoveExemptRole(authToken string, roleId uint) error
AddExemptCategory(clientId *uuid.UUID, categoryId uint) error AddExemptCategory(authToken string, categoryId uint) error
RemoveExemptCategory(clientId *uuid.UUID, categoryId uint) error RemoveExemptCategory(authToken string, categoryId uint) error
CheckIfApprovalRequired(clientId *uuid.UUID, userId uint, userLevelId uint, categoryId uint, contentType string) (bool, error) CheckIfApprovalRequired(authToken string, userId uint, userLevelId uint, categoryId uint, contentType string) (bool, error)
// Enhanced methods for dynamic approval management // Enhanced methods for dynamic approval management
EnableApprovalWithTransition(clientId *uuid.UUID, defaultWorkflowId *uint) error EnableApprovalWithTransition(authToken string, defaultWorkflowId *uint) error
DisableApprovalWithAutoPublish(clientId *uuid.UUID, reason string) error DisableApprovalWithAutoPublish(authToken string, reason string) error
HandlePendingApprovalsOnDisable(clientId *uuid.UUID, action string) error // "auto_approve", "keep_pending", "reset_to_draft" HandlePendingApprovalsOnDisable(authToken string, action string) error // "auto_approve", "keep_pending", "reset_to_draft"
} }
func NewClientApprovalSettingsService( func NewClientApprovalSettingsService(
clientApprovalSettingsRepo repository.ClientApprovalSettingsRepository, clientApprovalSettingsRepo repository.ClientApprovalSettingsRepository,
usersRepo usersRepository.UsersRepository,
log zerolog.Logger, log zerolog.Logger,
) ClientApprovalSettingsService { ) ClientApprovalSettingsService {
return &clientApprovalSettingsService{ return &clientApprovalSettingsService{
clientApprovalSettingsRepo: clientApprovalSettingsRepo, clientApprovalSettingsRepo: clientApprovalSettingsRepo,
UsersRepo: usersRepo,
Log: log, Log: log,
} }
} }
func (_i *clientApprovalSettingsService) GetByClientId(clientId *uuid.UUID) (*response.ClientApprovalSettingsResponse, error) { func (_i *clientApprovalSettingsService) GetByClientId(authToken string) (*response.ClientApprovalSettingsResponse, error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return nil, fmt.Errorf("clientId not found in auth token")
}
settings, err := _i.clientApprovalSettingsRepo.FindByClientId(*clientId) settings, err := _i.clientApprovalSettingsRepo.FindByClientId(*clientId)
if err != nil { if err != nil {
return nil, err return nil, err
@ -72,7 +91,21 @@ func (_i *clientApprovalSettingsService) GetByClientId(clientId *uuid.UUID) (*re
return mapper.ClientApprovalSettingsResponseMapper(_i.Log, clientId, settings), nil return mapper.ClientApprovalSettingsResponseMapper(_i.Log, clientId, settings), nil
} }
func (_i *clientApprovalSettingsService) Create(clientId *uuid.UUID, req request.CreateClientApprovalSettingsRequest) (*response.ClientApprovalSettingsResponse, error) { func (_i *clientApprovalSettingsService) Create(authToken string, req request.CreateClientApprovalSettingsRequest) (*response.ClientApprovalSettingsResponse, error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return nil, fmt.Errorf("clientId not found in auth token")
}
// Check if settings already exist // Check if settings already exist
existing, err := _i.clientApprovalSettingsRepo.FindByClientId(*clientId) existing, err := _i.clientApprovalSettingsRepo.FindByClientId(*clientId)
if err != nil { if err != nil {
@ -104,7 +137,21 @@ func (_i *clientApprovalSettingsService) Create(clientId *uuid.UUID, req request
return mapper.ClientApprovalSettingsResponseMapper(_i.Log, clientId, createdSettings), nil return mapper.ClientApprovalSettingsResponseMapper(_i.Log, clientId, createdSettings), nil
} }
func (_i *clientApprovalSettingsService) Update(clientId *uuid.UUID, req request.UpdateClientApprovalSettingsRequest) (*response.ClientApprovalSettingsResponse, error) { func (_i *clientApprovalSettingsService) Update(authToken string, req request.UpdateClientApprovalSettingsRequest) (*response.ClientApprovalSettingsResponse, error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return nil, fmt.Errorf("clientId not found in auth token")
}
// Get existing settings // Get existing settings
settings, err := _i.clientApprovalSettingsRepo.FindByClientId(*clientId) settings, err := _i.clientApprovalSettingsRepo.FindByClientId(*clientId)
if err != nil { if err != nil {
@ -152,11 +199,39 @@ func (_i *clientApprovalSettingsService) Update(clientId *uuid.UUID, req request
return mapper.ClientApprovalSettingsResponseMapper(_i.Log, clientId, updatedSettings), nil return mapper.ClientApprovalSettingsResponseMapper(_i.Log, clientId, updatedSettings), nil
} }
func (_i *clientApprovalSettingsService) Delete(clientId *uuid.UUID) error { func (_i *clientApprovalSettingsService) Delete(authToken string) error {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return fmt.Errorf("clientId not found in auth token")
}
return _i.clientApprovalSettingsRepo.Delete(clientId) return _i.clientApprovalSettingsRepo.Delete(clientId)
} }
func (_i *clientApprovalSettingsService) ToggleApprovalRequirement(clientId *uuid.UUID, requiresApproval bool) error { func (_i *clientApprovalSettingsService) ToggleApprovalRequirement(authToken string, requiresApproval bool) error {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return fmt.Errorf("clientId not found in auth token")
}
settings, err := _i.clientApprovalSettingsRepo.FindByClientId(*clientId) settings, err := _i.clientApprovalSettingsRepo.FindByClientId(*clientId)
if err != nil { if err != nil {
return err return err
@ -171,7 +246,21 @@ func (_i *clientApprovalSettingsService) ToggleApprovalRequirement(clientId *uui
return err return err
} }
func (_i *clientApprovalSettingsService) SetDefaultWorkflow(clientId *uuid.UUID, workflowId *uint) error { func (_i *clientApprovalSettingsService) SetDefaultWorkflow(authToken string, workflowId *uint) error {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return fmt.Errorf("clientId not found in auth token")
}
settings, err := _i.clientApprovalSettingsRepo.FindByClientId(*clientId) settings, err := _i.clientApprovalSettingsRepo.FindByClientId(*clientId)
if err != nil { if err != nil {
return err return err
@ -186,31 +275,128 @@ func (_i *clientApprovalSettingsService) SetDefaultWorkflow(clientId *uuid.UUID,
return err return err
} }
func (_i *clientApprovalSettingsService) AddExemptUser(clientId *uuid.UUID, userId uint) error { func (_i *clientApprovalSettingsService) AddExemptUser(authToken string, userId uint) error {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return fmt.Errorf("clientId not found in auth token")
}
return _i.clientApprovalSettingsRepo.AddExemptUser(clientId, userId) return _i.clientApprovalSettingsRepo.AddExemptUser(clientId, userId)
} }
func (_i *clientApprovalSettingsService) RemoveExemptUser(clientId *uuid.UUID, userId uint) error { func (_i *clientApprovalSettingsService) RemoveExemptUser(authToken string, userId uint) error {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return fmt.Errorf("clientId not found in auth token")
}
return _i.clientApprovalSettingsRepo.RemoveExemptUser(clientId, userId) return _i.clientApprovalSettingsRepo.RemoveExemptUser(clientId, userId)
} }
func (_i *clientApprovalSettingsService) AddExemptRole(clientId *uuid.UUID, roleId uint) error { func (_i *clientApprovalSettingsService) AddExemptRole(authToken string, roleId uint) error {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return fmt.Errorf("clientId not found in auth token")
}
return _i.clientApprovalSettingsRepo.AddExemptRole(clientId, roleId) return _i.clientApprovalSettingsRepo.AddExemptRole(clientId, roleId)
} }
func (_i *clientApprovalSettingsService) RemoveExemptRole(clientId *uuid.UUID, roleId uint) error { func (_i *clientApprovalSettingsService) RemoveExemptRole(authToken string, roleId uint) error {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return fmt.Errorf("clientId not found in auth token")
}
return _i.clientApprovalSettingsRepo.RemoveExemptRole(clientId, roleId) return _i.clientApprovalSettingsRepo.RemoveExemptRole(clientId, roleId)
} }
func (_i *clientApprovalSettingsService) AddExemptCategory(clientId *uuid.UUID, categoryId uint) error { func (_i *clientApprovalSettingsService) AddExemptCategory(authToken string, categoryId uint) error {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return fmt.Errorf("clientId not found in auth token")
}
return _i.clientApprovalSettingsRepo.AddExemptCategory(clientId, categoryId) return _i.clientApprovalSettingsRepo.AddExemptCategory(clientId, categoryId)
} }
func (_i *clientApprovalSettingsService) RemoveExemptCategory(clientId *uuid.UUID, categoryId uint) error { func (_i *clientApprovalSettingsService) RemoveExemptCategory(authToken string, categoryId uint) error {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return fmt.Errorf("clientId not found in auth token")
}
return _i.clientApprovalSettingsRepo.RemoveExemptCategory(clientId, categoryId) return _i.clientApprovalSettingsRepo.RemoveExemptCategory(clientId, categoryId)
} }
func (_i *clientApprovalSettingsService) CheckIfApprovalRequired(clientId *uuid.UUID, userId uint, userLevelId uint, categoryId uint, contentType string) (bool, error) { func (_i *clientApprovalSettingsService) CheckIfApprovalRequired(authToken string, userId uint, userLevelId uint, categoryId uint, contentType string) (bool, error) {
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return true, fmt.Errorf("clientId not found in auth token")
}
settings, err := _i.clientApprovalSettingsRepo.FindActiveSettings(clientId) settings, err := _i.clientApprovalSettingsRepo.FindActiveSettings(clientId)
if err != nil { if err != nil {
return true, err // Default to requiring approval on error return true, err // Default to requiring approval on error
@ -264,7 +450,20 @@ func (_i *clientApprovalSettingsService) CheckIfApprovalRequired(clientId *uuid.
return true, nil return true, nil
} }
func (_i *clientApprovalSettingsService) EnableApprovalWithTransition(clientId *uuid.UUID, defaultWorkflowId *uint) error { func (_i *clientApprovalSettingsService) EnableApprovalWithTransition(authToken string, defaultWorkflowId *uint) error {
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return fmt.Errorf("clientId not found in auth token")
}
settings, err := _i.clientApprovalSettingsRepo.FindByClientId(*clientId) settings, err := _i.clientApprovalSettingsRepo.FindByClientId(*clientId)
if err != nil { if err != nil {
return err return err
@ -291,7 +490,20 @@ func (_i *clientApprovalSettingsService) EnableApprovalWithTransition(clientId *
return err return err
} }
func (_i *clientApprovalSettingsService) DisableApprovalWithAutoPublish(clientId *uuid.UUID, reason string) error { func (_i *clientApprovalSettingsService) DisableApprovalWithAutoPublish(authToken string, reason string) error {
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return fmt.Errorf("clientId not found in auth token")
}
settings, err := _i.clientApprovalSettingsRepo.FindByClientId(*clientId) settings, err := _i.clientApprovalSettingsRepo.FindByClientId(*clientId)
if err != nil { if err != nil {
return err return err
@ -309,11 +521,11 @@ func (_i *clientApprovalSettingsService) DisableApprovalWithAutoPublish(clientId
return err return err
} }
func (_i *clientApprovalSettingsService) HandlePendingApprovalsOnDisable(clientId *uuid.UUID, action string) error { func (_i *clientApprovalSettingsService) HandlePendingApprovalsOnDisable(authToken string, action string) error {
// This would typically interact with article approval flows // This would typically interact with article approval flows
// For now, just log the action // For now, just log the action
_i.Log.Info(). _i.Log.Info().
Str("client_id", clientId.String()). Str("client_id", authToken).
Str("action", action). Str("action", action).
Msg("Handling pending approvals on disable") Msg("Handling pending approvals on disable")

View File

@ -1,7 +1,6 @@
package controller package controller
import ( import (
"netidhub-saas-be/app/middleware"
"netidhub-saas-be/app/module/clients/request" "netidhub-saas-be/app/module/clients/request"
"netidhub-saas-be/app/module/clients/service" "netidhub-saas-be/app/module/clients/service"
"netidhub-saas-be/utils/paginator" "netidhub-saas-be/utils/paginator"
@ -47,7 +46,6 @@ func NewClientsController(clientsService service.ClientsService, log zerolog.Log
// @Description API for getting all Clients with hierarchy filtering // @Description API for getting all Clients with hierarchy filtering
// @Tags Clients // @Tags Clients
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Insert the X-Client-Key"
// @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>) // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param name query string false "Filter by client name" // @Param name query string false "Filter by client name"
// @Param clientType query string false "Filter by client type (parent_client, sub_client, standalone)" // @Param clientType query string false "Filter by client type (parent_client, sub_client, standalone)"
@ -86,11 +84,11 @@ func (_i *clientsController) All(c *fiber.Ctx) error {
req := reqContext.ToParamRequest() req := reqContext.ToParamRequest()
req.Pagination = paginate req.Pagination = paginate
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
_i.Log.Info().Interface("clientId", clientId).Msg("") _i.Log.Info().Str("authToken", authToken).Msg("")
clientsData, paging, err := _i.clientsService.All(clientId, req) clientsData, paging, err := _i.clientsService.All(authToken, req)
if err != nil { if err != nil {
return err return err
} }
@ -146,7 +144,7 @@ func (_i *clientsController) Show(c *fiber.Ctx) error {
// @Failure 500 {object} response.InternalServerError // @Failure 500 {object} response.InternalServerError
// @Router /clients [post] // @Router /clients [post]
func (_i *clientsController) Save(c *fiber.Ctx) error { func (_i *clientsController) Save(c *fiber.Ctx) error {
req := new(request.CreateClientRequest) req := new(request.ClientsCreateRequest)
if err := utilVal.ParseAndValidate(c, req); err != nil { if err := utilVal.ParseAndValidate(c, req); err != nil {
return err return err
} }
@ -183,7 +181,7 @@ func (_i *clientsController) Update(c *fiber.Ctx) error {
return err return err
} }
req := new(request.UpdateClientRequest) req := new(request.ClientsUpdateRequest)
if err := utilVal.ParseAndValidate(c, req); err != nil { if err := utilVal.ParseAndValidate(c, req); err != nil {
return err return err
} }
@ -293,7 +291,7 @@ func (_i *clientsController) GetSubClients(c *fiber.Ctx) error {
Pagination: &paginator.Pagination{Page: 1, Limit: 100}, Pagination: &paginator.Pagination{Page: 1, Limit: 100},
} }
subClients, _, err := _i.clientsService.All(nil, req) subClients, _, err := _i.clientsService.All("", req)
if err != nil { if err != nil {
return utilRes.Resp(c, utilRes.Response{ return utilRes.Resp(c, utilRes.Response{
Success: false, Success: false,
@ -314,7 +312,7 @@ func (_i *clientsController) GetSubClients(c *fiber.Ctx) error {
// @Tags Clients // @Tags Clients
// @Security Bearer // @Security Bearer
// @Param id path string true "Parent Client ID" // @Param id path string true "Parent Client ID"
// @Param payload body request.CreateClientRequest true "Required payload" // @Param payload body request.ClientsCreateRequest true "Required payload"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
// @Failure 401 {object} response.UnauthorizedError // @Failure 401 {object} response.UnauthorizedError
@ -329,7 +327,7 @@ func (_i *clientsController) CreateSubClient(c *fiber.Ctx) error {
}) })
} }
req := new(request.CreateClientRequest) req := new(request.ClientsCreateRequest)
if err := utilVal.ParseAndValidate(c, req); err != nil { if err := utilVal.ParseAndValidate(c, req); err != nil {
return err return err
} }

View File

@ -10,8 +10,8 @@ import (
// REQUEST STRUCTS - Updated for Multi-Client Hierarchy Support (camelCase) // REQUEST STRUCTS - Updated for Multi-Client Hierarchy Support (camelCase)
// ======================================================================== // ========================================================================
// CreateClientRequest for creating new client with hierarchy support // ClientsCreateRequest for creating new client with hierarchy support
type CreateClientRequest struct { type ClientsCreateRequest struct {
Name string `json:"name" validate:"required"` Name string `json:"name" validate:"required"`
Description *string `json:"description"` Description *string `json:"description"`
ClientType string `json:"clientType" validate:"required,oneof=parent_client sub_client standalone"` // Enum validation ClientType string `json:"clientType" validate:"required,oneof=parent_client sub_client standalone"` // Enum validation
@ -25,8 +25,8 @@ type CreateClientRequest struct {
Settings *string `json:"settings"` Settings *string `json:"settings"`
} }
// UpdateClientRequest for updating existing client // ClientsUpdateRequest for updating existing client
type UpdateClientRequest struct { type ClientsUpdateRequest struct {
Name *string `json:"name"` Name *string `json:"name"`
Description *string `json:"description"` Description *string `json:"description"`
ClientType *string `json:"clientType" validate:"omitempty,oneof=parent_client sub_client standalone"` ClientType *string `json:"clientType" validate:"omitempty,oneof=parent_client sub_client standalone"`
@ -68,10 +68,10 @@ type MoveClientRequest struct {
// BulkCreateSubClientsRequest for creating multiple sub-clients at once // BulkCreateSubClientsRequest for creating multiple sub-clients at once
type BulkCreateSubClientsRequest struct { type BulkCreateSubClientsRequest struct {
ParentClientId uuid.UUID `json:"parentClientId" validate:"required"` ParentClientId uuid.UUID `json:"parentClientId" validate:"required"`
SubClients []CreateSubClientDetail `json:"subClients" validate:"required,min=1,dive"` SubClients []ClientsCreateSubClientDetail `json:"subClients" validate:"required,min=1,dive"`
} }
type CreateSubClientDetail struct { type ClientsCreateSubClientDetail struct {
Name string `json:"name" validate:"required"` Name string `json:"name" validate:"required"`
Description *string `json:"description"` Description *string `json:"description"`
MaxUsers *int `json:"maxUsers"` MaxUsers *int `json:"maxUsers"`

View File

@ -25,14 +25,14 @@ type clientsService struct {
// ClientsService define interface of IClientsService // ClientsService define interface of IClientsService
type ClientsService interface { type ClientsService interface {
All(clientId *uuid.UUID, req request.ClientsQueryRequest) (clients []*response.ClientsResponse, paging paginator.Pagination, err error) All(authToken string, req request.ClientsQueryRequest) (clients []*response.ClientsResponse, paging paginator.Pagination, err error)
Show(id uuid.UUID) (clients *response.ClientsResponse, err error) Show(id uuid.UUID) (clients *response.ClientsResponse, err error)
Save(req request.CreateClientRequest, authToken string) (clients *entity.Clients, err error) Save(req request.ClientsCreateRequest, authToken string) (clients *entity.Clients, err error)
Update(id uuid.UUID, req request.UpdateClientRequest) (err error) Update(id uuid.UUID, req request.ClientsUpdateRequest) (err error)
Delete(id uuid.UUID) error Delete(id uuid.UUID) error
// New hierarchy methods // New hierarchy methods
CreateSubClient(parentId uuid.UUID, req request.CreateClientRequest) (*entity.Clients, error) CreateSubClient(parentId uuid.UUID, req request.ClientsCreateRequest) (*entity.Clients, error)
MoveClient(clientId uuid.UUID, req request.MoveClientRequest) error MoveClient(clientId uuid.UUID, req request.MoveClientRequest) error
GetHierarchy(clientId uuid.UUID) (*response.ClientHierarchyResponse, error) GetHierarchy(clientId uuid.UUID) (*response.ClientHierarchyResponse, error)
GetClientStats(clientId uuid.UUID) (*response.ClientStatsResponse, error) GetClientStats(clientId uuid.UUID) (*response.ClientStatsResponse, error)
@ -50,7 +50,17 @@ func NewClientsService(repo repository.ClientsRepository, log zerolog.Logger, us
} }
// All implement interface of ClientsService // All implement interface of ClientsService
func (_i *clientsService) All(clientId *uuid.UUID, req request.ClientsQueryRequest) (clientss []*response.ClientsResponse, paging paginator.Pagination, err error) { func (_i *clientsService) All(authToken string, req request.ClientsQueryRequest) (clientss []*response.ClientsResponse, paging paginator.Pagination, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
results, paging, err := _i.Repo.GetAll(req) results, paging, err := _i.Repo.GetAll(req)
if err != nil { if err != nil {
return return
@ -72,7 +82,7 @@ func (_i *clientsService) Show(id uuid.UUID) (clients *response.ClientsResponse,
return mapper.ClientsResponseMapper(result), nil return mapper.ClientsResponseMapper(result), nil
} }
func (_i *clientsService) Save(req request.CreateClientRequest, authToken string) (clients *entity.Clients, err error) { func (_i *clientsService) Save(req request.ClientsCreateRequest, authToken string) (clients *entity.Clients, err error) {
_i.Log.Info().Interface("data", req).Msg("") _i.Log.Info().Interface("data", req).Msg("")
// Convert request to entity // Convert request to entity
@ -98,7 +108,7 @@ func (_i *clientsService) Save(req request.CreateClientRequest, authToken string
return _i.Repo.Create(newReq) return _i.Repo.Create(newReq)
} }
func (_i *clientsService) Update(id uuid.UUID, req request.UpdateClientRequest) (err error) { func (_i *clientsService) Update(id uuid.UUID, req request.ClientsUpdateRequest) (err error) {
_i.Log.Info().Interface("data", req).Msg("") _i.Log.Info().Interface("data", req).Msg("")
// Convert request to entity // Convert request to entity
@ -132,7 +142,7 @@ func (_i *clientsService) Delete(id uuid.UUID) error {
// ===================================================================== // =====================================================================
// CreateSubClient creates a client under a parent // CreateSubClient creates a client under a parent
func (_i *clientsService) CreateSubClient(parentId uuid.UUID, req request.CreateClientRequest) (*entity.Clients, error) { func (_i *clientsService) CreateSubClient(parentId uuid.UUID, req request.ClientsCreateRequest) (*entity.Clients, error) {
// Validate parent exists // Validate parent exists
_, err := _i.Repo.FindOne(parentId) _, err := _i.Repo.FindOne(parentId)
if err != nil { if err != nil {
@ -253,7 +263,7 @@ func (_i *clientsService) BulkCreateSubClients(req request.BulkCreateSubClientsR
failed := 0 failed := 0
for i, subClientReq := range req.SubClients { for i, subClientReq := range req.SubClients {
createReq := request.CreateClientRequest{ createReq := request.ClientsCreateRequest{
Name: subClientReq.Name, Name: subClientReq.Name,
Description: subClientReq.Description, Description: subClientReq.Description,
ClientType: "sub_client", ClientType: "sub_client",

View File

@ -1,7 +1,6 @@
package controller package controller
import ( import (
"netidhub-saas-be/app/middleware"
"netidhub-saas-be/app/module/user_levels/request" "netidhub-saas-be/app/module/user_levels/request"
"netidhub-saas-be/app/module/user_levels/service" "netidhub-saas-be/app/module/user_levels/service"
"netidhub-saas-be/utils/paginator" "netidhub-saas-be/utils/paginator"
@ -39,7 +38,7 @@ func NewUserLevelsController(userLevelsService service.UserLevelsService) UserLe
// @Description API for getting all UserLevels // @Description API for getting all UserLevels
// @Tags UserLevels // @Tags UserLevels
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Client Key" // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param req query request.UserLevelsQueryRequest false "query parameters" // @Param req query request.UserLevelsQueryRequest false "query parameters"
// @Param req query paginator.Pagination false "pagination parameters" // @Param req query paginator.Pagination false "pagination parameters"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
@ -62,10 +61,10 @@ func (_i *userLevelsController) All(c *fiber.Ctx) error {
req := reqContext.ToParamRequest() req := reqContext.ToParamRequest()
req.Pagination = paginate req.Pagination = paginate
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
userLevelsData, paging, err := _i.userLevelsService.All(clientId, req) userLevelsData, paging, err := _i.userLevelsService.All(authToken, req)
if err != nil { if err != nil {
return err return err
} }
@ -83,7 +82,7 @@ func (_i *userLevelsController) All(c *fiber.Ctx) error {
// @Description API for getting one UserLevels // @Description API for getting one UserLevels
// @Tags UserLevels // @Tags UserLevels
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Client Key" // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param id path int true "UserLevels ID" // @Param id path int true "UserLevels ID"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
@ -96,10 +95,10 @@ func (_i *userLevelsController) Show(c *fiber.Ctx) error {
return err return err
} }
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
userLevelsData, err := _i.userLevelsService.Show(clientId, uint(id)) userLevelsData, err := _i.userLevelsService.Show(authToken, uint(id))
if err != nil { if err != nil {
return err return err
} }
@ -115,7 +114,7 @@ func (_i *userLevelsController) Show(c *fiber.Ctx) error {
// @Description API for getting one UserLevels // @Description API for getting one UserLevels
// @Tags UserLevels // @Tags UserLevels
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Client Key" // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param alias path string true "UserLevels Alias" // @Param alias path string true "UserLevels Alias"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
@ -125,10 +124,10 @@ func (_i *userLevelsController) Show(c *fiber.Ctx) error {
func (_i *userLevelsController) ShowByAlias(c *fiber.Ctx) error { func (_i *userLevelsController) ShowByAlias(c *fiber.Ctx) error {
alias := c.Params("alias") alias := c.Params("alias")
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
userLevelsData, err := _i.userLevelsService.ShowByAlias(clientId, alias) userLevelsData, err := _i.userLevelsService.ShowByAlias(authToken, alias)
if err != nil { if err != nil {
return err return err
} }
@ -143,7 +142,7 @@ func (_i *userLevelsController) ShowByAlias(c *fiber.Ctx) error {
// @Description API for create UserLevels // @Description API for create UserLevels
// @Tags UserLevels // @Tags UserLevels
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Client Key" // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param X-Csrf-Token header string false "Insert the X-Csrf-Token" // @Param X-Csrf-Token header string false "Insert the X-Csrf-Token"
// @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>) // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param payload body request.UserLevelsCreateRequest true "Required payload" // @Param payload body request.UserLevelsCreateRequest true "Required payload"
@ -158,10 +157,10 @@ func (_i *userLevelsController) Save(c *fiber.Ctx) error {
return err return err
} }
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
dataResult, err := _i.userLevelsService.Save(clientId, *req) dataResult, err := _i.userLevelsService.Save(authToken, *req)
if err != nil { if err != nil {
return err return err
} }
@ -178,7 +177,7 @@ func (_i *userLevelsController) Save(c *fiber.Ctx) error {
// @Description API for update UserLevels // @Description API for update UserLevels
// @Tags UserLevels // @Tags UserLevels
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Client Key" // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param X-Csrf-Token header string false "Insert the X-Csrf-Token" // @Param X-Csrf-Token header string false "Insert the X-Csrf-Token"
// @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>) // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param payload body request.UserLevelsUpdateRequest true "Required payload" // @Param payload body request.UserLevelsUpdateRequest true "Required payload"
@ -199,10 +198,10 @@ func (_i *userLevelsController) Update(c *fiber.Ctx) error {
return err return err
} }
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
err = _i.userLevelsService.Update(clientId, uint(id), *req) err = _i.userLevelsService.Update(authToken, uint(id), *req)
if err != nil { if err != nil {
return err return err
} }
@ -218,7 +217,7 @@ func (_i *userLevelsController) Update(c *fiber.Ctx) error {
// @Description API for delete UserLevels // @Description API for delete UserLevels
// @Tags UserLevels // @Tags UserLevels
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Client Key" // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>) // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param X-Csrf-Token header string false "Insert the X-Csrf-Token" // @Param X-Csrf-Token header string false "Insert the X-Csrf-Token"
// @Param id path int true "UserLevels ID" // @Param id path int true "UserLevels ID"
@ -234,10 +233,10 @@ func (_i *userLevelsController) Delete(c *fiber.Ctx) error {
return err return err
} }
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
err = _i.userLevelsService.Delete(clientId, uint(id)) err = _i.userLevelsService.Delete(authToken, uint(id))
if err != nil { if err != nil {
return err return err
} }
@ -253,7 +252,7 @@ func (_i *userLevelsController) Delete(c *fiber.Ctx) error {
// @Description API for Enable Approval of Article // @Description API for Enable Approval of Article
// @Tags UserLevels // @Tags UserLevels
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string true "Client Key" // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param X-Csrf-Token header string false "Insert the X-Csrf-Token" // @Param X-Csrf-Token header string false "Insert the X-Csrf-Token"
// @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>) // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param payload body request.UserLevelsApprovalRequest true "Required payload" // @Param payload body request.UserLevelsApprovalRequest true "Required payload"
@ -268,8 +267,8 @@ func (_i *userLevelsController) EnableApproval(c *fiber.Ctx) error {
return err return err
} }
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
ids := strings.Split(req.Ids, ",") ids := strings.Split(req.Ids, ",")
for _, id := range ids { for _, id := range ids {
@ -277,7 +276,7 @@ func (_i *userLevelsController) EnableApproval(c *fiber.Ctx) error {
if err != nil { if err != nil {
return err return err
} }
err = _i.userLevelsService.EnableApproval(clientId, uint(idUint), req.IsApprovalActive) err = _i.userLevelsService.EnableApproval(authToken, uint(idUint), req.IsApprovalActive)
if err != nil { if err != nil {
return err return err
} }

View File

@ -6,7 +6,9 @@ import (
"netidhub-saas-be/app/module/user_levels/repository" "netidhub-saas-be/app/module/user_levels/repository"
"netidhub-saas-be/app/module/user_levels/request" "netidhub-saas-be/app/module/user_levels/request"
"netidhub-saas-be/app/module/user_levels/response" "netidhub-saas-be/app/module/user_levels/response"
usersRepository "netidhub-saas-be/app/module/users/repository"
"netidhub-saas-be/utils/paginator" "netidhub-saas-be/utils/paginator"
utilSvc "netidhub-saas-be/utils/service"
"github.com/google/uuid" "github.com/google/uuid"
"github.com/rs/zerolog" "github.com/rs/zerolog"
@ -14,32 +16,44 @@ import (
// UserLevelsService // UserLevelsService
type userLevelsService struct { type userLevelsService struct {
Repo repository.UserLevelsRepository Repo repository.UserLevelsRepository
Log zerolog.Logger UsersRepo usersRepository.UsersRepository
Log zerolog.Logger
} }
// UserLevelsService define interface of IUserLevelsService // UserLevelsService define interface of IUserLevelsService
type UserLevelsService interface { type UserLevelsService interface {
All(clientId *uuid.UUID, req request.UserLevelsQueryRequest) (userLevels []*response.UserLevelsResponse, paging paginator.Pagination, err error) All(authToken string, req request.UserLevelsQueryRequest) (userLevels []*response.UserLevelsResponse, paging paginator.Pagination, err error)
Show(clientId *uuid.UUID, id uint) (userLevels *response.UserLevelsResponse, err error) Show(authToken string, id uint) (userLevels *response.UserLevelsResponse, err error)
ShowByAlias(clientId *uuid.UUID, alias string) (userLevels *response.UserLevelsResponse, err error) ShowByAlias(authToken string, alias string) (userLevels *response.UserLevelsResponse, err error)
Save(clientId *uuid.UUID, req request.UserLevelsCreateRequest) (userLevels *entity.UserLevels, err error) Save(authToken string, req request.UserLevelsCreateRequest) (userLevels *entity.UserLevels, err error)
Update(clientId *uuid.UUID, id uint, req request.UserLevelsUpdateRequest) (err error) Update(authToken string, id uint, req request.UserLevelsUpdateRequest) (err error)
Delete(clientId *uuid.UUID, id uint) error Delete(authToken string, id uint) error
EnableApproval(clientId *uuid.UUID, id uint, isApprovalActive bool) (err error) EnableApproval(authToken string, id uint, isApprovalActive bool) (err error)
} }
// NewUserLevelsService init UserLevelsService // NewUserLevelsService init UserLevelsService
func NewUserLevelsService(repo repository.UserLevelsRepository, log zerolog.Logger) UserLevelsService { func NewUserLevelsService(repo repository.UserLevelsRepository, log zerolog.Logger, usersRepo usersRepository.UsersRepository) UserLevelsService {
return &userLevelsService{ return &userLevelsService{
Repo: repo, Repo: repo,
Log: log, UsersRepo: usersRepo,
Log: log,
} }
} }
// All implement interface of UserLevelsService // All implement interface of UserLevelsService
func (_i *userLevelsService) All(clientId *uuid.UUID, req request.UserLevelsQueryRequest) (userLevelss []*response.UserLevelsResponse, paging paginator.Pagination, err error) { func (_i *userLevelsService) All(authToken string, req request.UserLevelsQueryRequest) (userLevelss []*response.UserLevelsResponse, paging paginator.Pagination, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
results, paging, err := _i.Repo.GetAll(clientId, req) results, paging, err := _i.Repo.GetAll(clientId, req)
if err != nil { if err != nil {
return return
@ -52,7 +66,17 @@ func (_i *userLevelsService) All(clientId *uuid.UUID, req request.UserLevelsQuer
return return
} }
func (_i *userLevelsService) Show(clientId *uuid.UUID, id uint) (userLevels *response.UserLevelsResponse, err error) { func (_i *userLevelsService) Show(authToken string, id uint) (userLevels *response.UserLevelsResponse, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
result, err := _i.Repo.FindOne(clientId, id) result, err := _i.Repo.FindOne(clientId, id)
if err != nil { if err != nil {
return nil, err return nil, err
@ -61,7 +85,17 @@ func (_i *userLevelsService) Show(clientId *uuid.UUID, id uint) (userLevels *res
return mapper.UserLevelsResponseMapper(result), nil return mapper.UserLevelsResponseMapper(result), nil
} }
func (_i *userLevelsService) ShowByAlias(clientId *uuid.UUID, alias string) (userLevels *response.UserLevelsResponse, err error) { func (_i *userLevelsService) ShowByAlias(authToken string, alias string) (userLevels *response.UserLevelsResponse, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
result, err := _i.Repo.FindOneByAlias(clientId, alias) result, err := _i.Repo.FindOneByAlias(clientId, alias)
if err != nil { if err != nil {
return nil, err return nil, err
@ -70,7 +104,17 @@ func (_i *userLevelsService) ShowByAlias(clientId *uuid.UUID, alias string) (use
return mapper.UserLevelsResponseMapper(result), nil return mapper.UserLevelsResponseMapper(result), nil
} }
func (_i *userLevelsService) Save(clientId *uuid.UUID, req request.UserLevelsCreateRequest) (userLevels *entity.UserLevels, err error) { func (_i *userLevelsService) Save(authToken string, req request.UserLevelsCreateRequest) (userLevels *entity.UserLevels, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
_i.Log.Info().Interface("data", req).Msg("") _i.Log.Info().Interface("data", req).Msg("")
entity := req.ToEntity() entity := req.ToEntity()
@ -85,7 +129,17 @@ func (_i *userLevelsService) Save(clientId *uuid.UUID, req request.UserLevelsCre
return saveUserLevelsRes, nil return saveUserLevelsRes, nil
} }
func (_i *userLevelsService) Update(clientId *uuid.UUID, id uint, req request.UserLevelsUpdateRequest) (err error) { func (_i *userLevelsService) Update(authToken string, id uint, req request.UserLevelsUpdateRequest) (err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
//_i.Log.Info().Interface("data", req).Msg("") //_i.Log.Info().Interface("data", req).Msg("")
_i.Log.Info().Interface("data", req.ToEntity()).Msg("") _i.Log.Info().Interface("data", req.ToEntity()).Msg("")
@ -97,7 +151,17 @@ func (_i *userLevelsService) Update(clientId *uuid.UUID, id uint, req request.Us
return _i.Repo.Update(clientId, id, entity) return _i.Repo.Update(clientId, id, entity)
} }
func (_i *userLevelsService) Delete(clientId *uuid.UUID, id uint) error { func (_i *userLevelsService) Delete(authToken string, id uint) error {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
result, err := _i.Repo.FindOne(clientId, id) result, err := _i.Repo.FindOne(clientId, id)
if err != nil { if err != nil {
return err return err
@ -108,7 +172,17 @@ func (_i *userLevelsService) Delete(clientId *uuid.UUID, id uint) error {
return _i.Repo.Update(clientId, id, result) return _i.Repo.Update(clientId, id, result)
} }
func (_i *userLevelsService) EnableApproval(clientId *uuid.UUID, id uint, isApprovalActive bool) (err error) { func (_i *userLevelsService) EnableApproval(authToken string, id uint, isApprovalActive bool) (err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
result, err := _i.Repo.FindOne(clientId, id) result, err := _i.Repo.FindOne(clientId, id)
if err != nil { if err != nil {
return err return err

View File

@ -1,7 +1,6 @@
package controller package controller
import ( import (
"netidhub-saas-be/app/middleware"
"netidhub-saas-be/app/module/users/request" "netidhub-saas-be/app/module/users/request"
"netidhub-saas-be/app/module/users/service" "netidhub-saas-be/app/module/users/service"
"netidhub-saas-be/utils/paginator" "netidhub-saas-be/utils/paginator"
@ -48,8 +47,7 @@ func NewUsersController(usersService service.UsersService) UsersController {
// @Description API for getting all Users // @Description API for getting all Users
// @Tags Users // @Tags Users
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string false "Insert the X-Client-Key" // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param req query request.UsersQueryRequest false "query parameters"
// @Param req query paginator.Pagination false "pagination parameters" // @Param req query paginator.Pagination false "pagination parameters"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
@ -79,10 +77,10 @@ func (_i *usersController) All(c *fiber.Ctx) error {
req := reqContext.ToParamRequest() req := reqContext.ToParamRequest()
req.Pagination = paginate req.Pagination = paginate
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
usersData, paging, err := _i.usersService.All(clientId, req) usersData, paging, err := _i.usersService.All(authToken, req)
if err != nil { if err != nil {
return err return err
} }
@ -100,7 +98,7 @@ func (_i *usersController) All(c *fiber.Ctx) error {
// @Description API for getting one Users // @Description API for getting one Users
// @Tags Users // @Tags Users
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string false "Insert the X-Client-Key" // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param id path int true "Users ID" // @Param id path int true "Users ID"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
@ -113,10 +111,10 @@ func (_i *usersController) Show(c *fiber.Ctx) error {
return err return err
} }
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
usersData, err := _i.usersService.Show(clientId, uint(id)) usersData, err := _i.usersService.Show(authToken, uint(id))
if err != nil { if err != nil {
return err return err
} }
@ -133,7 +131,7 @@ func (_i *usersController) Show(c *fiber.Ctx) error {
// @Description API for getting one Users // @Description API for getting one Users
// @Tags Users // @Tags Users
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string false "Insert the X-Client-Key" // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param username path string true "Username" // @Param username path string true "Username"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
@ -143,10 +141,10 @@ func (_i *usersController) Show(c *fiber.Ctx) error {
func (_i *usersController) ShowByUsername(c *fiber.Ctx) error { func (_i *usersController) ShowByUsername(c *fiber.Ctx) error {
username := c.Params("username") username := c.Params("username")
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
usersData, err := _i.usersService.ShowByUsername(clientId, username) usersData, err := _i.usersService.ShowByUsername(authToken, username)
if err != nil { if err != nil {
return err return err
} }
@ -163,7 +161,7 @@ func (_i *usersController) ShowByUsername(c *fiber.Ctx) error {
// @Description API for ShowUserInfo // @Description API for ShowUserInfo
// @Tags Users // @Tags Users
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string false "Insert the X-Client-Key" // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>) // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
@ -173,10 +171,7 @@ func (_i *usersController) ShowByUsername(c *fiber.Ctx) error {
func (_i *usersController) ShowInfo(c *fiber.Ctx) error { func (_i *usersController) ShowInfo(c *fiber.Ctx) error {
authToken := c.Get("Authorization") authToken := c.Get("Authorization")
// Get ClientId from context dataResult, err := _i.usersService.ShowUserInfo(authToken)
clientId := middleware.GetClientID(c)
dataResult, err := _i.usersService.ShowUserInfo(clientId, authToken)
if err != nil { if err != nil {
return err return err
} }
@ -193,8 +188,7 @@ func (_i *usersController) ShowInfo(c *fiber.Ctx) error {
// @Description API for create Users // @Description API for create Users
// @Tags Users // @Tags Users
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string false "Insert the X-Client-Key" // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param X-Csrf-Token header string false "Insert the X-Csrf-Token"
// @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>) // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param payload body request.UsersCreateRequest true "Required payload" // @Param payload body request.UsersCreateRequest true "Required payload"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
@ -210,10 +204,7 @@ func (_i *usersController) Save(c *fiber.Ctx) error {
authToken := c.Get("Authorization") authToken := c.Get("Authorization")
// Get ClientId from context dataResult, err := _i.usersService.Save(authToken, *req)
clientId := middleware.GetClientID(c)
dataResult, err := _i.usersService.Save(clientId, *req, authToken)
if err != nil { if err != nil {
return err return err
} }
@ -230,8 +221,7 @@ func (_i *usersController) Save(c *fiber.Ctx) error {
// @Description API for update Users // @Description API for update Users
// @Tags Users // @Tags Users
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string false "Insert the X-Client-Key" // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param X-Csrf-Token header string false "Insert the X-Csrf-Token"
// @Param id path int true "Users ID" // @Param id path int true "Users ID"
// @Param payload body request.UsersUpdateRequest true "Required payload" // @Param payload body request.UsersUpdateRequest true "Required payload"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
@ -250,10 +240,10 @@ func (_i *usersController) Update(c *fiber.Ctx) error {
return err return err
} }
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
err = _i.usersService.Update(clientId, uint(id), *req) err = _i.usersService.Update(authToken, uint(id), *req)
if err != nil { if err != nil {
return err return err
} }
@ -269,7 +259,6 @@ func (_i *usersController) Update(c *fiber.Ctx) error {
// @Description API for Login Users // @Description API for Login Users
// @Tags Users // @Tags Users
// @Security Bearer // @Security Bearer
// @Param X-Csrf-Token header string false "Insert the X-Csrf-Token"
// @Param payload body request.UserLogin true "Required payload" // @Param payload body request.UserLogin true "Required payload"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
@ -303,7 +292,6 @@ func (_i *usersController) Login(c *fiber.Ctx) error {
// @Description API for ParetoLogin Users // @Description API for ParetoLogin Users
// @Tags Users // @Tags Users
// @Security Bearer // @Security Bearer
// @Param X-Csrf-Token header string false "Insert the X-Csrf-Token"
// @Param payload body request.UserLogin true "Required payload" // @Param payload body request.UserLogin true "Required payload"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
@ -337,8 +325,7 @@ func (_i *usersController) ParetoLogin(c *fiber.Ctx) error {
// @Description API for delete Users // @Description API for delete Users
// @Tags Users // @Tags Users
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string false "Insert the X-Client-Key" // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param X-Csrf-Token header string false "Insert the X-Csrf-Token"
// @Param id path int true "Users ID" // @Param id path int true "Users ID"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
@ -351,10 +338,10 @@ func (_i *usersController) Delete(c *fiber.Ctx) error {
return err return err
} }
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
err = _i.usersService.Delete(clientId, uint(id)) err = _i.usersService.Delete(authToken, uint(id))
if err != nil { if err != nil {
return err return err
} }
@ -370,8 +357,7 @@ func (_i *usersController) Delete(c *fiber.Ctx) error {
// @Description API for SavePassword Users // @Description API for SavePassword Users
// @Tags Users // @Tags Users
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string false "Insert the X-Client-Key" // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param X-Csrf-Token header string false "Insert the X-Csrf-Token"
// @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>) // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param payload body request.UserSavePassword true "Required payload" // @Param payload body request.UserSavePassword true "Required payload"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
@ -387,10 +373,7 @@ func (_i *usersController) SavePassword(c *fiber.Ctx) error {
authToken := c.Get("Authorization") authToken := c.Get("Authorization")
// Get ClientId from context err := _i.usersService.SavePassword(authToken, *req)
clientId := middleware.GetClientID(c)
err := _i.usersService.SavePassword(clientId, *req, authToken)
if err != nil { if err != nil {
return err return err
} }
@ -406,7 +389,6 @@ func (_i *usersController) SavePassword(c *fiber.Ctx) error {
// @Description API for ResetPassword Users // @Description API for ResetPassword Users
// @Tags Users // @Tags Users
// @Security Bearer // @Security Bearer
// @Param X-Csrf-Token header string false "Insert the X-Csrf-Token"
// @Param payload body request.UserResetPassword true "Required payload" // @Param payload body request.UserResetPassword true "Required payload"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
@ -435,8 +417,7 @@ func (_i *usersController) ResetPassword(c *fiber.Ctx) error {
// @Description API for ForgotPassword Users // @Description API for ForgotPassword Users
// @Tags Users // @Tags Users
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string false "Insert the X-Client-Key" // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param X-Csrf-Token header string false "Insert the X-Csrf-Token"
// @Param payload body request.UserForgotPassword true "Required payload" // @Param payload body request.UserForgotPassword true "Required payload"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
@ -449,10 +430,10 @@ func (_i *usersController) ForgotPassword(c *fiber.Ctx) error {
return err return err
} }
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
err := _i.usersService.ForgotPassword(clientId, *req) err := _i.usersService.ForgotPassword(authToken, *req)
if err != nil { if err != nil {
return err return err
} }
@ -468,7 +449,6 @@ func (_i *usersController) ForgotPassword(c *fiber.Ctx) error {
// @Description API for OtpRequest Users // @Description API for OtpRequest Users
// @Tags Users // @Tags Users
// @Security Bearer // @Security Bearer
// @Param X-Csrf-Token header string false "Insert the X-Csrf-Token"
// @Param payload body request.UserOtpRequest true "Required payload" // @Param payload body request.UserOtpRequest true "Required payload"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
@ -497,7 +477,6 @@ func (_i *usersController) OtpRequest(c *fiber.Ctx) error {
// @Description API for OtpValidation Users // @Description API for OtpValidation Users
// @Tags Users // @Tags Users
// @Security Bearer // @Security Bearer
// @Param X-Csrf-Token header string false "Insert the X-Csrf-Token"
// @Param payload body request.UserOtpValidation true "Required payload" // @Param payload body request.UserOtpValidation true "Required payload"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
@ -526,8 +505,7 @@ func (_i *usersController) OtpValidation(c *fiber.Ctx) error {
// @Description API for Email Validation Users // @Description API for Email Validation Users
// @Tags Users // @Tags Users
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string false "Insert the X-Client-Key" // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param X-Csrf-Token header string false "Insert the X-Csrf-Token"
// @Param payload body request.UserEmailValidationRequest true "Required payload" // @Param payload body request.UserEmailValidationRequest true "Required payload"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
@ -540,10 +518,10 @@ func (_i *usersController) EmailValidation(c *fiber.Ctx) error {
return err return err
} }
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
messageResponse, err := _i.usersService.EmailValidationPreLogin(clientId, *req) messageResponse, err := _i.usersService.EmailValidationPreLogin(authToken, *req)
if err != nil { if err != nil {
return err return err
} }
@ -559,8 +537,7 @@ func (_i *usersController) EmailValidation(c *fiber.Ctx) error {
// @Description API for Setup Email Users // @Description API for Setup Email Users
// @Tags Users // @Tags Users
// @Security Bearer // @Security Bearer
// @Param X-Client-Key header string false "Insert the X-Client-Key" // @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
// @Param X-Csrf-Token header string false "Insert the X-Csrf-Token"
// @Param payload body request.UserEmailValidationRequest true "Required payload" // @Param payload body request.UserEmailValidationRequest true "Required payload"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
@ -573,10 +550,10 @@ func (_i *usersController) SetupEmail(c *fiber.Ctx) error {
return err return err
} }
// Get ClientId from context // Get Authorization token from header
clientId := middleware.GetClientID(c) authToken := c.Get("Authorization")
messageResponse, err := _i.usersService.SetupEmail(clientId, *req) messageResponse, err := _i.usersService.SetupEmail(authToken, *req)
if err != nil { if err != nil {
return err return err
} }

View File

@ -34,20 +34,20 @@ type usersService struct {
// UsersService define interface of IUsersService // UsersService define interface of IUsersService
type UsersService interface { type UsersService interface {
All(clientId *uuid.UUID, req request.UsersQueryRequest) (users []*response.UsersResponse, paging paginator.Pagination, err error) All(authToken string, req request.UsersQueryRequest) (users []*response.UsersResponse, paging paginator.Pagination, err error)
Show(clientId *uuid.UUID, id uint) (users *response.UsersResponse, err error) Show(authToken string, id uint) (users *response.UsersResponse, err error)
ShowByUsername(clientId *uuid.UUID, username string) (users *response.UsersResponse, err error) ShowByUsername(authToken string, username string) (users *response.UsersResponse, err error)
ShowUserInfo(clientId *uuid.UUID, authToken string) (users *response.UsersResponse, err error) ShowUserInfo(authToken string) (users *response.UsersResponse, err error)
Save(clientId *uuid.UUID, req request.UsersCreateRequest, authToken string) (userReturn *users.Users, err error) Save(authToken string, req request.UsersCreateRequest) (userReturn *users.Users, err error)
Login(req request.UserLogin) (res *gocloak.JWT, err error) Login(req request.UserLogin) (res *gocloak.JWT, err error)
ParetoLogin(req request.UserLogin) (res *response.ParetoLoginResponse, err error) ParetoLogin(req request.UserLogin) (res *response.ParetoLoginResponse, err error)
Update(clientId *uuid.UUID, id uint, req request.UsersUpdateRequest) (err error) Update(authToken string, id uint, req request.UsersUpdateRequest) (err error)
Delete(clientId *uuid.UUID, id uint) error Delete(authToken string, id uint) error
SavePassword(clientId *uuid.UUID, req request.UserSavePassword, authToken string) (err error) SavePassword(authToken string, req request.UserSavePassword) (err error)
ResetPassword(req request.UserResetPassword) (err error) ResetPassword(req request.UserResetPassword) (err error)
ForgotPassword(clientId *uuid.UUID, req request.UserForgotPassword) (err error) ForgotPassword(authToken string, req request.UserForgotPassword) (err error)
EmailValidationPreLogin(clientId *uuid.UUID, req request.UserEmailValidationRequest) (msgResponse *string, err error) EmailValidationPreLogin(authToken string, req request.UserEmailValidationRequest) (msgResponse *string, err error)
SetupEmail(clientId *uuid.UUID, req request.UserEmailValidationRequest) (msgResponse *string, err error) SetupEmail(authToken string, req request.UserEmailValidationRequest) (msgResponse *string, err error)
OtpRequest(req request.UserOtpRequest) (err error) OtpRequest(req request.UserOtpRequest) (err error)
OtpValidation(req request.UserOtpValidation) (err error) OtpValidation(req request.UserOtpValidation) (err error)
SendLoginOtp(name string, email string, otp string) error SendLoginOtp(name string, email string, otp string) error
@ -67,7 +67,17 @@ func NewUsersService(repo repository.UsersRepository, userLevelsRepo userLevelsR
} }
// All implement interface of UsersService // All implement interface of UsersService
func (_i *usersService) All(clientId *uuid.UUID, req request.UsersQueryRequest) (users []*response.UsersResponse, paging paginator.Pagination, err error) { func (_i *usersService) All(authToken string, req request.UsersQueryRequest) (users []*response.UsersResponse, paging paginator.Pagination, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.Repo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
results, paging, err := _i.Repo.GetAll(clientId, req) results, paging, err := _i.Repo.GetAll(clientId, req)
if err != nil { if err != nil {
return return
@ -80,7 +90,17 @@ func (_i *usersService) All(clientId *uuid.UUID, req request.UsersQueryRequest)
return return
} }
func (_i *usersService) Show(clientId *uuid.UUID, id uint) (users *response.UsersResponse, err error) { func (_i *usersService) Show(authToken string, id uint) (users *response.UsersResponse, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.Repo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
result, err := _i.Repo.FindOne(clientId, id) result, err := _i.Repo.FindOne(clientId, id)
if err != nil { if err != nil {
return nil, err return nil, err
@ -89,7 +109,17 @@ func (_i *usersService) Show(clientId *uuid.UUID, id uint) (users *response.User
return mapper.UsersResponseMapper(result, _i.UserLevelsRepo, clientId), nil return mapper.UsersResponseMapper(result, _i.UserLevelsRepo, clientId), nil
} }
func (_i *usersService) ShowByUsername(clientId *uuid.UUID, username string) (users *response.UsersResponse, err error) { func (_i *usersService) ShowByUsername(authToken string, username string) (users *response.UsersResponse, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.Repo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
result, err := _i.Repo.FindByUsername(clientId, username) result, err := _i.Repo.FindByUsername(clientId, username)
if err != nil { if err != nil {
return nil, err return nil, err
@ -98,13 +128,33 @@ func (_i *usersService) ShowByUsername(clientId *uuid.UUID, username string) (us
return mapper.UsersResponseMapper(result, _i.UserLevelsRepo, clientId), nil return mapper.UsersResponseMapper(result, _i.UserLevelsRepo, clientId), nil
} }
func (_i *usersService) ShowUserInfo(clientId *uuid.UUID, authToken string) (users *response.UsersResponse, err error) { func (_i *usersService) ShowUserInfo(authToken string) (users *response.UsersResponse, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.Repo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
userInfo := utilSvc.GetUserInfo(_i.Log, _i.Repo, authToken) userInfo := utilSvc.GetUserInfo(_i.Log, _i.Repo, authToken)
return mapper.UsersResponseMapper(userInfo, _i.UserLevelsRepo, clientId), nil return mapper.UsersResponseMapper(userInfo, _i.UserLevelsRepo, clientId), nil
} }
func (_i *usersService) Save(clientId *uuid.UUID, req request.UsersCreateRequest, authToken string) (userReturn *users.Users, err error) { func (_i *usersService) Save(authToken string, req request.UsersCreateRequest) (userReturn *users.Users, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.Repo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
_i.Log.Info().Interface("data", req).Msg("") _i.Log.Info().Interface("data", req).Msg("")
newReq := req.ToEntity() newReq := req.ToEntity()
@ -219,7 +269,17 @@ func (_i *usersService) ParetoLogin(req request.UserLogin) (res *response.Pareto
return resLogin, nil return resLogin, nil
} }
func (_i *usersService) Update(clientId *uuid.UUID, id uint, req request.UsersUpdateRequest) (err error) { func (_i *usersService) Update(authToken string, id uint, req request.UsersUpdateRequest) (err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.Repo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
_i.Log.Info().Interface("data", req).Msg("") _i.Log.Info().Interface("data", req).Msg("")
newReq := req.ToEntity() newReq := req.ToEntity()
@ -239,7 +299,17 @@ func (_i *usersService) Update(clientId *uuid.UUID, id uint, req request.UsersUp
return _i.Repo.Update(clientId, id, newReq) return _i.Repo.Update(clientId, id, newReq)
} }
func (_i *usersService) Delete(clientId *uuid.UUID, id uint) error { func (_i *usersService) Delete(authToken string, id uint) error {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.Repo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
result, err := _i.Repo.FindOne(clientId, id) result, err := _i.Repo.FindOne(clientId, id)
if err != nil { if err != nil {
return err return err
@ -250,7 +320,17 @@ func (_i *usersService) Delete(clientId *uuid.UUID, id uint) error {
return _i.Repo.Update(clientId, id, result) return _i.Repo.Update(clientId, id, result)
} }
func (_i *usersService) SavePassword(clientId *uuid.UUID, req request.UserSavePassword, authToken string) (err error) { func (_i *usersService) SavePassword(authToken string, req request.UserSavePassword) (err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.Repo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
_i.Log.Info().Interface("data", req).Msg("") _i.Log.Info().Interface("data", req).Msg("")
_i.Log.Info().Interface("AUTH TOKEN", authToken).Msg("") _i.Log.Info().Interface("AUTH TOKEN", authToken).Msg("")
@ -311,7 +391,17 @@ func (_i *usersService) ResetPassword(req request.UserResetPassword) (err error)
} }
} }
func (_i *usersService) ForgotPassword(clientId *uuid.UUID, req request.UserForgotPassword) (err error) { func (_i *usersService) ForgotPassword(authToken string, req request.UserForgotPassword) (err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.Repo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
_i.Log.Info().Interface("data", req).Msg("") _i.Log.Info().Interface("data", req).Msg("")
user, err := _i.Repo.FindByUsername(clientId, req.Username) user, err := _i.Repo.FindByUsername(clientId, req.Username)
@ -408,7 +498,17 @@ func (_i *usersService) OtpValidation(req request.UserOtpValidation) (err error)
} }
} }
func (_i *usersService) EmailValidationPreLogin(clientId *uuid.UUID, req request.UserEmailValidationRequest) (msgResponse *string, err error) { func (_i *usersService) EmailValidationPreLogin(authToken string, req request.UserEmailValidationRequest) (msgResponse *string, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.Repo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
_i.Log.Info().Interface("data", req).Msg("") _i.Log.Info().Interface("data", req).Msg("")
var loginResponse *gocloak.JWT var loginResponse *gocloak.JWT
@ -457,7 +557,17 @@ func (_i *usersService) EmailValidationPreLogin(clientId *uuid.UUID, req request
return msgResponse, nil return msgResponse, nil
} }
func (_i *usersService) SetupEmail(clientId *uuid.UUID, req request.UserEmailValidationRequest) (msgResponse *string, err error) { func (_i *usersService) SetupEmail(authToken string, req request.UserEmailValidationRequest) (msgResponse *string, err error) {
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.Repo, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
_i.Log.Info().Interface("data", req).Msg("") _i.Log.Info().Interface("data", req).Msg("")
var loginResponse *gocloak.JWT var loginResponse *gocloak.JWT

View File

@ -0,0 +1,135 @@
# Template untuk mengupdate Service Interface dan Implementation
## 1. Service Interface Update
**Before:**
```go
type ModuleService interface {
All(clientId *uuid.UUID, authToken string, req request.ModuleQueryRequest) (data []*response.ModuleResponse, paging paginator.Pagination, err error)
Show(clientId *uuid.UUID, id uint) (data *response.ModuleResponse, err error)
Save(clientId *uuid.UUID, req request.ModuleCreateRequest, authToken string) (data *entity.Module, err error)
Update(clientId *uuid.UUID, id uint, req request.ModuleUpdateRequest) (err error)
Delete(clientId *uuid.UUID, id uint) error
}
```
**After:**
```go
type ModuleService interface {
All(authToken string, req request.ModuleQueryRequest) (data []*response.ModuleResponse, paging paginator.Pagination, err error)
Show(authToken string, id uint) (data *response.ModuleResponse, err error)
Save(authToken string, req request.ModuleCreateRequest) (data *entity.Module, err error)
Update(authToken string, id uint, req request.ModuleUpdateRequest) (err error)
Delete(authToken string, id uint) error
}
```
## 2. Service Implementation Update
**Before:**
```go
func (_i *moduleService) All(clientId *uuid.UUID, authToken string, req request.ModuleQueryRequest) (data []*response.ModuleResponse, paging paginator.Pagination, err error) {
// Extract userLevelId from authToken
var userLevelId *uint
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil {
userLevelId = &user.UserLevelId
}
}
results, paging, err := _i.Repo.GetAll(clientId, userLevelId, req)
// ... rest of implementation
}
```
**After:**
```go
func (_i *moduleService) All(authToken string, req request.ModuleQueryRequest) (data []*response.ModuleResponse, paging paginator.Pagination, err error) {
// Extract clientId and userLevelId from authToken
var clientId *uuid.UUID
var userLevelId *uint
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
if user != nil {
clientId = user.ClientId
userLevelId = &user.UserLevelId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
results, paging, err := _i.Repo.GetAll(clientId, userLevelId, req)
// ... rest of implementation
}
```
## 3. Controller Update
**Before:**
```go
func (_i *moduleController) All(c *fiber.Ctx) error {
// ... pagination setup ...
// Get ClientId from context
clientId := middleware.GetClientID(c)
// Get Authorization token from header
authToken := c.Get("Authorization")
data, paging, err := _i.moduleService.All(clientId, authToken, req)
// ... rest of implementation
}
```
**After:**
```go
func (_i *moduleController) All(c *fiber.Ctx) error {
// ... pagination setup ...
// Get Authorization token from header
authToken := c.Get("Authorization")
_i.Log.Info().Str("authToken", authToken).Msg("")
data, paging, err := _i.moduleService.All(authToken, req)
// ... rest of implementation
}
```
## 4. Swagger Documentation Update
**Before:**
```go
// @Param X-Client-Key header string true "Insert the X-Client-Key"
// @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
```
**After:**
```go
// @Param Authorization header string false "Insert your access token" default(Bearer <Add access token here>)
```
## 5. Import Cleanup
Remove unused middleware import:
```go
// Remove this line if no longer needed:
"netidhub-saas-be/app/middleware"
```
## 6. Key Changes Summary
1. **Remove X-Client-Key header** from all Swagger documentation
2. **Remove GetClientID() calls** from controllers
3. **Update service interfaces** to use authToken instead of clientId parameter
4. **Update service implementations** to extract clientId from authToken using GetUserInfo()
5. **Remove middleware import** if no longer needed
6. **Update all method calls** to match new signatures
## 7. Benefits
- **Simpler API**: No need for X-Client-Key header
- **Auth-based**: clientId comes from authenticated user
- **Consistent**: Same pattern across all modules
- **Secure**: Tied to user authentication
- **Maintainable**: Less parameters to manage

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,59 @@
# PowerShell script to fix all remaining clientId issues in article_approval_flows
# Usage: .\fix_all_article_approval_flows.ps1 <file_path>
param(
[Parameter(Mandatory=$true)]
[string]$FilePath
)
if (-not (Test-Path $FilePath)) {
Write-Error "File not found: $FilePath"
exit 1
}
Write-Host "Fixing all remaining clientId issues in: $FilePath"
# Read file content
$Content = Get-Content $FilePath -Raw
# Find all methods that use clientId but don't have extraction logic
$MethodPattern = 'func \(_i \*(\w+)Service\) (\w+)\(authToken string, ([^)]+)\) \{[^}]*return _i\.(\w+)Repository\.(\w+)\(clientId,'
$Matches = [regex]::Matches($Content, $MethodPattern)
foreach ($Match in $Matches) {
$ServiceName = $Match.Groups[1].Value
$MethodName = $Match.Groups[2].Value
$Parameters = $Match.Groups[3].Value
Write-Host "Fixing method: $MethodName"
# Create the clientId extraction logic
$ExtractionLogic = @"
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return nil, errors.New("clientId not found in auth token")
}
"@
# Replace the method opening with extraction logic
$OldMethodStart = "func (_i *${ServiceName}Service) ${MethodName}(authToken string, ${Parameters}) {"
$NewMethodStart = "func (_i *${ServiceName}Service) ${MethodName}(authToken string, ${Parameters}) {${ExtractionLogic}"
$Content = $Content -replace [regex]::Escape($OldMethodStart), $NewMethodStart
}
# Write updated content
Set-Content $FilePath $Content -NoNewline
Write-Host "All remaining clientId issues fixed."

View File

@ -0,0 +1,59 @@
# PowerShell script to fix all remaining clientId issues in article_approval_flows
# Usage: .\fix_all_article_approval_flows_final.ps1 <file_path>
param(
[Parameter(Mandatory=$true)]
[string]$FilePath
)
if (-not (Test-Path $FilePath)) {
Write-Error "File not found: $FilePath"
exit 1
}
Write-Host "Fixing all remaining clientId issues in: $FilePath"
# Read file content
$Content = Get-Content $FilePath -Raw
# Find all methods that use clientId but don't have extraction logic
$MethodPattern = 'func \(_i \*(\w+)Service\) (\w+)\(authToken string, ([^)]+)\) \{[^}]*return _i\.(\w+)Repository\.(\w+)\(clientId,'
$Matches = [regex]::Matches($Content, $MethodPattern)
foreach ($Match in $Matches) {
$ServiceName = $Match.Groups[1].Value
$MethodName = $Match.Groups[2].Value
$Parameters = $Match.Groups[3].Value
Write-Host "Fixing method: $MethodName"
# Create the clientId extraction logic
$ExtractionLogic = @"
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return nil, errors.New("clientId not found in auth token")
}
"@
# Replace the method opening with extraction logic
$OldMethodStart = "func (_i *${ServiceName}Service) ${MethodName}(authToken string, ${Parameters}) {"
$NewMethodStart = "func (_i *${ServiceName}Service) ${MethodName}(authToken string, ${Parameters}) {${ExtractionLogic}"
$Content = $Content -replace [regex]::Escape($OldMethodStart), $NewMethodStart
}
# Write updated content
Set-Content $FilePath $Content -NoNewline
Write-Host "All remaining clientId issues fixed."

View File

@ -0,0 +1,59 @@
# PowerShell script to fix all remaining clientId issues in article_approval_flows
# Usage: .\fix_all_article_approval_flows_final10.ps1 <file_path>
param(
[Parameter(Mandatory=$true)]
[string]$FilePath
)
if (-not (Test-Path $FilePath)) {
Write-Error "File not found: $FilePath"
exit 1
}
Write-Host "Fixing all remaining clientId issues in: $FilePath"
# Read file content
$Content = Get-Content $FilePath -Raw
# Find all methods that use clientId but don't have extraction logic
$MethodPattern = 'func \(_i \*(\w+)Service\) (\w+)\(authToken string, ([^)]+)\) \{[^}]*return _i\.(\w+)Repository\.(\w+)\(clientId,'
$Matches = [regex]::Matches($Content, $MethodPattern)
foreach ($Match in $Matches) {
$ServiceName = $Match.Groups[1].Value
$MethodName = $Match.Groups[2].Value
$Parameters = $Match.Groups[3].Value
Write-Host "Fixing method: $MethodName"
# Create the clientId extraction logic
$ExtractionLogic = @"
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return nil, errors.New("clientId not found in auth token")
}
"@
# Replace the method opening with extraction logic
$OldMethodStart = "func (_i *${ServiceName}Service) ${MethodName}(authToken string, ${Parameters}) {"
$NewMethodStart = "func (_i *${ServiceName}Service) ${MethodName}(authToken string, ${Parameters}) {${ExtractionLogic}"
$Content = $Content -replace [regex]::Escape($OldMethodStart), $NewMethodStart
}
# Write updated content
Set-Content $FilePath $Content -NoNewline
Write-Host "All remaining clientId issues fixed."

View File

@ -0,0 +1,59 @@
# PowerShell script to fix all remaining clientId issues in article_approval_flows
# Usage: .\fix_all_article_approval_flows_final11.ps1 <file_path>
param(
[Parameter(Mandatory=$true)]
[string]$FilePath
)
if (-not (Test-Path $FilePath)) {
Write-Error "File not found: $FilePath"
exit 1
}
Write-Host "Fixing all remaining clientId issues in: $FilePath"
# Read file content
$Content = Get-Content $FilePath -Raw
# Find all methods that use clientId but don't have extraction logic
$MethodPattern = 'func \(_i \*(\w+)Service\) (\w+)\(authToken string, ([^)]+)\) \{[^}]*return _i\.(\w+)Repository\.(\w+)\(clientId,'
$Matches = [regex]::Matches($Content, $MethodPattern)
foreach ($Match in $Matches) {
$ServiceName = $Match.Groups[1].Value
$MethodName = $Match.Groups[2].Value
$Parameters = $Match.Groups[3].Value
Write-Host "Fixing method: $MethodName"
# Create the clientId extraction logic
$ExtractionLogic = @"
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return nil, errors.New("clientId not found in auth token")
}
"@
# Replace the method opening with extraction logic
$OldMethodStart = "func (_i *${ServiceName}Service) ${MethodName}(authToken string, ${Parameters}) {"
$NewMethodStart = "func (_i *${ServiceName}Service) ${MethodName}(authToken string, ${Parameters}) {${ExtractionLogic}"
$Content = $Content -replace [regex]::Escape($OldMethodStart), $NewMethodStart
}
# Write updated content
Set-Content $FilePath $Content -NoNewline
Write-Host "All remaining clientId issues fixed."

View File

@ -0,0 +1,59 @@
# PowerShell script to fix all remaining clientId issues in article_approval_flows
# Usage: .\fix_all_article_approval_flows_final12.ps1 <file_path>
param(
[Parameter(Mandatory=$true)]
[string]$FilePath
)
if (-not (Test-Path $FilePath)) {
Write-Error "File not found: $FilePath"
exit 1
}
Write-Host "Fixing all remaining clientId issues in: $FilePath"
# Read file content
$Content = Get-Content $FilePath -Raw
# Find all methods that use clientId but don't have extraction logic
$MethodPattern = 'func \(_i \*(\w+)Service\) (\w+)\(authToken string, ([^)]+)\) \{[^}]*return _i\.(\w+)Repository\.(\w+)\(clientId,'
$Matches = [regex]::Matches($Content, $MethodPattern)
foreach ($Match in $Matches) {
$ServiceName = $Match.Groups[1].Value
$MethodName = $Match.Groups[2].Value
$Parameters = $Match.Groups[3].Value
Write-Host "Fixing method: $MethodName"
# Create the clientId extraction logic
$ExtractionLogic = @"
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return nil, errors.New("clientId not found in auth token")
}
"@
# Replace the method opening with extraction logic
$OldMethodStart = "func (_i *${ServiceName}Service) ${MethodName}(authToken string, ${Parameters}) {"
$NewMethodStart = "func (_i *${ServiceName}Service) ${MethodName}(authToken string, ${Parameters}) {${ExtractionLogic}"
$Content = $Content -replace [regex]::Escape($OldMethodStart), $NewMethodStart
}
# Write updated content
Set-Content $FilePath $Content -NoNewline
Write-Host "All remaining clientId issues fixed."

View File

@ -0,0 +1,59 @@
# PowerShell script to fix all remaining clientId issues in article_approval_flows
# Usage: .\fix_all_article_approval_flows_final13.ps1 <file_path>
param(
[Parameter(Mandatory=$true)]
[string]$FilePath
)
if (-not (Test-Path $FilePath)) {
Write-Error "File not found: $FilePath"
exit 1
}
Write-Host "Fixing all remaining clientId issues in: $FilePath"
# Read file content
$Content = Get-Content $FilePath -Raw
# Find all methods that use clientId but don't have extraction logic
$MethodPattern = 'func \(_i \*(\w+)Service\) (\w+)\(authToken string, ([^)]+)\) \{[^}]*return _i\.(\w+)Repository\.(\w+)\(clientId,'
$Matches = [regex]::Matches($Content, $MethodPattern)
foreach ($Match in $Matches) {
$ServiceName = $Match.Groups[1].Value
$MethodName = $Match.Groups[2].Value
$Parameters = $Match.Groups[3].Value
Write-Host "Fixing method: $MethodName"
# Create the clientId extraction logic
$ExtractionLogic = @"
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return nil, errors.New("clientId not found in auth token")
}
"@
# Replace the method opening with extraction logic
$OldMethodStart = "func (_i *${ServiceName}Service) ${MethodName}(authToken string, ${Parameters}) {"
$NewMethodStart = "func (_i *${ServiceName}Service) ${MethodName}(authToken string, ${Parameters}) {${ExtractionLogic}"
$Content = $Content -replace [regex]::Escape($OldMethodStart), $NewMethodStart
}
# Write updated content
Set-Content $FilePath $Content -NoNewline
Write-Host "All remaining clientId issues fixed."

View File

@ -0,0 +1,59 @@
# PowerShell script to fix all remaining clientId issues in article_approval_flows
# Usage: .\fix_all_article_approval_flows_final14.ps1 <file_path>
param(
[Parameter(Mandatory=$true)]
[string]$FilePath
)
if (-not (Test-Path $FilePath)) {
Write-Error "File not found: $FilePath"
exit 1
}
Write-Host "Fixing all remaining clientId issues in: $FilePath"
# Read file content
$Content = Get-Content $FilePath -Raw
# Find all methods that use clientId but don't have extraction logic
$MethodPattern = 'func \(_i \*(\w+)Service\) (\w+)\(authToken string, ([^)]+)\) \{[^}]*return _i\.(\w+)Repository\.(\w+)\(clientId,'
$Matches = [regex]::Matches($Content, $MethodPattern)
foreach ($Match in $Matches) {
$ServiceName = $Match.Groups[1].Value
$MethodName = $Match.Groups[2].Value
$Parameters = $Match.Groups[3].Value
Write-Host "Fixing method: $MethodName"
# Create the clientId extraction logic
$ExtractionLogic = @"
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return nil, errors.New("clientId not found in auth token")
}
"@
# Replace the method opening with extraction logic
$OldMethodStart = "func (_i *${ServiceName}Service) ${MethodName}(authToken string, ${Parameters}) {"
$NewMethodStart = "func (_i *${ServiceName}Service) ${MethodName}(authToken string, ${Parameters}) {${ExtractionLogic}"
$Content = $Content -replace [regex]::Escape($OldMethodStart), $NewMethodStart
}
# Write updated content
Set-Content $FilePath $Content -NoNewline
Write-Host "All remaining clientId issues fixed."

View File

@ -0,0 +1,59 @@
# PowerShell script to fix all remaining clientId issues in article_approval_flows
# Usage: .\fix_all_article_approval_flows_final15.ps1 <file_path>
param(
[Parameter(Mandatory=$true)]
[string]$FilePath
)
if (-not (Test-Path $FilePath)) {
Write-Error "File not found: $FilePath"
exit 1
}
Write-Host "Fixing all remaining clientId issues in: $FilePath"
# Read file content
$Content = Get-Content $FilePath -Raw
# Find all methods that use clientId but don't have extraction logic
$MethodPattern = 'func \(_i \*(\w+)Service\) (\w+)\(authToken string, ([^)]+)\) \{[^}]*return _i\.(\w+)Repository\.(\w+)\(clientId,'
$Matches = [regex]::Matches($Content, $MethodPattern)
foreach ($Match in $Matches) {
$ServiceName = $Match.Groups[1].Value
$MethodName = $Match.Groups[2].Value
$Parameters = $Match.Groups[3].Value
Write-Host "Fixing method: $MethodName"
# Create the clientId extraction logic
$ExtractionLogic = @"
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return nil, errors.New("clientId not found in auth token")
}
"@
# Replace the method opening with extraction logic
$OldMethodStart = "func (_i *${ServiceName}Service) ${MethodName}(authToken string, ${Parameters}) {"
$NewMethodStart = "func (_i *${ServiceName}Service) ${MethodName}(authToken string, ${Parameters}) {${ExtractionLogic}"
$Content = $Content -replace [regex]::Escape($OldMethodStart), $NewMethodStart
}
# Write updated content
Set-Content $FilePath $Content -NoNewline
Write-Host "All remaining clientId issues fixed."

View File

@ -0,0 +1,59 @@
# PowerShell script to fix all remaining clientId issues in article_approval_flows
# Usage: .\fix_all_article_approval_flows_final16.ps1 <file_path>
param(
[Parameter(Mandatory=$true)]
[string]$FilePath
)
if (-not (Test-Path $FilePath)) {
Write-Error "File not found: $FilePath"
exit 1
}
Write-Host "Fixing all remaining clientId issues in: $FilePath"
# Read file content
$Content = Get-Content $FilePath -Raw
# Find all methods that use clientId but don't have extraction logic
$MethodPattern = 'func \(_i \*(\w+)Service\) (\w+)\(authToken string, ([^)]+)\) \{[^}]*return _i\.(\w+)Repository\.(\w+)\(clientId,'
$Matches = [regex]::Matches($Content, $MethodPattern)
foreach ($Match in $Matches) {
$ServiceName = $Match.Groups[1].Value
$MethodName = $Match.Groups[2].Value
$Parameters = $Match.Groups[3].Value
Write-Host "Fixing method: $MethodName"
# Create the clientId extraction logic
$ExtractionLogic = @"
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return nil, errors.New("clientId not found in auth token")
}
"@
# Replace the method opening with extraction logic
$OldMethodStart = "func (_i *${ServiceName}Service) ${MethodName}(authToken string, ${Parameters}) {"
$NewMethodStart = "func (_i *${ServiceName}Service) ${MethodName}(authToken string, ${Parameters}) {${ExtractionLogic}"
$Content = $Content -replace [regex]::Escape($OldMethodStart), $NewMethodStart
}
# Write updated content
Set-Content $FilePath $Content -NoNewline
Write-Host "All remaining clientId issues fixed."

View File

@ -0,0 +1,59 @@
# PowerShell script to fix all remaining clientId issues in article_approval_flows
# Usage: .\fix_all_article_approval_flows_final2.ps1 <file_path>
param(
[Parameter(Mandatory=$true)]
[string]$FilePath
)
if (-not (Test-Path $FilePath)) {
Write-Error "File not found: $FilePath"
exit 1
}
Write-Host "Fixing all remaining clientId issues in: $FilePath"
# Read file content
$Content = Get-Content $FilePath -Raw
# Find all methods that use clientId but don't have extraction logic
$MethodPattern = 'func \(_i \*(\w+)Service\) (\w+)\(authToken string, ([^)]+)\) \{[^}]*return _i\.(\w+)Repository\.(\w+)\(clientId,'
$Matches = [regex]::Matches($Content, $MethodPattern)
foreach ($Match in $Matches) {
$ServiceName = $Match.Groups[1].Value
$MethodName = $Match.Groups[2].Value
$Parameters = $Match.Groups[3].Value
Write-Host "Fixing method: $MethodName"
# Create the clientId extraction logic
$ExtractionLogic = @"
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return nil, errors.New("clientId not found in auth token")
}
"@
# Replace the method opening with extraction logic
$OldMethodStart = "func (_i *${ServiceName}Service) ${MethodName}(authToken string, ${Parameters}) {"
$NewMethodStart = "func (_i *${ServiceName}Service) ${MethodName}(authToken string, ${Parameters}) {${ExtractionLogic}"
$Content = $Content -replace [regex]::Escape($OldMethodStart), $NewMethodStart
}
# Write updated content
Set-Content $FilePath $Content -NoNewline
Write-Host "All remaining clientId issues fixed."

View File

@ -0,0 +1,59 @@
# PowerShell script to fix all remaining clientId issues in article_approval_flows
# Usage: .\fix_all_article_approval_flows_final3.ps1 <file_path>
param(
[Parameter(Mandatory=$true)]
[string]$FilePath
)
if (-not (Test-Path $FilePath)) {
Write-Error "File not found: $FilePath"
exit 1
}
Write-Host "Fixing all remaining clientId issues in: $FilePath"
# Read file content
$Content = Get-Content $FilePath -Raw
# Find all methods that use clientId but don't have extraction logic
$MethodPattern = 'func \(_i \*(\w+)Service\) (\w+)\(authToken string, ([^)]+)\) \{[^}]*return _i\.(\w+)Repository\.(\w+)\(clientId,'
$Matches = [regex]::Matches($Content, $MethodPattern)
foreach ($Match in $Matches) {
$ServiceName = $Match.Groups[1].Value
$MethodName = $Match.Groups[2].Value
$Parameters = $Match.Groups[3].Value
Write-Host "Fixing method: $MethodName"
# Create the clientId extraction logic
$ExtractionLogic = @"
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return nil, errors.New("clientId not found in auth token")
}
"@
# Replace the method opening with extraction logic
$OldMethodStart = "func (_i *${ServiceName}Service) ${MethodName}(authToken string, ${Parameters}) {"
$NewMethodStart = "func (_i *${ServiceName}Service) ${MethodName}(authToken string, ${Parameters}) {${ExtractionLogic}"
$Content = $Content -replace [regex]::Escape($OldMethodStart), $NewMethodStart
}
# Write updated content
Set-Content $FilePath $Content -NoNewline
Write-Host "All remaining clientId issues fixed."

View File

@ -0,0 +1,59 @@
# PowerShell script to fix all remaining clientId issues in article_approval_flows
# Usage: .\fix_all_article_approval_flows_final4.ps1 <file_path>
param(
[Parameter(Mandatory=$true)]
[string]$FilePath
)
if (-not (Test-Path $FilePath)) {
Write-Error "File not found: $FilePath"
exit 1
}
Write-Host "Fixing all remaining clientId issues in: $FilePath"
# Read file content
$Content = Get-Content $FilePath -Raw
# Find all methods that use clientId but don't have extraction logic
$MethodPattern = 'func \(_i \*(\w+)Service\) (\w+)\(authToken string, ([^)]+)\) \{[^}]*return _i\.(\w+)Repository\.(\w+)\(clientId,'
$Matches = [regex]::Matches($Content, $MethodPattern)
foreach ($Match in $Matches) {
$ServiceName = $Match.Groups[1].Value
$MethodName = $Match.Groups[2].Value
$Parameters = $Match.Groups[3].Value
Write-Host "Fixing method: $MethodName"
# Create the clientId extraction logic
$ExtractionLogic = @"
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return nil, errors.New("clientId not found in auth token")
}
"@
# Replace the method opening with extraction logic
$OldMethodStart = "func (_i *${ServiceName}Service) ${MethodName}(authToken string, ${Parameters}) {"
$NewMethodStart = "func (_i *${ServiceName}Service) ${MethodName}(authToken string, ${Parameters}) {${ExtractionLogic}"
$Content = $Content -replace [regex]::Escape($OldMethodStart), $NewMethodStart
}
# Write updated content
Set-Content $FilePath $Content -NoNewline
Write-Host "All remaining clientId issues fixed."

View File

@ -0,0 +1,59 @@
# PowerShell script to fix all remaining clientId issues in article_approval_flows
# Usage: .\fix_all_article_approval_flows_final5.ps1 <file_path>
param(
[Parameter(Mandatory=$true)]
[string]$FilePath
)
if (-not (Test-Path $FilePath)) {
Write-Error "File not found: $FilePath"
exit 1
}
Write-Host "Fixing all remaining clientId issues in: $FilePath"
# Read file content
$Content = Get-Content $FilePath -Raw
# Find all methods that use clientId but don't have extraction logic
$MethodPattern = 'func \(_i \*(\w+)Service\) (\w+)\(authToken string, ([^)]+)\) \{[^}]*return _i\.(\w+)Repository\.(\w+)\(clientId,'
$Matches = [regex]::Matches($Content, $MethodPattern)
foreach ($Match in $Matches) {
$ServiceName = $Match.Groups[1].Value
$MethodName = $Match.Groups[2].Value
$Parameters = $Match.Groups[3].Value
Write-Host "Fixing method: $MethodName"
# Create the clientId extraction logic
$ExtractionLogic = @"
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return nil, errors.New("clientId not found in auth token")
}
"@
# Replace the method opening with extraction logic
$OldMethodStart = "func (_i *${ServiceName}Service) ${MethodName}(authToken string, ${Parameters}) {"
$NewMethodStart = "func (_i *${ServiceName}Service) ${MethodName}(authToken string, ${Parameters}) {${ExtractionLogic}"
$Content = $Content -replace [regex]::Escape($OldMethodStart), $NewMethodStart
}
# Write updated content
Set-Content $FilePath $Content -NoNewline
Write-Host "All remaining clientId issues fixed."

View File

@ -0,0 +1,59 @@
# PowerShell script to fix all remaining clientId issues in article_approval_flows
# Usage: .\fix_all_article_approval_flows_final6.ps1 <file_path>
param(
[Parameter(Mandatory=$true)]
[string]$FilePath
)
if (-not (Test-Path $FilePath)) {
Write-Error "File not found: $FilePath"
exit 1
}
Write-Host "Fixing all remaining clientId issues in: $FilePath"
# Read file content
$Content = Get-Content $FilePath -Raw
# Find all methods that use clientId but don't have extraction logic
$MethodPattern = 'func \(_i \*(\w+)Service\) (\w+)\(authToken string, ([^)]+)\) \{[^}]*return _i\.(\w+)Repository\.(\w+)\(clientId,'
$Matches = [regex]::Matches($Content, $MethodPattern)
foreach ($Match in $Matches) {
$ServiceName = $Match.Groups[1].Value
$MethodName = $Match.Groups[2].Value
$Parameters = $Match.Groups[3].Value
Write-Host "Fixing method: $MethodName"
# Create the clientId extraction logic
$ExtractionLogic = @"
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return nil, errors.New("clientId not found in auth token")
}
"@
# Replace the method opening with extraction logic
$OldMethodStart = "func (_i *${ServiceName}Service) ${MethodName}(authToken string, ${Parameters}) {"
$NewMethodStart = "func (_i *${ServiceName}Service) ${MethodName}(authToken string, ${Parameters}) {${ExtractionLogic}"
$Content = $Content -replace [regex]::Escape($OldMethodStart), $NewMethodStart
}
# Write updated content
Set-Content $FilePath $Content -NoNewline
Write-Host "All remaining clientId issues fixed."

View File

@ -0,0 +1,59 @@
# PowerShell script to fix all remaining clientId issues in article_approval_flows
# Usage: .\fix_all_article_approval_flows_final7.ps1 <file_path>
param(
[Parameter(Mandatory=$true)]
[string]$FilePath
)
if (-not (Test-Path $FilePath)) {
Write-Error "File not found: $FilePath"
exit 1
}
Write-Host "Fixing all remaining clientId issues in: $FilePath"
# Read file content
$Content = Get-Content $FilePath -Raw
# Find all methods that use clientId but don't have extraction logic
$MethodPattern = 'func \(_i \*(\w+)Service\) (\w+)\(authToken string, ([^)]+)\) \{[^}]*return _i\.(\w+)Repository\.(\w+)\(clientId,'
$Matches = [regex]::Matches($Content, $MethodPattern)
foreach ($Match in $Matches) {
$ServiceName = $Match.Groups[1].Value
$MethodName = $Match.Groups[2].Value
$Parameters = $Match.Groups[3].Value
Write-Host "Fixing method: $MethodName"
# Create the clientId extraction logic
$ExtractionLogic = @"
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return nil, errors.New("clientId not found in auth token")
}
"@
# Replace the method opening with extraction logic
$OldMethodStart = "func (_i *${ServiceName}Service) ${MethodName}(authToken string, ${Parameters}) {"
$NewMethodStart = "func (_i *${ServiceName}Service) ${MethodName}(authToken string, ${Parameters}) {${ExtractionLogic}"
$Content = $Content -replace [regex]::Escape($OldMethodStart), $NewMethodStart
}
# Write updated content
Set-Content $FilePath $Content -NoNewline
Write-Host "All remaining clientId issues fixed."

View File

@ -0,0 +1,59 @@
# PowerShell script to fix all remaining clientId issues in article_approval_flows
# Usage: .\fix_all_article_approval_flows_final8.ps1 <file_path>
param(
[Parameter(Mandatory=$true)]
[string]$FilePath
)
if (-not (Test-Path $FilePath)) {
Write-Error "File not found: $FilePath"
exit 1
}
Write-Host "Fixing all remaining clientId issues in: $FilePath"
# Read file content
$Content = Get-Content $FilePath -Raw
# Find all methods that use clientId but don't have extraction logic
$MethodPattern = 'func \(_i \*(\w+)Service\) (\w+)\(authToken string, ([^)]+)\) \{[^}]*return _i\.(\w+)Repository\.(\w+)\(clientId,'
$Matches = [regex]::Matches($Content, $MethodPattern)
foreach ($Match in $Matches) {
$ServiceName = $Match.Groups[1].Value
$MethodName = $Match.Groups[2].Value
$Parameters = $Match.Groups[3].Value
Write-Host "Fixing method: $MethodName"
# Create the clientId extraction logic
$ExtractionLogic = @"
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return nil, errors.New("clientId not found in auth token")
}
"@
# Replace the method opening with extraction logic
$OldMethodStart = "func (_i *${ServiceName}Service) ${MethodName}(authToken string, ${Parameters}) {"
$NewMethodStart = "func (_i *${ServiceName}Service) ${MethodName}(authToken string, ${Parameters}) {${ExtractionLogic}"
$Content = $Content -replace [regex]::Escape($OldMethodStart), $NewMethodStart
}
# Write updated content
Set-Content $FilePath $Content -NoNewline
Write-Host "All remaining clientId issues fixed."

View File

@ -0,0 +1,59 @@
# PowerShell script to fix all remaining clientId issues in article_approval_flows
# Usage: .\fix_all_article_approval_flows_final9.ps1 <file_path>
param(
[Parameter(Mandatory=$true)]
[string]$FilePath
)
if (-not (Test-Path $FilePath)) {
Write-Error "File not found: $FilePath"
exit 1
}
Write-Host "Fixing all remaining clientId issues in: $FilePath"
# Read file content
$Content = Get-Content $FilePath -Raw
# Find all methods that use clientId but don't have extraction logic
$MethodPattern = 'func \(_i \*(\w+)Service\) (\w+)\(authToken string, ([^)]+)\) \{[^}]*return _i\.(\w+)Repository\.(\w+)\(clientId,'
$Matches = [regex]::Matches($Content, $MethodPattern)
foreach ($Match in $Matches) {
$ServiceName = $Match.Groups[1].Value
$MethodName = $Match.Groups[2].Value
$Parameters = $Match.Groups[3].Value
Write-Host "Fixing method: $MethodName"
# Create the clientId extraction logic
$ExtractionLogic = @"
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return nil, errors.New("clientId not found in auth token")
}
"@
# Replace the method opening with extraction logic
$OldMethodStart = "func (_i *${ServiceName}Service) ${MethodName}(authToken string, ${Parameters}) {"
$NewMethodStart = "func (_i *${ServiceName}Service) ${MethodName}(authToken string, ${Parameters}) {${ExtractionLogic}"
$Content = $Content -replace [regex]::Escape($OldMethodStart), $NewMethodStart
}
# Write updated content
Set-Content $FilePath $Content -NoNewline
Write-Host "All remaining clientId issues fixed."

59
fix_all_clientid.ps1 Normal file
View File

@ -0,0 +1,59 @@
# PowerShell script to fix all remaining clientId issues
# Usage: .\fix_all_clientid.ps1 <file_path>
param(
[Parameter(Mandatory=$true)]
[string]$FilePath
)
if (-not (Test-Path $FilePath)) {
Write-Error "File not found: $FilePath"
exit 1
}
Write-Host "Fixing all remaining clientId issues in: $FilePath"
# Read file content
$Content = Get-Content $FilePath -Raw
# Find all methods that use clientId but don't have extraction logic
$MethodPattern = 'func \(_i \*(\w+)Service\) (\w+)\(authToken string, ([^)]+)\) \{[^}]*return _i\.(\w+)Repository\.(\w+)\(clientId,'
$Matches = [regex]::Matches($Content, $MethodPattern)
foreach ($Match in $Matches) {
$ServiceName = $Match.Groups[1].Value
$MethodName = $Match.Groups[2].Value
$Parameters = $Match.Groups[3].Value
Write-Host "Fixing method: $MethodName"
# Create the clientId extraction logic
$ExtractionLogic = @"
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return nil, errors.New("clientId not found in auth token")
}
"@
# Replace the method opening with extraction logic
$OldMethodStart = "func (_i *${ServiceName}Service) ${MethodName}(authToken string, ${Parameters}) {"
$NewMethodStart = "func (_i *${ServiceName}Service) ${MethodName}(authToken string, ${Parameters}) {${ExtractionLogic}"
$Content = $Content -replace [regex]::Escape($OldMethodStart), $NewMethodStart
}
# Write updated content
Set-Content $FilePath $Content -NoNewline
Write-Host "All clientId issues fixed."

View File

@ -0,0 +1,59 @@
# PowerShell script to fix all clientId issues in article_approval_flows
# Usage: .\fix_article_approval_flows_clientid.ps1 <file_path>
param(
[Parameter(Mandatory=$true)]
[string]$FilePath
)
if (-not (Test-Path $FilePath)) {
Write-Error "File not found: $FilePath"
exit 1
}
Write-Host "Fixing all clientId issues in: $FilePath"
# Read file content
$Content = Get-Content $FilePath -Raw
# Find all methods that use clientId but don't have extraction logic
$MethodPattern = 'func \(_i \*(\w+)Service\) (\w+)\(authToken string, ([^)]+)\) \{[^}]*return _i\.(\w+)Repository\.(\w+)\(clientId,'
$Matches = [regex]::Matches($Content, $MethodPattern)
foreach ($Match in $Matches) {
$ServiceName = $Match.Groups[1].Value
$MethodName = $Match.Groups[2].Value
$Parameters = $Match.Groups[3].Value
Write-Host "Fixing method: $MethodName"
# Create the clientId extraction logic
$ExtractionLogic = @"
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return nil, errors.New("clientId not found in auth token")
}
"@
# Replace the method opening with extraction logic
$OldMethodStart = "func (_i *${ServiceName}Service) ${MethodName}(authToken string, ${Parameters}) {"
$NewMethodStart = "func (_i *${ServiceName}Service) ${MethodName}(authToken string, ${Parameters}) {${ExtractionLogic}"
$Content = $Content -replace [regex]::Escape($OldMethodStart), $NewMethodStart
}
# Write updated content
Set-Content $FilePath $Content -NoNewline
Write-Host "All clientId issues fixed."

View File

@ -0,0 +1,59 @@
# PowerShell script to fix all remaining clientId issues in article_approval_flows
# Usage: .\fix_remaining_article_approval_flows.ps1 <file_path>
param(
[Parameter(Mandatory=$true)]
[string]$FilePath
)
if (-not (Test-Path $FilePath)) {
Write-Error "File not found: $FilePath"
exit 1
}
Write-Host "Fixing remaining clientId issues in: $FilePath"
# Read file content
$Content = Get-Content $FilePath -Raw
# Find all methods that use clientId but don't have extraction logic
$MethodPattern = 'func \(_i \*(\w+)Service\) (\w+)\(authToken string, ([^)]+)\) \{[^}]*return _i\.(\w+)Repository\.(\w+)\(clientId,'
$Matches = [regex]::Matches($Content, $MethodPattern)
foreach ($Match in $Matches) {
$ServiceName = $Match.Groups[1].Value
$MethodName = $Match.Groups[2].Value
$Parameters = $Match.Groups[3].Value
Write-Host "Fixing method: $MethodName"
# Create the clientId extraction logic
$ExtractionLogic = @"
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return nil, errors.New("clientId not found in auth token")
}
"@
# Replace the method opening with extraction logic
$OldMethodStart = "func (_i *${ServiceName}Service) ${MethodName}(authToken string, ${Parameters}) {"
$NewMethodStart = "func (_i *${ServiceName}Service) ${MethodName}(authToken string, ${Parameters}) {${ExtractionLogic}"
$Content = $Content -replace [regex]::Escape($OldMethodStart), $NewMethodStart
}
# Write updated content
Set-Content $FilePath $Content -NoNewline
Write-Host "Remaining clientId issues fixed."

View File

@ -0,0 +1,61 @@
# PowerShell script to fix remaining clientId issues
# Usage: .\fix_remaining_clientid.ps1 <file_path>
param(
[Parameter(Mandatory=$true)]
[string]$FilePath
)
if (-not (Test-Path $FilePath)) {
Write-Error "File not found: $FilePath"
exit 1
}
Write-Host "Fixing remaining clientId issues in: $FilePath"
# Read file content
$Content = Get-Content $FilePath -Raw
# Find methods that don't have clientId extraction logic but use clientId
$MethodPattern = 'func \(_i \*(\w+)Service\) (\w+)\(authToken string, ([^)]+)\) \{[^}]*return _i\.(\w+)Repository\.(\w+)\(clientId,'
$Matches = [regex]::Matches($Content, $MethodPattern)
foreach ($Match in $Matches) {
$ServiceName = $Match.Groups[1].Value
$MethodName = $Match.Groups[2].Value
$Parameters = $Match.Groups[3].Value
$RepositoryName = $Match.Groups[4].Value
$RepositoryMethod = $Match.Groups[5].Value
Write-Host "Fixing method: $MethodName"
# Create the clientId extraction logic
$ExtractionLogic = @"
// Extract clientId from authToken
var clientId *uuid.UUID
if authToken != "" {
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepository, authToken)
if user != nil && user.ClientId != nil {
clientId = user.ClientId
_i.Log.Info().Interface("clientId", clientId).Msg("Extracted clientId from auth token")
}
}
if clientId == nil {
return nil, errors.New("clientId not found in auth token")
}
"@
# Replace the method opening with extraction logic
$OldMethodStart = "func (_i *${ServiceName}Service) ${MethodName}(authToken string, ${Parameters}) {"
$NewMethodStart = "func (_i *${ServiceName}Service) ${MethodName}(authToken string, ${Parameters}) {${ExtractionLogic}"
$Content = $Content -replace [regex]::Escape($OldMethodStart), $NewMethodStart
}
# Write updated content
Set-Content $FilePath $Content -NoNewline
Write-Host "Remaining clientId issues fixed."

View File

@ -0,0 +1,43 @@
# PowerShell script to replace clientId with authToken in method calls
# Usage: .\replace_clientid_calls.ps1 <file_path>
param(
[Parameter(Mandatory=$true)]
[string]$FilePath
)
if (-not (Test-Path $FilePath)) {
Write-Error "File not found: $FilePath"
exit 1
}
Write-Host "Replacing clientId with authToken in method calls: $FilePath"
# Read file content
$Content = Get-Content $FilePath -Raw
# Replace patterns where clientId is used as parameter to other methods
$Replacements = @(
@{
Pattern = '_i\.ValidateStepOrder\(clientId, '
Replacement = '_i.ValidateStepOrder(authToken, '
},
@{
Pattern = '_i\.ValidateStep\(clientId, '
Replacement = '_i.ValidateStep(authToken, '
},
@{
Pattern = '_i\.CanDeleteStep\(clientId, '
Replacement = '_i.CanDeleteStep(authToken, '
}
)
foreach ($Replacement in $Replacements) {
$Content = $Content -replace $Replacement.Pattern, $Replacement.Replacement
Write-Host "Replaced: $($Replacement.Pattern)"
}
# Write updated content
Set-Content $FilePath $Content -NoNewline
Write-Host "ClientId method calls replaced with authToken."

View File

@ -0,0 +1,65 @@
#!/bin/bash
# Script to remove X-Client-Key and GetClientID from all modules
# Replace with auth token approach
echo "Starting update of all modules to remove X-Client-Key..."
# List of modules to update
modules=(
"articles"
"users"
"article_categories"
"magazines"
"schedules"
"subscription"
"user_levels"
"feedbacks"
"advertisement"
"article_comments"
"article_approvals"
"article_approval_flows"
"client_approval_settings"
"bookmarks"
"approval_workflows"
"article_files"
"custom_static_pages"
"article_approval_step_logs"
"approval_workflow_steps"
"activity_logs"
)
for module in "${modules[@]}"; do
echo "Updating module: $module"
controller_file="app/module/$module/controller/${module}.controller.go"
if [ -f "$controller_file" ]; then
echo " - Updating controller: $controller_file"
# Remove X-Client-Key from Swagger docs
sed -i 's|// @Param X-Client-Key header string true "Insert the X-Client-Key"||g' "$controller_file"
sed -i 's|// @Param X-Client-Key header string false "Insert the X-Client-Key"||g' "$controller_file"
# Remove GetClientID calls
sed -i 's|clientId := middleware\.GetClientID(c)||g' "$controller_file"
sed -i 's|// Get ClientId from context||g' "$controller_file"
# Remove middleware import if no longer needed
if ! grep -q "middleware\." "$controller_file"; then
sed -i '/"netidhub-saas-be\/app\/middleware"/d' "$controller_file"
fi
echo " - Updated: $controller_file"
else
echo " - Controller not found: $controller_file"
fi
done
echo "Update completed!"
echo ""
echo "Manual steps required:"
echo "1. Update service interfaces to use authToken instead of clientId"
echo "2. Update service implementations to extract clientId from authToken"
echo "3. Update repository calls to use extracted clientId"
echo "4. Test all endpoints"

View File

@ -0,0 +1,44 @@
# PowerShell script to update service method signatures
# Usage: .\update_service_methods.ps1 <file_path>
param(
[Parameter(Mandatory=$true)]
[string]$FilePath
)
if (-not (Test-Path $FilePath)) {
Write-Error "File not found: $FilePath"
exit 1
}
Write-Host "Updating service methods in: $FilePath"
# Create backup
$BackupPath = "$FilePath.backup"
Copy-Item $FilePath $BackupPath
Write-Host "Backup created at: $BackupPath"
# Read file content
$Content = Get-Content $FilePath -Raw
# Update method signatures - replace clientId *uuid.UUID with authToken string
$Patterns = @(
@{
Pattern = 'func \(_i \*(\w+)Service\) (\w+)\(clientId \*uuid\.UUID, '
Replacement = 'func (_i *$1Service) $2(authToken string, '
},
@{
Pattern = 'func \(_i \*(\w+)Service\) (\w+)\(clientId \*uuid\.UUID\) '
Replacement = 'func (_i *$1Service) $2(authToken string) '
}
)
foreach ($Pattern in $Patterns) {
$Content = $Content -replace $Pattern.Pattern, $Pattern.Replacement
}
# Write updated content
Set-Content $FilePath $Content -NoNewline
Write-Host "Service method signatures updated."
Write-Host "Please review the changes and add clientId extraction logic manually."

30
update_service_methods.sh Normal file
View File

@ -0,0 +1,30 @@
#!/bin/bash
# Script to update all service methods from clientId *uuid.UUID to authToken string
# Usage: ./update_service_methods.sh <file_path>
if [ $# -eq 0 ]; then
echo "Usage: ./update_service_methods.sh <file_path>"
exit 1
fi
FILE_PATH=$1
if [ ! -f "$FILE_PATH" ]; then
echo "File not found: $FILE_PATH"
exit 1
fi
echo "Updating service methods in: $FILE_PATH"
# Create backup
cp "$FILE_PATH" "${FILE_PATH}.backup"
# Update method signatures
sed -i 's/func (_i \*[a-zA-Z]*Service) \([A-Za-z]*\)(clientId \*uuid\.UUID, /func (_i *\1Service) \2(authToken string, /g' "$FILE_PATH"
# Add clientId extraction logic to each method
# This is a simplified approach - in practice, you'd need more sophisticated sed patterns
echo "Service methods updated. Please review the changes and add clientId extraction logic manually."
echo "Backup created at: ${FILE_PATH}.backup"