package postgres import ( "errors" "git.tek.govt.hu/dowerx/chat/server/model" "github.com/jmoiron/sqlx" ) type UserDAOPG struct { pgDAO } // Create a new user func (d UserDAOPG) Create(user model.User) error { _, err := d.db.NamedExec(`call add_user(:username, :password_hash)`, &user) return err } // Read returns a user by ID if ID != 0, else by Username func (d UserDAOPG) Read(user model.User) (model.User, error) { 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) } if err != nil { return user, err } if !rows.Next() { return user, errors.New("no such user") } err = rows.Scan(&user) return user, err } // List all users func (d UserDAOPG) List() ([]model.User, error) { rows, err := d.db.Query(`select * from "user" order by "username"`) if err != nil { return nil, err } users := make([]model.User, 0) for rows.Next() { user := model.User{} err = rows.Scan(&user) if err != nil { break } users = append(users, user) } return users, err } // Update sets all the fields of the User with the given ID func (d UserDAOPG) Update(user model.User) error { _, err := d.db.NamedExec(`update "user" set "username" = :username, "password_hash" = :password_hash, "status" = :status, "picture" = :picture, "bio" = :bio where "id" = :id`, &user) return err } // Delete removes a user by ID if ID != 0, else by Username func (d UserDAOPG) Delete(user model.User) error { 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 err }