func parseQueryParams()

in traffic_ops/traffic_ops_golang/server/update.go [152:226]


func parseQueryParams(params map[string]string, version api.Version) (*updateValues, error) {
	var paramValues updateValues

	// Verify query string parameters
	configUpdatedBoolParam, hasConfigUpdatedBoolParam := params["updated"]     // Deprecated, but still required for backwards compatibility
	revalUpdatedBoolParam, hasRevalUpdatedBoolParam := params["reval_updated"] // Deprecated, but still required for backwards compatibility
	configApplyTimeParam, hasConfigApplyTimeParam := params["config_apply_time"]
	revalidateApplyTimeParam, hasRevalidateApplyTimeParam := params["revalidate_apply_time"]
	configUpdateFailedParam, hasConfigUpdateFailedParam := params["config_update_failed"]
	revalidateUpdateFailedParam, hasRevalidateUpdateFailedParam := params["revalidate_update_failed"]
	isAfterApi5 := version.GreaterThanOrEqualTo(&api.Version{Major: 5})

	if !(hasConfigApplyTimeParam || (hasConfigUpdateFailedParam && isAfterApi5)) && !(hasRevalidateApplyTimeParam || (hasRevalidateUpdateFailedParam && isAfterApi5)) &&
		!hasConfigUpdatedBoolParam && !hasRevalUpdatedBoolParam {
		return nil, errors.New("must pass at least one of the following query parameters: 'config_apply_time', 'revalidate_apply_time' ,'updated', 'reval_updated'")

	}
	// Prevent collision between booleans and timestamps
	if (hasConfigApplyTimeParam || (hasConfigUpdateFailedParam && isAfterApi5)) && hasConfigUpdatedBoolParam {
		return nil, errors.New("conflicting parameters. may not pass 'updated' along with 'config_apply_time'")

	}
	if (hasRevalidateApplyTimeParam || (hasConfigUpdateFailedParam && isAfterApi5)) && hasRevalUpdatedBoolParam {
		return nil, errors.New("conflicting parameters. may not pass 'reval_updated' along with 'revalidate_apply_time'")
	}

	// Validate and parse parameters before attempting to apply them (don't want to partially apply various status before an error)
	// Timestamps
	if hasConfigApplyTimeParam {
		configApplyTime, err := time.Parse(time.RFC3339Nano, configApplyTimeParam)
		if err != nil {
			return nil, errors.New("query parameter 'config_apply_time' must be valid RFC3339Nano format:" + err.Error())
		}
		paramValues.configApplyTime = &configApplyTime
	}

	if hasRevalidateApplyTimeParam {
		revalApplyTime, err := time.Parse(time.RFC3339Nano, revalidateApplyTimeParam)
		if err != nil {
			return nil, errors.New("query parameter 'revalidate_apply_time' must be valid RFC3339Nano format:" + err.Error())
		}
		paramValues.revalApplyTime = &revalApplyTime
	}

	// Booleans
	if hasConfigUpdatedBoolParam {
		updatedBool, err := strconv.ParseBool(configUpdatedBoolParam)
		if err != nil {
			return nil, errors.New("query parameter 'updated' must be a boolean")
		}
		paramValues.configUpdateBool = &updatedBool
	}
	if hasRevalUpdatedBoolParam {
		revalUpdatedBool, err := strconv.ParseBool(revalUpdatedBoolParam)
		if err != nil {
			return nil, errors.New("query parameter 'reval_updated' must be a boolean")
		}
		paramValues.revalUpdateBool = &revalUpdatedBool
	}
	if hasConfigUpdateFailedParam && isAfterApi5 {
		configUpdateFailedBool, err := strconv.ParseBool(configUpdateFailedParam)
		if err != nil {
			return nil, errors.New("query parameter 'config_update_failed' must be a boolean")
		}
		paramValues.configUpdateFailed = &configUpdateFailedBool
	}
	if hasRevalidateUpdateFailedParam && isAfterApi5 {
		revalUpdateFailedBool, err := strconv.ParseBool(revalidateUpdateFailedParam)
		if err != nil {
			return nil, errors.New("query parameter 'revalidate_update_failed' must be a boolean")
		}
		paramValues.revalUpdateFailed = &revalUpdateFailedBool
	}
	return &paramValues, nil
}