Albirew/nyaa-pantsu
Archivé
1
0
Bifurcation 0
Ce dépôt a été archivé le 2022-05-07. Vous pouvez voir ses fichiers ou le cloner, mais pas ouvrir de ticket ou de demandes d'ajout, ni soumettre de changements.
nyaa-pantsu/database/postgres/user.go
2017-05-17 15:58:40 +10:00

154 lignes
3,9 Kio
Go

package postgres
import (
"database/sql"
"fmt"
"github.com/NyaaPantsu/nyaa/common"
"github.com/NyaaPantsu/nyaa/model"
)
func userParamToSelectQuery(p *common.UserParam) (q sqlQuery) {
q.query = fmt.Sprintf("SELECT %s FROM %s ", userSelectColumnsFull, tableUsers)
counter := 1
if p.Max > 0 {
q.query += fmt.Sprintf("LIMIT $%d ", counter)
q.params = append(q.params, p.Max)
counter++
}
if p.Offset > 0 {
q.query += fmt.Sprintf("OFFSET $%d ", counter)
q.params = append(q.params, p.Offset)
counter++
}
return
}
func (db *Database) UserFollows(a, b uint32) (follows bool, err error) {
err = db.queryWithPrepared(queryUserFollows, func(rows *sql.Rows) error {
follows = true
return nil
}, a, b)
return
}
func (db *Database) AddUserFollowing(a, b uint32) (err error) {
_, err = db.getPrepared(queryUserFollowsUpsert).Exec(a, b)
return
}
func (db *Database) DeleteUserFollowing(a, b uint32) (deleted bool, err error) {
var affected uint32
affected, err = db.execQuery(queryDeleteUserFollowing, a, b)
deleted = affected > 0
return
}
func (db *Database) getUserByQuery(name string, p interface{}) (user model.User, has bool, err error) {
err = db.queryWithPrepared(name, func(rows *sql.Rows) error {
rows.Next()
scanUserColumnsFull(rows, &user)
has = true
return nil
}, p)
return
}
func (db *Database) GetUserByAPIToken(token string) (user model.User, has bool, err error) {
user, has, err = db.getUserByQuery(queryGetUserByApiToken, token)
return
}
func (db *Database) GetUsersByEmail(email string) (users []model.User, err error) {
err = db.queryWithPrepared(queryGetUserByEmail, func(rows *sql.Rows) error {
for rows.Next() {
var user model.User
scanUserColumnsFull(rows, &user)
users = append(users, user)
}
return nil
}, email)
return
}
func (db *Database) GetUserByName(name string) (user model.User, has bool, err error) {
user, has, err = db.getUserByQuery(queryGetUserByName, name)
return
}
func (db *Database) GetUserByID(id uint32) (user model.User, has bool, err error) {
user, has, err = db.getUserByQuery(queryGetUserByID, id)
return
}
func (db *Database) InsertUser(u *model.User) (err error) {
_, err = db.getPrepared(queryInsertUser).Exec(u.Username, u.Password, u.Email, u.Status, u.CreatedAt, u.UpdatedAt, u.ApiToken, u.ApiTokenExpiry, u.Language, u.MD5)
return
}
func (db *Database) UpdateUser(u *model.User) (err error) {
_, err = db.getPrepared(queryUpdateUser).Exec(u.ID, u.Username, u.Password, u.Email, u.Status, u.UpdatedAt, u.ApiToken, u.ApiTokenExpiry, u.Language, u.MD5)
return
}
func (db *Database) GetUsersWhere(param *common.UserParam) (users []model.User, err error) {
var user model.User
var has bool
if len(param.Email) > 0 {
users, err = db.GetUsersByEmail(param.Email)
} else if len(param.Name) > 0 {
user, has, err = db.GetUserByName(param.Name)
if has {
users = append(users, user)
}
} else if len(param.ApiToken) > 0 {
user, has, err = db.GetUserByAPIToken(param.ApiToken)
if has {
users = append(users, user)
}
} else if param.ID > 0 {
user, has, err = db.GetUserByID(param.ID)
if has {
users = append(users, user)
}
} else {
q := userParamToSelectQuery(param)
if param.Max > 0 {
users = make([]model.User, 0, param.Max)
} else {
users = make([]model.User, 0, 64)
}
err = q.Query(db.conn, func(rows *sql.Rows) error {
for rows.Next() {
var user model.User
scanUserColumnsFull(rows, &user)
users = append(users, user)
}
return nil
})
}
return
}
func (db *Database) DeleteUsersWhere(param *common.UserParam) (deleted uint32, err error) {
var queryName string
var p interface{}
if param.ID > 0 {
queryName = queryDeleteUserByID
p = param.ID
} else if len(param.Email) > 0 {
queryName = queryDeleteUserByEmail
p = param.Email
} else if len(param.ApiToken) > 0 {
queryName = queryDeleteUserByToken
p = param.ApiToken
} else {
// delete nothing
return
}
deleted, err = db.execQuery(queryName, p)
return
}