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 }