# Kinto
une base de données pour le web
## Qui développe des sites internet ?
## Qui développe des applications web en HTML/Javascript ?
## Qui développe des services / API web ?
## Qui développe des applications mobiles ?
## Qui manipule des données (utilisateurs/capteurs/logs) ?
## Qui n'a pas encore levé la main ?
# Chaque jour des applications et des sites web sont construits.
# Avec comme objectif de manipuler et présenter des données.
## Une nouvelle idée !?
- Architectes → Design de l'API, URL, protocole
- Développeur → Implémentation de l'API serveur et du client pour la consommer
- Administrateur système → Déployer, corriger les bugs, monter en charge
On s'y met ?
## Rêvons une minute
1. Déployer une instance → [Cliquez ici pour déployer](http://kinto.readthedocs.io/en/latest/get-started.html#deploying-on-cloud-providers)
2. Utiliser un client existant en Javascript, Python, ...
3. … Vérifions deux/trois trucs …
4. Profiter !
# Kinto
# «Un service simple permettant la synchronisation et le partage d'objets JSON.»
# c'est une base de données
# accessible via le web.
# qui synchronise des données.
# en gérant les permissions d'accès.
![overview](./images/overview-use-cases.png)
## Genèse
- DjangoCong 2012
- Une alternative à Google Forms → [Formbuilder](https://kinto.github.io/formbuilder/)
- Des applications pour géolocaliser des infos → [Leaflet](http://leplatrem.github.io/cliquet-pusher/)
- Une équipe → [Servicedenuages.fr](http://www.servicedenuages.fr/)
## Offline first
L'application web fonctionne même hors connexion.
## Fonctionnalités
- Synchronisation
- Permissions
- Notifications d'évènements
- Sympa pour les OPS
## Éco-système
- Kinto.js, kinto.py
- Encrypt if you need (WebCrypto)
- Signature des données
- Stockage de fichiers
## Capitaliser
- Ne pas tout réinventer à chaque fois
- Respecter les bonnes pratiques HTTP
- Faciliter le travail des OPS
- Capitaliser sur les bonnes idées de Firefox Sync
## D'autres solutions
- Parse / Firebase, mais en logiciel libre
- Remote Storage
- CouchDB / PouchDB
- Firefox Sync
## Redonner le contrôle à l'utilisateur.
- Validation optionnelle des données avec un schéma
- Chiffrement des données simplifié (webcrypto + kinto.js)
- Permissions → permet de mutualiser les déploiements
## Cas d'utilisations à Mozilla
- AMO blocklists — Liste de blockage des malwares
- OneCRL — Liste de révocation des certificats SSL
- Fennec OTA — Polices de caractères et dictionnaires de césure
- Tout ce qu'on peut avoir envie de stocker dans Firefox
![](./images/concepts-general.png)
```perl
/buckets/{bucket_id}
/collections/{collection_id}
/records/{record_id}
```
GET /v1/buckets/blog/collections/articles
```javascript
{
"data": {
"id": "articles",
"last_modified": 1251800520143,
"title": "Blog title",
"description": "This is a blog description",
"link": "http://www.example.com/main.html"
},
"permissions": { "write": ["userid:VonkkVZo"] }
}
```
![](./images/concepts-permissions.png)
GET /v1/buckets/blog/collections/articles/records
```javascript
{
"data": [
{
"id": "7bd204c6-1655-4c27-aeee-53f933c5395f",
"last_modified": 1252254000464,
"title": "Example entry",
"description": "Here is some text.",
"link": "http://www.example.com/blog/post/1"
}
]
}
```
GET /v1/buckets/blog/collections/articles/records
```http
HTTP/1.1 200 OK
Content-Length: 195
Content-Type: application/json; charset=UTF-8
Date: Wed, 09 Dec 2015 12:31:16 GMT
ETag: "1449664217446"
Last-Modified: Wed, 09 Dec 2015 12:30:17 GMT
Total-Records: 1
```
## Fetching what changed
```perl
GET /v1/buckets/blog/collections/articles
/records?_since=1449664217446
HTTP/1.1 200 OK
ETag: "1449664217446"
Total-Records: 0
{"data": []}
```
## Only if it changed
```perl
GET /v1/buckets/blog/collections/articles
/records?_since=1449664217446
If-None-Match: "1449664217446"
HTTP/1.1 304 Not Modified
Date: Wed, 09 Dec 2015 12:37:22 GMT
ETag: "1449664217446"
```
## Update only if it didn't change
```perl
PATCH /v1/buckets/blog/collections/articles
/records/7bd204c6-1655-4c27-aeee-53f933c5395f
If-Match: "1449664217446"
HTTP/1.1 412 Precondition Failed
ETag: "1449664217450"
```
```js
{
"code": 412,
"details": {
"existing": {
"id": "7bd204...95f",
"last_modified": 1449664217450,
"title": "Hello world!"
}
},
"errno": 114,
"error": "Precondition Failed",
"message": "Resource was modified meanwhile"
}
```
[Demo time!](http://leplatrem.github.io/kinto-telegram-wall/)
## Crédits
- [Hersson Piratoba, "¡Nube Voladora!"](https://www.flickr.com/photos/nossreh/16753088479)
- [Gonzalo Merat, "Really Bored Kenzo"](https://www.flickr.com/photos/gonzalomerat/4852691103)
- [Charles Dawley, "Polaris - Star Trails Iridium flare"](https://www.flickr.com/photos/odalaigh/1482685365)
- [Geraint Rowland, "Towards The Future (Oslo) Explored"](https://www.flickr.com/photos/geezaweezer/5897955778)
- [Gaetan Aubriere, "Engrenage, V2"](https://www.flickr.com/photos/97950788@N06/16642141432)
- [Angie Torres, "Goal setting"](https://www.flickr.com/photos/angietorres/4564135455)
- [Uditha Wickramanayaka, "Love"](https://www.flickr.com/photos/126915310@N08/16332829367)
- [Nick Bramhall, "Light Pollution"](https://www.flickr.com/photos/black_friction/5628330687)
- [Valery Kenski, "Conversation"](https://www.flickr.com/photos/95222905@N02/10997835056)
- [Benjamin Disinger, "Horizon"](https://www.flickr.com/photos/bendisinger/15383035222)