From bac3580116745e20267e7802a67962a3d5153ed2 Mon Sep 17 00:00:00 2001
From: marwengh <marwenghodben@gmail.com>
Date: Sat, 28 Sep 2024 14:08:12 +0200
Subject: [PATCH] develop flask crud app

---
 .env.dist        | 10 +++++++
 .gitignore       |  4 +++
 README.md        |  4 +++
 app.py           | 69 +++++++++++++++++++++++++++++++++++++++++++++---
 requirements.txt |  1 +
 scripts/user.sql |  9 +++++++
 6 files changed, 94 insertions(+), 3 deletions(-)
 create mode 100644 .env.dist
 create mode 100644 .gitignore
 create mode 100644 scripts/user.sql

diff --git a/.env.dist b/.env.dist
new file mode 100644
index 0000000..7c26e96
--- /dev/null
+++ b/.env.dist
@@ -0,0 +1,10 @@
+# Flask app settings
+
+MYSQL_HOST=
+MYSQL_USER=  
+MYSQL_PASSWORD=
+MYSQL_DB=
+
+# MySQL settings
+MYSQL_DATABASE=
+MYSQL_ROOT_PASSWORD=
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..26f1a22
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+__pycache__
+.env
+docker-compose.yaml
+Dockerfile
\ No newline at end of file
diff --git a/README.md b/README.md
index 9a632cb..e223949 100644
--- a/README.md
+++ b/README.md
@@ -3,3 +3,7 @@
 - ecrire le dockerfile pour conteneuriser l'application
 - ecrire le docker-compose file pour lancer le conteneur
 - utiliser les commandes de base git pour créer les branches puis les merger dans une barnche par default
+
+# Flask MySQL CRUD Application
+
+Il s'agit d'une application Flask simple qui effectue des opérations CRUD (Créer, Lire, Mettre à jour, Supprimer) sur une base de données MySQL. L'application est Dockerisée à l'aide de Docker Compose, qui orchestre l'application Flask et les services MySQL.
diff --git a/app.py b/app.py
index def6287..06c2034 100644
--- a/app.py
+++ b/app.py
@@ -1,14 +1,77 @@
-from flask import Flask
+from flask import Flask, jsonify, request, redirect, url_for
+from flask_mysqldb import MySQL
+import MySQLdb.cursors
 import os
 
 app = Flask(__name__)
 
+# MySQL configurations
+app.config['MYSQL_HOST'] = os.getenv('MYSQL_HOST')
+app.config['MYSQL_USER'] = os.getenv('MYSQL_USER')  
+app.config['MYSQL_PASSWORD'] = os.getenv('MYSQL_PASSWORD')
+app.config['MYSQL_DB'] = os.getenv('MYSQL_DB')
 
-name = os.getenv('name')
+
+# Initialize MySQL
+mysql = MySQL(app)
+
+# Create operation
+@app.route('/add_user', methods=['POST'])
+def add_user():
+    firstname = request.json['firstname']
+    email = request.json['email']
+    cursor = mysql.connection.cursor()
+    cursor.execute("INSERT INTO users (firstname, email) VALUES (%s, %s)", (firstname, email))
+    mysql.connection.commit()
+    cursor.close()
+    return jsonify({'message': 'User added successfully!'})
+
+# Read operation
+@app.route('/users', methods=['GET'])
+def get_users():
+    cursor = mysql.connection.cursor(MySQLdb.cursors.DictCursor)
+    cursor.execute("SELECT * FROM users")
+    users = cursor.fetchall()
+    cursor.close()
+    return jsonify(users)
+
+# Read operation by id
+@app.route('/user/<int:id>', methods=['GET'])
+def get_user(id):
+    cursor = mysql.connection.cursor(MySQLdb.cursors.DictCursor)
+    cursor.execute("SELECT * FROM users WHERE id = %s", (id,))
+    user = cursor.fetchone()
+    cursor.close()
+
+    if user:
+        return jsonify(user)
+    else:
+        return jsonify({'message': 'User not found'}), 404
+
+
+# Update operation
+@app.route('/update_user/<int:id>', methods=['PUT'])
+def update_user(id):
+    firstname = request.json['firstname']
+    email = request.json['email']
+    cursor = mysql.connection.cursor()
+    cursor.execute("UPDATE users SET firstname = %s, email = %s WHERE id = %s", (firstname, email, id))
+    mysql.connection.commit()
+    cursor.close()
+    return jsonify({'message': 'User updated successfully!'})
+
+# Delete operation
+@app.route('/delete_user/<int:id>', methods=['DELETE'])
+def delete_user(id):
+    cursor = mysql.connection.cursor()
+    cursor.execute("DELETE FROM users WHERE id = %s", (id,))
+    mysql.connection.commit()
+    cursor.close()
+    return jsonify({'message': 'User deleted successfully!'})
 
 @app.route('/')
 def hello_world():
-    return f'Hello, {name}!'
+    return f'Hello, from flask app!'
 
 if __name__ == '__main__':
     app.run(debug=True, host=os.environ.get('FLASK_RUN_HOST', '0.0.0.0'), port=int(os.environ.get('FLASK_RUN_PORT', 5000)))
diff --git a/requirements.txt b/requirements.txt
index db43654..a406bf9 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,3 +1,4 @@
 Flask==3.0.0
 requests==2.26.0
 Flask-DotEnv==0.1.2
+Flask-MySQLdb==2.0.0
diff --git a/scripts/user.sql b/scripts/user.sql
new file mode 100644
index 0000000..7bbf529
--- /dev/null
+++ b/scripts/user.sql
@@ -0,0 +1,9 @@
+CREATE DATABASE IF NOT EXISTS workshop;
+
+USE workshop;
+
+CREATE TABLE IF NOT EXISTS users (
+    id INT AUTO_INCREMENT PRIMARY KEY,
+    firstname VARCHAR(100),
+    email VARCHAR(100)
+);
-- 
GitLab