2026-07-31 02:43:45 +01:00
|
|
|
package account
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"arimelody-web/model"
|
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
|
|
"github.com/jmoiron/sqlx"
|
|
|
|
|
_ "github.com/lib/pq"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type (
|
|
|
|
|
AccountRepositoryPostgres struct {
|
|
|
|
|
db *sqlx.DB
|
|
|
|
|
}
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
var _ AccountRepository = new(AccountRepositoryPostgres)
|
|
|
|
|
|
|
|
|
|
func NewAccountRepositoryPostgres(db *sqlx.DB) *AccountRepositoryPostgres {
|
|
|
|
|
return &AccountRepositoryPostgres{ db: db }
|
|
|
|
|
}
|
|
|
|
|
|
2026-07-31 04:20:39 +01:00
|
|
|
func (repo *AccountRepositoryPostgres) GetAll() ([]*model.Account, error) {
|
|
|
|
|
var accounts = []*model.Account{}
|
2026-07-31 02:43:45 +01:00
|
|
|
|
|
|
|
|
err := repo.db.Select(&accounts, "SELECT * FROM account ORDER BY created_at ASC")
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return accounts, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (repo *AccountRepositoryPostgres) GetCount() (int, error) {
|
|
|
|
|
accountsCount := 0
|
|
|
|
|
err := repo.db.Get(&accountsCount, "SELECT count(*) FROM account")
|
|
|
|
|
return accountsCount, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (repo *AccountRepositoryPostgres) GetByID(id string) (*model.Account, error) {
|
|
|
|
|
var account = model.Account{}
|
|
|
|
|
|
|
|
|
|
err := repo.db.Get(&account, "SELECT * FROM account WHERE id=$1", id)
|
|
|
|
|
if err != nil {
|
|
|
|
|
if strings.Contains(err.Error(), "no rows") {
|
|
|
|
|
return nil, nil
|
|
|
|
|
}
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return &account, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (repo *AccountRepositoryPostgres) GetByUsername(username string) (*model.Account, error) {
|
|
|
|
|
var account = model.Account{}
|
|
|
|
|
|
|
|
|
|
err := repo.db.Get(&account, "SELECT * FROM account WHERE username=$1", username)
|
|
|
|
|
if err != nil {
|
|
|
|
|
if strings.Contains(err.Error(), "no rows") {
|
|
|
|
|
return nil, nil
|
|
|
|
|
}
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return &account, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (repo *AccountRepositoryPostgres) GetByEmail(email string) (*model.Account, error) {
|
|
|
|
|
var account = model.Account{}
|
|
|
|
|
|
|
|
|
|
err := repo.db.Get(&account, "SELECT * FROM account WHERE email=$1", email)
|
|
|
|
|
if err != nil {
|
|
|
|
|
if strings.Contains(err.Error(), "no rows") {
|
|
|
|
|
return nil, nil
|
|
|
|
|
}
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return &account, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (repo *AccountRepositoryPostgres) Create(
|
|
|
|
|
username string,
|
|
|
|
|
password string,
|
|
|
|
|
email *string,
|
|
|
|
|
avatarURL *string,
|
|
|
|
|
) (string, error) {
|
|
|
|
|
var id string
|
|
|
|
|
|
|
|
|
|
err := repo.db.Get(
|
|
|
|
|
&id,
|
|
|
|
|
"INSERT INTO account (username, password, email, avatar_url) " +
|
|
|
|
|
"VALUES ($1, $2, $3, $4) " +
|
|
|
|
|
"RETURNING id",
|
|
|
|
|
username,
|
|
|
|
|
password,
|
|
|
|
|
email,
|
|
|
|
|
avatarURL,
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
return id, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (repo *AccountRepositoryPostgres) Update(
|
|
|
|
|
id string,
|
|
|
|
|
username string,
|
|
|
|
|
password string,
|
|
|
|
|
email *string,
|
|
|
|
|
avatarURL *string,
|
|
|
|
|
) error {
|
|
|
|
|
_, err := repo.db.Exec(
|
|
|
|
|
"UPDATE account " +
|
|
|
|
|
"SET username=$2,password=$3,email=$4,avatar_url=$5 " +
|
|
|
|
|
"WHERE id=$1",
|
|
|
|
|
id,
|
|
|
|
|
username,
|
|
|
|
|
password,
|
|
|
|
|
email,
|
|
|
|
|
avatarURL,
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (repo *AccountRepositoryPostgres) ChangeUsername(id string, username string) error {
|
|
|
|
|
_, err := repo.db.Exec(
|
|
|
|
|
"UPDATE account SET username=$2 WHERE id=$1",
|
|
|
|
|
id, username,
|
|
|
|
|
)
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
func (repo *AccountRepositoryPostgres) ChangePassword(id string, password string) error {
|
|
|
|
|
_, err := repo.db.Exec(
|
|
|
|
|
"UPDATE account SET password=$2 WHERE id=$1",
|
|
|
|
|
id, password,
|
|
|
|
|
)
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
func (repo *AccountRepositoryPostgres) ChangeEmail(id string, email string) error {
|
|
|
|
|
_, err := repo.db.Exec(
|
|
|
|
|
"UPDATE account SET email=$2 WHERE id=$1",
|
|
|
|
|
id, email,
|
|
|
|
|
)
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
func (repo *AccountRepositoryPostgres) RemoveEmail(id string) error {
|
|
|
|
|
_, err := repo.db.Exec("UPDATE account SET email=NULL WHERE id=$1", id)
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
func (repo *AccountRepositoryPostgres) ChangeAvatarURL(id string, avatarURL string) error {
|
|
|
|
|
_, err := repo.db.Exec(
|
|
|
|
|
"UPDATE account SET avatar_url=$2 WHERE id=$1",
|
|
|
|
|
id, avatarURL,
|
|
|
|
|
)
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
func (repo *AccountRepositoryPostgres) RemoveAvatar(id string) error {
|
|
|
|
|
_, err := repo.db.Exec("UPDATE account SET avatar_url=NULL WHERE id=$1", id)
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
2026-07-31 04:20:39 +01:00
|
|
|
func (repo *AccountRepositoryPostgres) Delete(id string) error {
|
|
|
|
|
_, err := repo.db.Exec("DELETE FROM account WHERE id=$1", id)
|
2026-07-31 02:43:45 +01:00
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Increment the number of account login failure attempts,
|
|
|
|
|
// returning the current fail count.
|
2026-07-31 04:20:39 +01:00
|
|
|
func (repo *AccountRepositoryPostgres) IncrementFails(id string) (int, error) {
|
2026-07-31 02:43:45 +01:00
|
|
|
failAttempts := 0
|
2026-07-31 04:20:39 +01:00
|
|
|
err := repo.db.Get(&failAttempts, "UPDATE account SET fail_attempts = fail_attempts + 1 WHERE id=$1 RETURNING fail_attempts", id)
|
2026-07-31 02:43:45 +01:00
|
|
|
return failAttempts, err
|
|
|
|
|
}
|
|
|
|
|
|
2026-07-31 04:20:39 +01:00
|
|
|
func (repo *AccountRepositoryPostgres) ResetFails(id string) error {
|
|
|
|
|
_, err := repo.db.Exec("UPDATE account SET fail_attempts = 0 WHERE id=$1", id)
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (repo *AccountRepositoryPostgres) Lock(id string) error {
|
|
|
|
|
_, err := repo.db.Exec("UPDATE account SET locked = true WHERE id=$1", id)
|
2026-07-31 02:43:45 +01:00
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
2026-07-31 04:20:39 +01:00
|
|
|
func (repo *AccountRepositoryPostgres) Unlock(id string) error {
|
|
|
|
|
_, err := repo.db.Exec("UPDATE account SET locked = false, fail_attempts = 0 WHERE id=$1", id)
|
2026-07-31 02:43:45 +01:00
|
|
|
return err
|
|
|
|
|
}
|