mirror of
https://github.com/rjNemo/go-wiki
synced 2026-06-06 02:36:40 +00:00
128 lines
3.1 KiB
Go
128 lines
3.1 KiB
Go
package data
|
|
|
|
import (
|
|
"database/sql"
|
|
"log"
|
|
|
|
"github.com/rjNemo/go-wiki/models"
|
|
)
|
|
|
|
// UserStore is used to perform user-related CRUD operations on the DB
|
|
type UserStore struct {
|
|
db *sql.DB
|
|
}
|
|
|
|
// NewUserStore constructs a UserStore connected to the database.
|
|
func NewUserStore(db *sql.DB) UserStore {
|
|
return UserStore{db: db}
|
|
}
|
|
|
|
// CreateTable creates the user table in the database if it exits not yet.
|
|
func (us UserStore) CreateTable() {
|
|
if _, err := us.db.Exec(QueryCreateTable); err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
// log.Print("Table successfully created!")
|
|
}
|
|
|
|
// GetAll retrieves all the users from the database.
|
|
func (us UserStore) GetAll() ([]models.User, error) {
|
|
var id, age int
|
|
var firstName, lastName, email string
|
|
|
|
rows, err := us.db.Query(QueryGetAll)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var users []models.User
|
|
for rows.Next() {
|
|
err := rows.Scan(&id, &age, &firstName, &lastName, &email)
|
|
if err != nil {
|
|
log.Fatal(err) // too severe
|
|
}
|
|
u := models.NewUser(id, age, firstName, lastName, email)
|
|
users = append(users, u)
|
|
}
|
|
return users, nil
|
|
}
|
|
|
|
// Get retrieves the user identified by 'id' from database
|
|
func (us UserStore) Get(uid int) (models.User, error) {
|
|
var id, age int
|
|
var firstName, lastName, email string
|
|
|
|
row := us.db.QueryRow(QueryGet, uid)
|
|
switch err := row.Scan(&id, &age, &firstName, &lastName, &email); err {
|
|
case sql.ErrNoRows:
|
|
log.Println("No entry returned")
|
|
return models.User{}, err
|
|
case nil:
|
|
return models.NewUser(id, age, firstName, lastName, email), nil
|
|
default:
|
|
log.Fatal(err)
|
|
return models.User{}, err
|
|
}
|
|
}
|
|
|
|
// Add inserts a user in the database.
|
|
func (us UserStore) Add(u models.User) {
|
|
id := 0
|
|
err := us.db.QueryRow(QueryInsert, u.Age(), u.Email(), u.FirstName(), u.LastName()).Scan(&id)
|
|
if err != nil {
|
|
log.Fatal(err) // too severe
|
|
}
|
|
log.Println("New User ID is:", id)
|
|
}
|
|
|
|
// Update edits user identified by 'id' in the database
|
|
func (us UserStore) Update(id int, u models.User) {
|
|
res, err := us.db.Exec(QueryUpdate, id, u.Age(), u.Email(), u.FirstName(), u.LastName())
|
|
if err != nil {
|
|
log.Fatal(err) // too severe
|
|
}
|
|
count, err := res.RowsAffected()
|
|
if err != nil {
|
|
log.Fatal(err) // too severe
|
|
}
|
|
if count == 0 {
|
|
log.Fatal("Update failed") // too severe
|
|
}
|
|
}
|
|
|
|
// Delete removes user identified by 'id' from the database
|
|
func (us UserStore) Delete(id int) {
|
|
res, err := us.db.Exec(QueryDelete, id)
|
|
if err != nil {
|
|
log.Fatal(err) // too severe
|
|
}
|
|
count, err := res.RowsAffected()
|
|
if err != nil {
|
|
log.Fatal(err) // too severe
|
|
}
|
|
if count == 0 {
|
|
log.Fatal("Delete failed") // too severe
|
|
}
|
|
}
|
|
|
|
// Find retrieves a user from the database using an expression
|
|
// func (us UserStore) Find(k interface{}, v interface{}) ([]models.User, error) {
|
|
// var id, age int
|
|
// var firstName, lastName, email string
|
|
|
|
// rows, err := us.db.Query(QueryFind, k, v)
|
|
// if err != nil {
|
|
// return nil, err
|
|
// }
|
|
|
|
// var users []models.User
|
|
// for rows.Next() {
|
|
// err := rows.Scan(&id, &age, &firstName, &lastName, &email)
|
|
// if err != nil {
|
|
// log.Fatal(err) // too severe
|
|
// }
|
|
// u := models.NewUser(id, age, firstName, lastName, email)
|
|
// users = append(users, u)
|
|
// }
|
|
// return users, nil
|
|
// }
|