Added Socket.io support
This commit is contained in:
parent
35661ebbf3
commit
b761372e96
@ -1,4 +1,5 @@
|
||||
annotated-types==0.7.0
|
||||
bidict==0.23.1
|
||||
blinker==1.8.2
|
||||
bson==0.5.10
|
||||
click==8.1.8
|
||||
@ -7,6 +8,8 @@ dnspython==2.7.0
|
||||
email_validator==2.2.0
|
||||
Flask==3.0.3
|
||||
Flask-JWT-Extended==4.7.1
|
||||
Flask-SocketIO==5.5.1
|
||||
h11==0.14.0
|
||||
idna==3.10
|
||||
importlib_metadata==8.5.0
|
||||
itsdangerous==2.2.0
|
||||
@ -17,7 +20,11 @@ pydantic_core==2.27.2
|
||||
PyJWT==2.10.1
|
||||
pymongo==4.11.1
|
||||
python-dateutil==2.9.0.post0
|
||||
python-engineio==4.11.2
|
||||
python-socketio==5.12.1
|
||||
simple-websocket==1.1.0
|
||||
six==1.17.0
|
||||
typing_extensions==4.12.2
|
||||
Werkzeug==3.0.6
|
||||
wsproto==1.2.0
|
||||
zipp==3.20.2
|
@ -1,18 +1,19 @@
|
||||
from flask import Flask
|
||||
from pymongo import MongoClient
|
||||
from flask_jwt_extended import JWTManager
|
||||
|
||||
from config import Config
|
||||
from singletons.database_singleton import DatabaseSingleton
|
||||
|
||||
from infra.server import app, socketio
|
||||
from controllers.user_controller import user_blueprint
|
||||
from controllers.reservation_controller import reservation_blueprint
|
||||
from controllers.health_controller import health_blueprint
|
||||
|
||||
app = Flask(__name__)
|
||||
app.config['JWT_SECRET_KEY'] = Config.JWT_SECRET_KEY
|
||||
|
||||
app.register_blueprint(user_blueprint, url_prefix='/user')
|
||||
app.register_blueprint(reservation_blueprint, url_prefix='/reservation')
|
||||
app.register_blueprint(health_blueprint, url_prefix='/health')
|
||||
|
||||
jwt = JWTManager(app)
|
||||
client = MongoClient(Config.MONGO_URI)
|
||||
@ -24,4 +25,5 @@ else:
|
||||
print('Failed to connect to MongoDB')
|
||||
|
||||
if __name__ == '__main__':
|
||||
app.run(debug=True)
|
||||
#app.run(debug=True)
|
||||
socketio.run(app, debug=False)
|
||||
|
7
src/controllers/health_controller.py
Normal file
7
src/controllers/health_controller.py
Normal file
@ -0,0 +1,7 @@
|
||||
from flask import Blueprint, request, jsonify
|
||||
|
||||
health_blueprint = Blueprint('health', __name__)
|
||||
|
||||
@health_blueprint.route('/', methods=['GET'])
|
||||
def health_check():
|
||||
return jsonify({"status": "OK"}), 200
|
@ -1,6 +1,8 @@
|
||||
from flask import Blueprint, request, jsonify
|
||||
from flask_socketio import emit
|
||||
from flask_jwt_extended import jwt_required, get_jwt_identity
|
||||
|
||||
from controllers.websocket_controller import notify_clients
|
||||
from middlewares.validate_request import validate_request
|
||||
from dtos.reservation_dtos import CreateReservationDTO, UpdateReservationDTO
|
||||
from models.reservation_model import Reservation
|
||||
@ -10,28 +12,33 @@ reservation_blueprint = Blueprint('reservation', __name__)
|
||||
|
||||
@reservation_blueprint.route('/', methods=['POST'])
|
||||
@validate_request(CreateReservationDTO)
|
||||
@jwt_required()
|
||||
#@jwt_required()
|
||||
def create_reservation():
|
||||
current_user = get_jwt_identity()
|
||||
current_user = ""#get_jwt_identity()
|
||||
reservation = Reservation(**request.json, creator=current_user)
|
||||
id = ReservationRepository.insert(reservation)
|
||||
notify_clients(reservation.room_id)
|
||||
return jsonify({"message": "Reservation created successfully", "id": id})
|
||||
|
||||
@reservation_blueprint.route('/<reservation_id>', methods=['DELETE'])
|
||||
@jwt_required()
|
||||
#@jwt_required()
|
||||
def cancel_reservation(reservation_id):
|
||||
reservation = ReservationRepository.get_by_id(reservation_id)
|
||||
result = ReservationRepository.delete(reservation_id)
|
||||
notify_clients(reservation["room_id"])
|
||||
if not result or result.deleted_count == 0:
|
||||
return jsonify({"error": "Reservation not found"}), 404
|
||||
return jsonify({"message": "Reservation cancelled"})
|
||||
|
||||
@reservation_blueprint.route('/<reservation_id>', methods=['PUT'])
|
||||
@validate_request(UpdateReservationDTO)
|
||||
@jwt_required()
|
||||
#@jwt_required()
|
||||
def change_reservation(reservation_id):
|
||||
data = request.json
|
||||
try:
|
||||
reservation = ReservationRepository.get_by_id(reservation_id)
|
||||
result = ReservationRepository.update(reservation_id, data)
|
||||
notify_clients(reservation["room_id"])
|
||||
if not result or result.matched_count == 0:
|
||||
return jsonify({"error": "Reservation not found"}), 404
|
||||
except:
|
||||
@ -40,7 +47,7 @@ def change_reservation(reservation_id):
|
||||
return jsonify({"message": "Reservation updated"})
|
||||
|
||||
@reservation_blueprint.route('/<reservation_id>', methods=['GET'])
|
||||
@jwt_required()
|
||||
#@jwt_required()
|
||||
def get_reservation(reservation_id):
|
||||
try:
|
||||
reservation = ReservationRepository.get_by_id(reservation_id)
|
||||
@ -52,7 +59,7 @@ def get_reservation(reservation_id):
|
||||
return jsonify(reservation)
|
||||
|
||||
@reservation_blueprint.route('/', methods=['GET'])
|
||||
@jwt_required()
|
||||
#@jwt_required()
|
||||
def list_reservations():
|
||||
filters = {
|
||||
"date": request.args.get("date"),
|
||||
|
27
src/controllers/websocket_controller.py
Normal file
27
src/controllers/websocket_controller.py
Normal file
@ -0,0 +1,27 @@
|
||||
from flask_jwt_extended import get_jwt_identity, jwt_required
|
||||
from flask_socketio import emit
|
||||
|
||||
from infra.server import socketio
|
||||
from repos.reservation_repo import ReservationRepository
|
||||
|
||||
@socketio.on('connect')
|
||||
#@jwt_required()
|
||||
def handle_connect():
|
||||
#current_user = get_jwt_identity()
|
||||
#print(f'Client connected: {current_user}')
|
||||
emit('status', {'message': 'Connected'})
|
||||
|
||||
@socketio.on('disconnect')
|
||||
def handle_disconnect():
|
||||
print('Client disconnected')
|
||||
|
||||
@socketio.on('subscribe_reservations')
|
||||
#@jwt_required()
|
||||
def handle_subscribe(data):
|
||||
room_id = data.get('room_id')
|
||||
reservations = [] # ReservationRepository.list_all({'room_id': room_id})
|
||||
emit('reservations_update', reservations)
|
||||
|
||||
def notify_clients(room_id):
|
||||
reservations = [] # ReservationRepository.list_all({'room_id': room_id})
|
||||
socketio.emit('reservations_update', reservations, room=room_id)
|
5
src/infra/server.py
Normal file
5
src/infra/server.py
Normal file
@ -0,0 +1,5 @@
|
||||
from flask import Flask
|
||||
from flask_socketio import SocketIO
|
||||
|
||||
app = Flask(__name__)
|
||||
socketio = SocketIO(app, cors_allowed_origins="*")
|
@ -1,7 +1,7 @@
|
||||
from models.time_model import Time
|
||||
|
||||
class Reservation:
|
||||
def __init__(self, title, room_id, creator, date, start_time, finish_time, color, description=None):
|
||||
def __init__(self, title, room_id, creator, date, start_time, finish_time, color, description=""):
|
||||
self.title = title
|
||||
self.description = description
|
||||
self.room_id = room_id
|
||||
|
@ -28,14 +28,25 @@ class ReservationRepository:
|
||||
|
||||
@classmethod
|
||||
def get_by_id(cls, reservation_id):
|
||||
return list(cls.db.reservation.find({"_id": ObjectId(reservation_id)}))
|
||||
reservations = list(cls.db.reservation.find({"_id": ObjectId(reservation_id)}))
|
||||
|
||||
print(reservations)
|
||||
if not reservations or len(reservations) < 1:
|
||||
return None
|
||||
|
||||
reservation = reservations[0]
|
||||
|
||||
reservation["id"] = str(reservation["_id"])
|
||||
del reservation["_id"]
|
||||
|
||||
return reservation
|
||||
|
||||
@classmethod
|
||||
def list_all(cls, filters=None):
|
||||
query = {}
|
||||
if filters:
|
||||
if "date" in filters:
|
||||
query["date"] = {"$gte": filters["date"]}
|
||||
query["date"] = filters["date"]
|
||||
if "room_id" in filters:
|
||||
query["room_id"] = filters["room_id"]
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user