Skip to content

Commit 9074d00

Browse files
committed
feat: Add API documentation with Flask-RESTX and Swagger UI
1 parent 49d81e0 commit 9074d00

File tree

4 files changed

+120
-0
lines changed

4 files changed

+120
-0
lines changed

api_docs.py

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
from flask_restx import Api, Resource, fields
2+
from flask import Blueprint
3+
4+
api_blueprint = Blueprint('api', __name__)
5+
api = Api(
6+
api_blueprint,
7+
version='1.0.0',
8+
title='ChatForge API',
9+
description='Scalable AI Chatbot API built with Flask, OpenAI, and vector memory',
10+
doc='/docs/',
11+
prefix='/api'
12+
)
13+
14+
# Namespace definitions
15+
auth_ns = api.namespace('auth', description='Authentication endpoints')
16+
bot_ns = api.namespace('bot', description='Chatbot management endpoints')
17+
knowledge_ns = api.namespace('knowledge', description='Knowledge base management')
18+
chat_ns = api.namespace('chat', description='Chat and conversation endpoints')
19+
ticket_ns = api.namespace('tickets', description='Support ticket endpoints')
20+
payment_ns = api.namespace('payment', description='Payment processing endpoints')
21+
shopify_ns = api.namespace('shopify', description='Shopify integration endpoints')
22+
wordpress_ns = api.namespace('wordpress', description='WordPress integration endpoints')
23+
24+
# Request/Response models
25+
login_model = api.model('Login', {
26+
'email': fields.String(required=True, description='User email'),
27+
'password': fields.String(required=True, description='User password')
28+
})
29+
30+
register_model = api.model('Register', {
31+
'email': fields.String(required=True, description='User email'),
32+
'password': fields.String(required=True, description='User password'),
33+
'first_name': fields.String(required=True, description='First name'),
34+
'last_name': fields.String(required=True, description='Last name'),
35+
'language': fields.String(required=True, description='Language preference'),
36+
'com_name': fields.String(required=True, description='Company name'),
37+
'com_vat': fields.String(required=True, description='Company VAT'),
38+
'com_street': fields.String(required=True, description='Company street'),
39+
'com_street_number': fields.String(required=True, description='Street number'),
40+
'com_city': fields.String(required=True, description='City'),
41+
'com_postal': fields.String(required=True, description='Postal code'),
42+
'com_country': fields.String(required=True, description='Country'),
43+
'com_website': fields.String(required=True, description='Company website')
44+
})
45+
46+
chat_query_model = api.model('ChatQuery', {
47+
'input': fields.String(required=True, description='User message'),
48+
'botId': fields.Integer(required=True, description='Bot ID'),
49+
'userId': fields.Integer(required=True, description='User ID'),
50+
'sessionId': fields.String(required=True, description='Session ID'),
51+
'createdAt': fields.String(required=True, description='Creation timestamp'),
52+
'website': fields.String(required=True, description='Website URL')
53+
})
54+
55+
create_bot_model = api.model('CreateBot', {
56+
'name': fields.String(required=True, description='Bot name'),
57+
'user_id': fields.Integer(required=True, description='User ID'),
58+
'color': fields.String(required=True, description='Bot color'),
59+
'active': fields.String(required=True, description='Active status'),
60+
'start_time': fields.String(required=True, description='Start time'),
61+
'end_time': fields.String(required=True, description='End time'),
62+
'knowledge_base': fields.String(required=True, description='Knowledge base ID')
63+
})
64+
65+
error_response_model = api.model('Error', {
66+
'error': fields.String(description='Error message'),
67+
'status': fields.Integer(description='HTTP status code'),
68+
'code': fields.String(description='Error code')
69+
})
70+
71+
success_response_model = api.model('Success', {
72+
'message': fields.String(description='Success message'),
73+
'status': fields.Integer(description='HTTP status code'),
74+
'data': fields.Raw(description='Response data')
75+
})
76+
77+
# Documentation endpoints
78+
@api_blueprint.route('/')
79+
class APIInfo(Resource):
80+
@api.doc('api_info')
81+
def get(self):
82+
"""API information and health check"""
83+
return {
84+
'message': 'ChatForge API is running',
85+
'status': 'healthy',
86+
'version': '1.0.0',
87+
'docs': '/api/docs/'
88+
}
89+

api_docs_endpoints.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
"""
2+
API Documentation decorators for endpoints
3+
This file provides easy-to-use decorators for documenting endpoints
4+
"""
5+
from flask_restx import Namespace
6+
from functools import wraps
7+
8+
def document_endpoint(namespace, description, params=None, responses=None):
9+
"""
10+
Decorator to document an endpoint with Swagger
11+
12+
Usage:
13+
@document_endpoint(
14+
auth_ns,
15+
'User login endpoint',
16+
params={'email': 'string', 'password': 'string'},
17+
responses={200: 'Success', 401: 'Unauthorized'}
18+
)
19+
def login():
20+
...
21+
"""
22+
def decorator(func):
23+
@namespace.doc(description=description)
24+
@wraps(func)
25+
def wrapper(*args, **kwargs):
26+
return func(*args, **kwargs)
27+
return wrapper
28+
return decorator
29+

app.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
from api.shopify import shopify_blueprint, sync_products
2121
from api.mautic import delete_mautic_contact
2222
from api.wordpress import wordpress_blueprint
23+
from api_docs import api_blueprint
2324
from models import db, User
2425
from datetime import timedelta
2526
from utils.common import get_bucket_name
@@ -91,6 +92,7 @@ def scheduled_task():
9192
# CORS(app, supports_credentials=True, origins=['https://your-frontend-domain.com'])
9293
CORS(app, resources={r"/*": {"origins": "*", "allow_headers": "*", "expose_headers": "*"}})
9394

95+
app.register_blueprint(api_blueprint)
9496
app.register_blueprint(user_blueprint, url_prefix='/api')
9597
app.register_blueprint(bot_blueprint, url_prefix='/api')
9698
app.register_blueprint(knowledge_blueprint, url_prefix='/api')

requirements.txt

40 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)