forked from aksdb/CalAnonSync
Implemented create and delete sync logic
This commit is contained in:
parent
0209309bac
commit
f71ec34f48
|
@ -1,7 +1,6 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"log"
|
"log"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
@ -12,28 +11,78 @@ func main() {
|
||||||
e := NewEWSCalendar(s.EWS.URL, s.EWS.Username, s.EWS.Password)
|
e := NewEWSCalendar(s.EWS.URL, s.EWS.Username, s.EWS.Password)
|
||||||
id, err := e.getCalendarFolderID()
|
id, err := e.getCalendarFolderID()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Fatalln(err)
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
items, err := e.getCalendarItems(id, time.Now().AddDate(0, -1, 0), time.Now().AddDate(0, 2, 0))
|
items, err := e.getCalendarItems(id,
|
||||||
|
time.Now().AddDate(0, -1, 0), // One month past
|
||||||
|
time.Now().AddDate(0, 2, 0)) // Two months ahead
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Fatalln(err)
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
relevantEWSItems := make(map[string]CalendarItem)
|
||||||
|
|
||||||
for _, item := range items {
|
for _, item := range items {
|
||||||
fmt.Printf("%#v\n", item)
|
// Ignore private items.
|
||||||
|
if item.Sensitivity != "Private" {
|
||||||
|
// None-private items though ... remember them by hash.
|
||||||
|
// The hash will equal the CalDAV UID (and its filename).
|
||||||
|
relevantEWSItems[item.Hash()] = item
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
c := NewCalDAV(s.CalDAV)
|
c := NewCalDAV(s.CalDAV)
|
||||||
calDavItems, err := c.GetEvents()
|
calDavItems, err := c.GetEvents()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Fatalln(err)
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
// Build a map for easier lookup by UID
|
||||||
|
calDavItemMap := make(map[string]CalDAVItem)
|
||||||
for _, item := range calDavItems {
|
for _, item := range calDavItems {
|
||||||
fmt.Printf("%s\n UID: %s\n Summary: %s\n Start: %s\n End: %s\n",
|
calDavItemMap[item.UID()] = item
|
||||||
item.HRef, item.UID(), item.Summary(), item.Start(), item.End())
|
}
|
||||||
|
|
||||||
|
// First step: find items that were changed or that were removed
|
||||||
|
// and update the CalDAV side accordingly.
|
||||||
|
for uid, calDavItem := range calDavItemMap {
|
||||||
|
if ewsItem, ok := relevantEWSItems[uid]; ok {
|
||||||
|
// Good, so we still know the item at least.
|
||||||
|
if !ewsItem.Start.Equal(calDavItem.Start()) ||
|
||||||
|
!ewsItem.End.Equal(calDavItem.End()) {
|
||||||
|
|
||||||
|
// So times have changed. Update.
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Oops, seems the item vanished.
|
||||||
|
err := c.DeleteItem(calDavItem)
|
||||||
|
if err == nil {
|
||||||
|
log.Printf("Deleted item %s (%s)\n", calDavItem.UID(), calDavItem.Summary())
|
||||||
|
} else {
|
||||||
|
// Not fatal, but worth a note.
|
||||||
|
log.Println(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find items we don't know so far and create them.
|
||||||
|
for uid, ewsItem := range relevantEWSItems {
|
||||||
|
if _, ok := calDavItemMap[uid]; !ok {
|
||||||
|
title := s.Anonymize.Title
|
||||||
|
if title == "" {
|
||||||
|
// No anonymization? Fine.
|
||||||
|
title = ewsItem.Subject
|
||||||
|
}
|
||||||
|
ical := CreateICal(ewsItem.Hash(), title, ewsItem.Start, ewsItem.End)
|
||||||
|
calDavItem := CalDAVItem{HRef: uid + ".ics", ICal: ical}
|
||||||
|
|
||||||
|
err := c.UploadItem(calDavItem)
|
||||||
|
if err == nil {
|
||||||
|
log.Printf("Created item %s (%s)\n", uid, ewsItem.Subject)
|
||||||
|
} else {
|
||||||
|
log.Println(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -174,7 +174,7 @@ func NewCalDAV(settings ServerSettings) *CalDAV {
|
||||||
|
|
||||||
type CalDAVItem struct {
|
type CalDAVItem struct {
|
||||||
HRef string
|
HRef string
|
||||||
ICal
|
*ICal
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *CalDAV) GetEvents() ([]CalDAVItem, error) {
|
func (c *CalDAV) GetEvents() ([]CalDAVItem, error) {
|
||||||
|
@ -199,7 +199,7 @@ func (c *CalDAV) GetEvents() ([]CalDAVItem, error) {
|
||||||
|
|
||||||
result := make([]CalDAVItem, 0, len(ms.Response))
|
result := make([]CalDAVItem, 0, len(ms.Response))
|
||||||
for _, p := range ms.Response {
|
for _, p := range ms.Response {
|
||||||
item := CalDAVItem{p.HRef, p.PropStat.Prop.CalendarData}
|
item := CalDAVItem{p.HRef, &p.PropStat.Prop.CalendarData}
|
||||||
result = append(result, item)
|
result = append(result, item)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue