// Copyright (C) 2024 Mya Pitzeruse // SPDX-License-Identifier: MIT package crud import ( "context" "gorm.io/gorm" ) // ListFunc defines a function signature used to list data from the underlying gorm database. It ensures that size and // scoping of queries is taken into consideration. type ListFunc[T any] func(ctx context.Context, offset, count int, filters ...map[string]interface{}) ([]T, error) // Lister returns a ListFunc to be used to list data from gorm. func Lister[T any](db *gorm.DB) ListFunc[T] { prototype := new(T) return func(ctx context.Context, offset, count int, filters ...map[string]interface{}) ([]T, error) { q := Transaction(ctx, db). Model(prototype). Offset(offset). Limit(count) for _, filter := range filters { q = q.Where(filter) } result := make([]T, 0, count) err := q.Find(&result).Error if err != nil { return nil, err } return result, nil } }