shortify/logger.go
2025-08-06 10:23:12 +02:00

73 lines
1.2 KiB
Go

package shortify
import (
"database/sql"
"fmt"
"time"
_ "github.com/marcboeker/go-duckdb/v2"
)
type VisitLog struct {
ShortID string
LongURL string
IP string
UserAgent string
Referer string
Language string
Time time.Time
}
func (s *Shortener) LogVisit(log VisitLog) {
s.logChan <- log
}
func (s *Shortener) startLogging() {
db, err := sql.Open("duckdb", s.DataFolder+"/analytics.db")
if err != nil {
fmt.Println(err)
return
}
defer db.Close()
_, err = db.Exec(`
CREATE SEQUENCE IF NOT EXISTS seq_visitid START 1;
CREATE TABLE IF NOT EXISTS visits (
id INTEGER PRIMARY KEY,
shortid VARCHAR,
longurl VARCHAR,
ip VARCHAR,
useragent VARCHAR,
referer VARCHAR,
language VARCHAR,
time TIMESTAMP
);
`)
if err != nil {
fmt.Println(err)
return
}
stmt, err := db.Prepare(`
INSERT INTO visits (id, shortid, longurl, ip, useragent, referer, language, time)
VALUES (nextval('seq_visitid'), ?, ?, ?, ?, ?, ?, ?)
`)
if err != nil {
fmt.Println(err)
return
}
defer stmt.Close()
for log := range s.logChan {
_, err = stmt.Exec(log.ShortID, log.LongURL, log.IP, log.UserAgent, log.Referer, log.Language, log.Time)
if err != nil {
fmt.Println(err)
return
}
}
}