98 lines
1.7 KiB
Go
98 lines
1.7 KiB
Go
package loan
|
|
|
|
import (
|
|
"github.com/eminetto/clean-architecture-go-v2/entity"
|
|
"github.com/eminetto/clean-architecture-go-v2/usecase/book"
|
|
"github.com/eminetto/clean-architecture-go-v2/usecase/user"
|
|
)
|
|
|
|
//Service loan usecase
|
|
type Service struct {
|
|
userService user.UseCase
|
|
bookService book.UseCase
|
|
}
|
|
|
|
//NewService create new use case
|
|
func NewService(u user.UseCase, b book.UseCase) *Service {
|
|
return &Service{
|
|
userService: u,
|
|
bookService: b,
|
|
}
|
|
}
|
|
|
|
//Borrow borrow a book to an user
|
|
func (s *Service) Borrow(u *entity.User, b *entity.Book) error {
|
|
u, err := s.userService.GetUser(u.ID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
b, err = s.bookService.GetBook(b.ID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if b.Quantity <= 0 {
|
|
return entity.ErrNotEnoughBooks
|
|
}
|
|
|
|
err = u.AddBook(b.ID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = s.userService.UpdateUser(u)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
b.Quantity--
|
|
err = s.bookService.UpdateBook(b)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
//Return return a book
|
|
func (s *Service) Return(b *entity.Book) error {
|
|
b, err := s.bookService.GetBook(b.ID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
all, err := s.userService.ListUsers()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
borrowed := false
|
|
var borrowedBy entity.ID
|
|
for _, u := range all {
|
|
_, err := u.GetBook(b.ID)
|
|
if err != nil {
|
|
continue
|
|
}
|
|
borrowed = true
|
|
borrowedBy = u.ID
|
|
break
|
|
}
|
|
if !borrowed {
|
|
return entity.ErrBookNotBorrowed
|
|
}
|
|
u, err := s.userService.GetUser(borrowedBy)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = u.RemoveBook(b.ID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = s.userService.UpdateUser(u)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
b.Quantity++
|
|
err = s.bookService.UpdateBook(b)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|