Skip to content

Commit 3f6e774

Browse files
committedFeb 9, 2025··
refactor: cleanup error handling
1 parent e32997f commit 3f6e774

File tree

13 files changed

+53
-80
lines changed

13 files changed

+53
-80
lines changed
 

‎cmd/eagle/root.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ var rootCmd = &cobra.Command{
3838
log.Info("starting server")
3939
err := server.Start()
4040
if err != nil && !errors.Is(err, http.ErrServerClosed) {
41-
log.Errorf("failed to start server: %s", err)
41+
log.Errorw("failed to start server", "err", err)
4242
}
4343
quit <- os.Interrupt
4444
}()

‎core/eagle.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package core
22

33
type Notifier interface {
4-
Info(msg string)
5-
Error(err error)
4+
Notify(msg string)
65
}

‎log/notifier.go

+2-6
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,10 @@ type LogNotifier struct {
88

99
func NewLogNotifier() *LogNotifier {
1010
return &LogNotifier{
11-
log: S().Named("notify"),
11+
log: S().Named("notifier"),
1212
}
1313
}
1414

15-
func (n *LogNotifier) Info(msg string) {
15+
func (n *LogNotifier) Notify(msg string) {
1616
n.log.Info(msg)
1717
}
18-
19-
func (n *LogNotifier) Error(err error) {
20-
n.log.Error(err)
21-
}

‎plugins/mastodon/mastodon.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ func (m *Mastodon) uploadPhotos(ctx context.Context, photos []server.Photo) []ma
113113

114114
attachment, err := m.client.UploadMediaFromBytes(ctx, photo.Data)
115115
if err != nil {
116-
m.log.Warnw("photo upload failed", "err", err)
116+
m.log.Warnw("photo upload failed", "mimetype", photo.MimeType, "err", err)
117117
continue
118118
}
119119

‎server/micropub.go

+9-9
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ const (
3030
func (s *Server) getMicropubChannels() []micropub.Channel {
3131
taxons, err := s.bolt.GetTaxonomy(context.Background(), s.c.Micropub.ChannelsTaxonomy)
3232
if err != nil {
33-
s.log.Warnw("could not fetch channels taxonomy", "taxonomy", s.c.Micropub.ChannelsTaxonomy, "err", err)
33+
s.log.Errorw("failed to fetch channels taxonomy", "taxonomy", s.c.Micropub.ChannelsTaxonomy, "err", err)
3434
return nil
3535
}
3636

@@ -45,7 +45,7 @@ func (s *Server) getMicropubChannels() []micropub.Channel {
4545
func (s *Server) getMicropubCategories() []string {
4646
taxons, err := s.bolt.GetTaxonomy(context.Background(), s.c.Micropub.CategoriesTaxonomy)
4747
if err != nil {
48-
s.log.Warnw("could not fetch categories taxonomy", "taxonomy", s.c.Micropub.CategoriesTaxonomy, "err", err)
48+
s.log.Errorw("failed to fetch categories taxonomy", "taxonomy", s.c.Micropub.CategoriesTaxonomy, "err", err)
4949
return nil
5050
}
5151

@@ -279,7 +279,7 @@ func (m *micropubServer) syndicate(e *core.Entry, syndicators []string) {
279279
// Get the photos to use during syndication
280280
photos, err := m.getPhotos(e)
281281
if err != nil {
282-
m.s.log.Warnw("failed to get photos for syndication", "err", err)
282+
m.s.log.Errorw("failed to get photos for syndication", "entry", e.ID, "err", err)
283283
return
284284
}
285285

@@ -296,7 +296,7 @@ func (m *micropubServer) syndicate(e *core.Entry, syndicators []string) {
296296
if syndicator, ok := m.s.syndicators[name]; ok {
297297
syndication, removed, err := syndicator.Syndicate(context.Background(), e, photos)
298298
if err != nil {
299-
m.s.log.Warnw("failed to syndicate", "name", name, "err", err)
299+
m.s.log.Errorw("failed to syndicate", "entry", e.ID, "syndicator", name, "err", err)
300300
continue
301301
}
302302

@@ -317,7 +317,7 @@ func (m *micropubServer) syndicate(e *core.Entry, syndicators []string) {
317317

318318
err = m.s.core.SaveEntry(e)
319319
if err != nil {
320-
m.s.log.Warnw("failed save entry", "id", e.ID, "err", err)
320+
m.s.log.Errorw("failed save entry", "id", e.ID, "err", err)
321321
}
322322
}
323323

@@ -354,7 +354,7 @@ func (m *micropubServer) postSave(e *core.Entry, req *micropub.Request, oldTarge
354354

355355
err := hookPlugin.PostSaveHook(e)
356356
if err != nil {
357-
m.s.n.Error(fmt.Errorf("plugin %s post save hook failed sync failed: %w", name, err))
357+
m.s.log.Errorw("plugin post save hook failed", "plugin", name, "err", err)
358358
}
359359
}
360360

@@ -367,12 +367,12 @@ func (m *micropubServer) postSave(e *core.Entry, req *micropub.Request, oldTarge
367367
err = m.s.meilisearch.Add(e)
368368
}
369369
if err != nil {
370-
m.s.n.Error(fmt.Errorf("meilisearch sync failed: %w", err))
370+
m.s.log.Errorw("meilisearch sync failed", "err", err)
371371
}
372372
}
373373

374374
// Rebuild
375-
m.s.buildNotify(false)
375+
m.s.build(false)
376376

377377
// No further action for drafts or no webmentions
378378
if e.Draft || e.NoWebmentions {
@@ -381,7 +381,7 @@ func (m *micropubServer) postSave(e *core.Entry, req *micropub.Request, oldTarge
381381

382382
err := m.s.core.SendWebmentions(e.Permalink, oldTargets...)
383383
if err != nil {
384-
m.s.n.Error(fmt.Errorf("sending webmentions failed: %w", err))
384+
m.s.log.Errorw("failed to send webmentions", "id", e.ID, "err", err)
385385
}
386386
}
387387

‎server/panel.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ func (s *Server) panelPostAction(w http.ResponseWriter, r *http.Request) {
226226
return
227227
}
228228

229-
go s.buildNotify(false)
229+
go s.build(false)
230230
s.servePanel(w, r, data)
231231
}
232232

‎server/render.go

+5-5
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ func (s *Server) renderDocument(w http.ResponseWriter, r *http.Request, doc *goq
7070
err := s.templates.ExecuteTemplate(&buf, template, data)
7171
if err != nil {
7272
w.WriteHeader(http.StatusInternalServerError)
73-
s.n.Error(fmt.Errorf("serving html: %w", err))
73+
s.log.Errorw("failed to serve html", "url", r.URL.Path, "err", err)
7474
return
7575
}
7676

@@ -80,15 +80,15 @@ func (s *Server) renderDocument(w http.ResponseWriter, r *http.Request, doc *goq
8080
html, err := doc.Html()
8181
if err != nil {
8282
w.WriteHeader(http.StatusInternalServerError)
83-
s.n.Error(fmt.Errorf("serving html for %s: %w", r.URL.Path, err))
83+
s.log.Errorw("failed to get document html", "url", r.URL.Path, "err", err)
8484
return
8585
}
8686

8787
w.Header().Set("Content-Type", "text/html; charset=utf-8")
8888
w.WriteHeader(code)
8989
_, err = w.Write([]byte(html))
9090
if err != nil {
91-
s.n.Error(fmt.Errorf("serving html for %s: %w", r.URL.Path, err))
91+
s.log.Errorw("failed to write html", "url", r.URL.Path, "err", err)
9292
}
9393
}
9494

@@ -111,7 +111,7 @@ func (s *Server) panelTemplate(w http.ResponseWriter, r *http.Request, code int,
111111
w.WriteHeader(code)
112112
err := panelTemplates.ExecuteTemplate(w, template, data)
113113
if err != nil {
114-
s.n.Error(fmt.Errorf("serving html: %w", err))
114+
s.log.Errorw("failed to execute template", "url", r.URL.Path, "err", err)
115115
}
116116
}
117117

@@ -120,7 +120,7 @@ func (s *Server) serveJSON(w http.ResponseWriter, code int, data interface{}) {
120120
w.WriteHeader(code)
121121
err := json.NewEncoder(w).Encode(data)
122122
if err != nil {
123-
s.n.Error(fmt.Errorf("serving html: %w", err))
123+
s.log.Errorw("failed to write JSON", "err", err)
124124
}
125125
}
126126

‎server/server.go

+16-19
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"embed"
66
"encoding/base64"
77
"errors"
8-
"fmt"
98
"html/template"
109
"net"
1110
"net/http"
@@ -151,8 +150,7 @@ func (s *Server) Start() error {
151150
if s.c.Tor {
152151
err = s.startTor(errCh, router)
153152
if err != nil {
154-
err = fmt.Errorf("onion service failed to start: %w", err)
155-
s.log.Error(err)
153+
s.log.Errorw("onion service failed to start", "err", err)
156154
}
157155
}
158156

@@ -233,43 +231,43 @@ func (s *Server) indexAll() {
233231

234232
entries, err := s.core.GetEntries(false)
235233
if err != nil {
236-
s.n.Error(err)
234+
s.log.Errorw("failed to get entries", "err", err)
237235
return
238236
}
239237

240238
if s.meilisearch != nil {
241239
err := s.meilisearch.ResetIndex()
242240
if err != nil {
243-
s.n.Error(err)
241+
s.log.Errorw("failed to reset meilisearch index", "err", err)
244242
}
245243

246244
start := time.Now()
247245
err = s.meilisearch.Add(entries...)
248246
if err != nil {
249-
s.n.Error(err)
247+
s.log.Errorw("failed to add to meilisearch index", "err", err)
250248
}
251249
s.log.Infof("meilisearch update took %dms", time.Since(start).Milliseconds())
252250
}
253251

254252
if s.c.Micropub != nil {
255253
err := s.bolt.ResetTaxonomies(context.Background())
256254
if err != nil {
257-
s.n.Error(err)
255+
s.log.Errorw("failed to reset taxonomies", "err", err)
258256
}
259257

260258
start := time.Now()
261259

262260
if s.c.Micropub.CategoriesTaxonomy != "" {
263261
err = s.indexAllTaxonomies(entries, s.c.Micropub.CategoriesTaxonomy)
264262
if err != nil {
265-
s.n.Error(err)
263+
s.log.Errorw("failed to index all taxonomies", "taxonomy", s.c.Micropub.CategoriesTaxonomy, "err", err)
266264
}
267265
}
268266

269267
if s.c.Micropub.ChannelsTaxonomy != "" {
270268
err = s.indexAllTaxonomies(entries, s.c.Micropub.ChannelsTaxonomy)
271269
if err != nil {
272-
s.n.Error(err)
270+
s.log.Errorw("failed to index all taxonomies", "taxonomy", s.c.Micropub.ChannelsTaxonomy, "err", err)
273271
}
274272
}
275273

@@ -291,8 +289,7 @@ func (s *Server) withRecoverer(next http.Handler) http.Handler {
291289
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
292290
defer func() {
293291
if rvr := recover(); rvr != nil && rvr != http.ErrAbortHandler {
294-
err := fmt.Errorf("panic while serving: %v: %s", rvr, string(debug.Stack()))
295-
s.n.Error(err)
292+
s.log.Errorw("panic while serving", "rvr", rvr, "stack", string(debug.Stack()))
296293
w.WriteHeader(http.StatusInternalServerError)
297294
}
298295
}()
@@ -329,7 +326,7 @@ func (s *Server) withSecurityHeaders(next http.Handler) http.Handler {
329326
func (s *Server) syncStorage() {
330327
changedFiles, err := s.core.Sync()
331328
if err != nil {
332-
s.n.Error(fmt.Errorf("sync storage: %w", err))
329+
s.log.Errorw("failed to sync storage", "err", err)
333330
return
334331
}
335332

@@ -353,7 +350,7 @@ func (s *Server) syncStorage() {
353350
buildClean = true
354351
continue
355352
} else if err != nil {
356-
s.n.Error(fmt.Errorf("cannot open entry to update %s: %w", id, err))
353+
s.log.Errorw("failed to open entry to update", "id", id, "err", err)
357354
continue
358355
} else {
359356
ee = append(ee, e)
@@ -370,11 +367,11 @@ func (s *Server) syncStorage() {
370367
if s.meilisearch != nil {
371368
err = s.meilisearch.Add(ee...)
372369
if err != nil {
373-
s.n.Error(fmt.Errorf("meilisearch sync failed: %w", err))
370+
s.log.Errorw("failed to add entries to meilisearch", "err", err)
374371
}
375372
}
376373

377-
s.buildNotify(buildClean)
374+
s.build(buildClean)
378375

379376
// TODO: smh call postSave here
380377

@@ -388,7 +385,7 @@ func (s *Server) syncStorage() {
388385

389386
err = s.core.SendWebmentions(e.Permalink, previousLinks[e.Permalink]...)
390387
if err != nil {
391-
s.n.Error(fmt.Errorf("send webmentions: %w", err))
388+
s.log.Errorw("failed to send webmentions", "id", e.Permalink, "err", err)
392389
}
393390
}
394391
}
@@ -408,10 +405,10 @@ func idsFromChangedFiles(changedFiles []string) []string {
408405
return ids
409406
}
410407

411-
func (s *Server) buildNotify(clean bool) {
408+
func (s *Server) build(clean bool) {
412409
err := s.core.Build(clean)
413410
if err != nil {
414-
s.n.Error(fmt.Errorf("build failed: %w", err))
411+
s.log.Errorw("failed to build", "err", err)
415412
}
416413
}
417414

@@ -426,7 +423,7 @@ func (s *Server) buildHook(dir string) {
426423
if oldFs != nil {
427424
err := os.RemoveAll(oldFs.dir)
428425
if err != nil {
429-
s.n.Error(fmt.Errorf("could not delete old directory: %w", err))
426+
s.log.Errorw("failed to delete old build directory", "path", oldFs.dir, "err", err)
430427
}
431428
}
432429
}

‎server/server_init.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ func (s *Server) initCron() error {
178178
}
179179

180180
if err := cronPlugin.DailyCron(); err != nil {
181-
s.n.Error(fmt.Errorf("cron job (plugin %s): %w", name, err))
181+
s.log.Errorw("plugin cron job execution failed", "plugin", name, "err", err)
182182
}
183183
}
184184

‎server/webhook.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ func (s *Server) webhookPost(w http.ResponseWriter, r *http.Request) {
3030
mac := hmac.New(sha1.New, []byte(s.c.WebhookSecret))
3131
_, err = mac.Write(payload)
3232
if err != nil {
33-
s.log.Error("webhook: could not write mac", err)
33+
s.log.Errorw("webhook: could not write mac", "err", err)
3434
return
3535
}
3636
expectedMAC := hex.EncodeToString(mac.Sum(nil))

‎server/webmentions.go

+7-13
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ func (s *Server) commentsPost(w http.ResponseWriter, r *http.Request) {
8585
return
8686
}
8787

88-
s.n.Info(fmt.Sprintf("💬 #mention pending approval for %q", e.Permalink))
88+
s.n.Notify(fmt.Sprintf("💬 #mention pending approval for %q", e.Permalink))
8989
http.Redirect(w, r, s.c.Comments.Redirect, http.StatusSeeOther)
9090
}
9191

@@ -102,7 +102,7 @@ func (s *Server) webmentionPost(w http.ResponseWriter, r *http.Request) {
102102
err := json.NewDecoder(r.Body).Decode(&payload)
103103
if err != nil {
104104
w.WriteHeader(http.StatusBadRequest)
105-
s.log.Warnf("error when decoding webmention: %s", err.Error())
105+
s.log.Errorw("error decoding webmention", "err", err)
106106
return
107107
}
108108

@@ -120,20 +120,16 @@ func (s *Server) handleWebmention(payload *webmentionPayload) {
120120
s.log.Infow("received webmention", "webmention", payload)
121121
e, err := s.core.GetEntryFromPermalink(payload.Target)
122122
if err != nil {
123-
err = fmt.Errorf("could not get entry for permalink %s: %w", payload.Target, err)
124-
s.log.Errorf("webmention", err)
125-
s.n.Error(err)
123+
s.log.Errorw("failed to get entry for permalink", "target", payload.Target, "err", err)
126124
return
127125
}
128126

129127
if payload.Deleted {
130128
err = s.core.DeleteWebmention(e.ID, payload.Source)
131129
if err != nil {
132-
err = fmt.Errorf("could not delete webmention for %s: %w", payload.Target, err)
133-
s.log.Errorf("webmention", err)
134-
s.n.Error(err)
130+
s.log.Errorw("failed to delete webmention", "target", payload.Target, "err", err)
135131
} else {
136-
s.n.Info(fmt.Sprintf("💬 #mention deleted for %q: %q", e.Permalink, payload.Source))
132+
s.n.Notify(fmt.Sprintf("💬 #mention deleted for %q: %q", e.Permalink, payload.Source))
137133
}
138134
return
139135
}
@@ -149,10 +145,8 @@ func (s *Server) handleWebmention(payload *webmentionPayload) {
149145

150146
err = s.bolt.AddMention(context.Background(), mention)
151147
if err != nil {
152-
err = fmt.Errorf("could not add webmention for %s: %w", payload.Target, err)
153-
s.log.Errorf("webmention", err)
154-
s.n.Error(err)
148+
s.log.Errorw("failed to add webmention", "target", payload.Target, "err", err)
155149
} else {
156-
s.n.Info(fmt.Sprintf("💬 #mention pending approval for %q: %q", e.Permalink, payload.Source))
150+
s.n.Notify(fmt.Sprintf("💬 #mention pending approval for %q: %q", e.Permalink, payload.Source))
157151
}
158152
}

‎services/media/media.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ func (m *Media) upload(filename, ext string, data []byte) (string, error) {
100100
if isImage(ext) {
101101
str, err := m.uploadImage(filename, data)
102102
if err != nil {
103-
m.log.Warnf("could not upload image: %s", err.Error())
103+
m.log.Errorf("failed to upload image", "filename", filename, "ext", ext, "err", err)
104104
} else {
105105
return str, nil
106106
}

‎services/telegram/telegram.go

+7-20
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,15 @@ import (
88
)
99

1010
type Telegram struct {
11-
chat int64
12-
errLog *zap.SugaredLogger
13-
bot *tb.Bot
11+
chat int64
12+
log *zap.SugaredLogger
13+
bot *tb.Bot
1414
}
1515

1616
func NewTelegram(c *core.Telegram) (*Telegram, error) {
1717
n := &Telegram{
18-
chat: c.ChatID,
19-
errLog: log.S().Named("telegram"),
18+
chat: c.ChatID,
19+
log: log.S().Named("telegram"),
2020
}
2121
bot, err := tb.NewBot(tb.Settings{Token: c.Token})
2222
if err != nil {
@@ -27,26 +27,13 @@ func NewTelegram(c *core.Telegram) (*Telegram, error) {
2727
return n, nil
2828
}
2929

30-
func (n *Telegram) Info(msg string) {
30+
func (n *Telegram) Notify(msg string) {
3131
_, err := n.bot.Send(&tb.Chat{ID: n.chat}, msg, &tb.SendOptions{
3232
DisableWebPagePreview: true,
3333
ParseMode: tb.ModeDefault,
3434
})
3535

3636
if err != nil {
37-
n.errLog.Error(err)
38-
}
39-
}
40-
41-
func (n *Telegram) Error(err error) {
42-
n.errLog.Error(err)
43-
44-
_, botErr := n.bot.Send(&tb.Chat{ID: n.chat}, "An error occurred:\n"+err.Error(), &tb.SendOptions{
45-
DisableWebPagePreview: true,
46-
ParseMode: tb.ModeDefault,
47-
})
48-
49-
if botErr != nil {
50-
n.errLog.Error(err)
37+
n.log.Error(err)
5138
}
5239
}

0 commit comments

Comments
 (0)
Please sign in to comment.