diff --git a/requirements.txt b/requirements.txt index c70a816..6d32ab6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,9 +1,23 @@ +annotated-types==0.7.0 blinker==1.8.2 +bson==0.5.10 click==8.1.8 -flask==3.0.3 -importlib-metadata==8.5.0 +colorama==0.4.6 +dnspython==2.7.0 +email_validator==2.2.0 +Flask==3.0.3 +Flask-JWT-Extended==4.7.1 +idna==3.10 +importlib_metadata==8.5.0 itsdangerous==2.2.0 -jinja2==3.1.5 +Jinja2==3.1.5 MarkupSafe==2.1.5 -werkzeug==3.0.6 -zipp==3.20.2 +pydantic==2.10.6 +pydantic_core==2.27.2 +PyJWT==2.10.1 +pymongo==4.11.1 +python-dateutil==2.9.0.post0 +six==1.17.0 +typing_extensions==4.12.2 +Werkzeug==3.0.6 +zipp==3.20.2 \ No newline at end of file diff --git a/src/app.py b/src/app.py index 900d289..f6a5b3a 100644 --- a/src/app.py +++ b/src/app.py @@ -1,13 +1,27 @@ 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 controllers.user_controller import user_blueprint +from controllers.reservation_controller import reservation_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') + jwt = JWTManager(app) client = MongoClient(Config.MONGO_URI) db = DatabaseSingleton.get_instance() +if db is not None: + print('Connected to MongoDB') +else: + print('Failed to connect to MongoDB') + if __name__ == '__main__': app.run(debug=True) diff --git a/src/config.py b/src/config.py index 95e76a3..ef679bd 100644 --- a/src/config.py +++ b/src/config.py @@ -1,6 +1,6 @@ import os class Config: - DB_NAME = os.getenv('DB_NAME', 'meeting_reservation') + DB_NAME = os.getenv('DB_NAME', 'talkpal') JWT_SECRET_KEY = os.getenv('JWT_SECRET_KEY', 'your_jwt_secret_key') MONGO_URI = os.getenv('MONGO_URI', 'mongodb://localhost:27017/') \ No newline at end of file diff --git a/src/controllers/reservation_controller.py b/src/controllers/reservation_controller.py index 40b0303..13e6393 100644 --- a/src/controllers/reservation_controller.py +++ b/src/controllers/reservation_controller.py @@ -13,9 +13,9 @@ reservation_blueprint = Blueprint('reservation', __name__) @jwt_required() def create_reservation(): current_user = get_jwt_identity() - reservation = Reservation(**request.json.dict(), creator=current_user) - ReservationRepository.insert(reservation) - return jsonify({"message": "Reservation created successfully"}) + reservation = Reservation(**request.json, creator=current_user) + id = ReservationRepository.insert(reservation) + return jsonify({"message": "Reservation created successfully", "id": id}) @reservation_blueprint.route('/', methods=['DELETE']) @jwt_required() @@ -43,7 +43,7 @@ def change_reservation(reservation_id): @jwt_required() def get_reservation(reservation_id): try: - reservation = ReservationRepository.get_by_id() + reservation = ReservationRepository.get_by_id(reservation_id) if not reservation: return jsonify({"error": "Reservation not found"}), 404 except: @@ -55,11 +55,11 @@ def get_reservation(reservation_id): @jwt_required() def list_reservations(): filters = { - "start_date": request.args.get("start_date"), - "end_date": request.args.get("end_date"), + "date": request.args.get("date"), "room_id": request.args.get("room_id") } filters = {k: v for k, v in filters.items() if v is not None} reservations = ReservationRepository.list_all(filters) + print(reservations) return jsonify(reservations) \ No newline at end of file diff --git a/src/controllers/user_controller.py b/src/controllers/user_controller.py index ccc1fa3..85ff58f 100644 --- a/src/controllers/user_controller.py +++ b/src/controllers/user_controller.py @@ -12,9 +12,9 @@ user_blueprint = Blueprint('user', __name__) @validate_request(RegisterUserDTO) def register_user(): data = request.json - if UserRepo.find_by_username(data.username): + if UserRepo.find_by_username(data['username']): return jsonify({"error": "User already exists"}), 409 - user = User(**data.dict()) + user = User(**data) UserRepo.insert(user) return jsonify({"message": "User registered successfully"}) diff --git a/src/dtos/reservation_dtos.py b/src/dtos/reservation_dtos.py index 870ce57..5b64440 100644 --- a/src/dtos/reservation_dtos.py +++ b/src/dtos/reservation_dtos.py @@ -1,17 +1,22 @@ from typing import Optional from pydantic import BaseModel -from datetime import datetime + +from dtos.time_dtos import TimeDTO class CreateReservationDTO(BaseModel): title: str description: Optional[str] = None room_id: str - start_date: datetime - finish_date: datetime + date: str + start_time: TimeDTO + finish_time: TimeDTO + color: int class UpdateReservationDTO(BaseModel): title: Optional[str] = None description: Optional[str] = None room_id: Optional[str] = None - start_date: Optional[datetime] = None - finish_date: Optional[datetime] = None \ No newline at end of file + date: Optional[str] = None + start_time: Optional[TimeDTO] = None + finish_time: Optional[TimeDTO] = None + color: Optional[int] = None \ No newline at end of file diff --git a/src/dtos/time_dtos.py b/src/dtos/time_dtos.py new file mode 100644 index 0000000..aa1cc96 --- /dev/null +++ b/src/dtos/time_dtos.py @@ -0,0 +1,5 @@ +from pydantic import BaseModel + +class TimeDTO(BaseModel): + hours: int + minutes: int \ No newline at end of file diff --git a/src/dtos/user_dtos.py b/src/dtos/user_dtos.py index 92ceb35..289e6f7 100644 --- a/src/dtos/user_dtos.py +++ b/src/dtos/user_dtos.py @@ -1,13 +1,14 @@ +from typing import Optional from pydantic import BaseModel, EmailStr class RegisterUserDTO(BaseModel): username: str password: str - email: EmailStr - first_name: str - last_name: str - department: str - position: str + email: Optional[EmailStr] = None + first_name: Optional[str] = None + last_name: Optional[str] = None + department: Optional[str] = None + position: Optional[str] = None is_admin: bool = False class LoginUserDTO(BaseModel): diff --git a/src/models/reservation_model.py b/src/models/reservation_model.py index 14aae56..3522464 100644 --- a/src/models/reservation_model.py +++ b/src/models/reservation_model.py @@ -1,8 +1,18 @@ +from models.time_model import Time + class Reservation: - def __init__(self, title, description, room_id, creator, start_date, finish_date): + def __init__(self, title, room_id, creator, date, start_time, finish_time, color, description=None): self.title = title self.description = description self.room_id = room_id self.creator = creator - self.start_date = start_date - self.finish_date = finish_date \ No newline at end of file + self.date = date + self.start_time = Time(**start_time) + self.finish_time = Time(**finish_time) + self.color = color + + def dict(self): + dict = self.__dict__.copy() + dict["start_time"] = self.start_time.dict() + dict["finish_time"] = self.finish_time.dict() + return dict \ No newline at end of file diff --git a/src/models/time_model.py b/src/models/time_model.py new file mode 100644 index 0000000..11cc0a5 --- /dev/null +++ b/src/models/time_model.py @@ -0,0 +1,7 @@ +class Time: + def __init__(self, hours, minutes): + self.hours = hours + self.minutes = minutes + + def dict(self): + return self.__dict__ \ No newline at end of file diff --git a/src/models/user_model.py b/src/models/user_model.py index cf7a8f6..0c77754 100644 --- a/src/models/user_model.py +++ b/src/models/user_model.py @@ -1,6 +1,9 @@ class User: - def __init__(self, username, email, first_name, last_name, department, position, is_admin=False): + def __init__(self, username, password, email=None, \ + first_name=None, last_name=None, department=None, \ + position=None, is_admin=False): self.username = username + self.password = password self.email = email self.first_name = first_name self.last_name = last_name diff --git a/src/repos/reservation_repo.py b/src/repos/reservation_repo.py index 197bd60..e7dfafb 100644 --- a/src/repos/reservation_repo.py +++ b/src/repos/reservation_repo.py @@ -1,3 +1,6 @@ +import json +from bson import ObjectId, json_util + from singletons.database_singleton import DatabaseSingleton class ReservationRepository: @@ -5,7 +8,7 @@ class ReservationRepository: @classmethod def insert(cls, reservation): - cls.db.reservation.insert_one(reservation.__dict__) + return str(cls.db.reservation.insert_one(reservation.dict()).inserted_id) @classmethod def delete(cls, reservation_id): @@ -24,17 +27,24 @@ class ReservationRepository: return None @classmethod - def get_by_id(cls): + def get_by_id(cls, reservation_id): return list(cls.db.reservation.find({"_id": ObjectId(reservation_id)})) @classmethod def list_all(cls, filters=None): query = {} if filters: - if "start_date" in filters: - query["start_date"] = {"$gte": filters["start_date"]} - if "end_date" in filters: - query["start_date"] = {"$lte": filters["end_date"]} + if "date" in filters: + query["date"] = {"$gte": filters["date"]} if "room_id" in filters: query["room_id"] = filters["room_id"] - return list(cls.db.reservation.find(query)) \ No newline at end of file + + results = cls.db.reservation.find(query) + + reservations = [] + for res in results: + res["id"] = str(res["_id"]) + del res["_id"] + reservations.append(res) + + return reservations \ No newline at end of file