Loopback Paris

#LoopbackParis

Starting soon ...

Sommaire

Les filtres de second niveau

Import de données user-friendly

Sommaire

- Petite pause -

- Pizza time -

Gérer facilement des fixtures

Le mot du sponsor

Les filtres de niveau 2 avec Loopback

Qui suis-je ?

Développeuse javascript freelance

Arbitre et joueuse Magic The Gathering

@purple_orwel

Aurélie VIOLETTE

La problématique

{
  "name": "Judge",
  [...]
  "properties": {
    "firstname": {
      "type": "string",
      "required": true
    },
    "lastname": {
      "type": "string",
      "required": true
    },
    "nationality": {
      "type": "string",
      "required": true
    }
  }
  [...]
}
{
  "name": "Shop",
  [...]
  "properties": {
    "name": {
      "type": "string",
      "required": true
    }
  }
  [...]  
}
{
  "name": "Tournament",
  [...]
  "properties": {
    "location": {
      "type": "string",
      "required": true
    },
    "type": {
      "type": "string",
      "required": true
    }
  },
  "relations": {
    "shop": {
      "type": "belongsTo",
      "model": "Shop"
    },
    "judge": {
      "type": "belongsTo",
      "model": "Judge"
    }
  }
  [...]
}

Quelques requêtes

Trouver tous les tournois à Paris, avec leur arbitre et leur boutique

"filter": {
    "where": {
        "location": "Paris"
    }, 
    "include": ["judge", "shop"]
}
[
  {
    "location": "Paris",
    "type": "PPTQ",
    "id": 1,
    "judgeId": 1,
    "shopId": 1,
    "judge": {
      "firstname": "Aurélie",
      "lastname": "Violette",
      "nationality": "Française",
      "id": 1
    },
    "shop": {
      "name": "Bazaar of Moxen",
      "id": 1
    }
  },
  {
    "location": "Paris",
    "type": "RPTQ",
    "id": 2,
    "judgeId": 1,
    "shopId": 1,
    "judge": {
      "firstname": "Aurélie",
      "lastname": "Violette",
      "nationality": "Française",
      "id": 1
    },
    "shop": {
      "name": "Bazaar of Moxen",
      "id": 1
    }
  }
]

Quelques requêtes

Trouver tous les tournois organisés par Trollune avec leur arbitre

"filter": {
    "include":[
        "judge",
        {
            "relation":"shop", 
            "where": {"name":"Trollune"}
        }
    ]
}
[
    {
        "location": "Lyon",
        "type": "PPTQ",
        "id": 3,
        "judgeId": 1,
        "shopId": 2,
        "judge": {
          "firstname": "Aurélie",
          "lastname": "Violette",
          "nationality": "Française",
          "id": 1
        },
        "shop": {
          "name": "Trollune",
          "id": 2
        }
    }
]

TOUT

Quelques requêtes

Trouver tous les PPTQs, arbitrés par un français et organisé par CartaJeux

Pourquoi ça ne marche pas ?

API CLIENT

MODEL

DATASOURCE

RELATED MODEL

result

result

data

fetch

data

query

fetch

query

  • Abstraction !

API CLIENT

MODEL

DATASOURCE

RELATED MODEL

Comment ?

  • Un beau mixin
  • Bibliothèque: sift

Résultats

Trouver tous les PPTQs, arbitrés par un français et organisé par CartaJeux

"filter": {
    "where": {"type": "PPTQ"}, 
    "include":["judge", "shop"]
},
"siftFilter": {
    "judge":{"nationality": "Française"}, 
    "shop": {"name": "CartaJeux"}
}
[
  {
    "location": "Lyon",
    "type": "PPTQ",
    "id": 4,
    "judgeId": 2,
    "shopId": 3,
    "judge": {
      "firstname": "Kevin",
      "lastname": "Desprez",
      "nationality": "Française",
      "id": 2
    },
    "shop": {
      "name": "CartaJeux",
      "id": 3
    }
  }
]

Conclusion

Une solution simple à mettre en place

Pas adaptée à toutes les situations

Open issue sur github ici, version SQL en cours

Questions ?