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  }