forked from aksdb/CalAnonSync
Implemented ICal update
This commit is contained in:
parent
e3c64211e0
commit
26d0cd400a
|
@ -10,6 +10,7 @@ import (
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
"text/template"
|
"text/template"
|
||||||
"time"
|
"time"
|
||||||
|
@ -73,6 +74,31 @@ func (i ICal) getTimeField(f string) time.Time {
|
||||||
return time.Time{}
|
return time.Time{}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var fieldMatch = regexp.MustCompile(`^(\w+)[;:]`)
|
||||||
|
|
||||||
|
// Update the ical structure with a new start/end time (and the
|
||||||
|
// timestamp of the last modification).
|
||||||
|
func (ical *ICal) Update(newStart, newEnd time.Time) {
|
||||||
|
for i, line := range ical.eventData {
|
||||||
|
match := fieldMatch.FindStringSubmatch(line)
|
||||||
|
if match == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// For last modification
|
||||||
|
now := time.Now().UTC()
|
||||||
|
|
||||||
|
switch match[1] {
|
||||||
|
case "DTSTART":
|
||||||
|
ical.eventData[i] = "DTSTART:" + newStart.UTC().Format(ICAL_TIME) + "Z"
|
||||||
|
case "DTEND":
|
||||||
|
ical.eventData[i] = "DTEND:" + newEnd.UTC().Format(ICAL_TIME) + "Z"
|
||||||
|
case "DTSTAMP", "LAST-MODIFIED":
|
||||||
|
ical.eventData[i] = match[1] + ":" + now.Format(ICAL_TIME) + "Z"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Retrieve the start time of the event.
|
// Retrieve the start time of the event.
|
||||||
func (i ICal) Start() time.Time {
|
func (i ICal) Start() time.Time {
|
||||||
return i.getTimeField("DTSTART")
|
return i.getTimeField("DTSTART")
|
||||||
|
|
|
@ -73,6 +73,68 @@ func TestParseICal(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestICal_Update(t *testing.T) {
|
||||||
|
newStart := time.Date(2019, 10, 05, 10, 25, 0, 0, time.UTC)
|
||||||
|
newEnd := time.Date(2019, 10, 05, 10, 55, 30, 0, time.UTC)
|
||||||
|
|
||||||
|
t.Run("Values updated", func(t *testing.T) {
|
||||||
|
ical, _ := ParseICal(strings.NewReader(icsSimple))
|
||||||
|
ical.Update(newStart, newEnd)
|
||||||
|
|
||||||
|
if ical.Start() != newStart {
|
||||||
|
t.Error("Start not updated correctly")
|
||||||
|
}
|
||||||
|
if ical.End() != newEnd {
|
||||||
|
t.Error("End not updated correctly")
|
||||||
|
}
|
||||||
|
|
||||||
|
if ical.getTimeField("DTSTAMP").Sub(time.Now()) > 5*time.Second {
|
||||||
|
t.Error("Timestamp doesn't seem to be updated")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
t.Run("Other values untouched", func(t *testing.T) {
|
||||||
|
// Use a ICal structure with dummy/unknown fields but also without
|
||||||
|
// DTSTAMP or LAST-MODIFIED, so we can do a string comparison against
|
||||||
|
// known values.
|
||||||
|
ical, _ := ParseICal(strings.NewReader(`BEGIN:VCALENDAR
|
||||||
|
PRODID:-//some//thing//EN
|
||||||
|
VERSION:2.0
|
||||||
|
UNKNOWN:FIELD
|
||||||
|
SOME;MORE:STUFF
|
||||||
|
BEGIN:VEVENT
|
||||||
|
UID:WHATEVERID
|
||||||
|
SUMMARY:Summary
|
||||||
|
CLASS:PUBLIC
|
||||||
|
DTSTART:20180308T113000Z
|
||||||
|
DTEND:20180308T130000Z
|
||||||
|
CREATED:20180401T182238Z
|
||||||
|
END:VEVENT
|
||||||
|
EVEN;MORE:STUFF
|
||||||
|
END:VCALENDAR`))
|
||||||
|
|
||||||
|
ical.Update(newStart, newEnd)
|
||||||
|
|
||||||
|
if ical.String() != `BEGIN:VCALENDAR
|
||||||
|
PRODID:-//some//thing//EN
|
||||||
|
VERSION:2.0
|
||||||
|
UNKNOWN:FIELD
|
||||||
|
SOME;MORE:STUFF
|
||||||
|
BEGIN:VEVENT
|
||||||
|
UID:WHATEVERID
|
||||||
|
SUMMARY:Summary
|
||||||
|
CLASS:PUBLIC
|
||||||
|
DTSTART:20191005T102500Z
|
||||||
|
DTEND:20191005T105530Z
|
||||||
|
CREATED:20180401T182238Z
|
||||||
|
END:VEVENT
|
||||||
|
EVEN;MORE:STUFF
|
||||||
|
END:VCALENDAR` {
|
||||||
|
|
||||||
|
t.Error("The resulting ICS seems wrong.")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
const icsWithTZ = `BEGIN:VCALENDAR
|
const icsWithTZ = `BEGIN:VCALENDAR
|
||||||
PRODID:-//Ximian//NONSGML Evolution Calendar//EN
|
PRODID:-//Ximian//NONSGML Evolution Calendar//EN
|
||||||
VERSION:2.0
|
VERSION:2.0
|
||||||
|
|
Loading…
Reference in New Issue