webcamp: developer day: parse'им бэкенд - Аким Халилов

59
Parse'им backend Аким Халилов, WebConsultants @ WebCamp 2014

Upload: geekslab

Post on 30-Jun-2015

122 views

Category:

Technology


6 download

DESCRIPTION

Рarse'им бэкенд Аким Халилов Вы хотите выучить Backbone? Хотите просто писать клиентский код, не думая о сервере и о том, как все обрабатывать, хранить, бэкапить? Выход есть – храните с помощью Parse. Parse – платформа, которая предоставляет возможность хранения данных без забот о сервере. Хранилище данных, соц. сети, push-notification, cloud code. Что такое Parse и что он умеет, о библиотеке для использования: - знакомство с JS API и примеры использования; - начинаем кодить: stub-проект; - кодим фичи: CRUD + плюшки; - хостим.

TRANSCRIPT

Page 1: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

Parse'им backendАким Халилов, WebConsultants

@ WebCamp 2014

Page 2: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

backendless

Page 3: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

Backend as a Service

Page 4: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

BaaS

Page 5: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

Возможностьинтегрировать приложениес облачным хранилищемданных

Page 6: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

"Аутсорсим" всё,что делали на

backend'е

Page 7: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

Нет своих серверов,админов, server-sideразработчиков..!

Page 8: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

и все это бесплатно!

Page 9: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

или почти бесплатно!

Page 10: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
Page 11: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

История

•  Основатель →

•  Запустили в 2011 году

•  Участвовали в Y Combinator

•  $7M инвестиций

•  260 000 приложений используют Parse

•  куплен Facebook в 2013-м за $85M

11

Page 12: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

Возможности

•  Cloud storage (общий для всех клиентов)

•  Social network login (FB из коробки)

•  Cloud code

•  Background Jobs

•  Offline mode

•  Push notifications

•  Dashboard + Analytics

12

Page 13: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

Платформы

Page 14: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

14

Page 15: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

JavaScript SDK

Page 16: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

Основа

16

Page 17: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

Забегая вперед:

var Post = new ParseObject("Post");

var blogPost = new Post();

blogPost.save({"title": "Hello World"})

.then(function(object) {

alert("Yay! It worked!");

});

17

Page 18: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

Подключаем библиотеку

<script type="text/javascript" src="parse.js">

</script>

<script type="text/javascript">

Parse.initialize("APP_ID", "JAVASCRIPT_KEY");

</script>

18

Page 19: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

Parse.Object

Page 20: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

Parse.Object

var Person = Parse.Object.extend("Person");

var manager = new Person();

// Backbone style

var Person = Parse.Object.extend({

className: "Person"

});

20

Page 21: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

var Monster = Parse.Object.extend("Monster", {

initialize: function (attrs, options) {

this.sound = "Rawr"

}, {

create: function() { // Class methods

var monster = new Monster();

return monster;

}

});21

Page 22: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

model.save(attrs, {

success: function(obj) { },

error: function(obj, err) { }

});

model.destroy({

success: function(myModel) { },

error: function(myModel, error) { }

});

22

Page 23: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

Свойства по умолчанию

{

objectId: "xWMyZ4YEGZ",

createdAt:"2011-06-10T18:33:42Z",

updatedAt:"2011-06-10T18:33:42Z"

}

object.id, object.updatedAt, object.createdAt

23

Page 24: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

Object retrieve

var Order = Parse.Object.extend("Order");

var query = new Parse.Query(Order);

query.get('<object id>', {

success: function(object) { },

error: function(object, error) { }

});

24

Page 25: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

Object refresh

object.fetch({

success: function(myObject) { },

error: function(myObject, error) { }

});

25

Page 26: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

Object helpers

model.increment('counter');

// array helpers

model.add('skills', 'HTML');

model.addUnique('skills', 'CSS');

model.addUnique('skills', 'JavaScript');

26

Page 27: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

Object Relations

Page 28: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

1/2One-to-One, One-to-Many

var Post = Parse.Object.extend("Post");

var Comment = Parse.Object.extend("Comment");

var myPost = new Post();

var myComment = new Comment();

28

Page 29: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

2/2One-to-One, One-to-Many

myPost.set("title", "I'm Hungry");

myPost.set("content", "Where should we go for lunch?");

myComment.set("content", "Let's do Sushirrito.");

myComment.set("parent", myPost);

myComment.save();

29

Page 30: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

Fetching relations

var post = fetchedComment.get("parent");

post.fetch({

success: function(post) {

var title = post.get("title");

}

});

30

Page 31: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

Many-to-Many Relationships

var user = Parse.User.current();

var relation = user.relation("likes");

relation.add(post);

user.save();

31

Page 32: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

Operations with relations

relation.remove(post1);

relation.remove(post2);

relation.add([post1, post2, post3]);

32

Page 33: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

Fetching relations

relation.query().find({

success: function(listOfAllItems) { }

});

Или указать query фильтр.. (далее)

33

Page 34: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

Parse.Query

Page 35: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

Parse.Query

var Customer = Parse.Object.extend("Customer");

var query = new Parse.Query(Customer);

query.equalTo("firstName", "Mike");

query.find({

success: function(results) { }

});

35

Page 36: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

Parse.Query (cont..)

•   query.equalTo query.notEqualTo

•   query.greaterThan query.lessThan

•   query.lessThanOrEqualTo query.greaterThanOrEqualTo

•   query.limit(10);

•   query.skip(10);

•   query.ascending("score");

•   query.descending("score");

36

Page 37: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

Parse.Query (more..)

•   query.startsWith("name", "Big Daddy's");

•   query.containsAll("arrayKey", [2, 3, 4]);

•   query.first()

•   query.count()

•   Parse.Query.or(query1, query2);

•  relational queries

37

Page 38: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

Parse.Collection

Page 39: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

var TestCollection = Parse.Collection.extend({

model: TestObject

});

// Backbone's fetch

collection.fetch({

success: function(collection) { },

error: function(collection, error) { }

});

39

Page 40: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

var query = (new Parse.Query(TestObject))

.equalTo("temperature", "hot");

var HotCollection = Parse.Collection.extend({

model: TestObject,

query: query

});

// or get from the query

var collection = query.collection();

40

Page 41: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

Users & Roles

Page 42: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

var user = new Parse.User();

user.set("username", "my name");

user.set("password", "my pass");

user.set("email", "[email protected]");

user.signUp(null, {

success: function(user) { },

error: function(user, error) { }

});

42

Page 43: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

Parse.User.logIn("myname", "mypass", {

success: function(user) {},

error: function(user, error) {}

});

var currentUser = Parse.User.current();

Parse.User.logOut();

43

Page 44: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

User roles

var Note = Parse.Object.extend("Note");

var privateNote = new Note();

privateNote.set("content", "This note is private!");

// accessible only by current user

privateNote.setACL(new Parse.ACL(Parse.User.current()));

privateNote.save();

44

Page 45: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

Roles for multiple users

var groupMessage = new Message();

var groupACL = new Parse.ACL();

groupACL.setReadAccess(userA, true);

groupACL.setWriteAccess(userB, true);

groupMessage.setACL(groupACL);

45

Page 46: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

Roles (advanced)

var roleACL = new Parse.ACL();

var role = new Parse.Role("Administrator", roleACL);

role.getUsers().add(userA);

role.getRoles().add(roleA);

46

Page 47: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

Миграциясуществующихприложений

Page 48: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

Миграция

1.  Заменяем Backbone.Model на Parse.Object

2.  вместо urlRoot → className

3.  Заменяем Backbone.Collection на Parse.Collection

4.  Добавляем для collection Query

5.  вместо model.fetch → используем query

48

Page 49: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

Хостинг

Page 50: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

Parse CLI

$ parse new MyCloud

$ cd MyCloud

$ echo "Hello World" > public/index.html

$ parse deploy

и все...

50

Page 51: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

Хочу backend...

Page 52: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

Cloud Code

$ parse new MyCloud

-cloud/

main.js -- наш облачный backend

52

Page 53: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

Parse.Cloud.define("hello", function(request, response) {

response.success("Hello world!");

});

// вызов из клиента

Parse.Cloud.run('hello', {}, {

success: function(result) { },

error: function(error) { }

});

53

Page 54: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

Ловим Object Update

Parse.Cloud.beforeSave("Review",

function(request, response) {

var review = request.object; // BB Model;

response.error("ERROR_MESSAGE"); // will fail save

response.success(); // will complete save

});

54

Page 55: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

Object AfterSave

Parse.Cloud.afterSave("Comment", function(request) {

// push notifications // update comments count

// do any other work here

});

Клиент получит Success результат, даже если Cloud Code упадет с

ошибкой

55

Page 56: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

BeforeDelete & AfterDelete

Parse.Cloud.beforeDelete("OBJECT_NAME", fn);

Parse.Cloud.afterDelete("OBJECT_NAME", fn);

•  проверка условий перед удалением

•  выполнение работы после удаления

56

Page 57: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

Безопасность

Page 58: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

По умолчанию, все могут все. Что делать?

•  Отключить "Allow client class creation" в админке

•  Настроить опции по чтению / записи в классы

•  Использовать ACL

•  Использовать группы доступа (админы, модераторы,

пользователи)

•  Использовать Cloud Code для чувствительных данных

58

Page 59: WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов

Parse'им backend

Аким Халилов @ WebCamp 2014

•  http://sstude.com

•  @sstude

•  [email protected]

•  http://sstude.com/talks-webcamp-2014/

59