CleanupBackend
This commit is contained in:
parent
2859f6d1fc
commit
46d23633a9
22 changed files with 1404 additions and 876 deletions
|
@ -1,10 +1,9 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2013 Raimund Schlüßler raimund.schluessler@googlemail.com
|
||||
* @copyright 2015 Raimund Schlüßler raimund.schluessler@googlemail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
|
@ -20,6 +19,7 @@
|
|||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCA\Tasks\AppInfo;
|
||||
|
||||
if(\OCP\App::isEnabled('calendar')) {
|
||||
|
@ -40,4 +40,4 @@ if(\OCP\App::isEnabled('calendar')) {
|
|||
} else {
|
||||
$msg = 'Can not enable the Tasks app because the Calendar App is disabled.';
|
||||
\OCP\Util::writeLog('tasks', $msg, \OCP\Util::ERROR);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2014 Raimund Schlüßler raimund.schluessler@googlemail.com
|
||||
* @copyright 2015 Raimund Schlüßler raimund.schluessler@googlemail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
|
@ -29,9 +29,15 @@ use \OCA\Tasks\Controller\ListsController;
|
|||
use \OCA\Tasks\Controller\SettingsController;
|
||||
use \OCA\Tasks\Controller\TasksController;
|
||||
use \OCA\Tasks\Service\TasksService;
|
||||
use \OCA\Tasks\Service\SearchService;
|
||||
use \OCA\Tasks\Service\ListsService;
|
||||
use \OCA\Tasks\Service\CollectionsService;
|
||||
use \OCA\Tasks\Service\SettingsService;
|
||||
use \OCA\Tasks\Service\Helper;
|
||||
use \OCA\Tasks\Service\TaskParser;
|
||||
use \OCA\Tasks\Service\ReminderService;
|
||||
use \OCA\Tasks\Service\CommentsService;
|
||||
use \OCA\Tasks\Db\TasksMapper;
|
||||
|
||||
class Application extends App {
|
||||
|
||||
|
@ -80,7 +86,9 @@ class Application extends App {
|
|||
return new TasksController(
|
||||
$c->query('AppName'),
|
||||
$c->query('Request'),
|
||||
$c->query('TasksService')
|
||||
$c->query('TasksService'),
|
||||
$c->query('ReminderService'),
|
||||
$c->query('CommentsService')
|
||||
);
|
||||
});
|
||||
|
||||
|
@ -90,7 +98,10 @@ class Application extends App {
|
|||
*/
|
||||
$container->registerService('TasksService', function($c) {
|
||||
return new TasksService(
|
||||
$c->query('UserId')
|
||||
$c->query('UserId'),
|
||||
$c->query('TasksMapper'),
|
||||
$c->query('Helper'),
|
||||
$c->query('TaskParser')
|
||||
);
|
||||
});
|
||||
|
||||
|
@ -117,6 +128,39 @@ class Application extends App {
|
|||
);
|
||||
});
|
||||
|
||||
$container->registerService('SearchService', function($c) {
|
||||
return new SearchService(
|
||||
$c->query('TasksMapper'),
|
||||
$c->query('Helper'),
|
||||
$c->query('TaskParser')
|
||||
);
|
||||
});
|
||||
|
||||
$container->registerService('TaskParser', function($c) {
|
||||
return new TaskParser(
|
||||
$c->query('ReminderService'),
|
||||
$c->query('Helper')
|
||||
);
|
||||
});
|
||||
|
||||
$container->registerService('ReminderService', function($c) {
|
||||
return new ReminderService(
|
||||
$c->query('Helper')
|
||||
);
|
||||
});
|
||||
|
||||
$container->registerService('CommentsService', function($c) {
|
||||
return new CommentsService(
|
||||
$c->query('UserId'),
|
||||
$c->query('Helper')
|
||||
);
|
||||
});
|
||||
|
||||
$container->registerService('Helper', function() {
|
||||
return new Helper(
|
||||
);
|
||||
});
|
||||
|
||||
/**
|
||||
* Core
|
||||
*/
|
||||
|
@ -132,7 +176,16 @@ class Application extends App {
|
|||
return $c->query('ServerContainer')->getConfig();
|
||||
});
|
||||
|
||||
\OC::$server->getSearch()->registerProvider('OCA\Tasks\Controller\SearchController', array('apps' => array('tasks')));
|
||||
\OC::$server->getSearch()->registerProvider('OCA\Tasks\Controller\SearchProvider', array('apps' => array('tasks')));
|
||||
|
||||
/**
|
||||
* Database Layer
|
||||
*/
|
||||
$container->registerService('TasksMapper', function($c) {
|
||||
return new TasksMapper(
|
||||
$c->query('ServerContainer')->getDb()
|
||||
);
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2014 Raimund Schlüßler raimund.schluessler@googlemail.com
|
||||
* @copyright 2015 Raimund Schlüßler raimund.schluessler@googlemail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
|
@ -63,4 +63,4 @@ $application->registerRoutes($this, array('routes' => array(
|
|||
// settings
|
||||
array('name' => 'settings#get', 'url' => '/settings', 'verb' => 'GET'),
|
||||
array('name' => 'settings#set', 'url' => '/settings/{type}/{setting}/{value}', 'verb' => 'POST'),
|
||||
)));
|
||||
)));
|
||||
|
|
|
@ -1,4 +1,24 @@
|
|||
<?php
|
||||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2015 Raimund Schlüßler raimund.schluessler@googlemail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
$installedVersionTasks=OCP\Config::getAppValue('tasks', 'installed_version');
|
||||
$installedVersionTasksEnhanced=OCP\Config::getAppValue('tasks_enhanced', 'installed_version');
|
||||
|
|
|
@ -1,25 +1,24 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2014 Raimund Schlüßler raimund.schluessler@googlemail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2015 Raimund Schlüßler raimund.schluessler@googlemail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCA\Tasks\Controller;
|
||||
|
||||
|
@ -55,4 +54,4 @@ class CollectionsController extends Controller {
|
|||
return $this->collectionsService->setVisibility($collectionID, $visibility);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,322 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* ownCloud - Utility class for VObject properties
|
||||
*
|
||||
* @author Thomas Tanghus
|
||||
* @copyright 2013-2014 Thomas Tanghus (thomas@tanghus.net)
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCA\Tasks\Controller;
|
||||
|
||||
use Sabre\VObject;
|
||||
// use OCA\Tasks\App;
|
||||
|
||||
Class Helper {
|
||||
|
||||
public static function parseVTODO($task) {
|
||||
$object = \Sabre\VObject\Reader::read($task['calendardata']);
|
||||
if(!$object) {
|
||||
return false;
|
||||
}
|
||||
$sharedAccessClassPermissions = \OC_Calendar_Object::getAccessClassPermissions($object);
|
||||
if(\OC_Calendar_Object::getowner($task['id']) !== \OC::$server->getUserSession()->getUser()->getUID()){
|
||||
if (!($sharedAccessClassPermissions & \OCP\Constants::PERMISSION_READ)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
$object = \OC_Calendar_Object::cleanByAccessClass($task['id'], $object);
|
||||
|
||||
$vtodo = $object->VTODO;
|
||||
return $vtodo;
|
||||
}
|
||||
|
||||
public static function arrayForJSON($id, $vtodo, $user_timezone, $calendarId){
|
||||
$task = array( 'id' => $id );
|
||||
$task['calendarid'] = $calendarId;
|
||||
$task['type'] = 'task';
|
||||
$task['name'] = (string) $vtodo->SUMMARY;
|
||||
$task['created'] = (string) $vtodo->CREATED;
|
||||
$task['note'] = (string) $vtodo->DESCRIPTION;
|
||||
$task['location'] = (string) $vtodo->LOCATION;
|
||||
$categories = $vtodo->CATEGORIES;
|
||||
if ($categories){
|
||||
$task['categories'] = $categories->getParts();
|
||||
}
|
||||
$start = $vtodo->DTSTART;
|
||||
if ($start) {
|
||||
try {
|
||||
$start = $start->getDateTime();
|
||||
$start->setTimezone(new \DateTimeZone($user_timezone));
|
||||
$task['start'] = $start->format('Ymd\THis');
|
||||
} catch(\Exception $e) {
|
||||
$task['start'] = null;
|
||||
\OCP\Util::writeLog('tasks', $e->getMessage(), \OCP\Util::ERROR);
|
||||
}
|
||||
} else {
|
||||
$task['start'] = null;
|
||||
}
|
||||
$due = $vtodo->DUE;
|
||||
if ($due) {
|
||||
try {
|
||||
$due = $due->getDateTime();
|
||||
$due->setTimezone(new \DateTimeZone($user_timezone));
|
||||
$task['due'] = $due->format('Ymd\THis');
|
||||
} catch(\Exception $e) {
|
||||
$task['due'] = null;
|
||||
\OCP\Util::writeLog('tasks', $e->getMessage(), \OCP\Util::ERROR);
|
||||
}
|
||||
} else {
|
||||
$task['due'] = null;
|
||||
}
|
||||
$reminder = $vtodo->VALARM;
|
||||
if($reminder) {
|
||||
try {
|
||||
|
||||
if ($reminder->TRIGGER['VALUE']){
|
||||
$reminderType = $reminder->TRIGGER['VALUE']->getValue();
|
||||
} else {
|
||||
throw new \Exception('Reminder type not specified.');
|
||||
}
|
||||
if ($reminder->ACTION) {
|
||||
$reminderAction = $reminder->ACTION->getValue();
|
||||
} else {
|
||||
throw new \Exception('Reminder action not specified.');
|
||||
}
|
||||
$reminderDate = null;
|
||||
$reminderDuration = null;
|
||||
|
||||
|
||||
if($reminderType == 'DATE-TIME'){
|
||||
$reminderDate = $reminder->TRIGGER->getDateTime();
|
||||
$reminderDate->setTimezone(new \DateTimeZone($user_timezone));
|
||||
$reminderDate = $reminderDate->format('Ymd\THis');
|
||||
} elseif ($reminderType == 'DURATION' && ($start || $due)) {
|
||||
|
||||
$parsed = VObject\DateTimeParser::parseDuration($reminder->TRIGGER,true);
|
||||
// Calculate the reminder date from duration and start date
|
||||
$related = null;
|
||||
if(is_object($reminder->TRIGGER['RELATED'])){
|
||||
$related = $reminder->TRIGGER['RELATED']->getValue();
|
||||
if($related == 'END' && $due){
|
||||
$reminderDate = $due->modify($parsed)->format('Ymd\THis');
|
||||
} else {
|
||||
throw new \Exception('Reminder duration related to not available date.');
|
||||
}
|
||||
} elseif ($start) {
|
||||
$reminderDate = $start->modify($parsed)->format('Ymd\THis');
|
||||
} else{
|
||||
throw new \Exception('Reminder duration related to not available date.');
|
||||
}
|
||||
preg_match('/^(?P<plusminus>\+|-)?P((?P<week>\d+)W)?((?P<day>\d+)D)?(T((?P<hour>\d+)H)?((?P<minute>\d+)M)?((?P<second>\d+)S)?)?$/', $reminder->TRIGGER, $matches);
|
||||
$invert = false;
|
||||
if ($matches['plusminus']==='-') {
|
||||
$invert = true;
|
||||
}
|
||||
|
||||
$parts = array(
|
||||
'week',
|
||||
'day',
|
||||
'hour',
|
||||
'minute',
|
||||
'second',
|
||||
);
|
||||
|
||||
$reminderDuration = array(
|
||||
'token' => null
|
||||
);
|
||||
foreach($parts as $part) {
|
||||
$matches[$part] = isset($matches[$part])&&$matches[$part]?(int)$matches[$part]:0;
|
||||
$reminderDuration[$part] = $matches[$part];
|
||||
if($matches[$part] && !$reminderDuration['token']){
|
||||
$reminderDuration['token'] = $part;
|
||||
}
|
||||
}
|
||||
if($reminderDuration['token'] == null){
|
||||
$reminderDuration['token'] = $parts[0];
|
||||
}
|
||||
|
||||
$reminderDuration['params'] = array(
|
||||
'id' => (int)$invert.(int)($related == 'END'),
|
||||
'related'=> $related?$related:'START',
|
||||
'invert'=> $invert
|
||||
);
|
||||
|
||||
} else {
|
||||
$reminderDate = null;
|
||||
$reminderDuration = null;
|
||||
}
|
||||
|
||||
$task['reminder'] = array(
|
||||
'type' => $reminderType,
|
||||
'action' => $reminderAction,
|
||||
'date' => $reminderDate,
|
||||
'duration' => $reminderDuration
|
||||
);
|
||||
|
||||
} catch(\Exception $e) {
|
||||
$task['reminder'] = null;
|
||||
\OCP\Util::writeLog('tasks', $e->getMessage(), \OCP\Util::ERROR);
|
||||
}
|
||||
} else {
|
||||
$task['reminder'] = null;
|
||||
}
|
||||
$priority = $vtodo->PRIORITY;
|
||||
if(isset($priority)){
|
||||
$priority = (10 - $priority->getValue()) % 10;
|
||||
$task['priority'] = (string) $priority;
|
||||
if($priority > 5){
|
||||
$task['starred'] = true;
|
||||
}
|
||||
} else {
|
||||
$task['priority'] = '0';
|
||||
$task['starred'] = false;
|
||||
}
|
||||
$completed = $vtodo->COMPLETED;
|
||||
if ($completed) {
|
||||
try {
|
||||
$completed = $completed->getDateTime();
|
||||
$completed->setTimezone(new \DateTimeZone($user_timezone));
|
||||
$task['completed_date'] = $completed->format('Ymd\THis');
|
||||
$task['completed'] = true;
|
||||
} catch(\Exception $e) {
|
||||
$task['completed'] = false;
|
||||
\OCP\Util::writeLog('tasks', $e->getMessage(), \OCP\Util::ERROR);
|
||||
}
|
||||
} else {
|
||||
$task['completed'] = false;
|
||||
}
|
||||
|
||||
|
||||
$percentComplete = $vtodo->{'PERCENT-COMPLETE'};
|
||||
if($percentComplete){
|
||||
$task['complete'] = $percentComplete->getValue();
|
||||
} else {
|
||||
$task['complete'] = '0';
|
||||
}
|
||||
|
||||
|
||||
$comments = $vtodo->COMMENT;
|
||||
if($comments){
|
||||
$comments_parsed = array();
|
||||
foreach($comments as $com) {
|
||||
// parse time
|
||||
$time = $com['X-OC-DATE-TIME'];
|
||||
if ($time) {
|
||||
$time = new \DateTime($time);
|
||||
$time->setTimezone(new \DateTimeZone($user_timezone));
|
||||
$time = $time->format('Ymd\THis');
|
||||
}
|
||||
// parse comment ID
|
||||
$comID = $com['X-OC-ID'];
|
||||
if ($comID) {
|
||||
$comID = $com['X-OC-ID']->getValue();
|
||||
}
|
||||
// parse user ID
|
||||
$userID = $com['X-OC-USERID'];
|
||||
if ($userID) {
|
||||
$userID = (string) $com['X-OC-USERID']->getValue();
|
||||
}
|
||||
$user = \OC::$server->getUserManager()->get($userID);
|
||||
$userName = $userID;
|
||||
if ($user){
|
||||
$userName = $user->getDisplayName();
|
||||
}
|
||||
$comments_parsed[] = array(
|
||||
'id' => $comID,
|
||||
'userID' => $userID,
|
||||
'name' => $userName,
|
||||
'comment' => $com->getValue(),
|
||||
'time' => $time
|
||||
);
|
||||
}
|
||||
$task['comments'] = $comments_parsed;
|
||||
}
|
||||
return $task;
|
||||
}
|
||||
|
||||
|
||||
public static function createVCalendarFromRequest($request){
|
||||
$vcalendar = new \Sabre\VObject\Component\VCalendar();
|
||||
$vcalendar->PRODID = 'ownCloud Calendar';
|
||||
$vcalendar->VERSION = '2.0';
|
||||
|
||||
$vtodo = $vcalendar->createComponent('VTODO');
|
||||
$vcalendar->add($vtodo);
|
||||
|
||||
$vtodo->CREATED = new \DateTime('now', new \DateTimeZone('UTC'));
|
||||
|
||||
$vtodo->UID = \Sabre\VObject\UUIDUtil::getUUID();
|
||||
return self::updateVCalendarFromRequest($request, $vcalendar);
|
||||
}
|
||||
|
||||
public static function updateVCalendarFromRequest($request, $vcalendar){
|
||||
$vtodo = $vcalendar->VTODO;
|
||||
|
||||
$lastModified = $vtodo->{'LAST-MODIFIED'};
|
||||
if(is_null($lastModified)) {
|
||||
$lastModified = $vtodo->add('LAST-MODIFIED');
|
||||
}
|
||||
$lastModified->setValue(new \DateTime('now', new \DateTimeZone('UTC')));
|
||||
$vtodo->DTSTAMP = new \DateTime('now', new \DateTimeZone('UTC'));
|
||||
$vtodo->SUMMARY = $request['summary'];
|
||||
|
||||
if($request['location']){
|
||||
$vtodo->LOCATION = $request['location'];
|
||||
}
|
||||
if ($request['description']){
|
||||
$vtodo->DESCRIPTION = $request['description'];
|
||||
}
|
||||
if($request["categories"]){
|
||||
$vtodo->CATEGORIES = $request["categories"];
|
||||
}
|
||||
if($request['priority']) {
|
||||
$vtodo->PRIORITY = 5; // prio: medium
|
||||
} else {
|
||||
$vtodo->PRIORITY = 0; // prio: undefined
|
||||
}
|
||||
$percentComplete = $vtodo->{'PERCENT-COMPLETE'};
|
||||
if (is_null($percentComplete)) {
|
||||
$percentComplete = $vtodo->add('PERCENT-COMPLETE');
|
||||
}
|
||||
if (isset($request['complete'])) {
|
||||
$percentComplete->setValue($request['complete']);
|
||||
} else {
|
||||
$percentComplete->setValue('0');
|
||||
}
|
||||
|
||||
$due = $request['due'];
|
||||
if ($due) {
|
||||
$timezone = \OC_Calendar_App::getTimezone();
|
||||
$timezone = new \DateTimeZone($timezone);
|
||||
$due = new \DateTime($due, $timezone);
|
||||
$vtodo->DUE = $due;
|
||||
} else {
|
||||
unset($vtodo->DUE);
|
||||
}
|
||||
$start = $request['start'];
|
||||
if ($start) {
|
||||
$timezone = \OC_Calendar_App::getTimezone();
|
||||
$timezone = new \DateTimeZone($timezone);
|
||||
$start = new \DateTime($start, $timezone);
|
||||
$vtodo->DTSTART = $start;
|
||||
} else {
|
||||
unset($vtodo->DTSTART);
|
||||
}
|
||||
|
||||
return $vcalendar;
|
||||
}
|
||||
}
|
|
@ -1,25 +1,24 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2013 Raimund Schlüßler raimund.schluessler@googlemail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2015 Raimund Schlüßler raimund.schluessler@googlemail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCA\Tasks\Controller;
|
||||
|
||||
|
@ -73,4 +72,4 @@ class ListsController extends Controller {
|
|||
return $this->listsService->setName($listID, $name);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,11 +1,23 @@
|
|||
<?php
|
||||
/**
|
||||
* @author Thomas Tanghus
|
||||
* @copyright 2014 Thomas Tanghus (thomas@tanghus.net)
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2015 Raimund Schlüßler raimund.schluessler@googlemail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
namespace OCA\Tasks\Controller;
|
||||
|
|
|
@ -1,93 +0,0 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCA\Tasks\Controller;
|
||||
|
||||
/**
|
||||
* Tasks search provider
|
||||
*/
|
||||
class SearchController extends \OCP\Search\Provider {
|
||||
|
||||
/**
|
||||
* Search for query in tasks
|
||||
*
|
||||
* @param string $query
|
||||
* @return array list of \OCA\Tasks\Controller\Task
|
||||
*/
|
||||
function search($query) {
|
||||
$calendars = \OC_Calendar_Calendar::allCalendars(\OC::$server->getUserSession()->getUser()->getUID(), true);
|
||||
$user_timezone = \OC_Calendar_App::getTimezone();
|
||||
// check if the calenar is enabled
|
||||
if (count($calendars) == 0 || !\OCP\App::isEnabled('tasks')) {
|
||||
return array();
|
||||
}
|
||||
$results = array();
|
||||
foreach ($calendars as $calendar) {
|
||||
// $calendar_entries = \OC_Calendar_Object::all($calendar['id']);
|
||||
$objects = \OC_Calendar_Object::all($calendar['id']);
|
||||
// $date = strtotime($query);
|
||||
// // search all calendar objects, one by one
|
||||
foreach ($objects as $object) {
|
||||
// skip non-todos
|
||||
if ($object['objecttype'] != 'VTODO') {
|
||||
continue;
|
||||
}
|
||||
if(!($vtodo = Helper::parseVTODO($object))){
|
||||
continue;
|
||||
}
|
||||
$id = $object['id'];
|
||||
$calendarId = $object['calendarid'];
|
||||
|
||||
// check these properties
|
||||
$properties = array('SUMMARY', 'DESCRIPTION', 'LOCATION', 'CATEGORIES');
|
||||
|
||||
foreach ($properties as $property) {
|
||||
$string = $vtodo->{$property};
|
||||
if (stripos($string, $query) !== false) {
|
||||
// $results[] = new \OCA\Tasks\Controller\Task($id,$calendarId,$vtodo,$property,$query,$user_timezone);
|
||||
$results[] = Helper::arrayForJSON($id, $vtodo, $user_timezone, $calendarId);
|
||||
continue 2;
|
||||
}
|
||||
}
|
||||
$comments = $vtodo->COMMENT;
|
||||
if($comments) {
|
||||
foreach($comments as $com) {
|
||||
if (stripos($com->getValue(), $query) !== false) {
|
||||
// $results[] = new \OCA\Tasks\Controller\Task($id,$calendarId,$vtodo,'COMMENTS',$query,$user_timezone);
|
||||
$results[] = Helper::arrayForJSON($id, $vtodo, $user_timezone, $calendarId);
|
||||
continue 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
usort($results, array($this, 'sort_completed'));
|
||||
return $results;
|
||||
}
|
||||
|
||||
private static function sort_completed($a, $b){
|
||||
$t1 = $a['completed'];
|
||||
$t2 = $b['completed'];
|
||||
if ($t1 == $t2) {
|
||||
return 0;
|
||||
}
|
||||
return $t1 > $t2 ? 1 : -1;
|
||||
}
|
||||
}
|
51
controller/searchprovider.php
Normal file
51
controller/searchprovider.php
Normal file
|
@ -0,0 +1,51 @@
|
|||
<?php
|
||||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2015 Raimund Schlüßler raimund.schluessler@googlemail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCA\Tasks\Controller;
|
||||
|
||||
use OCA\Tasks\AppInfo\Application;
|
||||
|
||||
/**
|
||||
* Tasks search provider
|
||||
*/
|
||||
class SearchProvider extends \OCP\Search\Provider {
|
||||
|
||||
private $tasksService;
|
||||
|
||||
public function __construct() {
|
||||
$app = new Application();
|
||||
$container = $app->getContainer();
|
||||
$this->app = $app;
|
||||
$this->tasksService = $container->query('TasksService');
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Search for query in tasks
|
||||
*
|
||||
* @param string $query
|
||||
* @return array
|
||||
*/
|
||||
public function search($query) {
|
||||
return $this->tasksService->search($query);
|
||||
}
|
||||
}
|
|
@ -1,25 +1,24 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2014 Raimund Schlüßler raimund.schluessler@googlemail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2015 Raimund Schlüßler raimund.schluessler@googlemail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCA\Tasks\Controller;
|
||||
|
||||
|
@ -55,4 +54,4 @@ class SettingsController extends Controller {
|
|||
return $this->settingsService->set($setting, $type, $value);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,29 +1,30 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2013 Raimund Schlüßler raimund.schluessler@googlemail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2015 Raimund Schlüßler raimund.schluessler@googlemail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCA\Tasks\Controller;
|
||||
|
||||
use \OCA\Tasks\Service\TasksService;
|
||||
use \OCA\Tasks\Service\ReminderService;
|
||||
use \OCA\Tasks\Service\CommentsService;
|
||||
use \OCP\IRequest;
|
||||
use \OCP\AppFramework\Controller;
|
||||
|
||||
|
@ -31,12 +32,16 @@ use \OCP\AppFramework\Controller;
|
|||
class TasksController extends Controller {
|
||||
|
||||
private $tasksService;
|
||||
private $reminderService;
|
||||
private $commentsService;
|
||||
|
||||
use Response;
|
||||
|
||||
public function __construct($appName, IRequest $request, TasksService $tasksService){
|
||||
public function __construct($appName, IRequest $request, TasksService $tasksService, ReminderService $reminderService, CommentsService $commentsService){
|
||||
parent::__construct($appName, $request);
|
||||
$this->tasksService = $tasksService;
|
||||
$this->reminderService = $reminderService;
|
||||
$this->commentsService = $commentsService;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -53,7 +58,7 @@ class TasksController extends Controller {
|
|||
*/
|
||||
public function getTask($taskID){
|
||||
return $this->generateResponse(function () use ($taskID) {
|
||||
return $this->tasksService->get($taskID);
|
||||
return $this->tasksService->getTask($taskID);
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -143,7 +148,7 @@ class TasksController extends Controller {
|
|||
*/
|
||||
public function setReminderDate($taskID, $type, $action, $date, $invert, $related = null, $week, $day, $hour, $minute, $second){
|
||||
return $this->generateResponse(function () use ($taskID, $type, $action, $date, $invert, $related, $week, $day, $hour, $minute, $second) {
|
||||
return $this->tasksService->setReminderDate($taskID, $type, $action, $date, $invert, $related, $week, $day, $hour, $minute, $second);
|
||||
return $this->reminderService->createReminder($taskID, $type, $action, $date, $invert, $related, $week, $day, $hour, $minute, $second);
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -179,7 +184,7 @@ class TasksController extends Controller {
|
|||
*/
|
||||
public function addComment($taskID, $comment, $tmpID){
|
||||
return $this->generateResponse(function () use ($taskID, $comment, $tmpID) {
|
||||
return $this->tasksService->addComment($taskID, $comment, $tmpID);
|
||||
return $this->commentsService->addComment($taskID, $comment, $tmpID);
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -188,7 +193,7 @@ class TasksController extends Controller {
|
|||
*/
|
||||
public function deleteComment($taskID, $commentID){
|
||||
return $this->generateResponse(function () use ($taskID, $commentID) {
|
||||
return $this->tasksService->deleteComment($taskID, $commentID);
|
||||
return $this->commentsService->deleteComment($taskID, $commentID);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
42
db/tasks.php
Normal file
42
db/tasks.php
Normal file
|
@ -0,0 +1,42 @@
|
|||
<?php
|
||||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2015 Raimund Schlüßler raimund.schluessler@googlemail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCA\Tasks\Db;
|
||||
|
||||
use \OCP\AppFramework\Db\Entity;
|
||||
|
||||
class Tasks extends Entity {
|
||||
|
||||
public $calendarid;
|
||||
public $objecttype;
|
||||
public $startdate;
|
||||
public $enddate;
|
||||
public $repeating;
|
||||
public $summary;
|
||||
public $calendardata;
|
||||
public $uri;
|
||||
public $lastmodified;
|
||||
|
||||
public function __construct() {
|
||||
$this->addType('calendarid', 'integer');
|
||||
}
|
||||
}
|
43
db/tasksmapper.php
Normal file
43
db/tasksmapper.php
Normal file
|
@ -0,0 +1,43 @@
|
|||
<?php
|
||||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2015 Raimund Schlüßler raimund.schluessler@googlemail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCA\Tasks\Db;
|
||||
|
||||
use OCP\IDb;
|
||||
use OCP\AppFramework\Db\Mapper;
|
||||
|
||||
class TasksMapper extends Mapper {
|
||||
|
||||
public function __construct(IDb $db) {
|
||||
parent::__construct($db, 'tasks_tasks', '\OCA\Tasks\Db\Tasks');
|
||||
}
|
||||
|
||||
public function findAllVTODOs($calendarID, $limit=null, $offset=null) {
|
||||
$sql = 'SELECT * FROM `*PREFIX*clndr_objects` WHERE `calendarid` = ? AND `objecttype`= ?';
|
||||
return $this->findEntities($sql, array($calendarID, 'VTODO'), $limit, $offset);
|
||||
}
|
||||
|
||||
public function findVTODOById($taskID, $limit=null, $offset=null) {
|
||||
$sql = 'SELECT * FROM `*PREFIX*clndr_objects` WHERE `id` = ? AND `objecttype`= ?';
|
||||
return $this->findEntity($sql, array($taskID, 'VTODO'), $limit, $offset);
|
||||
}
|
||||
}
|
|
@ -1,4 +1,24 @@
|
|||
<?php
|
||||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2015 Raimund Schlüßler raimund.schluessler@googlemail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
namespace OCA\Tasks\Service;
|
||||
|
||||
use OCP\IConfig;
|
||||
|
@ -50,31 +70,27 @@ class CollectionsService {
|
|||
'show' => 2)
|
||||
);
|
||||
foreach ($collections as $key => $collection){
|
||||
try{
|
||||
$tmp = $this->settings->getUserValue($this->userId, $this->appName,'show_'.$collection['id']);
|
||||
if (!in_array($tmp, array('0','1','2'))) {
|
||||
$this->settings->setUserValue($this->userId, $this->appName,'show_'.$collection['id'],$collections[$key]['show']);
|
||||
} else {
|
||||
$collections[$key]['show'] = (int)$tmp;
|
||||
}
|
||||
} catch(\Exception $e) {
|
||||
\OCP\Util::writeLog($this->appName, $e->getMessage(), \OCP\Util::ERROR);
|
||||
$tmp = $this->settings->getUserValue($this->userId, $this->appName,'show_'.$collection['id']);
|
||||
if (!in_array($tmp, array('0','1','2'))) {
|
||||
$this->settings->setUserValue($this->userId, $this->appName,'show_'.$collection['id'],$collections[$key]['show']);
|
||||
} else {
|
||||
$collections[$key]['show'] = (int)$tmp;
|
||||
}
|
||||
}
|
||||
return $collections;
|
||||
}
|
||||
|
||||
/**
|
||||
* set the visibility of a list by id
|
||||
* set the visibility of a collection by collectionID
|
||||
*
|
||||
* @param int $id
|
||||
* @param int $collectionID
|
||||
* @param int $visibility
|
||||
* @return bool
|
||||
*/
|
||||
public function setVisibility($id, $visibility){
|
||||
public function setVisibility($collectionID, $visibility){
|
||||
if (in_array($visibility, array(0,1,2))){
|
||||
$this->settings->setUserValue($this->userId, $this->appName,'show_'.$id,$visibility);
|
||||
$this->settings->setUserValue($this->userId, $this->appName,'show_'.$collectionID,$visibility);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
122
service/commentsservice.php
Normal file
122
service/commentsservice.php
Normal file
|
@ -0,0 +1,122 @@
|
|||
<?php
|
||||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2015 Raimund Schlüßler raimund.schluessler@googlemail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCA\Tasks\Service;
|
||||
|
||||
use \OCA\Tasks\Service\Helper;
|
||||
|
||||
Class CommentsService {
|
||||
|
||||
private $userId;
|
||||
private $helper;
|
||||
|
||||
public function __construct($userId, Helper $helper){
|
||||
$this->userId = $userId;
|
||||
$this->helper = $helper;
|
||||
}
|
||||
|
||||
/**
|
||||
* add comment to task by id
|
||||
* @param int $taskID
|
||||
* @param string $comment
|
||||
* @param int $tmpID
|
||||
* @return array
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function addComment($taskID, $comment, $tmpID){
|
||||
$vcalendar = \OC_Calendar_App::getVCalendar($taskID);
|
||||
$vtodo = $vcalendar->VTODO;
|
||||
|
||||
if($vtodo->COMMENT == "") {
|
||||
// if this is the first comment set the id to 0
|
||||
$commentId = 0;
|
||||
} else {
|
||||
// Determine new commentId by looping through all comments
|
||||
$commentIds = array();
|
||||
foreach($vtodo->COMMENT as $com) {
|
||||
$commentIds[] = (int)$com['X-OC-ID']->getValue();
|
||||
}
|
||||
$commentId = 1+max($commentIds);
|
||||
}
|
||||
|
||||
$now = new \DateTime();
|
||||
$vtodo->add('COMMENT',$comment,
|
||||
array(
|
||||
'X-OC-ID' => $commentId,
|
||||
'X-OC-USERID' => $this->userId,
|
||||
'X-OC-DATE-TIME' => $now->format('Ymd\THis\Z')
|
||||
)
|
||||
);
|
||||
$this->helper->editVCalendar($vcalendar, $taskID);
|
||||
$user_timezone = \OC_Calendar_App::getTimezone();
|
||||
$now->setTimezone(new \DateTimeZone($user_timezone));
|
||||
$comment = array(
|
||||
'taskID' => $taskID,
|
||||
'id' => $commentId,
|
||||
'tmpID' => $tmpID,
|
||||
'name' => \OC::$server->getUserManager()->get($this->userId)->getDisplayName(),
|
||||
'userID' => $this->userId,
|
||||
'comment' => $comment,
|
||||
'time' => $now->format('Ymd\THis')
|
||||
);
|
||||
return $comment;
|
||||
}
|
||||
|
||||
/**
|
||||
* delete comment of task by id
|
||||
* @param int $taskID
|
||||
* @param int $commentID
|
||||
* @return bool
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function deleteComment($taskID, $commentID){
|
||||
$vcalendar = \OC_Calendar_App::getVCalendar($taskID);
|
||||
$vtodo = $vcalendar->VTODO;
|
||||
$commentIndex = $this->getCommentById($vtodo,$commentID);
|
||||
$comment = $vtodo->children[$commentIndex];
|
||||
if($comment['X-OC-USERID']->getValue() == $this->userId){
|
||||
unset($vtodo->children[$commentIndex]);
|
||||
return $this->helper->editVCalendar($vcalendar, $taskID);
|
||||
} else {
|
||||
throw new \Exception('Not allowed.');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* sort get comment by ID
|
||||
*
|
||||
* @param object $vtodo
|
||||
* @param string $commentID
|
||||
* @return int
|
||||
* @throws \Exception
|
||||
*/
|
||||
private function getCommentById($vtodo,$commentID) {
|
||||
$idx = 0;
|
||||
foreach ($vtodo->children as $i => &$property) {
|
||||
if ( $property->name == 'COMMENT' && $property['X-OC-ID']->getValue() == $commentID ) {
|
||||
return $idx;
|
||||
}
|
||||
$idx += 1;
|
||||
}
|
||||
throw new \Exception('Commment not found.');
|
||||
}
|
||||
}
|
319
service/helper.php
Normal file
319
service/helper.php
Normal file
|
@ -0,0 +1,319 @@
|
|||
<?php
|
||||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2015 Raimund Schlüßler raimund.schluessler@googlemail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCA\Tasks\Service;
|
||||
|
||||
use Sabre\VObject;
|
||||
|
||||
Class Helper {
|
||||
|
||||
public function __construct(){
|
||||
}
|
||||
|
||||
/**
|
||||
* check if task is valid
|
||||
*
|
||||
* @param \OCA\Tasks\Db\Tasks $task
|
||||
* @return mixed
|
||||
*/
|
||||
public function checkTask($task) {
|
||||
$object = $this->readTask($task);
|
||||
if(!$object){
|
||||
return false;
|
||||
}
|
||||
if(\OC_Calendar_Object::getowner($task->getId()) !== \OC::$server->getUserSession()->getUser()->getUID()){
|
||||
$sharedAccessClassPermissions = \OC_Calendar_Object::getAccessClassPermissions($object);
|
||||
if (!($sharedAccessClassPermissions & \OCP\Constants::PERMISSION_READ)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
$taskID = $task->getId();
|
||||
$object = \OC_Calendar_Object::cleanByAccessClass($taskID, $object);
|
||||
$vtodo = $object->VTODO;
|
||||
$vtodo->ID = $taskID;
|
||||
return $vtodo;
|
||||
}
|
||||
|
||||
/**
|
||||
* read object from calendar data
|
||||
*
|
||||
* @param \OCA\Tasks\Db\Tasks $task
|
||||
* @return mixed
|
||||
*/
|
||||
private function readTask($task){
|
||||
if (is_null($task->getSummary())) {
|
||||
return false;
|
||||
}
|
||||
return \Sabre\VObject\Reader::read($task->getCalendardata());
|
||||
}
|
||||
|
||||
/**
|
||||
* select tasks
|
||||
*
|
||||
* @param array $tasks
|
||||
* @param string $type
|
||||
* @return array
|
||||
*/
|
||||
public function selectTasks($tasks, $type) {
|
||||
$notLoaded = 0;
|
||||
switch($type){
|
||||
case 'init': // Only select uncompleted tasks and the five most recent completed ones
|
||||
$count = count($tasks);
|
||||
$tasks_completed = $this->selectCompletedTasks($tasks);
|
||||
usort($tasks_completed, array($this, 'sortCompletedDate'));
|
||||
$tasks = array_merge($this->selectUncompletedTasks($tasks), array_slice($tasks_completed,0,5));
|
||||
$notLoaded = $count - count($tasks);
|
||||
break;
|
||||
case 'completed':
|
||||
$tasks = $this->selectCompletedTasks($tasks);
|
||||
break;
|
||||
case 'uncompleted':
|
||||
$tasks = $this->selectUncompletedTasks($tasks);
|
||||
break;
|
||||
}
|
||||
return array($notLoaded, $tasks);
|
||||
}
|
||||
|
||||
/**
|
||||
* select completed tasks
|
||||
*
|
||||
* @param array $tasks
|
||||
* @return array
|
||||
*/
|
||||
private function selectCompletedTasks($tasks) {
|
||||
return array_filter($tasks, function($task) {
|
||||
return $task['completed'];
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* select uncompleted tasks
|
||||
*
|
||||
* @param array $tasks
|
||||
* @return array
|
||||
*/
|
||||
private function selectUncompletedTasks($tasks) {
|
||||
return array_filter($tasks, function($task) {
|
||||
return !$task['completed'];
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* set property of a task
|
||||
*
|
||||
* @param int $taskID
|
||||
* @param string $property
|
||||
* @param mixed $value
|
||||
* @return bool
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function setProperty($taskID,$property,$value){
|
||||
$vcalendar = \OC_Calendar_App::getVCalendar($taskID);
|
||||
$vtodo = $vcalendar->VTODO;
|
||||
if($value){
|
||||
$vtodo->{$property} = $value;
|
||||
}else{
|
||||
unset($vtodo->{$property});
|
||||
}
|
||||
return $this->editVCalendar($vcalendar, $taskID);
|
||||
}
|
||||
|
||||
/**
|
||||
* edit VCalendar and set modification dates
|
||||
*
|
||||
* @param mixed $vcalendar
|
||||
* @param string $taskID
|
||||
* @return bool
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function editVCalendar($vcalendar, $taskID) {
|
||||
$vtodo = $vcalendar->VTODO;
|
||||
$vtodo->{'LAST-MODIFIED'}->setValue(new \DateTime('now', new \DateTimeZone('UTC')));
|
||||
$vtodo->DTSTAMP = new \DateTime('now', new \DateTimeZone('UTC'));
|
||||
return \OC_Calendar_Object::edit($taskID, $vcalendar->serialize());
|
||||
}
|
||||
|
||||
/**
|
||||
* format date
|
||||
*
|
||||
* @param string $date
|
||||
* @return \DateTime
|
||||
*/
|
||||
public function createDateFromUNIX($date) {
|
||||
if (!$date) {
|
||||
return null;
|
||||
}
|
||||
$timezone = \OC_Calendar_App::getTimezone();
|
||||
$date = new \DateTime('@'.$date);
|
||||
return $date->setTimezone(new \DateTimeZone($timezone));
|
||||
}
|
||||
|
||||
/**
|
||||
* parse reminder string
|
||||
*
|
||||
* @param string $date
|
||||
* @return string
|
||||
*/
|
||||
public function parseDateString($date) {
|
||||
$date = new \DateTime($date);
|
||||
return $this->formatDate($date);
|
||||
}
|
||||
|
||||
/**
|
||||
* parse reminder object
|
||||
*
|
||||
* @param object $date
|
||||
* @param string $modifier
|
||||
* @return string
|
||||
*/
|
||||
public function parseDateObject($date, $modifier='+0 days') {
|
||||
if(!$date) {
|
||||
return null;
|
||||
}
|
||||
return $this->formatDate($date->getDateTime(), $modifier);
|
||||
}
|
||||
|
||||
/**
|
||||
* format date object
|
||||
*
|
||||
* @param object $date
|
||||
* @param string $modifier
|
||||
* @return string
|
||||
*/
|
||||
private function formatDate($date, $modifier='+0 days') {
|
||||
$user_timezone = \OC_Calendar_App::getTimezone();
|
||||
$date->setTimezone(new \DateTimeZone($user_timezone));
|
||||
return $date->modify($modifier)->format('Ymd\THis');
|
||||
}
|
||||
|
||||
/**
|
||||
* sort tasks
|
||||
*
|
||||
* @param array $a
|
||||
* @param array $b
|
||||
* @return array
|
||||
*/
|
||||
public function sortCompletedDate($a, $b) {
|
||||
return $this->sort(\DateTime::createFromFormat('Ymd\THis', $a['completed_date']), \DateTime::createFromFormat('Ymd\THis', $b['completed_date']));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* sort tasks by completed
|
||||
*
|
||||
* @param array $a
|
||||
* @param array $b
|
||||
* @return int
|
||||
*/
|
||||
public function sortCompleted($a, $b) {
|
||||
return $this->sort($a['completed'], $b['completed']);
|
||||
}
|
||||
|
||||
/**
|
||||
* sort tasks by completed
|
||||
*
|
||||
* @param mixed $t1
|
||||
* @param mixed $t2
|
||||
* @return int
|
||||
*/
|
||||
public function sort($t1, $t2) {
|
||||
if ($t1 == $t2) {
|
||||
return 0;
|
||||
}
|
||||
return $t1 > $t2 ? 1 : -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* create calendar entry from request
|
||||
*
|
||||
* @param array $request
|
||||
* @return mixed
|
||||
*/
|
||||
public function createVCalendar($request){
|
||||
$vcalendar = new \Sabre\VObject\Component\VCalendar();
|
||||
$vcalendar->PRODID = 'ownCloud Calendar';
|
||||
$vcalendar->VERSION = '2.0';
|
||||
|
||||
$vtodo = $vcalendar->createComponent('VTODO');
|
||||
$vcalendar->add($vtodo);
|
||||
|
||||
$vtodo->CREATED = new \DateTime('now', new \DateTimeZone('UTC'));
|
||||
|
||||
$vtodo->UID = \Sabre\VObject\UUIDUtil::getUUID();
|
||||
return $this->addVTODO($vcalendar, $request);
|
||||
}
|
||||
|
||||
/**
|
||||
* update task from request
|
||||
*
|
||||
* @param array $request
|
||||
* @param mixed $vcalendar
|
||||
* @return mixed
|
||||
*/
|
||||
public function addVTODO($vcalendar, $request){
|
||||
$vtodo = $vcalendar->VTODO;
|
||||
$timezone = \OC_Calendar_App::getTimezone();
|
||||
$timezone = new \DateTimeZone($timezone);
|
||||
|
||||
$vtodo->{'LAST-MODIFIED'} = new \DateTime('now', new \DateTimeZone('UTC'));
|
||||
$vtodo->DTSTAMP = new \DateTime('now', new \DateTimeZone('UTC'));
|
||||
$vtodo->SUMMARY = $request['summary'];
|
||||
|
||||
if($request['starred']) {
|
||||
$vtodo->PRIORITY = 1; // prio: high
|
||||
}
|
||||
$due = $request['due'];
|
||||
if ($due) {
|
||||
$vtodo->DUE = new \DateTime($due, $timezone);
|
||||
}
|
||||
$start = $request['start'];
|
||||
if ($start) {
|
||||
$vtodo->DTSTART = new \DateTime($start, $timezone);
|
||||
}
|
||||
|
||||
return $vcalendar;
|
||||
}
|
||||
|
||||
/**
|
||||
* check if task contains query
|
||||
*
|
||||
* @param mixed $vtodo
|
||||
* @param string $query
|
||||
* @return array
|
||||
*/
|
||||
public function checkTaskByQuery($vtodo, $query) {
|
||||
// check these properties
|
||||
$properties = array('SUMMARY', 'DESCRIPTION', 'LOCATION', 'CATEGORIES', 'COMMENT');
|
||||
foreach ($properties as $property) {
|
||||
$strings = $vtodo->{$property};
|
||||
if ($strings) {
|
||||
foreach ($strings as $string) {
|
||||
$needle = $string->getValue();
|
||||
if (stripos($needle, $query) !== false) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
|
@ -1,4 +1,25 @@
|
|||
<?php
|
||||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2015 Raimund Schlüßler raimund.schluessler@googlemail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCA\Tasks\Service;
|
||||
|
||||
class ListsService {
|
||||
|
@ -10,95 +31,88 @@ class ListsService {
|
|||
}
|
||||
|
||||
/**
|
||||
* get all lists
|
||||
* get all calendars
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getAll() {
|
||||
$calendar = new \OC_Calendar_Calendar();
|
||||
$lists = $calendar::allCalendars($this->userId, true);
|
||||
return $lists;
|
||||
return \OC_Calendar_Calendar::allCalendars($this->userId, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* add a list
|
||||
*
|
||||
* @param $name
|
||||
* @param $tmpID
|
||||
* @param string $name
|
||||
* @param string $tmpID
|
||||
* @return array
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function add($name, $tmpID) {
|
||||
if(trim($name) == '') {
|
||||
// OCP\JSON::error(array('message'=>'empty'));
|
||||
exit;
|
||||
throw new \Exception('An empty name is not allowed.');
|
||||
}
|
||||
$calendars = \OC_Calendar_Calendar::allCalendars($this->userId, true);
|
||||
foreach($calendars as $cal) {
|
||||
if($cal['displayname'] == $name) {
|
||||
// OCP\JSON::error(array('message'=>'namenotavailable'));
|
||||
exit;
|
||||
}
|
||||
if ($this->isListnameUsed($name)) {
|
||||
throw new \Exception('Calendar name already used.');
|
||||
}
|
||||
$color = '#CCCCCC';
|
||||
$calendarId = \OC_Calendar_Calendar::addCalendar($this->userId, strip_tags($name), 'VEVENT,VTODO,VJOURNAL', null, 0, $color);
|
||||
\OC_Calendar_Calendar::setCalendarActive($calendarId, 1);
|
||||
$list = \OC_Calendar_Calendar::find($calendarId);
|
||||
$listID = \OC_Calendar_Calendar::addCalendar($this->userId, strip_tags($name), 'VEVENT,VTODO,VJOURNAL', null, 0, $color);
|
||||
\OC_Calendar_Calendar::setCalendarActive($listID, 1);
|
||||
$list = \OC_Calendar_Calendar::find($listID);
|
||||
|
||||
$list['tmpID'] = $tmpID;
|
||||
return $list;
|
||||
}
|
||||
|
||||
/**
|
||||
* delete list by id
|
||||
* delete list by listID
|
||||
*
|
||||
* @param $id
|
||||
* @param string $listID
|
||||
* @return array
|
||||
*/
|
||||
public function delete($id) {
|
||||
try {
|
||||
$del = \OC_Calendar_Calendar::deleteCalendar($id);
|
||||
if($del == true) {
|
||||
return array(
|
||||
'data' => array()
|
||||
);
|
||||
} else {
|
||||
return array('error'=>'dberror');
|
||||
}
|
||||
} catch(\Exception $e) {
|
||||
return array('message'=>$e->getMessage());
|
||||
public function delete($listID) {
|
||||
$del = \OC_Calendar_Calendar::deleteCalendar($listID);
|
||||
if(!$del) {
|
||||
throw new \Exception('Calendar cannot be deleted.');
|
||||
}
|
||||
return array(
|
||||
'data' => array()
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* set name of list by id
|
||||
* set name of list by listID
|
||||
*
|
||||
* @param $id
|
||||
* @param $name
|
||||
* @param string $listID
|
||||
* @param string $name
|
||||
* @return array
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function setName($id, $name) {
|
||||
public function setName($listID, $name) {
|
||||
if(trim($name) == '') {
|
||||
// OCP\JSON::error(array('message'=>'empty'));
|
||||
exit;
|
||||
throw new \Exception('An empty name is not allowed.');
|
||||
}
|
||||
$calendars = \OC_Calendar_Calendar::allCalendars($this->userId, true);
|
||||
foreach($calendars as $cal) {
|
||||
if($cal['userid'] != $this->userId){
|
||||
continue;
|
||||
}
|
||||
if($cal['displayname'] == $name && $cal['id'] != $id) {
|
||||
// OCP\JSON::error(array('message'=>'namenotavailable'));
|
||||
exit;
|
||||
}
|
||||
if ($this->isListnameUsed($name, $listID)) {
|
||||
throw new \Exception('Calendar name already used.');
|
||||
}
|
||||
|
||||
$color = '#CCCCCC';
|
||||
\OC_Calendar_Calendar::editCalendar($id, strip_tags($name), null, null, null, $color);
|
||||
|
||||
\OC_Calendar_Calendar::editCalendar($listID, strip_tags($name), null, null, null, $color);
|
||||
return array();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
/**
|
||||
* check if list name is used by other list
|
||||
*
|
||||
* @param string $name
|
||||
* @param string $listID
|
||||
* @return bool
|
||||
*/
|
||||
private function isListnameUsed($name, $listID=null) {
|
||||
$calendars = \OC_Calendar_Calendar::allCalendars($this->userId, true);
|
||||
foreach($calendars as $cal) {
|
||||
if($cal['displayname'] == $name && $cal['id'] != $listID) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
228
service/reminderservice.php
Normal file
228
service/reminderservice.php
Normal file
|
@ -0,0 +1,228 @@
|
|||
<?php
|
||||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2015 Raimund Schlüßler raimund.schluessler@googlemail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCA\Tasks\Service;
|
||||
|
||||
use \OCA\Tasks\Service\Helper;
|
||||
use Sabre\VObject;
|
||||
|
||||
Class ReminderService {
|
||||
|
||||
private $helper;
|
||||
|
||||
public function __construct(Helper $helper){
|
||||
$this->helper = $helper;
|
||||
}
|
||||
|
||||
/**
|
||||
* create reminder for task
|
||||
* @param int $taskID
|
||||
* @param string $type
|
||||
* @param mixed $action
|
||||
* @param mixed $date
|
||||
* @param bool $invert
|
||||
* @param string $related
|
||||
* @param mixed $week
|
||||
* @param mixed $day
|
||||
* @param mixed $hour
|
||||
* @param mixed $minute
|
||||
* @param mixed $second
|
||||
* @return bool
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function createReminder($taskID, $type, $action, $date, $invert, $related = null, $week, $day, $hour, $minute, $second) {
|
||||
$types = array('DATE-TIME','DURATION');
|
||||
$vcalendar = \OC_Calendar_App::getVCalendar($taskID);
|
||||
$vtodo = $vcalendar->VTODO;
|
||||
$valarm = $vtodo->VALARM;
|
||||
|
||||
if (in_array($type,$types)) {
|
||||
if($valarm == null) {
|
||||
$valarm = $vcalendar->createComponent('VALARM');
|
||||
$valarm->ACTION = $action;
|
||||
$valarm->DESCRIPTION = 'Default Event Notification';
|
||||
$vtodo->add($valarm);
|
||||
} else {
|
||||
unset($valarm->TRIGGER);
|
||||
}
|
||||
$string = '';
|
||||
if ($type == 'DATE-TIME') {
|
||||
$string = $this->createReminderDateTime($date);
|
||||
} elseif ($type == 'DURATION') {
|
||||
$string = $this->createReminderDuration($week, $day, $hour, $minute, $second, $invert);
|
||||
}
|
||||
if($related == 'END'){
|
||||
$valarm->add('TRIGGER', $string, array('VALUE' => $type, 'RELATED' => $related));
|
||||
} else {
|
||||
$valarm->add('TRIGGER', $string, array('VALUE' => $type));
|
||||
}
|
||||
} else {
|
||||
unset($vtodo->VALARM);
|
||||
}
|
||||
return $this->helper->editVCalendar($vcalendar, $taskID);
|
||||
}
|
||||
|
||||
/**
|
||||
* parse reminder date-time
|
||||
*
|
||||
* @param string $date
|
||||
* @return string
|
||||
*/
|
||||
private function createReminderDateTime($date) {
|
||||
$date = new \DateTime('@'.$date);
|
||||
return $date->format('Ymd\THis\Z');
|
||||
}
|
||||
|
||||
/**
|
||||
* parse reminder duration
|
||||
*
|
||||
* @param bool $invert
|
||||
* @param mixed $week
|
||||
* @param mixed $day
|
||||
* @param mixed $hour
|
||||
* @param mixed $minute
|
||||
* @param mixed $second
|
||||
* @return string
|
||||
*/
|
||||
private function createReminderDuration($week, $day, $hour, $minute, $second, $invert) {
|
||||
// Create duration string
|
||||
$string = 'PT0S';
|
||||
$P = array(
|
||||
'W' => $week,
|
||||
'D' => $day,
|
||||
);
|
||||
$P = array_filter($P);
|
||||
$T = array(
|
||||
'H' => $hour,
|
||||
'M' => $minute,
|
||||
'S' => $second,
|
||||
);
|
||||
$T = array_filter($T);
|
||||
if(count($P) || count($T)) {
|
||||
$string = '';
|
||||
$string .= $invert ? '-' : '';
|
||||
$string .= 'P';
|
||||
$string .= implode('' , array_map(function($value, $key) {
|
||||
return $value.$key;
|
||||
}, $P, array_keys($P))
|
||||
);
|
||||
$string .= 'T';
|
||||
$string .= implode('' , array_map(function($value, $key) {
|
||||
return $value.$key;
|
||||
}, $T, array_keys($T))
|
||||
);
|
||||
}
|
||||
return $string;
|
||||
}
|
||||
|
||||
/**
|
||||
* parse reminder
|
||||
*
|
||||
* @param mixed $reminder
|
||||
* @param object $start
|
||||
* @param object $due
|
||||
* @return array
|
||||
*/
|
||||
public function parseReminder($reminder, $start, $due) {
|
||||
if(!$reminder) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!$reminder->TRIGGER['VALUE']){
|
||||
throw new \Exception('Reminder type not specified.');
|
||||
}
|
||||
$reminderType = $reminder->TRIGGER['VALUE']->getValue();
|
||||
|
||||
if (!$reminder->ACTION) {
|
||||
throw new \Exception('Reminder action not specified.');
|
||||
}
|
||||
$reminderAction = $reminder->ACTION->getValue();
|
||||
|
||||
$reminderDate = null;
|
||||
$reminderDuration = null;
|
||||
|
||||
if($reminderType == 'DATE-TIME'){
|
||||
$reminderDate = $this->helper->parseDateString($reminder->TRIGGER);
|
||||
} elseif ($reminderType == 'DURATION') {
|
||||
list($related, $reminderDate) = $this->parseReminderDuration($reminder, $due, $start);
|
||||
$reminderDuration = $this->parseReminderDurationString($reminder, $related);
|
||||
}
|
||||
return array(
|
||||
'type' => $reminderType,
|
||||
'action' => $reminderAction,
|
||||
'date' => $reminderDate,
|
||||
'duration' => $reminderDuration,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* parse reminder duration
|
||||
*
|
||||
* @param mixed $reminder
|
||||
* @param object $due
|
||||
* @param object $start
|
||||
* @return string
|
||||
*/
|
||||
private function parseReminderDuration($reminder, $due, $start) {
|
||||
$parsed = VObject\DateTimeParser::parseDuration($reminder->TRIGGER,true);
|
||||
// Calculate the reminder date from duration and start date
|
||||
$related = null;
|
||||
if(is_object($reminder->TRIGGER['RELATED'])){
|
||||
$related = $reminder->TRIGGER['RELATED']->getValue();
|
||||
if($related == 'END' && $due){
|
||||
$reminderDate = $this->helper->parseDateObject($due, $parsed);
|
||||
} else {
|
||||
throw new \Exception('Reminder duration related to not available date.');
|
||||
}
|
||||
} elseif ($start) {
|
||||
$reminderDate = $this->helper->parseDateObject($start, $parsed);
|
||||
} else{
|
||||
throw new \Exception('Reminder duration related to not available date.');
|
||||
};
|
||||
return array($related, $reminderDate);
|
||||
}
|
||||
|
||||
/**
|
||||
* parse reminder date-time
|
||||
*
|
||||
* @param mixed $reminder
|
||||
* @param string $related
|
||||
* @return string
|
||||
*/
|
||||
private function parseReminderDurationString($reminder, $related) {
|
||||
preg_match('/^(?P<plusminus>\+|-)?P((?P<week>\d+)W)?((?P<day>\d+)D)?(T((?P<hour>\d+)H)?((?P<minute>\d+)M)?((?P<second>\d+)S)?)?$/', $reminder->TRIGGER, $matches);
|
||||
$invert = $matches['plusminus']==='-' ? true: false;
|
||||
$keys = array('week', 'day', 'hour', 'minute', 'second');
|
||||
$reminderDuration = array();
|
||||
foreach($keys as $key) {
|
||||
$reminderDuration[$key] = empty($matches[$key]) ? 0 : (int) $matches[$key];
|
||||
}
|
||||
$tmp = array_keys(array_filter($reminderDuration));
|
||||
$reminderDuration['token'] = count($tmp) ? $tmp[0] : 'week';
|
||||
$reminderDuration['params'] = array(
|
||||
'id' => (int)$invert.(int)($related == 'END'),
|
||||
'related' => $related?$related:'START',
|
||||
'invert' => $invert,
|
||||
);
|
||||
return $reminderDuration;
|
||||
}
|
||||
}
|
|
@ -1,4 +1,25 @@
|
|||
<?php
|
||||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2015 Raimund Schlüßler raimund.schluessler@googlemail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCA\Tasks\Service;
|
||||
|
||||
use OCP\IConfig;
|
||||
|
@ -45,4 +66,4 @@ class SettingsService {
|
|||
$this->settings->setUserValue($this->userId, $this->appName, $type.'_'.$setting, $value);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
169
service/taskparser.php
Normal file
169
service/taskparser.php
Normal file
|
@ -0,0 +1,169 @@
|
|||
<?php
|
||||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2015 Raimund Schlüßler raimund.schluessler@googlemail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCA\Tasks\Service;
|
||||
|
||||
use \OCA\Tasks\Service\ReminderService;
|
||||
use \OCA\Tasks\Service\Helper;
|
||||
use Sabre\VObject;
|
||||
|
||||
Class TaskParser {
|
||||
|
||||
private $reminderService;
|
||||
private $helper;
|
||||
|
||||
public function __construct(ReminderService $reminderService, Helper $helper){
|
||||
$this->reminderService = $reminderService;
|
||||
$this->helper = $helper;
|
||||
}
|
||||
|
||||
/**
|
||||
* parse task
|
||||
*
|
||||
* @param mixed $vtodo
|
||||
* @param string $calendarID
|
||||
* @return string
|
||||
*/
|
||||
public function parseTask($vtodo, $calendarID){
|
||||
$task = array( 'id' => (string) $vtodo->ID);
|
||||
$task['calendarid'] = $calendarID;
|
||||
$task['type'] = 'task';
|
||||
$task['name'] = (string) $vtodo->SUMMARY;
|
||||
$task['created'] = (string) $vtodo->CREATED;
|
||||
$task['note'] = (string) $vtodo->DESCRIPTION;
|
||||
$task['location'] = (string) $vtodo->LOCATION;
|
||||
$task['categories'] = $this->parseCategories($vtodo->CATEGORIES);
|
||||
$task['start'] = $this->helper->parseDateObject($vtodo->DTSTART);
|
||||
$task['due'] = $this->helper->parseDateObject($vtodo->DUE);
|
||||
$task['completed_date'] = $this->helper->parseDateObject($vtodo->COMPLETED);
|
||||
$task['completed'] = (bool) $task['completed_date'];
|
||||
$task['reminder'] = $this->reminderService->parseReminder($vtodo->VALARM, $vtodo->DTSTART, $vtodo->DUE);
|
||||
$task['priority'] = $this->parsePriority($vtodo->PRIORITY);
|
||||
$task['starred'] = $this->parseStarred($task['priority']);
|
||||
$task['complete'] = $this->parsePercentCompleted($vtodo->{'PERCENT-COMPLETE'});
|
||||
$task['comments'] = $this->parseComments($vtodo->COMMENT);
|
||||
return $task;
|
||||
}
|
||||
|
||||
/**
|
||||
* parse starred
|
||||
*
|
||||
* @param mixed $priority
|
||||
* @return bool
|
||||
*/
|
||||
private function parseStarred($priority) {
|
||||
if ((int) $priority > 5) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* parse priority
|
||||
*
|
||||
* @param mixed $priority
|
||||
* @return string
|
||||
*/
|
||||
private function parsePriority($priority) {
|
||||
if(isset($priority)){
|
||||
return (string) (10 - $priority->getValue()) % 10;
|
||||
} else {
|
||||
return '0';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* parse categories
|
||||
*
|
||||
* @param mixed $categories
|
||||
* @return array
|
||||
*/
|
||||
private function parseCategories($categories) {
|
||||
if ($categories){
|
||||
return $categories->getParts();
|
||||
} else {
|
||||
return array();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* parse percent completed
|
||||
*
|
||||
* @param mixed $percentComplete
|
||||
* @return string
|
||||
*/
|
||||
private function parsePercentCompleted($percentComplete) {
|
||||
if($percentComplete){
|
||||
return $percentComplete->getValue();
|
||||
} else {
|
||||
return '0';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* parse comments
|
||||
*
|
||||
* @param mixed $comments
|
||||
* @return array
|
||||
*/
|
||||
private function parseComments($comments){
|
||||
$comments_parsed = array();
|
||||
if($comments){
|
||||
foreach($comments as $com) {
|
||||
// parse time
|
||||
$time = $this->helper->parseDateString($com['X-OC-DATE-TIME']);
|
||||
// parse comment ID
|
||||
$comID = $com['X-OC-ID'];
|
||||
// parse user ID
|
||||
$userID = $com['X-OC-USERID'];
|
||||
|
||||
if ($this->isCommentValid($time, $comID, $userID)) {
|
||||
$userID = (string) $userID->getValue();
|
||||
$user = \OC::$server->getUserManager()->get($userID);
|
||||
if ($user) {
|
||||
$comments_parsed[] = array(
|
||||
'id' => $comID->getValue(),
|
||||
'userID' => $userID,
|
||||
'name' => $user->getDisplayName(),
|
||||
'comment' => $com->getValue(),
|
||||
'time' => $time,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return $comments_parsed;
|
||||
}
|
||||
|
||||
/**
|
||||
* check if comment is valid
|
||||
*
|
||||
* @param string $time
|
||||
* @param string $comID
|
||||
* @param string $userID
|
||||
* @return bool
|
||||
*/
|
||||
private function isCommentValid($time, $comID, $userID) {
|
||||
return ($time && $comID && $userID);
|
||||
}
|
||||
}
|
|
@ -1,14 +1,43 @@
|
|||
<?php
|
||||
/**
|
||||
* ownCloud - Tasks
|
||||
*
|
||||
* @author Raimund Schlüßler
|
||||
* @copyright 2015 Raimund Schlüßler raimund.schluessler@googlemail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCA\Tasks\Service;
|
||||
|
||||
use \OCA\Tasks\Controller\Helper;
|
||||
use \OCA\Tasks\Service\Helper;
|
||||
use \OCA\Tasks\Service\TaskParser;
|
||||
use \OCA\Tasks\Db\TasksMapper;
|
||||
|
||||
class TasksService {
|
||||
|
||||
private $userId;
|
||||
private $tasksMapper;
|
||||
private $helper;
|
||||
private $taskParser;
|
||||
|
||||
public function __construct($userId){
|
||||
public function __construct($userId, TasksMapper $tasksMapper, Helper $helper, TaskParser $taskParser){
|
||||
$this->userId = $userId;
|
||||
$this->tasksMapper = $tasksMapper;
|
||||
$this->helper = $helper;
|
||||
$this->taskParser = $taskParser;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -21,7 +50,6 @@ class TasksService {
|
|||
*/
|
||||
public function getAll($listID = 'all', $type = 'all'){
|
||||
|
||||
$user_timezone = \OC_Calendar_App::getTimezone();
|
||||
if ($listID == 'all'){
|
||||
$calendars = \OC_Calendar_Calendar::allCalendars($this->userId, true);
|
||||
} else {
|
||||
|
@ -32,57 +60,11 @@ class TasksService {
|
|||
$tasks = array();
|
||||
$lists = array();
|
||||
foreach( $calendars as $calendar ) {
|
||||
$calendar_entries = \OC_Calendar_Object::all($calendar['id']);
|
||||
$tasks_selected = array();
|
||||
foreach( $calendar_entries as $task ) {
|
||||
if($task['objecttype']!='VTODO') {
|
||||
continue;
|
||||
}
|
||||
if(is_null($task['summary'])) {
|
||||
continue;
|
||||
}
|
||||
if(!($vtodo = Helper::parseVTODO($task))){
|
||||
continue;
|
||||
}
|
||||
$task_data = Helper::arrayForJSON($task['id'], $vtodo, $user_timezone, $calendar['id']);
|
||||
switch($type){
|
||||
case 'all':
|
||||
$tasks[] = $task_data;
|
||||
break;
|
||||
case 'init':
|
||||
if (!$task_data['completed']){
|
||||
$tasks[] = $task_data;
|
||||
} else {
|
||||
$tasks_selected[] = $task_data;
|
||||
}
|
||||
break;
|
||||
case 'completed':
|
||||
if ($task_data['completed']){
|
||||
$tasks[] = $task_data;
|
||||
}
|
||||
break;
|
||||
case 'uncompleted':
|
||||
if (!$task_data['completed']){
|
||||
$tasks[] = $task_data;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
$nrCompleted = 0;
|
||||
$notLoaded = 0;
|
||||
usort($tasks_selected, array($this, 'sort_completed'));
|
||||
foreach( $tasks_selected as $task_selected){
|
||||
$nrCompleted++;
|
||||
if ($nrCompleted > 5){
|
||||
$notLoaded++;
|
||||
continue;
|
||||
}
|
||||
$tasks[] = $task_selected;
|
||||
}
|
||||
$lists[] = array(
|
||||
'id' => $calendar['id'],
|
||||
'notLoaded' => $notLoaded
|
||||
);
|
||||
$calendar_entries = $this->tasksMapper->findAllVTODOs($calendar['id']);
|
||||
|
||||
list($lists[], $tasks_calendar) = $this->getTasks($calendar_entries, $type, $calendar['id']);
|
||||
|
||||
$tasks = array_merge($tasks, $tasks_calendar);
|
||||
}
|
||||
return array(
|
||||
'tasks' => $tasks,
|
||||
|
@ -90,6 +72,33 @@ class TasksService {
|
|||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* get tasks
|
||||
*
|
||||
* @param array $calendar_entries
|
||||
* @param string $type
|
||||
* @param string $calendarID
|
||||
* @return array
|
||||
*/
|
||||
public function getTasks($calendar_entries, $type, $calendarID) {
|
||||
$list = array(
|
||||
'id' => $calendarID,
|
||||
'notLoaded' => 0
|
||||
);
|
||||
$host = $this;
|
||||
$VTODOs = array_map(function($task) use ($host) {
|
||||
return $host->helper->checkTask($task);
|
||||
}, $calendar_entries);
|
||||
$VTODOs = array_filter($VTODOs);
|
||||
|
||||
$tasks = array_map(function($task) use ($host, $calendarID) {
|
||||
return $host->taskParser->parseTask($task, $calendarID);
|
||||
},$VTODOs);
|
||||
|
||||
list($list['notLoaded'], $tasks) = $this->helper->selectTasks($tasks, $type);
|
||||
return array($list, $tasks);
|
||||
}
|
||||
|
||||
/**
|
||||
* get task by id
|
||||
*
|
||||
|
@ -97,21 +106,45 @@ class TasksService {
|
|||
* @return array
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function get($taskID){
|
||||
$object = \OC_Calendar_App::getEventObject($taskID);
|
||||
$user_timezone = \OC_Calendar_App::getTimezone();
|
||||
public function getTask($taskID){
|
||||
$calendar_entry = $this->tasksMapper->findVTODOById($taskID);
|
||||
$task = array();
|
||||
if($object['objecttype']=='VTODO' && !is_null($object['summary'])) {
|
||||
if($vtodo = Helper::parseVTODO($object)){
|
||||
$task_data = Helper::arrayForJSON($object['id'], $vtodo, $user_timezone, $object['calendarid']);
|
||||
$task[] = $task_data;
|
||||
}
|
||||
$vtodo = $this->helper->checkTask($calendar_entry);
|
||||
if($vtodo){
|
||||
$task_data = $this->taskParser->parseTask($vtodo, $calendar_entry->getCalendarid());
|
||||
$task[] = $task_data;
|
||||
}
|
||||
return array(
|
||||
'tasks' => $task
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Search for query in tasks
|
||||
*
|
||||
* @param string $query
|
||||
* @return array
|
||||
*/
|
||||
public function search($query) {
|
||||
$calendars = \OC_Calendar_Calendar::allCalendars($this->userId, true);
|
||||
$results = array();
|
||||
foreach ($calendars as $calendar) {
|
||||
$calendar_entries = $this->tasksMapper->findAllVTODOs($calendar['id']);
|
||||
// search all calendar objects, one by one
|
||||
foreach ($calendar_entries as $calendar_entry) {
|
||||
$vtodo = $this->helper->checkTask($calendar_entry);
|
||||
if(!$vtodo){
|
||||
continue;
|
||||
}
|
||||
if($this->helper->checkTaskByQuery($vtodo, $query)) {
|
||||
$results[] = $this->taskParser->parseTask($vtodo, $calendar_entry->getCalendarid());
|
||||
}
|
||||
}
|
||||
}
|
||||
usort($results, array($this->helper, 'sortCompleted'));
|
||||
return $results;
|
||||
}
|
||||
|
||||
/**
|
||||
* create new task
|
||||
*
|
||||
|
@ -124,20 +157,17 @@ class TasksService {
|
|||
* @return array
|
||||
*/
|
||||
public function add($taskName, $calendarId, $starred, $due, $start, $tmpID){
|
||||
$user_timezone = \OC_Calendar_App::getTimezone();
|
||||
$request = array(
|
||||
'summary' => $taskName,
|
||||
'categories' => null,
|
||||
'priority' => $starred,
|
||||
'location' => null,
|
||||
'starred' => $starred,
|
||||
'due' => $due,
|
||||
'start' => $start,
|
||||
'description' => null
|
||||
);
|
||||
$vcalendar = Helper::createVCalendarFromRequest($request);
|
||||
$taskID = \OC_Calendar_Object::add($calendarId, $vcalendar->serialize());
|
||||
$vcalendar = $this->helper->createVCalendar($request);
|
||||
$vtodo = $vcalendar->VTODO;
|
||||
$vtodo->ID = \OC_Calendar_Object::add($calendarId, $vcalendar->serialize());
|
||||
|
||||
$task = Helper::arrayForJSON($taskID, $vcalendar->VTODO, $user_timezone, $calendarId);
|
||||
$task = $this->taskParser->parseTask($vtodo, $calendarId);
|
||||
|
||||
$task['tmpID'] = $tmpID;
|
||||
return $task;
|
||||
|
@ -161,10 +191,7 @@ class TasksService {
|
|||
* @throws \Exception
|
||||
*/
|
||||
public function setName($taskID, $name) {
|
||||
$vcalendar = \OC_Calendar_App::getVCalendar($taskID);
|
||||
$vtodo = $vcalendar->VTODO;
|
||||
$vtodo->SUMMARY = $name;
|
||||
return \OC_Calendar_Object::edit($taskID, $vcalendar->serialize());
|
||||
return $this->helper->setProperty($taskID,'SUMMARY',$name);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -210,7 +237,7 @@ class TasksService {
|
|||
$vtodo->STATUS = 'NEEDS-ACTION';
|
||||
unset($vtodo->COMPLETED);
|
||||
}
|
||||
return \OC_Calendar_Object::edit($taskID, $vcalendar->serialize());
|
||||
return $this->helper->editVCalendar($vcalendar, $taskID);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -222,14 +249,8 @@ class TasksService {
|
|||
* @throws \Exception
|
||||
*/
|
||||
public function setPriority($taskID, $priority){
|
||||
$vcalendar = \OC_Calendar_App::getVCalendar($taskID);
|
||||
$vtodo = $vcalendar->VTODO;
|
||||
if($priority){
|
||||
$vtodo->PRIORITY = (10 - $priority) % 10;
|
||||
}else{
|
||||
unset($vtodo->{'PRIORITY'});
|
||||
}
|
||||
return \OC_Calendar_Object::edit($taskID, $vcalendar->serialize());
|
||||
$priority = (10 - $priority) % 10;
|
||||
return $this->helper->setProperty($taskID,'PRIORITY',$priority);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -241,115 +262,19 @@ class TasksService {
|
|||
* @throws \Exception
|
||||
*/
|
||||
public function setDueDate($taskID, $dueDate) {
|
||||
$vcalendar = \OC_Calendar_App::getVCalendar($taskID);
|
||||
$vtodo = $vcalendar->VTODO;
|
||||
if ($dueDate != false) {
|
||||
$timezone = \OC_Calendar_App::getTimezone();
|
||||
$timezone = new \DateTimeZone($timezone);
|
||||
|
||||
$dueDate = new \DateTime('@'.$dueDate);
|
||||
$dueDate->setTimezone($timezone);
|
||||
$vtodo->DUE = $dueDate;
|
||||
} else {
|
||||
unset($vtodo->DUE);
|
||||
}
|
||||
return \OC_Calendar_Object::edit($taskID, $vcalendar->serialize());
|
||||
}
|
||||
|
||||
public function setStartDate($taskID, $startDate) {
|
||||
$vcalendar = \OC_Calendar_App::getVCalendar($taskID);
|
||||
$vtodo = $vcalendar->VTODO;
|
||||
if ($startDate != false) {
|
||||
$timezone = \OC_Calendar_App::getTimezone();
|
||||
$timezone = new \DateTimeZone($timezone);
|
||||
|
||||
$startDate = new \DateTime('@'.$startDate);
|
||||
$startDate->setTimezone($timezone);
|
||||
$vtodo->DTSTART = $startDate;
|
||||
} else {
|
||||
unset($vtodo->DTSTART);
|
||||
}
|
||||
return \OC_Calendar_Object::edit($taskID, $vcalendar->serialize());
|
||||
return $this->helper->setProperty($taskID, 'DUE', $this->helper->createDateFromUNIX($dueDate));
|
||||
}
|
||||
|
||||
/**
|
||||
* set reminder date of task by id
|
||||
* set start date of task by id
|
||||
*
|
||||
* @param int $taskID
|
||||
* @param string $type
|
||||
* @param mixed $action
|
||||
* @param mixed $date
|
||||
* @param bool $invert
|
||||
* @param string $related
|
||||
* @param mixed $week
|
||||
* @param mixed $day
|
||||
* @param mixed $hour
|
||||
* @param mixed $minute
|
||||
* @param mixed $second
|
||||
* @param mixed $startDate
|
||||
* @return bool
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function setReminderDate($taskID, $type, $action, $date, $invert, $related = null, $week, $day, $hour, $minute, $second){
|
||||
$types = array('DATE-TIME','DURATION');
|
||||
|
||||
$vcalendar = \OC_Calendar_App::getVCalendar($taskID);
|
||||
$vtodo = $vcalendar->VTODO;
|
||||
$valarm = $vtodo->VALARM;
|
||||
|
||||
if ($type == false){
|
||||
unset($vtodo->VALARM);
|
||||
$vtodo->{'LAST-MODIFIED'}->setValue(new \DateTime('now', new \DateTimeZone('UTC')));
|
||||
$vtodo->DTSTAMP = new \DateTime('now', new \DateTimeZone('UTC'));
|
||||
return \OC_Calendar_Object::edit($taskID, $vcalendar->serialize());
|
||||
}
|
||||
elseif (in_array($type,$types)) {
|
||||
if($valarm == null) {
|
||||
$valarm = $vcalendar->createComponent('VALARM');
|
||||
$valarm->ACTION = $action;
|
||||
$valarm->DESCRIPTION = 'Default Event Notification';
|
||||
$vtodo->add($valarm);
|
||||
} else {
|
||||
unset($valarm->TRIGGER);
|
||||
}
|
||||
$tv = '';
|
||||
if ($type == 'DATE-TIME') {
|
||||
$date = new \DateTime('@'.$date);
|
||||
$tv = $date->format('Ymd\THis\Z');
|
||||
} elseif ($type == 'DURATION') {
|
||||
// Create duration string
|
||||
if($week || $day || $hour || $minute || $second) {
|
||||
if ($invert){
|
||||
$tv.='-';
|
||||
}
|
||||
$tv.='P';
|
||||
if ($week){
|
||||
$tv.=$week.'W';
|
||||
}
|
||||
if ($day){
|
||||
$tv.=$day.'D';
|
||||
}
|
||||
$tv.='T';
|
||||
if ($hour){
|
||||
$tv.=$hour.'H';
|
||||
}
|
||||
if ($minute){
|
||||
$tv.=$minute.'M';
|
||||
}
|
||||
if ($second){
|
||||
$tv.=$second.'S';
|
||||
}
|
||||
}else{
|
||||
$tv = 'PT0S';
|
||||
}
|
||||
}
|
||||
if($related == 'END'){
|
||||
$valarm->add('TRIGGER', $tv, array('VALUE' => $type, 'RELATED' => $related));
|
||||
} else {
|
||||
$valarm->add('TRIGGER', $tv, array('VALUE' => $type));
|
||||
}
|
||||
$vtodo->{'LAST-MODIFIED'}->setValue(new \DateTime('now', new \DateTimeZone('UTC')));
|
||||
$vtodo->DTSTAMP = new \DateTime('now', new \DateTimeZone('UTC'));
|
||||
return \OC_Calendar_Object::edit($taskID, $vcalendar->serialize());
|
||||
}
|
||||
public function setStartDate($taskID, $startDate) {
|
||||
return $this->helper->setProperty($taskID, 'DTSTART', $this->helper->createDateFromUNIX($startDate));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -372,7 +297,7 @@ class TasksService {
|
|||
if (!in_array($category, $taskcategories)){
|
||||
$taskcategories[] = $category;
|
||||
$vtodo->CATEGORIES = $taskcategories;
|
||||
return \OC_Calendar_Object::edit($taskID, $vcalendar->serialize());
|
||||
return $this->helper->editVCalendar($vcalendar, $taskID);
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
|
@ -392,18 +317,19 @@ class TasksService {
|
|||
$categories = $vtodo->CATEGORIES;
|
||||
if ($categories){
|
||||
$taskcategories = $categories->getParts();
|
||||
}
|
||||
// remove category
|
||||
$key = array_search($category, $taskcategories);
|
||||
if ($key !== null && $key !== false){
|
||||
unset($taskcategories[$key]);
|
||||
if(count($taskcategories)){
|
||||
$vtodo->CATEGORIES = $taskcategories;
|
||||
} else{
|
||||
unset($vtodo->{'CATEGORIES'});
|
||||
// remove category
|
||||
$key = array_search($category, $taskcategories);
|
||||
if ($key !== null && $key !== false){
|
||||
unset($taskcategories[$key]);
|
||||
if(count($taskcategories)){
|
||||
$vtodo->CATEGORIES = $taskcategories;
|
||||
} else{
|
||||
unset($vtodo->{'CATEGORIES'});
|
||||
}
|
||||
return $this->helper->editVCalendar($vcalendar, $taskID);
|
||||
}
|
||||
return \OC_Calendar_Object::edit($taskID, $vcalendar->serialize());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -414,10 +340,7 @@ class TasksService {
|
|||
* @throws \Exception
|
||||
*/
|
||||
public function setLocation($taskID, $location){
|
||||
$vcalendar = \OC_Calendar_App::getVCalendar($taskID);
|
||||
$vtodo = $vcalendar->VTODO;
|
||||
$vtodo->LOCATION = $location;
|
||||
return \OC_Calendar_Object::edit($taskID, $vcalendar->serialize());
|
||||
return $this->helper->setProperty($taskID,'LOCATION',$location);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -429,98 +352,6 @@ class TasksService {
|
|||
* @throws \Exception
|
||||
*/
|
||||
public function setDescription($taskID, $description){
|
||||
$vcalendar = \OC_Calendar_App::getVCalendar($taskID);
|
||||
$vtodo = $vcalendar->VTODO;
|
||||
$vtodo->DESCRIPTION = $description;
|
||||
return \OC_Calendar_Object::edit($taskID, $vcalendar->serialize());
|
||||
return $this->helper->setProperty($taskID,'DESCRIPTION',$description);
|
||||
}
|
||||
|
||||
/**
|
||||
* add comment to task by id
|
||||
* @param int $taskID
|
||||
* @param string $comment
|
||||
* @param int $tmpID
|
||||
* @return array
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function addComment($taskID, $comment, $tmpID){
|
||||
$vcalendar = \OC_Calendar_App::getVCalendar($taskID);
|
||||
$vtodo = $vcalendar->VTODO;
|
||||
|
||||
if($vtodo->COMMENT == "") {
|
||||
// if this is the first comment set the id to 0
|
||||
$commentId = 0;
|
||||
} else {
|
||||
// Determine new commentId by looping through all comments
|
||||
$commentIds = array();
|
||||
foreach($vtodo->COMMENT as $com) {
|
||||
$commentIds[] = (int)$com['X-OC-ID']->getValue();
|
||||
}
|
||||
$commentId = 1+max($commentIds);
|
||||
}
|
||||
|
||||
$now = new \DateTime();
|
||||
$vtodo->add('COMMENT',$comment,
|
||||
array(
|
||||
'X-OC-ID' => $commentId,
|
||||
'X-OC-USERID' => $this->userId,
|
||||
'X-OC-DATE-TIME' => $now->format('Ymd\THis\Z')
|
||||
)
|
||||
);
|
||||
\OC_Calendar_Object::edit($taskID, $vcalendar->serialize());
|
||||
$user_timezone = \OC_Calendar_App::getTimezone();
|
||||
$now->setTimezone(new \DateTimeZone($user_timezone));
|
||||
$comment = array(
|
||||
'taskID' => $taskID,
|
||||
'id' => $commentId,
|
||||
'tmpID' => $tmpID,
|
||||
'name' => \OC::$server->getUserManager()->get($this->userId)->getDisplayName(),
|
||||
'userID' => $this->userId,
|
||||
'comment' => $comment,
|
||||
'time' => $now->format('Ymd\THis')
|
||||
);
|
||||
return $comment;
|
||||
}
|
||||
|
||||
/**
|
||||
* delete comment of task by id
|
||||
* @param int $taskID
|
||||
* @param int $commentID
|
||||
* @return bool
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function deleteComment($taskID, $commentID){
|
||||
$vcalendar = \OC_Calendar_App::getVCalendar($taskID);
|
||||
$vtodo = $vcalendar->VTODO;
|
||||
$commentIndex = $this->getCommentById($vtodo,$commentID);
|
||||
$comment = $vtodo->children[$commentIndex];
|
||||
if($comment['X-OC-USERID']->getValue() == $this->userId){
|
||||
unset($vtodo->children[$commentIndex]);
|
||||
return \OC_Calendar_Object::edit($taskID, $vcalendar->serialize());
|
||||
} else {
|
||||
throw new \Exception('Not allowed.');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private static function sort_completed($a, $b) {
|
||||
$t1 = \DateTime::createFromFormat('Ymd\THis', $a['completed_date']);
|
||||
$t2 = \DateTime::createFromFormat('Ymd\THis', $b['completed_date']);
|
||||
if ($t1 == $t2) {
|
||||
return 0;
|
||||
}
|
||||
return $t1 < $t2 ? 1 : -1;
|
||||
}
|
||||
|
||||
private function getCommentById($vtodo,$commentId) {
|
||||
$idx = 0;
|
||||
foreach ($vtodo->children as $i => &$property) {
|
||||
if ( $property->name == 'COMMENT' && $property['X-OC-ID']->getValue() == $commentId ) {
|
||||
return $idx;
|
||||
}
|
||||
$idx += 1;
|
||||
}
|
||||
throw new \Exception('Commment not found.');
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue