Tasks

Материал из First-Leon
Перейти к: навигация, поиск

Сервер

ToDo

  • Создание новой базы, пользователя.
    • nodejs скрипт. В системной базе берем _design/validation _design/_auth и _design/tasks
  • Полнотекстовый поиск Sphinx, Apache Solr, Apache Lucene, ElasticSearch с его CoudhDB river
  • Реализация каталога файлов в базе (с доступом по webdav)
  • Хранение файлов изображений и других - в другой базе

WEB

Структура пользовательской базы

Поля базы

Имя поля Тип содержимого Описание Примечание
id id
completedMax 2010-08-09T10:57:00.000-08:00 (RFC 3339) Дата окончания выполнения задачи
completedMin 2010-08-09T10:57:00.000-08:00 (RFC 3339) Дата начала выполнения задачи
parent id id родительской задачи Если нет previos
previos id id предыдущей задачи Если нет parent
completed boolean Выполнена
saved 2010-08-09T10:57:00.000-08:00 (RFC 3339) Дата последнего сохранения В том числе и системного
type task Тип содержимого записи Пока только одно возможное значение
title Plain text (без тегов и запрещенных символов) Заголовок задачи
del 2010-08-09T10:57:00.000-08:00 (RFC 3339) Дата удаления

Системные документы

В каждой пользовательской базе присутствую документы:

  • _design/validation

Функция написанная на Erlang, при каждом изменении базы проверяет ее размер. В случае, если размер базы превышает заданный лимит - запрещает запись.

  • _design/_auth
  • _design/tasks

Настройка CouchDB

Для сервера

  • Оптимальная файловая система: xfs
  • Мониторинг CouchDB Monitis M3
  • Максимальный размер документа
/etc/couchdb/default.ini
max_document_size = 50000

Для базы

_revs_limit = 100; Количество хранимых ревизий

Функция ограничивающая добавление документов при переполненной базе:

fun(NewDoc, OldDoc, {UserCtx}, SecObj) ->
  DbName = couch_util:get_value(<<"db">>, UserCtx),
  {ok, Db} = couch_db:open_int(DbName, [{user_ctx, UserCtx}]),
  {ok, Info} = couch_db:get_db_info(Db),
  DiskSize = couch_util:get_value(data_size, Info),
  case DiskSize < 100000 of  %% ~100KB
    true ->
      ok;
    false ->
      case OldDoc of
      null ->
	throw({[{<<"forbidden">>, <<"quota limit reached">>}]});
        _ -> 1
    end
  end,
  1
end.

WEB интерфейс

http://localhost:5984/_utils/

NodeJS

Установка последней стабильной версии

add-apt-repository ppa:chris-lea/node.js  
apt-get update  
apt-get install nodejs

Библиотеки

minimalistic couchdb driver for node.js

npm install nano

Nginx

Чтоб Nginx знал, что такое manifest (правила кэширования для HTML5) в mime.types дописываем:

text/cache.manifest       manifest;

Клиент

ToDo

  • Иожно избавиться от .root и .rootName (__proto__ теперь стандарт)
  • Создавать первую задачу автоматически. (подумать, что если база еще первично не отсинхронена)
  • В baseTest перед удалением, проверять - есть задача в списке baseLocalChanges
  • Перед началом синхронизации проверять - есть задачи в списке baseLocalChanges и блокировать редактирование задач
  • Для группового использования:
    • Ввести понятие групп (на уровне авторизации)
    • для каждой базы есть группа READ и группа RW.
    • В группу могут входить другие участники сервиса
    • В клиенте реализовать возможность просмотра/редактирования чужих листов.
    • Оповещение о добавлении/удалении/изменении задачи можно реализовать внутри сервиса (поле в базе) или по почте
    • Оповещение о добавлении/удалении в/из группы можно реализовать внутри сервиса (поле в базе) или по почте
  • Сторонние предложения:
    • Привязка ко времени и напоминалка в различных вариантах (емейл, смс, всплывающие окна).
    • Возможность указывать процент завершенности, и время затраченное на выполнение
    • Архив задач
  • Онлайн html редактор:
  • Периодические задачи
  • Поиск по задачам
  • Редактор блок схем
  • Версионность (реализуется с помощью хранения предыдущей версии документа - как вложения к актуальной версии(http://stackoverflow.com/questions/8274762/best-practice-for-couchdb-document-versioning))
  • Вида репликации - онлайн (в том числе слушать евенты от серверной базы), по расписанию, согласно глобальным параметрам android
  • Импорт и экспорт из Google Tasks http://code.google.com/p/google-tasks-porter/source/browse/
  • Продумать, в каких случаях и как делать purge

Подробности реализации

Создание задачи

При создании задачи находим саму старую удаленную. Если срок удаления превышает 1 месяц - используем ее как новую.

Удаление задачи

При удалении задачи, к ней добавляется поле del и эта задача не участвует в построении дерева задача.

Используемые библиотеки

OnlineJS

Cookies.js

Cordova(PhoneGap)

svn co http://svn.first-leon.ru/tasks-mobile

Работа с проектом

Создание

npm install cordova
./node_modules/.bin/cordova create ntasks com.ntasks.ntasks NTasks
cd ntasks

Добавление платформы

../node_modules/.bin/cordova platform add android

Деплой на смартфон

../node_modules/.bin/cordova run android

Литература, ссылки, инструменты

nw.js

Ссылки

Plasma

Ссылки

Windows 7 gadget

Ссылки

Расширение Thunderbird

Ссылки

Оптимизация

Запуск chromium с разрешением ручного запуска gc:

chromium-browser --js-flags="--expose-gc"

Ссылки

Google closure compiler

Похожие системы