@gxlct008 很好,感谢接上这个系列~
This commit is contained in:
Xingyu Wang 2020-10-04 11:46:27 +08:00
parent d458281f9c
commit 3bb56668f8

View File

@ -1,6 +1,6 @@
[#]: collector: (lujun9972) [#]: collector: (lujun9972)
[#]: translator: (gxlct008) [#]: translator: (gxlct008)
[#]: reviewer: ( ) [#]: reviewer: (wxy)
[#]: publisher: ( ) [#]: publisher: ( )
[#]: url: ( ) [#]: url: ( )
[#]: subject: (Building a Messenger App: Messages) [#]: subject: (Building a Messenger App: Messages)
@ -14,10 +14,9 @@
* [第一篇: 模式][1] * [第一篇: 模式][1]
* [第二篇: OAuth][2] * [第二篇: OAuth][2]
* [第三篇: 对话Conversations][3] * [第三篇: 对话][3]
在这篇文章中,我们将对端点进行编码,以创建一条消息并列出它们,同时还将编写一个端点以更新参与者上次阅读消息的时间。 首先在 `main()` 函数中添加这些路由。
在这篇文章中,我们将对端点进行编码以创建一条消息并列出它们,同时还将编写一个端点以更新参与者上次阅读消息的时间。 首先在 `main()` 函数中添加这些路由。
``` ```
router.HandleFunc("POST", "/api/conversations/:conversationID/messages", requireJSON(guard(createMessage))) router.HandleFunc("POST", "/api/conversations/:conversationID/messages", requireJSON(guard(createMessage)))
@ -25,11 +24,11 @@ router.HandleFunc("GET", "/api/conversations/:conversationID/messages", guard(ge
router.HandleFunc("POST", "/api/conversations/:conversationID/read_messages", guard(readMessages)) router.HandleFunc("POST", "/api/conversations/:conversationID/read_messages", guard(readMessages))
``` ```
消息进入对话,因此端点包含对话 ID。 消息进入对话,因此端点包含对话 ID。
### 创建消息 ### 创建消息
该端点使用仅包含消息内容的 JSON 主体处理对 `/api/conversations/{conversationID}/messages` 的 POST 请求,并返回新创建的消息。 它有两个副作用:更新对话 `last_message_id` 以及更新参与者 `messages_read_at` 该端点处理对 `/api/conversations/{conversationID}/messages` 的 POST 请求,其 JSON 主体仅包含消息内容,并返回新创建的消息。它有两个副作用:更新对话 `last_message_id` 以及更新参与者 `messages_read_at`
``` ```
func createMessage(w http.ResponseWriter, r *http.Request) { func createMessage(w http.ResponseWriter, r *http.Request) {
@ -118,7 +117,7 @@ func createMessage(w http.ResponseWriter, r *http.Request) {
} }
``` ```
首先,它将请求正文解码为具有消息内容的结构。然后,它验证内容不为空并且少于 480 个字符。 首先,它将请求正文解码为包含消息内容的结构。然后,它验证内容不为空并且少于 480 个字符。
``` ```
var rxSpaces = regexp.MustCompile("\\s+") var rxSpaces = regexp.MustCompile("\\s+")
@ -140,7 +139,7 @@ func removeSpaces(s string) string {
} }
``` ```
这是删除空格的函数。它迭代每一行,删除两个以上的连续空格,然后回非空行。 这是删除空格的函数。它遍历每一行,删除两个以上的连续空格,然后回非空行。
验证之后,它将启动一个 SQL 事务。首先,它查询对话中的参与者是否存在。 验证之后,它将启动一个 SQL 事务。首先,它查询对话中的参与者是否存在。
@ -184,11 +183,11 @@ func updateMessagesReadAt(ctx context.Context, userID, conversationID string) er
} }
``` ```
在回复这条新消息之前,我们必须通知它。 这是我们将要在下一篇文章中编写的实时部分,因此我在那里留一个注释。 在回复这条新消息之前,我们必须通知一下。这是我们将要在下一篇文章中编写的实时部分,因此我在那里留一个注释。
### 获取消息 ### 获取消息
这个端点处理对 `/api/conversations/{conversationID}/messages` 的 GET 请求。 它用一个包含会话中所有消息的 JSON 数组进行响应。 它还具有更新参与者 `messages_read_at` 的副作用。 这个端点处理对 `/api/conversations/{conversationID}/messages` 的 GET 请求。 它用一个包含会话中所有消息的 JSON 数组进行响应。它还具有更新参与者 `messages_read_at` 的副作用。
``` ```
func getMessages(w http.ResponseWriter, r *http.Request) { func getMessages(w http.ResponseWriter, r *http.Request) {
@ -266,9 +265,9 @@ func getMessages(w http.ResponseWriter, r *http.Request) {
} }
``` ```
首先,它以只读模式开始一个 SQL 事务。 检查参与者是否存在并查询所有消息。 在每条消息中,我们使用当前经过身份验证的用户 ID 来了解用户是否拥有该消息(`我的`)。 然后,它提交事务,在 goroutine 中更新参与者 `messages_read_at` 并以消息响应。 首先,它以只读模式开始一个 SQL 事务。检查参与者是否存在并查询所有消息。在每条消息中,我们使用当前经过身份验证的用户 ID 来了解用户是否拥有该消息(`mine`)。 然后,它提交事务,在 goroutine 中更新参与者 `messages_read_at` 并以消息响应。
### 读消息 ### 读消息
该端点处理对 `/api/conversations/{conversationID}/read_messages` 的 POST 请求。 没有任何请求或响应主体。 在前端,每次有新消息到达实时流时,我们都会发出此请求。 该端点处理对 `/api/conversations/{conversationID}/read_messages` 的 POST 请求。 没有任何请求或响应主体。 在前端,每次有新消息到达实时流时,我们都会发出此请求。
@ -293,7 +292,7 @@ func readMessages(w http.ResponseWriter, r *http.Request) {
到此为止。实时消息是后台仅剩的部分了。请等待下一篇文章。 到此为止。实时消息是后台仅剩的部分了。请等待下一篇文章。
[Souce Code][4] - [源代码][4]
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
@ -301,14 +300,14 @@ via: https://nicolasparada.netlify.com/posts/go-messenger-messages/
作者:[Nicolás Parada][a] 作者:[Nicolás Parada][a]
选题:[lujun9972][b] 选题:[lujun9972][b]
译者:[译者ID](https://github.com/gxlct008) 译者:[gxlct008](https://github.com/gxlct008)
校对:[校对者ID](https://github.com/校对者ID) 校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://nicolasparada.netlify.com/ [a]: https://nicolasparada.netlify.com/
[b]: https://github.com/lujun9972 [b]: https://github.com/lujun9972
[1]: https://nicolasparada.netlify.com/posts/go-messenger-schema/ [1]: https://linux.cn/article-11396-1.html
[2]: https://nicolasparada.netlify.com/posts/go-messenger-oauth/ [2]: https://linux.cn/article-11510-1.html
[3]: https://nicolasparada.netlify.com/posts/go-messenger-conversations/ [3]: https://linux.cn/article-12056-1.html
[4]: https://github.com/nicolasparada/go-messenger-demo [4]: https://github.com/nicolasparada/go-messenger-demo