#!/usr/bin/env node /** * Module dependencies. */ var app = require('../app'); var debug = require('debug')('myapp:server'); var http = require('http'); var jsonsrv = require('../lib/jsonsrv'); var pcalutils = require('../lib/pcalutils'); var jade = require('jade'); /** * Get port from environment and store in Express. */ var port = normalizePort(process.env.PORT || '3000'); app.set('port', port); /** * Create HTTP server */ var server = http.createServer(app); /** * Creatie socket.io */ var io = require('socket.io')(server); var sharedsession = require("express-socket.io-session"); io.use(sharedsession(app.locals.session, {autoSave: true})); function pentry_from_session(session, data) { if(typeof session.cache.days[data.day] === 'undefined') { console.log('pentry_from_session: day ', data.day, ' not defined!'); return null; } switch(data.pentrytype) { case "event": if(typeof session.cache.days[data.day].events[data.pentry] === 'undefined') { console.log('pentry_from_session: event ', data.pentry, ' not defined in day ', data.day, '!'); return null; } return session.cache.days[data.day].events[data.pentry]; case "tevent": if(typeof session.cache.days[data.day].events[data.parent_event] === 'undefined') { console.log('pentry_from_session: event ', data.parent_event, ' not defined in day ', data.day, '!'); return null; } if(typeof session.cache.days[data.day].events[data.parent_event].thereafter[data.pentry] === 'undefined') { console.log('pentry_from_session: thereafter ', data.pentry, ' of event ', data.parent_event, ' not defined in day ', data.day, '!'); return null; } return session.cache.days[data.day].events[data.parent_event].thereafter[data.pentry]; case "away": case "keep_in_mind": case "todo": case "vehicle_use": if(typeof session.cache.days[data.day][data.pentrytype][data.pentry] === 'undefined') { console.log('pentry_from_session: ', data.pentrytype, ' ', data.pentry, ' not defined in day ', data.day, '!'); return null; } return session.cache.days[data.day][data.pentrytype][data.pentry]; default: console.log('unknown pentry-type: ', data.pentrytype); return null; } console.log('pentry_from_session: no pentry-type found in data: ', data); return null; } function event_from_session(session, data) { return pentry_from_session(session, data); /*if(typeof session.cache.days[data.day] === 'undefined') { console.log('event_from_session: day ', data.day, ' not defined!'); return null; } if(typeof session.cache.days[data.day].events[data.event] === 'undefined') { console.log('event_from_session: event ', data.event, ' not defined in day ', data.day, '!'); return null; } if(data.pentrytype === "tevent") { if(typeof session.cache.days[data.day].events[data.event].thereafter[data.thereafter] === 'undefined') { console.log('event_from_session: thereafter ', data.thereafter, ' of event ', data.event, ' not defined in day ', data.day, '!'); return null; } return session.cache.days[data.day].events[data.event].thereafter[data.thereafter]; } return session.cache.days[data.day].events[data.event];*/ } function get_element_of_array_by_uid(array, uid) { for(idx in array) { if(array[idx].uid === uid) return array[idx]; } return null; } generateUID = function() { return ("000000" + (Math.random()*Math.pow(36,6) << 0).toString(36)).slice(-6) } function get_role_from_uid(event, uid) { return get_element_of_array_by_uid(event.involved_roles, uid); } function get_involved_from_event(event, role_uid) { if(role_uid !== '') { var role = get_role_from_uid(event, role_uid); if(role) return role.involved; else { console.log("WARNING: get_involved_from_event: Could not find role: " + role_uid); return null; } } return event.involved; } function remove_from_array_by_uid(array, uid) { var found = false; var idx; for(idx in array) { if(array[idx].uid === uid) { found = true; break; } } if(found) array.splice(idx, 1); return found; } function get_rendered_jsonerror(result, session) { var session_ended = false; if(result.result === "ERROR_invalid_session") { session.destroy(); session_ended = true; } messages = result.messages; if(session.messages) messages = messages.concat(session.messages); console.log(messages); if(messages.length === 0) messages.push({type: "danger", title: "Systemfehler", message: "Es wurde ein Fehler in der Verarbeitung festgestellt, aber keine Fehlermeldung erstellt."}); session.messages = []; return jade.renderFile('views/errorview_inlay.jade', { messages: messages, is_error: true, session_ended: session_ended}); } function get_rendered_jsonmessage(result, session) { messages = result.messages; if(session.messages) messages = messages.concat(session.messages); if(messages.length === 0) return ""; session.messages = []; return jade.renderFile('views/errorview_inlay.jade', { messages: messages, is_error: false, session_ended: false}); } function get_rendered_pcalmessage(message) { var messages = []; messages.push(message); return jade.renderFile('views/messageview_inlay.jade', { messages: messages }); } function get_rendered_error(error) { return jade.renderFile('views/error_inlay.jade', {message: error.message, error: error}); } function send_rendered_event(socket, data, event) { var is_thereafter = false; var event_href = "/event/" + data.day + "/" + data.pentry; if(data.pentrytype === "tevent") { is_thereafter = true; event_href = "/tevent/" + data.day + "/" + data.parent_event + "/" + data.pentry; } jade.renderFile('views/edit_event_main.jade', { date: socket.handshake.session.cache.days[data.day].date, event: event, event_href : event_href, is_thereafter : is_thereafter, parent_event : (is_thereafter ? socket.handshake.session.cache.days[data.day].events[data.parent_event] : {}), edit_type: (event.uuid.substr(0,4) === "new_" ? "erstellen" : "bearbeiten"), messages : data.messages, pcalview : data.pcalview }, function(error, html) { if(error) socket.emit('get_rendered_pentry_result', { result: "ERROR", html: get_rendered_error(error) }); else socket.emit('get_rendered_pentry_result', { result: "OK", html: html }); }); } function send_rendered_away(socket, data, away) { jade.renderFile('views/edit_away_main.jade', { date: socket.handshake.session.cache.days[data.day].date, away: away, away_href : "/away/" + data.day + "/" + data.pentry, edit_type: (away.uuid.substr(0,4) === "new_" ? "erstellen" : "bearbeiten"), messages : data.messages }, function(error, html) { if(error) socket.emit('get_rendered_pentry_result', { result: "ERROR", html: get_rendered_error(error) }); else socket.emit('get_rendered_pentry_result', { result: "OK", html: html }); }); } function send_rendered_keep_in_mind(socket, data, keep_in_mind) { jade.renderFile('views/edit_keep_in_mind_main.jade', { date: socket.handshake.session.cache.days[data.day].date, keep_in_mind: keep_in_mind, keep_in_mind_href : "/keep_in_mind/" + data.day + "/" + data.pentry, edit_type: (keep_in_mind.uuid.substr(0,4) === "new_" ? "erstellen" : "bearbeiten"), messages : data.messages }, function(error, html) { if(error) socket.emit('get_rendered_pentry_result', { result: "ERROR", html: get_rendered_error(error) }); else socket.emit('get_rendered_pentry_result', { result: "OK", html: html }); }); } function send_rendered_todo(socket, data, todo) { jade.renderFile('views/edit_todo_main.jade', { date: socket.handshake.session.cache.days[data.day].date, todo: todo, todo_href : "/todo/" + data.day + "/" + data.pentry, edit_type: (todo.uuid.substr(0,4) === "new_" ? "erstellen" : "bearbeiten"), messages : data.messages }, function(error, html) { if(error) socket.emit('get_rendered_pentry_result', { result: "ERROR", html: get_rendered_error(error) }); else socket.emit('get_rendered_pentry_result', { result: "OK", html: html }); }); } function send_rendered_vehicle_use(socket, data, vehicle_use) { jade.renderFile('views/edit_vehicle_use_main.jade', { date: socket.handshake.session.cache.days[data.day].date, vehicles : socket.handshake.session.cache.vehicles, vehicle_use : vehicle_use, vehicle_use_href : "/vehicle_use/" + data.day + "/" + data.pentry, edit_type: (vehicle_use.uuid.substr(0,4) === "new_" ? "erstellen" : "bearbeiten"), messages : data.messages }, function(error, html) { if(error) socket.emit('get_rendered_pentry_result', { result: "ERROR", html: get_rendered_error(error) }); else socket.emit('get_rendered_pentry_result', { result: "OK", html: html }); }); } function send_rendered_pentry(socket, data, pentry) { socket.handshake.session.save(); switch(data.pentrytype) { case "event": case "tevent": send_rendered_event(socket, data, pentry); break; case "away": send_rendered_away(socket, data, pentry); break; case "keep_in_mind": send_rendered_keep_in_mind(socket, data, pentry); break; case "todo": send_rendered_todo(socket, data, pentry); break; case "vehicle_use": send_rendered_vehicle_use(socket, data, pentry); break; default: console.log('send_rendered_pentry: unknown pentrytype: ', data.pentrytype); } } function init_emit_messages(data) { data.messages = { other : [], locations : [], involved : { primary: [] } } } io.on('connection',function(socket){ console.log('NEW WEBSOCKET-CONNECTION'); if(typeof socket.handshake.session.sessionuuid === 'undefined') { console.log('A socket with sessionID ' + socket.handshake.session.sessionuuid + ' connected!'); //return; // no furcer proceeding!!! socket.emit('invalid_session_data', {data: socket.handshake.session.sessionuuid}); } console.log('A socket with sessionID ' + socket.handshake.session.sessionuuid + ' connected!'); socket.on('day_goto', function(data) { var jsondata = { "request" : "get_parishday", "format" : "day", "date" : data.date, "sessionuuid" : socket.handshake.session.sessionuuid }; jsonsrv.do_jsonsrv2(jsondata, function(result) { if(result.result === "OK" || result.result === "OK_invalid_date") { var params = pcalutils.do_day_renderparams_from_result(result, socket.handshake.session); jade.renderFile('views/daycontent.jade', params, function(error, html) { if(error) { socket.emit('day_goto_result', { result: "ERROR", html: get_rendered_error(error), date: result.date.date }); } else socket.emit('day_goto_result', { result: "OK", html: html, date: result.date.date }); }); } else socket.emit('day_goto_result', { result: "ERROR", html: get_rendered_jsonerror(result, socket.handshake.session), date: data.date }); }, function(error) { socket.emit('day_goto_result', { result: "ERROR", html: get_rendered_error(error), date: data.date });; }); }); /*socket.on('day_goto_timeline', function(data) { var jsondata = { "request" : "get_parishday", "format" : "timeline", "date" : data.date, "sessionuuid" : socket.handshake.session.sessionuuid }; console.log(data); jsonsrv.do_jsonsrv2(jsondata, function(result) { if(result.result === "OK" || result.result === "OK_invalid_date") { var params = pcalutils.do_day_renderparams_from_result(result, socket.handshake.session); jade.renderFile('views/timelinecontent.jade', params, function(error, html) { if(error) { socket.emit('day_goto_result', { result: "ERROR", html: get_rendered_error(error), date: result.date.date, scrollto: '' }); } else socket.emit('day_goto_result', { result: "OK", html: html, date: result.date.date, scrollto: data.scrollto }); }); } else socket.emit('day_goto_result', { result: "ERROR", html: get_rendered_jsonerror(result, socket.handshake.session), date: data.date, scrollto: '' }); }, function(error) { socket.emit('day_goto_result', { result: "ERROR", html: get_rendered_error(error), date: data.date, scrollto: '' });; }); }); socket.on('day_goto_pastoralteam', function(data) { var jsondata = { "request" : "get_parishday", "format" : "pastoralteam", "date" : data.date, "sessionuuid" : socket.handshake.session.sessionuuid }; console.log(data); jsonsrv.do_jsonsrv2(jsondata, function(result) { if(result.result === "OK" || result.result === "OK_invalid_date") { var params = pcalutils.do_day_renderparams_from_result(result, socket.handshake.session); jade.renderFile('views/pastoralteamcontent.jade', params, function(error, html) { if(error) { socket.emit('day_goto_result', { result: "ERROR", html: get_rendered_error(error), date: result.date.date, scrollto: '' }); } else socket.emit('day_goto_result', { result: "OK", html: html, date: result.date.date, scrollto: data.scrollto }); }); } else socket.emit('day_goto_result', { result: "ERROR", html: get_rendered_jsonerror(result, socket.handshake.session), date: data.date, scrollto: '' }); }, function(error) { socket.emit('day_goto_result', { result: "ERROR", html: get_rendered_error(error), date: data.date, scrollto: '' });; }); });*/ socket.on('day_show_event', function(data) { var jsondata = { "request" : "event_details", "sessionuuid" : socket.handshake.session.sessionuuid, "date" : data.date, "event" : data.event }; jsonsrv.do_jsonsrv2(jsondata, function(result) { if(result.result === "OK") jade.renderFile("views/timeline_eventdetails.jade", { date: result.date, litinfo: result.litinfo, event: result.event }, function(error, html) { if(error) { socket.emit('day_show_event_result', { result: "ERROR", html: get_rendered_error(error), date: result.date.date, event: data.event }); } else socket.emit('day_show_event_result', { result: "OK", html: html, date: result.date.date, event: data.event }); }); else socket.emit('day_show_event_result', { result: "ERROR", html: get_rendered_jsonerror(result, socket.handshake.session), date: data.date, event: data.event }); }, function(error) { socket.emit('day_show_event_result', { result: "ERROR", html: get_rendered_error(error), date: data.date, event: data.event });; }); }); socket.on('week_goto', function(data) { var jsondata = { "request" : "get_parishweek", "date" : data.basedate, "sessionuuid" : socket.handshake.session.sessionuuid }; jsonsrv.do_jsonsrv2(jsondata, function(result) { if(result.result === "OK" || result.result === "OK_invalid_date") { var params = pcalutils.do_week_renderparams_from_result(result, socket.handshake.session); jade.renderFile('views/weekcontent.jade', params, function(error, html) { if(error) { socket.emit('week_goto_result', { result: "ERROR", html: get_rendered_error(error), basedate: result.basedate }); } else socket.emit('week_goto_result', { result: "OK", html: html, basedate: result.basedate }); }); } else socket.emit('week_goto_result', { result: "ERROR", html: get_rendered_jsonerror(result, socket.handshake.session), basedate: data.date }); }, function(error) { socket.emit('week_goto_result', { result: "ERROR", html: get_rendered_error(error), basedate: data.date });; }); }); socket.on('tevent_move_updown', function(data) { var jsondata = { "request" : "move_thereafterevent_updown", "sessionuuid" : socket.handshake.session.sessionuuid, "date" : data.date, "event" : data.event, "thereafter" : data.tevent, "updown" : data.updown }; jsonsrv.do_jsonsrv2(jsondata, function(result) { if(result.result === "OK") socket.emit('tevent_move_updown_result', { result: "OK" }); else socket.emit('tevent_move_updown_result', { result: "ERROR" }); }, function(error){console.log('ERROR: ', error);}); console.log(data); }); socket.on('tevent_delete', function(data) { console.log('tevent_delete: ', data); var jsondata = { "request" : "delete_thereafter", "sessionuuid" : socket.handshake.session.sessionuuid, "date" : data.date, "event" : data.event, "thereafter" : data.tevent }; jsonsrv.do_jsonsrv2(jsondata, function(result) { if(result.result === "OK") socket.emit('tevent_delete_result', { result: "OK", event: data.event, tevent: data.tevent }); else socket.emit('tevent_delete_result', { result: "ERROR", event: data.event, tevent: data.tevent }); }, function(error){console.log('ERROR: ', error);}); }); socket.on('event_delete', function(data) { console.log('tevent_delete: ', data); var jsondata = { "request" : "delete_thereafter", "sessionuuid" : socket.handshake.session.sessionuuid, "date" : data.date, "event" : data.event }; jsonsrv.do_jsonsrv2(jsondata, function(result) { if(result.result === "OK") socket.emit('tevent_delete_result', { result: "OK", event: data.event, tevent: data.tevent }); else socket.emit('tevent_delete_result', { result: "ERROR", event: data.event, tevent: data.tevent }); }, function(error){console.log('ERROR: ', error);}); }); socket.on('pentry_delete', function(data) { console.log('pentry_delete: ', data); var jsondata = { "request" : "pentry_delete", "sessionuuid" : socket.handshake.session.sessionuuid, "date" : data.date, "pentrytype" : data.pentrytype, "uuid" : data.uuid }; jsonsrv.do_jsonsrv2( jsondata, function(result) { var resultdata = { uuid: data.uuid, pentrytype: data.pentrytype, date: data.date }; if(result.result === "OK") { resultdata.result = "OK"; resultdata.message = get_rendered_jsonmessage(result, socket.handshake.session); } else { resultdata.result = "ERROR"; resultdata.message = get_rendered_jsonerror(result, socket.handshake.session); } socket.emit('pentry_delete_result', resultdata); }, function(error) { socket.emit('pentry_delete_result', {result: "ERROR", message: get_rendered_error(error)}); }); }); socket.on('get_rendered_event', function(data) { console.log('get_rendered_event') init_emit_messages(data); var event = pentry_from_session(socket.handshake.session, data); send_rendered_event(socket, data, event); }); socket.on('get_rendered_away', function(data) { init_emit_messages(data); var away = pentry_from_session(socket.handshake.session, data); send_rendered_away(socket, data, away); }); socket.on('get_rendered_keep_in_mind', function(data) { init_emit_messages(data); var keep_in_mind = pentry_from_session(socket.handshake.session, data); send_rendered_keep_in_mind(socket, data, keep_in_mind); }); socket.on('get_rendered_todo', function(data) { init_emit_messages(data); var todo = pentry_from_session(socket.handshake.session, data); send_rendered_todo(socket, data, todo); }); socket.on('get_rendered_vehicle_use', function(data) { init_emit_messages(data); var vehicle_use = pentry_from_session(socket.handshake.session, data); send_rendered_vehicle_use(socket, data, vehicle_use); }); socket.on('render_pastoralunitselector', function(data) { var jsondata = { "request" : "get_all_pastoralunits", "sessionuuid" : socket.handshake.session.sessionuuid }; jsonsrv.do_jsonsrv2(jsondata, function(result) { if(result.result === "OK") { var event = pentry_from_session(socket.handshake.session, data); var html = jade.renderFile("./views/pastoralunitselector_inlay.jade", { actual_punit_dn : event.punit.dn, actual_punit_name: event.punit.name, pastoralunits: result.pastoralunits }); socket.emit('render_pastoralunitselector_result', { result: "OK", html: html}); } else socket.emit('render_pastoralunitselector_result', { result: "ERROR", html: ""}); }, function(error){console.log('ERROR: ', error);}); }); socket.on('pentry_set_pastoralunit', function(data) { console.log(data); var pentry = pentry_from_session(socket.handshake.session, data); init_emit_messages(data); if(pentry) { pentry.punit.dn = data.data.punit.dn; pentry.punit.name = data.data.punit.name; data.messages.other.push({ type: "success", title: "Kontext erfolgreich geändert", message: "Der Kontext wurde erfolgreich auf '" + data.data.punit.name + "' geändert." }); } else data.messages.other.push({ type: "danger", title: "Kalendereintrag nicht gefunden", message: "Konnte keinen Kalendereintrag zu dieser Bearbeitung finden. Schwerer Fehler!" }); send_rendered_pentry(socket, data, pentry); }); socket.on('render_locationselector', function(data) { var jsondata = { "request" : "get_all_predefined_locations", "sessionuuid": socket.handshake.session.sessionuuid, "omitt" : [] }; var event = pentry_from_session(socket.handshake.session, data); for(idx in event.locations) { var loc = event.locations[idx]; if(loc.id != "other") jsondata.omitt.push(loc.id); } jsonsrv.do_jsonsrv2(jsondata, function(result) { if(result.result === "OK") { var html = jade.renderFile("views/locationselector_inlay.jade", { pentry_edit_base: "PENTRYBASE", units: result.locations }); socket.emit('render_locationselector_result', { result: "OK", html: html}); } else socket.emit('render_locationselector_result', { result: "ERROR", html: ""}); }, function(error) { console.log(error); }); }); socket.on('render_actorselector', function(data) { var jsondata = { "request" : "get_all_actors", "sessionuuid" : socket.handshake.session.sessionuuid, "omitt" : [], "date" : data.day, "pentry" : data.pentry }; var role = ''; var pentry = pentry_from_session(socket.handshake.session, data); if(data.pentrytype !== "away") { var the_involved = pentry.involved; if(data.pentrytype === "event" || data.pentrytype === "tevent") { role = data.data.role; console.log('ADD ACTOR FOR ROLE '+role); the_involved = get_involved_from_event(pentry, role); } for(a in the_involved) { var actor = the_involved[a]; if(actor.id !== "other" && actor.id !== "dn") jsondata.omitt.push(actor.id); } } jsonsrv.do_jsonsrv2(jsondata, function(result) { if(result.result === "OK") { var renderdata = { units: result.actors, for_role: role }; if(data.pentrytype === "away") { renderdata.actual_actor_id = data.data.actual_actor_id; renderdata.actual_actor_name = data.data.actual_actor_name; } var html = jade.renderFile("./views/actorselector_inlay.jade", renderdata); socket.emit('render_actorselector_result', {result: "OK", html: html}); } else socket.emit('render_actorselector_result', {result: "ERROR", html: ""}); }, function(error) { console.log(error); }); }); socket.on('render_parishdbpersongroupselector', function(data) { var jsondata = { "request" : "get_parishdbelems_flat", "sessionuuid" : socket.handshake.session.sessionuuid }; var role = ''; if(data.pentrytype === "event" || data.pentrytype === "tevent") { role = data.data.role; console.log('ADD ACTOR FOR ROLE '+role); } jsonsrv.do_jsonsrv2(jsondata, function(result) { if(result.result === "OK") { for(idx in result.parishdb) { result.parishdb[idx].uid = generateUID(); if(result.parishdb[idx].type === "group") { for(midx in result.parishdb[idx].members) result.parishdb[idx].members[midx].uid = generateUID(); } } jade.renderFile('./views/parishdbpersongroupselector_inlay.jade', { parishdb: result.parishdb, for_role: role }, function(error, html) { if(error) { socket.emit('render_parishdbpersongroupselector_result', { result: "ERROR", html: get_rendered_error(error) }); } else socket.emit('render_parishdbpersongroupselector_result', { result: "OK", html: html }); }); } else socket.emit('render_parishdbpersongroupselector_result', {result: "ERROR", html: ""}); }, function(error) { console.log(error); }); }); socket.on('render_locationeditor', function(data) { var pentry = pentry_from_session(socket.handshake.session, data); console.log(data); console.log(pentry.locations); if(data.data.type === 'edit') { location_uid = data.data.location; location = get_element_of_array_by_uid(pentry.locations, location_uid); } else location = { name:"", sign:"", uid:""}; console.log(location); var html = jade.renderFile("./views/locationeditor_inlay.jade", { type: data.data.type, location: location }); socket.emit('render_locationeditor_result', {result: "OK", html: html}); }); socket.on('render_involvededitor', function(data) { var role = ''; var pentry = pentry_from_session(socket.handshake.session, data); var the_involved = pentry.involved; if(data.pentrytype === "event" || data.pentrytype === "tevent") { role = data.data.role; console.log('ADD/EDIT FOR ROLE '+role); the_involved = get_involved_from_event(pentry, role); } var involved = {}; if(data.data.type === 'edit') { involved_uid = data.data.involved; involved = get_element_of_array_by_uid(the_involved, involved_uid); } else involved = { group:"", forename:"", surname:"", street:"", street_nr:"", postalcode:"", location:"", email:"", telephonenumber:"", uid:""}; var html = jade.renderFile("./views/involvededitor_inlay.jade", { type: data.data.type, involved: involved, for_role: role }); socket.emit('render_involvededitor_result', {result: "OK", html: html}); }); function add_edit_involved(type, data) { var pentry = pentry_from_session(socket.handshake.session, data); init_emit_messages(data); if(pentry) { if(data.pentrytype === "away") { // special treatment here! pentry.name = data.data.involved.name; pentry.involveddb_id = data.data.involved.id; data.messages.involved['primary'].push({ type: "success", title: "Abwesende Person gesetzt", message: "'" + data.data.involved.name + "' wurde erfolgreich als abwesend gesetzt." }); send_rendered_away(socket, data, pentry); return; } console.log(data.data.involved); var the_involved = pentry.involved; var role = ''; if(data.pentrytype === "event" || data.pentrytype === "tevent") { role = data.data.involved.for_role; if(role !== '') data.messages.involved[role] = []; the_involved = get_involved_from_event(pentry, data.data.involved.for_role); delete data.data.involved.for_role; } if(role === '') role = 'primary'; if(the_involved) { switch(type) { case 'add': data.data.involved.uid = generateUID(); the_involved.push(data.data.involved); data.messages.involved[role].push({ type: "success", title: "Betroffenen erfolgreich hinzugefügt", message: "'" + data.data.involved.name + "' wurde erfolgreich hinzugefügt." }); break; case 'edit': var inv = get_element_of_array_by_uid(the_involved, data.data.involved.uid); if(inv) { inv.name = data.data.involved.name; inv.group = data.data.involved.group; inv.surname = data.data.involved.surname; inv.forename = data.data.involved.forename; inv.street = data.data.involved.street; inv.street_nr = data.data.involved.street_nr; inv.postalcode = data.data.involved.postalcode; inv.location = data.data.involved.location; inv.email = data.data.involved.email; inv.telephonenumber = data.data.involved.telephonenumber; data.messages.involved[role].push({ type: "success", title: "Betroffenen erfolgreich bearbeitet", message: "'" + data.data.involved.name + "' wurde erfolgreich bearbeitet." }); } else data.messages.involved.primary.push({ type: "danger", title: "Betroffener nicht geändert", message: "'" + data.data.involved.name + "' konnte über seine UID keinem Eintrag zugeordnet werden; Bearbeitung verworfen!" }); break; } } else data.messages.involved.primary.push({ type: "danger", title: "Dienst nicht gefunden", message: "'" + data.data.involved.name + "' wurde nicht hinzugefügt, weil der angegebene Dienst nicht gefunden werden konnte!" }); } else data.messages.involved.primary.push({ type: "danger", title: "Kalendereintrag nicht gefunden", message: "Konnte keinen Kalendereintrag zu dieser Bearbeitung finden. Schwerer Fehler!" }); send_rendered_pentry(socket, data, pentry); } function add_edit_location(type, data) { var pentry = pentry_from_session(socket.handshake.session, data); init_emit_messages(data); if(pentry) { switch(type) { case 'add': data.data.location.uid = generateUID(); pentry.locations.push(data.data.location); data.messages.locations.push({ type: "success", title: "Ort erfolgreich hinzugefügt", message: "Der Ort '" + data.data.location.name + "' wurde erfolgreich hinzugefügt." }); break; case 'edit': var loc = get_element_of_array_by_uid(pentry.locations, data.data.location.uid); if(loc) { loc.name = data.data.location.name; loc.sign = data.data.location.sign; data.messages.locations.push({ type: "success", title: "Ort erfolgreich bearbeitet", message: "'" + data.data.location.name + "' wurde erfolgreich bearbeitet." }); } else data.messages.locations.push({ type: "danger", title: "Ort nicht geändert", message: "'" + data.data.location.name + "' konnte über seine UID keinem Eintrag zugeordnet werden; Bearbeitung verworfen!" }); break; } } else data.messages.locations.push({ type: "danger", title: "Kalendereintrag nicht gefunden", message: "Konnte keinen Kalendereintrag zu dieser Bearbeitung finden. Schwerer Fehler!" }); send_rendered_pentry(socket, data, pentry); } socket.on('pentry_add_location', function(data) { add_edit_location('add', data); }); socket.on('pentry_edit_location', function(data) { add_edit_location('edit', data); }) socket.on('pentry_add_involved', function(data) { add_edit_involved('add', data); }); socket.on('pentry_edit_involved', function(data) { add_edit_involved('edit', data); }); socket.on('render_roleeditor', function(data) { console.log(data); var jsondata = { "request" : "get_predefined_roles", "sessionuuid" : socket.handshake.session.sessionuuid, }; jsonsrv.do_jsonsrv2(jsondata, function(result) { if(result.result === "OK") { var event = event_from_session(socket.handshake.session, data); var role_uid = ''; var role_name = ''; if(data.data.type === 'edit') { role_uid = data.data.role; role_name = get_role_from_uid(event, role_uid).name; } var already_defined_roles = []; for( idx in event.involved_roles ) { if(event.involved_roles[idx].name !== role_name) already_defined_roles.push(event.involved_roles[idx].name); } var html = jade.renderFile("./views/roleeditor_inlay.jade", { roles: result.roles, type : data.data.type, role_name : role_name, role_uid : role_uid, already_defined_roles : already_defined_roles }); socket.emit('render_roleeditor_result', { result: "OK", html: html}); } else socket.emit('render_roleeditor_result', { result: "ERROR", html: ""}); }, function(error) { console.log(error); }); }); socket.on('event_add_role', function(data) { var event = event_from_session(socket.handshake.session, data); init_emit_messages(data); var role = data.data.role; role.uid = generateUID(); role.involved = []; console.log('about to add role:') console.log(role); event.involved_roles.push(role); send_rendered_event(socket, data, event); }); socket.on('event_edit_role', function(data) { var event = event_from_session(socket.handshake.session, data); init_emit_messages(data); console.log(data); get_role_from_uid(event, data.data.role.uid).name = data.data.role.name; console.log(get_role_from_uid(event, data.data.role.uid)); send_rendered_event(socket, data, event); }); socket.on('event_save', function(data) { console.log(data); var event = event_from_session(socket.handshake.session, data); event.name = data.data.event.name; event.name_secondary = data.data.event.name_secondary; event.visibility = data.data.event.visibility; event.end = data.data.event.end; event.end_is_vague = data.data.event.end_is_vague; event.description = data.data.event.description; event.annotations = data.data.event.annotations; if(data.pentrytype === "event") { event.start = data.data.event.start; } console.log("EVENT SAVED!"); }); socket.on('away_save', function(data) { console.log('away_save', data); var away = pentry_from_session(socket.handshake.session, data); away.reason = data.data.away.reason; }); socket.on('keep_in_mind_save', function(data) { console.log('keep_in_mind_save',data); var keep_in_mind = pentry_from_session(socket.handshake.session, data); keep_in_mind.name = data.data.keep_in_mind.name; keep_in_mind.description = data.data.keep_in_mind.description; }); socket.on('todo_save', function(data) { console.log('todo_save',data); var todo = pentry_from_session(socket.handshake.session, data); todo.name = data.data.todo.name; todo.description = data.data.todo.description; }); socket.on('vehicle_use_save', function(data) { console.log('vehicle_use_save',data); var vehicle_use = pentry_from_session(socket.handshake.session, data); vehicle_use.name = data.data.vehicle_use.name; vehicle_use.description = data.data.vehicle_use.description; vehicle_use.vehicle_id = data.data.vehicle_use.vehicle_id; }); socket.on('pentry_remove_involved', function(data) { var pentry = pentry_from_session(socket.handshake.session, data); if(pentry) { var the_involved = pentry.involved; var role = ''; if(data.pentrytype === "event" || data.pentrytype === "tevent") { role = data.data.role; the_involved = get_involved_from_event(pentry, data.data.role); } if(role === '') role = 'primary'; if(the_involved === null) { console.log('REMOVING FROM ROLE '+data.data.role); console.log("WARNING: role not found!"); socket.emit('pentry_remove_involved_result', { result: 'ERROR', role: role, html: get_rendered_pcalmessage( { type: "danger", title: "Dienst nicht gefunden", message: "Der zu entfernende Betroffene konnte nicht entfernt werden, da der angegeben Dienst [" + role + "] nicht gefunden werden konnte."})}); return; } var found = remove_from_array_by_uid(the_involved, data.data.involved); if(found) socket.emit('pentry_remove_involved_result', { result: 'OK', role: role, html: get_rendered_pcalmessage( { type: "success", title: "Entfernen erfolgreich", message: "Der zu entfernende Betroffene wurde erfolgreich entfernt."})}); else socket.emit('pentry_remove_involved_result', { result: 'ERROR', role: role, html: get_rendered_pcalmessage( { type: "danger", title: "Betroffener nicht gefunden", message: "Der zu entfernende Betroffene konnte nicht entfernt werden, da der angegeben Betroffene [" + data.data.involved + "; role: " + role + "] nicht gefunden werden konnte."})}); } else socket.emit('pentry_remove_involved_result', { result: 'ERROR', role: role, html: get_rendered_pcalmessage( { type: "danger", title: "Kalendereintrag nicht gefunden", message: "Konnte keinen Kalendereintrag zu dieser Bearbeitung finden. Schwerer Fehler!" } )}); }); socket.on('pentry_remove_location', function(data) { var pentry = pentry_from_session(socket.handshake.session, data); if(pentry) { var found = remove_from_array_by_uid(pentry.locations, data.data.location); if(found) socket.emit('pentry_remove_location_result', { result: 'OK', html: get_rendered_pcalmessage( { type: "success", title: "Entfernen erfolgreich", message: "Der zu entfernende Ort wurde erfolgreich entfernt."})}); else socket.emit('pentry_remove_location_result', { result: 'ERROR', html: get_rendered_pcalmessage( { type: "danger", title: "Ort nicht gefunden", message: "Der zu entfernende Ort konnte nicht entfernt werden, da der angegeben Ort nicht gefunden werden konnte."})}); } else socket.emit('pentry_remove_location_result', { result: 'ERROR', html: get_rendered_pcalmessage( { type: "danger", title: "Kalendereintrag nicht gefunden", message: "Konnte keinen Kalendereintrag zu dieser Bearbeitung finden. Schwerer Fehler!" } )}); }); socket.on('event_remove_role', function(data) { var event = event_from_session(socket.handshake.session, data); var found = remove_from_array_by_uid(event.involved_roles, data.data.role); socket.emit('event_remove_role_result', { result: (found ? 'OK':'ERROR')}) }); socket.on('get_parishday', function(data) { var data = { "request" : "get_parishday", "sessionuuid" : socket.handshake.session.sessionuuid, "date" : data.date, }; jsonsrv.do_jsonsrv2(data, function(result) { if(result.result === "OK") { var html = jade.renderFile('views/pentrymove_parishday.jade', { day: result.day }); socket.emit('got_parishday', { result: "OK", html: html }); } else socket.emit('got_parishday', { result: "ERROR" }); }, function(){console.log('ERROR');}); console.log(data); }); }); /* var pcalpub = io.of('/pcalpub'); pcalpub.use(sharedsession(app.locals.session, {autoSave: true})); pcalpub.on('connection', function(socket) { var tmpfiles = []; var uploader = new app.locals.siofu(); var tmpdir = tmp.dirSync({dir:'/tmp', unsafeCleanup: true}); tmpfiles.push(tmpdir); uploader.dir = tmpdir.name; uploader.listen(socket); console.log('NEW PCALPUB-WEBSOCKET-CONNECTION'); console.log('A socket with sessionID ' + socket.handshake.session.sessionuuid + ' connected!'); // ONE SHOT CONNECTIONS BEGIN uploader.on('complete', function(event) { event.file.clientDetail.pathName = event.file.pathName; }); socket.on('pcalpub_generate_pdf', function(data) { var jsondata = { "request" : "generate_publication_pdf", "sessionuuid" : socket.handshake.session.sessionuuid, parishid : data.parishid, factoryid : data.factoryid, date : data.date, durance : data.durance, use_background : data.use_background }; var prefix = 'pcalpub-'; if(data.use_background) { //var pdf = fs.readFileSync(tmpdir.name+"/"+data.background_pdf); var pdf = fs.readFileSync(data.background_pdf); jsondata.background_pdf = new Buffer(pdf).toString('base64'); var idx = data.background_pdf.indexOf('.pdf'); prefix = data.background_pdf.slice(0,idx)+"-komplett___"; idx = prefix.lastIndexOf('/'); prefix = prefix.substr(idx+1); } jsonsrv.do_jsonsrv2(jsondata, function(result) { var tmpobj; if(result.result === "OK") { var buf = new Buffer(result.pdf, 'base64'); tmpobj = tmp.fileSync({ dir: 'public/pcalpubtmp/', prefix: prefix, postfix: '.pdf' }); tmpfiles.push(tmpobj); fs.writeFileSync(tmpobj.fd, buf); } else { tmpobj = tmp.fileSync({ dir: 'public/pcalpubtmp/', prefix: 'pcalpub___', postfix: '.html' }); tmpfiles.push(tmpobj); fs.writeFileSync(tmpobj.fd, "
ERROR IN GENERATING HTML"); } fs.closeSync(tmpobj.fd); // "/pcalpub/files/"+ 11 socket.emit('pcalpub_generate_pdf_result', { result: 'OK', file: tmpobj.name.substr(6, tmpobj.name.length), title: result.title}); }, function(error){ console.log(error); var tmpobj = tmp.fileSync({ dir: 'public/pcalpubtmp/', prefix: 'pcalpub-', postfix: '.html' }); tmpfiles.push(tmpobj); fs.writeFileSync(tmpobj.fd, "ERROR CONNECTING TO PFISJSONSRV"); fs.closeSync(tmpobj.fd); socket.emit('pcalpub_generate_pdf_result', { result: 'ERROR', file: tmpobj.name.substr(6, tmpobj.name.length), title: ''}); }); }); // ONE SHOT SESSIONS END var publicationformats = []; var parishid = 0; var factoryid = 0; var durance = 2; var date = (new Date(Date.now())).toISOString().slice(0,10); var html = ""; var timespan = ""; var parishdb = []; var dest_to = []; var dest_cc = []; var dest_bcc = []; var title = "__EMPTY_TITLE__"; function save_settings(data) { publicationformats = data.publicationformats; parishid = data.parishid; factoryid = data.factoryid; durance = data.durance; date = data.date; } socket.on('pcalpub_show_settings', function(data) { //var html = jade.renderFile('views/pcalpub_settings.jade', { parishid: data.parishid, factoryid: data.factoryid, durance: data.durance, date: data.date, publicationformats: data.publicationformats }); var html = jade.renderFile('views/pcalpub_settings.jade', { parishid: parishid, factoryid: factoryid, durance: durance, date: date, publicationformats: publicationformats }); socket.emit('pcalpub_show_settings_result', {result: "OK", html: html}); }); function send_rendered_html_for_email(myhtml, push_state) { jade.renderFile('views/pcalpub_html_for_email_edit.jade', { html: "" + myhtml + "\r\n", parish_name : publicationformats[parishid].name, factory_name : publicationformats[parishid].publicationformats[factoryid].name, timespan : timespan }, function(error, html) { if(error) { var html = get_rendered_error(error); html = "