subreddit: starting download preemptively sends now sends "requires at least one device enabled message" if no devices are enabled

This commit is contained in:
Tigor Hutasuhut 2024-05-07 10:33:56 +07:00
parent ab810c4b45
commit 6bd219ea4f
3 changed files with 69 additions and 7 deletions

19
api/devices_count.go Normal file
View file

@ -0,0 +1,19 @@
package api
import (
"context"
"github.com/tigorlazuardi/redmage/models"
"github.com/tigorlazuardi/redmage/pkg/errs"
)
func (api *API) DevicesCountEnabled(ctx context.Context) (int64, error) {
ctx, span := tracer.Start(ctx, "*API.DevicesCountEnabled")
defer span.End()
count, err := models.Devices.Query(ctx, api.db, models.SelectWhere.Devices.Enable.EQ(1)).Count()
if err != nil {
return 0, errs.Wrapw(err, "failed to count enabled devices")
}
return count, nil
}

View file

@ -22,14 +22,18 @@ type ChiEntry struct {
} }
func (ch *ChiEntry) Write(status int, bytes int, header http.Header, elapsed time.Duration, extra interface{}) { func (ch *ChiEntry) Write(status int, bytes int, header http.Header, elapsed time.Duration, extra interface{}) {
elasedStr := formatDuration(elapsed) elapsedStr := formatDuration(elapsed)
message := fmt.Sprintf("%s %s %d %s", ch.request.Method, ch.request.URL, status, elasedStr) message := fmt.Sprintf("%s %s %d %s %s", ch.request.Method, ch.request.URL, status, elapsedStr, formatByteSize(bytes))
requestLog := slog.Attr{Key: "request", Value: ch.extractRequestLog()} var group slog.Attr
responseLog := slog.Group("response", "status", status, "headers", flat(header), "bytes", bytes)
roundtripLog := slog.String("elapsed", elasedStr) if status >= 500 {
requestLog := slog.Attr{Key: "request", Value: ch.extractRequestLog()}
responseLog := slog.Group("response", "status", status, "headers", flat(header), "bytes", bytes)
roundtripLog := slog.String("elapsed", elapsedStr)
group = slog.Group("http", requestLog, responseLog, roundtripLog)
}
group := slog.Group("http", requestLog, responseLog, roundtripLog)
if status >= 400 { if status >= 400 {
log.New(ch.request.Context()).With(group).Error(message) log.New(ch.request.Context()).With(group).Error(message)
return return
@ -38,6 +42,25 @@ func (ch *ChiEntry) Write(status int, bytes int, header http.Header, elapsed tim
log.New(ch.request.Context()).With(group).Info(message) log.New(ch.request.Context()).With(group).Info(message)
} }
func formatByteSize(bytes int) string {
const (
kb = 1024
mb = 1024 * kb
gb = 1024 * mb
)
switch {
case bytes >= gb:
return fmt.Sprintf("%.2fGB", float64(bytes)/float64(gb))
case bytes >= mb:
return fmt.Sprintf("%.2fMB", float64(bytes)/float64(mb))
case bytes >= kb:
return fmt.Sprintf("%.2fKB", float64(bytes)/float64(kb))
default:
return fmt.Sprintf("%d bytes", bytes)
}
}
func (ch *ChiEntry) Panic(v interface{}, stack []byte) { func (ch *ChiEntry) Panic(v interface{}, stack []byte) {
group := slog.Group("http", slog.Attr{Key: "request", Value: ch.extractRequestLog()}) group := slog.Group("http", slog.Attr{Key: "request", Value: ch.extractRequestLog()})
entry := log.New(ch.request.Context()) entry := log.New(ch.request.Context())

View file

@ -55,10 +55,30 @@ func (routes *Routes) SubredditStartDownloadHTMX(rw http.ResponseWriter, r *http
return return
} }
count, err := routes.API.DevicesCountEnabled(ctx)
if err != nil {
log.New(ctx).Err(err).Error("failed to devices")
code, message := errs.HTTPMessage(err)
rw.WriteHeader(code)
if err := components.ErrorNotication(message).Render(ctx, rw); err != nil {
log.New(ctx).Err(err).Error("failed to render error notification")
}
return
}
if count == 0 {
msg := "Starting subreddit download requires at least one device configured and enabled"
rw.WriteHeader(http.StatusBadRequest)
if err := components.ErrorNotication(msg).Render(ctx, rw); err != nil {
log.New(ctx).Err(err).Error("failed to render error notification")
}
return
}
var body api.PubsubStartDownloadSubredditParams var body api.PubsubStartDownloadSubredditParams
body.Subreddit = r.FormValue("subreddit") body.Subreddit = r.FormValue("subreddit")
err := routes.API.PubsubStartDownloadSubreddit(ctx, body) err = routes.API.PubsubStartDownloadSubreddit(ctx, body)
if err != nil { if err != nil {
log.New(ctx).Err(err).Error("failed to start subreddit download", "subreddit", body.Subreddit) log.New(ctx).Err(err).Error("failed to start subreddit download", "subreddit", body.Subreddit)
code, message := errs.HTTPMessage(err) code, message := errs.HTTPMessage(err)