This repository has been archived on 2025-07-20. You can view files and clone it, but you cannot make any changes to it's state, such as pushing and creating new issues, pull requests or comments.
analytics/ingest/db/db.go
2023-04-05 14:24:23 +01:00

67 lines
1.7 KiB
Go

package db
import (
"context"
"database/sql"
"fmt"
"github.com/codemicro/analytics/ingest/config"
"github.com/codemicro/analytics/ingest/db/migrations"
"github.com/codemicro/analytics/ingest/db/models"
"github.com/rs/zerolog/log"
"github.com/uptrace/bun"
"github.com/uptrace/bun/dialect/sqlitedialect"
"github.com/uptrace/bun/driver/sqliteshim"
"github.com/uptrace/bun/extra/bundebug"
"github.com/uptrace/bun/migrate"
)
type DB struct {
DB *bun.DB
}
func New(conf *config.Config) (*DB, error) {
sqldb, err := sql.Open(sqliteshim.ShimName, conf.Database.DSN)
if err != nil {
panic(err)
}
db := bun.NewDB(sqldb, sqlitedialect.New())
if config.Debug {
db.AddQueryHook(bundebug.NewQueryHook(bundebug.WithVerbose(true)))
}
log.Info().Msg("migrating database")
mig := migrate.NewMigrator(db, migrations.Migrations)
if err := mig.Init(context.Background()); err != nil {
return nil, err
}
if group, err := mig.Migrate(context.Background()); err != nil {
return nil, err
} else if group.IsZero() {
log.Info().Msg("no migrations to run (database is up-to-date)")
} else {
log.Info().Msg("migrations completed")
}
return &DB{
DB: db,
}, nil
}
func (db *DB) GetSessionsWithActivityAfter(minutes int, sort string) ([]*models.Session, error) {
var sessions []*models.Session
q := db.DB.NewSelect().
Model((*models.Session)(nil)).
ColumnExpr("*").
ColumnExpr(`(select max("time") as "time" from requests where session_id = "session"."id") as "last_seen"`)
if sort != "" {
q = q.Order(sort)
}
if minutes > 0 {
q = q.Where(fmt.Sprintf(`datetime() < datetime("last_seen", '+%d minutes')`, minutes))
}
if err := q.Scan(context.Background(), &sessions); err != nil {
return nil, err
}
return sessions, nil
}