Implemented database connection

This commit is contained in:
Sviatoslav Tsariov Yurievich 2025-02-17 00:36:41 +03:00
parent 0f605c4f42
commit 35661ebbf3
12 changed files with 104 additions and 35 deletions

View File

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

View File

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

View File

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

View File

@ -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('/<reservation_id>', 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)

View File

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

View File

@ -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
date: Optional[str] = None
start_time: Optional[TimeDTO] = None
finish_time: Optional[TimeDTO] = None
color: Optional[int] = None

5
src/dtos/time_dtos.py Normal file
View File

@ -0,0 +1,5 @@
from pydantic import BaseModel
class TimeDTO(BaseModel):
hours: int
minutes: int

View File

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

View File

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

7
src/models/time_model.py Normal file
View File

@ -0,0 +1,7 @@
class Time:
def __init__(self, hours, minutes):
self.hours = hours
self.minutes = minutes
def dict(self):
return self.__dict__

View File

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

View File

@ -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))
results = cls.db.reservation.find(query)
reservations = []
for res in results:
res["id"] = str(res["_id"])
del res["_id"]
reservations.append(res)
return reservations