Skip to content

Survey handler functionality to fetch available surveys #91

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged

Conversation

eliasyishak
Copy link
Contributor

@eliasyishak eliasyishak commented May 10, 2023

Relevant issue:

This PR will add functionality to enable tools using this package (flutter-tools, analyzer, etc.) to share available surveys with our users. It will enable the Analytics class to fetch the available surveys from https://docs.flutter.dev/f/contextual-survey-metadata.json and parse the conditions (if applicable) using the locally persisted log file. If the conditions are met, then this package will return the relevant information (url, description, etc.) to the tool so that it can prompt the user with a survey link.

Example of what the survey metadata file will look like:

[
    {
        "uniqueId": "test_channel",
        "url": "xxxxx",
        "startDate": "2000-03-01T09:00:00-07:00",
        "endDate": "2000-06-30T09:00:00-07:00",
	"description": "Contextual message explaining the survey",
	"dismissForDays": "10",
	"moreInfoURL": "xxxxxxx",
	"samplingRate": "0.1",
	"conditions": [
	    {
	        "field": "logFileStats.recordCount",
	        "operator": ">=",
	        "value": 1000
            }
	]
    }
]

  • I’ve reviewed the contributor guide and applied the relevant portions to this PR.

Contribution guidelines:

Many Dart repos have a weekly cadence for reviewing PRs - please allow for a week or two of latency for initial review feedback.


@eliasyishak eliasyishak marked this pull request as ready for review May 16, 2023 19:59
@eliasyishak eliasyishak changed the title [wip] Survey handler functionality Survey handler functionality May 17, 2023
@eliasyishak eliasyishak changed the title Survey handler functionality Survey handler functionality to fetch available surveys May 17, 2023
case '!=':
if (logFileStatsValue != condition.value) conditionsMet++;
break;
}
Copy link
Contributor

@christopherfujino christopherfujino May 17, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what happens if we fall through and don't hit any of the cases (that is, condition.operatorString is invalid)? I'm guessing we should have a default that throws?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If for some reason the operator in the metadata file wasn't accounted for in this switch statement, then the survey would not be delivered to the end user, which i think is preferable over an error getting surfaced?

But like you mentioned in your other comment, we will look into creating something that properly vets each time we upload metadata files so that package:unified_analytics is able to parse them

int? getValueByString(String label) {
switch (label) {
case 'logFileStats.startDateTime':
return startDateTime.millisecondsSinceEpoch;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think you should consider where to document these keys (I'm thinking specifically if some noogler in a few months writes a new survey condition where startDateTime < Jan 1 2023, they would need to know to put the condition in millisecondsSinceEpoch.

Could we add a test script to the website CI that validates the contextual-survey-metadata.json file is parseable by package:unified_analytics before publishing the website?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah that's a good point, I have added an additional item in the tracker issue to add automated checks for the metadata file in the flutter/website repo

Copy link
Contributor

@christopherfujino christopherfujino left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@eliasyishak eliasyishak changed the base branch from main to survey-handler-feature May 18, 2023 14:51
@eliasyishak eliasyishak merged commit 681f712 into dart-lang:survey-handler-feature May 18, 2023
@eliasyishak eliasyishak deleted the 81-survey-handler-class branch May 18, 2023 14:54
eliasyishak added a commit that referenced this pull request Aug 3, 2023
* Survey handler functionality to fetch available surveys (#91)

* Add constant for endpoint that stores metadata json file

* Development began on survey handler class with fetch

* Update survey_handler.dart

* Parsing functionality added in `survey_handler`

* Condition class `operator` relabeled to `operatorString`

* `Analytics` test and default constructors to use `SurveyHandler`

* Refactor + cleanup + error handling

* `dart format` fix

* Evaluating functionality added to `Analytics`

* Format fix

* `!=` operator added to `Condition` class

* Refactor for fake survey handler to use list of surveys or string

* Initial test cases added

* Tests added to use json in `FakeSurveyHandler`

* Fix nit

* Early exit if on null `logFileStats`

* Test to check each field in `Survey` and `Condition`

* Documentation update

* No surveys returned for opted out users

* Revert "No surveys returned for opted out users"

This reverts commit f6d9f8e.

* No surveys for opted out users (#99)

* Check `okToSend` before fetching surveys

* Added test

* dart format fix

* Update CHANGELOG.md

* Mark as dev

* Change version suffix

* `dart fix --apply --code=combinators_ordering`

* Fix `survey_handler.dart` with new lints

* Add'l fixes to survey_handler

* Remove left hand types from `analytics.dart`

* Fix `survey_handler_test.dart` with new lints

* Fix tests with survey_handler class from lint fixes

* `dart format` fix

* Sampling rate functionality added (#122)

* Sampling rate functionality added

* Update tests to have 100% sampling rate

* Tests added to test sampling rate

* Update survey_handler_test.dart

* Fix type for `jsonDecode`

* New utility function to convert string into integer

* Fix tests with new outputs for sample rate

* Use uniqueId for survey instead of description

* Add hyphen to lookup

* Fix documentation

* Fix survey handler tests to use new .send method

* Fix tests to use new maps for `LogFileStats`

* Dismissing and persisting surveys (#127)

* Add constant for new file name + clean up session handler

Removing NoOp session instance since that was only being used before `2.0.0`

* Updating survey handler to create file to persist ids

* Revert changes to session handler

* Update constant to be a json file

* Initialize dismiss surveys file with empty json

* Initializer for dismissed file made static

* Functionality added to check if survey snoozed or dismissed

* Dismiss functionality added

* `dismissForDays` -> `dismissForMinutes`

* Update survey_handler_test.dart

* Clean up external functions to be class methods

* Tests added for snoozing and dismissing permanently

* Test added for malformed json

* Check sample rate before using LogFileStats

* Add `surveyShown` API to snooze surveys

* Use new URL for survey metadata

* Error handling for missing json file

* Sample rate example added (#130)

* Added example file

* Including example's output in code

* Update sample_rate.dart

* Fix nits

* Send event for surveys shown and surveys dismissed (#133)

* Added enum and event constructor survey actions

* Fix format errors

* Using two events for survey shown and survey action

* Created mock class to confirm events are sent

* Clean up constructors

* Fix nits

* Refactor for buttons array with `SurveyButton` class (#134)

* Added newe `SurveyButton` class

* Fix tests

* Add documentation for enums

* Update sample_rate.dart

* Update tests to check for `SurveyButton` classes

* Remove enum for status of action

* Use `snoozeForMinutes` instead of dismiss

* Expose `SurveyButton`

* Fixing documentation for event class

* Order members in survey handler

* Refactor to pass button to `surveyInteracted(..)`

* `surveyButtonList` --> `buttonList` renaming

* Adding example file for how to use survey handler feature

* Adding conditional check for url to display

* Format fix

* Allow surveys with no conditions to be passed

Only checking if `logFileStats` is null if there is a condition in the condition array in the json

* Update version

* Simplify utility functions for sample rate + check date

* `const` constructor for `Survey` unnamed constructor

* Fix test to unit test sampling function

* Fix dartdocs + check for null outside loop + breaks removed

* Add documentation to example files

* `dart format`

* Catch `TypeError` when parsing json survey

* Adding tests for the sampling rate with margin of error
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants