handle static method

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

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,
  DTDConnectionInfo? dtd,
}) {
  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] helper.
  switch (request.url.path) {
    case apiNotifyForVmServiceConnection:
      return Handler.handleNotifyForVmServiceConnection(
        api,
        queryParams,
        dtd,
      );
    // ----- Flutter Tool GA store. -----
    case apiGetFlutterGAEnabled:
      // Is Analytics collection enabled?
      return _encodeResponse('', api: api);
    case apiGetFlutterGAClientId:
      // Flutter Tool GA clientId - ONLY get Flutter's clientId if enabled is
      // true.
      return _encodeResponse('', api: api);

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

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

        _devToolsUsage.analyticsEnabled = analyticsEnabled;
      }
      return _encodeResponse(_devToolsUsage.analyticsEnabled, api: api);

    // ----- 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 _encodeResponse(result, api: api);
    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 _encodeResponse(_devToolsUsage.surveyActionTaken, api: api);
    // 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 _encodeResponse(_devToolsUsage.surveyActionTaken, api: api);
    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 _encodeResponse(_devToolsUsage.surveyShownCount, api: api);
    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 _encodeResponse(_devToolsUsage.surveyShownCount, api: api);

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

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

    // ----- 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.success(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.success(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,
        dtd,
      );

    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,
      );
    case DtdApi.apiGetDtdUri:
      return _DtdApiHandler.handleGetDtdUri(api, dtd);
    default:
      return api.notImplemented();
  }
}