refactors data access layer to use pop ORM for eager loading, adds book titles rented to renters in response body
This commit is contained in:
@@ -0,0 +1,81 @@
|
||||
package mysql
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"errors"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/davidlick/bookish/bookish-server/models"
|
||||
"github.com/gobuffalo/nulls"
|
||||
"github.com/gobuffalo/uuid"
|
||||
)
|
||||
|
||||
// IsBookAvailable queries the database for available books.
|
||||
func (s *store) IsBookAvailable(title string) (available bool, err error) {
|
||||
rr := []models.Rental{}
|
||||
err = s.Where(fmt.Sprintf("book_title = '%s'", title)).Where("return_date IS NULL").All(&rr)
|
||||
if err != nil {
|
||||
// If no records are returned then the book is available for rent.
|
||||
if errors.Is(sql.ErrNoRows, err) {
|
||||
return true, nil
|
||||
}
|
||||
|
||||
return false, err
|
||||
}
|
||||
|
||||
// If 5 books are rented out this book is not available.
|
||||
if len(rr) > 4 {
|
||||
return false, nil
|
||||
}
|
||||
|
||||
return true, nil
|
||||
}
|
||||
|
||||
// RenterAlreadyCheckedOut queries the database for the given renterId and title. If a record is returned checkedOut will be true.
|
||||
func (s *store) RenterAlreadyCheckedOut(renterId uuid.UUID, title string) (checkedOut bool, err error) {
|
||||
rr := []models.Rental{}
|
||||
err = s.Where(fmt.Sprintf("renter_id = '%s'", renterId)).
|
||||
Where(fmt.Sprintf("book_title = '%s'", title)).
|
||||
Where("return_date IS NULL").
|
||||
All(&rr)
|
||||
if err != nil {
|
||||
// If no records are returned then the book is available for rent.
|
||||
if errors.Is(sql.ErrNoRows, err) {
|
||||
return false, nil
|
||||
}
|
||||
|
||||
return false, err
|
||||
}
|
||||
|
||||
// If 5 books are rented out this book is not available.
|
||||
if len(rr) == 0 {
|
||||
return false, nil
|
||||
}
|
||||
|
||||
return true, nil
|
||||
}
|
||||
|
||||
// CheckoutBook inserts a record indicating the book is checked out to the renter.
|
||||
func (s *store) CheckoutBook(renterId uuid.UUID, title string) error {
|
||||
r := models.Rental{BookTitle: title, RenterID: renterId, RentalDate: time.Now()}
|
||||
err := s.Create(&r)
|
||||
return err
|
||||
}
|
||||
|
||||
// ReturnBook sets the return_date field to now indicating the book has been returned.
|
||||
func (s *store) ReturnBook(renterId uuid.UUID, title string) error {
|
||||
r := models.Rental{}
|
||||
err := s.Where(fmt.Sprintf("renter_id = '%s'", renterId)).
|
||||
Where(fmt.Sprintf("book_title = '%s'", title)).
|
||||
Where("return_date IS NULL").
|
||||
First(&r)
|
||||
if err != nil {
|
||||
return ErrNotFound
|
||||
}
|
||||
|
||||
r.ReturnDate = nulls.Time{Time: time.Now(), Valid: true}
|
||||
|
||||
err = s.Save(&r)
|
||||
return err
|
||||
}
|
||||
Reference in New Issue
Block a user