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,65 @@
|
||||
package rental
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/gofrs/uuid"
|
||||
)
|
||||
|
||||
// Storage defines behavior for interacting with the inventory store.
|
||||
type Storage interface {
|
||||
IsBookAvailable(title string) (available bool, err error)
|
||||
RenterAlreadyCheckedOut(renterId uuid.UUID, title string) (checkedOut bool, err error)
|
||||
CheckoutBook(renterId uuid.UUID, title string) error
|
||||
ReturnBook(renterId uuid.UUID, title string) error
|
||||
}
|
||||
|
||||
type service struct {
|
||||
store Storage
|
||||
}
|
||||
|
||||
// Service defines behavior for interacting with the inventory service.
|
||||
type Service interface {
|
||||
IsBookAvailable(title string) (available bool, err error)
|
||||
CheckoutBook(renterId uuid.UUID, title string) error
|
||||
ReturnBook(renterId uuid.UUID, title string) error
|
||||
}
|
||||
|
||||
// NewService creates a new inventory service.
|
||||
func NewService(s Storage) *service {
|
||||
return &service{
|
||||
s,
|
||||
}
|
||||
}
|
||||
|
||||
// IsBookAvailable checks if a book is available to rent at this library.
|
||||
func (s *service) IsBookAvailable(title string) (available bool, err error) {
|
||||
return s.store.IsBookAvailable(title)
|
||||
}
|
||||
|
||||
// CheckoutBook checks a book out to a renter.
|
||||
func (s *service) CheckoutBook(renterId uuid.UUID, title string) error {
|
||||
available, err := s.IsBookAvailable(title)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if !available {
|
||||
return ErrUnavailableBook
|
||||
}
|
||||
|
||||
checkedOut, err := s.store.RenterAlreadyCheckedOut(renterId, title)
|
||||
// If there was an error or the book is checked out by the renter already we'll
|
||||
// say the book is unavailable.
|
||||
if err != nil || checkedOut {
|
||||
fmt.Println("unavailable book", err, checkedOut)
|
||||
return ErrUnavailableBook
|
||||
}
|
||||
|
||||
return s.store.CheckoutBook(renterId, title)
|
||||
}
|
||||
|
||||
// ReturnBook returns a book for a renter.
|
||||
func (s *service) ReturnBook(renterId uuid.UUID, title string) error {
|
||||
return s.store.ReturnBook(renterId, title)
|
||||
}
|
||||
Reference in New Issue
Block a user