mirror of
				https://github.com/abhinavxd/libredesk.git
				synced 2025-11-03 21:43:35 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			112 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			112 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package main
 | 
						|
 | 
						|
import (
 | 
						|
	"encoding/json"
 | 
						|
	"net/http"
 | 
						|
 | 
						|
	"github.com/abhinavxd/artemis/internal/attachment/models"
 | 
						|
	"github.com/abhinavxd/artemis/internal/message"
 | 
						|
	mmodels "github.com/abhinavxd/artemis/internal/message/models"
 | 
						|
	umodels "github.com/abhinavxd/artemis/internal/user/models"
 | 
						|
	"github.com/zerodha/fastglue"
 | 
						|
)
 | 
						|
 | 
						|
func handleGetMessages(r *fastglue.Request) error {
 | 
						|
	var (
 | 
						|
		app  = r.Context.(*App)
 | 
						|
		uuid = r.RequestCtx.UserValue("uuid").(string)
 | 
						|
	)
 | 
						|
 | 
						|
	messages, err := app.messageManager.GetConversationMessages(uuid)
 | 
						|
	if err != nil {
 | 
						|
		return sendErrorEnvelope(r, err)
 | 
						|
	}
 | 
						|
 | 
						|
	for i := range messages {
 | 
						|
		for j := range messages[i].Attachments {
 | 
						|
			messages[i].Attachments[j].URL = app.attachmentManager.Store.GetURL(messages[i].Attachments[j].UUID)
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return r.SendEnvelope(messages)
 | 
						|
}
 | 
						|
 | 
						|
func handleGetMessage(r *fastglue.Request) error {
 | 
						|
	var (
 | 
						|
		app  = r.Context.(*App)
 | 
						|
		uuid = r.RequestCtx.UserValue("uuid").(string)
 | 
						|
	)
 | 
						|
	messages, err := app.messageManager.GetMessage(uuid)
 | 
						|
	if err != nil {
 | 
						|
		return sendErrorEnvelope(r, err)
 | 
						|
	}
 | 
						|
	for i := range messages {
 | 
						|
		for j := range messages[i].Attachments {
 | 
						|
			messages[i].Attachments[j].URL = app.attachmentManager.Store.GetURL(messages[i].Attachments[j].UUID)
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return r.SendEnvelope(messages)
 | 
						|
}
 | 
						|
 | 
						|
func handleRetryMessage(r *fastglue.Request) error {
 | 
						|
	var (
 | 
						|
		app  = r.Context.(*App)
 | 
						|
		uuid = r.RequestCtx.UserValue("message_uuid").(string)
 | 
						|
	)
 | 
						|
	err := app.messageManager.RetryMessage(uuid)
 | 
						|
	if err != nil {
 | 
						|
		return sendErrorEnvelope(r, err)
 | 
						|
	}
 | 
						|
	return r.SendEnvelope(true)
 | 
						|
}
 | 
						|
 | 
						|
func handleSendMessage(r *fastglue.Request) error {
 | 
						|
	var (
 | 
						|
		app              = r.Context.(*App)
 | 
						|
		user             = r.RequestCtx.UserValue("user").(umodels.User)
 | 
						|
		p                = r.RequestCtx.PostArgs()
 | 
						|
		content          = p.Peek("message")
 | 
						|
		private          = p.GetBool("private")
 | 
						|
		uuid             = r.RequestCtx.UserValue("uuid").(string)
 | 
						|
		attachmentsUUIDs = []string{}
 | 
						|
		attachmentsJSON  = p.Peek("attachments")
 | 
						|
		attachments      = make(models.Attachments, 0, len(attachmentsUUIDs))
 | 
						|
	)
 | 
						|
 | 
						|
	if err := json.Unmarshal(attachmentsJSON, &attachmentsUUIDs); err != nil {
 | 
						|
		app.lo.Error("error unmarshalling attachments uuids", "error", err)
 | 
						|
		return r.SendErrorEnvelope(http.StatusInternalServerError, "error parsing attachments", nil, "")
 | 
						|
	}
 | 
						|
	for _, attUUID := range attachmentsUUIDs {
 | 
						|
		attachments = append(attachments, models.Attachment{
 | 
						|
			UUID: attUUID,
 | 
						|
		})
 | 
						|
	}
 | 
						|
 | 
						|
	msg := mmodels.Message{
 | 
						|
		ConversationUUID: uuid,
 | 
						|
		SenderID:         user.ID,
 | 
						|
		Type:             message.TypeOutgoing,
 | 
						|
		SenderType:       message.SenderTypeUser,
 | 
						|
		Status:           message.StatusPending,
 | 
						|
		Content:          string(content),
 | 
						|
		ContentType:      message.ContentTypeHTML,
 | 
						|
		Private:          private,
 | 
						|
		Attachments:      attachments,
 | 
						|
	}
 | 
						|
 | 
						|
	if err := app.messageManager.RecordMessage(&msg); err != nil {
 | 
						|
		return sendErrorEnvelope(r, err)
 | 
						|
	}
 | 
						|
 | 
						|
	app.conversationManager.AddParticipant(user.ID, uuid)
 | 
						|
 | 
						|
	// Update conversation meta with the last message details.
 | 
						|
	trimmedMessage := app.messageManager.TrimMsg(msg.Content)
 | 
						|
	app.conversationManager.UpdateLastMessage(0, uuid, trimmedMessage, msg.CreatedAt)
 | 
						|
 | 
						|
	// Send WS update.
 | 
						|
	app.messageManager.BroadcastNewConversationMessage(msg, trimmedMessage)
 | 
						|
 | 
						|
	return r.SendEnvelope(true)
 | 
						|
}
 |