evol: filter geography on beneficiaries

This commit is contained in:
Arnaud Delcasse
2026-02-25 10:15:22 +01:00
parent 1b1c4443fc
commit 092d1acfbd
3 changed files with 99 additions and 9 deletions

View File

@@ -31,6 +31,8 @@ import (
solidaritytransformers "git.coopgo.io/coopgo-platform/solidarity-transport/servers/grpc/transformers"
solidaritytypes "git.coopgo.io/coopgo-platform/solidarity-transport/types"
"github.com/google/uuid"
"github.com/paulmach/orb"
"github.com/paulmach/orb/geojson"
"github.com/rs/zerolog/log"
"google.golang.org/protobuf/types/known/structpb"
"google.golang.org/protobuf/types/known/timestamppb"
@@ -41,12 +43,38 @@ type BeneficiariesResult struct {
CacheID string
}
func (h *ApplicationHandler) GetBeneficiaries(ctx context.Context, searchFilter string, archivedFilter bool) (*BeneficiariesResult, error) {
func (h *ApplicationHandler) GetBeneficiaries(ctx context.Context, searchFilter string, archivedFilter bool, addressGeoLayer, addressGeoCode string) (*BeneficiariesResult, error) {
accounts, err := h.getBeneficiariesWithFilters(ctx, searchFilter, archivedFilter)
if err != nil {
return nil, err
}
// Apply address geography filtering
if addressGeoLayer != "" && addressGeoCode != "" {
addressPolygons, err := h.loadGeographyPolygon(addressGeoLayer, addressGeoCode)
if err != nil {
log.Warn().Err(err).Msg("failed to load beneficiary address geography filter")
} else {
filtered := []mobilityaccountsstorage.Account{}
for _, account := range accounts {
if addr, ok := account.Data["address"]; ok {
jsonAddr, err := json.Marshal(addr)
if err == nil {
addrGeojson, err := geojson.UnmarshalFeature(jsonAddr)
if err == nil && addrGeojson.Geometry != nil {
if point, ok := addrGeojson.Geometry.(orb.Point); ok {
if isPointInGeographies(point, addressPolygons) {
filtered = append(filtered, account)
}
}
}
}
}
}
accounts = filtered
}
}
sort.Sort(sorting.BeneficiariesByName(accounts))
cacheID := uuid.NewString()