@@ -2,6 +2,7 @@ package procs
2
2
3
3
import (
4
4
"context"
5
+ "fmt"
5
6
"time"
6
7
7
8
"github.com/ItsNotGoodName/smtpbridge/internal/core"
@@ -12,11 +13,26 @@ import (
12
13
"github.com/rs/zerolog/log"
13
14
)
14
15
15
- func GardenerStart (ctx context.Context , app core.App , policy models.RetentionPolicy ) {
16
+ func GardenStart (cc * core.Context ) error {
17
+ ctx := cc .Context ()
18
+ select {
19
+ case <- ctx .Done ():
20
+ return ctx .Err ()
21
+ case res := <- events .PublishGardenStart (cc ):
22
+ if res {
23
+ return nil
24
+ }
25
+
26
+ return fmt .Errorf ("already gardening" )
27
+ }
28
+ }
29
+
30
+ func GardenerBackground (ctx context.Context , app core.App , policy models.RetentionPolicy ) {
16
31
envDeletedC := make (chan core.EventEnvelopeDeleted , 1 )
17
32
envCreatedC := make (chan core.EventEnvelopeCreated , 1 )
33
+ evtGardenStart := make (chan core.EventGardenStart , 1 )
18
34
19
- go gardener (app .Context (ctx ), policy , envCreatedC , envDeletedC )
35
+ go gardener (app .Context (ctx ), policy , envCreatedC , envDeletedC , evtGardenStart )
20
36
21
37
events .OnEnvelopeCreated (app , func (cc * core.Context , evt core.EventEnvelopeCreated ) {
22
38
select {
@@ -41,9 +57,27 @@ func GardenerStart(ctx context.Context, app core.App, policy models.RetentionPol
41
57
default :
42
58
}
43
59
})
60
+
61
+ events .OnGardenStart (app , func (cc * core.Context , evt core.EventGardenStart ) {
62
+ select {
63
+ case evtGardenStart <- evt :
64
+ default :
65
+ select {
66
+ case <- ctx .Done ():
67
+ return
68
+ case evt .Response <- false :
69
+ }
70
+ }
71
+ })
44
72
}
45
73
46
- func gardener (cc * core.Context , policy models.RetentionPolicy , envCreatedC <- chan core.EventEnvelopeCreated , envDeletedC <- chan core.EventEnvelopeDeleted ) {
74
+ func gardener (
75
+ cc * core.Context ,
76
+ policy models.RetentionPolicy ,
77
+ envCreatedC <- chan core.EventEnvelopeCreated ,
78
+ envDeletedC <- chan core.EventEnvelopeDeleted ,
79
+ evtGardenStart <- chan core.EventGardenStart ,
80
+ ) {
47
81
ctx := cc .Context ()
48
82
ticker := time .NewTicker (30 * time .Minute )
49
83
@@ -79,6 +113,14 @@ func gardener(cc *core.Context, policy models.RetentionPolicy, envCreatedC <-cha
79
113
gardenerDeleteOrphanAttachments (cc )
80
114
case <- ticker .C :
81
115
clean ()
116
+ case evt := <- evtGardenStart :
117
+ clean ()
118
+
119
+ select {
120
+ case <- ctx .Done ():
121
+ return
122
+ case evt .Response <- true :
123
+ }
82
124
}
83
125
}
84
126
}
0 commit comments