Skip to content

Commit 80a2c2c

Browse files
committed
Add thread status to the UI
1 parent 48eb633 commit 80a2c2c

File tree

4 files changed

+87
-12
lines changed

4 files changed

+87
-12
lines changed

api/pkg/entities/message_thread.go

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,18 @@ import (
88

99
// MessageThread represents a message thread between 2 phone numbers
1010
type MessageThread struct {
11-
ID uuid.UUID `json:"id" gorm:"primaryKey;type:uuid;" example:"32343a19-da5e-4b1b-a767-3298a73703ca"`
12-
Owner string `json:"owner" example:"+18005550199"`
13-
Contact string `json:"contact" example:"+18005550100"`
14-
IsArchived bool `json:"is_archived" example:"false"`
15-
UserID UserID `json:"user_id" example:"WB7DRDWrJZRGbYrv2CKGkqbzvqdC"`
16-
Color string `json:"color" example:"indigo"`
17-
LastMessageContent string `json:"last_message_content" example:"This is a sample message content"`
18-
LastMessageID uuid.UUID `json:"last_message_id" example:"32343a19-da5e-4b1b-a767-3298a73703ca"`
19-
CreatedAt time.Time `json:"created_at" example:"2022-06-05T14:26:09.527976+03:00"`
20-
UpdatedAt time.Time `json:"updated_at" example:"2022-06-05T14:26:09.527976+03:00"`
21-
OrderTimestamp time.Time `json:"order_timestamp" gorm:"index:idx_message_threads_order_timestamp" example:"2022-06-05T14:26:09.527976+03:00"`
11+
ID uuid.UUID `json:"id" gorm:"primaryKey;type:uuid;" example:"32343a19-da5e-4b1b-a767-3298a73703ca"`
12+
Owner string `json:"owner" example:"+18005550199"`
13+
Contact string `json:"contact" example:"+18005550100"`
14+
IsArchived bool `json:"is_archived" example:"false"`
15+
UserID UserID `json:"user_id" example:"WB7DRDWrJZRGbYrv2CKGkqbzvqdC"`
16+
Color string `json:"color" example:"indigo"`
17+
Status MessageStatus `json:"status" example:"PENDING"`
18+
LastMessageContent string `json:"last_message_content" example:"This is a sample message content"`
19+
LastMessageID uuid.UUID `json:"last_message_id" example:"32343a19-da5e-4b1b-a767-3298a73703ca"`
20+
CreatedAt time.Time `json:"created_at" example:"2022-06-05T14:26:09.527976+03:00"`
21+
UpdatedAt time.Time `json:"updated_at" example:"2022-06-05T14:26:09.527976+03:00"`
22+
OrderTimestamp time.Time `json:"order_timestamp" gorm:"index:idx_message_threads_order_timestamp" example:"2022-06-05T14:26:09.527976+03:00"`
2223
}
2324

2425
// Update a message thread after a message event

api/pkg/listeners/message_thread_listener.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import (
44
"context"
55
"fmt"
66

7+
"github.com/NdoleStudio/httpsms/pkg/entities"
8+
79
"github.com/NdoleStudio/httpsms/pkg/events"
810
"github.com/NdoleStudio/httpsms/pkg/services"
911
"github.com/NdoleStudio/httpsms/pkg/telemetry"
@@ -38,6 +40,7 @@ func NewMessageThreadListener(
3840
events.EventTypeMessageSendFailed: l.OnMessagePhoneFailed,
3941
events.EventTypeMessagePhoneReceived: l.OnMessagePhoneReceived,
4042
events.EventTypeMessageNotificationScheduled: l.onMessageNotificationScheduled,
43+
events.EventTypeMessageSendExpired: l.onMessageExpired,
4144
}
4245
}
4346

@@ -56,6 +59,7 @@ func (listener *MessageThreadListener) OnMessageAPISent(ctx context.Context, eve
5659
Owner: payload.Owner,
5760
Contact: payload.Contact,
5861
UserID: payload.UserID,
62+
Status: entities.MessageStatusSent,
5963
Timestamp: payload.RequestReceivedAt,
6064
Content: payload.Content,
6165
MessageID: payload.MessageID,
@@ -84,6 +88,7 @@ func (listener *MessageThreadListener) OnMessagePhoneSending(ctx context.Context
8488
Owner: payload.Owner,
8589
UserID: payload.UserID,
8690
Contact: payload.Contact,
91+
Status: entities.MessageStatusSending,
8792
Timestamp: payload.Timestamp,
8893
Content: payload.Content,
8994
MessageID: payload.ID,
@@ -112,6 +117,7 @@ func (listener *MessageThreadListener) OnMessagePhoneSent(ctx context.Context, e
112117
Owner: payload.Owner,
113118
Contact: payload.Contact,
114119
UserID: payload.UserID,
120+
Status: entities.MessageStatusSent,
115121
Timestamp: payload.Timestamp,
116122
Content: payload.Content,
117123
MessageID: payload.ID,
@@ -140,6 +146,7 @@ func (listener *MessageThreadListener) OnMessagePhoneDelivered(ctx context.Conte
140146
Owner: payload.Owner,
141147
UserID: payload.UserID,
142148
Contact: payload.Contact,
149+
Status: entities.MessageStatusDelivered,
143150
Timestamp: payload.Timestamp,
144151
Content: payload.Content,
145152
MessageID: payload.ID,
@@ -168,6 +175,7 @@ func (listener *MessageThreadListener) OnMessagePhoneFailed(ctx context.Context,
168175
Owner: payload.Owner,
169176
Contact: payload.Contact,
170177
UserID: payload.UserID,
178+
Status: entities.MessageStatusFailed,
171179
Timestamp: payload.Timestamp,
172180
Content: payload.Content,
173181
MessageID: payload.ID,
@@ -197,6 +205,7 @@ func (listener *MessageThreadListener) OnMessagePhoneReceived(ctx context.Contex
197205
Contact: payload.Contact,
198206
Timestamp: payload.Timestamp,
199207
UserID: payload.UserID,
208+
Status: entities.MessageStatusReceived,
200209
Content: payload.Content,
201210
MessageID: payload.MessageID,
202211
}
@@ -226,6 +235,36 @@ func (listener *MessageThreadListener) onMessageNotificationScheduled(ctx contex
226235
Timestamp: payload.ScheduledAt,
227236
UserID: payload.UserID,
228237
Content: payload.Content,
238+
Status: entities.MessageStatusScheduled,
239+
MessageID: payload.MessageID,
240+
}
241+
242+
if err := listener.service.UpdateThread(ctx, updateParams); err != nil {
243+
msg := fmt.Sprintf("cannot update thread for message with ID [%s] for event with ID [%s]", updateParams.MessageID, event.ID())
244+
return listener.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
245+
}
246+
247+
return nil
248+
}
249+
250+
// onMessageNotificationScheduled handles the events.EventTypeMessageNotificationScheduled event
251+
func (listener *MessageThreadListener) onMessageExpired(ctx context.Context, event cloudevents.Event) error {
252+
ctx, span := listener.tracer.Start(ctx)
253+
defer span.End()
254+
255+
var payload events.MessageSendExpiredPayload
256+
if err := event.DataAs(&payload); err != nil {
257+
msg := fmt.Sprintf("cannot decode [%s] into [%T]", event.Data(), payload)
258+
return listener.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
259+
}
260+
261+
updateParams := services.MessageThreadUpdateParams{
262+
Owner: payload.Owner,
263+
Contact: payload.Contact,
264+
Timestamp: payload.Timestamp,
265+
UserID: payload.UserID,
266+
Content: payload.Content,
267+
Status: entities.MessageStatusExpired,
229268
MessageID: payload.MessageID,
230269
}
231270

api/pkg/services/message_thread_service.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ func NewMessageThreadService(
3636
// MessageThreadUpdateParams are parameters for updating a thread
3737
type MessageThreadUpdateParams struct {
3838
Owner string
39+
Status entities.MessageStatus
3940
Contact string
4041
Content string
4142
UserID entities.UserID
@@ -118,6 +119,7 @@ func (service *MessageThreadService) createThread(ctx context.Context, params Me
118119
IsArchived: false,
119120
Color: service.getColor(),
120121
LastMessageContent: params.Content,
122+
Status: params.Status,
121123
LastMessageID: params.MessageID,
122124
CreatedAt: time.Now().UTC(),
123125
UpdatedAt: time.Now().UTC(),

web/components/MessageThread.vue

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,29 @@
8989
<v-list-item-action-text>
9090
{{ threadDate(thread.order_timestamp) }}
9191
</v-list-item-action-text>
92+
<v-icon
93+
v-if="thread.status === 'expired'"
94+
color="warning"
95+
class="mt-n2"
96+
>{{ mdiAlert }}</v-icon
97+
>
98+
<v-icon
99+
v-else-if="thread.status === 'delivered'"
100+
color="primary"
101+
class="mt-n6"
102+
>
103+
{{ mdiCheckAll }}
104+
</v-icon>
105+
<v-icon v-else-if="thread.status === 'sent'" class="mt-n6">
106+
{{ mdiCheck }}
107+
</v-icon>
108+
<v-icon
109+
v-else-if="thread.status === 'failed'"
110+
color="error"
111+
class="mt-n2"
112+
>
113+
{{ mdiAlert }}
114+
</v-icon>
92115
</v-list-item-action>
93116
</v-list-item>
94117
</template>
@@ -99,13 +122,23 @@
99122

100123
<script lang="ts">
101124
import { Vue, Component } from 'vue-property-decorator'
102-
import { mdiPlus, mdiDownload, mdiAccount } from '@mdi/js'
125+
import {
126+
mdiPlus,
127+
mdiDownload,
128+
mdiCheckAll,
129+
mdiCheck,
130+
mdiAlert,
131+
mdiAccount,
132+
} from '@mdi/js'
103133
104134
@Component
105135
export default class MessageThread extends Vue {
106136
mdiPlus = mdiPlus
107137
mdiDownload = mdiDownload
108138
mdiAccount = mdiAccount
139+
mdiAlert = mdiAlert
140+
mdiCheck = mdiCheck
141+
mdiCheckAll = mdiCheckAll
109142
110143
get threads(): Array<MessageThread> {
111144
return this.$store.getters.getThreads

0 commit comments

Comments
 (0)