Added Socket.io support

This commit is contained in:
Sviatoslav Tsariov Yurievich 2025-02-22 21:13:40 +03:00
parent 35661ebbf3
commit b761372e96
8 changed files with 78 additions and 12 deletions

View File

@ -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

View File

@ -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)

View 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

View File

@ -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"),

View 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
View File

@ -0,0 +1,5 @@
from flask import Flask
from flask_socketio import SocketIO
app = Flask(__name__)
socketio = SocketIO(app, cors_allowed_origins="*")

View File

@ -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

View File

@ -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"]