golangで、 google calendar api v3 を使ってカレンダーにイベントの登録と更新を行う


概要
====


[前回](http://qiita.com/yamasaki-masahide/items/f4eb7cd17a9ea1fe5467)の続きです。
前回は、Client IDの取得とOAuth認証でアクセストークンを取得と、CalendarListまでを行いました。
今回は、イベントの新規登録と更新を行います。


Event構造体
=======

Event構造体を用意してEvents.Insertで登録します。
Event構造体は以下のように定義する事で繰り返しイベント等も登録できるようです。

```go:Event構造体
import "code.google.com/p/google-api-go-client/calendar/v3"

    event := calendar.Event{
        Id:      "123456abcdef", // ID(適当なstring)
        Summary: "test test",  // タイトル
        Start: &calendar.EventDateTime{
            DateTime: `2014-07-15T12:30:00+09:00`, //開始日時
            TimeZone: "Asia/Tokyo",
        },
        End: &calendar.EventDateTime{
            DateTime: `2014-07-15T13:00:00+09:00`, //終了日時
            TimeZone: "Asia/Tokyo",
        },
        Recurrence: []string{  // 繰り返しの指定(繰り返さない場合は定義不要)
            "RRULE:FREQ=DAILY;BYDAY=MO,TU,WE,TH,FR;UNTIL=20140801T000000Z", // 平日の月〜金、終了日が2014/08/01の00:00
            "EXDATE:20140716T123000", // 例外日時1(※繰り返しから例外日を指定したい場合)
            "EXDATE:20140717T123000", // 例外日時2
        },
    }
```
ここで最低限必要なのは```Summary```、```Start:```と```End:```なのかな。それ以外は不要なら省略すればよい。他にもいろいろあります[godocのEvent](https://godoc.org/code.google.com/p/google-api-go-client/calendar/v3#Event)に載ってます。

Eventの登録、更新
===============


実際の登録やら更新処理ですが、
また後でテストしやすいようにinterfaceにして、カレンダー操作メソッドをラップします。

```go:google-clender.go
package lib

import (
	"net/http"

	"code.google.com/p/google-api-go-client/calendar/v3"
)


type Calendar interface {
	Get(string) (*calendar.Event, error)
	Insert(*calendar.Event) (*calendar.Event, error)
	Update(string, *calendar.Event) (*calendar.Event, error)
}

type GoogleCalendar struct {
	calendarId string
	svc        *calendar.Service
}

func NewGoogleCalendar(client *http.Client, calendarId string) *GoogleCalendar {
	this := &GoogleCalendar{}
	this.svc, _ = calendar.New(client)
	this.calendarId = calendarId
	return this
}
func (this *GoogleCalendar) Get(id string) (*calendar.Event, error) {
	return this.svc.Events.Get(this.calendarId, id).Do()
}
func (this *GoogleCalendar) Insert(event *calendar.Event) (*calendar.Event, error) {
	return this.svc.Events.Insert(this.calendarId, event).Do()
}
func (this *GoogleCalendar) Update(id string, event *calendar.Event) (*calendar.Event, error) {
	return this.svc.Events.Update(this.calendarId, id, event).Do()
}
func (this *GoogleCalendar) List() (*calendar.Events, error) {
	return this.svc.Events.List(this.calendarId).Do()
}
func (this *GoogleCalendar) ClendarList() (*calendar.CalendarList, error) {
	return this.svc.CalendarList.List().Do()
}

```

Oauthで、transportに認証トークンを取得のは[前回](http://qiita.com/yamasaki-masahide/items/f4eb7cd17a9ea1fe5467#2-5)のコードのままです。

```go:main.go

	// OAuthを実行
    err = lib.GoogleOauth(&lib.GoogleToken{&transport}, lib.LocalServerConfig{port, 30, runtime.GOOS})
    if err != nil {
        log.Fatalf("Error Server: %v", err)
        return
    }	

	googleCalendar := lib.NewGoogleCalendar(transport.Client(), "カレンダーID")

	// 新規登録
    event := calendar.Event{
        Id:      "123456abcdef", // ID(適当なstring)
        Summary: "test test",  // タイトル
        Start: &calendar.EventDateTime{
            DateTime: `2014-07-15T12:30:00+09:00`, //開始日時
            TimeZone: "Asia/Tokyo",
        },
        End: &calendar.EventDateTime{
            DateTime: `2014-07-15T13:00:00+09:00`, //終了日時
            TimeZone: "Asia/Tokyo",
        },
        Recurrence: []string{  // 繰り返しの指定(繰り返さない場合は定義不要)
            "RRULE:FREQ=DAILY;BYDAY=MO,TU,WE,TH,FR;UNTIL=20140801T000000Z", // 平日の月〜金、終了日が2014/08/01の00:00
            "EXDATE:20140716T123000", // 例外日時1(※繰り返しから例外日を指定したい場合)
            "EXDATE:20140717T123000", // 例外日時2
        },
    }
	
	ret, err := googleCalendar.Insert(&event) // 新規登録
	if err != nil {
		log.Fatalf("Error calendar.InsertEvent: %v", err)
		return
	}
	pretty.Printf("Insertevnet: %# v\n", ret)

	// 更新処理
    event2 := calendar.Event{
        Summary: "test test",
        Start: &calendar.EventDateTime{
            DateTime: `2014-07-15T12:30:00+09:00`,
            TimeZone: "Asia/Tokyo",
        },
        End: &calendar.EventDateTime{
            DateTime: `2014-07-15T13:00:00+09:00`,
            TimeZone: "Asia/Tokyo",
        },
        Recurrence: []string{
            "RRULE:FREQ=WEEKLY;UNTIL=20140801T000000Z",  // 繰り返しを週1回に
            "EXDATE:20140722T123000",  // 例外日時
        },
    }
	ret, err := googleCalendar.Update("123456abcdef",&event2)  // Idを指定して更新
	if err != nil {
		log.Fatalf("Error calendar.UpdateEvent: %v", err)
		return
	}
	pretty.Printf("Updateevnet: %# v\n", ret)

```