github.com/k0marov/go-socnet@v0.0.0-20220715154813-90d07867c782/features/profiles/store/store.go (about) 1 package store 2 3 import ( 4 "fmt" 5 "github.com/k0marov/go-socnet/core/abstract/likeable" 6 "github.com/k0marov/go-socnet/core/general/core_err" 7 "github.com/k0marov/go-socnet/core/general/core_values" 8 "github.com/k0marov/go-socnet/core/general/core_values/ref" 9 "github.com/k0marov/go-socnet/core/general/static_store" 10 "github.com/k0marov/go-socnet/features/profiles/domain/models" 11 12 "github.com/k0marov/go-socnet/features/profiles/domain/entities" 13 "github.com/k0marov/go-socnet/features/profiles/domain/store" 14 "github.com/k0marov/go-socnet/features/profiles/domain/values" 15 ) 16 17 type ( 18 AvatarFileCreator func(data ref.Ref[[]byte], belongsToUser core_values.UserId) (string, error) 19 20 DBProfileGetter func(id core_values.UserId) (models.ProfileModel, error) 21 DBProfileCreator func(models.ProfileModel) error 22 DBProfileUpdater func(id core_values.UserId, updData DBUpdateData) error 23 24 DBFollowsGetter func(id core_values.UserId) ([]core_values.UserId, error) 25 DBFollowChecker func(target, follower core_values.UserId) (bool, error) 26 DBFollower func(target, follower core_values.UserId) error 27 DBUnfollower func(target, unfollower core_values.UserId) error 28 ) 29 30 type DBUpdateData struct { 31 About string 32 AvatarPath string 33 } 34 35 func NewStoreAvatarUpdater(createFile AvatarFileCreator, updateDBProfile DBProfileUpdater) store.StoreAvatarUpdater { 36 return func(userId core_values.UserId, avatar values.AvatarData) (core_values.StaticPath, error) { 37 avatarUrl, err := createFile(avatar.Data, userId) 38 if err != nil { 39 return "", fmt.Errorf("error while storing avatar file: %w", err) 40 } 41 updateData := DBUpdateData{ 42 AvatarPath: avatarUrl, 43 } 44 err = updateDBProfile(userId, updateData) 45 if err != nil { 46 return "", fmt.Errorf("error while updating avatar path in DB: %w", err) 47 } 48 return avatarUrl, nil 49 } 50 } 51 52 func NewStoreProfileUpdater(updateDBProfile DBProfileUpdater) store.StoreProfileUpdater { 53 return func(id core_values.UserId, upd values.ProfileUpdateData) error { 54 err := updateDBProfile(id, DBUpdateData{About: upd.About}) 55 if err != nil { 56 return fmt.Errorf("error while updating profile in db: %w", err) 57 } 58 return nil 59 } 60 } 61 62 func NewStoreProfileCreator(createDBProfile DBProfileCreator) store.StoreProfileCreator { 63 return store.StoreProfileCreator(createDBProfile) 64 } 65 66 func NewStoreProfileGetter(getDBProfile DBProfileGetter, getFollowers likeable.LikesCountGetter, getFollows likeable.UserLikesCountGetter) store.StoreProfileGetter { 67 return func(id core_values.UserId) (entities.Profile, error) { 68 profileModel, err := getDBProfile(id) 69 if err != nil { 70 return entities.Profile{}, core_err.Rethrow("getting the profile model from db", err) 71 } 72 followers, err := getFollowers(id) 73 if err != nil { 74 return entities.Profile{}, err 75 } 76 follows, err := getFollows(id) 77 if err != nil { 78 return entities.Profile{}, err 79 } 80 profile := entities.Profile{ 81 ProfileModel: profileModel, 82 AvatarURL: static_store.PathToURL(profileModel.AvatarPath), 83 Follows: follows, 84 Followers: followers, 85 } 86 return profile, nil 87 } 88 }