Я хочу сделать во всех формах Эгеи автосохранение. Ниже — мои рассуждения на этот счёт. А в конце я позову вас на помощь.
Сейчас в редакторе заметок можно нажать ⌘S в любой момент, и изменения сохранятся на сервере без перезагрузки страницы. Это удобно, но иногда люди, особенно после Гугль-дока, забывают это сделать. Если что-нибудь сломается, текст пропадёт.
Нетрудно сделать автоматическое сохранение раз в несколько секунд. Но такое нельзя делать с опубликованными заметками, ведь изменения будут сразу видны всем, включая промежуточные состояния по ходу внесения правок. Можно, конечно, поддерживать это только в черновиках, но это криво и модально. Хочется, чтобы как-нибудь работало везде.
Для опубликованных заметок можно предусмотреть в базе на сервере поле «неопубликованная версия текста», чтобы все такие вот автосохранённые изменения писались туда, а не в настоящее поле, а публиковались только когда человек руками жмёт кнопку «Сохранить». Но, во-первых, тогда такие дублирующие поля придётся заводить на всё — заголовок, теги, урл. Неэлегантно. Во-вторых, это вызывает вопрос о том, какую версию заметки открывать в редакторе: настоящую или вот такую промежуточную. Если человек забыл о том, что начинал редактировать заметку, и открыл её спустя месяц, а в редакторе показывают не то, что опубликовано, это взорвёт мозг.
Конечно, можно напридумывать интерфейса, чтобы это разрулить: показывать где-то, что открыта несохранённая версия, дать возможность сравнить с сохранённой, откатить изменения... Но это всё какая-то жесть. Я не хочу ничего такого ни реализовывать, ни видеть как пользователь. Я хочу, чтобы просто ничего не терялось.
Дальше. Если уж всем этим заморачиваться вообще, то нужно сохранять не только на сервер, но и локально. Чтобы можно было надёжно редактировать заметки без интернета. То есть сложность вырастает ещё сильнее. Возникает аж три версии у каждой заметки: опубликованная на сервере, сохранённая неопубликованная на сервере и сохранённая локально. Это не считая того, что локально может быть разная на каждом клиенте.
В общем, я прихожу к выводу, что единственный способ сделать эту фичу действительно хорошо и без компромиссов — полноценно реализовать collaborative editing как в Гугль-доке. То есть для меня как пользователя не должно быть вообще никакой разницы между клиентом и сервером. Я должен видеть всё в самом свежем виде, на каком устройстве бы ни открыл редактор заметки. А если интернета нет, то после его появления всё должно смёрджиться максимально чисто.
Проблема с тем, что пользователь может не опубликовать изменения, но при этом хотеть их синхронизации между всеми устройствами остаётся, но я, кажется, придумал, как её решить, не усложняя интерфейс.
Я не представляю, насколько трудно реализовать надёжное одновременное редактирование с нескольких устройств, но знаю словосочетание operational transformation, погуглив которое можно найти всяких статей на эту тему. Например, Collaborative Editing in JavaScript: An Intro to Operational Transformation (очень клёво объяснён сам принцип).
Я надеялся найти какую-нибудь популярную опенсорсную реализацию этого, но что-то ничего не нашёл. Если покурить Стек-оверфлоу, то можно нарыть десяток разных заброшенных библиотек, но ничего, что выглядело бы обнадёживающим.
Ещё есть Фаерпад, но там только клиентская часть, и он, как я понял, работает только с собственным сервером. А мне нужно сделать сервер частью Эгеи, причём я бы предпочёл, чтобы сервер был как можно тупее, а вся умная логика была реализована в Джаваскрипте.
Внимание, вопрос: что вы посоветуете? Или, может, кто-то из вас захотел бы сделать такой продукт — библиотеку для одновременного редактирования — под моим внимательным взглядом со стороны? А может, вы вообще думаете, что в моих рассуждениях ошибка и надо всё делать иначе? Расскажите в комментариях, пожалуйста.