narasiahli-be/app/module/chat/mapper/chat_schedule.mapper.go

178 lines
5.5 KiB
Go
Raw Normal View History

2025-09-22 18:47:06 +00:00
package mapper
import (
"narasi-ahli-be/app/database/entity"
"narasi-ahli-be/app/module/chat/request"
"narasi-ahli-be/app/module/chat/response"
)
// ChatScheduleResponse - Response structure for chat schedule
type ChatScheduleResponse struct {
ID uint `json:"id"`
ChatSessionID uint `json:"chat_session_id"`
Title string `json:"title"`
Description string `json:"description"`
Summary string `json:"summary"`
ScheduledAt string `json:"scheduled_at"`
Duration int `json:"duration"`
Status string `json:"status"`
IsReminderSent bool `json:"is_reminder_sent"`
ReminderSentAt *string `json:"reminder_sent_at"`
CreatedBy uint `json:"created_by"`
CreatedAt string `json:"created_at"`
UpdatedAt string `json:"updated_at"`
ChatSession *response.ChatSessionResponse `json:"chat_session,omitempty"`
Creator *response.UserBasicInfo `json:"creator,omitempty"`
Files []*response.ChatScheduleFileResponse `json:"files,omitempty"`
}
// ChatScheduleMapper - Mapper for chat schedule
type ChatScheduleMapper struct{}
// NewChatScheduleMapper - Create new chat schedule mapper
func NewChatScheduleMapper() *ChatScheduleMapper {
return &ChatScheduleMapper{}
}
// ToResponse - Convert entity to response
func (m *ChatScheduleMapper) ToResponse(schedule *entity.ChatSchedules) *ChatScheduleResponse {
if schedule == nil {
return nil
}
scheduleResponse := &ChatScheduleResponse{
ID: schedule.ID,
ChatSessionID: schedule.ChatSessionID,
Title: schedule.Title,
Description: schedule.Description,
Summary: schedule.Summary,
ScheduledAt: schedule.ScheduledAt.Format("2006-01-02T15:04:05Z07:00"),
Duration: schedule.Duration,
Status: schedule.Status,
IsReminderSent: schedule.IsReminderSent,
CreatedBy: schedule.CreatedBy,
CreatedAt: schedule.CreatedAt.Format("2006-01-02T15:04:05Z07:00"),
UpdatedAt: schedule.UpdatedAt.Format("2006-01-02T15:04:05Z07:00"),
}
if schedule.ReminderSentAt != nil {
reminderSentAt := schedule.ReminderSentAt.Format("2006-01-02T15:04:05Z07:00")
scheduleResponse.ReminderSentAt = &reminderSentAt
}
// Map chat session
if schedule.ChatSession != nil {
scheduleResponse.ChatSession = ChatSessionResponseMapper(schedule.ChatSession)
}
// Map creator
if schedule.Creator != nil {
scheduleResponse.Creator = &response.UserBasicInfo{
ID: schedule.Creator.ID,
Username: schedule.Creator.Username,
Fullname: schedule.Creator.Fullname,
Email: schedule.Creator.Email,
}
}
// Map files
if len(schedule.Files) > 0 {
scheduleResponse.Files = make([]*response.ChatScheduleFileResponse, len(schedule.Files))
for i, file := range schedule.Files {
scheduleResponse.Files[i] = m.ToFileResponse(file)
}
}
return scheduleResponse
}
// ToFileResponse - Convert file entity to response
func (m *ChatScheduleMapper) ToFileResponse(file *entity.ChatScheduleFiles) *response.ChatScheduleFileResponse {
if file == nil {
return nil
}
return &response.ChatScheduleFileResponse{
ID: file.ID,
ChatScheduleID: file.ChatScheduleID,
FileName: file.FileName,
OriginalName: file.OriginalName,
FilePath: file.FilePath,
FileSize: file.FileSize,
MimeType: file.MimeType,
FileType: file.FileType,
Description: file.Description,
IsRequired: file.IsRequired,
CreatedAt: file.CreatedAt.Format("2006-01-02T15:04:05Z07:00"),
UpdatedAt: file.UpdatedAt.Format("2006-01-02T15:04:05Z07:00"),
}
}
// ToEntity - Convert request to entity
func (m *ChatScheduleMapper) ToEntity(req request.ChatScheduleCreateRequest) *entity.ChatSchedules {
schedule := &entity.ChatSchedules{
2025-09-23 22:21:47 +00:00
Title: req.Title,
Description: req.Description,
Summary: req.Summary,
ScheduledAt: req.ScheduledAt,
Duration: req.Duration,
Status: "scheduled",
}
// Handle ChatSessionID pointer
if req.ChatSessionID != nil {
schedule.ChatSessionID = *req.ChatSessionID
2025-09-22 18:47:06 +00:00
}
// Files will be attached separately using file IDs
return schedule
}
// ToUpdateEntity - Convert update request to entity
func (m *ChatScheduleMapper) ToUpdateEntity(req request.ChatScheduleUpdateRequest) *entity.ChatSchedules {
schedule := &entity.ChatSchedules{}
if req.Title != "" {
schedule.Title = req.Title
}
if req.Description != "" {
schedule.Description = req.Description
}
if req.Summary != "" {
schedule.Summary = req.Summary
}
if !req.ScheduledAt.IsZero() {
schedule.ScheduledAt = req.ScheduledAt
}
if req.Duration > 0 {
schedule.Duration = req.Duration
}
if req.Status != "" {
schedule.Status = req.Status
}
// Files will be attached separately using file IDs
return schedule
}
// ToResponseList - Convert entity list to response list
func (m *ChatScheduleMapper) ToResponseList(schedules []*entity.ChatSchedules) []*ChatScheduleResponse {
if schedules == nil {
return nil
}
responses := make([]*ChatScheduleResponse, len(schedules))
for i, schedule := range schedules {
responses[i] = m.ToResponse(schedule)
}
return responses
}