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