src/app/replicator/fromDevice/event_importer.coffee
AndroidAccount = require "../fromDevice/android_account"
ChangeEventHandler = require "../change/change_event_handler"
async = require 'async'
CozyToAndroidEvent = require "../transformer/cozy_to_android_event"
AndroidCalendarHandler = require "../../lib/android_calendar_handler"
log = require('../../lib/persistent_log')
prefix: "EventImporter "
date: true
continueOnError = require('../../lib/utils').continueOnError log
Permission = require '../../lib/permission'
module.exports = class EventImporter
constructor: (@replicateDb, @calendarSync) ->
@replicateDb ?= app.init.database.replicateDb
@calendarSync ?= navigator.calendarsync
@cozyToAndroidEvent = new CozyToAndroidEvent()
@androidCalendarHandler = new AndroidCalendarHandler()
@changeEventHandler = new ChangeEventHandler()
@permission = new Permission()
synchronize: (callback) ->
success = =>
@calendarSync.dirtyEvents AndroidAccount.ACCOUNT, \
(err, androidEvents) =>
return log.error err if err
log.info "syncPhone2Pouch #{androidEvents.length} events."
async.eachSeries androidEvents, (androidEvent, cb) =>
@_change androidEvent, cb
, callback
@permission.checkPermission 'calendars', success, callback
_change: (androidEvent, callback) ->
log.debug "_change"
if androidEvent.deleted
@_delete androidEvent, continueOnError callback
else
@androidCalendarHandler.getById androidEvent.calendar_id, \
(err, androidCalendar) =>
return log.error err if err
if androidEvent._sync_id
@_update androidEvent, androidCalendar, \
continueOnError callback
else
@_create androidEvent, androidCalendar, \
continueOnError callback
# Create a new contact in app's pouchDB from newly created phone contact.
# @param phoneContact cordova contact format.
# @param retry retry lighter update after a failed one.
_create: (androidEvent, androidCalendar, callback) ->
log.debug "_create"
cozyEvent = @cozyToAndroidEvent.reverseTransform androidEvent, \
androidCalendar
@replicateDb.post cozyEvent, (err, response) =>
return callback err if err
androidEvent._sync_id = response.id
androidEvent.sync_data2 = response.rev
@calendarSync.undirtyEvent androidEvent, \
AndroidAccount.ACCOUNT, callback
# Update event in pouchDB with specified event from phone.
# @param androidEvent
# @param retry retry lighter update after a failed one.
_update: (androidEvent, androidCalendar, callback) ->
log.debug "_update"
@replicateDb.get androidEvent._sync_id, (err, cozyEvent) =>
return callback err if err
cozyEvent = @cozyToAndroidEvent.reverseTransform androidEvent, \
androidCalendar, cozyEvent
@replicateDb.put cozyEvent, (err, response) =>
return callback err if err
androidEvent.sync_data2 = response.rev
androidEvent.sync_data5 = cozyEvent.lastModified
@calendarSync.undirtyEvent androidEvent, \
AndroidAccount.ACCOUNT, callback
# Delete the specified contact in app's pouchdb.
# @param phoneContact cordova contact format.
_delete: (androidEvent, callback) ->
log.debug "_delete"
cozyEvent =
docType: 'event'
_id: androidEvent._sync_id
_rev: androidEvent.sync_data2
_deleted: true
@replicateDb.put cozyEvent, (err, res) =>
return callback err if err
@changeEventHandler._delete cozyEvent, androidEvent, callback