github.com/k0marov/go-socnet@v0.0.0-20220715154813-90d07867c782/features/comments/domain/service/service.go (about) 1 package service 2 3 import ( 4 "github.com/k0marov/go-socnet/core/abstract/deletable" 5 "github.com/k0marov/go-socnet/core/abstract/ownable_likeable" 6 likeable_contexters "github.com/k0marov/go-socnet/core/abstract/ownable_likeable/contexters" 7 "github.com/k0marov/go-socnet/core/general/core_err" 8 "github.com/k0marov/go-socnet/core/general/core_values" 9 "time" 10 11 "github.com/k0marov/go-socnet/features/comments/domain/contexters" 12 "github.com/k0marov/go-socnet/features/comments/domain/entities" 13 "github.com/k0marov/go-socnet/features/comments/domain/models" 14 "github.com/k0marov/go-socnet/features/comments/domain/store" 15 "github.com/k0marov/go-socnet/features/comments/domain/validators" 16 "github.com/k0marov/go-socnet/features/comments/domain/values" 17 post_values "github.com/k0marov/go-socnet/features/posts/domain/values" 18 profile_service "github.com/k0marov/go-socnet/features/profiles/domain/service" 19 ) 20 21 type ( 22 PostCommentsGetter func(post post_values.PostId, caller core_values.UserId) ([]entities.ContextedComment, error) 23 CommentCreator func(newComment values.NewCommentValue) (entities.ContextedComment, error) 24 CommentLikeToggler func(values.CommentId, core_values.UserId) error 25 CommentDeleter func(comment values.CommentId, caller core_values.UserId) error 26 ) 27 28 func NewPostCommentsGetter(getComments store.CommentsGetter, addContexts contexters.CommentListContextAdder) PostCommentsGetter { 29 return func(post post_values.PostId, caller core_values.UserId) ([]entities.ContextedComment, error) { 30 comments, err := getComments(post) 31 if err != nil { 32 return []entities.ContextedComment{}, core_err.Rethrow("getting post contextedComments from store", err) 33 } 34 contextedComments, err := addContexts(comments, caller) 35 if err != nil { 36 return []entities.ContextedComment{}, core_err.Rethrow("adding contexts to comments", err) 37 } 38 return contextedComments, nil 39 } 40 } 41 42 func NewCommentCreator(validate validators.CommentValidator, getProfile profile_service.ProfileGetter, createComment store.Creator) CommentCreator { 43 return func(newComment values.NewCommentValue) (entities.ContextedComment, error) { 44 clientErr, isValid := validate(newComment) 45 if !isValid { 46 return entities.ContextedComment{}, clientErr 47 } 48 49 author, err := getProfile(newComment.Author, newComment.Author) 50 if err != nil { 51 return entities.ContextedComment{}, core_err.Rethrow("getting author's profile", err) 52 } 53 54 createdAt := time.Now().UTC() 55 newId, err := createComment(newComment, createdAt) 56 if err != nil { 57 return entities.ContextedComment{}, core_err.Rethrow("creating new comment", err) 58 } 59 60 comment := entities.ContextedComment{ 61 Comment: entities.Comment{ 62 CommentModel: models.CommentModel{ 63 Id: newId, 64 AuthorId: newComment.Author, 65 Text: newComment.Text, 66 CreatedAt: createdAt.Unix(), 67 }, 68 Likes: 0, 69 }, 70 OwnLikeContext: likeable_contexters.OwnLikeContext{ 71 IsLiked: false, 72 IsMine: true, 73 }, 74 Author: author, 75 } 76 return comment, nil 77 } 78 } 79 80 func NewCommentLikeToggler(safeToggleLike ownable_likeable.SafeLikeToggler) CommentLikeToggler { 81 return CommentLikeToggler(safeToggleLike) 82 } 83 84 func NewCommentDeleter(delete deletable.Deleter) CommentDeleter { 85 return CommentDeleter(delete) 86 }