github.com/ngocphuongnb/tetua@v0.0.7-alpha/app/mock/repository/user.go (about)

     1  package mockrepository
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	"math"
     7  	"strconv"
     8  	"strings"
     9  
    10  	"github.com/ngocphuongnb/tetua/app/entities"
    11  	"github.com/ngocphuongnb/tetua/app/utils"
    12  )
    13  
    14  type UserRepository struct {
    15  	*Repository[entities.User]
    16  }
    17  
    18  var ErrorCreateIfNotExistsByProvider = false
    19  
    20  func (m *UserRepository) CreateIfNotExistsByProvider(ctx context.Context, userData *entities.User) (*entities.User, error) {
    21  	if ErrorCreateIfNotExistsByProvider || ctx.Value("CreateIfNotExistsByProvider") != nil {
    22  		return nil, errors.New("CreateIfNotExistsByProvider error")
    23  	}
    24  
    25  	for _, user := range m.entities {
    26  		if user.Provider == userData.Provider && user.ProviderID == userData.ProviderID {
    27  			return user, nil
    28  		}
    29  	}
    30  
    31  	return m.Create(ctx, userData)
    32  }
    33  
    34  func (m *UserRepository) Setting(ctx context.Context, id int, userData *entities.SettingMutation) (*entities.User, error) {
    35  	for index, user := range m.entities {
    36  		if user.ID == id {
    37  			user.Username = userData.Username
    38  			user.DisplayName = userData.DisplayName
    39  			user.URL = userData.URL
    40  			user.Email = userData.Email
    41  			user.Password = userData.Password
    42  			user.Bio = userData.Bio
    43  			user.BioHTML = userData.BioHTML
    44  			if user.AvatarImageID > 0 {
    45  				user.AvatarImageID = userData.AvatarImageID
    46  			}
    47  			m.entities[index] = user
    48  			return user, nil
    49  		}
    50  	}
    51  
    52  	return nil, &entities.NotFoundError{Message: "User not found with id " + strconv.Itoa(id)}
    53  }
    54  
    55  func (m *UserRepository) ByUsername(ctx context.Context, name string) (*entities.User, error) {
    56  	if ctx.Value("query_error") != nil {
    57  		return nil, errors.New("ByUsername error")
    58  	}
    59  	return getEntityByField(name, m.entities, "Username", name)
    60  }
    61  
    62  func (m *UserRepository) ByProvider(ctx context.Context, name, id string) (*entities.User, error) {
    63  	for _, user := range m.entities {
    64  		if user.Provider == name && user.ProviderID == id {
    65  			return user, nil
    66  		}
    67  	}
    68  
    69  	return nil, &entities.NotFoundError{Message: "User not found with provider " + name + " and id " + id}
    70  }
    71  
    72  func (m *UserRepository) ByUsernameOrEmail(ctx context.Context, username, email string) ([]*entities.User, error) {
    73  	result := make([]*entities.User, 0)
    74  	for _, user := range m.entities {
    75  		if user.Username == username || user.Email == email {
    76  			result = append(result, user)
    77  		}
    78  	}
    79  
    80  	if len(result) == 0 {
    81  		return nil, &entities.NotFoundError{Message: "User not found with username " + username + " or email " + email}
    82  	}
    83  
    84  	return result, nil
    85  }
    86  
    87  func (m *UserRepository) All(ctx context.Context) ([]*entities.User, error) {
    88  	if ctx.Value("query_error") != nil {
    89  		return nil, errors.New("Get all users error")
    90  	}
    91  	return m.entities, nil
    92  }
    93  func (m *UserRepository) Find(ctx context.Context, filters ...*entities.UserFilter) ([]*entities.User, error) {
    94  	if len(filters) == 0 {
    95  		return m.entities, nil
    96  	}
    97  	filter := *filters[0]
    98  	result := make([]*entities.User, 0)
    99  	if filter.Page < 1 {
   100  		filter.Page = 1
   101  	}
   102  	if filter.Limit < 1 {
   103  		filter.Limit = 10
   104  	}
   105  	offset := (filter.Page - 1) * filter.Limit
   106  
   107  	for index, user := range m.entities {
   108  		if index < offset {
   109  			continue
   110  		}
   111  		if index >= offset+filter.Limit {
   112  			break
   113  		}
   114  
   115  		if filter.Search != "" {
   116  			if !strings.Contains(user.Username, filter.Search) && !strings.Contains(user.Email, filter.Search) {
   117  				continue
   118  			}
   119  		}
   120  
   121  		if len(filter.ExcludeIDs) > 0 && utils.SliceContains(filter.ExcludeIDs, user.ID) {
   122  			continue
   123  		}
   124  
   125  		result = append(result, user)
   126  	}
   127  
   128  	return result, nil
   129  }
   130  
   131  func (m *UserRepository) Count(ctx context.Context, filters ...*entities.UserFilter) (int, error) {
   132  	if len(filters) == 0 {
   133  		return len(m.entities), nil
   134  	}
   135  	filter := *filters[0]
   136  	count := 0
   137  	if filter.Page < 1 {
   138  		filter.Page = 1
   139  	}
   140  	if filter.Limit < 1 {
   141  		filter.Limit = 10
   142  	}
   143  	offset := (filter.Page - 1) * filter.Limit
   144  
   145  	for index, user := range m.entities {
   146  		if index < offset {
   147  			continue
   148  		}
   149  		if index >= offset+filter.Limit {
   150  			break
   151  		}
   152  
   153  		if filter.Search != "" {
   154  			if !strings.Contains(user.Username, filter.Search) && !strings.Contains(user.Email, filter.Search) {
   155  				continue
   156  			}
   157  		}
   158  
   159  		if len(filter.ExcludeIDs) > 0 && utils.SliceContains(filter.ExcludeIDs, user.ID) {
   160  			continue
   161  		}
   162  
   163  		count++
   164  	}
   165  
   166  	return count, nil
   167  }
   168  
   169  func (m *UserRepository) Paginate(ctx context.Context, filters ...*entities.UserFilter) (*entities.Paginate[entities.User], error) {
   170  	topics, err := m.Find(ctx, filters...)
   171  	if err != nil {
   172  		return nil, err
   173  	}
   174  
   175  	count, err := m.Count(ctx, filters...)
   176  	if err != nil {
   177  		return nil, err
   178  	}
   179  
   180  	filter := filters[0]
   181  	if filter.Page < 1 {
   182  		filter.Page = 1
   183  	}
   184  	if filter.Limit < 1 {
   185  		filter.Limit = 10
   186  	}
   187  	return &entities.Paginate[entities.User]{
   188  		Data:        topics,
   189  		PageSize:    filter.Limit,
   190  		PageCurrent: filter.Page,
   191  		Total:       int(math.Ceil(float64(count) / float64(filter.Limit))),
   192  	}, nil
   193  }