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 }