github.com/k0marov/go-socnet@v0.0.0-20220715154813-90d07867c782/features/posts/domain/service/service.go (about)

     1  package service
     2  
     3  import (
     4  	"github.com/k0marov/go-socnet/core/abstract/ownable"
     5  	"github.com/k0marov/go-socnet/core/abstract/ownable_likeable"
     6  	"github.com/k0marov/go-socnet/core/general/client_errors"
     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/posts/domain/contexters"
    12  	"github.com/k0marov/go-socnet/features/posts/domain/validators"
    13  
    14  	"github.com/k0marov/go-socnet/features/posts/domain/entities"
    15  
    16  	"github.com/k0marov/go-socnet/features/posts/domain/store"
    17  	"github.com/k0marov/go-socnet/features/posts/domain/values"
    18  )
    19  
    20  type (
    21  	PostDeleter     func(post values.PostId, caller core_values.UserId) error
    22  	PostLikeToggler func(values.PostId, core_values.UserId) error
    23  	PostCreator     func(values.NewPostData) error
    24  	PostsGetter     func(fromAuthor, caller core_values.UserId) ([]entities.ContextedPost, error)
    25  )
    26  
    27  func NewPostDeleter(getAuthor ownable.OwnerGetter, deletePost store.PostDeleter) PostDeleter {
    28  	return func(post values.PostId, caller core_values.UserId) error {
    29  		author, err := getAuthor(post)
    30  		if err != nil {
    31  			return core_err.Rethrow("getting post author", err)
    32  		}
    33  		if author != caller {
    34  			return client_errors.InsufficientPermissions
    35  		}
    36  		err = deletePost(post, author)
    37  		if err != nil {
    38  			return core_err.Rethrow("deleting post", err)
    39  		}
    40  		return nil
    41  	}
    42  }
    43  
    44  func NewPostLikeToggler(safeToggleLike ownable_likeable.SafeLikeToggler) PostLikeToggler {
    45  	return PostLikeToggler(safeToggleLike)
    46  }
    47  
    48  func NewPostCreator(validate validators.PostValidator, createPost store.PostCreator) PostCreator {
    49  	return func(newPost values.NewPostData) error {
    50  		clientError, ok := validate(newPost)
    51  		if !ok {
    52  			return clientError
    53  		}
    54  		err := createPost(newPost, time.Now())
    55  		if err != nil {
    56  			return core_err.Rethrow("creating a post in store", err)
    57  		}
    58  		return nil
    59  	}
    60  }
    61  
    62  func NewPostsGetter(getPosts store.PostsGetter, addContext contexters.PostListContextAdder) PostsGetter {
    63  	return func(authorId, caller core_values.UserId) ([]entities.ContextedPost, error) {
    64  		posts, err := getPosts(authorId)
    65  		if err != nil {
    66  			return []entities.ContextedPost{}, core_err.Rethrow("getting posts from store", err)
    67  		}
    68  		ctxPosts, err := addContext(posts, caller)
    69  		if err != nil {
    70  			return []entities.ContextedPost{}, core_err.Rethrow("adding context to posts", err)
    71  		}
    72  		return ctxPosts, nil
    73  	}
    74  }