channels_pages.go
2489 bytes
1package ytrssil
2
3import (
4 "errors"
5 "fmt"
6 "net/http"
7
8 "github.com/gin-gonic/gin"
9 datastar "github.com/starfederation/datastar-go/datastar"
10
11 "github.com/TheEdgeOfRage/ytrssil-api/db"
12 "github.com/TheEdgeOfRage/ytrssil-api/pages"
13)
14
15func (srv *server) ChannelsPage(c *gin.Context) {
16 channels, err := srv.handler.ListChannels(c.Request.Context())
17 if err != nil {
18 returnErr(c, http.StatusInternalServerError, err)
19 return
20 }
21
22 r := pages.TemplRenderer{
23 Ctx: c.Request.Context(),
24 Component: pages.ChannelsPage(channels),
25 }
26 c.Render(http.StatusOK, r)
27}
28
29func (srv *server) SubscribeToChannelPage(c *gin.Context) {
30 var signals struct {
31 ChannelID string `json:"channelID"`
32 }
33 if err := datastar.ReadSignals(c.Request, &signals); err != nil {
34 sse := newSSE(c)
35 sse.ExecuteScript(fmt.Sprintf(`showFormError("subscription-modal", %q)`, err.Error()))
36 return
37 }
38
39 _, err := srv.handler.SubscribeToChannel(c.Request.Context(), signals.ChannelID)
40 if err != nil {
41 sse := newSSE(c)
42 sse.ExecuteScript(fmt.Sprintf(`showFormError("subscription-modal", %q)`, err.Error()))
43 return
44 }
45
46 sse := newSSE(c)
47 sse.ExecuteScript(`
48 bootstrap.Modal.getInstance(document.getElementById("subscription-modal")).hide();
49 location.reload()
50 `)
51}
52
53func (srv *server) UnsubscribeFromChannelPage(c *gin.Context) {
54 channelID := c.Param("channel_id")
55 err := srv.handler.UnsubscribeFromChannel(c.Request.Context(), channelID)
56 if err != nil {
57 if errors.Is(err, db.ErrChannelNotFound) {
58 returnErr(c, http.StatusNotFound, err)
59 return
60 }
61
62 returnErr(c, http.StatusInternalServerError, err)
63 return
64 }
65
66 sse := newSSE(c)
67 sse.ExecuteScript(fmt.Sprintf(`animateRemove("#channel-card-%s")`, channelID))
68}
69
70func (srv *server) ToggleChannelShortsPage(c *gin.Context) {
71 var signals struct {
72 Enable bool `json:"enable"`
73 }
74 if err := datastar.ReadSignals(c.Request, &signals); err != nil {
75 returnErr(c, http.StatusBadRequest, err)
76 return
77 }
78
79 channelID := c.Param("channel_id")
80 err := srv.handler.ToggleChannelShorts(c.Request.Context(), channelID, signals.Enable)
81 if err != nil {
82 if errors.Is(err, db.ErrChannelNotFound) {
83 returnErr(c, http.StatusNotFound, err)
84 return
85 }
86
87 returnErr(c, http.StatusInternalServerError, err)
88 return
89 }
90
91 channel, err := srv.handler.GetChannelByID(c.Request.Context(), channelID)
92 if err != nil {
93 returnErr(c, http.StatusInternalServerError, err)
94 return
95 }
96
97 sse := newSSE(c)
98 sse.PatchElementTempl(pages.ChannelCard(*channel))
99}