diff options
| author | Anhgelus Morhtuuzh <william@herges.fr> | 2025-12-21 22:16:52 +0100 |
|---|---|---|
| committer | Anhgelus Morhtuuzh <william@herges.fr> | 2025-12-21 22:36:49 +0100 |
| commit | 322826d06e425297fcbbc976a0566868a74f2d87 (patch) | |
| tree | d8d1240b0d11c5f770a67de439c4710fd0396336 /backend/stats.go | |
| parent | 453e9805ef6583e2177fb55fa1e45cf5816a7e67 (diff) | |
feat(backend): record every jump between pages
Diffstat (limited to 'backend/stats.go')
| -rw-r--r-- | backend/stats.go | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/backend/stats.go b/backend/stats.go new file mode 100644 index 0000000..e2ad08b --- /dev/null +++ b/backend/stats.go @@ -0,0 +1,47 @@ +package backend + +import ( + "context" + "database/sql" + "net/http" + "regexp" + "strings" +) + +var trimRefererReg = regexp.MustCompile(`https?://([a-z-0-9.]+)(:\d+)?/.*`) + +func UpdateStats(ctx context.Context, db *sql.DB, r *http.Request) error { + target := r.URL.Path + if strings.HasPrefix(target, "/assets") || strings.HasPrefix(target, "/static") { + return nil + } + ref := r.Header.Get("Referer") + if ref == "" { + return nil + } + subs := trimRefererReg.FindStringSubmatch(ref) + if len(subs) < 2 { + return nil + } + ref = subs[1] + if ref == ctx.Value(configKey).(*Config).Domain { + ref = subs[0][strings.Index(subs[0], ref)+len(ref):] + } + rows, err := db.QueryContext(ctx, "SELECT id, visit FROM stats WHERE origin = ? AND target = ?", ref, target) + if err != nil { + return err + } + if !rows.Next() { + _, err = db.ExecContext(ctx, "INSERT INTO stats (origin, target, visit) VALUES (?, ?, 1)", ref, target) + return err + } + var id uint + var nb uint + rows.Scan(&id, &nb) + err = rows.Close() + if err != nil { + return err + } + _, err = db.ExecContext(ctx, "UPDATE stats SET visit = ? WHERE id = ?", nb+1, id) + return err +} |
