From ac85779f3b67ffc2953c17d0824be62b1f0acc86 Mon Sep 17 00:00:00 2001 From: Tim Schiewe Date: Mon, 30 Apr 2018 19:18:46 +0200 Subject: Implement interface/config based infrastructure Fixes #2 --- src/sinks/IcalSink.ts | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/sinks/IcalSink.ts (limited to 'src/sinks/IcalSink.ts') diff --git a/src/sinks/IcalSink.ts b/src/sinks/IcalSink.ts new file mode 100644 index 0000000..efb94ac --- /dev/null +++ b/src/sinks/IcalSink.ts @@ -0,0 +1,46 @@ +import {createHash} from 'crypto'; +import {writeFile} from 'fs'; + +import * as ical from 'ical-generator'; + +import {ISink} from './ISink'; +import {IEvent} from '../core/IEvent'; + + +const sha256 = (x) => createHash('sha256').update(x, 'utf8').digest('hex'); + + +// ref. https://www.npmjs.com/package/ical-generator +export class IcalSink implements ISink { + private _cal = ical(); + private _targetFile: string; + + constructor(targetFile: string) { + this._targetFile = targetFile; + } + + createEvent(event: IEvent): Promise { + // TODO better duplicate detection and resolve conflicts lol + const eventId = sha256(JSON.stringify(event)).substr(0, 16); + + const icalEvent = this._cal.createEvent({ + uid: eventId, + start: event.start.toISOString(), + end: event.end.toISOString(), + timestamp: new Date(), + summary: event.summary, + description: event.description, + }); + + return Promise.resolve(); + } + + commit(): Promise { + return new Promise((resolve, reject) => { + writeFile(this._targetFile, this._cal.toString(), err => { + if (err) return reject(err); + resolve(); + }); + }); + } +} -- cgit v1.3.1