Регистрация  |  Вход

External Storage for Salesforce своими руками.

Народ, у меня появилась идея провести нам вместе небольшой мозговой штурм и составить своего рода ТЗ к внешнему хранилищу для Salesforce. Возможно определенные знания каждого в своей области помогут выработать общие требования, на основании которых кто-нибудь решится это написать.

Итак, как я вижу данную систему:
На стороне Salesforce
1. будут созданы классы - Domain objects
2. будет написан Mapper, который будет отвечать за сохранение и получение объеков из внешней системы
На внешней стороне будет создан web service который будет обрабатывать запросы от Mapper.

Теперь как это будет работать -
1. На стороне Salesforce можно будет создать apex класс, который будет содержать атрибуты для хранения данных. 2. Создаем экземпляр данного класса (объект), заполняем параметрами и скармливаем Mapper для сохранения во внешнем хранилище.
3. Mapper сериализует наш объект в JSON и отправляет данные скажем по REST API на внешнее хранилище.
4. Приемник на внешнем хранилище принимает данные и вот тут тоже момент - десериализует и сохраняет в SQL базе данных, или пихает сразу в NoSQL базу данных в виде JSON (в MongoDB например) и возвращает ID из базы в Mapper.

Получается такая своего рода самописная ORM под Salesforce.

Теперь вопросы:
1. Помогите перевести на нормальный язык ООП то что я выше написал (по поводу доменных объектов, мапперов смотрел сюда - http://habrahabr.ru/post/198450/)
2. Как поступать со связями
3. Какие проблемы вы видите в сериализации.
4. REST/SOAP
5. На внешнем хранилище что лучше использовать SQL/NoSQL (для простоты и возможности поиска)

Жду ваших соображений.

Народ, у меня появилась идея провести нам вместе небольшой мозговой штурм и составить своего рода ТЗ к внешнему хранилищу для Salesforce. Возможно определенные знания каждого в своей области помогут выработать общие требования, на основании которых кто-нибудь решится это написать.

Итак, как я вижу данную систему:
На стороне Salesforce
1. будут созданы классы - Domain objects
2. будет написан Mapper, который будет отвечать за сохранение и получение объеков из внешней системы
На внешней стороне будет создан web service который будет обрабатывать запросы от Mapper.

Теперь как это будет работать - 
1. На стороне Salesforce можно будет создать apex класс, который будет содержать атрибуты для хранения данных. 2. Создаем экземпляр данного класса (объект), заполняем параметрами и скармливаем Mapper для сохранения во внешнем хранилище.
3. Mapper сериализует наш объект в JSON и отправляет данные скажем по REST API на внешнее хранилище.
4. Приемник на внешнем хранилище принимает данные и вот тут тоже момент - десериализует и сохраняет в SQL базе данных, или пихает сразу в NoSQL базу данных в виде JSON (в MongoDB например) и возвращает ID из базы в Mapper.

Получается такая своего рода самописная ORM под Salesforce.

Теперь вопросы:
1. Помогите перевести на нормальный язык ООП то что я выше написал (по поводу доменных объектов, мапперов смотрел сюда - http://habrahabr.ru/post/198450/)
2. Как поступать со связями
3. Какие проблемы вы видите в сериализации.
4. REST/SOAP
5. На внешнем хранилище что лучше использовать SQL/NoSQL (для простоты и возможности поиска)

Жду ваших соображений.

Может есть какие-нибудь красивые статьи про написания ORM своими руками?

Может есть какие-нибудь красивые статьи про написания ORM своими руками?

Как бы так упростить/автоматизировать работу внешнего хранилища, чтобы не пришлось что-то писать под новые Domain objets на Salesforce.

Как бы так упростить/автоматизировать работу внешнего хранилища, чтобы не пришлось что-то писать под новые Domain objets на Salesforce.

Dmitry Shnyrev
Как бы так упростить/автоматизировать работу внешнего хранилища, чтобы не пришлось что-то писать под новые Domain objets на Salesforce.

С DML более менее понятно, что с SOQL/SOSL ?

[quote="Dmitry Shnyrev"]Как бы так упростить/автоматизировать работу внешнего хранилища, чтобы не пришлось что-то писать под новые Domain objets на Salesforce.[/quote]

С DML более менее понятно, что с SOQL/SOSL ?

wilder
С DML более менее понятно, что с SOQL/SOSL ?

Свой Query Builder

[quote="wilder"]С DML более менее понятно, что с SOQL/SOSL ?[/quote]
Свой Query Builder

Dmitry Shnyrev
wilder
С DML более менее понятно, что с SOQL/SOSL ?

Свой Query Builder

Не самый лучший вариант.

[quote="Dmitry Shnyrev"][quote="wilder"]С DML более менее понятно, что с SOQL/SOSL ?[/quote]
Свой Query Builder[/quote]

Не самый лучший вариант.

wilder
Не самый лучший вариант.

А какой тогда лучший вариант?

[quote="wilder"]Не самый лучший вариант.[/quote]
А какой тогда лучший вариант?

Вроде Gres писал об этом в теме Salesforce Social Coding:

Лично я сейчас занимаюсь разработкой маппера доменных сущностей на DTO сущности и наоборот.

разве это не об этом же?

Вроде Gres писал об этом в теме Salesforce Social Coding:

[quote]Лично я сейчас занимаюсь разработкой маппера доменных сущностей на DTO сущности и наоборот.[/quote] 

разве это не об этом же?

Den Brown
Вроде Gres писал об этом в теме Salesforce Social Coding:

Лично я сейчас занимаюсь разработкой маппера доменных сущностей на DTO сущности и наоборот.

разве это не об этом же?

Я так понимаю не совсем. Это следующий шаг - у меня маппинг доменной сущности на базу данных, а у Gres маппинг доменной сущности на DTO - это более высокий уровень абстракции.

[quote="Den Brown"]Вроде Gres писал об этом в теме Salesforce Social Coding:

[quote]Лично я сейчас занимаюсь разработкой маппера доменных сущностей на DTO сущности и наоборот.[/quote] 

разве это не об этом же?[/quote]

Я так понимаю не совсем. Это следующий шаг - у меня маппинг доменной сущности на базу данных, а у Gres маппинг доменной сущности на DTO - это более высокий уровень абстракции.

Den Brown
Вроде Gres писал об этом в теме Salesforce Social Coding:

Лично я сейчас занимаюсь разработкой маппера доменных сущностей на DTO сущности и наоборот.

разве это не об этом же?


Нет, я просто написал меппер который умеет
- маппить доменные сущности (стандартныe и кастомныe объекты) на DTO (wrappers)
- маппить DTO (wrappers) на доменные сущности (стандартныe и кастомныe объекты)
- маппить DTO (wrappers) на DTO (wrappers)
Есть возможность автомаппинга, при совпадении имен полей и маппинга с использование конфига.

У меня не используются никакакие сторонние сервисы для хранения данных.

[quote="Den Brown"]Вроде Gres писал об этом в теме Salesforce Social Coding:

[quote]Лично я сейчас занимаюсь разработкой маппера доменных сущностей на DTO сущности и наоборот.[/quote] 

разве это не об этом же?[/quote]
Нет, я просто написал меппер который умеет
- маппить доменные сущности (стандартныe и кастомныe объекты) на DTO (wrappers)
- маппить DTO (wrappers) на доменные сущности (стандартныe и кастомныe объекты)
- маппить DTO (wrappers) на DTO (wrappers)
Есть возможность автомаппинга, при совпадении имен полей и маппинга с использование конфига.

У меня не используются никакакие сторонние сервисы для хранения данных.

Dmitry Shnyrev
На стороне Salesforce
1. будут созданы классы - Domain objects
2. будет написан Mapper, который будет отвечать за сохранение и получение объеков из внешней системы
На внешней стороне будет создан web service который будет обрабатывать запросы от Mapper.

т.е. просто запрос и десериализация объект?

Dmitry Shnyrev
Теперь как это будет работать -
1. На стороне Salesforce можно будет создать apex класс, который будет содержать атрибуты для хранения данных. 2. Создаем экземпляр данного класса (объект), заполняем параметрами и скармливаем Mapper для сохранения во внешнем хранилище.
3. Mapper сериализует наш объект в JSON и отправляет данные скажем по REST API на внешнее хранилище.
4. Приемник на внешнем хранилище принимает данные и вот тут тоже момент - десериализует и сохраняет в SQL базе данных, или пихает сразу в NoSQL базу данных в виде JSON (в MongoDB например) и возвращает ID из базы в Mapper.

т.е. в СФ не будет ничего храниться?

Готов поучаствовать в реализации, если опишешь, что ты хочешь видеть в итоге, определенные Use cases and user stories.

[quote="Dmitry Shnyrev"]На стороне Salesforce
1. будут созданы классы - Domain objects
2. будет написан Mapper, который будет отвечать за сохранение и получение объеков из внешней системы
На внешней стороне будет создан web service который будет обрабатывать запросы от Mapper.[/quote]
т.е. просто запрос и десериализация  объект?

[quote="Dmitry Shnyrev"]Теперь как это будет работать -
1. На стороне Salesforce можно будет создать apex класс, который будет содержать атрибуты для хранения данных. 2. Создаем экземпляр данного класса (объект), заполняем параметрами и скармливаем Mapper для сохранения во внешнем хранилище.
3. Mapper сериализует наш объект в JSON и отправляет данные скажем по REST API на внешнее хранилище.
4. Приемник на внешнем хранилище принимает данные и вот тут тоже момент - десериализует и сохраняет в SQL базе данных, или пихает сразу в NoSQL базу данных в виде JSON (в MongoDB например) и возвращает ID из базы в Mapper.[/quote]
т.е. в СФ не будет ничего храниться?

Готов поучаствовать в реализации, если опишешь, что ты хочешь видеть в итоге, определенные Use cases and user stories.

Можно создать организацию на Гитхабе и контрибьютить по мере возможности, если у кого-то конечно есть желание.

Можно создать организацию на Гитхабе и контрибьютить по мере возможности, если у кого-то конечно есть желание.

Gres
т.е. просто запрос и десериализация объект?

Это пока надо продумать.


Gres
т.е. в СФ не будет ничего храниться?

Именно!!!

[quote="Gres"]т.е. просто запрос и десериализация объект?[/quote]
Это пока надо продумать.


[quote="Gres"]т.е. в СФ не будет ничего храниться?[/quote]
Именно!!!

Gres
если опишешь, что ты хочешь видеть в итоге, определенные Use cases and user stories.

Очень просто - use case - храним персональные данные НЕ в Salesforce.
Заказчик создает apex class ContactDomain, добавляет в него все нужные атрибуты для представления персональных данных
class ContactDomain {
public String Firstname { get; set; }
public String Lastname { get; set; }
public ContactDomain(...) {
...
}
}

Дальше использует этот класс в коде

ContactDomain contact = new ContactDomain(...);

Использует Mapper для сохранения нашего объекта на внешнее хранилище
(тут происходит основная магия - и на внешний сервис уходит POST запрос с сериализированным contact)

Mapper.save(contact);

Для поиска использовать что-то такое
(вот тут самое сложное!)
формируется запрос на внешний сервер, который должен его перевести в запрос удаленной базы, вытянуть данные и возвратить в Salesforce.

List<ContactDomain> contats = Mapper.select(ContactDomaing.class).where('{"firstname":"somename"}');

В общем какая-то такая идея.
Самая основная мысль тут чтобы сделать Mapper и внешний сервис как можно более универсальными чтобы клиенту было достаточно создать DomainObject с любым набором данных и больше ни о чем не беспокоиться.

Пока звучит красиво, но чувствую для реализации мозг придется вывихнуть! Особенно на внешней стороне!!!

!!! как вариант я только вспомнил - можно попробовать воспользоваться движком Elastiсsearch - он предоставляет отличный REST API для работы с ним. Можно будет просто пихать туда данные и искать удобно (движек как раз используется для быстрого полнотекстового поиска - можно будет убить двух зайцев).

[quote="Gres"]если опишешь, что ты хочешь видеть в итоге, определенные Use cases and user stories.[/quote]
Очень просто - use case - храним персональные данные НЕ в Salesforce.
Заказчик создает apex class ContactDomain, добавляет в него все нужные атрибуты для представления персональных данных
[code]
class ContactDomain {
    public String Firstname { get; set; }
    public String Lastname { get; set; }
    public ContactDomain(...) {
        ...
    }
}
[/code]

Дальше использует этот класс в коде
[code]
ContactDomain contact = new ContactDomain(...);
[/code]

Использует Mapper для сохранения нашего объекта на внешнее хранилище
(тут происходит основная магия - и на внешний сервис уходит POST запрос с сериализированным contact)
[code]
Mapper.save(contact);
[/code]

Для поиска использовать что-то такое
(вот тут самое сложное!)
формируется запрос на внешний сервер, который должен его перевести в запрос удаленной базы, вытянуть данные и возвратить в Salesforce.
[code]
List<ContactDomain> contats = Mapper.select(ContactDomaing.class).where('{"firstname":"somename"}');
[/code]

В общем какая-то такая идея. 
Самая основная мысль тут чтобы сделать Mapper и внешний сервис как можно более универсальными чтобы клиенту было достаточно создать DomainObject с любым набором данных и больше ни о чем не беспокоиться.

Пока звучит красиво, но чувствую для реализации мозг придется вывихнуть! Особенно на внешней стороне!!!

!!! как вариант я только вспомнил - можно попробовать воспользоваться движком Elastiсsearch - он предоставляет отличный REST API для работы с ним. Можно будет просто пихать туда данные и искать удобно (движек как раз используется для быстрого полнотекстового поиска - можно будет убить двух зайцев).

Т.е. ты хочешь предоставить некоторое API для разработчиков заказчика, но это не будет готовым решением для самого заказчика?

Т.е. ты хочешь предоставить некоторое API для разработчиков заказчика, но это не будет готовым решением для самого заказчика?

При твоем варианте использования сложностей я вообще не вижу.
Создается класс с любой структурой, сериализуется, отправляется, сохраняется для простоты в nosql хранилище.
Для поиска тоже самое.
Впринципе все элементарно.

При твоем варианте использования сложностей я вообще не вижу.
Создается класс с любой структурой, сериализуется, отправляется, сохраняется для простоты в nosql хранилище.
Для поиска тоже самое.
Впринципе все элементарно.

А если кому-то хочется решить проблему персональных данных для своих заказчиков, используйте принцип mitm.

А если кому-то хочется решить проблему персональных данных для своих заказчиков, используйте принцип mitm.

Gres
используйте принцип mitm

А можно поподробнее?

[quote="Gres"]используйте принцип mitm[/quote]
А можно поподробнее?

Задумался сегодня а что это за зверь такой OData, который использует Salesforce для своих external data storage?
В вот он оказывается кто http://www.odata.org/
An open protocol to allow the creation and consumption of queryable and interoperable RESTful APIs in a simple and standard way.
В общем это то что нужно!
Находим библиотеку, которая реализует этот протокол, ставим на внешний сервер и всё! Гоняем данные из Salesforce. Не нужны страшные танцы с бубном на стороне внешнего сервера. Остается только написать свой connector на стороне Salesforce. Остается только найти библиотеку которая реализует OData на стороннем сервере.

Задумался сегодня а что это за зверь такой OData, который использует Salesforce для своих external data storage?
В вот он оказывается кто http://www.odata.org/
An open protocol to allow the creation and consumption of queryable and interoperable RESTful APIs in a simple and standard way.
В общем это то что нужно!
Находим библиотеку, которая реализует этот протокол, ставим на внешний сервер и всё! Гоняем данные из Salesforce. Не нужны страшные танцы с бубном на стороне внешнего сервера. Остается только написать свой connector на стороне Salesforce. Остается только найти библиотеку которая реализует OData на стороннем сервере.

Dmitry Shnyrev
Остается только найти библиотеку которая реализует OData на стороннем сервере.

ASP.NET Web Api

http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-v4/create-an-odata-v4-endpoint

[quote="Dmitry Shnyrev"]Остается только найти библиотеку которая реализует OData на стороннем сервере.[/quote]

ASP.NET Web Api

http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-v4/create-an-odata-v4-endpoint

Дима Лисовский
ASP.NET Web Api

Я подумал про библиотеку для простых людей (на python, ruby или go), но не для "богов" на java или тем более .net для которых еще отдельную стойку в датацентре покупать надо.

[quote="Дима Лисовский"]ASP.NET Web Api[/quote]
Я подумал про библиотеку для простых людей :) (на python, ruby или go), но не для "богов" на java или тем более .net для которых еще отдельную стойку в датацентре покупать надо.

Dmitry Shnyrev
Дима Лисовский
ASP.NET Web Api

Я подумал про библиотеку для простых людей (на python, ruby или go), но не для "богов" на java или тем более .net для которых еще отдельную стойку в датацентре покупать надо.

А python, ruby, go работают на чистом воздухе?

[quote="Dmitry Shnyrev"][quote="Дима Лисовский"]ASP.NET Web Api[/quote]
Я подумал про библиотеку для простых людей :) (на python, ruby или go), но не для "богов" на java или тем более .net для которых еще отдельную стойку в датацентре покупать надо.[/quote]
А python, ruby, go работают на чистом воздухе?

по сравнению с Java и .net можно сказать что ДА

по сравнению с Java и .net можно сказать что ДА :) 

Dmitry Shnyrev
по сравнению с Java и .net можно сказать что ДА :)

Мне, конечно, жаль тебя огорчать, но ...
Ладно, давай оставим эту утопию в твоем сознании)

[quote="Dmitry Shnyrev"]по сравнению с Java и .net можно сказать что ДА :)[/quote]
Мне, конечно, жаль тебя огорчать, но ...
Ладно, давай оставим эту утопию в твоем сознании)

Gres
Ладно, давай оставим эту утопию в тоем сознании)

Полностью согласен не разводить тут холивар

[quote="Gres"]Ладно, давай оставим эту утопию в тоем сознании)[/quote]
Полностью согласен не разводить тут холивар :D