This repository has been archived on 2026-04-03. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
core/server/store/sqlite/presence.go
Jeffrey Smith 11fd8c1e57 step 1: rename module chat-switchboard → switchboard-core
- go.mod module name
- All 714 import references across 289 Go files
- VERSION: 0.1.0
- CI DB names: switchboard_core_{ci,dev,test}
- Docker image: gobha/switchboard-core
- Test fixtures: JWT issuer, repo names
- .env.example, docker-compose container name
- Compiles clean (go build exit 0)
2026-03-25 19:48:04 -04:00

56 lines
1.5 KiB
Go

package sqlite
import (
"context"
"database/sql"
"time"
"switchboard-core/store"
)
// PresenceStore manages user_presence table.
type PresenceStore struct{}
func NewPresenceStore() *PresenceStore { return &PresenceStore{} }
func (s *PresenceStore) Heartbeat(ctx context.Context, userID string) error {
_, err := DB.ExecContext(ctx, `
INSERT INTO user_presence (user_id, last_seen, status)
VALUES (?, datetime('now'), 'online')
ON CONFLICT (user_id) DO UPDATE
SET last_seen = datetime('now'), status = 'online'
`, userID)
return err
}
func (s *PresenceStore) GetLastSeen(ctx context.Context, userID string) (*time.Time, error) {
var lastSeen time.Time
err := DB.QueryRowContext(ctx,
`SELECT last_seen FROM user_presence WHERE user_id = ?`, userID).Scan(st(&lastSeen))
if err == sql.ErrNoRows {
return nil, nil
}
if err != nil {
return nil, err
}
return &lastSeen, nil
}
func (s *PresenceStore) GetStatuses(ctx context.Context, userIDs []string, threshold time.Time) (map[string]string, error) {
result := make(map[string]string, len(userIDs))
for _, id := range userIDs {
var lastSeen time.Time
err := DB.QueryRowContext(ctx,
`SELECT last_seen FROM user_presence WHERE user_id = ?`, id).Scan(st(&lastSeen))
if err != nil || lastSeen.Before(threshold) {
result[id] = "offline"
} else {
result[id] = "online"
}
}
return result, nil
}
// Ensure PresenceStore satisfies the interface at compile time.
var _ store.PresenceStore = (*PresenceStore)(nil)