handle static method

FutureOr<Response> handle(
  1. Request request, {
  2. required ExtensionsManager extensionsManager,
  3. required DeeplinkManager deeplinkManager,
  4. ServerApi? api,
})

Handles all requests.

To override an API call, pass in a subclass of ServerApi.

Implementation

static FutureOr<shelf.Response> handle(
  shelf.Request request, {
  required ExtensionsManager extensionsManager,
  required DeeplinkManager deeplinkManager,
  ServerApi? api,
}) {
  api ??= ServerApi();
  final queryParams = request.requestedUri.queryParameters;
  // TODO(kenz): break this switch statement up so that it uses helper methods
  // for each case. Also use [_checkRequiredParameters] and [_encodeResponse]
  // helpers.
  switch (request.url.path) {
    // ----- Flutter Tool GA store. -----
    case apiGetFlutterGAEnabled:
      // Is Analytics collection enabled?
      return api.getCompleted(
        json.encode(FlutterUsage.doesStoreExist ? _usage!.enabled : ''),
      );
    case apiGetFlutterGAClientId:
      // Flutter Tool GA clientId - ONLY get Flutter's clientId if enabled is
      // true.
      return (FlutterUsage.doesStoreExist)
          ? api.getCompleted(
              json.encode(_usage!.enabled ? _usage!.clientId : ''),
            )
          : api.getCompleted(
              json.encode(''),
            );

    // ----- DevTools GA store. -----

    case apiResetDevTools:
      _devToolsUsage.reset();
      return api.getCompleted(json.encode(true));
    case apiGetDevToolsFirstRun:
      // Has DevTools been run first time? To bring up analytics dialog.
      return api.getCompleted(
        json.encode(_devToolsUsage.isFirstRun),
      );
    case apiGetDevToolsEnabled:
      // Is DevTools Analytics collection enabled?
      return api.getCompleted(
        json.encode(_devToolsUsage.analyticsEnabled),
      );
    case apiSetDevToolsEnabled:
      // Enable or disable DevTools analytics collection.
      if (queryParams.containsKey(devToolsEnabledPropertyName)) {
        _devToolsUsage.analyticsEnabled =
            json.decode(queryParams[devToolsEnabledPropertyName]!);
      }
      return api.setCompleted(
        json.encode(_devToolsUsage.analyticsEnabled),
      );

    // ----- DevTools survey store. -----

    case apiSetActiveSurvey:
      // Assume failure.
      bool result = false;

      // Set the active survey used to store subsequent apiGetSurveyActionTaken,
      // apiSetSurveyActionTaken, apiGetSurveyShownCount, and
      // apiIncrementSurveyShownCount calls.
      if (queryParams.keys.length == 1 &&
          queryParams.containsKey(activeSurveyName)) {
        final String theSurveyName = queryParams[activeSurveyName]!;

        // Set the current activeSurvey.
        _devToolsUsage.activeSurvey = theSurveyName;
        result = true;
      }

      return api.getCompleted(json.encode(result));
    case apiGetSurveyActionTaken:
      // Request setActiveSurvey has not been requested.
      if (_devToolsUsage.activeSurvey == null) {
        return api.badRequest(
          '$errorNoActiveSurvey '
          '- $apiGetSurveyActionTaken',
        );
      }
      // SurveyActionTaken has the survey been acted upon (taken or dismissed)
      return api.getCompleted(
        json.encode(_devToolsUsage.surveyActionTaken),
      );
    // TODO(terry): remove the query param logic for this request.
    // setSurveyActionTaken should only be called with the value of true, so
    // we can remove the extra complexity.
    case apiSetSurveyActionTaken:
      // Request setActiveSurvey has not been requested.
      if (_devToolsUsage.activeSurvey == null) {
        return api.badRequest(
          '$errorNoActiveSurvey '
          '- $apiSetSurveyActionTaken',
        );
      }
      // Set the SurveyActionTaken.
      // Has the survey been taken or dismissed..
      if (queryParams.containsKey(surveyActionTakenPropertyName)) {
        _devToolsUsage.surveyActionTaken =
            json.decode(queryParams[surveyActionTakenPropertyName]!);
      }
      return api.setCompleted(
        json.encode(_devToolsUsage.surveyActionTaken),
      );
    case apiGetSurveyShownCount:
      // Request setActiveSurvey has not been requested.
      if (_devToolsUsage.activeSurvey == null) {
        return api.badRequest(
          '$errorNoActiveSurvey '
          '- $apiGetSurveyShownCount',
        );
      }
      // SurveyShownCount how many times have we asked to take survey.
      return api.getCompleted(
        json.encode(_devToolsUsage.surveyShownCount),
      );
    case apiIncrementSurveyShownCount:
      // Request setActiveSurvey has not been requested.
      if (_devToolsUsage.activeSurvey == null) {
        return api.badRequest(
          '$errorNoActiveSurvey '
          '- $apiIncrementSurveyShownCount',
        );
      }
      // Increment the SurveyShownCount, we've asked about the survey.
      _devToolsUsage.incrementSurveyShownCount();
      return api.getCompleted(
        json.encode(_devToolsUsage.surveyShownCount),
      );

    // ----- Release notes api. -----

    case apiGetLastReleaseNotesVersion:
      return api.getCompleted(
        json.encode(_devToolsUsage.lastReleaseNotesVersion),
      );
    case apiSetLastReleaseNotesVersion:
      if (queryParams.containsKey(lastReleaseNotesVersionPropertyName)) {
        _devToolsUsage.lastReleaseNotesVersion =
            queryParams[lastReleaseNotesVersionPropertyName]!;
      }
      return api.getCompleted(
        json.encode(_devToolsUsage.lastReleaseNotesVersion),
      );

    // ----- App size api. -----

    case apiGetBaseAppSizeFile:
      if (queryParams.containsKey(baseAppSizeFilePropertyName)) {
        final filePath = queryParams[baseAppSizeFilePropertyName]!;
        final fileJson = LocalFileSystem.devToolsFileAsJson(filePath);
        if (fileJson == null) {
          return api.badRequest('No JSON file available at $filePath.');
        }
        return api.getCompleted(fileJson);
      }
      return api.badRequest(
        'Request for base app size file does not '
        'contain a query parameter with the expected key: '
        '$baseAppSizeFilePropertyName',
      );
    case apiGetTestAppSizeFile:
      if (queryParams.containsKey(testAppSizeFilePropertyName)) {
        final filePath = queryParams[testAppSizeFilePropertyName]!;
        final fileJson = LocalFileSystem.devToolsFileAsJson(filePath);
        if (fileJson == null) {
          return api.badRequest('No JSON file available at $filePath.');
        }
        return api.getCompleted(fileJson);
      }
      return api.badRequest(
        'Request for test app size file does not '
        'contain a query parameter with the expected key: '
        '$testAppSizeFilePropertyName',
      );

    // ----- Extensions api. -----

    case ExtensionsApi.apiServeAvailableExtensions:
      return _ExtensionsApiHandler.handleServeAvailableExtensions(
        api,
        queryParams,
        extensionsManager,
      );

    case ExtensionsApi.apiExtensionEnabledState:
      return _ExtensionsApiHandler.handleExtensionEnabledState(
        api,
        queryParams,
      );

    // ----- deeplink api. -----

    case DeeplinkApi.androidBuildVariants:
      return _DeeplinkApiHandler.handleAndroidBuildVariants(
        api,
        queryParams,
        deeplinkManager,
      );

    case DeeplinkApi.androidAppLinkSettings:
      return _DeeplinkApiHandler.handleAndroidAppLinkSettings(
        api,
        queryParams,
        deeplinkManager,
      );

    case DeeplinkApi.iosBuildOptions:
      return _DeeplinkApiHandler.handleIosBuildOptions(
        api,
        queryParams,
        deeplinkManager,
      );

    case DeeplinkApi.iosUniversalLinkSettings:
      return _DeeplinkApiHandler.handleIosUniversalLinkSettings(
        api,
        queryParams,
        deeplinkManager,
      );

    default:
      return api.notImplemented();
  }
}