From 37b3c4abcc4f8d4dc5ba1d709823f8419151bd15 Mon Sep 17 00:00:00 2001 From: Abhinav Raut Date: Tue, 4 Feb 2025 00:08:51 +0530 Subject: [PATCH] feat: adds waiting since in API responses and structs. chore: rename senderTypeUser to senderTypeAgent to keep naming consistent. --- internal/conversation/message.go | 8 ++++---- internal/conversation/models/models.go | 1 + internal/conversation/queries.sql | 22 +++++++++++++--------- schema.sql | 2 +- 4 files changed, 19 insertions(+), 14 deletions(-) diff --git a/internal/conversation/message.go b/internal/conversation/message.go index ad79971..57269f4 100644 --- a/internal/conversation/message.go +++ b/internal/conversation/message.go @@ -30,7 +30,7 @@ const ( MessageOutgoing = "outgoing" MessageActivity = "activity" - SenderTypeUser = "user" + SenderTypeAgent = "agent" SenderTypeContact = "contact" MessageStatusPending = "pending" @@ -282,7 +282,7 @@ func (m *Manager) SendPrivateNote(media []mmodels.Media, senderID int, conversat ConversationUUID: conversationUUID, SenderID: senderID, Type: MessageOutgoing, - SenderType: SenderTypeUser, + SenderType: SenderTypeAgent, Status: MessageStatusSent, Content: content, ContentType: ContentTypeHTML, @@ -313,7 +313,7 @@ func (m *Manager) SendReply(media []mmodels.Media, senderID int, conversationUUI ConversationUUID: conversationUUID, SenderID: senderID, Type: MessageOutgoing, - SenderType: SenderTypeUser, + SenderType: SenderTypeAgent, Status: MessageStatusPending, Content: content, ContentType: ContentTypeHTML, @@ -418,7 +418,7 @@ func (m *Manager) InsertConversationActivity(activityType, conversationUUID, new ConversationUUID: conversationUUID, Private: true, SenderID: actor.ID, - SenderType: SenderTypeUser, + SenderType: SenderTypeAgent, } if err := m.InsertMessage(&message); err != nil { diff --git a/internal/conversation/models/models.go b/internal/conversation/models/models.go index f9b280c..091152e 100644 --- a/internal/conversation/models/models.go +++ b/internal/conversation/models/models.go @@ -46,6 +46,7 @@ type Conversation struct { AssignedUserID null.Int `db:"assigned_user_id" json:"assigned_user_id"` AssignedTeamID null.Int `db:"assigned_team_id" json:"assigned_team_id"` AssigneeLastSeenAt null.Time `db:"assignee_last_seen_at" json:"assignee_last_seen_at"` + WaitingSince null.Time `db:"waiting_since" json:"waiting_since"` Subject null.String `db:"subject" json:"subject"` UnreadMessageCount int `db:"unread_message_count" json:"unread_message_count"` InboxName string `db:"inbox_name" json:"inbox_name"` diff --git a/internal/conversation/queries.sql b/internal/conversation/queries.sql index 9bad597..5cbf28c 100644 --- a/internal/conversation/queries.sql +++ b/internal/conversation/queries.sql @@ -32,6 +32,7 @@ SELECT conversations.created_at, conversations.updated_at, conversations.uuid, + conversations.waiting_since, conversations.assignee_last_seen_at, users.created_at as "contact.created_at", users.updated_at as "contact.updated_at", @@ -96,6 +97,7 @@ SELECT c.uuid, c.reference_number, c.first_reply_at, + c.waiting_since, c.assigned_user_id, c.assigned_team_id, c.subject, @@ -461,16 +463,18 @@ inserted_msg AS ( $1, $2, (SELECT id FROM conversation_id), $5, $6, $7, $8, $9, $10, $11, $12 ) - RETURNING id, uuid, created_at + RETURNING id, uuid, created_at, conversation_id +), +updated_conversation AS ( + UPDATE conversations + SET waiting_since = CASE + WHEN $8 = 'contact' THEN NOW() + WHEN $8 = 'agent' THEN NULL + ELSE waiting_since + END + WHERE id = (SELECT id FROM conversation_id) ) -UPDATE conversations -SET waiting_since = CASE - WHEN $8 = 'contact' THEN NOW() - WHEN $8 = 'agent' THEN NULL - ELSE waiting_since -END -WHERE id = (SELECT id FROM conversation_id) -RETURNING (SELECT * FROM inserted_msg); +SELECT id, uuid, created_at FROM inserted_msg; -- name: message-exists-by-source-id SELECT conversation_id diff --git a/schema.sql b/schema.sql index 77a4203..5b4021d 100644 --- a/schema.sql +++ b/schema.sql @@ -2,7 +2,7 @@ CREATE EXTENSION IF NOT EXISTS pg_trgm; DROP TYPE IF EXISTS "channels" CASCADE; CREATE TYPE "channels" AS ENUM ('email'); DROP TYPE IF EXISTS "message_type" CASCADE; CREATE TYPE "message_type" AS ENUM ('incoming','outgoing','activity'); -DROP TYPE IF EXISTS "message_sender_type" CASCADE; CREATE TYPE "message_sender_type" AS ENUM ('user','contact'); +DROP TYPE IF EXISTS "message_sender_type" CASCADE; CREATE TYPE "message_sender_type" AS ENUM ('agent','contact'); DROP TYPE IF EXISTS "message_status" CASCADE; CREATE TYPE "message_status" AS ENUM ('received','sent','failed','pending'); DROP TYPE IF EXISTS "content_type" CASCADE; CREATE TYPE "content_type" AS ENUM ('text','html'); DROP TYPE IF EXISTS "conversation_assignment_type" CASCADE; CREATE TYPE "conversation_assignment_type" AS ENUM ('Round robin','Manual');