/
http_server.go
92 lines (71 loc) · 2.19 KB
/
http_server.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
package port
import (
"encoding/base64"
"encoding/json"
"net/http"
"github.com/go-chi/render"
tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
"github.com/kapitan123/telegrofler/common/server/httperr"
"github.com/kapitan123/telegrofler/service/bot/app"
"github.com/sirupsen/logrus"
)
// implements interface generated by openapi spec
type HttpServer struct {
app app.Application
}
func NewHttpServer(app app.Application) HttpServer {
return HttpServer{app: app}
}
func (h HttpServer) HandleVideoSavedMessage(w http.ResponseWriter, r *http.Request) {
postMessage := PubSubMessage{}
if err := render.Decode(r, &postMessage); err != nil {
httperr.BadRequest("invalid format of pubsub message", err, w, r)
return
}
var savedVideoMessage VideoSavedMessage
decodedDataBytes, err := base64.StdEncoding.DecodeString(postMessage.Message.Data)
if err != nil {
httperr.BadRequest("invalid encoding of pubsub data", err, w, r)
return
}
err = json.Unmarshal(decodedDataBytes, &savedVideoMessage)
if err != nil {
httperr.BadRequest("invalid pubsub.Data payload", err, w, r)
return
}
err = h.app.PublishVideo(r.Context(), savedVideoMessage.OriginalUrl, savedVideoMessage.SavedVideoAddr)
if err != nil {
httperr.RespondWithSlugError(err, w, r)
return
}
render.Status(r, 200)
}
func (h HttpServer) HandleTelegramMessage(w http.ResponseWriter, r *http.Request) {
var update tgbotapi.Update
err := json.NewDecoder(r.Body).Decode(&update)
if err != nil {
httperr.BadRequest("invalid format of telegram update message", err, w, r)
return
}
LogBody(update)
err = h.app.HandleTelegramMessage(r.Context(), update.Message)
if err != nil {
httperr.RespondWithSlugError(err, w, r)
return
}
render.Status(r, 200)
}
func (h HttpServer) HandleVideoSaveFailedMessage(w http.ResponseWriter, r *http.Request) {
// AK TODO not implemented
render.Status(r, 200)
}
type VideoSavedMessage struct {
SavedVideoAddr string `json:"saved_video_addr"`
OriginalUrl string `json:"original_url"`
}
// AK TODO TEMP to get raw result
func LogBody(upd tgbotapi.Update) {
jsonBytes, _ := json.Marshal(upd)
log := logrus.WithField("body", string(jsonBytes))
log.Info("Tg callback recived")
}