22// Use of this source code is governed by the Gitploy Non-Commercial License
33// that can be found in the LICENSE file.
44
5- // + build !oss
5+ //go: build !oss
66
77package stream
88
99import (
10- "context"
11- "fmt"
12- "math/rand"
1310 "time"
1411
1512 "github.com/gin-contrib/sse"
@@ -19,7 +16,6 @@ import (
1916 gb "github.com/gitploy-io/gitploy/internal/server/global"
2017 "github.com/gitploy-io/gitploy/model/ent"
2118 "github.com/gitploy-io/gitploy/model/ent/event"
22- "github.com/gitploy-io/gitploy/pkg/e"
2319)
2420
2521// GetEvents streams events of deployment, or review.
@@ -29,30 +25,56 @@ func (s *Stream) GetEvents(c *gin.Context) {
2925 v , _ := c .Get (gb .KeyUser )
3026 u , _ := v .(* ent.User )
3127
32- debugID := randstr ()
33-
34- events := make (chan * ent.Event , 10 )
28+ events := make (chan * sse.Event , 10 )
3529
3630 // Subscribe events
3731 // it'll unsubscribe after the connection is closed.
3832 sub := func (e * ent.Event ) {
39-
40- // Deleted type is always propagated to all.
41- if e .Type == event .TypeDeleted {
42- events <- e
43- return
44- }
45-
46- if ok , err := s .hasPermForEvent (ctx , u , e ); err != nil {
47- s .log .Error ("It has failed to check the perm." , zap .Error (err ))
48- return
49- } else if ! ok {
50- s .log .Debug ("Skip the event. The user has not the perm." )
51- return
33+ switch e .Kind {
34+ case event .KindDeployment :
35+ d , err := s .i .FindDeploymentByID (ctx , e .DeploymentID )
36+ if err != nil {
37+ s .log .Error ("Failed to find the deployment." , zap .Error (err ))
38+ return
39+ }
40+
41+ if _ , err := s .i .FindPermOfRepo (ctx , d .Edges .Repo , u ); err != nil {
42+ s .log .Debug ("Skip the event. The permission is denied." )
43+ return
44+ }
45+
46+ s .log .Debug ("Dispatch a deployment event." , zap .Int ("id" , d .ID ))
47+ events <- & sse.Event {
48+ Event : "deployment" ,
49+ Data : d ,
50+ }
51+
52+ case event .KindReview :
53+ r , err := s .i .FindReviewByID (ctx , e .ReviewID )
54+ if err != nil {
55+ s .log .Error ("Failed to find the review." , zap .Error (err ))
56+ return
57+ }
58+
59+ d , err := s .i .FindDeploymentByID (ctx , r .DeploymentID )
60+ if err != nil {
61+ s .log .Error ("Failed to find the deployment." , zap .Error (err ))
62+ return
63+ }
64+
65+ if _ , err := s .i .FindPermOfRepo (ctx , d .Edges .Repo , u ); err != nil {
66+ s .log .Debug ("Skip the event. The permission is denied." )
67+ return
68+ }
69+
70+ s .log .Debug ("Dispatch a review event." , zap .Int ("id" , r .ID ))
71+ events <- & sse.Event {
72+ Event : "review" ,
73+ Data : r ,
74+ }
5275 }
53-
54- events <- e
5576 }
77+
5678 if err := s .i .SubscribeEvent (sub ); err != nil {
5779 s .log .Check (gb .GetZapLogLevel (err ), "Failed to subscribe notification events" ).Write (zap .Error (err ))
5880 gb .ResponseWithError (c , err )
83105 })
84106 w .Flush ()
85107 case e := <- events :
86- c .Render (- 1 , sse.Event {
87- Event : "event" ,
88- Data : e ,
89- })
108+ c .Render (- 1 , e )
90109 w .Flush ()
91- s .log .Debug ("server sent event." , zap .Int ("event_id" , e .ID ), zap .String ("debug_id" , debugID ))
92- }
93- }
94- }
95-
96- // hasPermForEvent checks the user has permission for the event.
97- func (s * Stream ) hasPermForEvent (ctx context.Context , u * ent.User , evt * ent.Event ) (bool , error ) {
98- if evt .Kind == event .KindDeployment {
99- d , err := s .i .FindDeploymentByID (ctx , evt .DeploymentID )
100- if err != nil {
101- return false , err
102- }
103-
104- if _ , err = s .i .FindPermOfRepo (ctx , d .Edges .Repo , u ); e .HasErrorCode (err , e .ErrorCodeEntityNotFound ) {
105- return false , nil
106- } else if err != nil {
107- return false , err
108110 }
109-
110- return true , nil
111- }
112-
113- if evt .Kind == event .KindReview {
114- rv , err := s .i .FindReviewByID (ctx , evt .ReviewID )
115- if err != nil {
116- return false , err
117- }
118-
119- d , err := s .i .FindDeploymentByID (ctx , rv .DeploymentID )
120- if err != nil {
121- return false , err
122- }
123-
124- if _ , err = s .i .FindPermOfRepo (ctx , d .Edges .Repo , u ); e .HasErrorCode (err , e .ErrorCodeEntityNotFound ) {
125- return false , nil
126- } else if err != nil {
127- return false , err
128- }
129-
130- return true , nil
131- }
132-
133- return false , fmt .Errorf ("The type of event is not \" deployment\" or \" review\" ." )
134- }
135-
136- func randstr () string {
137- var letterRunes = []rune ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" )
138-
139- b := make ([]rune , 4 )
140- for i := range b {
141- b [i ] = letterRunes [rand .Intn (len (letterRunes ))]
142111 }
143- return string (b )
144112}
0 commit comments