61 lines
1.5 KiB
Go
61 lines
1.5 KiB
Go
package publicshare
|
|
|
|
import (
|
|
"context"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/jackc/pgx/v5/pgxpool"
|
|
)
|
|
|
|
// AccessStats tracks anonymous public link usage via Ulti API.
|
|
type AccessStats struct {
|
|
FirstAccessAt time.Time
|
|
LastAccessAt time.Time
|
|
AccessCount int64
|
|
}
|
|
|
|
// RecordAccess bumps usage counters for a public share token.
|
|
func RecordAccess(ctx context.Context, db *pgxpool.Pool, token string) {
|
|
if db == nil {
|
|
return
|
|
}
|
|
token = strings.TrimSpace(token)
|
|
if token == "" {
|
|
return
|
|
}
|
|
_, _ = db.Exec(ctx, `
|
|
INSERT INTO drive_public_share_access (token, first_access_at, last_access_at, access_count)
|
|
VALUES ($1, NOW(), NOW(), 1)
|
|
ON CONFLICT (token) DO UPDATE SET
|
|
last_access_at = NOW(),
|
|
access_count = drive_public_share_access.access_count + 1
|
|
`, token)
|
|
}
|
|
|
|
// Lookup returns access stats keyed by token.
|
|
func Lookup(ctx context.Context, db *pgxpool.Pool, tokens []string) (map[string]AccessStats, error) {
|
|
out := make(map[string]AccessStats)
|
|
if db == nil || len(tokens) == 0 {
|
|
return out, nil
|
|
}
|
|
rows, err := db.Query(ctx, `
|
|
SELECT token, first_access_at, last_access_at, access_count
|
|
FROM drive_public_share_access
|
|
WHERE token = ANY($1::text[])
|
|
`, tokens)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
for rows.Next() {
|
|
var token string
|
|
var stats AccessStats
|
|
if err := rows.Scan(&token, &stats.FirstAccessAt, &stats.LastAccessAt, &stats.AccessCount); err != nil {
|
|
return nil, err
|
|
}
|
|
out[token] = stats
|
|
}
|
|
return out, rows.Err()
|
|
}
|