WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
-
Upload
geekslab -
Category
Technology
-
view
133 -
download
6
description
Transcript of WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
Parse'им backendАким Халилов, WebConsultants
@ WebCamp 2014
backendless
Backend as a Service
BaaS
Возможностьинтегрировать приложениес облачным хранилищемданных
"Аутсорсим" всё,что делали на
backend'е
Нет своих серверов,админов, server-sideразработчиков..!
и все это бесплатно!
или почти бесплатно!
История
• Основатель →
• Запустили в 2011 году
• Участвовали в Y Combinator
• $7M инвестиций
• 260 000 приложений используют Parse
• куплен Facebook в 2013-м за $85M
11
Возможности
• Cloud storage (общий для всех клиентов)
• Social network login (FB из коробки)
• Cloud code
• Background Jobs
• Offline mode
• Push notifications
• Dashboard + Analytics
12
Платформы
14
JavaScript SDK
Основа
16
Забегая вперед:
var Post = new ParseObject("Post");
var blogPost = new Post();
blogPost.save({"title": "Hello World"})
.then(function(object) {
alert("Yay! It worked!");
});
17
Подключаем библиотеку
<script type="text/javascript" src="parse.js">
</script>
<script type="text/javascript">
Parse.initialize("APP_ID", "JAVASCRIPT_KEY");
</script>
18
Parse.Object
Parse.Object
var Person = Parse.Object.extend("Person");
var manager = new Person();
// Backbone style
var Person = Parse.Object.extend({
className: "Person"
});
20
var Monster = Parse.Object.extend("Monster", {
initialize: function (attrs, options) {
this.sound = "Rawr"
}, {
create: function() { // Class methods
var monster = new Monster();
return monster;
}
});21
model.save(attrs, {
success: function(obj) { },
error: function(obj, err) { }
});
model.destroy({
success: function(myModel) { },
error: function(myModel, error) { }
});
22
Свойства по умолчанию
{
objectId: "xWMyZ4YEGZ",
createdAt:"2011-06-10T18:33:42Z",
updatedAt:"2011-06-10T18:33:42Z"
}
object.id, object.updatedAt, object.createdAt
23
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
Object refresh
object.fetch({
success: function(myObject) { },
error: function(myObject, error) { }
});
25
Object helpers
model.increment('counter');
// array helpers
model.add('skills', 'HTML');
model.addUnique('skills', 'CSS');
model.addUnique('skills', 'JavaScript');
26
Object Relations
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
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
Fetching relations
var post = fetchedComment.get("parent");
post.fetch({
success: function(post) {
var title = post.get("title");
}
});
30
Many-to-Many Relationships
var user = Parse.User.current();
var relation = user.relation("likes");
relation.add(post);
user.save();
31
Operations with relations
relation.remove(post1);
relation.remove(post2);
relation.add([post1, post2, post3]);
32
Fetching relations
relation.query().find({
success: function(listOfAllItems) { }
});
Или указать query фильтр.. (далее)
33
Parse.Query
Parse.Query
var Customer = Parse.Object.extend("Customer");
var query = new Parse.Query(Customer);
query.equalTo("firstName", "Mike");
query.find({
success: function(results) { }
});
35
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
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
Parse.Collection
var TestCollection = Parse.Collection.extend({
model: TestObject
});
// Backbone's fetch
collection.fetch({
success: function(collection) { },
error: function(collection, error) { }
});
39
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
Users & Roles
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
Parse.User.logIn("myname", "mypass", {
success: function(user) {},
error: function(user, error) {}
});
var currentUser = Parse.User.current();
Parse.User.logOut();
43
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
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
Roles (advanced)
var roleACL = new Parse.ACL();
var role = new Parse.Role("Administrator", roleACL);
role.getUsers().add(userA);
role.getRoles().add(roleA);
46
Миграциясуществующихприложений
Миграция
1. Заменяем Backbone.Model на Parse.Object
2. вместо urlRoot → className
3. Заменяем Backbone.Collection на Parse.Collection
4. Добавляем для collection Query
5. вместо model.fetch → используем query
48
Хостинг
Parse CLI
$ parse new MyCloud
$ cd MyCloud
$ echo "Hello World" > public/index.html
$ parse deploy
и все...
50
Хочу backend...
Cloud Code
$ parse new MyCloud
↓
-cloud/
main.js -- наш облачный backend
52
Parse.Cloud.define("hello", function(request, response) {
response.success("Hello world!");
});
// вызов из клиента
Parse.Cloud.run('hello', {}, {
success: function(result) { },
error: function(error) { }
});
53
Ловим 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
Object AfterSave
Parse.Cloud.afterSave("Comment", function(request) {
// push notifications // update comments count
// do any other work here
});
Клиент получит Success результат, даже если Cloud Code упадет с
ошибкой
55
BeforeDelete & AfterDelete
Parse.Cloud.beforeDelete("OBJECT_NAME", fn);
Parse.Cloud.afterDelete("OBJECT_NAME", fn);
• проверка условий перед удалением
• выполнение работы после удаления
56
Безопасность
По умолчанию, все могут все. Что делать?
• Отключить "Allow client class creation" в админке
• Настроить опции по чтению / записи в классы
• Использовать ACL
• Использовать группы доступа (админы, модераторы,
пользователи)
• Использовать Cloud Code для чувствительных данных
58
Parse'им backend
Аким Халилов @ WebCamp 2014
• http://sstude.com
• @sstude
• http://sstude.com/talks-webcamp-2014/
59