Skip to content

Glaces Project Setup #3

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 34 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
855ed4c
Add gitignore
Hemdai2 May 24, 2025
d580f68
Create djangoproject as backend
Hemdai2 May 24, 2025
d81ce5c
Docker Setup
Hemdai2 May 24, 2025
1860e0c
Setup Pytest and testing environment
Hemdai2 May 24, 2025
e90057e
Create test for Model
Hemdai2 May 24, 2025
da3f6ef
Create glace models
Hemdai2 May 24, 2025
4a4f8fa
Fix test for models
Hemdai2 May 24, 2025
6de6851
create factories
Hemdai2 May 24, 2025
be1ef9b
Add DRF and serailizers
Hemdai2 May 24, 2025
297da2c
Add swagger and fix test
Hemdai2 May 24, 2025
0dbf899
Test order creation success
Hemdai2 May 24, 2025
f70382e
Add test for mix glace
Hemdai2 May 24, 2025
6a6c2dd
Create Refill API
Hemdai2 May 24, 2025
aa8308c
Create OrderReadSerializer and test for refill
Hemdai2 May 24, 2025
77b99bf
create signals
Hemdai2 May 24, 2025
fb99291
add get urls for models
Hemdai2 May 24, 2025
72697e4
Add frontend
Hemdai2 May 24, 2025
39daa6e
Add corsheaders
Hemdai2 May 24, 2025
a66ad43
organise image to folder
Hemdai2 May 24, 2025
f8c09cf
error and add admin page
Hemdai2 May 24, 2025
fe01f11
fix refil message and test
Hemdai2 May 24, 2025
193adea
login and order details page
Hemdai2 May 24, 2025
535ae8b
Add drf simplejwt
Hemdai2 May 24, 2025
54eb19d
make password and token based login
Hemdai2 May 24, 2025
07ac438
make production environment
Hemdai2 May 24, 2025
4e00e72
Update test for protected endpoints
Hemdai2 May 24, 2025
16c2c07
update readme file
Hemdai2 May 24, 2025
92aed64
fix requirements.txt
Hemdai2 May 24, 2025
588ef67
update validation and view layout
Hemdai2 May 25, 2025
53f2942
Add urls info
Hemdai2 May 25, 2025
d779d01
fixture data and readme file
Hemdai2 May 25, 2025
f91a8c4
clean docker comments
Hemdai2 May 25, 2025
ba88bcb
Readme structure
Hemdai2 May 25, 2025
286af8a
remove json and fix readme
Hemdai2 May 25, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 86 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class

# C extensions
*.so

# Virtual environments
.venv/
env/
venv/
ENV/
env.bak/
venv.bak/

# Pipenv
Pipfile.lock

# Poetry
poetry.lock

# Pyre type checker
.pyre/

# Django stuff:
*.log
*.pot
*.pyc
db.sqlite3
db.sqlite3-journal


# Local settings
local_settings.py
.env
.env.*

# Static and media
/staticfiles/
/media/

# VS Code
.vscode/
.idea/
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

# MyPy
.mypy_cache/

# Pytest
.pytest_cache/

# Coverage
htmlcov/
.coverage
.coverage.*
.cache

# macOS
.DS_Store

# Production cache
.cache/
Thumbs.db
# TypeScript cache
*.tsbuildinfo

# Optional npm cache directory
.npm

# Next.js static optimization
.next/cache/

# Dependency directories
node_modules/
.pnp/
.pnp.js

# Next.js build output
.next/
out/
36 changes: 36 additions & 0 deletions Dockerfile.backend
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
FROM python:3.11-slim AS base

# Set environment variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
ENV PIP_DISABLE_PIP_VERSION_CHECK 1
ENV PIP_NO_CACHE_DIR 1

# Install system dependencies
RUN apt-get update && apt-get install -y \
gcc \
python3-dev \
libpq-dev \
netcat-openbsd \
&& rm -rf /var/lib/apt/lists/*

# Set working directory
WORKDIR /code/backend

# Copy and install dependencies
COPY backend/requirements.txt .
RUN pip install --upgrade pip
RUN pip install -r requirements.txt

# Copy the rest of the backend source code
COPY backend/ .

# Copy and set permissions for entrypoint script
COPY backend/entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh

# Set the working directory again in this stage
WORKDIR /code/backend

# Run the entrypoint script and start the Django server from here
ENTRYPOINT ["/entrypoint.sh"]
23 changes: 23 additions & 0 deletions Dockerfile.frontend
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@


FROM node:18-alpine
ARG ENVIRONMENT=dev

ENV ENVIRONMENT=${ENVIRONMENT}

WORKDIR /app

# Copy only package.json and lock to install deps
COPY frontend/package*.json ./

RUN npm install

# Copy rest of frontend project
COPY frontend/ .

EXPOSE 3000

RUN if [ "$ENVIRONMENT" = "prod" ]; then npm run build; fi

# At runtime
CMD ["sh", "-c", "if [ \"$ENVIRONMENT\" = 'prod' ]; then npx serve -s dist -l 80; else npm run dev; fi"]
200 changes: 194 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,32 +1,32 @@
# Nalo lance le 1er glacier automate au monde !!

Tu es un nouveau développeur dans l'équipe Nalo, et ta première tâche consiste à développer le nouvel automate de Nalo.
Tu es un nouveau développeur dans l'équipe Nalo, et ta première tâche consiste à développer le nouvel automate de Nalo.

On te laisse le goût du design. Nous te recommandons de consacrer entre 2 et 4 heures à cet exercice.
On te laisse le goût du design. Nous te recommandons de consacrer entre 2 et 4 heures à cet exercice.

(Fais-en plus si tu veux 😇, fais-en moins si tu penses avoir montré tout ce qu'il faut 😎).


## Spécifications

Il y a 5 parfums de crème glacée disponibles :

- Chocolat Orange
- Cerise
- Pistache
- Vanille
- Framboise

Un pot de glace contient 40 boules.
Chaque boule coûte 2 euros.
Un utilisateur a le choix du nombre de boule et des parfums.


## Requis

- Une page doit permettre la saisie de la commande gérée en API, le prix sera retourné ainsi qu’un code aléatoire unique. Il faut gérer les problèmes de stocks !
- Une page doit permettre de récupérer la commande en entrant le numéro de commande, une représentation graphique de la glace (boule(s)) sera affiché à l'écran
- Une page administrateur permet de voir les recettes, le taux de remplissage des pots de glace
- Un bouton permet de remplir un pot vide, si un pot est vide un e-mail est envoyé à l’adresse de l’administrateur (un print suffit pour ce test)


## Instructions

- [ ] `fork` ce repository
Expand All @@ -36,3 +36,191 @@ Un utilisateur a le choix du nombre de boule et des parfums.
- [ ] Publie-le sur GitHub en tant que `pull-request`
- [ ] Envoie-nous le lien et dis-nous approximativement combien de temps tu as passé sur ce travail.

##############################################################################################################################

# 🍦 Plateforme de Commande de Glaces Project Solution

Une application web full-stack agréable pour commander des glaces personnalisées en ligne — développée avec **Django REST Framework** et **Next.js**.

- 📦 Backend : TDD avec pytest + Django + DRF + PostgreSQL + Swagger
- 🖥️ Frontend : Next.js + Tailwind CSS
- 🔐 Authentification : Connexion administrateur via token
- 🧾 Fonctionnalités : Création de commande, visualisation, tableau de bord admin, Remplisage, se connecter

---

## ✨ Fonctionnalités

- ✅ Créer des commandes avec sélection de parfums et quantités
- ✅ Visualiser les commandes avec prix total et images
- ✅ Tableau de bord administrateur avec commandes récentes
- ✅ Authentification basée sur des tokens pour les administrateurs
- ✅ Interface utilisateur responsive et esthétique
- ✅ Configuration Docker pour le développement et la production

---

## 🛠 Technologies Utilisées

| Côté | Stack |
| ----------------- | --------------------------------- |
| Frontend | Next.js, TypeScript, Tailwind CSS |
| Backend | Django, Django REST Framework |
| Base de données | PostgreSQL |
| Test | Pytest (TDD-Backend) |
| Authentification | Token DRF |
| Déploiement | Docker |
| API-Documentation | Swagger |

---

## 📸 Captures d'écran

### Open API

# Accès via :8000/swagger/

![Project Screenshot](project_snaps/swagger.png)

### Create Order

# Accès via :3000/

![Project Screenshot](project_snaps/create_order.png)

### Admin Login

# Accès via :3000/admin/login

![Project Screenshot](project_snaps/admin_login.png)

### Current Status

![Project Screenshot](project_snaps/current_status.png)

### Order-details

# Accès via :3000/order/unique-id-uuid

![Project Screenshot](project_snaps/order-details.png)

### pytest

![Project Screenshot](project_snaps/pytest.png)

## comment exécuter le test ?

Démarrez Docker, exécutez le script bash de votre conteneur backend (normalement, son nom est backend_nalo_glacier) et exécutez la commande pytest.

### Django Signal message post Save pour le Notification

![Project Screenshot](project_snaps/signal_message.png)
Lors de la prise de commande, si la capacité du pot devient 0, Django signale l'exécution d'un message d'impression (Future fonction d'envoi d'email).

### 🚀 Page de commande

L'utilisateur peut choisir les parfums et les quantités, puis passer la commande.

### 📜 Détails de la commande

Affiche les images, les boules sélectionnées, et le prix total.

### 🛠 Tableau de bord admin

Liste des commandes récentes avec détails et liens.

---

## 📦 Structure du Projet

```
.
├── backend/ # Backend Django
│ ├── manage.py
│ ├── backend/ # Répertoire du projet Django
│ ├── glace/ # Application principale
│ └── entrypoint.sh
├── frontend/ # Frontend Next.js
│ ├── src/app/ # Pages et composants
│ └── public/
│ └── images/ # Images des parfums
├── README.md
├── docker-compose.yml
├── Dockerfile.backend
├── Dockerfile.frontend
├── .env
└── .env.local

```

## 🚀 Démarrage Rapide

### 🔧 Configuration Backend

1. **Cloner le dépôt :**
```bash
git clone https://github.com/NaloProject/Test-Backend.git
cd Test-Backend
```

### 🔧 Configuration de l’environnement

À la racine du projet, créez l’un des fichiers suivants :

- `.env` – pour une utilisation générale
- `.env.local` – pour le développement local
- `.env.production` – pour la production

### Exemple de fichier `.env` :

````env
ENVIRONMENT=dev
CREATE_SUPERUSER=true
DJANGO_SUPERUSER_USERNAME=admin
DJANGO_SUPERUSER_PASSWORD=admin123
DJANGO_SUPERUSER_EMAIL=admin@example.com

n'oubliez pas de vérifier votre Email ou de me demander ce fichier car ce fichier peut ne pas être disponible sur github.

Les administrateurs se connectent via un système d’authentification par token.

Ajouter le token dans les en-têtes des requêtes API :

mais si vous accédez à partir du Web, il suffit de vous connecter pour que l'administrateur puisse remplir le pot de glace.

Authorization: Token <votre_token_ici>

📦 Déploiement avec Docker

# Construire et lancer les conteneurs

docker-compose up --build


# Arrêter

docker-compose down

📬 Endpoints API
| Méthode | Endpoint | Description |
| ------- | ------------------ | ----------------------------- |
| GET | /api/glace/flavors/ | Liste des parfums disponibles |
| POST | /api/glace/create-order/ | Créer une commande |
| GET | /api/glace/order-details/<uniqie_id>/ | Détail d’une commande |
| POST | /api/token/ | Connexion admin |
| POST | /api/glace/tub/refil/{tub_id} | glace_tub_refill |
| GET | /api/glace/tubs/ | glace_tub_list |

```

# Solution supplémentaire

Le fichier db.json est disponible et permet de tester les données sans les créer manuellement.
Il suffit de faire


python manage.py loaddata db.json


```
````
Empty file added backend/backend/__init__.py
Empty file.
16 changes: 16 additions & 0 deletions backend/backend/asgi.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
"""
ASGI config for backend project.

It exposes the ASGI callable as a module-level variable named ``application``.

For more information on this file, see
https://docs.djangoproject.com/en/3.1/howto/deployment/asgi/
"""

import os

from django.core.asgi import get_asgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'backend.settings')

application = get_asgi_application()
Loading