blob: 6088419e90d4cc856b4833944578f34154bc0d90 [file] [log] [blame]
// This is a generated file (see the discoveryapis_generator project).
// ignore_for_file: camel_case_types
// ignore_for_file: comment_references
// ignore_for_file: file_names
// ignore_for_file: library_names
// ignore_for_file: lines_longer_than_80_chars
// ignore_for_file: non_constant_identifier_names
// ignore_for_file: prefer_expression_function_bodies
// ignore_for_file: prefer_final_locals
// ignore_for_file: prefer_interpolation_to_compose_strings
// ignore_for_file: unnecessary_brace_in_string_interps
// ignore_for_file: unnecessary_cast
// ignore_for_file: unnecessary_lambdas
// ignore_for_file: unnecessary_parenthesis
// ignore_for_file: unnecessary_string_interpolations
/// Analytics Reporting API - v4
///
/// Accesses Analytics report data.
///
/// For more information, see
/// <https://developers.google.com/analytics/devguides/reporting/core/v4/>
///
/// Create an instance of [AnalyticsReportingApi] to access these resources:
///
/// - [ReportsResource]
/// - [UserActivityResource]
library analyticsreporting.v4;
import 'dart:async' as async;
import 'dart:convert' as convert;
import 'dart:core' as core;
import 'package:_discoveryapis_commons/_discoveryapis_commons.dart' as commons;
import 'package:http/http.dart' as http;
import '../src/user_agent.dart';
export 'package:_discoveryapis_commons/_discoveryapis_commons.dart'
show ApiRequestError, DetailedApiRequestError;
/// Accesses Analytics report data.
class AnalyticsReportingApi {
/// View and manage your Google Analytics data
static const analyticsScope = 'https://www.googleapis.com/auth/analytics';
/// View your Google Analytics data
static const analyticsReadonlyScope =
'https://www.googleapis.com/auth/analytics.readonly';
final commons.ApiRequester _requester;
ReportsResource get reports => ReportsResource(_requester);
UserActivityResource get userActivity => UserActivityResource(_requester);
AnalyticsReportingApi(http.Client client,
{core.String rootUrl = 'https://analyticsreporting.googleapis.com/',
core.String servicePath = ''})
: _requester =
commons.ApiRequester(client, rootUrl, servicePath, userAgent);
}
class ReportsResource {
final commons.ApiRequester _requester;
ReportsResource(commons.ApiRequester client) : _requester = client;
/// Returns the Analytics data.
///
/// [request] - The metadata request object.
///
/// Request parameters:
///
/// [$fields] - Selector specifying which fields to include in a partial
/// response.
///
/// Completes with a [GetReportsResponse].
///
/// Completes with a [commons.ApiRequestError] if the API endpoint returned an
/// error.
///
/// If the used [http.Client] completes with an error when making a REST call,
/// this method will complete with the same error.
async.Future<GetReportsResponse> batchGet(
GetReportsRequest request, {
core.String $fields,
}) {
core.String _url;
final _queryParams = <core.String, core.List<core.String>>{};
commons.Media _uploadMedia;
commons.UploadOptions _uploadOptions;
var _downloadOptions = commons.DownloadOptions.Metadata;
core.String _body;
if (request != null) {
_body = convert.json.encode(request.toJson());
}
if ($fields != null) {
_queryParams['fields'] = [$fields];
}
_url = 'v4/reports:batchGet';
final _response = _requester.request(
_url,
'POST',
body: _body,
queryParams: _queryParams,
uploadOptions: _uploadOptions,
uploadMedia: _uploadMedia,
downloadOptions: _downloadOptions,
);
return _response.then(
(data) => GetReportsResponse.fromJson(
data as core.Map<core.String, core.dynamic>),
);
}
}
class UserActivityResource {
final commons.ApiRequester _requester;
UserActivityResource(commons.ApiRequester client) : _requester = client;
/// Returns User Activity data.
///
/// [request] - The metadata request object.
///
/// Request parameters:
///
/// [$fields] - Selector specifying which fields to include in a partial
/// response.
///
/// Completes with a [SearchUserActivityResponse].
///
/// Completes with a [commons.ApiRequestError] if the API endpoint returned an
/// error.
///
/// If the used [http.Client] completes with an error when making a REST call,
/// this method will complete with the same error.
async.Future<SearchUserActivityResponse> search(
SearchUserActivityRequest request, {
core.String $fields,
}) {
core.String _url;
final _queryParams = <core.String, core.List<core.String>>{};
commons.Media _uploadMedia;
commons.UploadOptions _uploadOptions;
var _downloadOptions = commons.DownloadOptions.Metadata;
core.String _body;
if (request != null) {
_body = convert.json.encode(request.toJson());
}
if ($fields != null) {
_queryParams['fields'] = [$fields];
}
_url = 'v4/userActivity:search';
final _response = _requester.request(
_url,
'POST',
body: _body,
queryParams: _queryParams,
uploadOptions: _uploadOptions,
uploadMedia: _uploadMedia,
downloadOptions: _downloadOptions,
);
return _response.then(
(data) => SearchUserActivityResponse.fromJson(
data as core.Map<core.String, core.dynamic>),
);
}
}
/// An Activity represents data for an activity of a user. Note that an Activity
/// is different from a hit. A hit might result in multiple Activity's. For
/// example, if a hit includes a transaction and a goal completion, there will
/// be two Activity protos for this hit, one for ECOMMERCE and one for GOAL.
/// Conversely, multiple hits can also construct one Activity. In classic
/// e-commerce, data for one transaction might be sent through multiple hits.
/// These hits will be merged into one ECOMMERCE Activity.
class Activity {
/// Timestamp of the activity. If activities for a visit cross midnight and
/// occur in two separate dates, then two sessions (one per date) share the
/// session identifier. For example, say session ID 113472 has activity within
/// 2019-08-20, and session ID 243742 has activity within 2019-08-25 and
/// 2019-08-26. Session ID 113472 is one session, and session ID 243742 is two
/// sessions.
core.String activityTime;
/// Type of this activity.
/// Possible string values are:
/// - "ACTIVITY_TYPE_UNSPECIFIED" : ActivityType will never have this value in
/// the response. Using this type in the request will result in an error.
/// - "PAGEVIEW" : Used when the activity resulted out of a visitor viewing a
/// page.
/// - "SCREENVIEW" : Used when the activity resulted out of a visitor using an
/// application on a mobile device.
/// - "GOAL" : Used to denote that a goal type activity.
/// - "ECOMMERCE" : An e-commerce transaction was performed by the visitor on
/// the page.
/// - "EVENT" : Used when the activity is an event.
core.String activityType;
/// This will be set if `activity_type` equals `SCREEN_VIEW`.
ScreenviewData appview;
/// For manual campaign tracking, it is the value of the utm_campaign campaign
/// tracking parameter. For AdWords autotagging, it is the name(s) of the
/// online ad campaign(s) you use for the property. If you use neither, its
/// value is (not set).
core.String campaign;
/// The Channel Group associated with an end user's session for this View
/// (defined by the View's Channel Groupings).
core.String channelGrouping;
/// A list of all custom dimensions associated with this activity.
core.List<CustomDimension> customDimension;
/// This will be set if `activity_type` equals `ECOMMERCE`.
EcommerceData ecommerce;
/// This field contains all the details pertaining to an event and will be set
/// if `activity_type` equals `EVENT`.
EventData event;
/// This field contains a list of all the goals that were reached in this
/// activity when `activity_type` equals `GOAL`.
GoalSetData goals;
/// The hostname from which the tracking request was made.
core.String hostname;
/// For manual campaign tracking, it is the value of the utm_term campaign
/// tracking parameter. For AdWords traffic, it contains the best matching
/// targeting criteria. For the display network, where multiple targeting
/// criteria could have caused the ad to show up, it returns the best matching
/// targeting criteria as selected by Ads. This could be display_keyword, site
/// placement, boomuserlist, user_interest, age, or gender. Otherwise its
/// value is (not set).
core.String keyword;
/// The first page in users' sessions, or the landing page.
core.String landingPagePath;
/// The type of referrals. For manual campaign tracking, it is the value of
/// the utm_medium campaign tracking parameter. For AdWords autotagging, it is
/// cpc. If users came from a search engine detected by Google Analytics, it
/// is organic. If the referrer is not a search engine, it is referral. If
/// users came directly to the property and document.referrer is empty, its
/// value is (none).
core.String medium;
/// This will be set if `activity_type` equals `PAGEVIEW`. This field contains
/// all the details about the visitor and the page that was visited.
PageviewData pageview;
/// The source of referrals. For manual campaign tracking, it is the value of
/// the utm_source campaign tracking parameter. For AdWords autotagging, it is
/// google. If you use neither, it is the domain of the source (e.g.,
/// document.referrer) referring the users. It may also contain a port
/// address. If users arrived without a referrer, its value is (direct).
core.String source;
Activity();
Activity.fromJson(core.Map _json) {
if (_json.containsKey('activityTime')) {
activityTime = _json['activityTime'] as core.String;
}
if (_json.containsKey('activityType')) {
activityType = _json['activityType'] as core.String;
}
if (_json.containsKey('appview')) {
appview = ScreenviewData.fromJson(
_json['appview'] as core.Map<core.String, core.dynamic>);
}
if (_json.containsKey('campaign')) {
campaign = _json['campaign'] as core.String;
}
if (_json.containsKey('channelGrouping')) {
channelGrouping = _json['channelGrouping'] as core.String;
}
if (_json.containsKey('customDimension')) {
customDimension = (_json['customDimension'] as core.List)
.map<CustomDimension>((value) => CustomDimension.fromJson(
value as core.Map<core.String, core.dynamic>))
.toList();
}
if (_json.containsKey('ecommerce')) {
ecommerce = EcommerceData.fromJson(
_json['ecommerce'] as core.Map<core.String, core.dynamic>);
}
if (_json.containsKey('event')) {
event = EventData.fromJson(
_json['event'] as core.Map<core.String, core.dynamic>);
}
if (_json.containsKey('goals')) {
goals = GoalSetData.fromJson(
_json['goals'] as core.Map<core.String, core.dynamic>);
}
if (_json.containsKey('hostname')) {
hostname = _json['hostname'] as core.String;
}
if (_json.containsKey('keyword')) {
keyword = _json['keyword'] as core.String;
}
if (_json.containsKey('landingPagePath')) {
landingPagePath = _json['landingPagePath'] as core.String;
}
if (_json.containsKey('medium')) {
medium = _json['medium'] as core.String;
}
if (_json.containsKey('pageview')) {
pageview = PageviewData.fromJson(
_json['pageview'] as core.Map<core.String, core.dynamic>);
}
if (_json.containsKey('source')) {
source = _json['source'] as core.String;
}
}
core.Map<core.String, core.Object> toJson() {
final _json = <core.String, core.Object>{};
if (activityTime != null) {
_json['activityTime'] = activityTime;
}
if (activityType != null) {
_json['activityType'] = activityType;
}
if (appview != null) {
_json['appview'] = appview.toJson();
}
if (campaign != null) {
_json['campaign'] = campaign;
}
if (channelGrouping != null) {
_json['channelGrouping'] = channelGrouping;
}
if (customDimension != null) {
_json['customDimension'] =
customDimension.map((value) => value.toJson()).toList();
}
if (ecommerce != null) {
_json['ecommerce'] = ecommerce.toJson();
}
if (event != null) {
_json['event'] = event.toJson();
}
if (goals != null) {
_json['goals'] = goals.toJson();
}
if (hostname != null) {
_json['hostname'] = hostname;
}
if (keyword != null) {
_json['keyword'] = keyword;
}
if (landingPagePath != null) {
_json['landingPagePath'] = landingPagePath;
}
if (medium != null) {
_json['medium'] = medium;
}
if (pageview != null) {
_json['pageview'] = pageview.toJson();
}
if (source != null) {
_json['source'] = source;
}
return _json;
}
}
/// Defines a cohort. A cohort is a group of users who share a common
/// characteristic. For example, all users with the same acquisition date belong
/// to the same cohort.
class Cohort {
/// This is used for `FIRST_VISIT_DATE` cohort, the cohort selects users whose
/// first visit date is between start date and end date defined in the
/// DateRange. The date ranges should be aligned for cohort requests. If the
/// request contains `ga:cohortNthDay` it should be exactly one day long, if
/// `ga:cohortNthWeek` it should be aligned to the week boundary (starting at
/// Sunday and ending Saturday), and for `ga:cohortNthMonth` the date range
/// should be aligned to the month (starting at the first and ending on the
/// last day of the month). For LTV requests there are no such restrictions.
/// You do not need to supply a date range for the `reportsRequest.dateRanges`
/// field.
DateRange dateRange;
/// A unique name for the cohort. If not defined name will be auto-generated
/// with values cohort_[1234...].
core.String name;
/// Type of the cohort. The only supported type as of now is
/// `FIRST_VISIT_DATE`. If this field is unspecified the cohort is treated as
/// `FIRST_VISIT_DATE` type cohort.
/// Possible string values are:
/// - "UNSPECIFIED_COHORT_TYPE" : If unspecified it's treated as
/// `FIRST_VISIT_DATE`.
/// - "FIRST_VISIT_DATE" : Cohorts that are selected based on first visit
/// date.
core.String type;
Cohort();
Cohort.fromJson(core.Map _json) {
if (_json.containsKey('dateRange')) {
dateRange = DateRange.fromJson(
_json['dateRange'] as core.Map<core.String, core.dynamic>);
}
if (_json.containsKey('name')) {
name = _json['name'] as core.String;
}
if (_json.containsKey('type')) {
type = _json['type'] as core.String;
}
}
core.Map<core.String, core.Object> toJson() {
final _json = <core.String, core.Object>{};
if (dateRange != null) {
_json['dateRange'] = dateRange.toJson();
}
if (name != null) {
_json['name'] = name;
}
if (type != null) {
_json['type'] = type;
}
return _json;
}
}
/// Defines a cohort group. For example: "cohortGroup": { "cohorts": [{ "name":
/// "cohort 1", "type": "FIRST_VISIT_DATE", "dateRange": { "startDate":
/// "2015-08-01", "endDate": "2015-08-01" } },{ "name": "cohort 2" "type":
/// "FIRST_VISIT_DATE" "dateRange": { "startDate": "2015-07-01", "endDate":
/// "2015-07-01" } }] }
class CohortGroup {
/// The definition for the cohort.
core.List<Cohort> cohorts;
/// Enable Life Time Value (LTV). LTV measures lifetime value for users
/// acquired through different channels. Please see: [Cohort
/// Analysis](https://support.google.com/analytics/answer/6074676) and
/// [Lifetime Value](https://support.google.com/analytics/answer/6182550) If
/// the value of lifetimeValue is false: - The metric values are similar to
/// the values in the web interface cohort report. - The cohort definition
/// date ranges must be aligned to the calendar week and month. i.e. while
/// requesting `ga:cohortNthWeek` the `startDate` in the cohort definition
/// should be a Sunday and the `endDate` should be the following Saturday, and
/// for `ga:cohortNthMonth`, the `startDate` should be the 1st of the month
/// and `endDate` should be the last day of the month. When the lifetimeValue
/// is true: - The metric values will correspond to the values in the web
/// interface LifeTime value report. - The Lifetime Value report shows you how
/// user value (Revenue) and engagement (Appviews, Goal Completions, Sessions,
/// and Session Duration) grow during the 90 days after a user is acquired. -
/// The metrics are calculated as a cumulative average per user per the time
/// increment. - The cohort definition date ranges need not be aligned to the
/// calendar week and month boundaries. - The `viewId` must be an [app view
/// ID](https://support.google.com/analytics/answer/2649553#WebVersusAppViews)
core.bool lifetimeValue;
CohortGroup();
CohortGroup.fromJson(core.Map _json) {
if (_json.containsKey('cohorts')) {
cohorts = (_json['cohorts'] as core.List)
.map<Cohort>((value) =>
Cohort.fromJson(value as core.Map<core.String, core.dynamic>))
.toList();
}
if (_json.containsKey('lifetimeValue')) {
lifetimeValue = _json['lifetimeValue'] as core.bool;
}
}
core.Map<core.String, core.Object> toJson() {
final _json = <core.String, core.Object>{};
if (cohorts != null) {
_json['cohorts'] = cohorts.map((value) => value.toJson()).toList();
}
if (lifetimeValue != null) {
_json['lifetimeValue'] = lifetimeValue;
}
return _json;
}
}
/// Column headers.
class ColumnHeader {
/// The dimension names in the response.
core.List<core.String> dimensions;
/// Metric headers for the metrics in the response.
MetricHeader metricHeader;
ColumnHeader();
ColumnHeader.fromJson(core.Map _json) {
if (_json.containsKey('dimensions')) {
dimensions = (_json['dimensions'] as core.List)
.map<core.String>((value) => value as core.String)
.toList();
}
if (_json.containsKey('metricHeader')) {
metricHeader = MetricHeader.fromJson(
_json['metricHeader'] as core.Map<core.String, core.dynamic>);
}
}
core.Map<core.String, core.Object> toJson() {
final _json = <core.String, core.Object>{};
if (dimensions != null) {
_json['dimensions'] = dimensions;
}
if (metricHeader != null) {
_json['metricHeader'] = metricHeader.toJson();
}
return _json;
}
}
/// Custom dimension.
class CustomDimension {
/// Slot number of custom dimension.
core.int index;
/// Value of the custom dimension. Default value (i.e. empty string) indicates
/// clearing sesion/visitor scope custom dimension value.
core.String value;
CustomDimension();
CustomDimension.fromJson(core.Map _json) {
if (_json.containsKey('index')) {
index = _json['index'] as core.int;
}
if (_json.containsKey('value')) {
value = _json['value'] as core.String;
}
}
core.Map<core.String, core.Object> toJson() {
final _json = <core.String, core.Object>{};
if (index != null) {
_json['index'] = index;
}
if (value != null) {
_json['value'] = value;
}
return _json;
}
}
/// A contiguous set of days: startDate, startDate + 1 day, ..., endDate. The
/// start and end dates are specified in
/// [ISO8601](https://en.wikipedia.org/wiki/ISO_8601) date format `YYYY-MM-DD`.
class DateRange {
/// The end date for the query in the format `YYYY-MM-DD`.
core.String endDate;
/// The start date for the query in the format `YYYY-MM-DD`.
core.String startDate;
DateRange();
DateRange.fromJson(core.Map _json) {
if (_json.containsKey('endDate')) {
endDate = _json['endDate'] as core.String;
}
if (_json.containsKey('startDate')) {
startDate = _json['startDate'] as core.String;
}
}
core.Map<core.String, core.Object> toJson() {
final _json = <core.String, core.Object>{};
if (endDate != null) {
_json['endDate'] = endDate;
}
if (startDate != null) {
_json['startDate'] = startDate;
}
return _json;
}
}
/// Used to return a list of metrics for a single DateRange / dimension
/// combination
class DateRangeValues {
/// The values of each pivot region.
core.List<PivotValueRegion> pivotValueRegions;
/// Each value corresponds to each Metric in the request.
core.List<core.String> values;
DateRangeValues();
DateRangeValues.fromJson(core.Map _json) {
if (_json.containsKey('pivotValueRegions')) {
pivotValueRegions = (_json['pivotValueRegions'] as core.List)
.map<PivotValueRegion>((value) => PivotValueRegion.fromJson(
value as core.Map<core.String, core.dynamic>))
.toList();
}
if (_json.containsKey('values')) {
values = (_json['values'] as core.List)
.map<core.String>((value) => value as core.String)
.toList();
}
}
core.Map<core.String, core.Object> toJson() {
final _json = <core.String, core.Object>{};
if (pivotValueRegions != null) {
_json['pivotValueRegions'] =
pivotValueRegions.map((value) => value.toJson()).toList();
}
if (values != null) {
_json['values'] = values;
}
return _json;
}
}
/// [Dimensions](https://support.google.com/analytics/answer/1033861) are
/// attributes of your data. For example, the dimension `ga:city` indicates the
/// city, for example, "Paris" or "New York", from which a session originates.
class Dimension {
/// If non-empty, we place dimension values into buckets after string to
/// int64. Dimension values that are not the string representation of an
/// integral value will be converted to zero. The bucket values have to be in
/// increasing order. Each bucket is closed on the lower end, and open on the
/// upper end. The "first" bucket includes all values less than the first
/// boundary, the "last" bucket includes all values up to infinity. Dimension
/// values that fall in a bucket get transformed to a new dimension value. For
/// example, if one gives a list of "0, 1, 3, 4, 7", then we return the
/// following buckets: - bucket #1: values < 0, dimension value "<0" - bucket
/// #2: values in [0,1), dimension value "0" - bucket #3: values in [1,3),
/// dimension value "1-2" - bucket #4: values in [3,4), dimension value "3" -
/// bucket #5: values in [4,7), dimension value "4-6" - bucket #6: values >=
/// 7, dimension value "7+" NOTE: If you are applying histogram mutation on
/// any dimension, and using that dimension in sort, you will want to use the
/// sort type `HISTOGRAM_BUCKET` for that purpose. Without that the dimension
/// values will be sorted according to dictionary (lexicographic) order. For
/// example the ascending dictionary order is: "<50", "1001+", "121-1000",
/// "50-120" And the ascending `HISTOGRAM_BUCKET` order is: "<50", "50-120",
/// "121-1000", "1001+" The client has to explicitly request `"orderType":
/// "HISTOGRAM_BUCKET"` for a histogram-mutated dimension.
core.List<core.String> histogramBuckets;
/// Name of the dimension to fetch, for example `ga:browser`.
core.String name;
Dimension();
Dimension.fromJson(core.Map _json) {
if (_json.containsKey('histogramBuckets')) {
histogramBuckets = (_json['histogramBuckets'] as core.List)
.map<core.String>((value) => value as core.String)
.toList();
}
if (_json.containsKey('name')) {
name = _json['name'] as core.String;
}
}
core.Map<core.String, core.Object> toJson() {
final _json = <core.String, core.Object>{};
if (histogramBuckets != null) {
_json['histogramBuckets'] = histogramBuckets;
}
if (name != null) {
_json['name'] = name;
}
return _json;
}
}
/// Dimension filter specifies the filtering options on a dimension.
class DimensionFilter {
/// Should the match be case sensitive? Default is false.
core.bool caseSensitive;
/// The dimension to filter on. A DimensionFilter must contain a dimension.
core.String dimensionName;
/// Strings or regular expression to match against. Only the first value of
/// the list is used for comparison unless the operator is `IN_LIST`. If
/// `IN_LIST` operator, then the entire list is used to filter the dimensions
/// as explained in the description of the `IN_LIST` operator.
core.List<core.String> expressions;
/// Logical `NOT` operator. If this boolean is set to true, then the matching
/// dimension values will be excluded in the report. The default is false.
core.bool not;
/// How to match the dimension to the expression. The default is REGEXP.
/// Possible string values are:
/// - "OPERATOR_UNSPECIFIED" : If the match type is unspecified, it is treated
/// as a `REGEXP`.
/// - "REGEXP" : The match expression is treated as a regular expression. All
/// match types are not treated as regular expressions.
/// - "BEGINS_WITH" : Matches the value which begin with the match expression
/// provided.
/// - "ENDS_WITH" : Matches the values which end with the match expression
/// provided.
/// - "PARTIAL" : Substring match.
/// - "EXACT" : The value should match the match expression entirely.
/// - "NUMERIC_EQUAL" : Integer comparison filters. case sensitivity is
/// ignored for these and the expression is assumed to be a string
/// representing an integer. Failure conditions: - If expression is not a
/// valid int64, the client should expect an error. - Input dimensions that
/// are not valid int64 values will never match the filter.
/// - "NUMERIC_GREATER_THAN" : Checks if the dimension is numerically greater
/// than the match expression. Read the description for `NUMERIC_EQUALS` for
/// restrictions.
/// - "NUMERIC_LESS_THAN" : Checks if the dimension is numerically less than
/// the match expression. Read the description for `NUMERIC_EQUALS` for
/// restrictions.
/// - "IN_LIST" : This option is used to specify a dimension filter whose
/// expression can take any value from a selected list of values. This helps
/// avoiding evaluating multiple exact match dimension filters which are OR'ed
/// for every single response row. For example: expressions: ["A", "B", "C"]
/// Any response row whose dimension has it is value as A, B or C, matches
/// this DimensionFilter.
core.String operator;
DimensionFilter();
DimensionFilter.fromJson(core.Map _json) {
if (_json.containsKey('caseSensitive')) {
caseSensitive = _json['caseSensitive'] as core.bool;
}
if (_json.containsKey('dimensionName')) {
dimensionName = _json['dimensionName'] as core.String;
}
if (_json.containsKey('expressions')) {
expressions = (_json['expressions'] as core.List)
.map<core.String>((value) => value as core.String)
.toList();
}
if (_json.containsKey('not')) {
not = _json['not'] as core.bool;
}
if (_json.containsKey('operator')) {
operator = _json['operator'] as core.String;
}
}
core.Map<core.String, core.Object> toJson() {
final _json = <core.String, core.Object>{};
if (caseSensitive != null) {
_json['caseSensitive'] = caseSensitive;
}
if (dimensionName != null) {
_json['dimensionName'] = dimensionName;
}
if (expressions != null) {
_json['expressions'] = expressions;
}
if (not != null) {
_json['not'] = not;
}
if (operator != null) {
_json['operator'] = operator;
}
return _json;
}
}
/// A group of dimension filters. Set the operator value to specify how the
/// filters are logically combined.
class DimensionFilterClause {
/// The repeated set of filters. They are logically combined based on the
/// operator specified.
core.List<DimensionFilter> filters;
/// The operator for combining multiple dimension filters. If unspecified, it
/// is treated as an `OR`.
/// Possible string values are:
/// - "OPERATOR_UNSPECIFIED" : Unspecified operator. It is treated as an `OR`.
/// - "OR" : The logical `OR` operator.
/// - "AND" : The logical `AND` operator.
core.String operator;
DimensionFilterClause();
DimensionFilterClause.fromJson(core.Map _json) {
if (_json.containsKey('filters')) {
filters = (_json['filters'] as core.List)
.map<DimensionFilter>((value) => DimensionFilter.fromJson(
value as core.Map<core.String, core.dynamic>))
.toList();
}
if (_json.containsKey('operator')) {
operator = _json['operator'] as core.String;
}
}
core.Map<core.String, core.Object> toJson() {
final _json = <core.String, core.Object>{};
if (filters != null) {
_json['filters'] = filters.map((value) => value.toJson()).toList();
}
if (operator != null) {
_json['operator'] = operator;
}
return _json;
}
}
/// Dynamic segment definition for defining the segment within the request. A
/// segment can select users, sessions or both.
class DynamicSegment {
/// The name of the dynamic segment.
core.String name;
/// Session Segment to select sessions to include in the segment.
SegmentDefinition sessionSegment;
/// User Segment to select users to include in the segment.
SegmentDefinition userSegment;
DynamicSegment();
DynamicSegment.fromJson(core.Map _json) {
if (_json.containsKey('name')) {
name = _json['name'] as core.String;
}
if (_json.containsKey('sessionSegment')) {
sessionSegment = SegmentDefinition.fromJson(
_json['sessionSegment'] as core.Map<core.String, core.dynamic>);
}
if (_json.containsKey('userSegment')) {
userSegment = SegmentDefinition.fromJson(
_json['userSegment'] as core.Map<core.String, core.dynamic>);
}
}
core.Map<core.String, core.Object> toJson() {
final _json = <core.String, core.Object>{};
if (name != null) {
_json['name'] = name;
}
if (sessionSegment != null) {
_json['sessionSegment'] = sessionSegment.toJson();
}
if (userSegment != null) {
_json['userSegment'] = userSegment.toJson();
}
return _json;
}
}
/// E-commerce details associated with the user activity.
class EcommerceData {
/// Action associated with this e-commerce action.
/// Possible string values are:
/// - "UNKNOWN" : Action type is not known.
/// - "CLICK" : Click through of product lists.
/// - "DETAILS_VIEW" : Product detail views.
/// - "ADD_TO_CART" : Add product(s) to cart.
/// - "REMOVE_FROM_CART" : Remove product(s) from cart.
/// - "CHECKOUT" : Check out.
/// - "PAYMENT" : Completed purchase.
/// - "REFUND" : Refund of purchase.
/// - "CHECKOUT_OPTION" : Checkout options.
core.String actionType;
/// The type of this e-commerce activity.
/// Possible string values are:
/// - "ECOMMERCE_TYPE_UNSPECIFIED" : Used when the e-commerce activity type is
/// unspecified.
/// - "CLASSIC" : Used when activity has classic (non-enhanced) e-commerce
/// information.
/// - "ENHANCED" : Used when activity has enhanced e-commerce information.
core.String ecommerceType;
/// Details of the products in this transaction.
core.List<ProductData> products;
/// Transaction details of this e-commerce action.
TransactionData transaction;
EcommerceData();
EcommerceData.fromJson(core.Map _json) {
if (_json.containsKey('actionType')) {
actionType = _json['actionType'] as core.String;
}
if (_json.containsKey('ecommerceType')) {
ecommerceType = _json['ecommerceType'] as core.String;
}
if (_json.containsKey('products')) {
products = (_json['products'] as core.List)
.map<ProductData>((value) => ProductData.fromJson(
value as core.Map<core.String, core.dynamic>))
.toList();
}
if (_json.containsKey('transaction')) {
transaction = TransactionData.fromJson(
_json['transaction'] as core.Map<core.String, core.dynamic>);
}
}
core.Map<core.String, core.Object> toJson() {
final _json = <core.String, core.Object>{};
if (actionType != null) {
_json['actionType'] = actionType;
}
if (ecommerceType != null) {
_json['ecommerceType'] = ecommerceType;
}
if (products != null) {
_json['products'] = products.map((value) => value.toJson()).toList();
}
if (transaction != null) {
_json['transaction'] = transaction.toJson();
}
return _json;
}
}
/// Represents all the details pertaining to an event.
class EventData {
/// Type of interaction with the object. Eg: 'play'.
core.String eventAction;
/// The object on the page that was interacted with. Eg: 'Video'.
core.String eventCategory;
/// Number of such events in this activity.
core.String eventCount;
/// Label attached with the event.
core.String eventLabel;
/// Numeric value associated with the event.
core.String eventValue;
EventData();
EventData.fromJson(core.Map _json) {
if (_json.containsKey('eventAction')) {
eventAction = _json['eventAction'] as core.String;
}
if (_json.containsKey('eventCategory')) {
eventCategory = _json['eventCategory'] as core.String;
}
if (_json.containsKey('eventCount')) {
eventCount = _json['eventCount'] as core.String;
}
if (_json.containsKey('eventLabel')) {
eventLabel = _json['eventLabel'] as core.String;
}
if (_json.containsKey('eventValue')) {
eventValue = _json['eventValue'] as core.String;
}
}
core.Map<core.String, core.Object> toJson() {
final _json = <core.String, core.Object>{};
if (eventAction != null) {
_json['eventAction'] = eventAction;
}
if (eventCategory != null) {
_json['eventCategory'] = eventCategory;
}
if (eventCount != null) {
_json['eventCount'] = eventCount;
}
if (eventLabel != null) {
_json['eventLabel'] = eventLabel;
}
if (eventValue != null) {
_json['eventValue'] = eventValue;
}
return _json;
}
}
/// The batch request containing multiple report request.
class GetReportsRequest {
/// Requests, each request will have a separate response. There can be a
/// maximum of 5 requests. All requests should have the same `dateRanges`,
/// `viewId`, `segments`, `samplingLevel`, and `cohortGroup`.
core.List<ReportRequest> reportRequests;
/// Enables [resource based
/// quotas](/analytics/devguides/reporting/core/v4/limits-quotas#analytics_reporting_api_v4),
/// (defaults to `False`). If this field is set to `True` the per view
/// (profile) quotas are governed by the computational cost of the request.
/// Note that using cost based quotas will higher enable sampling rates. (10
/// Million for `SMALL`, 100M for `LARGE`. See the [limits and quotas
/// documentation](/analytics/devguides/reporting/core/v4/limits-quotas#analytics_reporting_api_v4)
/// for details.
core.bool useResourceQuotas;
GetReportsRequest();
GetReportsRequest.fromJson(core.Map _json) {
if (_json.containsKey('reportRequests')) {
reportRequests = (_json['reportRequests'] as core.List)
.map<ReportRequest>((value) => ReportRequest.fromJson(
value as core.Map<core.String, core.dynamic>))
.toList();
}
if (_json.containsKey('useResourceQuotas')) {
useResourceQuotas = _json['useResourceQuotas'] as core.bool;
}
}
core.Map<core.String, core.Object> toJson() {
final _json = <core.String, core.Object>{};
if (reportRequests != null) {
_json['reportRequests'] =
reportRequests.map((value) => value.toJson()).toList();
}
if (useResourceQuotas != null) {
_json['useResourceQuotas'] = useResourceQuotas;
}
return _json;
}
}
/// The main response class which holds the reports from the Reporting API
/// `batchGet` call.
class GetReportsResponse {
/// The amount of resource quota tokens deducted to execute the query.
/// Includes all responses.
core.int queryCost;
/// Responses corresponding to each of the request.
core.List<Report> reports;
/// The amount of resource quota remaining for the property.
ResourceQuotasRemaining resourceQuotasRemaining;
GetReportsResponse();
GetReportsResponse.fromJson(core.Map _json) {
if (_json.containsKey('queryCost')) {
queryCost = _json['queryCost'] as core.int;
}
if (_json.containsKey('reports')) {
reports = (_json['reports'] as core.List)
.map<Report>((value) =>
Report.fromJson(value as core.Map<core.String, core.dynamic>))
.toList();
}
if (_json.containsKey('resourceQuotasRemaining')) {
resourceQuotasRemaining = ResourceQuotasRemaining.fromJson(
_json['resourceQuotasRemaining']
as core.Map<core.String, core.dynamic>);
}
}
core.Map<core.String, core.Object> toJson() {
final _json = <core.String, core.Object>{};
if (queryCost != null) {
_json['queryCost'] = queryCost;
}
if (reports != null) {
_json['reports'] = reports.map((value) => value.toJson()).toList();
}
if (resourceQuotasRemaining != null) {
_json['resourceQuotasRemaining'] = resourceQuotasRemaining.toJson();
}
return _json;
}
}
/// Represents all the details pertaining to a goal.
class GoalData {
/// URL of the page where this goal was completed.
core.String goalCompletionLocation;
/// Total number of goal completions in this activity.
core.String goalCompletions;
/// This identifies the goal as configured for the profile.
core.int goalIndex;
/// Name of the goal.
core.String goalName;
/// URL of the page one step prior to the goal completion.
core.String goalPreviousStep1;
/// URL of the page two steps prior to the goal completion.
core.String goalPreviousStep2;
/// URL of the page three steps prior to the goal completion.
core.String goalPreviousStep3;
/// Value in this goal.
core.double goalValue;
GoalData();
GoalData.fromJson(core.Map _json) {
if (_json.containsKey('goalCompletionLocation')) {
goalCompletionLocation = _json['goalCompletionLocation'] as core.String;
}
if (_json.containsKey('goalCompletions')) {
goalCompletions = _json['goalCompletions'] as core.String;
}
if (_json.containsKey('goalIndex')) {
goalIndex = _json['goalIndex'] as core.int;
}
if (_json.containsKey('goalName')) {
goalName = _json['goalName'] as core.String;
}
if (_json.containsKey('goalPreviousStep1')) {
goalPreviousStep1 = _json['goalPreviousStep1'] as core.String;
}
if (_json.containsKey('goalPreviousStep2')) {
goalPreviousStep2 = _json['goalPreviousStep2'] as core.String;
}
if (_json.containsKey('goalPreviousStep3')) {
goalPreviousStep3 = _json['goalPreviousStep3'] as core.String;
}
if (_json.containsKey('goalValue')) {
goalValue = (_json['goalValue'] as core.num).toDouble();
}
}
core.Map<core.String, core.Object> toJson() {
final _json = <core.String, core.Object>{};
if (goalCompletionLocation != null) {
_json['goalCompletionLocation'] = goalCompletionLocation;
}
if (goalCompletions != null) {
_json['goalCompletions'] = goalCompletions;
}
if (goalIndex != null) {
_json['goalIndex'] = goalIndex;
}
if (goalName != null) {
_json['goalName'] = goalName;
}
if (goalPreviousStep1 != null) {
_json['goalPreviousStep1'] = goalPreviousStep1;
}
if (goalPreviousStep2 != null) {
_json['goalPreviousStep2'] = goalPreviousStep2;
}
if (goalPreviousStep3 != null) {
_json['goalPreviousStep3'] = goalPreviousStep3;
}
if (goalValue != null) {
_json['goalValue'] = goalValue;
}
return _json;
}
}
/// Represents a set of goals that were reached in an activity.
class GoalSetData {
/// All the goals that were reached in the current activity.
core.List<GoalData> goals;
GoalSetData();
GoalSetData.fromJson(core.Map _json) {
if (_json.containsKey('goals')) {
goals = (_json['goals'] as core.List)
.map<GoalData>((value) =>
GoalData.fromJson(value as core.Map<core.String, core.dynamic>))
.toList();
}
}
core.Map<core.String, core.Object> toJson() {
final _json = <core.String, core.Object>{};
if (goals != null) {
_json['goals'] = goals.map((value) => value.toJson()).toList();
}
return _json;
}
}
/// [Metrics](https://support.google.com/analytics/answer/1033861) are the
/// quantitative measurements. For example, the metric `ga:users` indicates the
/// total number of users for the requested time period.
class Metric {
/// An alias for the metric expression is an alternate name for the
/// expression. The alias can be used for filtering and sorting. This field is
/// optional and is useful if the expression is not a single metric but a
/// complex expression which cannot be used in filtering and sorting. The
/// alias is also used in the response column header.
core.String alias;
/// A metric expression in the request. An expression is constructed from one
/// or more metrics and numbers. Accepted operators include: Plus (+), Minus
/// (-), Negation (Unary -), Divided by (/), Multiplied by (*), Parenthesis,
/// Positive cardinal numbers (0-9), can include decimals and is limited to
/// 1024 characters. Example `ga:totalRefunds/ga:users`, in most cases the
/// metric expression is just a single metric name like `ga:users`. Adding
/// mixed `MetricType` (E.g., `CURRENCY` + `PERCENTAGE`) metrics will result
/// in unexpected results.
core.String expression;
/// Specifies how the metric expression should be formatted, for example
/// `INTEGER`.
/// Possible string values are:
/// - "METRIC_TYPE_UNSPECIFIED" : Metric type is unspecified.
/// - "INTEGER" : Integer metric.
/// - "FLOAT" : Float metric.
/// - "CURRENCY" : Currency metric.
/// - "PERCENT" : Percentage metric.
/// - "TIME" : Time metric in `HH:MM:SS` format.
core.String formattingType;
Metric();
Metric.fromJson(core.Map _json) {
if (_json.containsKey('alias')) {
alias = _json['alias'] as core.String;
}
if (_json.containsKey('expression')) {
expression = _json['expression'] as core.String;
}
if (_json.containsKey('formattingType')) {
formattingType = _json['formattingType'] as core.String;
}
}
core.Map<core.String, core.Object> toJson() {
final _json = <core.String, core.Object>{};
if (alias != null) {
_json['alias'] = alias;
}
if (expression != null) {
_json['expression'] = expression;
}
if (formattingType != null) {
_json['formattingType'] = formattingType;
}
return _json;
}
}
/// MetricFilter specifies the filter on a metric.
class MetricFilter {
/// The value to compare against.
core.String comparisonValue;
/// The metric that will be filtered on. A metricFilter must contain a metric
/// name. A metric name can be an alias earlier defined as a metric or it can
/// also be a metric expression.
core.String metricName;
/// Logical `NOT` operator. If this boolean is set to true, then the matching
/// metric values will be excluded in the report. The default is false.
core.bool not;
/// Is the metric `EQUAL`, `LESS_THAN` or `GREATER_THAN` the comparisonValue,
/// the default is `EQUAL`. If the operator is `IS_MISSING`, checks if the
/// metric is missing and would ignore the comparisonValue.
/// Possible string values are:
/// - "OPERATOR_UNSPECIFIED" : If the operator is not specified, it is treated
/// as `EQUAL`.
/// - "EQUAL" : Should the value of the metric be exactly equal to the
/// comparison value.
/// - "LESS_THAN" : Should the value of the metric be less than to the
/// comparison value.
/// - "GREATER_THAN" : Should the value of the metric be greater than to the
/// comparison value.
/// - "IS_MISSING" : Validates if the metric is missing. Doesn't take
/// comparisonValue into account.
core.String operator;
MetricFilter();
MetricFilter.fromJson(core.Map _json) {
if (_json.containsKey('comparisonValue')) {
comparisonValue = _json['comparisonValue'] as core.String;
}
if (_json.containsKey('metricName')) {
metricName = _json['metricName'] as core.String;
}
if (_json.containsKey('not')) {
not = _json['not'] as core.bool;
}
if (_json.containsKey('operator')) {
operator = _json['operator'] as core.String;
}
}
core.Map<core.String, core.Object> toJson() {
final _json = <core.String, core.Object>{};
if (comparisonValue != null) {
_json['comparisonValue'] = comparisonValue;
}
if (metricName != null) {
_json['metricName'] = metricName;
}
if (not != null) {
_json['not'] = not;
}
if (operator != null) {
_json['operator'] = operator;
}
return _json;
}
}
/// Represents a group of metric filters. Set the operator value to specify how
/// the filters are logically combined.
class MetricFilterClause {
/// The repeated set of filters. They are logically combined based on the
/// operator specified.
core.List<MetricFilter> filters;
/// The operator for combining multiple metric filters. If unspecified, it is
/// treated as an `OR`.
/// Possible string values are:
/// - "OPERATOR_UNSPECIFIED" : Unspecified operator. It is treated as an `OR`.
/// - "OR" : The logical `OR` operator.
/// - "AND" : The logical `AND` operator.
core.String operator;
MetricFilterClause();
MetricFilterClause.fromJson(core.Map _json) {
if (_json.containsKey('filters')) {
filters = (_json['filters'] as core.List)
.map<MetricFilter>((value) => MetricFilter.fromJson(
value as core.Map<core.String, core.dynamic>))
.toList();
}
if (_json.containsKey('operator')) {
operator = _json['operator'] as core.String;
}
}
core.Map<core.String, core.Object> toJson() {
final _json = <core.String, core.Object>{};
if (filters != null) {
_json['filters'] = filters.map((value) => value.toJson()).toList();
}
if (operator != null) {
_json['operator'] = operator;
}
return _json;
}
}
/// The headers for the metrics.
class MetricHeader {
/// Headers for the metrics in the response.
core.List<MetricHeaderEntry> metricHeaderEntries;
/// Headers for the pivots in the response.
core.List<PivotHeader> pivotHeaders;
MetricHeader();
MetricHeader.fromJson(core.Map _json) {
if (_json.containsKey('metricHeaderEntries')) {
metricHeaderEntries = (_json['metricHeaderEntries'] as core.List)
.map<MetricHeaderEntry>((value) => MetricHeaderEntry.fromJson(
value as core.Map<core.String, core.dynamic>))
.toList();
}
if (_json.containsKey('pivotHeaders')) {
pivotHeaders = (_json['pivotHeaders'] as core.List)
.map<PivotHeader>((value) => PivotHeader.fromJson(
value as core.Map<core.String, core.dynamic>))
.toList();
}
}
core.Map<core.String, core.Object> toJson() {
final _json = <core.String, core.Object>{};
if (metricHeaderEntries != null) {
_json['metricHeaderEntries'] =
metricHeaderEntries.map((value) => value.toJson()).toList();
}
if (pivotHeaders != null) {
_json['pivotHeaders'] =
pivotHeaders.map((value) => value.toJson()).toList();
}
return _json;
}
}
/// Header for the metrics.
class MetricHeaderEntry {
/// The name of the header.
core.String name;
/// The type of the metric, for example `INTEGER`.
/// Possible string values are:
/// - "METRIC_TYPE_UNSPECIFIED" : Metric type is unspecified.
/// - "INTEGER" : Integer metric.
/// - "FLOAT" : Float metric.
/// - "CURRENCY" : Currency metric.
/// - "PERCENT" : Percentage metric.
/// - "TIME" : Time metric in `HH:MM:SS` format.
core.String type;
MetricHeaderEntry();
MetricHeaderEntry.fromJson(core.Map _json) {
if (_json.containsKey('name')) {
name = _json['name'] as core.String;
}
if (_json.containsKey('type')) {
type = _json['type'] as core.String;
}
}
core.Map<core.String, core.Object> toJson() {
final _json = <core.String, core.Object>{};
if (name != null) {
_json['name'] = name;
}
if (type != null) {
_json['type'] = type;
}
return _json;
}
}
/// A list of segment filters in the `OR` group are combined with the logical OR
/// operator.
class OrFiltersForSegment {
/// List of segment filters to be combined with a `OR` operator.
core.List<SegmentFilterClause> segmentFilterClauses;
OrFiltersForSegment();
OrFiltersForSegment.fromJson(core.Map _json) {
if (_json.containsKey('segmentFilterClauses')) {
segmentFilterClauses = (_json['segmentFilterClauses'] as core.List)
.map<SegmentFilterClause>((value) => SegmentFilterClause.fromJson(
value as core.Map<core.String, core.dynamic>))
.toList();
}
}
core.Map<core.String, core.Object> toJson() {
final _json = <core.String, core.Object>{};
if (segmentFilterClauses != null) {
_json['segmentFilterClauses'] =
segmentFilterClauses.map((value) => value.toJson()).toList();
}
return _json;
}
}
/// Specifies the sorting options.
class OrderBy {
/// The field which to sort by. The default sort order is ascending. Example:
/// `ga:browser`. Note, that you can only specify one field for sort here. For
/// example, `ga:browser, ga:city` is not valid.
core.String fieldName;
/// The order type. The default orderType is `VALUE`.
/// Possible string values are:
/// - "ORDER_TYPE_UNSPECIFIED" : Unspecified order type will be treated as
/// sort based on value.
/// - "VALUE" : The sort order is based on the value of the chosen column;
/// looks only at the first date range.
/// - "DELTA" : The sort order is based on the difference of the values of the
/// chosen column between the first two date ranges. Usable only if there are
/// exactly two date ranges.
/// - "SMART" : The sort order is based on weighted value of the chosen
/// column. If column has n/d format, then weighted value of this ratio will
/// be `(n + totals.n)/(d + totals.d)` Usable only for metrics that represent
/// ratios.
/// - "HISTOGRAM_BUCKET" : Histogram order type is applicable only to
/// dimension columns with non-empty histogram-buckets.
/// - "DIMENSION_AS_INTEGER" : If the dimensions are fixed length numbers,
/// ordinary sort would just work fine. `DIMENSION_AS_INTEGER` can be used if
/// the dimensions are variable length numbers.
core.String orderType;
/// The sorting order for the field.
/// Possible string values are:
/// - "SORT_ORDER_UNSPECIFIED" : If the sort order is unspecified, the default
/// is ascending.
/// - "ASCENDING" : Ascending sort. The field will be sorted in an ascending
/// manner.
/// - "DESCENDING" : Descending sort. The field will be sorted in a descending
/// manner.
core.String sortOrder;
OrderBy();
OrderBy.fromJson(core.Map _json) {
if (_json.containsKey('fieldName')) {
fieldName = _json['fieldName'] as core.String;
}
if (_json.containsKey('orderType')) {
orderType = _json['orderType'] as core.String;
}
if (_json.containsKey('sortOrder')) {
sortOrder = _json['sortOrder'] as core.String;
}
}
core.Map<core.String, core.Object> toJson() {
final _json = <core.String, core.Object>{};
if (fieldName != null) {
_json['fieldName'] = fieldName;
}
if (orderType != null) {
_json['orderType'] = orderType;
}
if (sortOrder != null) {
_json['sortOrder'] = sortOrder;
}
return _json;
}
}
/// Represents details collected when the visitor views a page.
class PageviewData {
/// The URL of the page that the visitor viewed.
core.String pagePath;
/// The title of the page that the visitor viewed.
core.String pageTitle;
PageviewData();
PageviewData.fromJson(core.Map _json) {
if (_json.containsKey('pagePath')) {
pagePath = _json['pagePath'] as core.String;
}
if (_json.containsKey('pageTitle')) {
pageTitle = _json['pageTitle'] as core.String;
}
}
core.Map<core.String, core.Object> toJson() {
final _json = <core.String, core.Object>{};
if (pagePath != null) {
_json['pagePath'] = pagePath;
}
if (pageTitle != null) {
_json['pageTitle'] = pageTitle;
}
return _json;
}
}
/// The Pivot describes the pivot section in the request. The Pivot helps
/// rearrange the information in the table for certain reports by pivoting your
/// data on a second dimension.
class Pivot {
/// DimensionFilterClauses are logically combined with an `AND` operator: only
/// data that is included by all these DimensionFilterClauses contributes to
/// the values in this pivot region. Dimension filters can be used to restrict
/// the columns shown in the pivot region. For example if you have
/// `ga:browser` as the requested dimension in the pivot region, and you
/// specify key filters to restrict `ga:browser` to only "IE" or "Firefox",
/// then only those two browsers would show up as columns.
core.List<DimensionFilterClause> dimensionFilterClauses;
/// A list of dimensions to show as pivot columns. A Pivot can have a maximum
/// of 4 dimensions. Pivot dimensions are part of the restriction on the total
/// number of dimensions allowed in the request.
core.List<Dimension> dimensions;
/// Specifies the maximum number of groups to return. The default value is 10,
/// also the maximum value is 1,000.
core.int maxGroupCount;
/// The pivot metrics. Pivot metrics are part of the restriction on total
/// number of metrics allowed in the request.
core.List<Metric> metrics;
/// If k metrics were requested, then the response will contain some
/// data-dependent multiple of k columns in the report. E.g., if you pivoted
/// on the dimension `ga:browser` then you'd get k columns for "Firefox", k
/// columns for "IE", k columns for "Chrome", etc. The ordering of the groups
/// of columns is determined by descending order of "total" for the first of
/// the k values. Ties are broken by lexicographic ordering of the first pivot
/// dimension, then lexicographic ordering of the second pivot dimension, and
/// so on. E.g., if the totals for the first value for Firefox, IE, and Chrome
/// were 8, 2, 8, respectively, the order of columns would be Chrome, Firefox,
/// IE. The following let you choose which of the groups of k columns are
/// included in the response.
core.int startGroup;
Pivot();
Pivot.fromJson(core.Map _json) {
if (_json.containsKey('dimensionFilterClauses')) {
dimensionFilterClauses = (_json['dimensionFilterClauses'] as core.List)
.map<DimensionFilterClause>((value) => DimensionFilterClause.fromJson(
value as core.Map<core.String, core.dynamic>))
.toList();
}
if (_json.containsKey('dimensions')) {
dimensions = (_json['dimensions'] as core.List)
.map<Dimension>((value) =>
Dimension.fromJson(value as core.Map<core.String, core.dynamic>))
.toList();
}
if (_json.containsKey('maxGroupCount')) {
maxGroupCount = _json['maxGroupCount'] as core.int;
}
if (_json.containsKey('metrics')) {
metrics = (_json['metrics'] as core.List)
.map<Metric>((value) =>
Metric.fromJson(value as core.Map<core.String, core.dynamic>))
.toList();
}
if (_json.containsKey('startGroup')) {
startGroup = _json['startGroup'] as core.int;
}
}
core.Map<core.String, core.Object> toJson() {
final _json = <core.String, core.Object>{};
if (dimensionFilterClauses != null) {
_json['dimensionFilterClauses'] =
dimensionFilterClauses.map((value) => value.toJson()).toList();
}
if (dimensions != null) {
_json['dimensions'] = dimensions.map((value) => value.toJson()).toList();
}
if (maxGroupCount != null) {
_json['maxGroupCount'] = maxGroupCount;
}
if (metrics != null) {
_json['metrics'] = metrics.map((value) => value.toJson()).toList();
}
if (startGroup != null) {
_json['startGroup'] = startGroup;
}
return _json;
}
}
/// The headers for each of the pivot sections defined in the request.
class PivotHeader {
/// A single pivot section header.
core.List<PivotHeaderEntry> pivotHeaderEntries;
/// The total number of groups for this pivot.
core.int totalPivotGroupsCount;
PivotHeader();
PivotHeader.fromJson(core.Map _json) {
if (_json.containsKey('pivotHeaderEntries')) {
pivotHeaderEntries = (_json['pivotHeaderEntries'] as core.List)
.map<PivotHeaderEntry>((value) => PivotHeaderEntry.fromJson(
value as core.Map<core.String, core.dynamic>))
.toList();
}
if (_json.containsKey('totalPivotGroupsCount')) {
totalPivotGroupsCount = _json['totalPivotGroupsCount'] as core.int;
}
}
core.Map<core.String, core.Object> toJson() {
final _json = <core.String, core.Object>{};
if (pivotHeaderEntries != null) {
_json['pivotHeaderEntries'] =
pivotHeaderEntries.map((value) => value.toJson()).toList();
}
if (totalPivotGroupsCount != null) {
_json['totalPivotGroupsCount'] = totalPivotGroupsCount;
}
return _json;
}
}
/// The headers for the each of the metric column corresponding to the metrics
/// requested in the pivots section of the response.
class PivotHeaderEntry {
/// The name of the dimensions in the pivot response.
core.List<core.String> dimensionNames;
/// The values for the dimensions in the pivot.
core.List<core.String> dimensionValues;
/// The metric header for the metric in the pivot.
MetricHeaderEntry metric;
PivotHeaderEntry();
PivotHeaderEntry.fromJson(core.Map _json) {
if (_json.containsKey('dimensionNames')) {
dimensionNames = (_json['dimensionNames'] as core.List)
.map<core.String>((value) => value as core.String)
.toList();
}
if (_json.containsKey('dimensionValues')) {
dimensionValues = (_json['dimensionValues'] as core.List)
.map<core.String>((value) => value as core.String)
.toList();
}
if (_json.containsKey('metric')) {
metric = MetricHeaderEntry.fromJson(
_json['metric'] as core.Map<core.String, core.dynamic>);
}
}
core.Map<core.String, core.Object> toJson() {
final _json = <core.String, core.Object>{};
if (dimensionNames != null) {
_json['dimensionNames'] = dimensionNames;
}
if (dimensionValues != null) {
_json['dimensionValues'] = dimensionValues;
}
if (metric != null) {
_json['metric'] = metric.toJson();
}
return _json;
}
}
/// The metric values in the pivot region.
class PivotValueRegion {
/// The values of the metrics in each of the pivot regions.
core.List<core.String> values;
PivotValueRegion();
PivotValueRegion.fromJson(core.Map _json) {
if (_json.containsKey('values')) {
values = (_json['values'] as core.List)
.map<core.String>((value) => value as core.String)
.toList();
}
}
core.Map<core.String, core.Object> toJson() {
final _json = <core.String, core.Object>{};
if (values != null) {
_json['values'] = values;
}
return _json;
}
}
/// Details of the products in an e-commerce transaction.
class ProductData {
/// The total revenue from purchased product items.
core.double itemRevenue;
/// The product name, supplied by the e-commerce tracking application, for the
/// purchased items.
core.String productName;
/// Total number of this product units in the transaction.
core.String productQuantity;
/// Unique code that represents the product.
core.String productSku;
ProductData();
ProductData.fromJson(core.Map _json) {
if (_json.containsKey('itemRevenue')) {
itemRevenue = (_json['itemRevenue'] as core.num).toDouble();
}
if (_json.containsKey('productName')) {
productName = _json['productName'] as core.String;
}
if (_json.containsKey('productQuantity')) {
productQuantity = _json['productQuantity'] as core.String;
}
if (_json.containsKey('productSku')) {
productSku = _json['productSku'] as core.String;
}
}
core.Map<core.String, core.Object> toJson() {
final _json = <core.String, core.Object>{};
if (itemRevenue != null) {
_json['itemRevenue'] = itemRevenue;
}
if (productName != null) {
_json['productName'] = productName;
}
if (productQuantity != null) {
_json['productQuantity'] = productQuantity;
}
if (productSku != null) {
_json['productSku'] = productSku;
}
return _json;
}
}
/// The data response corresponding to the request.
class Report {
/// The column headers.
ColumnHeader columnHeader;
/// Response data.
ReportData data;
/// Page token to retrieve the next page of results in the list.
core.String nextPageToken;
Report();
Report.fromJson(core.Map _json) {
if (_json.containsKey('columnHeader')) {
columnHeader = ColumnHeader.fromJson(
_json['columnHeader'] as core.Map<core.String, core.dynamic>);
}
if (_json.containsKey('data')) {
data = ReportData.fromJson(
_json['data'] as core.Map<core.String, core.dynamic>);
}
if (_json.containsKey('nextPageToken')) {
nextPageToken = _json['nextPageToken'] as core.String;
}
}
core.Map<core.String, core.Object> toJson() {
final _json = <core.String, core.Object>{};
if (columnHeader != null) {
_json['columnHeader'] = columnHeader.toJson();
}
if (data != null) {
_json['data'] = data.toJson();
}
if (nextPageToken != null) {
_json['nextPageToken'] = nextPageToken;
}
return _json;
}
}
/// The data part of the report.
class ReportData {
/// The last time the data in the report was refreshed. All the hits received
/// before this timestamp are included in the calculation of the report.
core.String dataLastRefreshed;
/// Indicates if response to this request is golden or not. Data is golden
/// when the exact same request will not produce any new results if asked at a
/// later point in time.
core.bool isDataGolden;
/// Minimum and maximum values seen over all matching rows. These are both
/// empty when `hideValueRanges` in the request is false, or when rowCount is
/// zero.
core.List<DateRangeValues> maximums;
/// Minimum and maximum values seen over all matching rows. These are both
/// empty when `hideValueRanges` in the request is false, or when rowCount is
/// zero.
core.List<DateRangeValues> minimums;
/// Total number of matching rows for this query.
core.int rowCount;
/// There's one ReportRow for every unique combination of dimensions.
core.List<ReportRow> rows;
/// If the results are
/// [sampled](https://support.google.com/analytics/answer/2637192), this
/// returns the total number of samples read, one entry per date range. If the
/// results are not sampled this field will not be defined. See [developer
/// guide](/analytics/devguides/reporting/core/v4/basics#sampling) for
/// details.
core.List<core.String> samplesReadCounts;
/// If the results are
/// [sampled](https://support.google.com/analytics/answer/2637192), this
/// returns the total number of samples present, one entry per date range. If
/// the results are not sampled this field will not be defined. See [developer
/// guide](/analytics/devguides/reporting/core/v4/basics#sampling) for
/// details.
core.List<core.String> samplingSpaceSizes;
/// For each requested date range, for the set of all rows that match the
/// query, every requested value format gets a total. The total for a value
/// format is computed by first totaling the metrics mentioned in the value
/// format and then evaluating the value format as a scalar expression. E.g.,
/// The "totals" for `3 / (ga:sessions + 2)` we compute `3 / ((sum of all
/// relevant ga:sessions) + 2)`. Totals are computed before pagination.
core.List<DateRangeValues> totals;
ReportData();
ReportData.fromJson(core.Map _json) {
if (_json.containsKey('dataLastRefreshed')) {
dataLastRefreshed = _json['dataLastRefreshed'] as core.String;
}
if (_json.containsKey('isDataGolden')) {
isDataGolden = _json['isDataGolden'] as core.bool;
}
if (_json.containsKey('maximums')) {
maximums = (_json['maximums'] as core.List)
.map<DateRangeValues>((value) => DateRangeValues.fromJson(
value as core.Map<core.String, core.dynamic>))
.toList();
}
if (_json.containsKey('minimums')) {
minimums = (_json['minimums'] as core.List)
.map<DateRangeValues>((value) => DateRangeValues.fromJson(
value as core.Map<core.String, core.dynamic>))
.toList();
}
if (_json.containsKey('rowCount')) {
rowCount = _json['rowCount'] as core.int;
}
if (_json.containsKey('rows')) {
rows = (_json['rows'] as core.List)
.map<ReportRow>((value) =>
ReportRow.fromJson(value as core.Map<core.String, core.dynamic>))
.toList();
}
if (_json.containsKey('samplesReadCounts')) {
samplesReadCounts = (_json['samplesReadCounts'] as core.List)
.map<core.String>((value) => value as core.String)
.toList();
}
if (_json.containsKey('samplingSpaceSizes')) {
samplingSpaceSizes = (_json['samplingSpaceSizes'] as core.List)
.map<core.String>((value) => value as core.String)
.toList();
}
if (_json.containsKey('totals')) {
totals = (_json['totals'] as core.List)
.map<DateRangeValues>((value) => DateRangeValues.fromJson(
value as core.Map<core.String, core.dynamic>))
.toList();
}
}
core.Map<core.String, core.Object> toJson() {
final _json = <core.String, core.Object>{};
if (dataLastRefreshed != null) {
_json['dataLastRefreshed'] = dataLastRefreshed;
}
if (isDataGolden != null) {
_json['isDataGolden'] = isDataGolden;
}
if (maximums != null) {
_json['maximums'] = maximums.map((value) => value.toJson()).toList();
}
if (minimums != null) {
_json['minimums'] = minimums.map((value) => value.toJson()).toList();
}
if (rowCount != null) {
_json['rowCount'] = rowCount;
}
if (rows != null) {
_json['rows'] = rows.map((value) => value.toJson()).toList();
}
if (samplesReadCounts != null) {
_json['samplesReadCounts'] = samplesReadCounts;
}
if (samplingSpaceSizes != null) {
_json['samplingSpaceSizes'] = samplingSpaceSizes;
}
if (totals != null) {
_json['totals'] = totals.map((value) => value.toJson()).toList();
}
return _json;
}
}
/// The main request class which specifies the Reporting API request.
class ReportRequest {
/// Cohort group associated with this request. If there is a cohort group in
/// the request the `ga:cohort` dimension must be present. Every
/// [ReportRequest](#ReportRequest) within a `batchGet` method must contain
/// the same `cohortGroup` definition.
CohortGroup cohortGroup;
/// Date ranges in the request. The request can have a maximum of 2 date
/// ranges. The response will contain a set of metric values for each
/// combination of the dimensions for each date range in the request. So, if
/// there are two date ranges, there will be two set of metric values, one for
/// the original date range and one for the second date range. The
/// `reportRequest.dateRanges` field should not be specified for cohorts or
/// Lifetime value requests. If a date range is not provided, the default date
/// range is (startDate: current date - 7 days, endDate: current date - 1
/// day). Every [ReportRequest](#ReportRequest) within a `batchGet` method
/// must contain the same `dateRanges` definition.
core.List<DateRange> dateRanges;
/// The dimension filter clauses for filtering Dimension Values. They are
/// logically combined with the `AND` operator. Note that filtering occurs
/// before any dimensions are aggregated, so that the returned metrics
/// represent the total for only the relevant dimensions.
core.List<DimensionFilterClause> dimensionFilterClauses;
/// The dimensions requested. Requests can have a total of 9 dimensions.
core.List<Dimension> dimensions;
/// Dimension or metric filters that restrict the data returned for your
/// request. To use the `filtersExpression`, supply a dimension or metric on
/// which to filter, followed by the filter expression. For example, the
/// following expression selects `ga:browser` dimension which starts with
/// Firefox; `ga:browser=~^Firefox`. For more information on dimensions and
/// metric filters, see [Filters
/// reference](https://developers.google.com/analytics/devguides/reporting/core/v3/reference#filters).
core.String filtersExpression;
/// If set to true, hides the total of all metrics for all the matching rows,
/// for every date range. The default false and will return the totals.
core.bool hideTotals;
/// If set to true, hides the minimum and maximum across all matching rows.
/// The default is false and the value ranges are returned.
core.bool hideValueRanges;
/// If set to false, the response does not include rows if all the retrieved
/// metrics are equal to zero. The default is false which will exclude these
/// rows.
core.bool includeEmptyRows;
/// The metric filter clauses. They are logically combined with the `AND`
/// operator. Metric filters look at only the first date range and not the
/// comparing date range. Note that filtering on metrics occurs after the
/// metrics are aggregated.
core.List<MetricFilterClause> metricFilterClauses;
/// The metrics requested. Requests must specify at least one metric. Requests
/// can have a total of 10 metrics.
core.List<Metric> metrics;
/// Sort order on output rows. To compare two rows, the elements of the
/// following are applied in order until a difference is found. All date
/// ranges in the output get the same row order.
core.List<OrderBy> orderBys;
/// Page size is for paging and specifies the maximum number of returned rows.
/// Page size should be >= 0. A query returns the default of 1,000 rows. The
/// Analytics Core Reporting API returns a maximum of 100,000 rows per
/// request, no matter how many you ask for. It can also return fewer rows
/// than requested, if there aren't as many dimension segments as you expect.
/// For instance, there are fewer than 300 possible values for `ga:country`,
/// so when segmenting only by country, you can't get more than 300 rows, even
/// if you set `pageSize` to a higher value.
core.int pageSize;
/// A continuation token to get the next page of the results. Adding this to
/// the request will return the rows after the pageToken. The pageToken should
/// be the value returned in the nextPageToken parameter in the response to
/// the GetReports request.
core.String pageToken;
/// The pivot definitions. Requests can have a maximum of 2 pivots.
core.List<Pivot> pivots;
/// The desired report
/// [sample](https://support.google.com/analytics/answer/2637192) size. If the
/// the `samplingLevel` field is unspecified the `DEFAULT` sampling level is
/// used. Every [ReportRequest](#ReportRequest) within a `batchGet` method
/// must contain the same `samplingLevel` definition. See [developer
/// guide](/analytics/devguides/reporting/core/v4/basics#sampling) for
/// details.
/// Possible string values are:
/// - "SAMPLING_UNSPECIFIED" : If the `samplingLevel` field is unspecified the
/// `DEFAULT` sampling level is used.
/// - "DEFAULT" : Returns response with a sample size that balances speed and
/// accuracy.
/// - "SMALL" : It returns a fast response with a smaller sampling size.
/// - "LARGE" : Returns a more accurate response using a large sampling size.
/// But this may result in response being slower.
core.String samplingLevel;
/// Segment the data returned for the request. A segment definition helps look
/// at a subset of the segment request. A request can contain up to four
/// segments. Every [ReportRequest](#ReportRequest) within a `batchGet` method
/// must contain the same `segments` definition. Requests with segments must
/// have the `ga:segment` dimension.
core.List<Segment> segments;
/// The Analytics [view
/// ID](https://support.google.com/analytics/answer/1009618) from which to
/// retrieve data. Every [ReportRequest](#ReportRequest) within a `batchGet`
/// method must contain the same `viewId`.
core.String viewId;
ReportRequest();
ReportRequest.fromJson(core.Map _json) {
if (_json.containsKey('cohortGroup')) {
cohortGroup = CohortGroup.fromJson(
_json['cohortGroup'] as core.Map<core.String, core.dynamic>);
}
if (_json.containsKey('dateRanges')) {
dateRanges = (_json['dateRanges'] as core.List)
.map<DateRange>((value) =>
DateRange.fromJson(value as core.Map<core.String, core.dynamic>))
.toList();
}
if (_json.containsKey('dimensionFilterClauses')) {
dimensionFilterClauses = (_json['dimensionFilterClauses'] as core.List)
.map<DimensionFilterClause>((value) => DimensionFilterClause.fromJson(
value as core.Map<core.String, core.dynamic>))
.toList();
}
if (_json.containsKey('dimensions')) {
dimensions = (_json['dimensions'] as core.List)
.map<Dimension>((value) =>
Dimension.fromJson(value as core.Map<core.String, core.dynamic>))
.toList();
}
if (_json.containsKey('filtersExpression')) {
filtersExpression = _json['filtersExpression'] as core.String;
}
if (_json.containsKey('hideTotals')) {
hideTotals = _json['hideTotals'] as core.bool;
}
if (_json.containsKey('hideValueRanges')) {
hideValueRanges = _json['hideValueRanges'] as core.bool;
}
if (_json.containsKey('includeEmptyRows')) {
includeEmptyRows = _json['includeEmptyRows'] as core.bool;
}
if (_json.containsKey('metricFilterClauses')) {
metricFilterClauses = (_json['metricFilterClauses'] as core.List)
.map<MetricFilterClause>((value) => MetricFilterClause.fromJson(
value as core.Map<core.String, core.dynamic>))
.toList();
}
if (_json.containsKey('metrics')) {
metrics = (_json['metrics'] as core.List)
.map<Metric>((value) =>
Metric.fromJson(value as core.Map<core.String, core.dynamic>))
.toList();
}
if (_json.containsKey('orderBys')) {
orderBys = (_json['orderBys'] as core.List)
.map<OrderBy>((value) =>
OrderBy.fromJson(value as core.Map<core.String, core.dynamic>))
.toList();
}
if (_json.containsKey('pageSize')) {
pageSize = _json['pageSize'] as core.int;
}
if (_json.containsKey('pageToken')) {
pageToken = _json['pageToken'] as core.String;
}
if (_json.containsKey('pivots')) {
pivots = (_json['pivots'] as core.List)
.map<Pivot>((value) =>
Pivot.fromJson(value as core.Map<core.String, core.dynamic>))
.toList();
}
if (_json.containsKey('samplingLevel')) {
samplingLevel = _json['samplingLevel'] as core.String;
}
if (_json.containsKey('segments')) {
segments = (_json['segments'] as core.List)
.map<Segment>((value) =>
Segment.fromJson(value as core.Map<core.String, core.dynamic>))
.toList();
}
if (_json.containsKey('viewId')) {
viewId = _json['viewId'] as core.String;
}
}
core.Map<core.String, core.Object> toJson() {
final _json = <core.String, core.Object>{};
if (cohortGroup != null) {
_json['cohortGroup'] = cohortGroup.toJson();
}
if (dateRanges != null) {
_json['dateRanges'] = dateRanges.map((value) => value.toJson()).toList();
}
if (dimensionFilterClauses != null) {
_json['dimensionFilterClauses'] =
dimensionFilterClauses.map((value) => value.toJson()).toList();
}
if (dimensions != null) {
_json['dimensions'] = dimensions.map((value) => value.toJson()).toList();
}
if (filtersExpression != null) {
_json['filtersExpression'] = filtersExpression;
}
if (hideTotals != null) {
_json['hideTotals'] = hideTotals;
}
if (hideValueRanges != null) {
_json['hideValueRanges'] = hideValueRanges;
}
if (includeEmptyRows != null) {
_json['includeEmptyRows'] = includeEmptyRows;
}
if (metricFilterClauses != null) {
_json['metricFilterClauses'] =
metricFilterClauses.map((value) => value.toJson()).toList();
}
if (metrics != null) {
_json['metrics'] = metrics.map((value) => value.toJson()).toList();
}
if (orderBys != null) {
_json['orderBys'] = orderBys.map((value) => value.toJson()).toList();
}
if (pageSize != null) {
_json['pageSize'] = pageSize;
}
if (pageToken != null) {
_json['pageToken'] = pageToken;
}
if (pivots != null) {
_json['pivots'] = pivots.map((value) => value.toJson()).toList();
}
if (samplingLevel != null) {
_json['samplingLevel'] = samplingLevel;
}
if (segments != null) {
_json['segments'] = segments.map((value) => value.toJson()).toList();
}
if (viewId != null) {
_json['viewId'] = viewId;
}
return _json;
}
}
/// A row in the report.
class ReportRow {
/// List of requested dimensions.
core.List<core.String> dimensions;
/// List of metrics for each requested DateRange.
core.List<DateRangeValues> metrics;
ReportRow();
ReportRow.fromJson(core.Map _json) {
if (_json.containsKey('dimensions')) {
dimensions = (_json['dimensions'] as core.List)
.map<core.String>((value) => value as core.String)
.toList();
}
if (_json.containsKey('metrics')) {
metrics = (_json['metrics'] as core.List)
.map<DateRangeValues>((value) => DateRangeValues.fromJson(
value as core.Map<core.String, core.dynamic>))
.toList();
}
}
core.Map<core.String, core.Object> toJson() {
final _json = <core.String, core.Object>{};
if (dimensions != null) {
_json['dimensions'] = dimensions;
}
if (metrics != null) {
_json['metrics'] = metrics.map((value) => value.toJson()).toList();
}
return _json;
}
}
/// The resource quota tokens remaining for the property after the request is
/// completed.
class ResourceQuotasRemaining {
/// Daily resource quota remaining remaining.
core.int dailyQuotaTokensRemaining;
/// Hourly resource quota tokens remaining.
core.int hourlyQuotaTokensRemaining;
ResourceQuotasRemaining();
ResourceQuotasRemaining.fromJson(core.Map _json) {
if (_json.containsKey('dailyQuotaTokensRemaining')) {
dailyQuotaTokensRemaining =
_json['dailyQuotaTokensRemaining'] as core.int;
}
if (_json.containsKey('hourlyQuotaTokensRemaining')) {
hourlyQuotaTokensRemaining =
_json['hourlyQuotaTokensRemaining'] as core.int;
}
}
core.Map<core.String, core.Object> toJson() {
final _json = <core.String, core.Object>{};
if (dailyQuotaTokensRemaining != null) {
_json['dailyQuotaTokensRemaining'] = dailyQuotaTokensRemaining;
}
if (hourlyQuotaTokensRemaining != null) {
_json['hourlyQuotaTokensRemaining'] = hourlyQuotaTokensRemaining;
}
return _json;
}
}
class ScreenviewData {
/// The application name.
core.String appName;
/// Mobile manufacturer or branded name. Eg: "Google", "Apple" etc.
core.String mobileDeviceBranding;
/// Mobile device model. Eg: "Pixel", "iPhone" etc.
core.String mobileDeviceModel;
/// The name of the screen.
core.String screenName;
ScreenviewData();
ScreenviewData.fromJson(core.Map _json) {
if (_json.containsKey('appName')) {
appName = _json['appName'] as core.String;
}
if (_json.containsKey('mobileDeviceBranding')) {
mobileDeviceBranding = _json['mobileDeviceBranding'] as core.String;
}
if (_json.containsKey('mobileDeviceModel')) {
mobileDeviceModel = _json['mobileDeviceModel'] as core.String;
}
if (_json.containsKey('screenName')) {
screenName = _json['screenName'] as core.String;
}
}
core.Map<core.String, core.Object> toJson() {
final _json = <core.String, core.Object>{};
if (appName != null) {
_json['appName'] = appName;
}
if (mobileDeviceBranding != null) {
_json['mobileDeviceBranding'] = mobileDeviceBranding;
}
if (mobileDeviceModel != null) {
_json['mobileDeviceModel'] = mobileDeviceModel;
}
if (screenName != null) {
_json['screenName'] = screenName;
}
return _json;
}
}
/// The request to fetch User Report from Reporting API `userActivity:get` call.
class SearchUserActivityRequest {
/// Set of all activity types being requested. Only acvities matching these
/// types will be returned in the response. If empty, all activies will be
/// returned.
core.List<core.String> activityTypes;
/// Date range for which to retrieve the user activity. If a date range is not
/// provided, the default date range is (startDate: current date - 7 days,
/// endDate: current date - 1 day).
DateRange dateRange;
/// Page size is for paging and specifies the maximum number of returned rows.
/// Page size should be > 0. If the value is 0 or if the field isn't
/// specified, the request returns the default of 1000 rows per page.
core.int pageSize;
/// A continuation token to get the next page of the results. Adding this to
/// the request will return the rows after the pageToken. The pageToken should
/// be the value returned in the nextPageToken parameter in the response to
/// the [SearchUserActivityRequest](#SearchUserActivityRequest) request.
core.String pageToken;
/// Required. Unique user Id to query for. Every
/// [SearchUserActivityRequest](#SearchUserActivityRequest) must contain this
/// field.
User user;
/// Required. The Analytics [view
/// ID](https://support.google.com/analytics/answer/1009618) from which to
/// retrieve data. Every
/// [SearchUserActivityRequest](#SearchUserActivityRequest) must contain the
/// `viewId`.
core.String viewId;
SearchUserActivityRequest();
SearchUserActivityRequest.fromJson(core.Map _json) {
if (_json.containsKey('activityTypes')) {
activityTypes = (_json['activityTypes'] as core.List)
.map<core.String>((value) => value as core.String)
.toList();
}
if (_json.containsKey('dateRange')) {
dateRange = DateRange.fromJson(
_json['dateRange'] as core.Map<core.String, core.dynamic>);
}
if (_json.containsKey('pageSize')) {
pageSize = _json['pageSize'] as core.int;
}
if (_json.containsKey('pageToken')) {
pageToken = _json['pageToken'] as core.String;
}
if (_json.containsKey('user')) {
user =
User.fromJson(_json['user'] as core.Map<core.String, core.dynamic>);
}
if (_json.containsKey('viewId')) {
viewId = _json['viewId'] as core.String;
}
}
core.Map<core.String, core.Object> toJson() {
final _json = <core.String, core.Object>{};
if (activityTypes != null) {
_json['activityTypes'] = activityTypes;
}
if (dateRange != null) {
_json['dateRange'] = dateRange.toJson();
}
if (pageSize != null) {
_json['pageSize'] = pageSize;
}
if (pageToken != null) {
_json['pageToken'] = pageToken;
}
if (user != null) {
_json['user'] = user.toJson();
}
if (viewId != null) {
_json['viewId'] = viewId;
}
return _json;
}
}
/// The response from `userActivity:get` call.
class SearchUserActivityResponse {
/// This token should be passed to
/// [SearchUserActivityRequest](#SearchUserActivityRequest) to retrieve the
/// next page.
core.String nextPageToken;
/// This field represents the [sampling
/// rate](https://support.google.com/analytics/answer/2637192) for the given
/// request and is a number between 0.0 to 1.0. See [developer
/// guide](/analytics/devguides/reporting/core/v4/basics#sampling) for
/// details.
core.double sampleRate;
/// Each record represents a session (device details, duration, etc).
core.List<UserActivitySession> sessions;
/// Total rows returned by this query (across different pages).
core.int totalRows;
SearchUserActivityResponse();
SearchUserActivityResponse.fromJson(core.Map _json) {
if (_json.containsKey('nextPageToken')) {
nextPageToken = _json['nextPageToken'] as core.String;
}
if (_json.containsKey('sampleRate')) {
sampleRate = (_json['sampleRate'] as core.num).toDouble();
}
if (_json.containsKey('sessions')) {
sessions = (_json['sessions'] as core.List)
.map<UserActivitySession>((value) => UserActivitySession.fromJson(
value as core.Map<core.String, core.dynamic>))
.toList();
}
if (_json.containsKey('totalRows')) {
totalRows = _json['totalRows'] as core.int;
}
}
core.Map<core.String, core.Object> toJson() {
final _json = <core.String, core.Object>{};
if (nextPageToken != null) {
_json['nextPageToken'] = nextPageToken;
}
if (sampleRate != null) {
_json['sampleRate'] = sampleRate;
}
if (sessions != null) {
_json['sessions'] = sessions.map((value) => value.toJson()).toList();
}
if (totalRows != null) {
_json['totalRows'] = totalRows;
}
return _json;
}
}
/// The segment definition, if the report needs to be segmented. A Segment is a
/// subset of the Analytics data. For example, of the entire set of users, one
/// Segment might be users from a particular country or city.
class Segment {
/// A dynamic segment definition in the request.
DynamicSegment dynamicSegment;
/// The segment ID of a built-in or custom segment, for example `gaid::-3`.
core.String segmentId;
Segment();
Segment.fromJson(core.Map _json) {
if (_json.containsKey('dynamicSegment')) {
dynamicSegment = DynamicSegment.fromJson(
_json['dynamicSegment'] as core.Map<core.String, core.dynamic>);
}
if (_json.containsKey('segmentId')) {
segmentId = _json['segmentId'] as core.String;
}
}
core.Map<core.String, core.Object> toJson() {
final _json = <core.String, core.Object>{};
if (dynamicSegment != null) {
_json['dynamicSegment'] = dynamicSegment.toJson();
}
if (segmentId != null) {
_json['segmentId'] = segmentId;
}
return _json;
}
}
/// SegmentDefinition defines the segment to be a set of SegmentFilters which
/// are combined together with a logical `AND` operation.
class SegmentDefinition {
/// A segment is defined by a set of segment filters which are combined
/// together with a logical `AND` operation.
core.List<SegmentFilter> segmentFilters;
SegmentDefinition();
SegmentDefinition.fromJson(core.Map _json) {
if (_json.containsKey('segmentFilters')) {
segmentFilters = (_json['segmentFilters'] as core.List)
.map<SegmentFilter>((value) => SegmentFilter.fromJson(
value as core.Map<core.String, core.dynamic>))
.toList();
}
}
core.Map<core.String, core.Object> toJson() {
final _json = <core.String, core.Object>{};
if (segmentFilters != null) {
_json['segmentFilters'] =
segmentFilters.map((value) => value.toJson()).toList();
}
return _json;
}
}
/// Dimension filter specifies the filtering options on a dimension.
class SegmentDimensionFilter {
/// Should the match be case sensitive, ignored for `IN_LIST` operator.
core.bool caseSensitive;
/// Name of the dimension for which the filter is being applied.
core.String dimensionName;
/// The list of expressions, only the first element is used for all operators
core.List<core.String> expressions;
/// Maximum comparison values for `BETWEEN` match type.
core.String maxComparisonValue;
/// Minimum comparison values for `BETWEEN` match type.
core.String minComparisonValue;
/// The operator to use to match the dimension with the expressions.
/// Possible string values are:
/// - "OPERATOR_UNSPECIFIED" : If the match type is unspecified, it is treated
/// as a REGEXP.
/// - "REGEXP" : The match expression is treated as a regular expression. All
/// other match types are not treated as regular expressions.
/// - "BEGINS_WITH" : Matches the values which begin with the match expression
/// provided.
/// - "ENDS_WITH" : Matches the values which end with the match expression
/// provided.
/// - "PARTIAL" : Substring match.
/// - "EXACT" : The value should match the match expression entirely.
/// - "IN_LIST" : This option is used to specify a dimension filter whose
/// expression can take any value from a selected list of values. This helps
/// avoiding evaluating multiple exact match dimension filters which are OR'ed
/// for every single response row. For example: expressions: ["A", "B", "C"]
/// Any response row whose dimension has it is value as A, B or C, matches
/// this DimensionFilter.
/// - "NUMERIC_LESS_THAN" : Integer comparison filters. case sensitivity is
/// ignored for these and the expression is assumed to be a string
/// representing an integer. Failure conditions: - if expression is not a
/// valid int64, the client should expect an error. - input dimensions that
/// are not valid int64 values will never match the filter. Checks if the
/// dimension is numerically less than the match expression.
/// - "NUMERIC_GREATER_THAN" : Checks if the dimension is numerically greater
/// than the match expression.
/// - "NUMERIC_BETWEEN" : Checks if the dimension is numerically between the
/// minimum and maximum of the match expression, boundaries excluded.
core.String operator;
SegmentDimensionFilter();
SegmentDimensionFilter.fromJson(core.Map _json) {
if (_json.containsKey('caseSensitive')) {
caseSensitive = _json['caseSensitive'] as core.bool;
}
if (_json.containsKey('dimensionName')) {
dimensionName = _json['dimensionName'] as core.String;
}
if (_json.containsKey('expressions')) {
expressions = (_json['expressions'] as core.List)
.map<core.String>((value) => value as core.String)
.toList();
}
if (_json.containsKey('maxComparisonValue')) {
maxComparisonValue = _json['maxComparisonValue'] as core.String;
}
if (_json.containsKey('minComparisonValue')) {
minComparisonValue = _json['minComparisonValue'] as core.String;
}
if (_json.containsKey('operator')) {
operator = _json['operator'] as core.String;
}
}
core.Map<core.String, core.Object> toJson() {
final _json = <core.String, core.Object>{};
if (caseSensitive != null) {
_json['caseSensitive'] = caseSensitive;
}
if (dimensionName != null) {
_json['dimensionName'] = dimensionName;
}
if (expressions != null) {
_json['expressions'] = expressions;
}
if (maxComparisonValue != null) {
_json['maxComparisonValue'] = maxComparisonValue;
}
if (minComparisonValue != null) {
_json['minComparisonValue'] = minComparisonValue;
}
if (operator != null) {
_json['operator'] = operator;
}
return _json;
}
}
/// SegmentFilter defines the segment to be either a simple or a sequence
/// segment. A simple segment condition contains dimension and metric conditions
/// to select the sessions or users. A sequence segment condition can be used to
/// select users or sessions based on sequential conditions.
class SegmentFilter {
/// If true, match the complement of simple or sequence segment. For example,
/// to match all visits not from "New York", we can define the segment as
/// follows: "sessionSegment": { "segmentFilters": [{ "simpleSegment" :{
/// "orFiltersForSegment": [{ "segmentFilterClauses":[{ "dimensionFilter": {
/// "dimensionName": "ga:city", "expressions": ["New York"] } }] }] }, "not":
/// "True" }] },
core.bool not;
/// Sequence conditions consist of one or more steps, where each step is
/// defined by one or more dimension/metric conditions. Multiple steps can be
/// combined with special sequence operators.
SequenceSegment sequenceSegment;
/// A Simple segment conditions consist of one or more dimension/metric
/// conditions that can be combined
SimpleSegment simpleSegment;
SegmentFilter();
SegmentFilter.fromJson(core.Map _json) {
if (_json.containsKey('not')) {
not = _json['not'] as core.bool;
}
if (_json.containsKey('sequenceSegment')) {
sequenceSegment = SequenceSegment.fromJson(
_json['sequenceSegment'] as core.Map<core.String, core.dynamic>);
}
if (_json.containsKey('simpleSegment')) {
simpleSegment = SimpleSegment.fromJson(
_json['simpleSegment'] as core.Map<core.String, core.dynamic>);
}
}
core.Map<core.String, core.Object> toJson() {
final _json = <core.String, core.Object>{};
if (not != null) {
_json['not'] = not;
}
if (sequenceSegment != null) {
_json['sequenceSegment'] = sequenceSegment.toJson();
}
if (simpleSegment != null) {
_json['simpleSegment'] = simpleSegment.toJson();
}
return _json;
}
}
/// Filter Clause to be used in a segment definition, can be wither a metric or
/// a dimension filter.
class SegmentFilterClause {
/// Dimension Filter for the segment definition.
SegmentDimensionFilter dimensionFilter;
/// Metric Filter for the segment definition.
SegmentMetricFilter metricFilter;
/// Matches the complement (`!`) of the filter.
core.bool not;
SegmentFilterClause();
SegmentFilterClause.fromJson(core.Map _json) {
if (_json.containsKey('dimensionFilter')) {
dimensionFilter = SegmentDimensionFilter.fromJson(
_json['dimensionFilter'] as core.Map<core.String, core.dynamic>);
}
if (_json.containsKey('metricFilter')) {
metricFilter = SegmentMetricFilter.fromJson(
_json['metricFilter'] as core.Map<core.String, core.dynamic>);
}
if (_json.containsKey('not')) {
not = _json['not'] as core.bool;
}
}
core.Map<core.String, core.Object> toJson() {
final _json = <core.String, core.Object>{};
if (dimensionFilter != null) {
_json['dimensionFilter'] = dimensionFilter.toJson();
}
if (metricFilter != null) {
_json['metricFilter'] = metricFilter.toJson();
}
if (not != null) {
_json['not'] = not;
}
return _json;
}
}
/// Metric filter to be used in a segment filter clause.
class SegmentMetricFilter {
/// The value to compare against. If the operator is `BETWEEN`, this value is
/// treated as minimum comparison value.
core.String comparisonValue;
/// Max comparison value is only used for `BETWEEN` operator.
core.String maxComparisonValue;
/// The metric that will be filtered on. A `metricFilter` must contain a
/// metric name.
core.String metricName;
/// Specifies is the operation to perform to compare the metric. The default
/// is `EQUAL`.
/// Possible string values are:
/// - "UNSPECIFIED_OPERATOR" : Unspecified operator is treated as `LESS_THAN`
/// operator.
/// - "LESS_THAN" : Checks if the metric value is less than comparison value.
/// - "GREATER_THAN" : Checks if the metric value is greater than comparison
/// value.
/// - "EQUAL" : Equals operator.
/// - "BETWEEN" : For between operator, both the minimum and maximum are
/// exclusive. We will use `LT` and `GT` for comparison.
core.String operator;
/// Scope for a metric defines the level at which that metric is defined. The
/// specified metric scope must be equal to or greater than its primary scope
/// as defined in the data model. The primary scope is defined by if the
/// segment is selecting users or sessions.
/// Possible string values are:
/// - "UNSPECIFIED_SCOPE" : If the scope is unspecified, it defaults to the
/// condition scope, `USER` or `SESSION` depending on if the segment is trying
/// to choose users or sessions.
/// - "PRODUCT" : Product scope.
/// - "HIT" : Hit scope.
/// - "SESSION" : Session scope.
/// - "USER" : User scope.
core.String scope;
SegmentMetricFilter();
SegmentMetricFilter.fromJson(core.Map _json) {
if (_json.containsKey('comparisonValue')) {
comparisonValue = _json['comparisonValue'] as core.String;
}
if (_json.containsKey('maxComparisonValue')) {
maxComparisonValue = _json['maxComparisonValue'] as core.String;
}
if (_json.containsKey('metricName')) {
metricName = _json['metricName'] as core.String;
}
if (_json.containsKey('operator')) {
operator = _json['operator'] as core.String;
}
if (_json.containsKey('scope')) {
scope = _json['scope'] as core.String;
}
}
core.Map<core.String, core.Object> toJson() {
final _json = <core.String, core.Object>{};
if (comparisonValue != null) {
_json['comparisonValue'] = comparisonValue;
}
if (maxComparisonValue != null) {
_json['maxComparisonValue'] = maxComparisonValue;
}
if (metricName != null) {
_json['metricName'] = metricName;
}
if (operator != null) {
_json['operator'] = operator;
}
if (scope != null) {
_json['scope'] = scope;
}
return _json;
}
}
/// A segment sequence definition.
class SegmentSequenceStep {
/// Specifies if the step immediately precedes or can be any time before the
/// next step.
/// Possible string values are:
/// - "UNSPECIFIED_MATCH_TYPE" : Unspecified match type is treated as
/// precedes.
/// - "PRECEDES" : Operator indicates that the previous step precedes the next
/// step.
/// - "IMMEDIATELY_PRECEDES" : Operator indicates that the previous step
/// immediately precedes the next step.
core.String matchType;
/// A sequence is specified with a list of Or grouped filters which are
/// combined with `AND` operator.
core.List<OrFiltersForSegment> orFiltersForSegment;
SegmentSequenceStep();
SegmentSequenceStep.fromJson(core.Map _json) {
if (_json.containsKey('matchType')) {
matchType = _json['matchType'] as core.String;
}
if (_json.containsKey('orFiltersForSegment')) {
orFiltersForSegment = (_json['orFiltersForSegment'] as core.List)
.map<OrFiltersForSegment>((value) => OrFiltersForSegment.fromJson(
value as core.Map<core.String, core.dynamic>))
.toList();
}
}
core.Map<core.String, core.Object> toJson() {
final _json = <core.String, core.Object>{};
if (matchType != null) {
_json['matchType'] = matchType;
}
if (orFiltersForSegment != null) {
_json['orFiltersForSegment'] =
orFiltersForSegment.map((value) => value.toJson()).toList();
}
return _json;
}
}
/// Sequence conditions consist of one or more steps, where each step is defined
/// by one or more dimension/metric conditions. Multiple steps can be combined
/// with special sequence operators.
class SequenceSegment {
/// If set, first step condition must match the first hit of the visitor (in
/// the date range).
core.bool firstStepShouldMatchFirstHit;
/// The list of steps in the sequence.
core.List<SegmentSequenceStep> segmentSequenceSteps;
SequenceSegment();
SequenceSegment.fromJson(core.Map _json) {
if (_json.containsKey('firstStepShouldMatchFirstHit')) {
firstStepShouldMatchFirstHit =
_json['firstStepShouldMatchFirstHit'] as core.bool;
}
if (_json.containsKey('segmentSequenceSteps')) {
segmentSequenceSteps = (_json['segmentSequenceSteps'] as core.List)
.map<SegmentSequenceStep>((value) => SegmentSequenceStep.fromJson(
value as core.Map<core.String, core.dynamic>))
.toList();
}
}
core.Map<core.String, core.Object> toJson() {
final _json = <core.String, core.Object>{};
if (firstStepShouldMatchFirstHit != null) {
_json['firstStepShouldMatchFirstHit'] = firstStepShouldMatchFirstHit;
}
if (segmentSequenceSteps != null) {
_json['segmentSequenceSteps'] =
segmentSequenceSteps.map((value) => value.toJson()).toList();
}
return _json;
}
}
/// A Simple segment conditions consist of one or more dimension/metric
/// conditions that can be combined.
class SimpleSegment {
/// A list of segment filters groups which are combined with logical `AND`
/// operator.
core.List<OrFiltersForSegment> orFiltersForSegment;
SimpleSegment();
SimpleSegment.fromJson(core.Map _json) {
if (_json.containsKey('orFiltersForSegment')) {
orFiltersForSegment = (_json['orFiltersForSegment'] as core.List)
.map<OrFiltersForSegment>((value) => OrFiltersForSegment.fromJson(
value as core.Map<core.String, core.dynamic>))
.toList();
}
}
core.Map<core.String, core.Object> toJson() {
final _json = <core.String, core.Object>{};
if (orFiltersForSegment != null) {
_json['orFiltersForSegment'] =
orFiltersForSegment.map((value) => value.toJson()).toList();
}
return _json;
}
}
/// Represents details collected when the visitor performs a transaction on the
/// page.
class TransactionData {
/// The transaction ID, supplied by the e-commerce tracking method, for the
/// purchase in the shopping cart.
core.String transactionId;
/// The total sale revenue (excluding shipping and tax) of the transaction.
core.double transactionRevenue;
/// Total cost of shipping.
core.double transactionShipping;
/// Total tax for the transaction.
core.double transactionTax;
TransactionData();
TransactionData.fromJson(core.Map _json) {
if (_json.containsKey('transactionId')) {
transactionId = _json['transactionId'] as core.String;
}
if (_json.containsKey('transactionRevenue')) {
transactionRevenue = (_json['transactionRevenue'] as core.num).toDouble();
}
if (_json.containsKey('transactionShipping')) {
transactionShipping =
(_json['transactionShipping'] as core.num).toDouble();
}
if (_json.containsKey('transactionTax')) {
transactionTax = (_json['transactionTax'] as core.num).toDouble();
}
}
core.Map<core.String, core.Object> toJson() {
final _json = <core.String, core.Object>{};
if (transactionId != null) {
_json['transactionId'] = transactionId;
}
if (transactionRevenue != null) {
_json['transactionRevenue'] = transactionRevenue;
}
if (transactionShipping != null) {
_json['transactionShipping'] = transactionShipping;
}
if (transactionTax != null) {
_json['transactionTax'] = transactionTax;
}
return _json;
}
}
/// Contains information to identify a particular user uniquely.
class User {
/// Type of the user in the request. The field `userId` is associated with
/// this type.
/// Possible string values are:
/// - "USER_ID_TYPE_UNSPECIFIED" : When the User Id Type is not specified, the
/// default type used will be CLIENT_ID.
/// - "USER_ID" : A single user, like a signed-in user account, that may
/// interact with content across one or more devices and / or browser
/// instances.
/// - "CLIENT_ID" : Analytics assigned client_id.
core.String type;
/// Unique Id of the user for which the data is being requested.
core.String userId;
User();
User.fromJson(core.Map _json) {
if (_json.containsKey('type')) {
type = _json['type'] as core.String;
}
if (_json.containsKey('userId')) {
userId = _json['userId'] as core.String;
}
}
core.Map<core.String, core.Object> toJson() {
final _json = <core.String, core.Object>{};
if (type != null) {
_json['type'] = type;
}
if (userId != null) {
_json['userId'] = userId;
}
return _json;
}
}
/// This represents a user session performed on a specific device at a certain
/// time over a period of time.
class UserActivitySession {
/// Represents a detailed view into each of the activity in this session.
core.List<Activity> activities;
/// The data source of a hit. By default, hits sent from analytics.js are
/// reported as "web" and hits sent from the mobile SDKs are reported as
/// "app". These values can be overridden in the Measurement Protocol.
core.String dataSource;
/// The type of device used: "mobile", "tablet" etc.
core.String deviceCategory;
/// Platform on which the activity happened: "android", "ios" etc.
core.String platform;
/// Date of this session in ISO-8601 format.
core.String sessionDate;
/// Unique ID of the session.
core.String sessionId;
UserActivitySession();
UserActivitySession.fromJson(core.Map _json) {
if (_json.containsKey('activities')) {
activities = (_json['activities'] as core.List)
.map<Activity>((value) =>
Activity.fromJson(value as core.Map<core.String, core.dynamic>))
.toList();
}
if (_json.containsKey('dataSource')) {
dataSource = _json['dataSource'] as core.String;
}
if (_json.containsKey('deviceCategory')) {
deviceCategory = _json['deviceCategory'] as core.String;
}
if (_json.containsKey('platform')) {
platform = _json['platform'] as core.String;
}
if (_json.containsKey('sessionDate')) {
sessionDate = _json['sessionDate'] as core.String;
}
if (_json.containsKey('sessionId')) {
sessionId = _json['sessionId'] as core.String;
}
}
core.Map<core.String, core.Object> toJson() {
final _json = <core.String, core.Object>{};
if (activities != null) {
_json['activities'] = activities.map((value) => value.toJson()).toList();
}
if (dataSource != null) {
_json['dataSource'] = dataSource;
}
if (deviceCategory != null) {
_json['deviceCategory'] = deviceCategory;
}
if (platform != null) {
_json['platform'] = platform;
}
if (sessionDate != null) {
_json['sessionDate'] = sessionDate;
}
if (sessionId != null) {
_json['sessionId'] = sessionId;
}
return _json;
}
}