构建一个即时消息应用(四):消息
本文是该系列的第四篇。
在这篇文章中,我们将对端点进行编码,以创建一条消息并列出它们,同时还将编写一个端点以更新参与者上次阅读消息的时间。 首先在 main()
函数中添加这些路由。
1 |
|
消息会进入对话,因此端点包含对话 ID。
创建消息
该端点处理对 /api/conversations/{conversationID}/messages
的 POST 请求,其 JSON 主体仅包含消息内容,并返回新创建的消息。它有两个副作用:更新对话 last_message_id
以及更新参与者 messages_read_at
。
1 |
|
首先,它将请求正文解码为包含消息内容的结构。然后,它验证内容不为空并且少于 480 个字符。
1 |
|
这是删除空格的函数。它遍历每一行,删除两个以上的连续空格,然后回非空行。
验证之后,它将启动一个 SQL 事务。首先,它查询对话中的参与者是否存在。
1 |
|
我将其提取到一个函数中,因为稍后可以重用。
如果用户不是对话参与者,我们将返回一个 404 NOT Found
错误。
然后,它插入消息并更新对话 last_message_id
。从这时起,由于我们不允许删除消息,因此 last_message_id
不能为 NULL
。
接下来提交事务,并在 goroutine 中更新参与者 messages_read_at
。
1 |
|
在回复这条新消息之前,我们必须通知一下。这是我们将要在下一篇文章中编写的实时部分,因此我在那里留一了个注释。
获取消息
这个端点处理对 /api/conversations/{conversationID}/messages
的 GET 请求。 它用一个包含会话中所有消息的 JSON 数组进行响应。它还具有更新参与者 messages_read_at
的副作用。
1 |
|
首先,它以只读模式开始一个 SQL 事务。检查参与者是否存在,并查询所有消息。在每条消息中,我们使用当前经过身份验证的用户 ID 来了解用户是否拥有该消息(mine
)。 然后,它提交事务,在 goroutine 中更新参与者 messages_read_at
并以消息响应。
读取消息
该端点处理对 /api/conversations/{conversationID}/read_messages
的 POST 请求。 没有任何请求或响应主体。 在前端,每次有新消息到达实时流时,我们都会发出此请求。
1 |
|
它使用了与更新参与者 messages_read_at
相同的函数。
到此为止。实时消息是后台仅剩的部分了。请等待下一篇文章。
via: https://nicolasparada.netlify.com/posts/go-messenger-messages/
作者:Nicolás Parada 选题:lujun9972 译者:gxlct008 校对:wxy