/
messages_handler.go
124 lines (103 loc) · 2.31 KB
/
messages_handler.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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
package handlers
import (
"html"
"time"
"github.com/asm-products/landline-api/models"
"github.com/gin-gonic/gin"
)
type BridgeMessageJSON struct {
Body string `json:"body" binding:"required"`
UserID string `json:"user_id" binding:"required"`
}
type MessageJSON struct {
Body string `json:"body" binding:"required"`
}
func MessagesIndex(c *gin.Context) {
user, err := GetUserFromContext(c)
if err != nil {
c.Fail(500, err)
}
room, err := models.FindRoom(c.Params.ByName("room"), user.TeamId)
if err != nil {
c.Fail(500, err)
}
var messages []models.MessageWithUser
timestamp := c.Request.URL.Query().Get("t")
if timestamp != "" {
time, err := time.Parse(time.RFC3339, timestamp)
if err != nil {
c.Fail(500, err)
}
messages, err = models.FindMessagesBeforeTimestamp(room.Id, time)
} else {
messages, err = models.FindMessages(room.Id)
}
if err != nil {
c.Fail(500, err)
}
c.JSON(200, gin.H{"messages": messages})
}
func MessagesBridgeCreate(c *gin.Context) {
var json BridgeMessageJSON
c.Bind(&json)
team, err := GetTeamFromContext(c)
if err != nil {
c.Fail(500, err)
}
user, err := models.FindUserByExternalIDAndTeam(json.UserID, team.Id)
if err != nil {
c.Fail(500, err)
}
m, err := SendMessage(
user,
c.Params.ByName("room"),
json.Body,
"true",
)
if err != nil {
c.Fail(500, err)
}
c.JSON(200, gin.H{"message": m})
}
func MessagesCreate(c *gin.Context) {
user, err := GetUserFromContext(c)
if err != nil {
c.Fail(500, err)
}
var json MessageJSON
c.Bind(&json)
m, err := SendMessage(
user,
c.Params.ByName("room"),
json.Body,
c.Request.URL.Query().Get("bridge"),
)
if err != nil {
c.Fail(500, err)
}
c.JSON(200, gin.H{"message": m})
}
func SendMessage(user *models.User, roomSlug, body, bridge string) (*models.MessageWithUser, error) {
room, err := models.FindRoom(roomSlug, user.TeamId)
if err != nil {
return nil, err
}
m := &models.Message{
RoomId: room.Id,
UserId: user.Id,
Body: sanitizeBody(body),
}
err = models.CreateMessage(m)
if err != nil {
return nil, err
}
mu := models.NewMessageWithUser(m, user)
SocketioServer.BroadcastTo(room.Id, "message", mu, roomSlug)
if bridge != "true" {
models.PostToTeamWebhook(room.Id, m)
}
return mu, err
}
func sanitizeBody(body string) string {
return html.EscapeString(body)
}