Fixed filterExtendedOptions

This commit is contained in:
Hein 2025-12-10 12:25:23 +02:00
parent efb9e5d9d5
commit 68dee78a34

View File

@ -127,7 +127,7 @@ func (h *Handler) Handle(w common.ResponseWriter, r common.Request, params map[s
// Validate and filter columns in options (log warnings for invalid columns) // Validate and filter columns in options (log warnings for invalid columns)
validator := common.NewColumnValidator(model) validator := common.NewColumnValidator(model)
options = filterExtendedOptions(validator, options) options = h.filterExtendedOptions(validator, options, model)
// Add request-scoped data to context (including options) // Add request-scoped data to context (including options)
ctx = WithRequestData(ctx, schema, entity, tableName, model, modelPtr, options) ctx = WithRequestData(ctx, schema, entity, tableName, model, modelPtr, options)
@ -2241,7 +2241,7 @@ func (h *Handler) setRowNumbersOnRecords(records any, offset int) {
} }
// filterExtendedOptions filters all column references, removing invalid ones and logging warnings // filterExtendedOptions filters all column references, removing invalid ones and logging warnings
func filterExtendedOptions(validator *common.ColumnValidator, options ExtendedRequestOptions) ExtendedRequestOptions { func (h *Handler) filterExtendedOptions(validator *common.ColumnValidator, options ExtendedRequestOptions, model interface{}) ExtendedRequestOptions {
filtered := options filtered := options
// Filter base RequestOptions // Filter base RequestOptions
@ -2265,15 +2265,33 @@ func filterExtendedOptions(validator *common.ColumnValidator, options ExtendedRe
// No filtering needed for ComputedQL keys // No filtering needed for ComputedQL keys
filtered.ComputedQL = options.ComputedQL filtered.ComputedQL = options.ComputedQL
// Filter Expand columns // Filter Expand columns using the expand relation's model
// filteredExpands := make([]ExpandOption, 0, len(options.Expand)) filteredExpands := make([]ExpandOption, 0, len(options.Expand))
// for _, expand := range options.Expand { modelType := reflect.TypeOf(model)
// filteredExpand := expand if modelType.Kind() == reflect.Ptr {
// // Don't validate relation name, only columns modelType = modelType.Elem()
// filteredExpand.Columns = validator.FilterValidColumns(expand.Columns) }
// filteredExpands = append(filteredExpands, filteredExpand)
// } for _, expand := range options.Expand {
// filtered.Expand = filteredExpands filteredExpand := expand
// Get the relationship info for this expand relation
relInfo := h.getRelationshipInfo(modelType, expand.Relation)
if relInfo != nil && relInfo.relatedModel != nil {
// Create a validator for the related model
expandValidator := common.NewColumnValidator(relInfo.relatedModel)
// Filter columns using the related model's validator
filteredExpand.Columns = expandValidator.FilterValidColumns(expand.Columns)
} else {
// If we can't find the relationship, log a warning and skip column filtering
logger.Warn("Cannot validate columns for unknown relation: %s", expand.Relation)
// Keep the columns as-is if we can't validate them
filteredExpand.Columns = expand.Columns
}
filteredExpands = append(filteredExpands, filteredExpand)
}
filtered.Expand = filteredExpands
return filtered return filtered
} }