narasiahli-be/app/module/chat/request/chat.request.go

123 lines
3.3 KiB
Go
Raw Normal View History

2025-09-22 13:05:40 +00:00
package request
import (
"narasi-ahli-be/app/database/entity"
"narasi-ahli-be/utils/paginator"
"strconv"
"time"
)
// Chat Session Requests
type ChatSessionQueryRequest struct {
Type *string `json:"type"` // 'personal' or 'group'
Pagination *paginator.Pagination `json:"pagination"`
}
type ChatSessionCreateRequest struct {
Name *string `json:"name" validate:"omitempty,min=2,max=255"` // null for personal chat
Type string `json:"type" validate:"required,oneof=personal group"`
UserIDs []uint `json:"userIds" validate:"required,min=1"` // participants (excluding creator)
}
func (req ChatSessionCreateRequest) ToEntity(createdBy uint) *entity.ChatSessions {
return &entity.ChatSessions{
Name: req.Name,
Type: req.Type,
CreatedBy: createdBy,
}
}
type ChatSessionUpdateRequest struct {
Name *string `json:"name" validate:"omitempty,min=2,max=255"`
}
func (req ChatSessionUpdateRequest) ToEntity() *entity.ChatSessions {
return &entity.ChatSessions{
Name: req.Name,
}
}
type ChatSessionQueryRequestContext struct {
Type string `json:"type"`
}
func (req ChatSessionQueryRequestContext) ToParamRequest() ChatSessionQueryRequest {
var request ChatSessionQueryRequest
if chatType := req.Type; chatType != "" {
request.Type = &chatType
}
return request
}
// Chat Message Requests
type ChatMessageQueryRequest struct {
ChatSessionID uint `json:"chatSessionId" validate:"required"`
UserID uint `json:"userId"` // Will be set in service layer
Pagination *paginator.Pagination `json:"pagination"`
}
type ChatMessageCreateRequest struct {
ChatSessionID uint `json:"chatSessionId" validate:"required"`
Message string `json:"message" validate:"required,min=1,max=1000"`
MessageType string `json:"messageType" validate:"omitempty,oneof=text image file user assistant"`
}
func (req ChatMessageCreateRequest) ToEntity(senderID uint) *entity.ChatMessages {
messageType := req.MessageType
if messageType == "" {
messageType = "text"
}
return &entity.ChatMessages{
ChatSessionID: req.ChatSessionID,
SenderID: senderID,
Message: req.Message,
MessageType: messageType,
}
}
type ChatMessageUpdateRequest struct {
Message string `json:"message" validate:"required,min=1,max=1000"`
}
func (req ChatMessageUpdateRequest) ToEntity() *entity.ChatMessages {
return &entity.ChatMessages{
Message: req.Message,
IsEdited: true,
EditedAt: &time.Time{},
}
}
type ChatMessageQueryRequestContext struct {
ChatSessionID string `json:"chatSessionId"`
}
func (req ChatMessageQueryRequestContext) ToParamRequest() ChatMessageQueryRequest {
var request ChatMessageQueryRequest
if chatSessionId := req.ChatSessionID; chatSessionId != "" {
chatSessionIdUint, err := strconv.ParseUint(chatSessionId, 10, 0)
if err == nil {
request.ChatSessionID = uint(chatSessionIdUint)
}
}
return request
}
// Chat Participant Requests
type ChatParticipantCreateRequest struct {
ChatSessionID uint `json:"chatSessionId" validate:"required"`
UserID uint `json:"userId" validate:"required"`
}
func (req ChatParticipantCreateRequest) ToEntity() *entity.ChatParticipants {
return &entity.ChatParticipants{
ChatSessionID: req.ChatSessionID,
UserID: req.UserID,
IsActive: true,
}
}