|
|
|
@@ -54,7 +54,7 @@ func (q *Queries) CountUsers(ctx context.Context) (int64, error) {
|
|
|
|
|
const createUser = `-- name: CreateUser :one
|
|
|
|
|
INSERT INTO users (username, password_hash, api_token, is_admin, display_name)
|
|
|
|
|
VALUES ($1, $2, $3, $4, $5)
|
|
|
|
|
RETURNING id, username, password_hash, api_token, is_admin, created_at, subsonic_password, listenbrainz_token, listenbrainz_enabled, display_name, auto_approve_requests, email
|
|
|
|
|
RETURNING id, username, password_hash, api_token, is_admin, created_at, subsonic_password, listenbrainz_token, listenbrainz_enabled, display_name, auto_approve_requests, email, timezone, timezone_updated_at
|
|
|
|
|
`
|
|
|
|
|
|
|
|
|
|
type CreateUserParams struct {
|
|
|
|
@@ -87,6 +87,8 @@ func (q *Queries) CreateUser(ctx context.Context, arg CreateUserParams) (User, e
|
|
|
|
|
&i.DisplayName,
|
|
|
|
|
&i.AutoApproveRequests,
|
|
|
|
|
&i.Email,
|
|
|
|
|
&i.Timezone,
|
|
|
|
|
&i.TimezoneUpdatedAt,
|
|
|
|
|
)
|
|
|
|
|
return i, err
|
|
|
|
|
}
|
|
|
|
@@ -94,7 +96,7 @@ func (q *Queries) CreateUser(ctx context.Context, arg CreateUserParams) (User, e
|
|
|
|
|
const createUserAdmin = `-- name: CreateUserAdmin :one
|
|
|
|
|
INSERT INTO users (username, password_hash, api_token, is_admin, display_name)
|
|
|
|
|
VALUES ($1, $2, $3, $4, $5)
|
|
|
|
|
RETURNING id, username, password_hash, api_token, is_admin, created_at, subsonic_password, listenbrainz_token, listenbrainz_enabled, display_name, auto_approve_requests, email
|
|
|
|
|
RETURNING id, username, password_hash, api_token, is_admin, created_at, subsonic_password, listenbrainz_token, listenbrainz_enabled, display_name, auto_approve_requests, email, timezone, timezone_updated_at
|
|
|
|
|
`
|
|
|
|
|
|
|
|
|
|
type CreateUserAdminParams struct {
|
|
|
|
@@ -130,6 +132,8 @@ func (q *Queries) CreateUserAdmin(ctx context.Context, arg CreateUserAdminParams
|
|
|
|
|
&i.DisplayName,
|
|
|
|
|
&i.AutoApproveRequests,
|
|
|
|
|
&i.Email,
|
|
|
|
|
&i.Timezone,
|
|
|
|
|
&i.TimezoneUpdatedAt,
|
|
|
|
|
)
|
|
|
|
|
return i, err
|
|
|
|
|
}
|
|
|
|
@@ -141,7 +145,7 @@ VALUES (
|
|
|
|
|
(SELECT NOT EXISTS (SELECT 1 FROM users)),
|
|
|
|
|
$4
|
|
|
|
|
)
|
|
|
|
|
RETURNING id, username, password_hash, api_token, is_admin, created_at, subsonic_password, listenbrainz_token, listenbrainz_enabled, display_name, auto_approve_requests, email
|
|
|
|
|
RETURNING id, username, password_hash, api_token, is_admin, created_at, subsonic_password, listenbrainz_token, listenbrainz_enabled, display_name, auto_approve_requests, email, timezone, timezone_updated_at
|
|
|
|
|
`
|
|
|
|
|
|
|
|
|
|
type CreateUserFirstAdminRaceParams struct {
|
|
|
|
@@ -185,6 +189,8 @@ func (q *Queries) CreateUserFirstAdminRace(ctx context.Context, arg CreateUserFi
|
|
|
|
|
&i.DisplayName,
|
|
|
|
|
&i.AutoApproveRequests,
|
|
|
|
|
&i.Email,
|
|
|
|
|
&i.Timezone,
|
|
|
|
|
&i.TimezoneUpdatedAt,
|
|
|
|
|
)
|
|
|
|
|
return i, err
|
|
|
|
|
}
|
|
|
|
@@ -231,7 +237,7 @@ func (q *Queries) GetListenBrainzConfig(ctx context.Context, id pgtype.UUID) (Ge
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const getUserByAPIToken = `-- name: GetUserByAPIToken :one
|
|
|
|
|
SELECT id, username, password_hash, api_token, is_admin, created_at, subsonic_password, listenbrainz_token, listenbrainz_enabled, display_name, auto_approve_requests, email FROM users WHERE api_token = $1
|
|
|
|
|
SELECT id, username, password_hash, api_token, is_admin, created_at, subsonic_password, listenbrainz_token, listenbrainz_enabled, display_name, auto_approve_requests, email, timezone, timezone_updated_at FROM users WHERE api_token = $1
|
|
|
|
|
`
|
|
|
|
|
|
|
|
|
|
func (q *Queries) GetUserByAPIToken(ctx context.Context, apiToken string) (User, error) {
|
|
|
|
@@ -250,12 +256,14 @@ func (q *Queries) GetUserByAPIToken(ctx context.Context, apiToken string) (User,
|
|
|
|
|
&i.DisplayName,
|
|
|
|
|
&i.AutoApproveRequests,
|
|
|
|
|
&i.Email,
|
|
|
|
|
&i.Timezone,
|
|
|
|
|
&i.TimezoneUpdatedAt,
|
|
|
|
|
)
|
|
|
|
|
return i, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const getUserByEmail = `-- name: GetUserByEmail :one
|
|
|
|
|
SELECT id, username, password_hash, api_token, is_admin, created_at, subsonic_password, listenbrainz_token, listenbrainz_enabled, display_name, auto_approve_requests, email FROM users WHERE lower(email) = lower($1)
|
|
|
|
|
SELECT id, username, password_hash, api_token, is_admin, created_at, subsonic_password, listenbrainz_token, listenbrainz_enabled, display_name, auto_approve_requests, email, timezone, timezone_updated_at FROM users WHERE lower(email) = lower($1)
|
|
|
|
|
`
|
|
|
|
|
|
|
|
|
|
// Used by forgot-password lookup. Lowercase comparison both sides
|
|
|
|
@@ -277,12 +285,14 @@ func (q *Queries) GetUserByEmail(ctx context.Context, lower string) (User, error
|
|
|
|
|
&i.DisplayName,
|
|
|
|
|
&i.AutoApproveRequests,
|
|
|
|
|
&i.Email,
|
|
|
|
|
&i.Timezone,
|
|
|
|
|
&i.TimezoneUpdatedAt,
|
|
|
|
|
)
|
|
|
|
|
return i, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const getUserByID = `-- name: GetUserByID :one
|
|
|
|
|
SELECT id, username, password_hash, api_token, is_admin, created_at, subsonic_password, listenbrainz_token, listenbrainz_enabled, display_name, auto_approve_requests, email FROM users WHERE id = $1
|
|
|
|
|
SELECT id, username, password_hash, api_token, is_admin, created_at, subsonic_password, listenbrainz_token, listenbrainz_enabled, display_name, auto_approve_requests, email, timezone, timezone_updated_at FROM users WHERE id = $1
|
|
|
|
|
`
|
|
|
|
|
|
|
|
|
|
func (q *Queries) GetUserByID(ctx context.Context, id pgtype.UUID) (User, error) {
|
|
|
|
@@ -301,12 +311,14 @@ func (q *Queries) GetUserByID(ctx context.Context, id pgtype.UUID) (User, error)
|
|
|
|
|
&i.DisplayName,
|
|
|
|
|
&i.AutoApproveRequests,
|
|
|
|
|
&i.Email,
|
|
|
|
|
&i.Timezone,
|
|
|
|
|
&i.TimezoneUpdatedAt,
|
|
|
|
|
)
|
|
|
|
|
return i, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const getUserByUsername = `-- name: GetUserByUsername :one
|
|
|
|
|
SELECT id, username, password_hash, api_token, is_admin, created_at, subsonic_password, listenbrainz_token, listenbrainz_enabled, display_name, auto_approve_requests, email FROM users WHERE username = $1
|
|
|
|
|
SELECT id, username, password_hash, api_token, is_admin, created_at, subsonic_password, listenbrainz_token, listenbrainz_enabled, display_name, auto_approve_requests, email, timezone, timezone_updated_at FROM users WHERE username = $1
|
|
|
|
|
`
|
|
|
|
|
|
|
|
|
|
func (q *Queries) GetUserByUsername(ctx context.Context, username string) (User, error) {
|
|
|
|
@@ -325,10 +337,50 @@ func (q *Queries) GetUserByUsername(ctx context.Context, username string) (User,
|
|
|
|
|
&i.DisplayName,
|
|
|
|
|
&i.AutoApproveRequests,
|
|
|
|
|
&i.Email,
|
|
|
|
|
&i.Timezone,
|
|
|
|
|
&i.TimezoneUpdatedAt,
|
|
|
|
|
)
|
|
|
|
|
return i, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const listActiveUsersWithTimezones = `-- name: ListActiveUsersWithTimezones :many
|
|
|
|
|
SELECT u.id, u.timezone FROM users u
|
|
|
|
|
WHERE EXISTS (
|
|
|
|
|
SELECT 1 FROM play_events pe
|
|
|
|
|
WHERE pe.user_id = u.id
|
|
|
|
|
AND pe.started_at > now() - INTERVAL '7 days'
|
|
|
|
|
)
|
|
|
|
|
`
|
|
|
|
|
|
|
|
|
|
type ListActiveUsersWithTimezonesRow struct {
|
|
|
|
|
ID pgtype.UUID
|
|
|
|
|
Timezone string
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Returns (id, timezone) for every user with a play in the last 7
|
|
|
|
|
// days. The system-playlist scheduler iterates this list at startup
|
|
|
|
|
// and during its hourly reconciliation to discover newly-active /
|
|
|
|
|
// no-longer-active users.
|
|
|
|
|
func (q *Queries) ListActiveUsersWithTimezones(ctx context.Context) ([]ListActiveUsersWithTimezonesRow, error) {
|
|
|
|
|
rows, err := q.db.Query(ctx, listActiveUsersWithTimezones)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
defer rows.Close()
|
|
|
|
|
var items []ListActiveUsersWithTimezonesRow
|
|
|
|
|
for rows.Next() {
|
|
|
|
|
var i ListActiveUsersWithTimezonesRow
|
|
|
|
|
if err := rows.Scan(&i.ID, &i.Timezone); err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
items = append(items, i)
|
|
|
|
|
}
|
|
|
|
|
if err := rows.Err(); err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
return items, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const listUsers = `-- name: ListUsers :many
|
|
|
|
|
SELECT id, username, display_name, is_admin, auto_approve_requests, created_at
|
|
|
|
|
FROM users
|
|
|
|
@@ -374,7 +426,7 @@ func (q *Queries) ListUsers(ctx context.Context) ([]ListUsersRow, error) {
|
|
|
|
|
|
|
|
|
|
const regenerateApiToken = `-- name: RegenerateApiToken :one
|
|
|
|
|
UPDATE users SET api_token = $2 WHERE id = $1
|
|
|
|
|
RETURNING id, username, password_hash, api_token, is_admin, created_at, subsonic_password, listenbrainz_token, listenbrainz_enabled, display_name, auto_approve_requests, email
|
|
|
|
|
RETURNING id, username, password_hash, api_token, is_admin, created_at, subsonic_password, listenbrainz_token, listenbrainz_enabled, display_name, auto_approve_requests, email, timezone, timezone_updated_at
|
|
|
|
|
`
|
|
|
|
|
|
|
|
|
|
type RegenerateApiTokenParams struct {
|
|
|
|
@@ -400,6 +452,8 @@ func (q *Queries) RegenerateApiToken(ctx context.Context, arg RegenerateApiToken
|
|
|
|
|
&i.DisplayName,
|
|
|
|
|
&i.AutoApproveRequests,
|
|
|
|
|
&i.Email,
|
|
|
|
|
&i.Timezone,
|
|
|
|
|
&i.TimezoneUpdatedAt,
|
|
|
|
|
)
|
|
|
|
|
return i, err
|
|
|
|
|
}
|
|
|
|
@@ -477,7 +531,7 @@ const updateUserAdmin = `-- name: UpdateUserAdmin :one
|
|
|
|
|
UPDATE users
|
|
|
|
|
SET is_admin = $2
|
|
|
|
|
WHERE id = $1
|
|
|
|
|
RETURNING id, username, password_hash, api_token, is_admin, created_at, subsonic_password, listenbrainz_token, listenbrainz_enabled, display_name, auto_approve_requests, email
|
|
|
|
|
RETURNING id, username, password_hash, api_token, is_admin, created_at, subsonic_password, listenbrainz_token, listenbrainz_enabled, display_name, auto_approve_requests, email, timezone, timezone_updated_at
|
|
|
|
|
`
|
|
|
|
|
|
|
|
|
|
type UpdateUserAdminParams struct {
|
|
|
|
@@ -503,6 +557,8 @@ func (q *Queries) UpdateUserAdmin(ctx context.Context, arg UpdateUserAdminParams
|
|
|
|
|
&i.DisplayName,
|
|
|
|
|
&i.AutoApproveRequests,
|
|
|
|
|
&i.Email,
|
|
|
|
|
&i.Timezone,
|
|
|
|
|
&i.TimezoneUpdatedAt,
|
|
|
|
|
)
|
|
|
|
|
return i, err
|
|
|
|
|
}
|
|
|
|
@@ -511,7 +567,7 @@ const updateUserAutoApprove = `-- name: UpdateUserAutoApprove :one
|
|
|
|
|
UPDATE users
|
|
|
|
|
SET auto_approve_requests = $2
|
|
|
|
|
WHERE id = $1
|
|
|
|
|
RETURNING id, username, password_hash, api_token, is_admin, created_at, subsonic_password, listenbrainz_token, listenbrainz_enabled, display_name, auto_approve_requests, email
|
|
|
|
|
RETURNING id, username, password_hash, api_token, is_admin, created_at, subsonic_password, listenbrainz_token, listenbrainz_enabled, display_name, auto_approve_requests, email, timezone, timezone_updated_at
|
|
|
|
|
`
|
|
|
|
|
|
|
|
|
|
type UpdateUserAutoApproveParams struct {
|
|
|
|
@@ -536,6 +592,8 @@ func (q *Queries) UpdateUserAutoApprove(ctx context.Context, arg UpdateUserAutoA
|
|
|
|
|
&i.DisplayName,
|
|
|
|
|
&i.AutoApproveRequests,
|
|
|
|
|
&i.Email,
|
|
|
|
|
&i.Timezone,
|
|
|
|
|
&i.TimezoneUpdatedAt,
|
|
|
|
|
)
|
|
|
|
|
return i, err
|
|
|
|
|
}
|
|
|
|
@@ -545,7 +603,7 @@ UPDATE users
|
|
|
|
|
SET display_name = $2,
|
|
|
|
|
email = $3
|
|
|
|
|
WHERE id = $1
|
|
|
|
|
RETURNING id, username, password_hash, api_token, is_admin, created_at, subsonic_password, listenbrainz_token, listenbrainz_enabled, display_name, auto_approve_requests, email
|
|
|
|
|
RETURNING id, username, password_hash, api_token, is_admin, created_at, subsonic_password, listenbrainz_token, listenbrainz_enabled, display_name, auto_approve_requests, email, timezone, timezone_updated_at
|
|
|
|
|
`
|
|
|
|
|
|
|
|
|
|
type UpdateUserProfileParams struct {
|
|
|
|
@@ -572,6 +630,28 @@ func (q *Queries) UpdateUserProfile(ctx context.Context, arg UpdateUserProfilePa
|
|
|
|
|
&i.DisplayName,
|
|
|
|
|
&i.AutoApproveRequests,
|
|
|
|
|
&i.Email,
|
|
|
|
|
&i.Timezone,
|
|
|
|
|
&i.TimezoneUpdatedAt,
|
|
|
|
|
)
|
|
|
|
|
return i, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const updateUserTimezone = `-- name: UpdateUserTimezone :exec
|
|
|
|
|
UPDATE users
|
|
|
|
|
SET timezone = $2,
|
|
|
|
|
timezone_updated_at = now()
|
|
|
|
|
WHERE id = $1
|
|
|
|
|
`
|
|
|
|
|
|
|
|
|
|
type UpdateUserTimezoneParams struct {
|
|
|
|
|
ID pgtype.UUID
|
|
|
|
|
Timezone string
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Sets the user's IANA timezone and bumps timezone_updated_at. The
|
|
|
|
|
// handler validates the timezone string via time.LoadLocation before
|
|
|
|
|
// calling this; the DB does not re-validate.
|
|
|
|
|
func (q *Queries) UpdateUserTimezone(ctx context.Context, arg UpdateUserTimezoneParams) error {
|
|
|
|
|
_, err := q.db.Exec(ctx, updateUserTimezone, arg.ID, arg.Timezone)
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|