106 lines
3.0 KiB
Go
106 lines
3.0 KiB
Go
|
|
package mapper
|
||
|
|
|
||
|
|
import (
|
||
|
|
"narasi-ahli-be/app/database/entity"
|
||
|
|
"narasi-ahli-be/app/module/chat/response"
|
||
|
|
)
|
||
|
|
|
||
|
|
// Chat Session Mapper
|
||
|
|
func ChatSessionResponseMapper(chatSession *entity.ChatSessions) *response.ChatSessionResponse {
|
||
|
|
result := &response.ChatSessionResponse{
|
||
|
|
ID: chatSession.ID,
|
||
|
|
Name: chatSession.Name,
|
||
|
|
Type: chatSession.Type,
|
||
|
|
CreatedBy: chatSession.CreatedBy,
|
||
|
|
CreatedAt: chatSession.CreatedAt,
|
||
|
|
UpdatedAt: chatSession.UpdatedAt,
|
||
|
|
}
|
||
|
|
|
||
|
|
if chatSession.Creator != nil {
|
||
|
|
result.Creator = &response.UserBasicInfo{
|
||
|
|
ID: chatSession.Creator.ID,
|
||
|
|
Username: chatSession.Creator.Username,
|
||
|
|
Fullname: chatSession.Creator.Fullname,
|
||
|
|
Email: chatSession.Creator.Email,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Map participants
|
||
|
|
if len(chatSession.Participants) > 0 {
|
||
|
|
for _, participant := range chatSession.Participants {
|
||
|
|
if participant.IsActive {
|
||
|
|
result.Participants = append(result.Participants, ChatParticipantResponseMapper(participant))
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Map last message
|
||
|
|
if len(chatSession.Messages) > 0 {
|
||
|
|
// Find the latest message that is not deleted
|
||
|
|
var lastMessage *entity.ChatMessages
|
||
|
|
for _, message := range chatSession.Messages {
|
||
|
|
if !message.IsDeleted && (lastMessage == nil || message.CreatedAt.After(lastMessage.CreatedAt)) {
|
||
|
|
lastMessage = message
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if lastMessage != nil {
|
||
|
|
result.LastMessage = ChatMessageResponseMapper(lastMessage)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return result
|
||
|
|
}
|
||
|
|
|
||
|
|
// Chat Message Mapper
|
||
|
|
func ChatMessageResponseMapper(chatMessage *entity.ChatMessages) *response.ChatMessageResponse {
|
||
|
|
result := &response.ChatMessageResponse{
|
||
|
|
ID: chatMessage.ID,
|
||
|
|
ChatSessionID: chatMessage.ChatSessionID,
|
||
|
|
SenderID: chatMessage.SenderID,
|
||
|
|
Message: chatMessage.Message,
|
||
|
|
MessageType: chatMessage.MessageType,
|
||
|
|
IsEdited: chatMessage.IsEdited,
|
||
|
|
EditedAt: chatMessage.EditedAt,
|
||
|
|
IsDeleted: chatMessage.IsDeleted,
|
||
|
|
DeletedAt: chatMessage.DeletedAt,
|
||
|
|
CreatedAt: chatMessage.CreatedAt,
|
||
|
|
UpdatedAt: chatMessage.UpdatedAt,
|
||
|
|
}
|
||
|
|
|
||
|
|
if chatMessage.Sender != nil {
|
||
|
|
result.Sender = &response.UserBasicInfo{
|
||
|
|
ID: chatMessage.Sender.ID,
|
||
|
|
Username: chatMessage.Sender.Username,
|
||
|
|
Fullname: chatMessage.Sender.Fullname,
|
||
|
|
Email: chatMessage.Sender.Email,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return result
|
||
|
|
}
|
||
|
|
|
||
|
|
// Chat Participant Mapper
|
||
|
|
func ChatParticipantResponseMapper(chatParticipant *entity.ChatParticipants) *response.ChatParticipantResponse {
|
||
|
|
result := &response.ChatParticipantResponse{
|
||
|
|
ID: chatParticipant.ID,
|
||
|
|
ChatSessionID: chatParticipant.ChatSessionID,
|
||
|
|
UserID: chatParticipant.UserID,
|
||
|
|
JoinedAt: chatParticipant.JoinedAt,
|
||
|
|
LeftAt: chatParticipant.LeftAt,
|
||
|
|
IsActive: chatParticipant.IsActive,
|
||
|
|
CreatedAt: chatParticipant.CreatedAt,
|
||
|
|
UpdatedAt: chatParticipant.UpdatedAt,
|
||
|
|
}
|
||
|
|
|
||
|
|
if chatParticipant.User != nil {
|
||
|
|
result.User = &response.UserBasicInfo{
|
||
|
|
ID: chatParticipant.User.ID,
|
||
|
|
Username: chatParticipant.User.Username,
|
||
|
|
Fullname: chatParticipant.User.Fullname,
|
||
|
|
Email: chatParticipant.User.Email,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return result
|
||
|
|
}
|