blob: 0ce1dd648076f0512a9bd36fc84a1d3b47f0931e [file] [log] [blame]
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef GOOGLE_APIS_CALENDAR_CALENDAR_API_REQUESTS_H_
#define GOOGLE_APIS_CALENDAR_CALENDAR_API_REQUESTS_H_
#include <memory>
#include <optional>
#include <string>
#include <vector>
#include "base/memory/weak_ptr.h"
#include "base/time/time.h"
#include "google_apis/calendar/calendar_api_response_types.h"
#include "google_apis/calendar/calendar_api_url_generator.h"
#include "google_apis/common/api_error_codes.h"
#include "google_apis/common/base_requests.h"
namespace google_apis {
namespace calendar {
// A marker to indicate an event has been injected with its calendar's colorId.
inline const std::string kInjectedColorIdPrefix = "c";
inline constexpr char kPrimaryCalendarId[] = "primary";
// Callback used for requests that the server returns Calendar List
// data formatted into JSON value.
using CalendarListCallback =
base::OnceCallback<void(ApiErrorCode error,
std::unique_ptr<CalendarList> calendars)>;
// Callback used for requests that the server returns Events data
// formatted into JSON value.
using CalendarEventListCallback =
base::OnceCallback<void(ApiErrorCode error,
std::unique_ptr<EventList> events)>;
// This is base class of the Calendar API related requests.
class CalendarApiGetRequest : public UrlFetchRequestBase {
public:
// `fields` is an optional request parameter that allows you to specify the
// fields you want returned in the response data. Documentation:
// https://developers.google.com/calendar/api/guides/performance?hl=en#partial-response
CalendarApiGetRequest(RequestSender* sender, const std::string& fields);
CalendarApiGetRequest(const CalendarApiGetRequest&) = delete;
CalendarApiGetRequest& operator=(const CalendarApiGetRequest&) = delete;
~CalendarApiGetRequest() override;
protected:
// UrlFetchRequestBase:
GURL GetURL() const override;
ApiErrorCode MapReasonToError(ApiErrorCode code,
const std::string& reason) override;
bool IsSuccessfulErrorCode(ApiErrorCode error) override;
// Derived classes should override GetURLInternal instead of GetURL()
// directly since fields are appended in the GetURL() method.
virtual GURL GetURLInternal() const = 0;
private:
// Optional parameter in the request.
std::string fields_;
};
// Request to fetch the list of the user's calendars.
class CalendarApiCalendarListRequest : public CalendarApiGetRequest {
public:
CalendarApiCalendarListRequest(RequestSender* sender,
const CalendarApiUrlGenerator& url_generator,
CalendarListCallback callback);
CalendarApiCalendarListRequest(const CalendarApiCalendarListRequest&) =
delete;
CalendarApiCalendarListRequest& operator=(
const CalendarApiCalendarListRequest&) = delete;
~CalendarApiCalendarListRequest() override;
protected:
// CalendarApiGetRequest:
GURL GetURLInternal() const override;
// UrlFetchRequestBase:
void ProcessURLFetchResults(
const network::mojom::URLResponseHead* response_head,
base::FilePath response_file,
std::string response_body) override;
void RunCallbackOnPrematureFailure(ApiErrorCode code) override;
private:
// Parses the Calendar List result to a CalendarList.
static std::unique_ptr<CalendarList> Parse(std::string json);
// Receives the parsed calendar list and invokes the callback.
void OnDataParsed(ApiErrorCode error,
std::unique_ptr<CalendarList> calendars);
CalendarListCallback callback_;
const CalendarApiUrlGenerator url_generator_;
// Note: This should remain the last member so it'll be destroyed and
// invalidate its weak pointers before any other members are destroyed.
base::WeakPtrFactory<CalendarApiCalendarListRequest> weak_ptr_factory_{this};
};
// Request to fetch calendar events. By default, an event fetch for the primary
// calendar is requested. If a calendar ID is passed, an event fetch is
// requested for the calendar matching that ID.
// |url_generator| The UrlGenerator to use for the request.
// |callback| The callback to send the parsed |EventList| to when the
// request is complete.
// |start_time| The minimum time to fetch events for. This will filter
// out events with an end time before this value.
// |end_time| The maximum time to fetch events for. This will filter
// out events with a start time after this value.
class CalendarApiEventsRequest : public CalendarApiGetRequest {
public:
CalendarApiEventsRequest(RequestSender* sender,
const CalendarApiUrlGenerator& url_generator,
CalendarEventListCallback callback,
const base::Time& start_time,
const base::Time& end_time,
const std::string& calendar_id,
const std::string& calendar_color_id);
CalendarApiEventsRequest(RequestSender* sender,
const CalendarApiUrlGenerator& url_generator,
CalendarEventListCallback callback,
const base::Time& start_time,
const base::Time& end_time,
bool include_attachments = false);
// Creates a CalendarApiEventsRequest for the user's primary calendar with
// extra params.
// |event_types| A vector of |EventType| to filter
// for. If the vector is empty, no filtering by
// event_types will occur.
// |experiment| A string indicating an experiment param to add to
// the query. This does not filter further, but allows
// for separating requests by project in the backend.
// |order_by| The field to order the results by. This can be
// "startTime" or "updated".
// |include_attachments| Boolean of whether to include attachments in the
// response object. Default is true.
CalendarApiEventsRequest(RequestSender* sender,
const CalendarApiUrlGenerator& url_generator,
CalendarEventListCallback callback,
const base::Time& start_time,
const base::Time& end_time,
const std::vector<EventType>& event_types,
const std::string& experiment,
const std::string& order_by,
bool include_attachments = true);
CalendarApiEventsRequest(const CalendarApiEventsRequest&) = delete;
CalendarApiEventsRequest& operator=(const CalendarApiEventsRequest&) = delete;
~CalendarApiEventsRequest() override;
protected:
// CalendarApiGetRequest:
GURL GetURLInternal() const override;
// UrlFetchRequestBase:
void ProcessURLFetchResults(
const network::mojom::URLResponseHead* response_head,
base::FilePath response_file,
std::string response_body) override;
void RunCallbackOnPrematureFailure(ApiErrorCode code) override;
private:
// Parses the |json| string to EventList.
static std::unique_ptr<EventList> Parse(std::string json);
// Receives the parsed result and invokes the callback.
void OnDataParsed(ApiErrorCode error, std::unique_ptr<EventList> events);
CalendarEventListCallback callback_;
const CalendarApiUrlGenerator url_generator_;
const std::string calendar_color_id_;
const std::string calendar_id_;
const base::Time end_time_;
const std::vector<EventType> event_types_;
const std::string experiment_;
const std::string order_by_;
const base::Time start_time_;
// Note: This should remain the last member so it'll be destroyed and
// invalidate its weak pointers before any other members are destroyed.
base::WeakPtrFactory<CalendarApiEventsRequest> weak_ptr_factory_{this};
};
} // namespace calendar
} // namespace google_apis
#endif // GOOGLE_APIS_CALENDAR_CALENDAR_API_REQUESTS_H_