94 lines
2.4 KiB
Go
94 lines
2.4 KiB
Go
package postgres
|
|
|
|
import (
|
|
"git.tek.govt.hu/dowerx/chat/server/model"
|
|
"git.tek.govt.hu/dowerx/chat/server/util"
|
|
"github.com/jmoiron/sqlx"
|
|
)
|
|
|
|
type UserDAOPG struct {
|
|
pgDAO
|
|
}
|
|
|
|
// Create a new user
|
|
func (d UserDAOPG) Create(user model.User) *util.ChatError {
|
|
_, err := d.db.NamedExec(`call add_user(:username, :password_hash)`, &user)
|
|
return util.MakeError(err, util.DATABASE_QUERY_FAULT)
|
|
}
|
|
|
|
// Read returns a user by ID if ID != 0, else by Username
|
|
func (d UserDAOPG) Read(user model.User) (model.User, *util.ChatError) {
|
|
var rows *sqlx.Rows
|
|
var err error
|
|
if user.ID != 0 {
|
|
rows, err = d.db.NamedQuery(`select * from "user" where "id" = :id`, &user)
|
|
} else {
|
|
rows, err = d.db.NamedQuery(`select * from "user" where "username" = :username`, &user)
|
|
}
|
|
defer rows.Close()
|
|
|
|
if err != nil {
|
|
return user, util.MakeError(err, util.DATABASE_QUERY_FAULT)
|
|
}
|
|
|
|
if !rows.Next() {
|
|
return user, &util.ChatError{Message: "", Code: util.NOT_FOUND}
|
|
}
|
|
|
|
err = rows.StructScan(&user)
|
|
return user, util.MakeError(err, util.DATABASE_QUERY_FAULT)
|
|
}
|
|
|
|
// List all users
|
|
func (d UserDAOPG) List() ([]model.User, *util.ChatError) {
|
|
rows, err := d.db.Queryx(`select * from "user" order by "username"`)
|
|
if err != nil {
|
|
return nil, util.MakeError(err, util.DATABASE_QUERY_FAULT)
|
|
}
|
|
defer rows.Close()
|
|
|
|
users := make([]model.User, 0)
|
|
|
|
for rows.Next() {
|
|
user := model.User{}
|
|
|
|
err = rows.StructScan(&user)
|
|
if err != nil {
|
|
break
|
|
}
|
|
|
|
users = append(users, user)
|
|
}
|
|
|
|
return users, util.MakeError(err, util.DATABASE_QUERY_FAULT)
|
|
}
|
|
|
|
// Update sets all the fields of the User with the given ID
|
|
func (d UserDAOPG) Update(user model.User) *util.ChatError {
|
|
_, err := d.db.NamedExec(`update "user" set "username" = :username, "password_hash" = :password_hash, "status" = :status, "picture" = :picture, "bio" = :bio where "id" = :id`, &user)
|
|
return util.MakeError(err, util.DATABASE_QUERY_FAULT)
|
|
}
|
|
|
|
// Delete removes a user by ID if ID != 0, else by Username
|
|
func (d UserDAOPG) Delete(user model.User) *util.ChatError {
|
|
var err error
|
|
if user.ID != 0 {
|
|
_, err = d.db.NamedExec(`delete from "user" where "id" = :id`, &user)
|
|
} else {
|
|
_, err = d.db.NamedExec(`delete from "user" where "username" = :username`, &user)
|
|
}
|
|
|
|
return util.MakeError(err, util.DATABASE_QUERY_FAULT)
|
|
}
|
|
|
|
func MakeUserDAO() (UserDAOPG, *util.ChatError) {
|
|
dao := UserDAOPG{}
|
|
conn, err := getDatabase()
|
|
if err != nil {
|
|
return dao, err
|
|
}
|
|
|
|
dao.db = conn
|
|
return dao, nil
|
|
}
|