Skip to content

Commit 23206e5

Browse files
feat: garden button
1 parent d413ba2 commit 23206e5

File tree

9 files changed

+89
-9
lines changed

9 files changed

+89
-9
lines changed

internal/core/bus.go

+5
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,15 @@ type EventEnvelopeDeleted struct {
1212
IDS []int64
1313
}
1414

15+
type EventGardenStart struct {
16+
Response chan<- bool
17+
}
18+
1519
type Bus struct {
1620
Mutex sync.Mutex
1721
EnvelopeCreated []func(cc *Context, evt EventEnvelopeCreated)
1822
EnvelopeDeleted []func(cc *Context, evt EventEnvelopeDeleted)
23+
GardenStart func(cc *Context, evt EventGardenStart)
1924
}
2025

2126
func NewBus() *Bus {

internal/events/envelope.go

+17
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,20 @@ func PublishEnvelopeDeleted(cc *core.Context, ids ...int64) {
2929
}
3030
cc.Bus.Mutex.Unlock()
3131
}
32+
33+
func OnGardenStart(app core.App, fn func(cc *core.Context, evt core.EventGardenStart)) {
34+
app.Bus.Mutex.Lock()
35+
if app.Bus.GardenStart != nil {
36+
panic("GardenStart handler is being redefined")
37+
}
38+
app.Bus.GardenStart = fn
39+
app.Bus.Mutex.Unlock()
40+
}
41+
42+
func PublishGardenStart(cc *core.Context) <-chan bool {
43+
res := make(chan bool)
44+
cc.Bus.Mutex.Lock()
45+
cc.Bus.GardenStart(cc, core.EventGardenStart{Response: res})
46+
cc.Bus.Mutex.Unlock()
47+
return res
48+
}

internal/procs/gardener.go

+45-3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package procs
22

33
import (
44
"context"
5+
"fmt"
56
"time"
67

78
"github.com/ItsNotGoodName/smtpbridge/internal/core"
@@ -12,11 +13,26 @@ import (
1213
"github.com/rs/zerolog/log"
1314
)
1415

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) {
1631
envDeletedC := make(chan core.EventEnvelopeDeleted, 1)
1732
envCreatedC := make(chan core.EventEnvelopeCreated, 1)
33+
evtGardenStart := make(chan core.EventGardenStart, 1)
1834

19-
go gardener(app.Context(ctx), policy, envCreatedC, envDeletedC)
35+
go gardener(app.Context(ctx), policy, envCreatedC, envDeletedC, evtGardenStart)
2036

2137
events.OnEnvelopeCreated(app, func(cc *core.Context, evt core.EventEnvelopeCreated) {
2238
select {
@@ -41,9 +57,27 @@ func GardenerStart(ctx context.Context, app core.App, policy models.RetentionPol
4157
default:
4258
}
4359
})
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+
})
4472
}
4573

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+
) {
4781
ctx := cc.Context()
4882
ticker := time.NewTicker(30 * time.Minute)
4983

@@ -79,6 +113,14 @@ func gardener(cc *core.Context, policy models.RetentionPolicy, envCreatedC <-cha
79113
gardenerDeleteOrphanAttachments(cc)
80114
case <-ticker.C:
81115
clean()
116+
case evt := <-evtGardenStart:
117+
clean()
118+
119+
select {
120+
case <-ctx.Done():
121+
return
122+
case evt.Response <- true:
123+
}
82124
}
83125
}
84126
}

internal/procs/mailman.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import (
99
"github.com/rs/zerolog/log"
1010
)
1111

12-
func MailmanStart(ctx context.Context, app core.App) {
12+
func MailmanBackground(ctx context.Context, app core.App) {
1313
evtC := make(chan core.EventEnvelopeCreated, 25)
1414

1515
go mailman(app.Context(ctx), evtC)

main.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,8 @@ func run(ctx context.Context, shutdown context.CancelFunc, cli config.CLI) <-cha
6161
log.Fatal().Err(err).Msg("Failed to sync app from config")
6262
}
6363

64-
procs.MailmanStart(ctx, app)
65-
procs.GardenerStart(ctx, app, cfg.RetentionPolicy)
64+
procs.MailmanBackground(ctx, app)
65+
procs.GardenerBackground(ctx, app, cfg.RetentionPolicy)
6666
procs.VacuumStart(ctx, app)
6767

6868
var backgrounds []background.Background

web/controllers/controllers.go

+12
Original file line numberDiff line numberDiff line change
@@ -74,3 +74,15 @@ func Vacuum(c *fiber.Ctx, cc *core.Context) error {
7474
c.Set("HX-Trigger", "databaseVacuum")
7575
return c.SendStatus(http.StatusNoContent)
7676
}
77+
78+
func Garden(c *fiber.Ctx, cc *core.Context) error {
79+
// Execute
80+
err := procs.GardenStart(cc)
81+
if err != nil {
82+
return helpers.Error(c, err)
83+
}
84+
85+
// Response
86+
c.Set("HX-Trigger", "garden")
87+
return c.SendStatus(http.StatusNoContent)
88+
}

web/http/routes.go

+1
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ func routes(http *fiber.App, app core.App, retentionPolicy models.RetentionPolic
4343

4444
http.Post("/send", middleware.App(app, controllers.Send))
4545
http.Post("/vacuum", middleware.App(app, controllers.Vacuum))
46+
http.Post("/garden", middleware.App(app, controllers.Garden))
4647
http.Group("/files", controllers.Files(app))
4748

4849
http.Route("/p", func(http fiber.Router) {

web/views/index.html

+4-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ <h2>Recent Envelopes</h2>
88
</figure>
99
</article>
1010

11-
<article>
11+
<article id="storage">
1212
<h2>Storage</h2>
1313
<figure>{{template "p/storage-table" .}}</figure>
1414
<div class="grid">
@@ -53,6 +53,9 @@ <h2>Retention Policy</h2>
5353
</tbody>
5454
</table>
5555
</figure>
56+
<button hx-post="/garden" data-loading-path="/garden" data-loading-disable data-loading-aria-busy>
57+
Garden Data
58+
</button>
5659
</article>
5760

5861
<article>

web/views/p/storage-table.html

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
<table hx-trigger="every 5s, databaseVacuum from:body, deleteEnvelopes from:body" hx-get="/p/storage-table"
2-
hx-swap="outerHTML">
1+
<table hx-trigger="every 5s, databaseVacuum from:body, garden from:body, deleteEnvelopes from:body"
2+
hx-get="/p/storage-table" hx-swap="outerHTML">
33
<tbody>
44
<tr>
55
<th scope="row"><strong>Envelope Count</strong></th>

0 commit comments

Comments
 (0)