-
Notifications
You must be signed in to change notification settings - Fork 0
/
messages.go
102 lines (87 loc) · 2.2 KB
/
messages.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package repository
import (
"context"
"time"
"entgo.io/ent/dialect/sql"
"github.com/hnpatil/messages/entity"
"github.com/hnpatil/messages/entity/conversation"
"github.com/hnpatil/messages/entity/message"
"github.com/hnpatil/messages/entity/user"
)
type messagesImpl struct {
db *entity.Client
}
func NewMessages(db *entity.Client) Messages {
return &messagesImpl{
db: db,
}
}
func (m *messagesImpl) CreateMessage(ctx context.Context, message *entity.Message, convID string) (*entity.Message, error) {
tx, err := m.db.Tx(ctx)
if err != nil {
return nil, err
}
now := time.Now()
conv, err := tx.Conversation.Create().
SetConversationID(convID).
SetUpdatedAt(now).
SetPreview(message.Text).
OnConflict(sql.ConflictColumns(conversation.FieldConversationID)).
UpdateNewValues().
ID(ctx)
if err != nil {
return nil, err
}
msg, err := tx.Message.Create().
SetText(message.Text).
SetSender(message.Edges.Sender).
SetRecipient(message.Edges.Recipient).
SetCreatedAt(now).
SetConversationID(conv).
Save(ctx)
if err != nil {
return nil, err
}
msg.Edges.Sender = message.Edges.Sender
msg.Edges.Recipient = message.Edges.Recipient
if err = tx.Commit(); err != nil {
return nil, err
}
return msg, err
}
func (m *messagesImpl) ListConversations(ctx context.Context, usr *entity.User) ([]*entity.Conversation, error) {
return m.db.Conversation.Query().
Where(
conversation.HasMessagesWith(
message.Or(
message.HasRecipientWith(user.ID(usr.ID)),
message.HasSenderWith(user.ID(usr.ID)),
),
),
).
Order(conversation.ByUpdatedAt(
sql.OrderDesc(),
)).WithMessages(func(mq *entity.MessageQuery) {
mq.WithSender().
WithRecipient().
Order(message.ByCreatedAt(sql.OrderDesc())).
Limit(1)
}).
All(ctx)
}
func (m *messagesImpl) ListMessages(ctx context.Context, usr *entity.User, convID string) ([]*entity.Message, error) {
return m.db.Message.Query().
Where(
message.HasConversationWith(conversation.ConversationID(convID)),
message.Or(
message.HasRecipientWith(user.ID(usr.ID)),
message.HasSenderWith(user.ID(usr.ID)),
),
).
WithSender().
WithRecipient().
Order(message.ByCreatedAt(
sql.OrderDesc(),
)).
All(ctx)
}