karishmal / google-api-dotnet-client

Automatically exported from code.google.com/p/google-api-dotnet-client
Apache License 2.0
0 stars 0 forks source link

Cant fetch FreeBusy data from Calendar using Service account. #288

Open GoogleCodeExporter opened 9 years ago

GoogleCodeExporter commented 9 years ago
What steps will reproduce the problem?
1. Authenticate using a service account
2. Attempt to use a FreeBusy query
3.

What is the expected output? What do you see instead?
I expect to see a result with free busy data
I actually see a "BadRequest" error.

What version of the product are you using? On what operating system?
Using Calendar API v3 on Windows 7 (for testing - target is server 2012).

Please provide any additional information below.
Code to reproduce 

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Google.Apis.Calendar;
    using Google.Apis.Calendar.v3;
    using Google.Apis.Authentication;
    using Google.Apis.Authentication.OAuth2;
    using Google.Apis.Authentication.OAuth2.DotNetOpenAuth;
    using DotNetOpenAuth.OAuth2;
    using System.Diagnostics;
    using Google.Apis.Calendar.v3.Data;
    using System.Security.Cryptography.X509Certificates;
    using Google.Apis.Discovery;
    using Google.Apis.Drive.v2;
    using Google.Apis.Util;

    namespace consoleGoogleResearch
    {
        class Program
        {
            private const string SERVICE_ACCOUNT_EMAIL = "<your-value>@developer.gserviceaccount.com";
            private const string SERVICE_ACCOUNT_PKCS12_FILE_PATH = @"<path-to\<your-value>-privatekey.p12";

            /// <summary>
            /// Build a Calendar service object authorized with the service account.
            /// </summary>
            /// <returns>Drive service object.</returns>
            static CalendarService BuildCalendarService()
            {
                AssertionFlowClient client = new AssertionFlowClient(
                    GoogleAuthenticationServer.Description, new X509Certificate2(SERVICE_ACCOUNT_PKCS12_FILE_PATH, "notasecret", X509KeyStorageFlags.Exportable))
                {
                    Scope = CalendarService.Scopes.Calendar.GetStringValue(),
                    ServiceAccountId = SERVICE_ACCOUNT_EMAIL,
                };
                OAuth2Authenticator<AssertionFlowClient> authenticator = new OAuth2Authenticator<AssertionFlowClient>(client, AssertionFlowClient.GetState);
                return new CalendarService(authenticator);
            }

            public static void Main(string[] args)
            {
                var service = BuildCalendarService();

                // Get the calendar service
                Google.Apis.Calendar.v3.CalendarListResource.ListRequest clrq = service.CalendarList.List();
                var result = clrq.Fetch();

                // Prove we can get the settings.
                SettingsResource.ListRequest slr = service.Settings.List();
                var sr = slr.Fetch();

                try
                {
                    //Google.Apis.Calendar.v3.CalendarListResource.ListRequest clrq = service.CalendarList.List();
                    //var result = clrq.Fetch();

                    Console.WriteLine("Calendars: ");
                    foreach (CalendarListEntry calendar in result.Items)
                    {
                        Console.WriteLine("{0}", calendar.Id);
                        Console.WriteLine("\tAppointments:");
                        Google.Apis.Calendar.v3.EventsResource.ListRequest elr = service.Events.List(calendar.Id);
                        var events = elr.Fetch();
                        if (events.Items != null)
                        {
                            foreach (Event e in events.Items)
                            {
                                Console.WriteLine("\tSummary: {0}, Location: {1}", e.Summary, e.Location);
                                if (e.IsAllDayEvent())
                                {
                                    Console.WriteLine("\t\tAll Day: {0}", e.Start.GetDateTime().ToLongDateString());
                                }
                                else
                                {
                                    Console.WriteLine("\t\tFrom: {0}", e.Start.GetDateTime());
                                    Console.WriteLine("\t\tTo: {0}", e.End.GetDateTime());
                                }
                                if (e.Attendees != null)
                                {
                                    foreach (var att in e.Attendees)
                                    {
                                        Console.WriteLine("Attendee:\t\t\t{0}<{1}>", att.DisplayName, att.Email);
                                    }
                                }
                                Console.WriteLine();
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    log.DebugFormat("Error: {0}", ex.Message);
                }

                // Attempt to get free busy data.
                FreebusyResource.QueryRequest fbq = service.Freebusy.Query(new FreeBusyRequest());

                FreeBusyRequestItem c = new FreeBusyRequestItem();
                c.Id = "<your calendar id>";
                fbq.Body.Items = new List<FreeBusyRequestItem>();
                fbq.Body.Items.Add(c);
                fbq.Body.TimeZone = "Europe/London";
                fbq.Body.TimeMin = "2013-01-101T00:00:00.000Z";
                fbq.Body.TimeMax = "2013-01-301T00:00:00.000Z";

                // This call fails with global bad request
                var fbres = fbq.Fetch();

                Console.ReadKey();
            }
        }

        static internal class Extensions
        {
            static internal DateTime GetDateTime(this EventDateTime edt)
            {
                if (String.IsNullOrEmpty(edt.DateTime))
                {
                    if (String.IsNullOrEmpty(edt.Date))
                    {
                        return DateTime.MinValue;
                    }
                    else
                    {
                        return DateTime.Parse(edt.Date);
                    }
                }
                else
                {
                    return DateTime.Parse(edt.DateTime);
                }
            }

            static internal Boolean IsAllDayEvent(this Event e)
            {
                return (e.Start.DateTime == null && e.Start.Date != null);
            }
        }
    }

Original issue reported on code.google.com by apps.vi...@gmail.com on 10 Feb 2013 at 3:28

GoogleCodeExporter commented 9 years ago
try add ServiceAccountUser with user email for whom service account was created.

Original comment by nbso...@gmail.com on 6 Mar 2013 at 8:16

GoogleCodeExporter commented 9 years ago

Original comment by pele...@google.com on 13 Apr 2013 at 4:30