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  }