kontenhumas-be/app/module/article_approval_flows/mapper/article_approval_flows.mapp...

255 lines
8.9 KiB
Go

package mapper
import (
"github.com/google/uuid"
"github.com/rs/zerolog"
"netidhub-saas-be/app/database/entity"
approvalWorkflowsRepository "netidhub-saas-be/app/module/approval_workflows/repository"
approvalWorkflowsResponse "netidhub-saas-be/app/module/approval_workflows/response"
res "netidhub-saas-be/app/module/article_approval_flows/response"
articleApprovalStepLogsRepository "netidhub-saas-be/app/module/article_approval_step_logs/repository"
articleApprovalStepLogsResponse "netidhub-saas-be/app/module/article_approval_step_logs/response"
articlesRepository "netidhub-saas-be/app/module/articles/repository"
articlesResponse "netidhub-saas-be/app/module/articles/response"
usersRepository "netidhub-saas-be/app/module/users/repository"
"time"
)
func ArticleApprovalFlowsResponseMapper(
log zerolog.Logger,
host string,
clientId *uuid.UUID,
articleApprovalFlowsReq *entity.ArticleApprovalFlows,
articlesRepo articlesRepository.ArticlesRepository,
approvalWorkflowsRepo approvalWorkflowsRepository.ApprovalWorkflowsRepository,
articleApprovalStepLogsRepo articleApprovalStepLogsRepository.ArticleApprovalStepLogsRepository,
usersRepo usersRepository.UsersRepository,
) (articleApprovalFlowsRes *res.ArticleApprovalFlowsResponse) {
// Get article information
var articleRes *articlesResponse.ArticlesResponse
if articleApprovalFlowsReq.ArticleId != 0 {
article, _ := articlesRepo.FindOne(clientId, articleApprovalFlowsReq.ArticleId)
if article != nil {
// Note: This would need additional repositories for full mapping
// For now, we'll create a basic response
articleRes = &articlesResponse.ArticlesResponse{
ID: article.ID,
Title: article.Title,
Slug: article.Slug,
Description: article.Description,
StatusId: article.StatusId,
IsActive: article.IsActive,
CreatedAt: article.CreatedAt,
UpdatedAt: article.UpdatedAt,
}
}
}
// Get approval workflow information
var approvalWorkflowRes *approvalWorkflowsResponse.ApprovalWorkflowsResponse
if articleApprovalFlowsReq.WorkflowId != 0 {
approvalWorkflow, _ := approvalWorkflowsRepo.FindOne(clientId, articleApprovalFlowsReq.WorkflowId)
if approvalWorkflow != nil {
// Note: This would need additional repositories for full mapping
// For now, we'll create a basic response
approvalWorkflowRes = &approvalWorkflowsResponse.ApprovalWorkflowsResponse{
ID: approvalWorkflow.ID,
Name: approvalWorkflow.Name,
Description: approvalWorkflow.Description,
IsActive: *approvalWorkflow.IsActive,
CreatedAt: approvalWorkflow.CreatedAt,
UpdatedAt: approvalWorkflow.UpdatedAt,
}
}
}
// Get step logs
var stepLogsArr []*articleApprovalStepLogsResponse.ArticleApprovalStepLogsResponse
if articleApprovalFlowsReq != nil {
// Map status ID to status string
statusStr := "pending"
switch articleApprovalFlowsReq.StatusId {
case 1:
statusStr = "pending"
case 2:
statusStr = "approved"
case 3:
statusStr = "rejected"
case 4:
statusStr = "revision_requested"
}
articleApprovalFlowsRes = &res.ArticleApprovalFlowsResponse{
ID: articleApprovalFlowsReq.ID,
ArticleID: articleApprovalFlowsReq.ArticleId,
WorkflowID: articleApprovalFlowsReq.WorkflowId,
CurrentStep: articleApprovalFlowsReq.CurrentStep,
Status: statusStr,
SubmittedBy: articleApprovalFlowsReq.SubmittedById,
SubmittedAt: articleApprovalFlowsReq.SubmittedAt,
CompletedAt: articleApprovalFlowsReq.CompletedAt,
RejectionReason: articleApprovalFlowsReq.RejectionReason,
RevisionReason: articleApprovalFlowsReq.RevisionMessage,
CreatedAt: articleApprovalFlowsReq.CreatedAt,
UpdatedAt: articleApprovalFlowsReq.UpdatedAt,
Article: articleRes,
Workflow: approvalWorkflowRes,
StepLogs: stepLogsArr,
}
}
return articleApprovalFlowsRes
}
func ArticleApprovalFlowsDetailResponseMapper(
log zerolog.Logger,
host string,
clientId *uuid.UUID,
articleApprovalFlowsReq *entity.ArticleApprovalFlows,
articlesRepo articlesRepository.ArticlesRepository,
approvalWorkflowsRepo approvalWorkflowsRepository.ApprovalWorkflowsRepository,
articleApprovalStepLogsRepo articleApprovalStepLogsRepository.ArticleApprovalStepLogsRepository,
usersRepo usersRepository.UsersRepository,
) (articleApprovalFlowsRes *res.ArticleApprovalFlowsDetailResponse) {
submittedByName := ""
if articleApprovalFlowsReq.SubmittedById != 0 {
findUser, _ := usersRepo.FindOne(clientId, articleApprovalFlowsReq.SubmittedById)
if findUser != nil {
submittedByName = findUser.Fullname
}
}
if articleApprovalFlowsReq.SubmittedById != 0 {
findUser, _ := usersRepo.FindOne(clientId, articleApprovalFlowsReq.SubmittedById)
if findUser != nil {
submittedByName = findUser.Fullname
}
}
// Get article information with full details
var articleRes *articlesResponse.ArticlesResponse
if articleApprovalFlowsReq.ArticleId != 0 {
article, _ := articlesRepo.FindOne(clientId, articleApprovalFlowsReq.ArticleId)
if article != nil {
// Note: This would need additional repositories for full mapping
// For now, we'll create a basic response
articleRes = &articlesResponse.ArticlesResponse{
ID: article.ID,
Title: article.Title,
Slug: article.Slug,
Description: article.Description,
StatusId: article.StatusId,
IsActive: article.IsActive,
CreatedAt: article.CreatedAt,
UpdatedAt: article.UpdatedAt,
}
}
}
// Get approval workflow information with full details
var approvalWorkflowRes *approvalWorkflowsResponse.ApprovalWorkflowsWithStepsResponse
if articleApprovalFlowsReq.WorkflowId != 0 {
approvalWorkflow, _ := approvalWorkflowsRepo.FindOne(clientId, articleApprovalFlowsReq.WorkflowId)
if approvalWorkflow != nil {
// Note: This would need additional repositories for full mapping
// For now, we'll create a basic response
approvalWorkflowRes = &approvalWorkflowsResponse.ApprovalWorkflowsWithStepsResponse{
ID: approvalWorkflow.ID,
Name: approvalWorkflow.Name,
Description: approvalWorkflow.Description,
IsActive: *approvalWorkflow.IsActive,
CreatedAt: approvalWorkflow.CreatedAt,
UpdatedAt: approvalWorkflow.UpdatedAt,
}
}
}
// Get step logs with detailed information
var stepLogsArr []*articleApprovalStepLogsResponse.ArticleApprovalStepLogsResponse
if articleApprovalFlowsReq != nil {
// Map status ID to status string
statusStr := "pending"
switch articleApprovalFlowsReq.StatusId {
case 1:
statusStr = "pending"
case 2:
statusStr = "approved"
case 3:
statusStr = "rejected"
case 4:
statusStr = "revision_requested"
}
articleApprovalFlowsRes = &res.ArticleApprovalFlowsDetailResponse{
ID: articleApprovalFlowsReq.ID,
ArticleID: articleApprovalFlowsReq.ArticleId,
WorkflowID: articleApprovalFlowsReq.WorkflowId,
CurrentStep: articleApprovalFlowsReq.CurrentStep,
Status: statusStr,
SubmittedBy: articleApprovalFlowsReq.SubmittedById,
SubmittedByName: submittedByName,
SubmittedAt: articleApprovalFlowsReq.SubmittedAt,
CompletedAt: articleApprovalFlowsReq.CompletedAt,
RejectionReason: articleApprovalFlowsReq.RejectionReason,
RevisionReason: articleApprovalFlowsReq.RevisionMessage,
CreatedAt: articleApprovalFlowsReq.CreatedAt,
UpdatedAt: articleApprovalFlowsReq.UpdatedAt,
Article: articleRes,
Workflow: approvalWorkflowRes,
StepLogs: stepLogsArr,
}
}
return articleApprovalFlowsRes
}
func ArticleApprovalFlowsSummaryResponseMapper(
log zerolog.Logger,
clientId *uuid.UUID,
articleApprovalFlowsReq *entity.ArticleApprovalFlows,
usersRepo usersRepository.UsersRepository,
) (articleApprovalFlowsRes *res.ArticleApprovalFlowsSummaryResponse) {
submittedByName := ""
if articleApprovalFlowsReq.SubmittedById != 0 {
findUser, _ := usersRepo.FindOne(clientId, articleApprovalFlowsReq.SubmittedById)
if findUser != nil {
submittedByName = findUser.Fullname
}
}
if articleApprovalFlowsReq != nil {
// Map status ID to status string
statusStr := "pending"
switch articleApprovalFlowsReq.StatusId {
case 1:
statusStr = "pending"
case 2:
statusStr = "approved"
case 3:
statusStr = "rejected"
case 4:
statusStr = "revision_requested"
}
// Calculate days in approval
daysInApproval := int(time.Since(articleApprovalFlowsReq.SubmittedAt).Hours() / 24)
articleApprovalFlowsRes = &res.ArticleApprovalFlowsSummaryResponse{
ID: articleApprovalFlowsReq.ID,
ArticleID: articleApprovalFlowsReq.ArticleId,
CurrentStep: articleApprovalFlowsReq.CurrentStep,
Status: statusStr,
SubmittedBy: articleApprovalFlowsReq.SubmittedById,
SubmittedByName: submittedByName,
SubmittedAt: articleApprovalFlowsReq.SubmittedAt,
DaysInApproval: daysInApproval,
}
}
return articleApprovalFlowsRes
}