This repository has been archived by the owner on Aug 4, 2023. It is now read-only.
/
main.go
102 lines (91 loc) · 2.56 KB
/
main.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 main
import (
"context"
"log"
"time"
"github.com/TikTokTechImmersion/assignment_demo_2023/http-server/kitex_gen/rpc"
"github.com/TikTokTechImmersion/assignment_demo_2023/http-server/kitex_gen/rpc/imservice"
"github.com/TikTokTechImmersion/assignment_demo_2023/http-server/proto_gen/api"
"github.com/cloudwego/hertz/pkg/app"
"github.com/cloudwego/hertz/pkg/app/server"
"github.com/cloudwego/hertz/pkg/common/utils"
"github.com/cloudwego/hertz/pkg/protocol/consts"
"github.com/cloudwego/kitex/client"
etcd "github.com/kitex-contrib/registry-etcd"
)
var cli imservice.Client
func main() {
r, err := etcd.NewEtcdResolver([]string{"etcd:2379"})
if err != nil {
log.Fatal(err)
}
cli = imservice.MustNewClient("demo.rpc.server",
client.WithResolver(r),
client.WithRPCTimeout(1*time.Second),
client.WithHostPorts("rpc-server:8888"),
)
h := server.Default(server.WithHostPorts("0.0.0.0:8080"))
h.GET("/ping", func(c context.Context, ctx *app.RequestContext) {
ctx.JSON(consts.StatusOK, utils.H{"message": "pong"})
})
h.POST("/api/send", sendMessage)
h.GET("/api/pull", pullMessage)
h.Spin()
}
func sendMessage(ctx context.Context, c *app.RequestContext) {
var req api.SendRequest
err := c.Bind(&req)
if err != nil {
c.String(consts.StatusBadRequest, "Failed to parse request body: %v", err)
return
}
resp, err := cli.Send(ctx, &rpc.SendRequest{
Message: &rpc.Message{
Chat: req.Chat,
Text: req.Text,
Sender: req.Sender,
},
})
if err != nil {
c.String(consts.StatusInternalServerError, err.Error())
} else if resp.Code != 0 {
c.String(consts.StatusInternalServerError, resp.Msg)
} else {
c.Status(consts.StatusOK)
}
}
func pullMessage(ctx context.Context, c *app.RequestContext) {
var req api.PullRequest
err := c.Bind(&req)
if err != nil {
c.String(consts.StatusBadRequest, "Failed to parse request body: %v", err)
return
}
resp, err := cli.Pull(ctx, &rpc.PullRequest{
Chat: req.Chat,
Cursor: req.Cursor,
Limit: req.Limit,
Reverse: &req.Reverse,
})
if err != nil {
c.String(consts.StatusInternalServerError, err.Error())
return
} else if resp.Code != 0 {
c.String(consts.StatusInternalServerError, resp.Msg)
return
}
messages := make([]*api.Message, 0, len(resp.Messages))
for _, msg := range resp.Messages {
messages = append(messages, &api.Message{
Chat: msg.Chat,
Text: msg.Text,
Sender: msg.Sender,
SendTime: msg.SendTime,
})
}
c.JSON(consts.StatusOK, &api.PullResponse{
Messages: messages,
HasMore: resp.GetHasMore(),
NextCursor: resp.GetNextCursor(),
})
}