github.com/k0marov/go-socnet@v0.0.0-20220715154813-90d07867c782/core/abstract/likeable/service/service.go (about)

     1  package service
     2  
     3  import (
     4  	"github.com/k0marov/go-socnet/core/general/core_err"
     5  	"github.com/k0marov/go-socnet/core/general/core_values"
     6  )
     7  
     8  // TODO: add checks for core_err.ErrNotFound to all services
     9  
    10  type (
    11  	StoreLikeChecker          func(targetId string, fromUser core_values.UserId) (bool, error)
    12  	StoreLike                 func(targetId string, fromUser core_values.UserId) error
    13  	StoreUnlike               func(targetId string, fromUser core_values.UserId) error
    14  	StoreLikesCountGetter     func(targetId string) (int, error)
    15  	StoreUserLikesCountGetter func(id core_values.UserId) (int, error)
    16  	StoreUserLikesGetter      func(id core_values.UserId) ([]string, error)
    17  )
    18  
    19  type (
    20  	LikeToggler          func(target string, liker core_values.UserId) error
    21  	LikesCountGetter     func(targetId string) (int, error)
    22  	UserLikesCountGetter func(core_values.UserId) (int, error)
    23  	UserLikesGetter      func(core_values.UserId) ([]string, error)
    24  	LikeChecker          func(targetId string, fromUser core_values.UserId) (bool, error)
    25  )
    26  
    27  func NewLikeToggler(checkLiked StoreLikeChecker, like StoreLike, unlike StoreUnlike) LikeToggler {
    28  	return func(target string, fromUser core_values.UserId) error {
    29  		isLiked, err := checkLiked(target, fromUser)
    30  		if err != nil {
    31  			return core_err.Rethrow("checking if the target Likeable is liked", err)
    32  		}
    33  
    34  		if isLiked {
    35  			err = unlike(target, fromUser)
    36  			if err != nil {
    37  				return core_err.Rethrow("unliking a Likeable in service", err)
    38  			}
    39  		} else {
    40  			err = like(target, fromUser)
    41  			if err != nil {
    42  				return core_err.Rethrow("liking a Likeable in service", err)
    43  			}
    44  		}
    45  
    46  		return nil
    47  	}
    48  }
    49  
    50  func NewLikesCountGetter(getLikesCount StoreLikesCountGetter) LikesCountGetter {
    51  	return LikesCountGetter(getLikesCount)
    52  }
    53  
    54  func NewUserLikesCountGetter(getUserLikesCount StoreUserLikesCountGetter) UserLikesCountGetter {
    55  	return UserLikesCountGetter(getUserLikesCount)
    56  }
    57  func NewUserLikesGetter(getUserLikes StoreUserLikesGetter) UserLikesGetter {
    58  	return UserLikesGetter(getUserLikes)
    59  }
    60  
    61  func NewLikeChecker(checkLiked StoreLikeChecker) LikeChecker {
    62  	return LikeChecker(checkLiked)
    63  }