github.com/ngocphuongnb/tetua@v0.0.7-alpha/app/mock/repository/file.go (about) 1 package mockrepository 2 3 import ( 4 "context" 5 "math" 6 "strings" 7 8 "github.com/ngocphuongnb/tetua/app/entities" 9 "github.com/ngocphuongnb/tetua/app/utils" 10 ) 11 12 type FileRepository struct { 13 *Repository[entities.File] 14 } 15 16 func (m *FileRepository) Find(ctx context.Context, filters ...*entities.FileFilter) ([]*entities.File, error) { 17 if err, ok := FakeRepoErrors["file_find"]; ok && err != nil { 18 return nil, err 19 } 20 if len(filters) == 0 { 21 return m.entities, nil 22 } 23 filter := *filters[0] 24 result := make([]*entities.File, 0) 25 if filter.Page < 1 { 26 filter.Page = 1 27 } 28 if filter.Limit < 1 { 29 filter.Limit = 10 30 } 31 offset := (filter.Page - 1) * filter.Limit 32 33 for index, file := range m.entities { 34 if index < offset { 35 continue 36 } 37 if index >= offset+filter.Limit { 38 break 39 } 40 41 if filter.Search != "" { 42 if !strings.Contains(file.Path, filter.Search) { 43 continue 44 } 45 } 46 47 if len(filter.ExcludeIDs) > 0 && utils.SliceContains(filter.ExcludeIDs, file.ID) { 48 continue 49 } 50 51 if len(filter.UserIDs) > 0 && !utils.SliceContains(filter.UserIDs, file.UserID) { 52 continue 53 } 54 55 result = append(result, file) 56 } 57 58 return result, nil 59 } 60 61 func (m *FileRepository) Count(ctx context.Context, filters ...*entities.FileFilter) (int, error) { 62 if len(filters) == 0 { 63 return len(m.entities), nil 64 } 65 filter := filters[0] 66 count := 0 67 if filter.Page < 1 { 68 filter.Page = 1 69 } 70 if filter.Limit < 1 { 71 filter.Limit = 10 72 } 73 offset := (filter.Page - 1) * filter.Limit 74 75 for index, file := range m.entities { 76 if index < offset { 77 continue 78 } 79 if index >= offset+filter.Limit { 80 break 81 } 82 83 if filter.Search != "" { 84 if !strings.Contains(file.Path, filter.Search) { 85 continue 86 } 87 } 88 89 if len(filter.ExcludeIDs) > 0 && utils.SliceContains(filter.ExcludeIDs, file.ID) { 90 continue 91 } 92 93 if len(filter.UserIDs) > 0 && !utils.SliceContains(filter.UserIDs, file.UserID) { 94 continue 95 } 96 97 count++ 98 } 99 100 return count, nil 101 } 102 103 func (m *FileRepository) Paginate(ctx context.Context, filters ...*entities.FileFilter) (*entities.Paginate[entities.File], error) { 104 files, err := m.Find(ctx, filters...) 105 if err != nil { 106 return nil, err 107 } 108 109 count, err := m.Count(ctx, filters...) 110 if err != nil { 111 return nil, err 112 } 113 114 filter := filters[0] 115 if filter.Page < 1 { 116 filter.Page = 1 117 } 118 if filter.Limit < 1 { 119 filter.Limit = 10 120 } 121 return &entities.Paginate[entities.File]{ 122 Data: files, 123 PageSize: filter.Limit, 124 PageCurrent: filter.Page, 125 Total: int(math.Ceil(float64(count) / float64(filter.Limit))), 126 }, nil 127 }