Solution officielle
import math
class BlogAPI:
def __init__(self):
self.articles = {}
self.next_id = 1
self.page_size = 3
def handle_request(self, request):
method = request.get('method', 'GET')
path = request.get('path', '/')
parts = path.strip('/').split('/')
if len(parts) == 1 and parts[0] == 'posts':
if method == 'GET':
return self._list_posts(request)
elif method == 'POST':
return self._create_post(request)
return {'status': 405, 'error': 'Méthode non autorisee'}
if len(parts) == 2 and parts[0] == 'posts' and parts[1].isdigit():
pk = int(parts[1])
if method == 'GET':
return self._get_post(pk)
elif method == 'PUT':
return self._update_post(pk, request)
elif method == 'DELETE':
return self._delete_post(pk, request)
return {'status': 405, 'error': 'Méthode non autorisee'}
return {'status': 404, 'error': 'Route non trouvee'}
def _list_posts(self, request):
params = request.get('params', {})
page = int(params.get('page', 1))
all_posts = list(self.articles.values())
total = len(all_posts)
total_pages = math.ceil(total / self.page_size) if total > 0 else 0
if page < 1 or (page > total_pages and total_pages > 0):
return {'status': 200, 'data': {'count': total, 'next': None, 'previous': None, 'results': []}}
start = (page - 1) * self.page_size
end = start + self.page_size
results = all_posts[start:end]
return {
'status': 200,
'data': {
'count': total,
'next': page + 1 if page < total_pages else None,
'previous': page - 1 if page > 1 else None,
'results': results,
}
}
def _create_post(self, request):
user = request.get('user')
if not user:
return {'status': 403, 'error': 'Authentification requise'}
data = request.get('data', {})
title = data.get('title', '').strip() if isinstance(data.get('title'), str) else ''
content = data.get('content', '').strip() if isinstance(data.get('content'), str) else ''
if not title or not content:
errors = {}
if not title:
errors['title'] = 'Ce champ est requis'
if not content:
errors['content'] = 'Ce champ est requis'
return {'status': 400, 'errors': errors}
article = {
'id': self.next_id,
'title': title,
'content': content,
'author': user,
'created_at': 'now',
}
self.articles[self.next_id] = article
self.next_id += 1
return {'status': 201, 'data': article}
def _get_post(self, pk):
if pk not in self.articles:
return {'status': 404, 'error': 'Non trouve'}
return {'status': 200, 'data': self.articles[pk]}
def _update_post(self, pk, request):
if pk not in self.articles:
return {'status': 404, 'error': 'Non trouve'}
user = request.get('user')
if not user:
return {'status': 403, 'error': 'Authentification requise'}
if self.articles[pk]['author'] != user:
return {'status': 403, 'error': 'Seul auteur peut modifier'}
data = request.get('data', {})
if 'title' in data:
self.articles[pk]['title'] = data['title']
if 'content' in data:
self.articles[pk]['content'] = data['content']
return {'status': 200, 'data': self.articles[pk]}
def _delete_post(self, pk, request):
if pk not in self.articles:
return {'status': 404, 'error': 'Non trouve'}
user = request.get('user')
if not user:
return {'status': 403, 'error': 'Authentification requise'}
if self.articles[pk]['author'] != user:
return {'status': 403, 'error': 'Seul auteur peut supprimer'}
del self.articles[pk]
return {'status': 204, 'data': None}