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 }