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  }