index.html 12 ko
Newer Older
<!doctype html>
salimkhr's avatar
salimkhr a validé
<html lang="fr">
<head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">

	<title>reveal.js</title>

	<link rel="stylesheet" href="dist/reset.css">
	<link rel="stylesheet" href="dist/reveal.css">
	<!--		<link rel="stylesheet" href="dist/theme/black.css">-->
	<link rel="stylesheet" href="dist/theme/solarized.css">

	<!-- Theme used for syntax highlighted code -->
	<link rel="stylesheet" href="plugin/highlight/tomorrow.css">
</head>
<body>
<div class="reveal">
	<div class="slides">
		<!-- Introduction -->
		<section>
			<h1>Les APIs</h1>
			<p>Introduction aux API, JSON, JWT, OAuth et API Keys</p>
		</section>

		<!-- NPM -->
		<section>
			<h2>NPM</h2>
			<h3>Node Package Manager</h3>
			<img style="max-height: 25vw" src="https://lesjoiesducode.fr/content/052/node_modules-olive-js.jpg">
		</section>

		<!-- APIs -->
		<section>
			<h2>Qu’est-ce qu’une API ?</h2>
			<ul>
				<li>Interface entre applications</li>
				<li>Exposition des fonctionnalités via des <strong>endpoints</strong></li>
				<li>Méthodes : <code>GET</code>, <code>POST</code>, <code>PUT</code>, <code>DELETE</code></li>
			</ul>
		</section>

		<!-- JSON -->
		<section>
			<h2>JSON</h2>
			<h3>JavaScript Object Notation</h3>
			<pre><code class="json">
{
  "personne": {
    "nom": "Alice",
    "age": 25,
    "adresse": {
      "rue": "12 rue des Lilas",
      "ville": "Paris",
      "codePostal": "75001"
    },
    "contacts": [
      { "type": "email", "valeur": "alice@mail.com" },
      { "type": "téléphone", "valeur": "0601020304" }
    ]
  }
}
    </code></pre>
		</section>

		<section>
			<h2>XML</h2>
			<h2>eXtensible Markup Language</h2>
			<pre><code class="xml">
<personne>
    <nom>Alice</nom>
    <age>25</age>
    <adresse>
        <rue>12 rue des Lilas</rue>
        <ville>Paris</ville>
        <codePostal>75001</codePostal>
    </adresse>
    <contacts>
        <contact type="email">alice@mail.com</contact>
        <contact type="téléphone">0601020304</contact>
    </contacts>
</personne>
    </code></pre>
		</section>

		<!-- Authentification -->
		<section>
			<h2>Authentification</h2>
            <div style="display: flex; justify-content: space-between;">
                <div>
                    <img style="max-height: 25vw"
                         src="https://lesjoiesducode.fr/content/052/you-took-everything-from-me-api-401.jpg">
                </div>
                <div>
                    <ul>
                        <li><code>JWT</code> - Token sécurisé</li>
                        <li><code>OAuth 2.0</code> - Accès via Google, GitHub...</li>
                        <li><code>API Keys</code> - Clé unique par utilisateur</li>
                    </ul>
                </div>
            </div>
		</section>

		<!-- JWT -->
		<section>
			<h2>JWT - JSON Web Token</h2>
			<ol>
				<li>L’utilisateur se connecte</li>
				<li>Le serveur génère un <strong>JWT</strong></li>
				<li>Le JWT est stocké et envoyé dans chaque requête</li>
				<li>Le serveur API vérifie le JWT avant d’autoriser l’accès</li>
			</ol>
		</section>

		<!-- OAuth 2.0 -->
		<section>
			<h2>OAuth 2.0</h2>
			<ol>
				<li>L’utilisateur demande l’accès</li>
				<li>Redirection vers le fournisseur OAuth</li>
				<li>Connexion et validation</li>
				<li>Récupération du <strong>token d’accès</strong></li>
				<li>Accès aux ressources sécurisées</li>
			</ol>
		</section>

		<!-- API Keys -->
		<section>
			<h2>API Keys</h2>
			<ol>
				<li>Le client obtient une <strong>clé unique</strong></li>
				<li>Il envoie cette clé dans chaque requête</li>
				<li>L’API vérifie et accorde/refuse l’accès</li>
			</ol>
		</section>

		<section>
			<h1>Utilisation de Fetch</h1>
		</section>
		<section>
			<h2>Les Promises</h2>
			<p>Une <code>Promise</code> est un objet qui représente une opération asynchrone.</p>
			<p>Elle peut être :</p>
			<p><code>Pending</code> (en attente) / <code>Fulfilled</code> (réussie) / <code>Rejected</code> (échouée)</p>
		</section>

		<section>
			<h2>then, catch, finally</h2>
			<pre><code class="javascript" data-line-numbers="2-11|13-20">
// Exemple basique de Promise
const maPromise = new Promise((resolve, reject) => {
    setTimeout(() => {
        if (Math.random() > 0.5) {
            resolve("✅ Succès !");
        } else {
            reject("❌ Erreur !");
        }
    }, 1000);
});

// Utilisation de then/catch/finally
maPromise
    .then(result => console.log(result))  // Si réussite
    .catch(error => console.error(error)) // Si échec
    .finally(() => console.log("🔄 Opération terminée"));
    </code></pre>
		</section>

		<section>
			<h2>Chaînage de Promises</h2>
			<pre><code class="javascript" data-line-numbers="2-12">
fetch("https://jsonplaceholder.typicode.com/users/1")
	// Convertit la réponse en JSON
    .then(response => response.json())

	// Récupère les posts de l'utilisateur
    .then(user => fetch(`https://jsonplaceholder.typicode.com/posts?userId=${user.id}`))
    .then(response => response.json())

	// Affiche le résultat
    .then(posts => console.log("📝 Articles :", posts))
    .catch(error => console.error("🚨 Erreur :", error));
    </code></pre>
		</section>

		<section>
			<h2>async/await</h2>
			<pre><code class="javascript" data-line-numbers="2-15">
// Fonction asynchrone
async function getUserData() {
    try {
        const response = await fetch("https://jsonplaceholder.typicode.com/users/1");
        const user = await response.json();
        console.log("👤 Utilisateur :", user);
    } catch (error) {
        console.error("❌ Erreur :", error);
    } finally {
        console.log("🔄 Requête terminée");
    }
}

getUserData();
    </code></pre>
		</section>

		<section>
			<h2>Gestion des erreurs</h2>
			<pre><code class="javascript" data-line-numbers="2-13 | 17-19">
async function getData(url) {
    try {
        let response = await fetch(url);
        if (!response.ok) {
            throw new Error(
				`Erreur ${response.status} : ${response.statusText}`
			);
        }
        return await response.json();
    } catch (error) {
        console.error("🚨 Erreur détectée :", error);
        return null;
    }
}

// Exemple d'utilisation
getData("https://jsonplaceholder.typicode.com/users/1")
    .then(data => console.log("✅ Données reçues :", data));
    </code></pre>
		</section>

		<section>
			<h2>Le Back du Tierlist Maker</h2>
			<img style="max-width: 17vw;" src="https://lesjoiesducode.fr/content/052/corrections-temporaires-hollande-bibliotheque.jpg">
		</section>

		<section>
			<h2>Express / TS / MongoDB</h2>
			<ul>
				<li><code>TypeScript :</code> Typage statique</li>
				<li><code>Express.js :</code> Framework minimaliste pour APIs</li>
				<li><code>MongoDB :</code> Base de données NoSQL</li>
			</ul>
		</section>

		<section>
			<h2>TypeScript : Pourquoi ?</h2>
			<img src="https://lesjoiesducode.fr/content/051/developpeurs-typescript-any-di-caprio-billets.jpg" style="max-width: 20vw">
			<pre><code class="typescript">
// Exemple : Déclaration typée
interface User {
    id: string;
    name: string;
    email: string;
}
const user: User = { id: "1", name: "Alice", email: "alice@email.com" };
    </code></pre>
		</section>

		<section>
			<h2>Express.js</h2>
			<pre><code class="typescript">
import express from "express";
const app = express();

// Middleware JSON
app.use(express.json());

// Route de test
app.get("/", (req, res) => {
    res.send("🚀 Serveur Express en TypeScript !");
});

app.listen(3000, () => console.log("✅ Serveur lancé !"));
    </code></pre>
		</section>

		<section>
			<h2>Architecture du projet</h2>
			<pre><code class="plaintext">
/src
│── controllers/    # Gère la logique métier des routes
│── middlewares/    # Intercepte et modifie les requêtes/réponses
│── models/         # Définition des schémas Mongoose
│── routes/         # Définition des endpoints Express
│── services/       # Gestion des données (ex: MongoDB, cache)
│── utils/          # Fonctions utilitaires globales
│── app.ts          # Point d’entrée de l’application
└── server.ts       # Configuration du serveur
    </code></pre>
		</section>
		<section>
			<h2>Le Not Only SQL</h2>
			<img style="max-width: 20vw" src="https://lesjoiesducode.fr/content/052/requete-blanquette-oss117-sql-join.jpg">
		</section>
		<section>
			<h2>Le Not Only SQL</h2>
			<ul>
				<li><code>Base de données NoSQL</code>
					<ul>
						<li>Stocke les données sous forme de documents JSON</li>
					</ul>
				</li>
				<li>
					<code>Flexible</code>
					<ul>
						<li>Pas de schéma fixe (contrairement aux bases SQL)</li>
					</ul>
				</li>
				<li><code>Scalabilité horizontale</code>
					<ul>
						<li>Gestion facile de grandes quantités de données</li>
					</ul>
				</li>
			</ul>
		</section>
		<section>
			<h2>Documents et Collections</h2>
			<p>Contrairement aux bases SQL, MongoDB stocke des <strong>documents JSON</strong> au lieu de tables.</p>
			<pre><code class="json">{
    "_id": "650f2a91f0c3e454c1d8eabc",
    "nom": "Alice",
    "email": "alice@email.com",
    "age": 25,
    "adresse": {
        "ville": "Paris",
        "codePostal": "75000"
    }
}</code></pre>
			<p>Les documents sont regroupés dans des <code>collections</code>, équivalent aux tables SQL.</p>
		</section>

		<section>
			<h2>SQL vs NoSQL</h2>
			<table style="font-size: 0.6em">
				<tr>
					<th>Caractéristique</th>
					<th>SQL</th>
					<th>NoSQL (MongoDB)</th>
				</tr>
				<tr>
					<td>Schéma</td>
					<td>Fixe (colonnes définies)</td>
					<td>Flexible (JSON dynamique)</td>
				</tr>
				<tr>
					<td>Structure</td>
					<td>Tables & Relations</td>
					<td>Documents & Collections</td>
				</tr>
				<tr>
					<td>Scalabilité</td>
					<td>Verticale (serveurs plus puissants)</td>
					<td>Horizontale (plusieurs serveurs)</td>
				</tr>
				<tr>
					<td>Requêtes</td>
					<td>SQL (SELECT, JOIN...)</td>
					<td>JSON (find, aggregate...)</td>
				</tr>
			</table>
		</section>
		<section>
			<h2>Requêtes MongoDB (CRUD)</h2>
			<p>Les opérations courantes sur MongoDB</p>

			<pre><code class="javascript">
// CREATE : Ajouter un utilisateur
db.users.insertOne({ name: "Alice", age: 25 });

// READ : Trouver un utilisateur
db.users.findOne({ name: "Alice" });

// UPDATE : Modifier un utilisateur
db.users.updateOne({ name: "Alice" }, { $set: { age: 26 } });

// DELETE : Supprimer un utilisateur
db.users.deleteOne({ name: "Alice" });
    </code></pre>
		</section>
		<section>
			<h2>MongoDB et Express</h2>
			<p>Utilisation avec <strong>Mongoose</strong> pour simplifier les interactions :</p>
			<pre><code class="typescript">
import mongoose from "mongoose";

const UserSchema = new mongoose.Schema({
    name: String,
    email: String,
    age: Number
});

export default mongoose.model("User", UserSchema);
    </code></pre>
		</section>
		<section>
			<h2>Connexion à MongoDB</h2>
			<p>Connexion via Mongoose :</p>
			<pre><code class="typescript">
import mongoose from "mongoose";

const connectDB = async () => {
    try {
        await mongoose.connect("mongodb://localhost:27017/monapp");
        console.log("✅ Connecté à MongoDB");
    } catch (error) {
        console.error("❌ Erreur de connexion :", error);
    }
};

export default connectDB;
    </code></pre>
		</section>
	</div>
</div>

<script src="dist/reveal.js"></script>
<script src="plugin/notes/notes.js"></script>
<script src="plugin/markdown/markdown.js"></script>
<script src="plugin/highlight/highlight.js"></script>
<script>
	// More info about initialization & config:
	// - https://revealjs.com/initialization/
	// - https://revealjs.com/config/
	Reveal.initialize({
		hash: true,
		slideNumber: 'c/t',
		showSlideNumber: 'all',
		mouseWheel:true,
		// Learn about plugins: https://revealjs.com/plugins/
		plugins: [ RevealMarkdown, RevealHighlight, RevealNotes ],
		// Activate the scroll view
		view: 'scroll',

		// Force the scrollbar to remain visible
		scrollProgress: true,
	});
</script>
</body>