slack5-1770529463/services/preferences-api/internal/adapter/postgres/preference.go
rdev-worker 73532902e7
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
build: /implement-feature user-preferences
2026-02-08 06:13:10 +00:00

69 lines
2.0 KiB
Go

package postgres
import (
"context"
"time"
"github.com/jmoiron/sqlx"
"git.threesix.ai/jordan/slack5-1770529463/services/preferences-api/internal/port"
)
// Compile-time verification that PreferenceRepository implements port.PreferenceRepository.
var _ port.PreferenceRepository = (*PreferenceRepository)(nil)
// preferenceRow is the database representation of a preference row.
type preferenceRow struct {
UserID string `db:"user_id"`
Key string `db:"key"`
Value string `db:"value"`
CreatedAt time.Time `db:"created_at"`
UpdatedAt time.Time `db:"updated_at"`
}
// PreferenceRepository is a PostgreSQL implementation of port.PreferenceRepository.
type PreferenceRepository struct {
db *sqlx.DB
}
// NewPreferenceRepository creates a new PostgreSQL preference repository.
func NewPreferenceRepository(db *sqlx.DB) *PreferenceRepository {
return &PreferenceRepository{db: db}
}
// GetByUserID returns all stored preferences for a user.
func (r *PreferenceRepository) GetByUserID(ctx context.Context, userID string) ([]port.PreferenceRow, error) {
var rows []preferenceRow
err := r.db.SelectContext(ctx, &rows,
`SELECT user_id, key, value, created_at, updated_at FROM user_preferences WHERE user_id = $1`,
userID,
)
if err != nil {
return nil, err
}
result := make([]port.PreferenceRow, len(rows))
for i, row := range rows {
result[i] = port.PreferenceRow{
UserID: row.UserID,
Key: row.Key,
Value: row.Value,
CreatedAt: row.CreatedAt,
UpdatedAt: row.UpdatedAt,
}
}
return result, nil
}
// Upsert creates or updates a single preference for a user.
func (r *PreferenceRepository) Upsert(ctx context.Context, userID string, key string, value string) error {
_, err := r.db.ExecContext(ctx,
`INSERT INTO user_preferences (user_id, key, value, created_at, updated_at)
VALUES ($1, $2, $3, NOW(), NOW())
ON CONFLICT (user_id, key)
DO UPDATE SET value = EXCLUDED.value, updated_at = NOW()`,
userID, key, value,
)
return err
}