diff options
Diffstat (limited to 'apps/dav/src/service/CalendarService.js')
-rw-r--r-- | apps/dav/src/service/CalendarService.js | 117 |
1 files changed, 9 insertions, 108 deletions
diff --git a/apps/dav/src/service/CalendarService.js b/apps/dav/src/service/CalendarService.js index 10d3e252465..2b416d6b670 100644 --- a/apps/dav/src/service/CalendarService.js +++ b/apps/dav/src/service/CalendarService.js @@ -19,11 +19,13 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ import { getClient } from '../dav/client' -import ICAL from 'ical.js' import logger from './logger' import { parseXML } from 'webdav/dist/node/tools/dav' -import { getZoneString } from 'icalzone' -import { v4 as uuidv4 } from 'uuid' + +import { + slotsToVavailability, + vavailabilityToSlots, +} from '@nextcloud/calendar-availability-vue' /** * @@ -67,44 +69,7 @@ export async function findScheduleInboxAvailability() { return undefined } - const parsedIcal = ICAL.parse(availability) - - const vcalendarComp = new ICAL.Component(parsedIcal) - const vavailabilityComp = vcalendarComp.getFirstSubcomponent('vavailability') - - let timezoneId - const timezoneComp = vcalendarComp.getFirstSubcomponent('vtimezone') - if (timezoneComp) { - timezoneId = timezoneComp.getFirstProperty('tzid').getFirstValue() - } - - const availableComps = vavailabilityComp.getAllSubcomponents('available') - // Combine all AVAILABLE blocks into a week of slots - const slots = getEmptySlots() - availableComps.forEach((availableComp) => { - const start = availableComp.getFirstProperty('dtstart').getFirstValue().toJSDate() - const end = availableComp.getFirstProperty('dtend').getFirstValue().toJSDate() - const rrule = availableComp.getFirstProperty('rrule') - - if (rrule.getFirstValue().freq !== 'WEEKLY') { - logger.warn('rrule not supported', { - rrule: rrule.toICALString(), - }) - return - } - - rrule.getFirstValue().getComponent('BYDAY').forEach(day => { - slots[day].push({ - start, - end, - }) - }) - }) - - return { - slots, - timezoneId, - } + return vavailabilityToSlots(availability) } /** @@ -117,74 +82,10 @@ export async function saveScheduleInboxAvailability(slots, timezoneId) { day: dayId, })))] - const vcalendarComp = new ICAL.Component('vcalendar') - vcalendarComp.addPropertyWithValue('prodid', 'Nextcloud DAV app') - - // Store time zone info - // If possible we use the info from a time zone database - const predefinedTimezoneIcal = getZoneString(timezoneId) - if (predefinedTimezoneIcal) { - const timezoneComp = new ICAL.Component(ICAL.parse(predefinedTimezoneIcal)) - vcalendarComp.addSubcomponent(timezoneComp) - } else { - // Fall back to a simple markup - const timezoneComp = new ICAL.Component('vtimezone') - timezoneComp.addPropertyWithValue('tzid', timezoneId) - vcalendarComp.addSubcomponent(timezoneComp) - } - - // Store availability info - const vavailabilityComp = new ICAL.Component('vavailability') - - // Deduplicate by start and end time - const deduplicated = all.reduce((acc, slot) => { - const key = [ - slot.start.getHours(), - slot.start.getMinutes(), - slot.end.getHours(), - slot.end.getMinutes(), - ].join('-') - - return { - ...acc, - [key]: [...(acc[key] ?? []), slot], - } - }, {}) - - // Create an AVAILABILITY component for every recurring slot - Object.keys(deduplicated).map(key => { - const slots = deduplicated[key] - const start = slots[0].start - const end = slots[0].end - // Combine days but make them also unique - const days = slots.map(slot => slot.day).filter((day, index, self) => self.indexOf(day) === index) - - const availableComp = new ICAL.Component('available') - - // Define DTSTART and DTEND - const startTimeProp = availableComp.addPropertyWithValue('dtstart', ICAL.Time.fromJSDate(start, false)) - startTimeProp.setParameter('tzid', timezoneId) - const endTimeProp = availableComp.addPropertyWithValue('dtend', ICAL.Time.fromJSDate(end, false)) - endTimeProp.setParameter('tzid', timezoneId) - - // Add mandatory UID - availableComp.addPropertyWithValue('uid', uuidv4()) - - // TODO: add optional summary - - // Define RRULE - availableComp.addPropertyWithValue('rrule', { - freq: 'WEEKLY', - byday: days, - }) - - return availableComp - }).map(vavailabilityComp.addSubcomponent.bind(vavailabilityComp)) + const vavailability = slotsToVavailability(all, timezoneId) - vcalendarComp.addSubcomponent(vavailabilityComp) logger.debug('New availability ical created', { - asObject: vcalendarComp, - asString: vcalendarComp.toString(), + vavailability, }) const client = getClient('calendars') @@ -194,7 +95,7 @@ export async function saveScheduleInboxAvailability(slots, timezoneId) { <x0:propertyupdate xmlns:x0="DAV:"> <x0:set> <x0:prop> - <x1:calendar-availability xmlns:x1="urn:ietf:params:xml:ns:caldav">${vcalendarComp.toString()}</x1:calendar-availability> + <x1:calendar-availability xmlns:x1="urn:ietf:params:xml:ns:caldav">${vavailability}</x1:calendar-availability> </x0:prop> </x0:set> </x0:propertyupdate>`, |