diff --git a/Backend/alembic/__pycache__/env.cpython-312.pyc b/Backend/alembic/__pycache__/env.cpython-312.pyc deleted file mode 100644 index 47cf6f85..00000000 Binary files a/Backend/alembic/__pycache__/env.cpython-312.pyc and /dev/null differ diff --git a/Backend/alembic/env.py b/Backend/alembic/env.py index 2b66a5bd..de9d4ee7 100644 --- a/Backend/alembic/env.py +++ b/Backend/alembic/env.py @@ -8,8 +8,8 @@ from pathlib import Path from dotenv import load_dotenv load_dotenv() sys.path.insert(0, str(Path(__file__).resolve().parents[1])) -from src.config.database import Base -from src.config.settings import settings +from src.shared.config.database import Base +from src.shared.config.settings import settings from src.models import * config = context.config if config.config_file_name is not None: diff --git a/Backend/alembic/versions/__pycache__/08e2f866e131_add_mfa_fields_to_users.cpython-312.pyc b/Backend/alembic/versions/__pycache__/08e2f866e131_add_mfa_fields_to_users.cpython-312.pyc deleted file mode 100644 index 7f2fe532..00000000 Binary files a/Backend/alembic/versions/__pycache__/08e2f866e131_add_mfa_fields_to_users.cpython-312.pyc and /dev/null differ diff --git a/Backend/alembic/versions/__pycache__/0e2dc5df18c3_add_privacy_terms_refunds_to_page_type_.cpython-312.pyc b/Backend/alembic/versions/__pycache__/0e2dc5df18c3_add_privacy_terms_refunds_to_page_type_.cpython-312.pyc deleted file mode 100644 index 5a6478e1..00000000 Binary files a/Backend/alembic/versions/__pycache__/0e2dc5df18c3_add_privacy_terms_refunds_to_page_type_.cpython-312.pyc and /dev/null differ diff --git a/Backend/alembic/versions/__pycache__/1444eb61188e_add_section_title_fields_to_page_content.cpython-312.pyc b/Backend/alembic/versions/__pycache__/1444eb61188e_add_section_title_fields_to_page_content.cpython-312.pyc deleted file mode 100644 index 4bcfed31..00000000 Binary files a/Backend/alembic/versions/__pycache__/1444eb61188e_add_section_title_fields_to_page_content.cpython-312.pyc and /dev/null differ diff --git a/Backend/alembic/versions/__pycache__/163657e72e93_add_page_content_table.cpython-312.pyc b/Backend/alembic/versions/__pycache__/163657e72e93_add_page_content_table.cpython-312.pyc deleted file mode 100644 index fbc1ce4e..00000000 Binary files a/Backend/alembic/versions/__pycache__/163657e72e93_add_page_content_table.cpython-312.pyc and /dev/null differ diff --git a/Backend/alembic/versions/__pycache__/17efc6439cc3_add_luxury_section_fields_to_page_.cpython-312.pyc b/Backend/alembic/versions/__pycache__/17efc6439cc3_add_luxury_section_fields_to_page_.cpython-312.pyc deleted file mode 100644 index 947574ae..00000000 Binary files a/Backend/alembic/versions/__pycache__/17efc6439cc3_add_luxury_section_fields_to_page_.cpython-312.pyc and /dev/null differ diff --git a/Backend/alembic/versions/__pycache__/59baf2338f8a_initial_migration_create_all_tables_.cpython-312.pyc b/Backend/alembic/versions/__pycache__/59baf2338f8a_initial_migration_create_all_tables_.cpython-312.pyc deleted file mode 100644 index 3cdfb0fa..00000000 Binary files a/Backend/alembic/versions/__pycache__/59baf2338f8a_initial_migration_create_all_tables_.cpython-312.pyc and /dev/null differ diff --git a/Backend/alembic/versions/__pycache__/6a126cc5b23c_add_capacity_room_size_view_to_rooms.cpython-312.pyc b/Backend/alembic/versions/__pycache__/6a126cc5b23c_add_capacity_room_size_view_to_rooms.cpython-312.pyc deleted file mode 100644 index a1dd6121..00000000 Binary files a/Backend/alembic/versions/__pycache__/6a126cc5b23c_add_capacity_room_size_view_to_rooms.cpython-312.pyc and /dev/null differ diff --git a/Backend/alembic/versions/__pycache__/96c23dad405d_add_system_settings_table.cpython-312.pyc b/Backend/alembic/versions/__pycache__/96c23dad405d_add_system_settings_table.cpython-312.pyc deleted file mode 100644 index 578a5ab1..00000000 Binary files a/Backend/alembic/versions/__pycache__/96c23dad405d_add_system_settings_table.cpython-312.pyc and /dev/null differ diff --git a/Backend/alembic/versions/__pycache__/9bb08492a382_add_cancellation_accessibility_faq_to_.cpython-312.pyc b/Backend/alembic/versions/__pycache__/9bb08492a382_add_cancellation_accessibility_faq_to_.cpython-312.pyc deleted file mode 100644 index dec17c65..00000000 Binary files a/Backend/alembic/versions/__pycache__/9bb08492a382_add_cancellation_accessibility_faq_to_.cpython-312.pyc and /dev/null differ diff --git a/Backend/alembic/versions/__pycache__/add_about_page_fields.cpython-312.pyc b/Backend/alembic/versions/__pycache__/add_about_page_fields.cpython-312.pyc deleted file mode 100644 index 4ecd91c2..00000000 Binary files a/Backend/alembic/versions/__pycache__/add_about_page_fields.cpython-312.pyc and /dev/null differ diff --git a/Backend/alembic/versions/__pycache__/add_badges_to_page_content.cpython-312.pyc b/Backend/alembic/versions/__pycache__/add_badges_to_page_content.cpython-312.pyc deleted file mode 100644 index d45c92b5..00000000 Binary files a/Backend/alembic/versions/__pycache__/add_badges_to_page_content.cpython-312.pyc and /dev/null differ diff --git a/Backend/alembic/versions/__pycache__/add_blog_posts_table.cpython-312.pyc b/Backend/alembic/versions/__pycache__/add_blog_posts_table.cpython-312.pyc deleted file mode 100644 index 3122a342..00000000 Binary files a/Backend/alembic/versions/__pycache__/add_blog_posts_table.cpython-312.pyc and /dev/null differ diff --git a/Backend/alembic/versions/__pycache__/add_borica_payment_method.cpython-312.pyc b/Backend/alembic/versions/__pycache__/add_borica_payment_method.cpython-312.pyc deleted file mode 100644 index 43415a7a..00000000 Binary files a/Backend/alembic/versions/__pycache__/add_borica_payment_method.cpython-312.pyc and /dev/null differ diff --git a/Backend/alembic/versions/__pycache__/add_copyright_text_to_page_content.cpython-312.pyc b/Backend/alembic/versions/__pycache__/add_copyright_text_to_page_content.cpython-312.pyc deleted file mode 100644 index a792ba22..00000000 Binary files a/Backend/alembic/versions/__pycache__/add_copyright_text_to_page_content.cpython-312.pyc and /dev/null differ diff --git a/Backend/alembic/versions/__pycache__/add_group_booking_tables.cpython-312.pyc b/Backend/alembic/versions/__pycache__/add_group_booking_tables.cpython-312.pyc deleted file mode 100644 index 2403c8ae..00000000 Binary files a/Backend/alembic/versions/__pycache__/add_group_booking_tables.cpython-312.pyc and /dev/null differ diff --git a/Backend/alembic/versions/__pycache__/add_guest_profile_crm_tables.cpython-312.pyc b/Backend/alembic/versions/__pycache__/add_guest_profile_crm_tables.cpython-312.pyc deleted file mode 100644 index 4e3be4d6..00000000 Binary files a/Backend/alembic/versions/__pycache__/add_guest_profile_crm_tables.cpython-312.pyc and /dev/null differ diff --git a/Backend/alembic/versions/__pycache__/add_loyalty_system_tables.cpython-312.pyc b/Backend/alembic/versions/__pycache__/add_loyalty_system_tables.cpython-312.pyc deleted file mode 100644 index 2ed5f96f..00000000 Binary files a/Backend/alembic/versions/__pycache__/add_loyalty_system_tables.cpython-312.pyc and /dev/null differ diff --git a/Backend/alembic/versions/__pycache__/add_rate_plan_id_to_bookings.cpython-312.pyc b/Backend/alembic/versions/__pycache__/add_rate_plan_id_to_bookings.cpython-312.pyc deleted file mode 100644 index a773cbb9..00000000 Binary files a/Backend/alembic/versions/__pycache__/add_rate_plan_id_to_bookings.cpython-312.pyc and /dev/null differ diff --git a/Backend/alembic/versions/__pycache__/add_sections_to_blog_posts.cpython-312.pyc b/Backend/alembic/versions/__pycache__/add_sections_to_blog_posts.cpython-312.pyc deleted file mode 100644 index 24151713..00000000 Binary files a/Backend/alembic/versions/__pycache__/add_sections_to_blog_posts.cpython-312.pyc and /dev/null differ diff --git a/Backend/alembic/versions/__pycache__/add_stripe_payment_method.cpython-312.pyc b/Backend/alembic/versions/__pycache__/add_stripe_payment_method.cpython-312.pyc deleted file mode 100644 index 8682b2de..00000000 Binary files a/Backend/alembic/versions/__pycache__/add_stripe_payment_method.cpython-312.pyc and /dev/null differ diff --git a/Backend/alembic/versions/__pycache__/bd309b0742c1_add_promotion_fields_to_bookings.cpython-312.pyc b/Backend/alembic/versions/__pycache__/bd309b0742c1_add_promotion_fields_to_bookings.cpython-312.pyc deleted file mode 100644 index 58ca6030..00000000 Binary files a/Backend/alembic/versions/__pycache__/bd309b0742c1_add_promotion_fields_to_bookings.cpython-312.pyc and /dev/null differ diff --git a/Backend/alembic/versions/__pycache__/bfa74be4b256_add_luxury_content_fields_to_page_.cpython-312.pyc b/Backend/alembic/versions/__pycache__/bfa74be4b256_add_luxury_content_fields_to_page_.cpython-312.pyc deleted file mode 100644 index 97ac4934..00000000 Binary files a/Backend/alembic/versions/__pycache__/bfa74be4b256_add_luxury_content_fields_to_page_.cpython-312.pyc and /dev/null differ diff --git a/Backend/alembic/versions/__pycache__/cce764ef7a50_add_map_url_to_page_content.cpython-312.pyc b/Backend/alembic/versions/__pycache__/cce764ef7a50_add_map_url_to_page_content.cpython-312.pyc deleted file mode 100644 index e5e51b8b..00000000 Binary files a/Backend/alembic/versions/__pycache__/cce764ef7a50_add_map_url_to_page_content.cpython-312.pyc and /dev/null differ diff --git a/Backend/alembic/versions/__pycache__/d9aff6c5f0d4_add_paypal_payment_method.cpython-312.pyc b/Backend/alembic/versions/__pycache__/d9aff6c5f0d4_add_paypal_payment_method.cpython-312.pyc deleted file mode 100644 index 7b437edc..00000000 Binary files a/Backend/alembic/versions/__pycache__/d9aff6c5f0d4_add_paypal_payment_method.cpython-312.pyc and /dev/null differ diff --git a/Backend/alembic/versions/__pycache__/f1a2b3c4d5e6_add_is_proforma_to_invoices.cpython-312.pyc b/Backend/alembic/versions/__pycache__/f1a2b3c4d5e6_add_is_proforma_to_invoices.cpython-312.pyc deleted file mode 100644 index bf4b9775..00000000 Binary files a/Backend/alembic/versions/__pycache__/f1a2b3c4d5e6_add_is_proforma_to_invoices.cpython-312.pyc and /dev/null differ diff --git a/Backend/alembic/versions/__pycache__/ff515d77abbe_add_more_luxury_sections_to_page_content.cpython-312.pyc b/Backend/alembic/versions/__pycache__/ff515d77abbe_add_more_luxury_sections_to_page_content.cpython-312.pyc deleted file mode 100644 index e4d73342..00000000 Binary files a/Backend/alembic/versions/__pycache__/ff515d77abbe_add_more_luxury_sections_to_page_content.cpython-312.pyc and /dev/null differ diff --git a/Backend/alembic/versions/__pycache__/fff4b67466b3_add_account_lockout_fields_to_users.cpython-312.pyc b/Backend/alembic/versions/__pycache__/fff4b67466b3_add_account_lockout_fields_to_users.cpython-312.pyc deleted file mode 100644 index bcefd045..00000000 Binary files a/Backend/alembic/versions/__pycache__/fff4b67466b3_add_account_lockout_fields_to_users.cpython-312.pyc and /dev/null differ diff --git a/Backend/run.py b/Backend/run.py index 210c489d..c1cfdc5e 100644 --- a/Backend/run.py +++ b/Backend/run.py @@ -1,6 +1,6 @@ import uvicorn -from src.config.settings import settings -from src.config.logging_config import setup_logging, get_logger +from src.shared.config.settings import settings +from src.shared.config.logging_config import setup_logging, get_logger setup_logging() logger = get_logger(__name__) if __name__ == '__main__': diff --git a/Backend/run_tests.sh b/Backend/run_tests.sh deleted file mode 100755 index 29c1e8b4..00000000 --- a/Backend/run_tests.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -# Script to run integration tests for the Hotel Booking API - -echo "Running integration tests for Hotel Booking API..." -echo "==================================================" - -# Change to Backend directory -cd "$(dirname "$0")" - -# Run pytest with integration marker -pytest src/tests/ -v -m integration --tb=short - -# Exit with pytest's exit code -exit $? - diff --git a/Backend/seeds_data/add_accountant_role.py b/Backend/seeds_data/add_accountant_role.py index 3a0a0139..0fa82f70 100644 --- a/Backend/seeds_data/add_accountant_role.py +++ b/Backend/seeds_data/add_accountant_role.py @@ -11,7 +11,7 @@ from pathlib import Path backend_dir = Path(__file__).parent sys.path.insert(0, str(backend_dir)) -from src.config.database import SessionLocal +from src.shared.config.database import SessionLocal from src.models.role import Role def add_accountant_role(): diff --git a/Backend/seeds_data/fix_blog_dates.py b/Backend/seeds_data/fix_blog_dates.py index fecec662..b2f19ab8 100644 --- a/Backend/seeds_data/fix_blog_dates.py +++ b/Backend/seeds_data/fix_blog_dates.py @@ -6,7 +6,7 @@ from pathlib import Path sys.path.insert(0, str(Path(__file__).parent.parent)) from sqlalchemy.orm import Session -from src.config.database import SessionLocal +from src.shared.config.database import SessionLocal from src.models.blog import BlogPost from datetime import datetime, timedelta diff --git a/Backend/seeds_data/seed_about_page.py b/Backend/seeds_data/seed_about_page.py index ebb9c701..ee0b88f6 100644 --- a/Backend/seeds_data/seed_about_page.py +++ b/Backend/seeds_data/seed_about_page.py @@ -8,7 +8,7 @@ import json sys.path.insert(0, str(Path(__file__).parent)) from sqlalchemy.orm import Session -from src.config.database import SessionLocal +from src.shared.config.database import SessionLocal from src.models.page_content import PageContent, PageType from datetime import datetime diff --git a/Backend/seeds_data/seed_banners_company.py b/Backend/seeds_data/seed_banners_company.py index af7d5486..a603aff8 100644 --- a/Backend/seeds_data/seed_banners_company.py +++ b/Backend/seeds_data/seed_banners_company.py @@ -3,7 +3,7 @@ import os from datetime import datetime, timedelta sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'src')) from sqlalchemy.orm import Session -from src.config.database import SessionLocal +from src.shared.config.database import SessionLocal from src.models.banner import Banner from src.models.system_settings import SystemSettings from src.models.user import User diff --git a/Backend/seeds_data/seed_blog_posts.py b/Backend/seeds_data/seed_blog_posts.py index 55c689db..d836acc9 100644 --- a/Backend/seeds_data/seed_blog_posts.py +++ b/Backend/seeds_data/seed_blog_posts.py @@ -7,7 +7,7 @@ import os from pathlib import Path sys.path.insert(0, str(Path(__file__).parent.parent)) from sqlalchemy.orm import Session -from src.config.database import SessionLocal +from src.shared.config.database import SessionLocal from src.models.blog import BlogPost from src.models.user import User from src.models.role import Role diff --git a/Backend/seeds_data/seed_homepage_footer.py b/Backend/seeds_data/seed_homepage_footer.py index b74d1bf1..fb514a89 100644 --- a/Backend/seeds_data/seed_homepage_footer.py +++ b/Backend/seeds_data/seed_homepage_footer.py @@ -3,7 +3,7 @@ import os import json sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'src')) from sqlalchemy.orm import Session -from src.config.database import SessionLocal +from src.shared.config.database import SessionLocal from src.models.page_content import PageContent, PageType def seed_homepage_content(db: Session): diff --git a/Backend/seeds_data/seed_initial_data.py b/Backend/seeds_data/seed_initial_data.py index dd9f1ce3..7abf8c82 100644 --- a/Backend/seeds_data/seed_initial_data.py +++ b/Backend/seeds_data/seed_initial_data.py @@ -3,7 +3,7 @@ import os from pathlib import Path sys.path.insert(0, str(Path(__file__).parent)) from sqlalchemy.orm import Session -from src.config.database import SessionLocal +from src.shared.config.database import SessionLocal from src.models.role import Role from src.models.room_type import RoomType from src.models.user import User diff --git a/Backend/seeds_data/seed_loyalty_rewards.py b/Backend/seeds_data/seed_loyalty_rewards.py index f13ace32..f55e398f 100644 --- a/Backend/seeds_data/seed_loyalty_rewards.py +++ b/Backend/seeds_data/seed_loyalty_rewards.py @@ -3,7 +3,7 @@ import os from pathlib import Path sys.path.insert(0, str(Path(__file__).parent.parent)) from sqlalchemy.orm import Session -from src.config.database import SessionLocal +from src.shared.config.database import SessionLocal from src.models.loyalty_reward import LoyaltyReward, RewardType from src.models.loyalty_tier import LoyaltyTier, TierLevel from datetime import datetime, timedelta diff --git a/Backend/seeds_data/seed_luxury_content.py b/Backend/seeds_data/seed_luxury_content.py index 699698aa..a4c31127 100644 --- a/Backend/seeds_data/seed_luxury_content.py +++ b/Backend/seeds_data/seed_luxury_content.py @@ -3,7 +3,7 @@ import os import json sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'src')) from sqlalchemy.orm import Session -from src.config.database import SessionLocal, engine +from src.shared.config.database import SessionLocal, engine from src.models.page_content import PageContent from src.models.user import User diff --git a/Backend/seeds_data/seed_policy_pages.py b/Backend/seeds_data/seed_policy_pages.py index 0f6f4a93..6d262696 100755 --- a/Backend/seeds_data/seed_policy_pages.py +++ b/Backend/seeds_data/seed_policy_pages.py @@ -8,7 +8,7 @@ import json sys.path.insert(0, str(Path(__file__).parent)) from sqlalchemy.orm import Session -from src.config.database import SessionLocal +from src.shared.config.database import SessionLocal from src.models.page_content import PageContent, PageType from datetime import datetime diff --git a/Backend/seeds_data/seed_rooms.py b/Backend/seeds_data/seed_rooms.py index f2e1bf42..064f8816 100644 --- a/Backend/seeds_data/seed_rooms.py +++ b/Backend/seeds_data/seed_rooms.py @@ -3,7 +3,7 @@ import os from pathlib import Path sys.path.insert(0, str(Path(__file__).parent)) from sqlalchemy.orm import Session -from src.config.database import SessionLocal, engine +from src.shared.config.database import SessionLocal, engine from src.models.room import Room, RoomStatus from src.models.room_type import RoomType from datetime import datetime diff --git a/Backend/seeds_data/seed_users.py b/Backend/seeds_data/seed_users.py index b22e95b9..b013a919 100644 --- a/Backend/seeds_data/seed_users.py +++ b/Backend/seeds_data/seed_users.py @@ -3,7 +3,7 @@ import os from pathlib import Path sys.path.insert(0, str(Path(__file__).parent)) from sqlalchemy.orm import Session -from src.config.database import SessionLocal +from src.shared.config.database import SessionLocal from src.models.role import Role from src.models.user import User import bcrypt diff --git a/Backend/src/__pycache__/__init__.cpython-312.pyc b/Backend/src/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 2fb27bd0..00000000 Binary files a/Backend/src/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/__pycache__/main.cpython-312.pyc b/Backend/src/__pycache__/main.cpython-312.pyc deleted file mode 100644 index bf5f0fa9..00000000 Binary files a/Backend/src/__pycache__/main.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/ai/__init__.py b/Backend/src/ai/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/ai/models/__init__.py b/Backend/src/ai/models/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/ai/models/ai_conversation.py b/Backend/src/ai/models/ai_conversation.py new file mode 100644 index 00000000..02992d53 --- /dev/null +++ b/Backend/src/ai/models/ai_conversation.py @@ -0,0 +1,138 @@ +""" +AI Conversation History and Learning Models +Stores conversation history and learned patterns for self-training +""" + +from sqlalchemy import Column, Integer, String, Text, ForeignKey, DateTime, Boolean, Numeric, JSON, Index +from sqlalchemy.orm import relationship +from datetime import datetime +from ...shared.config.database import Base + + +class AIConversation(Base): + """Stores AI assistant conversation history""" + __tablename__ = 'ai_conversations' + + id = Column(Integer, primary_key=True, index=True, autoincrement=True) + user_id = Column(Integer, ForeignKey('users.id'), nullable=False, index=True) + session_id = Column(String(100), nullable=True, index=True) # For grouping related conversations + user_query = Column(Text, nullable=False) + ai_response = Column(Text, nullable=False) + intent = Column(String(100), nullable=True, index=True) + context_used = Column(JSON, nullable=True) # Store context data used + user_role = Column(String(50), nullable=True, index=True) + response_time_ms = Column(Integer, nullable=True) # Response time in milliseconds + is_helpful = Column(Boolean, nullable=True) # User feedback on helpfulness + created_at = Column(DateTime, default=datetime.utcnow, nullable=False, index=True) + + # Relationships + user = relationship('User', foreign_keys=[user_id]) + feedbacks = relationship('AIConversationFeedback', back_populates='conversation', cascade='all, delete-orphan') + learned_patterns = relationship('AILearnedPattern', back_populates='source_conversation') + + __table_args__ = ( + Index('idx_ai_conv_user_date', 'user_id', 'created_at'), + Index('idx_ai_conv_intent', 'intent'), + Index('idx_ai_conv_session', 'session_id'), + ) + + +class AIConversationFeedback(Base): + """User feedback on AI responses for learning""" + __tablename__ = 'ai_conversation_feedbacks' + + id = Column(Integer, primary_key=True, index=True, autoincrement=True) + conversation_id = Column(Integer, ForeignKey('ai_conversations.id'), nullable=False, index=True) + user_id = Column(Integer, ForeignKey('users.id'), nullable=False) + rating = Column(Integer, nullable=True) # 1-5 rating + is_helpful = Column(Boolean, nullable=True) + is_correct = Column(Boolean, nullable=True) + feedback_text = Column(Text, nullable=True) # User's text feedback + correction = Column(Text, nullable=True) # If user provides corrected answer + created_at = Column(DateTime, default=datetime.utcnow, nullable=False) + + # Relationships + conversation = relationship('AIConversation', back_populates='feedbacks') + user = relationship('User', foreign_keys=[user_id]) + + +class AILearnedPattern(Base): + """Learned patterns from conversations for pattern matching""" + __tablename__ = 'ai_learned_patterns' + + id = Column(Integer, primary_key=True, index=True, autoincrement=True) + pattern_keywords = Column(Text, nullable=False) # Keywords extracted from query + query_pattern = Column(Text, nullable=False) # Pattern template + intent = Column(String(100), nullable=False, index=True) + response_template = Column(Text, nullable=True) # Response template + context_keys = Column(JSON, nullable=True) # Which context keys to use + confidence_score = Column(Numeric(5, 2), nullable=False, default=0.0) # Confidence 0-100 + usage_count = Column(Integer, nullable=False, default=0) # How many times used + success_count = Column(Integer, nullable=False, default=0) # How many successful matches + source_conversation_id = Column(Integer, ForeignKey('ai_conversations.id'), nullable=True) + user_role = Column(String(50), nullable=True, index=True) # Role-specific patterns + is_active = Column(Boolean, nullable=False, default=True) + created_at = Column(DateTime, default=datetime.utcnow, nullable=False) + updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False) + last_used_at = Column(DateTime, nullable=True) + + # Relationships + source_conversation = relationship('AIConversation', back_populates='learned_patterns') + + __table_args__ = ( + Index('idx_ai_pattern_intent_role', 'intent', 'user_role'), + Index('idx_ai_pattern_active', 'is_active', 'confidence_score'), + ) + + +class AIKnowledgeEntry(Base): + """Dynamic knowledge base entries learned from interactions""" + __tablename__ = 'ai_knowledge_entries' + + id = Column(Integer, primary_key=True, index=True, autoincrement=True) + topic = Column(String(200), nullable=False, index=True) + question = Column(Text, nullable=False) # Common question format + answer = Column(Text, nullable=False) # Best answer + keywords = Column(JSON, nullable=True) # Keywords for matching + related_intent = Column(String(100), nullable=True, index=True) + source = Column(String(100), nullable=True) # 'user_feedback', 'admin_added', 'learned' + confidence = Column(Numeric(5, 2), nullable=False, default=50.0) # 0-100 + usage_count = Column(Integer, nullable=False, default=0) + success_count = Column(Integer, nullable=False, default=0) + user_role = Column(String(50), nullable=True, index=True) # Role-specific knowledge + is_verified = Column(Boolean, nullable=False, default=False) # Verified by admin + created_by_user_id = Column(Integer, ForeignKey('users.id'), nullable=True) + created_at = Column(DateTime, default=datetime.utcnow, nullable=False) + updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False) + last_used_at = Column(DateTime, nullable=True) + + # Relationships + created_by = relationship('User', foreign_keys=[created_by_user_id]) + + __table_args__ = ( + Index('idx_ai_knowledge_topic_role', 'topic', 'user_role'), + Index('idx_ai_knowledge_active', 'is_verified', 'confidence'), + ) + + +class AITrainingMetrics(Base): + """Metrics for tracking AI training and improvement""" + __tablename__ = 'ai_training_metrics' + + id = Column(Integer, primary_key=True, index=True, autoincrement=True) + metric_date = Column(DateTime, nullable=False, index=True) # Date of metrics + total_conversations = Column(Integer, nullable=False, default=0) + total_patterns_learned = Column(Integer, nullable=False, default=0) + total_knowledge_entries = Column(Integer, nullable=False, default=0) + average_response_time_ms = Column(Integer, nullable=True) + average_rating = Column(Numeric(3, 2), nullable=True) # Average user rating + helpful_rate = Column(Numeric(5, 2), nullable=True) # Percentage of helpful responses + correct_rate = Column(Numeric(5, 2), nullable=True) # Percentage of correct responses + pattern_match_success_rate = Column(Numeric(5, 2), nullable=True) + knowledge_usage_rate = Column(Numeric(5, 2), nullable=True) + created_at = Column(DateTime, default=datetime.utcnow, nullable=False) + + __table_args__ = ( + Index('idx_ai_metrics_date', 'metric_date'), + ) + diff --git a/Backend/src/models/chat.py b/Backend/src/ai/models/chat.py similarity index 97% rename from Backend/src/models/chat.py rename to Backend/src/ai/models/chat.py index 3562f01d..7bf5ad7f 100644 --- a/Backend/src/models/chat.py +++ b/Backend/src/ai/models/chat.py @@ -2,7 +2,7 @@ from sqlalchemy import Column, Integer, String, Text, ForeignKey, DateTime, Enum from sqlalchemy.orm import relationship from datetime import datetime import enum -from ..config.database import Base +from ...shared.config.database import Base class ChatStatus(str, enum.Enum): pending = 'pending' diff --git a/Backend/src/ai/routes/__init__.py b/Backend/src/ai/routes/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/ai/routes/ai_assistant_routes.py b/Backend/src/ai/routes/ai_assistant_routes.py new file mode 100644 index 00000000..9f768e44 --- /dev/null +++ b/Backend/src/ai/routes/ai_assistant_routes.py @@ -0,0 +1,295 @@ +""" +AI Assistant API Routes +""" + +from fastapi import APIRouter, Depends, HTTPException, status +from sqlalchemy.orm import Session +from typing import Optional +from pydantic import BaseModel + +from ...shared.config.database import get_db +from ...security.middleware.auth import get_current_user +from ...auth.models.user import User +from ...auth.models.role import Role +from ..services.ai_chat_service import AIChatService +from ..services.ai_assistant_service import AIAssistantService +from ..services.ai_learning_service import AILearningService +from ..services.ai_training_scheduler import get_training_scheduler +from ...shared.config.logging_config import get_logger + +logger = get_logger(__name__) + +router = APIRouter(prefix="/ai-assistant", tags=["AI Assistant"]) + + +class ChatMessageRequest(BaseModel): + message: str + context: Optional[dict] = None + + +class ChatMessageResponse(BaseModel): + response: str + intent: str + data_used: dict + timestamp: str + + +@router.post("/chat") +async def chat_with_ai( + request: ChatMessageRequest, + current_user: User = Depends(get_current_user), + db: Session = Depends(get_db) +): + """ + Chat with AI assistant + Accessible to all authenticated users (admin, staff, accountant, customer) + Responses are filtered based on user role + """ + try: + # Load user role + user_role = db.query(Role).filter(Role.id == current_user.role_id).first() + if not user_role: + raise HTTPException( + status_code=status.HTTP_403_FORBIDDEN, + detail="User role not found" + ) + + # Initialize AI chat service with current user for role-based responses + ai_service = AIChatService(db, current_user) + + # Generate response with role awareness + result = ai_service.generate_response( + user_query=request.message, + context=request.context + ) + + return { + "status": "success", + "data": { + "response": result["response"], + "intent": result.get("intent", "unknown"), + "data_used": result.get("data_used", {}), + "timestamp": result.get("timestamp", ""), + "user_role": user_role.name + } + } + + except HTTPException: + raise + except Exception as e: + logger.error(f"Error in AI chat: {str(e)}", exc_info=True) + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail=f"Error processing AI request: {str(e)}" + ) + + +@router.get("/status") +async def get_ai_status( + current_user: User = Depends(get_current_user), + db: Session = Depends(get_db) +): + """ + Get comprehensive system status for AI assistant + Status is filtered based on user role + """ + try: + # Load user role + user_role = db.query(Role).filter(Role.id == current_user.role_id).first() + if not user_role: + raise HTTPException( + status_code=status.HTTP_403_FORBIDDEN, + detail="User role not found" + ) + + # Initialize AI assistant with current user for role-based context + ai_assistant = AIAssistantService(db, current_user) + context = ai_assistant.generate_context_for_ai() + + return { + "status": "success", + "data": context + } + + except HTTPException: + raise + except Exception as e: + logger.error(f"Error getting AI status: {str(e)}", exc_info=True) + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail=str(e) + ) + + +@router.get("/rooms/occupied") +async def get_occupied_rooms( + room_number: Optional[str] = None, + current_user: User = Depends(get_current_user), + db: Session = Depends(get_db) +): + """Get list of occupied rooms - Admin and Staff only""" + try: + user_role = db.query(Role).filter(Role.id == current_user.role_id).first() + if not user_role or user_role.name not in ['staff', 'admin']: + raise HTTPException(status_code=403, detail="Only staff and admin can access this information") + + ai_assistant = AIAssistantService(db, current_user) + rooms = ai_assistant.search_occupied_rooms(room_number) + + return {"status": "success", "data": {"rooms": rooms}} + except HTTPException: + raise + except Exception as e: + logger.error(f"Error getting occupied rooms: {str(e)}", exc_info=True) + raise HTTPException(status_code=500, detail=str(e)) + + +@router.get("/rooms/problems") +async def get_room_problems( + current_user: User = Depends(get_current_user), + db: Session = Depends(get_db) +): + """Get rooms with problems - Admin and Staff only""" + try: + user_role = db.query(Role).filter(Role.id == current_user.role_id).first() + if not user_role or user_role.name not in ['staff', 'admin']: + raise HTTPException(status_code=403, detail="Only staff and admin can access this information") + + ai_assistant = AIAssistantService(db, current_user) + problems = ai_assistant.get_room_problems() + + return {"status": "success", "data": {"problems": problems}} + except HTTPException: + raise + except Exception as e: + logger.error(f"Error getting room problems: {str(e)}", exc_info=True) + raise HTTPException(status_code=500, detail=str(e)) + + +@router.get("/chats/unanswered") +async def get_unanswered_chats( + hours: int = 24, + current_user: User = Depends(get_current_user), + db: Session = Depends(get_db) +): + """Get unanswered chat messages - Admin and Staff only""" + try: + user_role = db.query(Role).filter(Role.id == current_user.role_id).first() + if not user_role or user_role.name not in ['staff', 'admin']: + raise HTTPException(status_code=403, detail="Only staff and admin can access this information") + + ai_assistant = AIAssistantService(db, current_user) + chats = ai_assistant.get_unanswered_chats(hours) + + return {"status": "success", "data": {"chats": chats}} + except HTTPException: + raise + except Exception as e: + logger.error(f"Error getting unanswered chats: {str(e)}", exc_info=True) + raise HTTPException(status_code=500, detail=str(e)) + + +@router.post("/training/trigger") +async def trigger_manual_training( + current_user: User = Depends(get_current_user), + db: Session = Depends(get_db) +): + """Manually trigger AI training - Admin only""" + try: + user_role = db.query(Role).filter(Role.id == current_user.role_id).first() + if not user_role or user_role.name != 'admin': + raise HTTPException(status_code=403, detail="Only admin can trigger manual training") + + learning_service = AILearningService(db) + result = learning_service.auto_train_from_all_conversations() + + return { + "status": "success", + "message": "Training completed", + "data": result + } + except HTTPException: + raise + except Exception as e: + logger.error(f"Error triggering training: {str(e)}", exc_info=True) + raise HTTPException(status_code=500, detail=str(e)) + + +@router.post("/training/analyze") +async def trigger_manual_analysis( + current_user: User = Depends(get_current_user), + db: Session = Depends(get_db) +): + """Manually trigger AI analysis and improvement - Admin only""" + try: + user_role = db.query(Role).filter(Role.id == current_user.role_id).first() + if not user_role or user_role.name != 'admin': + raise HTTPException(status_code=403, detail="Only admin can trigger manual analysis") + + learning_service = AILearningService(db) + result = learning_service.auto_analyze_and_improve() + + return { + "status": "success", + "message": "Analysis completed", + "data": result + } + except HTTPException: + raise + except Exception as e: + logger.error(f"Error triggering analysis: {str(e)}", exc_info=True) + raise HTTPException(status_code=500, detail=str(e)) + + +@router.get("/training/status") +async def get_training_status( + current_user: User = Depends(get_current_user), + db: Session = Depends(get_db) +): + """Get AI training status and metrics - Admin only""" + try: + user_role = db.query(Role).filter(Role.id == current_user.role_id).first() + if not user_role or user_role.name != 'admin': + raise HTTPException(status_code=403, detail="Only admin can view training status") + + from ..models.ai_conversation import AIConversation, AILearnedPattern, AIKnowledgeEntry, AITrainingMetrics + from sqlalchemy import func + from datetime import datetime, timedelta + + # Get statistics + total_conversations = db.query(AIConversation).count() + total_patterns = db.query(AILearnedPattern).filter(AILearnedPattern.is_active == True).count() + total_knowledge = db.query(AIKnowledgeEntry).count() + + # Get recent metrics + recent_metrics = db.query(AITrainingMetrics).order_by( + AITrainingMetrics.metric_date.desc() + ).limit(1).first() + + # Get scheduler status + scheduler = get_training_scheduler() + + return { + "status": "success", + "data": { + "scheduler_running": scheduler.running, + "last_training": scheduler.last_training_time.isoformat() if scheduler.last_training_time else None, + "last_analysis": scheduler.last_analysis_time.isoformat() if scheduler.last_analysis_time else None, + "statistics": { + "total_conversations": total_conversations, + "total_patterns": total_patterns, + "total_knowledge_entries": total_knowledge, + }, + "recent_metrics": { + "average_rating": float(recent_metrics.average_rating) if recent_metrics and recent_metrics.average_rating else None, + "helpful_rate": float(recent_metrics.helpful_rate) if recent_metrics and recent_metrics.helpful_rate else None, + "average_response_time_ms": recent_metrics.average_response_time_ms if recent_metrics else None, + } if recent_metrics else None + } + } + except HTTPException: + raise + except Exception as e: + logger.error(f"Error getting training status: {str(e)}", exc_info=True) + raise HTTPException(status_code=500, detail=str(e)) + diff --git a/Backend/src/ai/schemas/__init__.py b/Backend/src/ai/schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/ai/services/__init__.py b/Backend/src/ai/services/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/ai/services/ai_assistant_service.py b/Backend/src/ai/services/ai_assistant_service.py new file mode 100644 index 00000000..24ed179b --- /dev/null +++ b/Backend/src/ai/services/ai_assistant_service.py @@ -0,0 +1,434 @@ +""" +Enterprise AI Assistant Service +Monitors rooms, bookings, invoices, payments, and chat messages +Provides intelligent responses to queries about hotel operations +""" + +from typing import Dict, List, Optional, Any +from datetime import datetime, timedelta +from sqlalchemy.orm import Session, joinedload +from sqlalchemy import and_, or_, func +import json +import logging + +from ...rooms.models.room import Room, RoomStatus +from ...bookings.models.booking import Booking, BookingStatus +from ...payments.models.invoice import Invoice +from ...payments.models.payment import Payment, PaymentStatus +from ..models.chat import Chat, ChatMessage, ChatStatus +from ...auth.models.user import User +from ...shared.config.logging_config import get_logger +from .ai_knowledge_base import AIKnowledgeBase +from .ai_role_access_service import AIRoleAccessService + +logger = get_logger(__name__) + + +class AIAssistantService: + """Enterprise AI Assistant for Hotel Management""" + + def __init__(self, db: Session, current_user: Optional[User] = None): + self.db = db + self.current_user = current_user + self.role_access_service = AIRoleAccessService(db, current_user) if current_user else None + + def get_room_status_summary(self) -> Dict[str, Any]: + """Get comprehensive room status summary""" + try: + total_rooms = self.db.query(Room).count() + available_rooms = self.db.query(Room).filter(Room.status == RoomStatus.available).count() + occupied_rooms = self.db.query(Room).filter(Room.status == RoomStatus.occupied).count() + maintenance_rooms = self.db.query(Room).filter(Room.status == RoomStatus.maintenance).count() + cleaning_rooms = self.db.query(Room).filter(Room.status == RoomStatus.cleaning).count() + + # Get rooms with bookings today + today = datetime.utcnow().date() + rooms_with_bookings = self.db.query(Booking).filter( + and_( + Booking.status != BookingStatus.cancelled, + Booking.check_in_date <= today, + Booking.check_out_date > today + ) + ).count() + + return { + "total_rooms": total_rooms, + "available": available_rooms, + "occupied": occupied_rooms, + "maintenance": maintenance_rooms, + "cleaning": cleaning_rooms, + "rooms_with_active_bookings": rooms_with_bookings, + "occupancy_rate": round((occupied_rooms / total_rooms * 100) if total_rooms > 0 else 0, 2) + } + except Exception as e: + logger.error(f"Error getting room status: {str(e)}", exc_info=True) + return {} + + def get_booking_summary(self, days: int = 7) -> Dict[str, Any]: + """Get booking summary for specified days""" + try: + today = datetime.utcnow().date() + end_date = today + timedelta(days=days) + + # Upcoming check-ins + upcoming_checkins = self.db.query(Booking).filter( + and_( + Booking.status == BookingStatus.confirmed, + Booking.check_in_date >= today, + Booking.check_in_date <= end_date + ) + ).count() + + # Upcoming check-outs + upcoming_checkouts = self.db.query(Booking).filter( + and_( + Booking.status == BookingStatus.confirmed, + Booking.check_out_date >= today, + Booking.check_out_date <= end_date + ) + ).count() + + # Active bookings + active_bookings = self.db.query(Booking).filter( + and_( + Booking.status == BookingStatus.confirmed, + Booking.check_in_date <= today, + Booking.check_out_date > today + ) + ).count() + + # Pending bookings + pending_bookings = self.db.query(Booking).filter( + Booking.status == BookingStatus.pending + ).count() + + return { + "upcoming_checkins": upcoming_checkins, + "upcoming_checkouts": upcoming_checkouts, + "active_bookings": active_bookings, + "pending_bookings": pending_bookings, + "period_days": days + } + except Exception as e: + logger.error(f"Error getting booking summary: {str(e)}", exc_info=True) + return {} + + def get_payment_summary(self, days: int = 30) -> Dict[str, Any]: + """Get payment summary""" + try: + today = datetime.utcnow().date() + start_date = today - timedelta(days=days) + + # Total payments in period + total_payments = self.db.query(func.sum(Payment.amount)).filter( + and_( + Payment.payment_status == PaymentStatus.completed, + func.date(Payment.payment_date) >= start_date, + func.date(Payment.payment_date) <= today + ) + ).scalar() or 0 + + # Pending payments + pending_payments = self.db.query(func.sum(Payment.amount)).filter( + Payment.payment_status == PaymentStatus.pending + ).scalar() or 0 + + # Payment count + completed_count = self.db.query(Payment).filter( + and_( + Payment.payment_status == PaymentStatus.completed, + func.date(Payment.payment_date) >= start_date + ) + ).count() + + return { + "total_revenue": float(total_payments), + "pending_amount": float(pending_payments), + "completed_payments": completed_count, + "period_days": days + } + except Exception as e: + logger.error(f"Error getting payment summary: {str(e)}", exc_info=True) + return {} + + def get_invoice_summary(self) -> Dict[str, Any]: + """Get invoice summary""" + try: + total_invoices = self.db.query(Invoice).count() + + # Group by status + status_counts = {} + invoices = self.db.query(Invoice).all() + for invoice in invoices: + status = invoice.status if hasattr(invoice, 'status') else 'unknown' + status_counts[status] = status_counts.get(status, 0) + 1 + + # Overdue invoices + today = datetime.utcnow().date() + overdue_count = self.db.query(Invoice).filter( + and_( + Invoice.due_date < today, + Invoice.status != 'paid' + ) + ).count() if hasattr(Invoice, 'due_date') else 0 + + return { + "total_invoices": total_invoices, + "status_breakdown": status_counts, + "overdue_invoices": overdue_count + } + except Exception as e: + logger.error(f"Error getting invoice summary: {str(e)}", exc_info=True) + return {} + + def get_unanswered_chats(self, hours: int = 24) -> List[Dict[str, Any]]: + """Get unanswered chat messages from after working hours""" + try: + cutoff_time = datetime.utcnow() - timedelta(hours=hours) + + # Get open chats with unread messages + chats = self.db.query(Chat).filter( + and_( + Chat.status == ChatStatus.open, + Chat.updated_at >= cutoff_time + ) + ).all() + + unanswered = [] + for chat in chats: + # Get last message + last_message = self.db.query(ChatMessage).filter( + ChatMessage.chat_id == chat.id + ).order_by(ChatMessage.created_at.desc()).first() + + if last_message and last_message.sender_type == 'visitor' and not last_message.is_read: + unanswered.append({ + "chat_id": chat.id, + "visitor_name": chat.visitor_name, + "visitor_email": chat.visitor_email, + "last_message": last_message.message[:100], + "last_message_time": last_message.created_at.isoformat(), + "waiting_hours": (datetime.utcnow() - last_message.created_at).total_seconds() / 3600 + }) + + return unanswered + except Exception as e: + logger.error(f"Error getting unanswered chats: {str(e)}", exc_info=True) + return [] + + def search_occupied_rooms(self, room_number: Optional[str] = None) -> List[Dict[str, Any]]: + """Search for occupied rooms""" + try: + today = datetime.utcnow().date() + + # Get rooms with active bookings + query = self.db.query(Room).options( + joinedload(Room.room_type) + ).join(Booking).filter( + and_( + Room.status == RoomStatus.occupied, + Booking.status == BookingStatus.confirmed, + Booking.check_in_date <= today, + Booking.check_out_date > today + ) + ) + + if room_number: + query = query.filter(Room.room_number.ilike(f"%{room_number}%")) + + rooms = query.all() + + result = [] + for room in rooms: + # Get the active booking for this room + booking = self.db.query(Booking).options( + joinedload(Booking.user) + ).filter( + and_( + Booking.room_id == room.id, + Booking.status == BookingStatus.confirmed, + Booking.check_in_date <= today, + Booking.check_out_date > today + ) + ).first() + + result.append({ + "room_number": room.room_number, + "room_type": room.room_type.name if room.room_type else "Unknown", + "floor": room.floor, + "booking_id": booking.id if booking else None, + "guest_name": booking.user.full_name if booking and booking.user else "Unknown", + "check_in": booking.check_in_date.isoformat() if booking else None, + "check_out": booking.check_out_date.isoformat() if booking else None + }) + + return result + except Exception as e: + logger.error(f"Error searching occupied rooms: {str(e)}", exc_info=True) + return [] + + def get_room_problems(self) -> List[Dict[str, Any]]: + """Get rooms with problems (maintenance, issues)""" + try: + # Rooms in maintenance + maintenance_rooms = self.db.query(Room).filter( + Room.status == RoomStatus.maintenance + ).all() + + problems = [] + for room in maintenance_rooms: + problems.append({ + "room_number": room.room_number, + "issue_type": "maintenance", + "status": room.status.value, + "description": f"Room {room.room_number} is under maintenance" + }) + + # Check for maintenance records + try: + from ...rooms.models.room_maintenance import RoomMaintenance, MaintenanceStatus + active_maintenance = self.db.query(RoomMaintenance).filter( + MaintenanceStatus.in_progress == MaintenanceStatus.in_progress + ).all() + + for maint in active_maintenance: + room = self.db.query(Room).filter(Room.id == maint.room_id).first() + if room: + problems.append({ + "room_number": room.room_number, + "issue_type": "maintenance", + "status": maint.status.value if hasattr(maint.status, 'value') else str(maint.status), + "description": maint.description or f"Maintenance issue in room {room.room_number}", + "scheduled_start": maint.scheduled_start.isoformat() if maint.scheduled_start else None + }) + except ImportError: + pass # Maintenance model might not exist + + return problems + except Exception as e: + logger.error(f"Error getting room problems: {str(e)}", exc_info=True) + return [] + + def get_booking_by_number(self, booking_number: str) -> Optional[Dict[str, Any]]: + """Get booking details by booking number""" + try: + booking = self.db.query(Booking).filter( + Booking.booking_number == booking_number + ).first() + + if not booking: + return None + + return { + "booking_number": booking.booking_number, + "status": booking.status.value if hasattr(booking.status, 'value') else str(booking.status), + "guest_name": booking.user.full_name if booking.user else "Unknown", + "room_number": booking.room.room_number if booking.room else "Unknown", + "check_in": booking.check_in_date.isoformat(), + "check_out": booking.check_out_date.isoformat(), + "total_price": float(booking.total_price) if booking.total_price else 0, + "payment_status": self._get_booking_payment_status(booking.id) + } + except Exception as e: + logger.error(f"Error getting booking: {str(e)}", exc_info=True) + return None + + def get_invoice_by_number(self, invoice_number: str) -> Optional[Dict[str, Any]]: + """Get invoice details by invoice number""" + try: + invoice = self.db.query(Invoice).filter( + Invoice.invoice_number == invoice_number + ).first() + + if not invoice: + return None + + return { + "invoice_number": invoice.invoice_number, + "status": invoice.status if hasattr(invoice, 'status') else "unknown", + "amount": float(invoice.total_amount) if hasattr(invoice, 'total_amount') else 0, + "due_date": invoice.due_date.isoformat() if hasattr(invoice, 'due_date') and invoice.due_date else None, + "booking_number": invoice.booking.booking_number if invoice.booking else None, + "created_at": invoice.created_at.isoformat() if hasattr(invoice, 'created_at') else None + } + except Exception as e: + logger.error(f"Error getting invoice: {str(e)}", exc_info=True) + return None + + def _get_booking_payment_status(self, booking_id: int) -> str: + """Get payment status for a booking""" + try: + payments = self.db.query(Payment).filter( + Payment.booking_id == booking_id + ).all() + + if not payments: + return "unpaid" + + completed = [p for p in payments if p.payment_status == PaymentStatus.completed] + if completed: + total_paid = sum(float(p.amount) for p in completed) + booking = self.db.query(Booking).filter(Booking.id == booking_id).first() + if booking and booking.total_price: + if total_paid >= float(booking.total_price): + return "paid" + else: + return "partially_paid" + + return "pending" + except Exception as e: + logger.error(f"Error getting payment status: {str(e)}", exc_info=True) + return "unknown" + + def generate_context_for_ai(self) -> Dict[str, Any]: + """Generate comprehensive context for AI assistant with role-based filtering""" + context = { + "timestamp": datetime.utcnow().isoformat(), + } + + # Use role-based access service if user is provided + if self.role_access_service: + role_name = self.role_access_service.role_name + context["user_role"] = role_name + context["role_capabilities"] = AIKnowledgeBase.get_role_info(role_name) + + # Get role-appropriate data + context["room_status"] = self.role_access_service.get_room_status_summary() + + # Get user-specific bookings + context["user_bookings"] = self.role_access_service.get_user_bookings(limit=5) + + # Financial data only for authorized roles + if self.role_access_service.can_access_feature("payment_summary"): + payment_summary = self.role_access_service.get_payment_summary() + if payment_summary: + context["payment_summary"] = payment_summary + + invoice_summary = self.role_access_service.get_invoice_summary() + if invoice_summary: + context["invoice_summary"] = invoice_summary + + # Operational data for staff and admin + if role_name in ["admin", "staff"]: + context["booking_summary"] = self.get_booking_summary() + context["unanswered_chats"] = self.get_unanswered_chats() + context["room_problems"] = self.get_room_problems() + + # Add knowledge base information + context["application_knowledge"] = { + "features": list(AIKnowledgeBase.FEATURES.keys()), + "role_info": AIKnowledgeBase.get_role_info(role_name) + } + else: + # Default context without user (shouldn't happen in production) + context.update({ + "room_status": self.get_room_status_summary(), + "booking_summary": self.get_booking_summary(), + "payment_summary": self.get_payment_summary(), + "invoice_summary": self.get_invoice_summary(), + "unanswered_chats": self.get_unanswered_chats(), + "room_problems": self.get_room_problems(), + }) + + return context + diff --git a/Backend/src/ai/services/ai_chat_service.py b/Backend/src/ai/services/ai_chat_service.py new file mode 100644 index 00000000..501d963f --- /dev/null +++ b/Backend/src/ai/services/ai_chat_service.py @@ -0,0 +1,975 @@ +""" +AI Chat Service - Handles AI-powered chat responses +Integrates with OpenAI, Anthropic, or other LLM providers +""" + +from typing import Dict, List, Optional, Any +from datetime import datetime +import json +import logging +import os + +from ..services.ai_assistant_service import AIAssistantService +from ..services.ai_knowledge_base import AIKnowledgeBase +from ..services.ai_role_access_service import AIRoleAccessService +from ..services.ai_learning_service import AILearningService +from ...auth.models.user import User +from ..models.ai_conversation import AILearnedPattern +from ...shared.config.logging_config import get_logger + +logger = get_logger(__name__) + + +class AIChatService: + """AI Chat Service for generating intelligent responses""" + + def __init__(self, db_session, current_user: Optional[User] = None): + self.db = db_session + self.current_user = current_user + self.ai_assistant = AIAssistantService(db_session, current_user) + self.knowledge_base = AIKnowledgeBase() + self.role_access_service = AIRoleAccessService(db_session, current_user) if current_user else None + self.learning_service = AILearningService(db_session) + # Configure AI provider (OpenAI, Anthropic, etc.) + self.provider = os.getenv("AI_PROVIDER", "openai") + self.api_key = os.getenv("AI_API_KEY", "") + self.model = os.getenv("AI_MODEL", "gpt-4") + + def generate_response(self, user_query: str, context: Optional[Dict] = None, session_id: Optional[str] = None) -> Dict[str, Any]: + """ + Generate AI response based on user query with self-learning + """ + start_time = datetime.utcnow() + + try: + # Check learned patterns first + role_name = self.role_access_service.role_name if self.role_access_service else None + learned_pattern = self.learning_service.get_learned_pattern(user_query, role_name) + knowledge_entry = self.learning_service.get_knowledge_entry(user_query, role_name) + + # Check for similar past queries + similar_queries = self.learning_service.find_similar_queries(user_query, limit=3) + + # Get current system context + system_context = self.ai_assistant.generate_context_for_ai() + + # Merge with provided context + if context: + system_context.update(context) + + # Add learned knowledge to context + if learned_pattern: + system_context["learned_pattern"] = { + "pattern": learned_pattern.query_pattern, + "intent": learned_pattern.intent, + "confidence": float(learned_pattern.confidence_score) + } + + if knowledge_entry: + system_context["knowledge_entry"] = knowledge_entry + + if similar_queries: + system_context["similar_past_queries"] = similar_queries + + # Analyze query intent (or use learned intent) + intent = learned_pattern.intent if learned_pattern else self._analyze_intent(user_query) + + # Get relevant data based on intent + relevant_data = self._get_relevant_data(intent, user_query) + + # Status-related intents should always use rule-based formatted responses + # These provide consistent, well-formatted output with emojis and structure + status_intents = [ + "general_status", "room_status", "room_occupied", "room_available", + "room_problems", "booking_status", "payment_status", "invoice_status", + "chat_status", "app_info" + ] + + response = None + + # For status queries, prioritize rule-based formatted responses + if intent in status_intents: + # Always use rule-based response for status queries to ensure proper formatting + if self.api_key and self.provider == "openai": + # Even with LLM, prefer rule-based for status to maintain format consistency + response = self._generate_rule_based_response(intent, user_query, relevant_data) + else: + response = self._generate_rule_based_response(intent, user_query, relevant_data) + logger.info(f"Using rule-based formatted response for status intent: {intent}") + else: + # For non-status queries, use learned patterns/knowledge if available + if learned_pattern and learned_pattern.confidence_score >= 70.0 and learned_pattern.response_template: + # Try to use learned pattern response + try: + response = self._apply_learned_pattern(learned_pattern, relevant_data, user_query) + if response: + logger.info(f"Using learned pattern {learned_pattern.id} for query") + except Exception as e: + logger.warning(f"Failed to apply learned pattern: {str(e)}") + + # Use knowledge entry if available + if not response and knowledge_entry and knowledge_entry.get("confidence", 0) >= 70.0: + response = knowledge_entry.get("answer") + logger.info(f"Using knowledge entry for query") + + # Generate response using LLM or rule-based system if no learned response + if not response: + if self.api_key and self.provider == "openai": + response = self._generate_llm_response(user_query, system_context, relevant_data) + else: + # Fallback to rule-based responses + response = self._generate_rule_based_response(intent, user_query, relevant_data) + + # Calculate response time + response_time = int((datetime.utcnow() - start_time).total_seconds() * 1000) + + # Save conversation for learning (async, don't block response) + if self.current_user: + try: + self.learning_service.save_conversation( + user_id=self.current_user.id, + user_query=user_query, + ai_response=response, + intent=intent, + context_used=relevant_data, + user_role=role_name, + session_id=session_id, + response_time_ms=response_time + ) + except Exception as e: + logger.warning(f"Failed to save conversation for learning: {str(e)}") + + return { + "response": response, + "intent": intent, + "data_used": relevant_data, + "timestamp": datetime.utcnow().isoformat(), + "used_learned_pattern": learned_pattern.id if learned_pattern else None, + "used_knowledge_entry": knowledge_entry.get("topic") if knowledge_entry else None + } + except Exception as e: + logger.error(f"Error generating AI response: {str(e)}", exc_info=True) + return { + "response": "I apologize, but I'm having trouble processing your request right now. Please try again later.", + "error": str(e) + } + + def _analyze_intent(self, query: str) -> str: + """Analyze user query intent with comprehensive pattern matching""" + query_lower = query.lower() + + # Room-related queries - expanded patterns + room_keywords = ['room', 'rooms', 'occupied', 'available', 'free', 'vacant', 'vacancy', + 'occupancy', 'suite', 'suites', 'accommodation'] + if any(word in query_lower for word in room_keywords): + if any(word in query_lower for word in ['occupied', 'booked', 'taken', 'in use', 'guest']): + return "room_occupied" + elif any(word in query_lower for word in ['available', 'free', 'vacant', 'empty', 'ready']): + return "room_available" + elif any(word in query_lower for word in ['problem', 'issue', 'maintenance', 'broken', 'repair', 'fix']): + return "room_problems" + elif any(word in query_lower for word in ['how many', 'total', 'count', 'number of', 'how much', 'quantity']): + return "room_status" + elif any(word in query_lower for word in ['status', 'state', 'condition', 'overview']): + return "room_status" + return "room_status" + + # Booking-related queries - expanded patterns + booking_keywords = ['booking', 'bookings', 'reservation', 'reservations', 'check-in', 'check-out', + 'checkin', 'checkout', 'arrival', 'departure', 'guest', 'guests'] + if any(word in query_lower for word in booking_keywords): + if any(word in query_lower for word in ['number', 'id', 'code', 'reference']): + return "booking_by_number" + elif any(word in query_lower for word in ['upcoming', 'coming', 'next', 'future', 'scheduled']): + return "booking_status" + elif any(word in query_lower for word in ['active', 'current', 'today', 'now']): + return "booking_status" + return "booking_status" + + # Invoice-related queries - expanded patterns + invoice_keywords = ['invoice', 'invoices', 'bill', 'bills', 'receipt', 'receipts', 'statement', 'statements'] + if any(word in query_lower for word in invoice_keywords): + if any(word in query_lower for word in ['number', 'id', 'code', 'reference']): + return "invoice_by_number" + elif any(word in query_lower for word in ['overdue', 'unpaid', 'pending', 'due']): + return "invoice_status" + return "invoice_status" + + # Payment-related queries - expanded patterns + payment_keywords = ['payment', 'payments', 'paid', 'unpaid', 'revenue', 'money', 'income', + 'earnings', 'sales', 'financial', 'cash', 'transaction', 'transactions'] + if any(word in query_lower for word in payment_keywords): + if any(word in query_lower for word in ['all', 'list', 'show all', 'every', 'entire']): + return "all_payments" + return "payment_status" + + # Chat-related queries - expanded patterns + chat_keywords = ['chat', 'chats', 'message', 'messages', 'unanswered', 'customer', 'customers', + 'inquiry', 'inquiries', 'support', 'help', 'contact'] + if any(word in query_lower for word in chat_keywords): + return "chat_status" + + # App/Platform information queries - for admin only + app_keywords = ['app', 'application', 'platform', 'system', 'software', 'what is this', + 'about the app', 'about the platform', 'about the system', 'features', + 'capabilities', 'what can', 'how does the app', 'tell me about the app', + 'what does this app do', 'app features', 'system features', 'platform features', + 'what features', 'list features', 'show features', 'tell me about features', + 'what modules', 'what models', 'system overview', 'platform overview'] + if any(word in query_lower for word in app_keywords): + return "app_info" + + # General status queries - expanded patterns + status_keywords = ['status', 'summary', 'overview', 'dashboard', 'report', 'reports', + 'statistics', 'stats', 'info', 'information', 'details', 'what', 'show me', 'tell me'] + if any(word in query_lower for word in status_keywords): + return "general_status" + + # Questions about "how many", "what", "show", "tell" - default to general status + question_words = ['how many', 'how much', 'what', 'show', 'tell', 'give me', 'list', 'display'] + if any(word in query_lower for word in question_words): + return "general_status" + + return "general_query" + + def _get_relevant_data(self, intent: str, query: str) -> Dict[str, Any]: + """Get relevant data based on intent with role-based filtering""" + data = {} + role_name = self.role_access_service.role_name if self.role_access_service else "customer" + + try: + if intent == "room_occupied": + # Only staff/admin can see occupied room details + if role_name in ["admin", "staff"]: + room_number = self._extract_room_number(query) + data["occupied_rooms"] = self.ai_assistant.search_occupied_rooms(room_number) + data["room_summary"] = self.ai_assistant.get_room_status_summary() + + elif intent == "room_available": + data["room_summary"] = self.ai_assistant.get_room_status_summary() + + elif intent == "room_status": + data["room_summary"] = self.ai_assistant.get_room_status_summary() + + elif intent == "room_problems": + # Only staff/admin can see room problems + if role_name in ["admin", "staff"]: + data["problems"] = self.ai_assistant.get_room_problems() + + elif intent == "booking_by_number": + booking_number = self._extract_booking_number(query) + if booking_number: + booking_data = self.ai_assistant.get_booking_by_number(booking_number) + if booking_data: + # Filter based on role + if role_name == "customer": + # Customers can only see their own bookings + user_bookings = self.role_access_service.get_user_bookings(limit=100) + if any(b.get("booking_number") == booking_number for b in user_bookings): + data["booking"] = booking_data + else: + data["booking"] = booking_data + + elif intent == "booking_status": + if role_name in ["admin", "staff"]: + data["booking_summary"] = self.ai_assistant.get_booking_summary() + elif role_name == "customer": + # Customers see their own bookings + data["user_bookings"] = self.role_access_service.get_user_bookings(limit=10) + + elif intent == "invoice_by_number": + invoice_number = self._extract_invoice_number(query) + if invoice_number: + invoice_data = self.ai_assistant.get_invoice_by_number(invoice_number) + if invoice_data: + # Filter based on role + if role_name == "customer": + user_invoices = self.role_access_service.get_user_invoices(limit=100) + if any(i.get("invoice_number") == invoice_number for i in user_invoices): + data["invoice"] = invoice_data + else: + data["invoice"] = invoice_data + + elif intent == "invoice_status": + if role_name in ["admin", "accountant", "staff"]: + invoice_summary = self.role_access_service.get_invoice_summary() + if invoice_summary: + data["invoice_summary"] = invoice_summary + elif role_name == "customer": + # Customers see their own invoices + data["user_invoices"] = self.role_access_service.get_user_invoices(limit=10) + + elif intent == "all_payments": + # Get all payments for admin/accountant + if role_name in ["admin", "accountant"]: + data["all_payments"] = self.role_access_service.get_all_payments() + elif role_name == "staff": + data["all_payments"] = self.role_access_service.get_user_payments(limit=50) + elif role_name == "customer": + data["all_payments"] = self.role_access_service.get_user_payments(limit=None) + + elif intent == "payment_status": + if role_name in ["admin", "accountant", "staff"]: + payment_summary = self.role_access_service.get_payment_summary() + if payment_summary: + data["payment_summary"] = payment_summary + elif role_name == "customer": + # Customers see their own payments + data["user_payments"] = self.role_access_service.get_user_payments(limit=10) + + elif intent == "chat_status": + # Only staff/admin can see unanswered chats + if role_name in ["admin", "staff"]: + data["unanswered_chats"] = self.ai_assistant.get_unanswered_chats() + + elif intent == "general_status": + data["room_summary"] = self.ai_assistant.get_room_status_summary() + + if role_name in ["admin", "staff"]: + data["booking_summary"] = self.ai_assistant.get_booking_summary() + data["unanswered_chats"] = self.ai_assistant.get_unanswered_chats() + data["room_problems"] = self.ai_assistant.get_room_problems() + elif role_name == "customer": + data["user_bookings"] = self.role_access_service.get_user_bookings(limit=5) + data["user_invoices"] = self.role_access_service.get_user_invoices(limit=5) + data["user_payments"] = self.role_access_service.get_user_payments(limit=5) + + # Financial summaries only for authorized roles + if role_name in ["admin", "accountant", "staff"]: + payment_summary = self.role_access_service.get_payment_summary() + if payment_summary: + data["payment_summary"] = payment_summary + + invoice_summary = self.role_access_service.get_invoice_summary() + if invoice_summary: + data["invoice_summary"] = invoice_summary + + elif intent == "app_info": + # App information - only for admin + if role_name == "admin": + # Get comprehensive application knowledge + app_knowledge = self.knowledge_base.get_application_knowledge() + data["app_knowledge"] = app_knowledge + else: + # Non-admin users get limited information + data["app_knowledge"] = { + "overview": self.knowledge_base.APPLICATION_OVERVIEW, + "role_info": self.knowledge_base.get_role_info(role_name) + } + + elif intent == "general_query": + # For general queries, get role-appropriate data + data["room_summary"] = self.ai_assistant.get_room_status_summary() + + if role_name in ["admin", "staff"]: + data["booking_summary"] = self.ai_assistant.get_booking_summary() + elif role_name == "customer": + data["user_bookings"] = self.role_access_service.get_user_bookings(limit=5) + + if role_name in ["admin", "accountant"]: + payment_summary = self.role_access_service.get_payment_summary() + if payment_summary: + data["payment_summary"] = payment_summary + + invoice_summary = self.role_access_service.get_invoice_summary() + if invoice_summary: + data["invoice_summary"] = invoice_summary + + except Exception as e: + logger.error(f"Error getting relevant data: {str(e)}", exc_info=True) + + return data + + def _extract_room_number(self, query: str) -> Optional[str]: + """Extract room number from query""" + import re + # Look for patterns like "room 101", "room101", "#101" + patterns = [ + r'room\s*#?\s*(\d+)', + r'#\s*(\d+)', + r'room\s+(\d{3,4})', + ] + for pattern in patterns: + match = re.search(pattern, query, re.IGNORECASE) + if match: + return match.group(1) + return None + + def _extract_booking_number(self, query: str) -> Optional[str]: + """Extract booking number from query""" + import re + # Look for booking number patterns + patterns = [ + r'booking\s*#?\s*([A-Z0-9-]+)', + r'BK[A-Z0-9-]+', + ] + for pattern in patterns: + match = re.search(pattern, query, re.IGNORECASE) + if match: + return match.group(1) if match.groups() else match.group(0) + return None + + def _extract_invoice_number(self, query: str) -> Optional[str]: + """Extract invoice number from query""" + import re + patterns = [ + r'invoice\s*#?\s*([A-Z0-9-]+)', + r'INV[A-Z0-9-]+', + ] + for pattern in patterns: + match = re.search(pattern, query, re.IGNORECASE) + if match: + return match.group(1) if match.groups() else match.group(0) + return None + + def _generate_llm_response(self, query: str, context: Dict, data: Dict) -> str: + """Generate response using LLM (OpenAI, Anthropic, etc.)""" + try: + if self.provider == "openai": + import openai + openai.api_key = self.api_key + + # Build system prompt + system_prompt = self._build_system_prompt(context, data) + + # Call OpenAI API + response = openai.ChatCompletion.create( + model=self.model, + messages=[ + {"role": "system", "content": system_prompt}, + {"role": "user", "content": query} + ], + temperature=0.7, + max_tokens=500 + ) + + return response.choices[0].message.content.strip() + + except ImportError: + logger.warning("OpenAI library not installed, falling back to rule-based responses") + return self._generate_rule_based_response(self._analyze_intent(query), query, data) + except Exception as e: + logger.error(f"Error calling LLM: {str(e)}", exc_info=True) + return self._generate_rule_based_response(self._analyze_intent(query), query, data) + + def _build_system_prompt(self, context: Dict, data: Dict) -> str: + """Build enterprise-level system prompt for LLM with role awareness""" + role_name = context.get("user_role", "customer") + role_info = self.knowledge_base.get_role_info(role_name) + + prompt = f"""You are an enterprise AI assistant for a comprehensive Hotel Booking and Management System (HBMS). +You provide intelligent, role-aware assistance based on the user's permissions and access level. + +USER ROLE: {role_name.upper()} +ROLE DESCRIPTION: {role_info.get('description', 'Standard user access')} + +YOUR CAPABILITIES: +""" + + # Add role-specific capabilities + can_access = role_info.get("can_access", []) + for capability in can_access[:15]: # Limit to avoid token overflow + prompt += f"- {capability}\n" + + if role_info.get("cannot_access"): + prompt += "\nRESTRICTIONS:\n" + for restriction in role_info.get("cannot_access", [])[:5]: + prompt += f"- Cannot access: {restriction}\n" + + prompt += """ +\nSYSTEM FEATURES AVAILABLE: +- Booking Management (create, view, modify, cancel bookings) +- Room Management (availability, status, types, amenities) +- Payment Processing (multiple payment methods, status tracking) +- Invoice Management (generation, tracking, payment reconciliation) +- Loyalty Program (points, tiers, rewards, referrals) +- Service Management (additional hotel services) +- Guest Management (profiles, preferences, CRM) +- Chat Support System +- Check-in/Check-out Operations +- Maintenance and Housekeeping + +IMPORTANT SECURITY RULES: +1. NEVER provide information about other users' bookings, payments, or personal data unless user is Admin +2. For customers: Only show information about their own bookings, invoices, and payments +3. For staff: Provide operational data but not financial summaries +4. For accountant: Provide financial data but not operational details +5. For admin: Full access to all information + +Current System Status: +""" + prompt += json.dumps(context, indent=2, default=str) + + if data: + prompt += "\n\nRelevant Data for Current Query:\n" + prompt += json.dumps(data, indent=2, default=str) + + prompt += """ +\nINSTRUCTIONS: +- Provide clear, concise, and helpful responses +- Use the data provided to answer questions accurately +- Respect role-based access restrictions +- If you don't have specific information or the user doesn't have access, explain clearly +- Be professional and friendly +- For customers, always refer to data as "your bookings", "your invoices", etc. +- For staff/admin, provide comprehensive operational insights +- For accountants, focus on financial data and reports""" + + return prompt + + def _generate_rule_based_response(self, intent: str, query: str, data: Dict) -> str: + """Generate rule-based response when LLM is not available - with role awareness""" + role_name = self.role_access_service.role_name if self.role_access_service else "customer" + is_customer = role_name == "customer" + + if intent == "room_occupied": + if data.get("occupied_rooms"): + rooms = data["occupied_rooms"] + if len(rooms) == 1: + room = rooms[0] + return f"Room {room['room_number']} is currently occupied by {room['guest_name']}. Check-in: {room['check_in']}, Check-out: {room['check_out']}." + else: + return f"There are {len(rooms)} occupied rooms. Here are the details: {', '.join([r['room_number'] for r in rooms[:5]])}" + else: + summary = data.get("room_summary", {}) + return f"Currently, {summary.get('occupied', 0)} rooms are occupied out of {summary.get('total_rooms', 0)} total rooms." + + elif intent == "room_available": + summary = data.get("room_summary", {}) + return f"There are {summary.get('available', 0)} available rooms out of {summary.get('total_rooms', 0)} total rooms. {summary.get('cleaning', 0)} rooms are being cleaned." + + elif intent == "room_status": + summary = data.get("room_summary", {}) + total = summary.get('total_rooms', 0) + available = summary.get('available', 0) + occupied = summary.get('occupied', 0) + maintenance = summary.get('maintenance', 0) + cleaning = summary.get('cleaning', 0) + occupancy_rate = summary.get('occupancy_rate', 0) + + response = f"We have {total} total rooms. " + response += f"Currently: {available} available, {occupied} occupied, {cleaning} being cleaned, and {maintenance} under maintenance. " + response += f"Occupancy rate: {occupancy_rate}%." + return response + + elif intent == "room_problems": + problems = data.get("problems", []) + if problems: + response = f"⚠️ Room Issues: There are {len(problems)} rooms with problems:\n\n" + for i, problem in enumerate(problems[:10], 1): + response += f"{i}. Room {problem['room_number']}\n" + response += f" Issue: {problem.get('issue_type', 'Unknown')}\n" + if problem.get('description'): + response += f" Details: {problem['description']}\n" + if problem.get('status'): + response += f" Status: {problem['status']}\n" + response += "\n" + if len(problems) > 10: + response += f"... and {len(problems) - 10} more rooms with issues." + return response + else: + return "✅ No room problems reported at this time. All rooms are in good condition!" + + elif intent == "booking_by_number": + booking = data.get("booking") + if booking: + response = f"Booking {booking['booking_number']}:\n" + response += f"• Status: {booking['status']}\n" + response += f"• Guest: {booking['guest_name']}\n" + response += f"• Room: {booking['room_number']}\n" + response += f"• Check-in: {booking['check_in']}\n" + response += f"• Check-out: {booking['check_out']}\n" + response += f"• Payment Status: {booking['payment_status']}\n" + if booking.get('total_price'): + response += f"• Total Price: ${float(booking['total_price']):,.2f}" + return response + else: + return "I couldn't find that booking. Please check the booking number and try again." + + elif intent == "booking_status": + # Role-aware booking status + if is_customer: + user_bookings = data.get("user_bookings", []) + if user_bookings: + response = f"You have {len(user_bookings)} booking(s):\n\n" + for booking in user_bookings[:5]: + response += f"• {booking.get('booking_number', 'N/A')}: {booking.get('status', 'Unknown')}\n" + response += f" Check-in: {booking.get('check_in', 'N/A')}, Check-out: {booking.get('check_out', 'N/A')}\n" + if len(user_bookings) > 5: + response += f"\n... and {len(user_bookings) - 5} more bookings." + return response + else: + return "You don't have any bookings at this time." + else: + summary = data.get("booking_summary", {}) + if summary: + response = "Booking Status Summary:\n" + response += f"• Active Bookings: {summary.get('active_bookings', 0)}\n" + response += f"• Upcoming Check-ins: {summary.get('upcoming_checkins', 0)}\n" + response += f"• Upcoming Check-outs: {summary.get('upcoming_checkouts', 0)}\n" + response += f"• Pending Bookings: {summary.get('pending_bookings', 0)}" + return response + return "No booking data available at this time." + + elif intent == "invoice_by_number": + invoice = data.get("invoice") + if invoice: + response = f"Invoice {invoice['invoice_number']}:\n" + response += f"• Status: {invoice['status']}\n" + response += f"• Amount: ${invoice['amount']:,.2f}\n" + if invoice.get('due_date'): + response += f"• Due Date: {invoice['due_date']}\n" + if invoice.get('booking_number'): + response += f"• Booking: {invoice['booking_number']}" + return response + else: + return "I couldn't find that invoice. Please check the invoice number." + + elif intent == "invoice_status": + # Role-aware invoice status + if is_customer: + user_invoices = data.get("user_invoices", []) + if user_invoices: + response = f"You have {len(user_invoices)} invoice(s):\n\n" + for invoice in user_invoices[:5]: + status_emoji = "✅" if invoice.get('status') == 'paid' else "⏳" if invoice.get('status') == 'sent' else "⚠️" + response += f"{status_emoji} Invoice {invoice.get('invoice_number', 'N/A')}: {invoice.get('status', 'Unknown')}\n" + response += f" Amount: ${invoice.get('total_amount', 0):,.2f}, Due: {invoice.get('due_date', 'N/A')}\n" + if len(user_invoices) > 5: + response += f"\n... and {len(user_invoices) - 5} more invoices." + return response + else: + return "You don't have any invoices at this time." + else: + summary = data.get("invoice_summary", {}) + if summary: + response = "Invoice Status Summary:\n" + response += f"• Total Invoices: {summary.get('total_invoices', 0)}\n" + response += f"• Overdue Invoices: {summary.get('overdue_invoices', 0)}" + if summary.get('status_breakdown'): + response += f"\n• Status Breakdown: {summary['status_breakdown']}" + return response + return "No invoice data available at this time." + + elif intent == "all_payments": + # Display all payments in table format + all_payments = data.get("all_payments", []) + if all_payments: + response = f"📋 ALL PAYMENTS ({len(all_payments)} total):\n\n" + response += "┌──────────────┬──────────────────────────────┬──────────────────┬──────────┬──────────────────┬──────────┬────────────┬──────────────┐\n" + response += "│ Transaction │ Booking Number │ Customer │ Method │ Type │ Status │ Amount │ Payment Date │\n" + response += "├──────────────┼──────────────────────────────┼──────────────────┼──────────┼──────────────────┼──────────┼────────────┼──────────────┤\n" + + for payment in all_payments: + trans_id = (payment.get('transaction_id') or f"PAY-{payment.get('id', 'N/A')}")[:12] + booking = (payment.get('booking_number') or 'N/A')[:28] + customer = (payment.get('customer_name') or 'N/A')[:16] + method = str(payment.get('payment_method', 'N/A')).replace('_', ' ').title()[:8] + ptype = payment.get('payment_type_display', payment.get('payment_type', 'N/A'))[:16] + status = str(payment.get('payment_status', 'N/A')).title() + + status_emoji = "✅" if status.lower() == 'completed' else "⏳" if status.lower() == 'pending' else "❌" if status.lower() == 'failed' else "🔄" if status.lower() == 'refunded' else "❓" + status_display = f"{status_emoji} {status}"[:10] + + amount = payment.get('amount', 0) + amount_str = f"{amount:,.2f} €"[:12] + + pdate = payment.get('payment_date', None) + if pdate and pdate != 'Invalid Date': + try: + from datetime import datetime + if isinstance(pdate, str): + if 'T' in pdate: + dt = datetime.fromisoformat(pdate.replace('Z', '+00:00')) + pdate = dt.strftime('%Y-%m-%d') + else: + pdate = pdate[:10] + else: + pdate = pdate.strftime('%Y-%m-%d') if hasattr(pdate, 'strftime') else str(pdate)[:10] + except Exception: + pdate = "Invalid Date" + else: + pdate = "Invalid Date" + + response += f"│ {trans_id:<12} │ {booking:<28} │ {customer:<16} │ {method:<8} │ {ptype:<16} │ {status_display:<10} │ {amount_str:<12} │ {pdate:<14} │\n" + + response += "└──────────────┴──────────────────────────────┴──────────────────┴──────────┴──────────────────┴──────────┴────────────┴──────────────┘\n" + + # Add summary statistics + completed = sum(1 for p in all_payments if p.get('payment_status', '').lower() == 'completed') + pending = sum(1 for p in all_payments if p.get('payment_status', '').lower() == 'pending') + failed = sum(1 for p in all_payments if p.get('payment_status', '').lower() == 'failed') + refunded = sum(1 for p in all_payments if p.get('payment_status', '').lower() == 'refunded') + total_amount = sum(float(p.get('amount', 0)) for p in all_payments) + completed_amount = sum(float(p.get('amount', 0)) for p in all_payments if p.get('payment_status', '').lower() == 'completed') + pending_amount = sum(float(p.get('amount', 0)) for p in all_payments if p.get('payment_status', '').lower() == 'pending') + + response += f"\n📊 Summary:\n" + response += f"• Total Payments: {len(all_payments)}\n" + response += f"• ✅ Completed: {completed} ({completed_amount:,.2f} €)\n" + response += f"• ⏳ Pending: {pending} ({pending_amount:,.2f} €)\n" + response += f"• ❌ Failed: {failed}\n" + if refunded > 0: + response += f"• 🔄 Refunded: {refunded}\n" + response += f"• Total Amount: {total_amount:,.2f} €" + + return response + else: + return "No payments found." + + elif intent == "payment_status": + # Role-aware payment status + if is_customer: + user_payments = data.get("user_payments", []) + if user_payments: + response = f"Your recent payments ({len(user_payments)} total):\n\n" + for payment in user_payments[:5]: + status_emoji = "✅" if payment.get('payment_status') == 'completed' else "⏳" if payment.get('payment_status') == 'pending' else "❌" + response += f"{status_emoji} ${payment.get('amount', 0):,.2f} - {payment.get('payment_method', 'N/A')}\n" + response += f" Status: {payment.get('payment_status', 'Unknown')}, Date: {payment.get('payment_date', 'N/A')}\n" + if len(user_payments) > 5: + response += f"\n... and {len(user_payments) - 5} more payments." + return response + else: + return "You don't have any payment records at this time." + else: + summary = data.get("payment_summary", {}) + if summary: + response = "Payment Status Summary:\n" + response += f"• Total Revenue (last 30 days): ${summary.get('total_revenue', 0):,.2f}\n" + response += f"• Pending Payments: ${summary.get('pending_amount', 0):,.2f}\n" + response += f"• Completed Payments: {summary.get('completed_payments', 0)}" + return response + return "No payment data available at this time." + + elif intent == "chat_status": + chats = data.get("unanswered_chats", []) + if chats: + response = f"Chat Status: There are {len(chats)} unanswered chat messages.\n\n" + response += "Oldest waiting messages:\n" + for i, chat in enumerate(chats[:3], 1): + response += f"{i}. {chat['visitor_name']} - Waiting {chat['waiting_hours']:.1f} hours\n" + response += f" Last message: {chat['last_message'][:50]}...\n" + return response + else: + return "All chat messages have been answered. Great job! ✅" + + elif intent == "general_status": + # Comprehensive status overview - always show all sections for consistency + room_summary = data.get("room_summary", {}) + booking_summary = data.get("booking_summary", {}) + payment_summary = data.get("payment_summary", {}) + invoice_summary = data.get("invoice_summary", {}) + unanswered_chats = data.get("unanswered_chats", []) + problems = data.get("room_problems", []) + + response = "📊 Hotel Status Overview:\n\n" + + # Rooms - always show + response += "🏨 ROOMS:\n" + occupancy_rate = room_summary.get('occupancy_rate', 0) + # Format occupancy rate to show one decimal place + if isinstance(occupancy_rate, (int, float)): + occupancy_rate = f"{occupancy_rate:.1f}" + response += f"• Total: {room_summary.get('total_rooms', 0)}\n" + response += f"• Available: {room_summary.get('available', 0)}\n" + response += f"• Occupied: {room_summary.get('occupied', 0)}\n" + response += f"• Cleaning: {room_summary.get('cleaning', 0)}\n" + response += f"• Maintenance: {room_summary.get('maintenance', 0)}\n" + response += f"• Occupancy Rate: {occupancy_rate}%\n\n" + + # Bookings - always show + response += "📅 BOOKINGS:\n" + response += f"• Active: {booking_summary.get('active_bookings', 0)}\n" + response += f"• Upcoming Check-ins: {booking_summary.get('upcoming_checkins', 0)}\n" + response += f"• Upcoming Check-outs: {booking_summary.get('upcoming_checkouts', 0)}\n" + response += f"• Pending: {booking_summary.get('pending_bookings', 0)}\n\n" + + # Payments - always show + response += "💰 PAYMENTS:\n" + total_revenue = payment_summary.get('total_revenue', 0) or 0 + pending_amount = payment_summary.get('pending_amount', 0) or 0 + response += f"• Revenue (30 days): ${total_revenue:,.2f}\n" + response += f"• Pending: ${pending_amount:,.2f}\n" + response += f"• Completed: {payment_summary.get('completed_payments', 0)}\n\n" + + # Invoices - always show + response += "🧾 INVOICES:\n" + response += f"• Total: {invoice_summary.get('total_invoices', 0)}\n" + response += f"• Overdue: {invoice_summary.get('overdue_invoices', 0)}\n\n" + + # Chats - always show + response += "💬 CHATS:\n" + response += f"• Unanswered: {len(unanswered_chats)}\n\n" + + # Problems - show if any, otherwise skip + if problems: + response += "⚠️ ISSUES:\n" + response += f"• Rooms with problems: {len(problems)}\n" + for problem in problems[:3]: + response += f" - Room {problem['room_number']}: {problem.get('description', 'Issue reported')}\n" + + return response + + elif intent == "app_info": + # Comprehensive application information - formatted for admin + app_knowledge = data.get("app_knowledge", {}) + role_name = self.role_access_service.role_name if self.role_access_service else "customer" + + if role_name != "admin": + response = "📱 Application Overview:\n\n" + response += app_knowledge.get("overview", "This is a Hotel Booking and Management System.") + response += "\n\n" + role_info = app_knowledge.get("role_info", {}) + if role_info: + response += f"Your Role: {role_name.upper()}\n" + response += f"Description: {role_info.get('description', 'Standard user access')}\n" + return response + + # Admin gets full comprehensive information + response = "📱 Hotel Booking & Management System (HBMS) - Complete Overview\n\n" + response += "=" * 60 + "\n\n" + + # Overview + response += "📋 SYSTEM OVERVIEW:\n" + response += app_knowledge.get("overview", "") + "\n\n" + + # Core Features + features = app_knowledge.get("features", {}) + if features: + response += "🔧 CORE FEATURES & MODULES:\n\n" + feature_count = 0 + for feature_name, feature_info in features.items(): + feature_count += 1 + feature_title = feature_name.replace("_", " ").title() + response += f"{feature_count}. {feature_title}\n" + response += f" {feature_info.get('description', 'N/A')}\n" + + if feature_info.get('models'): + models = feature_info.get('models', []) + if models: + response += f" Models: {', '.join(models[:5])}" + if len(models) > 5: + response += f" (+{len(models) - 5} more)" + response += "\n" + + if feature_info.get('statuses'): + statuses = feature_info.get('statuses', []) + response += f" Statuses: {', '.join(statuses)}\n" + + response += "\n" + + # User Roles + role_capabilities = app_knowledge.get("role_capabilities", {}) + if role_capabilities: + response += "👥 USER ROLES & PERMISSIONS:\n\n" + for role_name_key, role_info in role_capabilities.items(): + response += f"• {role_name_key.upper()}\n" + response += f" {role_info.get('description', '')}\n" + + can_access = role_info.get('can_access', []) + if can_access: + response += f" Can Access: {len(can_access)} features\n" + # Show first 5 capabilities + for cap in can_access[:5]: + response += f" - {cap}\n" + if len(can_access) > 5: + response += f" ... and {len(can_access) - 5} more\n" + + cannot_access = role_info.get('cannot_access', []) + if cannot_access: + response += f" Restrictions: {len(cannot_access)} items\n" + + response += "\n" + + # Technology Stack + response += "💻 TECHNOLOGY STACK:\n\n" + response += "• Backend: FastAPI (Python)\n" + response += "• Frontend: React/TypeScript\n" + response += "• Database: SQLAlchemy ORM\n" + response += "• AI: Self-learning assistant with pattern recognition\n" + response += "• Authentication: JWT with MFA support\n" + response += "• Security: Role-based access control, audit logging\n\n" + + # Key Capabilities + response += "✨ KEY CAPABILITIES:\n\n" + response += "• Complete booking lifecycle management\n" + response += "• Multi-role access control (Admin, Staff, Accountant, Customer)\n" + response += "• Payment processing with multiple methods\n" + response += "• Invoice generation and tracking\n" + response += "• Loyalty program with points and rewards\n" + response += "• Real-time chat support system\n" + response += "• Room maintenance and housekeeping management\n" + response += "• Guest profile and CRM features\n" + response += "• Analytics and reporting\n" + response += "• Content management (blog, pages, banners)\n" + response += "• Email campaigns and marketing automation\n" + response += "• Group booking management\n" + response += "• Dynamic pricing and rate plans\n" + response += "• Package deals (room + services)\n" + response += "• Review and rating system\n" + response += "• Audit logging and security compliance\n\n" + + # Common Queries + common_queries = app_knowledge.get("common_queries", {}) + if common_queries: + response += "💬 COMMON QUERY CATEGORIES:\n\n" + for category, queries in common_queries.items(): + response += f"• {category.title()}: {', '.join(queries[:3])}" + if len(queries) > 3: + response += f" (+{len(queries) - 3} more)" + response += "\n" + response += "\n" + + response += "=" * 60 + "\n" + response += "\n💡 TIP: Ask me about any specific feature, model, or capability for detailed information!" + + return response + + elif intent == "general_query": + # Try to provide helpful response based on available data + room_summary = data.get("room_summary", {}) + booking_summary = data.get("booking_summary", {}) + payment_summary = data.get("payment_summary", {}) + + response = "I can help you with information about:\n\n" + response += "🏨 Rooms - availability, occupancy, status, problems\n" + response += "📅 Bookings - active, upcoming, pending reservations\n" + response += "💰 Payments - revenue, pending payments, transactions\n" + response += "🧾 Invoices - status, overdue invoices\n" + response += "💬 Chats - unanswered customer messages\n\n" + + if room_summary: + response += f"Quick Stats: {room_summary.get('total_rooms', 0)} total rooms, " + response += f"{room_summary.get('occupied', 0)} occupied, " + response += f"{room_summary.get('available', 0)} available.\n\n" + + response += "Try asking:\n" + response += "• 'How many rooms do we have?'\n" + response += "• 'Show me occupied rooms'\n" + response += "• 'What's our revenue?'\n" + response += "• 'Are there any unanswered chats?'" + + return response + + else: + return "I can help you with questions about rooms, bookings, invoices, payments, and chat messages. What would you like to know?" + + def _apply_learned_pattern(self, pattern: AILearnedPattern, data: Dict, query: str) -> Optional[str]: + """Apply learned pattern to generate response""" + try: + response_template = pattern.response_template or "" + + # Replace placeholders with actual data + if "{data}" in response_template and data: + # Inject relevant data into response + data_str = json.dumps(data, indent=2, default=str)[:500] + response = response_template.replace("{data}", data_str) + else: + response = response_template + + return response[:2000] # Limit response length + except Exception as e: + logger.error(f"Error applying learned pattern: {str(e)}", exc_info=True) + return None + diff --git a/Backend/src/ai/services/ai_knowledge_base.py b/Backend/src/ai/services/ai_knowledge_base.py new file mode 100644 index 00000000..5f028448 --- /dev/null +++ b/Backend/src/ai/services/ai_knowledge_base.py @@ -0,0 +1,382 @@ +""" +Enterprise AI Knowledge Base +Comprehensive documentation of all application features, models, and capabilities +""" + +from typing import Dict, List, Any +import logging + +logger = logging.getLogger(__name__) + + +class AIKnowledgeBase: + """Enterprise Knowledge Base for AI Assistant - Documents entire application""" + + APPLICATION_OVERVIEW = """ + This is a comprehensive Hotel Booking and Management System (HBMS) - an enterprise-grade + solution for managing hotel operations, reservations, payments, guest services, and business analytics. + + The system supports multiple user roles: Admin, Staff, Accountant, and Customer, each with + different access levels and permissions. + """ + + # Core Models and Features + FEATURES = { + "booking_management": { + "description": "Complete booking lifecycle management including creation, confirmation, check-in, check-out, and cancellation", + "models": ["Booking", "BookingStatus"], + "key_fields": ["booking_number", "user_id", "room_id", "check_in_date", "check_out_date", + "num_guests", "total_price", "status", "special_requests"], + "statuses": ["pending", "confirmed", "checked_in", "checked_out", "cancelled"], + "relationships": ["User", "Room", "Payment", "Invoice", "ServiceUsage", "CheckInCheckOut"] + }, + + "room_management": { + "description": "Room inventory, availability, status tracking, and maintenance", + "models": ["Room", "RoomType", "RoomStatus"], + "key_fields": ["room_number", "floor", "status", "price", "capacity", "amenities", "room_size", "view"], + "statuses": ["available", "occupied", "maintenance", "cleaning"], + "relationships": ["RoomType", "Booking", "Review", "RoomMaintenance", "HousekeepingTask"] + }, + + "payment_processing": { + "description": "Payment handling for bookings with multiple payment methods and status tracking", + "models": ["Payment", "PaymentMethod", "PaymentStatus", "PaymentType"], + "key_fields": ["amount", "payment_method", "payment_type", "payment_status", "transaction_id", "payment_date"], + "payment_methods": ["cash", "credit_card", "debit_card", "bank_transfer", "e_wallet", "stripe", "paypal", "borica"], + "statuses": ["pending", "completed", "failed", "refunded"], + "payment_types": ["full", "deposit", "remaining"], + "relationships": ["Booking"] + }, + + "invoice_management": { + "description": "Invoice generation, tracking, and payment reconciliation", + "models": ["Invoice", "InvoiceItem", "InvoiceStatus"], + "key_fields": ["invoice_number", "total_amount", "subtotal", "tax_amount", "discount_amount", + "balance_due", "status", "due_date", "paid_date"], + "statuses": ["draft", "sent", "paid", "overdue", "cancelled"], + "relationships": ["Booking", "User", "InvoiceItem"] + }, + + "user_management": { + "description": "User accounts, roles, authentication, and guest profiles", + "models": ["User", "Role", "RefreshToken", "PasswordResetToken"], + "key_fields": ["email", "full_name", "phone", "role_id", "is_active", "currency"], + "roles": ["admin", "staff", "customer", "accountant"], + "guest_fields": ["is_vip", "lifetime_value", "satisfaction_score", "total_visits", "last_visit_date"], + "relationships": ["Role", "Booking", "Payment", "Invoice", "Review", "Favorite"] + }, + + "loyalty_program": { + "description": "Customer loyalty program with tiers, points, rewards, and referrals", + "models": ["LoyaltyTier", "UserLoyalty", "LoyaltyPointTransaction", "LoyaltyReward", + "RewardRedemption", "Referral"], + "key_fields": ["tier_level", "points_balance", "lifetime_points", "referral_code"], + "relationships": ["User", "Booking"] + }, + + "service_management": { + "description": "Additional hotel services like spa, restaurant, room service", + "models": ["Service", "ServiceUsage", "ServiceBooking", "ServiceBookingItem", "ServicePayment"], + "key_fields": ["service_name", "price", "category", "description"], + "relationships": ["Booking"] + }, + + "promotion_system": { + "description": "Discount codes, promotional campaigns, and special offers", + "models": ["Promotion"], + "key_fields": ["code", "discount_type", "discount_value", "start_date", "end_date", "is_active"], + "relationships": ["Booking"] + }, + + "reviews_and_ratings": { + "description": "Guest reviews and ratings for rooms and services", + "models": ["Review"], + "key_fields": ["rating", "comment", "is_verified"], + "relationships": ["User", "Room"] + }, + + "chat_system": { + "description": "Real-time chat support between guests and staff", + "models": ["Chat", "ChatMessage", "ChatStatus"], + "key_fields": ["visitor_name", "visitor_email", "status", "message", "sender_type", "is_read"], + "statuses": ["open", "closed"], + "relationships": ["User"] + }, + + "check_in_check_out": { + "description": "Check-in and check-out process management", + "models": ["CheckInCheckOut"], + "key_fields": ["checked_in_at", "checked_out_at", "checked_in_by", "checked_out_by", "notes"], + "relationships": ["Booking", "User"] + }, + + "maintenance_tracking": { + "description": "Room maintenance scheduling and tracking", + "models": ["RoomMaintenance", "RoomInspection"], + "key_fields": ["scheduled_start", "scheduled_end", "status", "description", "priority"], + "relationships": ["Room"] + }, + + "housekeeping": { + "description": "Housekeeping task management and scheduling", + "models": ["HousekeepingTask"], + "key_fields": ["task_type", "status", "scheduled_time", "completed_at"], + "relationships": ["Room"] + }, + + "guest_management": { + "description": "Comprehensive guest profile management and CRM features", + "models": ["GuestNote", "GuestPreference", "GuestTag", "GuestSegment", "GuestCommunication"], + "key_fields": ["notes", "preferences", "tags", "communication_history"], + "relationships": ["User"] + }, + + "group_bookings": { + "description": "Group booking management for multiple rooms", + "models": ["GroupBooking"], + "key_fields": ["group_name", "contact_person", "total_rooms", "group_discount"], + "relationships": ["Booking"] + }, + + "rate_plans": { + "description": "Dynamic pricing and rate plan management", + "models": ["RatePlan"], + "key_fields": ["name", "base_price", "season_multiplier", "valid_from", "valid_to"], + "relationships": ["Booking"] + }, + + "packages": { + "description": "Pre-configured booking packages (room + services)", + "models": ["Package"], + "key_fields": ["name", "price", "includes", "valid_period"], + "relationships": ["RoomType", "Service"] + }, + + "blog_and_content": { + "description": "Content management for hotel blog and marketing", + "models": ["BlogPost", "Banner", "PageContent"], + "key_fields": ["title", "content", "is_published", "published_at"], + "relationships": [] + }, + + "analytics_and_reporting": { + "description": "Business intelligence, analytics, and financial reporting", + "features": ["Revenue reports", "Occupancy analytics", "Guest analytics", "Payment reports", + "Invoice reports", "Booking trends", "Customer lifetime value"], + "models": ["AuditLog"] + }, + + "system_settings": { + "description": "System-wide configuration and settings", + "models": ["SystemSettings"], + "key_fields": ["key", "value", "category"], + "categories": ["general", "payment", "email", "company_info"] + }, + + "security_and_compliance": { + "description": "Security, audit logging, and GDPR compliance", + "models": ["SecurityEvent", "AuditLog", "GDPRCompliance"], + "features": ["Action audit trails", "Security event logging", "GDPR data requests", + "Cookie consent management"] + }, + + "notifications": { + "description": "System notifications and alerts", + "models": ["Notification"], + "key_fields": ["type", "message", "is_read", "priority"], + "relationships": ["User"] + }, + + "workflows": { + "description": "Automated workflow management for business processes", + "models": ["Workflow"], + "key_fields": ["name", "trigger", "actions", "conditions"], + "relationships": [] + }, + + "email_campaigns": { + "description": "Marketing email campaigns and automation", + "models": ["EmailCampaign"], + "key_fields": ["subject", "content", "recipient_segment", "scheduled_time"], + "relationships": ["GuestSegment"] + } + } + + ROLE_CAPABILITIES = { + "admin": { + "description": "Full system access with all administrative privileges", + "can_access": [ + "All bookings (all customers)", + "All rooms and room management", + "All payments and financial data", + "All invoices", + "All users and user management", + "System settings and configuration", + "Analytics and reports", + "Audit logs and security events", + "Content management (blog, banners, pages)", + "Promotion management", + "Loyalty program administration", + "Service management", + "Maintenance and housekeeping", + "Check-in/check-out operations", + "Chat management", + "Email campaigns", + "Workflow management", + "Group bookings", + "Rate plans and packages" + ], + "cannot_access": [], + "restrictions": "None - full access" + }, + + "accountant": { + "description": "Financial data access for accounting and reporting", + "can_access": [ + "All payments and payment history", + "All invoices and invoice management", + "Financial reports and analytics", + "Revenue summaries", + "Payment reconciliation", + "Invoice generation and editing", + "Booking financial details (for invoicing)", + "Customer payment history", + "Refund processing", + "Financial dashboard statistics" + ], + "cannot_access": [ + "User personal information (except payment-related)", + "System settings", + "Content management", + "Room operational details (unless related to billing)", + "Security and audit logs (financial audit access only)" + ], + "restrictions": "Financial and payment data only" + }, + + "staff": { + "description": "Operational staff with access to daily hotel operations", + "can_access": [ + "All bookings and booking management", + "Room status and availability", + "Check-in and check-out operations", + "Guest information (for operations)", + "Room maintenance and housekeeping tasks", + "Service bookings and service usage", + "Chat system for customer support", + "Basic booking reports", + "Occupancy status", + "Group bookings", + "Guest preferences and notes (operational)" + ], + "cannot_access": [ + "Financial reports and analytics", + "System settings", + "User management (except guest profile updates)", + "Content management", + "Email campaigns", + "Workflow management", + "Full payment details (can view payment status only)", + "Invoice editing (view only)" + ], + "restrictions": "Operational data only, no financial or system administration" + }, + + "customer": { + "description": "Hotel guests with access to their own booking and account information", + "can_access": [ + "Own bookings (view, cancel)", + "Own booking details", + "Own invoices (view only)", + "Own payment history", + "Own profile information", + "Room browsing and availability (public)", + "Service browsing", + "Booking creation", + "Review submission", + "Favorite rooms", + "Loyalty points and rewards", + "Referral code usage", + "Chat with support" + ], + "cannot_access": [ + "Other customers' bookings or information", + "All bookings overview", + "Financial reports", + "System settings", + "Room management", + "Staff operations", + "Admin features", + "Other users' data" + ], + "restrictions": "Only own data and customer-facing features" + } + } + + COMMON_QUERIES = { + "booking": [ + "booking status", "check-in date", "check-out date", "booking number", + "cancel booking", "modify booking", "upcoming bookings", "past bookings" + ], + "room": [ + "available rooms", "room types", "room amenities", "room prices", + "room availability", "occupied rooms", "room status" + ], + "payment": [ + "payment status", "payment history", "payment methods", "refund", + "outstanding balance", "payment due", "transaction" + ], + "invoice": [ + "invoice status", "invoice number", "invoice amount", "due date", + "paid invoice", "outstanding invoice", "invoice download" + ], + "loyalty": [ + "loyalty points", "loyalty tier", "rewards", "referral code", + "points balance", "points history" + ], + "general": [ + "hotel information", "contact", "policies", "services", "amenities", + "location", "FAQ", "help" + ] + } + + @classmethod + def get_application_knowledge(cls) -> Dict[str, Any]: + """Get comprehensive application knowledge for AI context""" + return { + "overview": cls.APPLICATION_OVERVIEW, + "features": cls.FEATURES, + "role_capabilities": cls.ROLE_CAPABILITIES, + "common_queries": cls.COMMON_QUERIES + } + + @classmethod + def get_role_info(cls, role_name: str) -> Dict[str, Any]: + """Get information about a specific role""" + return cls.ROLE_CAPABILITIES.get(role_name.lower(), {}) + + @classmethod + def get_feature_info(cls, feature_name: str) -> Dict[str, Any]: + """Get information about a specific feature""" + return cls.FEATURES.get(feature_name.lower(), {}) + + @classmethod + def can_role_access_feature(cls, role_name: str, feature: str) -> bool: + """Check if a role can access a specific feature""" + role_info = cls.ROLE_CAPABILITIES.get(role_name.lower(), {}) + can_access = role_info.get("can_access", []) + + # Admin can access everything + if role_name.lower() == "admin": + return True + + # Check if feature is in can_access list + feature_keywords = feature.lower().split("_") + for accessible in can_access: + accessible_lower = accessible.lower() + if any(keyword in accessible_lower for keyword in feature_keywords): + return True + + return False + diff --git a/Backend/src/ai/services/ai_learning_service.py b/Backend/src/ai/services/ai_learning_service.py new file mode 100644 index 00000000..e9675cb2 --- /dev/null +++ b/Backend/src/ai/services/ai_learning_service.py @@ -0,0 +1,818 @@ +""" +AI Learning Service - Self-learning and pattern recognition system +Learns from conversations, stores patterns, and improves responses over time +""" + +from typing import Dict, List, Optional, Any, Tuple +from datetime import datetime, timedelta +from sqlalchemy.orm import Session +from sqlalchemy import and_, or_, func, desc +import json +import re +import logging +from collections import Counter + +from ..models.ai_conversation import ( + AIConversation, AIConversationFeedback, AILearnedPattern, + AIKnowledgeEntry, AITrainingMetrics +) +from ...shared.config.logging_config import get_logger + +logger = get_logger(__name__) + + +class AILearningService: + """Service for AI self-learning and pattern recognition""" + + def __init__(self, db: Session): + self.db = db + + def save_conversation( + self, + user_id: int, + user_query: str, + ai_response: str, + intent: str, + context_used: Optional[Dict] = None, + user_role: Optional[str] = None, + session_id: Optional[str] = None, + response_time_ms: Optional[int] = None + ) -> AIConversation: + """Save conversation for learning""" + try: + conversation = AIConversation( + user_id=user_id, + session_id=session_id, + user_query=user_query, + ai_response=ai_response, + intent=intent, + context_used=context_used or {}, + user_role=user_role, + response_time_ms=response_time_ms + ) + self.db.add(conversation) + self.db.commit() + self.db.refresh(conversation) + + # Trigger learning process in background + self._learn_from_conversation(conversation) + + return conversation + except Exception as e: + logger.error(f"Error saving conversation: {str(e)}", exc_info=True) + self.db.rollback() + raise + + def save_feedback( + self, + conversation_id: int, + user_id: int, + rating: Optional[int] = None, + is_helpful: Optional[bool] = None, + is_correct: Optional[bool] = None, + feedback_text: Optional[str] = None, + correction: Optional[str] = None + ) -> AIConversationFeedback: + """Save user feedback for learning""" + try: + feedback = AIConversationFeedback( + conversation_id=conversation_id, + user_id=user_id, + rating=rating, + is_helpful=is_helpful, + is_correct=is_correct, + feedback_text=feedback_text, + correction=correction + ) + self.db.add(feedback) + + # Update conversation helpfulness + conversation = self.db.query(AIConversation).filter( + AIConversation.id == conversation_id + ).first() + if conversation: + conversation.is_helpful = is_helpful + + self.db.commit() + self.db.refresh(feedback) + + # Trigger learning from feedback + if feedback.is_correct == False or correction: + self._learn_from_feedback(conversation, feedback) + + return feedback + except Exception as e: + logger.error(f"Error saving feedback: {str(e)}", exc_info=True) + self.db.rollback() + raise + + def find_similar_queries(self, query: str, intent: Optional[str] = None, limit: int = 5) -> List[Dict[str, Any]]: + """Find similar past queries to learn from""" + try: + # Extract keywords from query + keywords = self._extract_keywords(query) + + # Search for similar queries + query_obj = self.db.query(AIConversation).filter( + AIConversation.user_query.ilike(f"%{query[:50]}%") + ) + + if intent: + query_obj = query_obj.filter(AIConversation.intent == intent) + + similar = query_obj.order_by(desc(AIConversation.created_at)).limit(limit).all() + + results = [] + for conv in similar: + results.append({ + "query": conv.user_query, + "response": conv.ai_response, + "intent": conv.intent, + "is_helpful": conv.is_helpful, + "created_at": conv.created_at.isoformat() + }) + + return results + except Exception as e: + logger.error(f"Error finding similar queries: {str(e)}", exc_info=True) + return [] + + def get_learned_pattern(self, query: str, user_role: Optional[str] = None) -> Optional[AILearnedPattern]: + """Get learned pattern that matches query""" + try: + keywords = self._extract_keywords(query) + + # Search patterns by keywords + patterns = self.db.query(AILearnedPattern).filter( + and_( + AILearnedPattern.is_active == True, + or_(*[AILearnedPattern.pattern_keywords.contains(kw) for kw in keywords[:5]]) + ) + ) + + if user_role: + patterns = patterns.filter( + or_( + AILearnedPattern.user_role == user_role, + AILearnedPattern.user_role.is_(None) + ) + ) + + # Order by confidence and usage + patterns = patterns.order_by( + desc(AILearnedPattern.confidence_score), + desc(AILearnedPattern.usage_count) + ).limit(1).all() + + if patterns: + pattern = patterns[0] + # Update usage stats + pattern.usage_count += 1 + pattern.last_used_at = datetime.utcnow() + self.db.commit() + return pattern + + return None + except Exception as e: + logger.error(f"Error getting learned pattern: {str(e)}", exc_info=True) + return None + + def get_knowledge_entry(self, query: str, user_role: Optional[str] = None) -> Optional[Dict[str, Any]]: + """Get knowledge base entry that matches query""" + try: + keywords = self._extract_keywords(query) + query_lower = query.lower() + + # Search knowledge entries + entries = self.db.query(AIKnowledgeEntry).filter( + and_( + or_( + AIKnowledgeEntry.question.ilike(f"%{query[:50]}%"), + *[AIKnowledgeEntry.keywords.contains([kw]) for kw in keywords[:3]] + ), + or_( + AIKnowledgeEntry.is_verified == True, + AIKnowledgeEntry.confidence >= 70.0 + ) + ) + ) + + if user_role: + entries = entries.filter( + or_( + AIKnowledgeEntry.user_role == user_role, + AIKnowledgeEntry.user_role.is_(None) + ) + ) + + entries = entries.order_by( + desc(AIKnowledgeEntry.confidence), + desc(AIKnowledgeEntry.success_count) + ).limit(1).all() + + if entries: + entry = entries[0] + # Update usage stats + entry.usage_count += 1 + entry.last_used_at = datetime.utcnow() + self.db.commit() + + return { + "topic": entry.topic, + "question": entry.question, + "answer": entry.answer, + "confidence": float(entry.confidence) + } + + return None + except Exception as e: + logger.error(f"Error getting knowledge entry: {str(e)}", exc_info=True) + return None + + def _learn_from_conversation(self, conversation: AIConversation): + """Learn patterns from a conversation - automatically learns from all conversations""" + try: + # Always extract keywords and patterns (learn from all conversations) + keywords = self._extract_keywords(conversation.user_query) + + # Check if similar pattern exists + existing_pattern = self.get_learned_pattern( + conversation.user_query, + conversation.user_role + ) + + if existing_pattern: + # Update existing pattern confidence + existing_pattern.success_count += 1 + existing_pattern.usage_count += 1 + + # Adjust confidence based on helpfulness + if conversation.is_helpful is True: + existing_pattern.confidence_score = min( + 100.0, + existing_pattern.confidence_score + 1.0 + ) + elif conversation.is_helpful is False: + existing_pattern.confidence_score = max( + 0.0, + existing_pattern.confidence_score - 2.0 + ) + else: + # Neutral - slight increase + existing_pattern.confidence_score = min( + 100.0, + existing_pattern.confidence_score + 0.3 + ) + + existing_pattern.last_used_at = datetime.utcnow() + else: + # Create new pattern - learn from all conversations + initial_confidence = 60.0 if conversation.is_helpful is True else 50.0 + if conversation.is_helpful is False: + initial_confidence = 30.0 # Lower confidence for unhelpful patterns + + pattern = AILearnedPattern( + pattern_keywords=json.dumps(keywords), + query_pattern=conversation.user_query[:200], + intent=conversation.intent or "general_query", + response_template=conversation.ai_response[:500], + context_keys=conversation.context_used, + confidence_score=initial_confidence, + usage_count=1, + success_count=1 if conversation.is_helpful is not False else 0, + source_conversation_id=conversation.id, + user_role=conversation.user_role, + last_used_at=datetime.utcnow() + ) + self.db.add(pattern) + + # Automatically extract knowledge from every conversation + # This enables the AI to build its knowledge base autonomously + self._auto_extract_knowledge(conversation) + + self.db.commit() + except Exception as e: + logger.error(f"Error learning from conversation: {str(e)}", exc_info=True) + self.db.rollback() + + def _learn_from_feedback(self, conversation: AIConversation, feedback: AIConversationFeedback): + """Learn from user feedback and corrections""" + try: + # If user provided correction, create knowledge entry + if feedback.correction: + knowledge = AIKnowledgeEntry( + topic=self._extract_topic(conversation.user_query), + question=conversation.user_query, + answer=feedback.correction, + keywords=self._extract_keywords(conversation.user_query), + related_intent=conversation.intent, + source='user_feedback', + confidence=75.0, + user_role=conversation.user_role, + created_by_user_id=feedback.user_id + ) + self.db.add(knowledge) + + # Update pattern confidence based on feedback + patterns = self.db.query(AILearnedPattern).filter( + AILearnedPattern.source_conversation_id == conversation.id + ).all() + + for pattern in patterns: + if feedback.is_helpful: + pattern.confidence_score = min(100.0, pattern.confidence_score + 2.0) + pattern.success_count += 1 + elif feedback.is_helpful == False: + pattern.confidence_score = max(0.0, pattern.confidence_score - 5.0) + + if feedback.is_correct == False: + pattern.is_active = False # Deactivate incorrect patterns + + self.db.commit() + except Exception as e: + logger.error(f"Error learning from feedback: {str(e)}", exc_info=True) + self.db.rollback() + + def _extract_keywords(self, text: str) -> List[str]: + """Extract keywords from text""" + # Remove common stop words + stop_words = { + 'the', 'a', 'an', 'and', 'or', 'but', 'in', 'on', 'at', 'to', 'for', + 'of', 'with', 'by', 'from', 'as', 'is', 'are', 'was', 'were', 'be', + 'been', 'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would', + 'should', 'could', 'may', 'might', 'can', 'this', 'that', 'these', + 'those', 'i', 'you', 'he', 'she', 'it', 'we', 'they', 'me', 'him', + 'her', 'us', 'them', 'my', 'your', 'his', 'her', 'its', 'our', 'their', + 'what', 'which', 'who', 'whom', 'whose', 'where', 'when', 'why', 'how', + 'show', 'tell', 'give', 'get', 'find', 'search', 'list', 'all' + } + + # Extract words + words = re.findall(r'\b[a-z]+\b', text.lower()) + keywords = [w for w in words if w not in stop_words and len(w) > 2] + + # Count frequency and return top keywords + word_freq = Counter(keywords) + return [word for word, _ in word_freq.most_common(10)] + + def _extract_topic(self, query: str) -> str: + """Extract topic from query""" + # Simple topic extraction - can be enhanced + keywords = self._extract_keywords(query) + if keywords: + return keywords[0].title() + return "General" + + def train_from_history(self, days: int = 7) -> Dict[str, Any]: + """Train AI from recent conversation history""" + try: + cutoff_date = datetime.utcnow() - timedelta(days=days) + + # Get conversations from last N days + conversations = self.db.query(AIConversation).filter( + AIConversation.created_at >= cutoff_date + ).all() + + trained_patterns = 0 + trained_knowledge = 0 + improved_patterns = 0 + + for conv in conversations: + # Learn from helpful conversations + if conv.is_helpful is True: + self._learn_from_conversation(conv) + trained_patterns += 1 + + # Get feedback for this conversation + feedbacks = self.db.query(AIConversationFeedback).filter( + AIConversationFeedback.conversation_id == conv.id + ).all() + + for feedback in feedbacks: + if feedback.correction: + # Create knowledge entry from correction + knowledge = AIKnowledgeEntry( + topic=self._extract_topic(conv.user_query), + question=conv.user_query, + answer=feedback.correction, + keywords=self._extract_keywords(conv.user_query), + related_intent=conv.intent, + source='training', + confidence=80.0, + user_role=conv.user_role + ) + self.db.add(knowledge) + trained_knowledge += 1 + + self.db.commit() + + # Update training metrics + self._update_training_metrics() + + return { + "conversations_analyzed": len(conversations), + "patterns_trained": trained_patterns, + "knowledge_entries_created": trained_knowledge, + "improved_patterns": improved_patterns + } + except Exception as e: + logger.error(f"Error in training: {str(e)}", exc_info=True) + self.db.rollback() + return {"error": str(e)} + + def _update_training_metrics(self): + """Update training metrics""" + try: + today = datetime.utcnow().date() + + # Calculate metrics + total_conversations = self.db.query(AIConversation).count() + total_patterns = self.db.query(AILearnedPattern).filter( + AILearnedPattern.is_active == True + ).count() + total_knowledge = self.db.query(AIKnowledgeEntry).filter( + AIKnowledgeEntry.is_verified == True + ).count() + + # Average response time + avg_response_time = self.db.query( + func.avg(AIConversation.response_time_ms) + ).filter( + AIConversation.response_time_ms.isnot(None) + ).scalar() + + # Average rating + avg_rating = self.db.query( + func.avg(AIConversationFeedback.rating) + ).filter( + AIConversationFeedback.rating.isnot(None) + ).scalar() + + # Helpful rate + total_with_feedback = self.db.query(AIConversation).filter( + AIConversation.is_helpful.isnot(None) + ).count() + helpful_count = self.db.query(AIConversation).filter( + AIConversation.is_helpful == True + ).count() + helpful_rate = (helpful_count / total_with_feedback * 100) if total_with_feedback > 0 else None + + # Create or update metrics + metrics = self.db.query(AITrainingMetrics).filter( + func.date(AITrainingMetrics.metric_date) == today + ).first() + + if not metrics: + metrics = AITrainingMetrics(metric_date=datetime.utcnow()) + self.db.add(metrics) + + metrics.total_conversations = total_conversations + metrics.total_patterns_learned = total_patterns + metrics.total_knowledge_entries = total_knowledge + metrics.average_response_time_ms = int(avg_response_time) if avg_response_time else None + metrics.average_rating = float(avg_rating) if avg_rating else None + metrics.helpful_rate = float(helpful_rate) if helpful_rate else None + + self.db.commit() + except Exception as e: + logger.error(f"Error updating training metrics: {str(e)}", exc_info=True) + self.db.rollback() + + def auto_train_from_all_conversations(self) -> Dict[str, Any]: + """Automatically train from all conversations - self-learning method""" + try: + logger.info("Starting automatic self-training from all conversations...") + + # Get all conversations that haven't been processed for learning + # Process conversations from last 30 days by default + cutoff_date = datetime.utcnow() - timedelta(days=30) + conversations = self.db.query(AIConversation).filter( + AIConversation.created_at >= cutoff_date + ).order_by(desc(AIConversation.created_at)).all() + + trained_patterns = 0 + created_knowledge = 0 + improved_patterns = 0 + analyzed_conversations = 0 + + for conv in conversations: + analyzed_conversations += 1 + + # Always learn from conversations (even without explicit feedback) + # The AI learns from patterns in successful responses + if conv.is_helpful is not False: # Learn from helpful or neutral conversations + # Extract and save knowledge automatically + self._auto_extract_knowledge(conv) + created_knowledge += 1 + + # Learn patterns from all conversations + self._learn_from_conversation(conv) + trained_patterns += 1 + + # Auto-optimize patterns based on usage and success + improved_patterns = self._auto_optimize_patterns() + + # Auto-merge similar patterns + merged = self._auto_merge_similar_patterns() + + # Update metrics + self._update_training_metrics() + + logger.info(f"Auto-training completed: {analyzed_conversations} conversations analyzed, " + f"{trained_patterns} patterns trained, {created_knowledge} knowledge entries created, " + f"{improved_patterns} patterns improved, {merged} patterns merged") + + return { + "status": "success", + "conversations_analyzed": analyzed_conversations, + "patterns_trained": trained_patterns, + "knowledge_entries_created": created_knowledge, + "patterns_improved": improved_patterns, + "patterns_merged": merged, + "timestamp": datetime.utcnow().isoformat() + } + except Exception as e: + logger.error(f"Error in auto-training: {str(e)}", exc_info=True) + self.db.rollback() + return {"status": "error", "error": str(e)} + + def _auto_extract_knowledge(self, conversation: AIConversation): + """Automatically extract knowledge from conversations""" + try: + # Check if similar knowledge already exists + keywords = self._extract_keywords(conversation.user_query) + existing = self.db.query(AIKnowledgeEntry).filter( + and_( + AIKnowledgeEntry.question.ilike(f"%{conversation.user_query[:50]}%"), + or_( + AIKnowledgeEntry.user_role == conversation.user_role, + AIKnowledgeEntry.user_role.is_(None) + ) + ) + ).first() + + if not existing: + # Create new knowledge entry (only for helpful or neutral conversations) + # Don't learn from explicitly unhelpful responses + if conversation.is_helpful is not False: + knowledge = AIKnowledgeEntry( + topic=self._extract_topic(conversation.user_query), + question=conversation.user_query, + answer=conversation.ai_response, + keywords=keywords, + related_intent=conversation.intent, + source='auto_learned', + confidence=60.0 if conversation.is_helpful is True else 50.0, + user_role=conversation.user_role, + is_verified=False # Auto-learned entries need verification + ) + self.db.add(knowledge) + else: + # Update existing knowledge if this response is better + # Increase confidence if response is marked as helpful + existing.usage_count += 1 + if conversation.is_helpful is True: + existing.confidence = min(100.0, existing.confidence + 5.0) + existing.success_count += 1 + # Update answer if confidence is high enough + if existing.confidence >= 80.0: + existing.answer = conversation.ai_response + existing.updated_at = datetime.utcnow() + elif conversation.is_helpful is False: + existing.confidence = max(20.0, existing.confidence - 3.0) + else: + # Neutral - slight increase + existing.confidence = min(100.0, existing.confidence + 1.0) + existing.success_count += 1 + + existing.last_used_at = datetime.utcnow() + + # Don't commit here - let the caller commit + except Exception as e: + logger.error(f"Error auto-extracting knowledge: {str(e)}", exc_info=True) + # Don't rollback here - let the caller handle it + + def _auto_optimize_patterns(self) -> int: + """Automatically optimize patterns based on performance""" + try: + improved = 0 + + # Get all active patterns + patterns = self.db.query(AILearnedPattern).filter( + AILearnedPattern.is_active == True + ).all() + + for pattern in patterns: + # Calculate success rate + if pattern.usage_count > 0: + success_rate = (pattern.success_count / pattern.usage_count) * 100 + + # Adjust confidence based on success rate + if success_rate >= 80: + # High success rate - increase confidence + pattern.confidence_score = min(100.0, pattern.confidence_score + 1.0) + improved += 1 + elif success_rate < 50 and pattern.usage_count >= 5: + # Low success rate - decrease confidence or deactivate + pattern.confidence_score = max(0.0, pattern.confidence_score - 2.0) + if pattern.confidence_score < 30: + pattern.is_active = False + logger.info(f"Deactivated low-performing pattern {pattern.id}") + improved += 1 + + # Update last used timestamp + pattern.updated_at = datetime.utcnow() + + self.db.commit() + return improved + except Exception as e: + logger.error(f"Error optimizing patterns: {str(e)}", exc_info=True) + self.db.rollback() + return 0 + + def _auto_merge_similar_patterns(self) -> int: + """Automatically merge similar patterns to reduce redundancy""" + try: + merged = 0 + + # Get patterns with same intent and role + patterns_by_intent = {} + all_patterns = self.db.query(AILearnedPattern).filter( + AILearnedPattern.is_active == True + ).all() + + for pattern in all_patterns: + key = (pattern.intent, pattern.user_role) + if key not in patterns_by_intent: + patterns_by_intent[key] = [] + patterns_by_intent[key].append(pattern) + + # Merge similar patterns within each intent group + for (intent, role), patterns in patterns_by_intent.items(): + if len(patterns) < 2: + continue + + # Sort by confidence and usage + patterns.sort(key=lambda p: (p.confidence_score, p.usage_count), reverse=True) + + # Keep the best pattern and merge others into it + best_pattern = patterns[0] + for pattern in patterns[1:]: + # Check if patterns are similar (same keywords or similar query pattern) + best_keywords = set(json.loads(best_pattern.pattern_keywords) if best_pattern.pattern_keywords else []) + pattern_keywords = set(json.loads(pattern.pattern_keywords) if pattern.pattern_keywords else []) + + # If 70% keywords overlap, merge them + if best_keywords and pattern_keywords: + overlap = len(best_keywords & pattern_keywords) / len(best_keywords | pattern_keywords) + if overlap >= 0.7: + # Merge: combine usage counts and update confidence + best_pattern.usage_count += pattern.usage_count + best_pattern.success_count += pattern.success_count + best_pattern.confidence_score = ( + (best_pattern.confidence_score * best_pattern.usage_count + + pattern.confidence_score * pattern.usage_count) / + (best_pattern.usage_count + pattern.usage_count) + ) + + # Deactivate the merged pattern + pattern.is_active = False + merged += 1 + logger.info(f"Merged pattern {pattern.id} into {best_pattern.id}") + + self.db.commit() + return merged + except Exception as e: + logger.error(f"Error merging patterns: {str(e)}", exc_info=True) + self.db.rollback() + return 0 + + def auto_analyze_and_improve(self) -> Dict[str, Any]: + """Automatically analyze performance and improve - self-improvement method""" + try: + logger.info("Starting automatic self-analysis and improvement...") + + # Analyze conversation quality + recent_conversations = self.db.query(AIConversation).filter( + AIConversation.created_at >= datetime.utcnow() - timedelta(days=7) + ).all() + + # Find patterns in successful vs unsuccessful conversations + successful_queries = [] + unsuccessful_queries = [] + + for conv in recent_conversations: + if conv.is_helpful is True: + successful_queries.append(conv.user_query) + elif conv.is_helpful is False: + unsuccessful_queries.append(conv.user_query) + + # Extract common patterns from successful queries + if successful_queries: + common_success_keywords = self._find_common_keywords(successful_queries) + logger.info(f"Common keywords in successful queries: {common_success_keywords[:10]}") + + # Identify problematic patterns + if unsuccessful_queries: + common_failure_keywords = self._find_common_keywords(unsuccessful_queries) + logger.info(f"Common keywords in unsuccessful queries: {common_failure_keywords[:10]}") + + # Improve knowledge entries based on usage + improved_knowledge = self._improve_knowledge_entries() + + # Clean up old inactive patterns + cleaned = self._cleanup_old_patterns() + + # Update metrics + self._update_training_metrics() + + return { + "status": "success", + "knowledge_entries_improved": improved_knowledge, + "old_patterns_cleaned": cleaned, + "timestamp": datetime.utcnow().isoformat() + } + except Exception as e: + logger.error(f"Error in auto-analysis: {str(e)}", exc_info=True) + return {"status": "error", "error": str(e)} + + def _find_common_keywords(self, queries: List[str]) -> List[str]: + """Find common keywords across multiple queries""" + all_keywords = [] + for query in queries: + keywords = self._extract_keywords(query) + all_keywords.extend(keywords) + + # Count frequency + keyword_freq = Counter(all_keywords) + return [word for word, _ in keyword_freq.most_common(20)] + + def _improve_knowledge_entries(self) -> int: + """Improve knowledge entries based on usage statistics""" + try: + improved = 0 + + # Get knowledge entries with usage data + entries = self.db.query(AIKnowledgeEntry).filter( + AIKnowledgeEntry.usage_count > 0 + ).all() + + for entry in entries: + # Calculate success rate + if entry.usage_count > 0: + success_rate = (entry.success_count / entry.usage_count) * 100 + + # Auto-verify entries with high success rate + if success_rate >= 85 and entry.usage_count >= 5 and not entry.is_verified: + entry.is_verified = True + entry.confidence = min(100.0, entry.confidence + 10.0) + improved += 1 + logger.info(f"Auto-verified knowledge entry {entry.id} (success rate: {success_rate:.1f}%)") + + # Increase confidence for successful entries + elif success_rate >= 70: + entry.confidence = min(100.0, entry.confidence + 2.0) + improved += 1 + + # Decrease confidence for unsuccessful entries + elif success_rate < 40 and entry.usage_count >= 3: + entry.confidence = max(20.0, entry.confidence - 5.0) + improved += 1 + + self.db.commit() + return improved + except Exception as e: + logger.error(f"Error improving knowledge entries: {str(e)}", exc_info=True) + self.db.rollback() + return 0 + + def _cleanup_old_patterns(self) -> int: + """Clean up old inactive or low-performing patterns""" + try: + cutoff_date = datetime.utcnow() - timedelta(days=90) + + # Find patterns that haven't been used in 90 days and have low confidence + old_patterns = self.db.query(AILearnedPattern).filter( + and_( + or_( + AILearnedPattern.last_used_at < cutoff_date, + AILearnedPattern.last_used_at.is_(None) + ), + AILearnedPattern.confidence_score < 40.0, + AILearnedPattern.is_active == True + ) + ).all() + + cleaned = 0 + for pattern in old_patterns: + pattern.is_active = False + cleaned += 1 + + self.db.commit() + logger.info(f"Cleaned up {cleaned} old inactive patterns") + return cleaned + except Exception as e: + logger.error(f"Error cleaning up patterns: {str(e)}", exc_info=True) + self.db.rollback() + return 0 + diff --git a/Backend/src/ai/services/ai_role_access_service.py b/Backend/src/ai/services/ai_role_access_service.py new file mode 100644 index 00000000..82b54591 --- /dev/null +++ b/Backend/src/ai/services/ai_role_access_service.py @@ -0,0 +1,383 @@ +""" +Enterprise Role-Based Access Control Service for AI Assistant +Filters and controls data access based on user roles +""" + +from typing import Dict, List, Optional, Any +from datetime import datetime, timedelta +from sqlalchemy.orm import Session, joinedload +from sqlalchemy import and_, or_, func +import logging + +from ...auth.models.user import User +from ...auth.models.role import Role +from ...bookings.models.booking import Booking, BookingStatus +from ...payments.models.invoice import Invoice +from ...payments.models.payment import Payment, PaymentStatus +from ...rooms.models.room import Room, RoomStatus +from ...shared.config.logging_config import get_logger + +logger = get_logger(__name__) + + +class AIRoleAccessService: + """Role-based data access control for AI Assistant""" + + def __init__(self, db: Session, current_user: User): + self.db = db + self.current_user = current_user + + # Load user role - try from relationship first, then query + self.user_role = None + if hasattr(current_user, 'role') and current_user.role: + self.user_role = current_user.role + + if not self.user_role: + self.user_role = db.query(Role).filter(Role.id == current_user.role_id).first() + + if not self.user_role: + # Fallback to customer role if not found + logger.warning(f"Role not found for user {current_user.id}, defaulting to customer") + self.user_role = db.query(Role).filter(Role.name == 'customer').first() + + self.role_name = self.user_role.name.lower() if self.user_role else "customer" + + def get_user_bookings(self, limit: int = 10) -> List[Dict[str, Any]]: + """Get bookings based on role permissions""" + if self.role_name in ["admin", "staff"]: + # Admin and staff can see all bookings + bookings = self.db.query(Booking).options( + joinedload(Booking.user), + joinedload(Booking.room).joinedload(Room.room_type) + ).order_by(Booking.created_at.desc()).limit(limit).all() + elif self.role_name == "accountant": + # Accountant can see all bookings (for invoicing purposes) + bookings = self.db.query(Booking).options( + joinedload(Booking.user), + joinedload(Booking.room).joinedload(Room.room_type) + ).order_by(Booking.created_at.desc()).limit(limit).all() + else: + # Customers can only see their own bookings + bookings = self.db.query(Booking).options( + joinedload(Booking.user), + joinedload(Booking.room).joinedload(Room.room_type) + ).filter(Booking.user_id == self.current_user.id).order_by( + Booking.created_at.desc() + ).limit(limit).all() + + result = [] + for booking in bookings: + booking_dict = { + "booking_number": booking.booking_number, + "status": booking.status.value if hasattr(booking.status, 'value') else str(booking.status), + "check_in": booking.check_in_date.isoformat(), + "check_out": booking.check_out_date.isoformat(), + "num_guests": booking.num_guests, + "total_price": float(booking.total_price) if booking.total_price else 0, + } + + # Add user info based on role + if self.role_name in ["admin", "staff", "accountant"]: + booking_dict["guest_name"] = booking.user.full_name if booking.user else "Unknown" + booking_dict["guest_email"] = booking.user.email if booking.user else None + else: + booking_dict["guest_name"] = "Your booking" + + # Add room info + if booking.room: + booking_dict["room_number"] = booking.room.room_number + if booking.room.room_type: + booking_dict["room_type"] = booking.room.room_type.name + + result.append(booking_dict) + + return result + + def get_user_invoices(self, limit: int = 10) -> List[Dict[str, Any]]: + """Get invoices based on role permissions""" + if self.role_name in ["admin", "accountant"]: + # Admin and accountant can see all invoices + invoices = self.db.query(Invoice).options( + joinedload(Invoice.user), + joinedload(Invoice.booking) + ).order_by(Invoice.created_at.desc()).limit(limit).all() + elif self.role_name == "staff": + # Staff can view invoices but not edit + invoices = self.db.query(Invoice).options( + joinedload(Invoice.user), + joinedload(Invoice.booking) + ).order_by(Invoice.created_at.desc()).limit(limit).all() + else: + # Customers can only see their own invoices + invoices = self.db.query(Invoice).options( + joinedload(Invoice.user), + joinedload(Invoice.booking) + ).filter(Invoice.user_id == self.current_user.id).order_by( + Invoice.created_at.desc() + ).limit(limit).all() + + result = [] + for invoice in invoices: + invoice_dict = { + "invoice_number": invoice.invoice_number, + "status": invoice.status.value if hasattr(invoice.status, 'value') else str(invoice.status), + "total_amount": float(invoice.total_amount) if invoice.total_amount else 0, + "balance_due": float(invoice.balance_due) if invoice.balance_due else 0, + "due_date": invoice.due_date.isoformat() if invoice.due_date else None, + "paid_date": invoice.paid_date.isoformat() if invoice.paid_date else None, + } + + # Add user info based on role + if self.role_name in ["admin", "staff", "accountant"]: + invoice_dict["customer_name"] = invoice.customer_name if hasattr(invoice, 'customer_name') else ( + invoice.user.full_name if invoice.user else "Unknown" + ) + invoice_dict["customer_email"] = invoice.customer_email if hasattr(invoice, 'customer_email') else ( + invoice.user.email if invoice.user else None + ) + else: + invoice_dict["customer_name"] = "Your invoice" + + if invoice.booking: + invoice_dict["booking_number"] = invoice.booking.booking_number + + result.append(invoice_dict) + + return result + + def get_user_payments(self, limit: Optional[int] = 10) -> List[Dict[str, Any]]: + """Get payments based on role permissions""" + if self.role_name in ["admin", "accountant"]: + # Admin and accountant can see all payments + query = self.db.query(Payment).options( + joinedload(Payment.booking).joinedload(Booking.user) + ).order_by(Payment.created_at.desc()) + if limit: + payments = query.limit(limit).all() + else: + payments = query.all() + elif self.role_name == "staff": + # Staff can see payment status but limited details + query = self.db.query(Payment).options( + joinedload(Payment.booking).joinedload(Booking.user) + ).order_by(Payment.created_at.desc()) + if limit: + payments = query.limit(limit).all() + else: + payments = query.all() + else: + # Customers can only see their own payments + query = self.db.query(Payment).options( + joinedload(Payment.booking) + ).join(Booking).filter(Booking.user_id == self.current_user.id).order_by( + Payment.created_at.desc() + ) + if limit: + payments = query.limit(limit).all() + else: + payments = query.all() + + result = [] + for payment in payments: + payment_type = payment.payment_type.value if hasattr(payment.payment_type, 'value') else str(payment.payment_type) + + # Format payment type with deposit percentage if available + if payment_type == 'deposit' and payment.deposit_percentage: + payment_type_display = f"Deposit ({payment.deposit_percentage}%)" + elif payment_type == 'deposit': + payment_type_display = "Deposit (20%)" # Default + elif payment_type == 'full': + payment_type_display = "Full Payment" + elif payment_type == 'remaining': + payment_type_display = "Remaining" + else: + payment_type_display = payment_type + + payment_dict = { + "id": payment.id, + "amount": float(payment.amount) if payment.amount else 0, + "payment_method": payment.payment_method.value if hasattr(payment.payment_method, 'value') else str(payment.payment_method), + "payment_type": payment_type, + "payment_type_display": payment_type_display, + "payment_status": payment.payment_status.value if hasattr(payment.payment_status, 'value') else str(payment.payment_status), + "payment_date": payment.payment_date.isoformat() if payment.payment_date else None, + "transaction_id": payment.transaction_id or f"PAY-{payment.id}", + "deposit_percentage": payment.deposit_percentage, + } + + if payment.booking: + payment_dict["booking_number"] = payment.booking.booking_number + + # Add user info based on role + if self.role_name in ["admin", "staff", "accountant"] and payment.booking.user: + payment_dict["customer_name"] = payment.booking.user.full_name + payment_dict["customer_email"] = payment.booking.user.email + else: + payment_dict["customer_name"] = "Your payment" + + result.append(payment_dict) + + return result + + def get_all_payments(self) -> List[Dict[str, Any]]: + """Get all payments without limit - for admin and accountant only""" + if self.role_name not in ["admin", "accountant"]: + return [] + return self.get_user_payments(limit=None) + + def get_room_status_summary(self) -> Dict[str, Any]: + """Get room status summary based on role permissions""" + total_rooms = self.db.query(Room).count() + available_rooms = self.db.query(Room).filter(Room.status == RoomStatus.available).count() + occupied_rooms = self.db.query(Room).filter(Room.status == RoomStatus.occupied).count() + + result = { + "total_rooms": total_rooms, + "available": available_rooms, + "occupied": occupied_rooms, + } + + # Additional details for admin/staff + if self.role_name in ["admin", "staff"]: + maintenance_rooms = self.db.query(Room).filter(Room.status == RoomStatus.maintenance).count() + cleaning_rooms = self.db.query(Room).filter(Room.status == RoomStatus.cleaning).count() + + today = datetime.utcnow().date() + rooms_with_bookings = self.db.query(Booking).filter( + and_( + Booking.status != BookingStatus.cancelled, + Booking.check_in_date <= today, + Booking.check_out_date > today + ) + ).count() + + result.update({ + "maintenance": maintenance_rooms, + "cleaning": cleaning_rooms, + "rooms_with_active_bookings": rooms_with_bookings, + "occupancy_rate": round((occupied_rooms / total_rooms * 100) if total_rooms > 0 else 0, 2) + }) + else: + # Customers get simplified room availability info + result["occupancy_rate"] = round((occupied_rooms / total_rooms * 100) if total_rooms > 0 else 0, 2) + + return result + + def get_payment_summary(self, days: int = 30) -> Optional[Dict[str, Any]]: + """Get payment summary - only for admin, accountant, and staff""" + if self.role_name not in ["admin", "accountant", "staff"]: + return None # Customers cannot access payment summaries + + today = datetime.utcnow().date() + start_date = today - timedelta(days=days) + + # Total payments in period + total_payments = self.db.query(func.sum(Payment.amount)).filter( + and_( + Payment.payment_status == PaymentStatus.completed, + func.date(Payment.payment_date) >= start_date, + func.date(Payment.payment_date) <= today + ) + ).scalar() or 0 + + # Pending payments + pending_payments = self.db.query(func.sum(Payment.amount)).filter( + Payment.payment_status == PaymentStatus.pending + ).scalar() or 0 + + # Payment count + completed_count = self.db.query(Payment).filter( + and_( + Payment.payment_status == PaymentStatus.completed, + func.date(Payment.payment_date) >= start_date + ) + ).count() + + result = { + "total_revenue": float(total_payments), + "pending_amount": float(pending_payments), + "completed_payments": completed_count, + "period_days": days + } + + # Additional details for admin and accountant + if self.role_name in ["admin", "accountant"]: + failed_count = self.db.query(Payment).filter( + Payment.payment_status == PaymentStatus.failed + ).count() + result["failed_payments"] = failed_count + + return result + + def get_invoice_summary(self) -> Optional[Dict[str, Any]]: + """Get invoice summary - only for admin, accountant, and staff""" + if self.role_name not in ["admin", "accountant", "staff"]: + return None # Customers cannot access invoice summaries + + total_invoices = self.db.query(Invoice).count() + + # Group by status + status_counts = {} + invoices = self.db.query(Invoice).all() + for invoice in invoices: + status = invoice.status.value if hasattr(invoice.status, 'value') else str(invoice.status) + status_counts[status] = status_counts.get(status, 0) + 1 + + # Overdue invoices + today = datetime.utcnow().date() + overdue_count = self.db.query(Invoice).filter( + and_( + Invoice.due_date < today, + Invoice.status != 'paid' + ) + ).count() + + result = { + "total_invoices": total_invoices, + "status_breakdown": status_counts, + "overdue_invoices": overdue_count + } + + return result + + def can_access_feature(self, feature: str) -> bool: + """Check if current user can access a feature""" + if self.role_name == "admin": + return True + + feature_lower = feature.lower() + + # Define feature access rules + if feature_lower in ["payment_summary", "invoice_summary", "financial_reports"]: + return self.role_name in ["admin", "accountant", "staff"] + + if feature_lower in ["all_bookings", "all_users", "system_settings"]: + return self.role_name == "admin" + + if feature_lower in ["operational_reports", "room_management", "maintenance"]: + return self.role_name in ["admin", "staff"] + + # Default: allow if it's user's own data + return True + + def filter_sensitive_data(self, data: Dict[str, Any], data_type: str) -> Dict[str, Any]: + """Filter sensitive data based on role""" + if self.role_name == "admin": + return data # Admin sees everything + + filtered = data.copy() + + # Remove sensitive financial data for staff + if self.role_name == "staff" and data_type in ["payment", "invoice"]: + if "transaction_id" in filtered: + filtered["transaction_id"] = "***" if filtered.get("transaction_id") else None + if "payment_method_details" in filtered: + del filtered["payment_method_details"] + + # Remove other users' personal info for non-admin roles + if self.role_name != "admin" and data_type in ["booking", "invoice", "payment"]: + # Only show own data, not other users' details + pass # This is handled at query level + + return filtered + diff --git a/Backend/src/ai/services/ai_training_scheduler.py b/Backend/src/ai/services/ai_training_scheduler.py new file mode 100644 index 00000000..6b74f84e --- /dev/null +++ b/Backend/src/ai/services/ai_training_scheduler.py @@ -0,0 +1,171 @@ +""" +AI Training Scheduler - Automatic background training for AI self-learning +Runs periodic training tasks to improve AI performance autonomously +""" + +import threading +import time +from datetime import datetime, timedelta +from typing import Optional +from sqlalchemy.orm import Session +import logging + +from ...shared.config.database import get_db +from ...shared.config.logging_config import get_logger +from .ai_learning_service import AILearningService + +logger = get_logger(__name__) + + +class AITrainingScheduler: + """Background scheduler for automatic AI training""" + + def __init__(self): + self.running = False + self.thread: Optional[threading.Thread] = None + self.training_interval_hours = 6 # Train every 6 hours + self.analysis_interval_hours = 24 # Analyze every 24 hours + self.last_training_time: Optional[datetime] = None + self.last_analysis_time: Optional[datetime] = None + + def start(self): + """Start the background training scheduler""" + if self.running: + logger.warning("AI Training Scheduler is already running") + return + + self.running = True + self.thread = threading.Thread(target=self._scheduler_loop, daemon=True) + self.thread.start() + logger.info("AI Training Scheduler started - automatic self-learning enabled") + + def stop(self): + """Stop the background training scheduler""" + if not self.running: + return + + self.running = False + if self.thread: + self.thread.join(timeout=5.0) + logger.info("AI Training Scheduler stopped") + + def _scheduler_loop(self): + """Main scheduler loop that runs training tasks periodically""" + logger.info("AI Training Scheduler loop started") + + # Run initial training after 1 minute (to let app fully start) + time.sleep(60) + + while self.running: + try: + current_time = datetime.utcnow() + + # Check if it's time for training + should_train = False + if self.last_training_time is None: + should_train = True + else: + time_since_training = current_time - self.last_training_time + if time_since_training >= timedelta(hours=self.training_interval_hours): + should_train = True + + if should_train: + logger.info("Starting scheduled automatic training...") + self._run_training() + self.last_training_time = current_time + + # Check if it's time for analysis + should_analyze = False + if self.last_analysis_time is None: + should_analyze = True + else: + time_since_analysis = current_time - self.last_analysis_time + if time_since_analysis >= timedelta(hours=self.analysis_interval_hours): + should_analyze = True + + if should_analyze: + logger.info("Starting scheduled automatic analysis...") + self._run_analysis() + self.last_analysis_time = current_time + + # Sleep for 1 hour before checking again + time.sleep(3600) + + except Exception as e: + logger.error(f"Error in scheduler loop: {str(e)}", exc_info=True) + # Sleep for 10 minutes before retrying on error + time.sleep(600) + + def _run_training(self): + """Run automatic training from conversations""" + try: + # Get database session + db_gen = get_db() + db = next(db_gen) + + try: + learning_service = AILearningService(db) + result = learning_service.auto_train_from_all_conversations() + + if result.get("status") == "success": + logger.info( + f"Automatic training completed: " + f"{result.get('conversations_analyzed', 0)} conversations analyzed, " + f"{result.get('patterns_trained', 0)} patterns trained, " + f"{result.get('knowledge_entries_created', 0)} knowledge entries created" + ) + else: + logger.warning(f"Training completed with errors: {result.get('error', 'Unknown error')}") + finally: + db.close() + except Exception as e: + logger.error(f"Error running automatic training: {str(e)}", exc_info=True) + + def _run_analysis(self): + """Run automatic analysis and improvement""" + try: + # Get database session + db_gen = get_db() + db = next(db_gen) + + try: + learning_service = AILearningService(db) + result = learning_service.auto_analyze_and_improve() + + if result.get("status") == "success": + logger.info( + f"Automatic analysis completed: " + f"{result.get('knowledge_entries_improved', 0)} knowledge entries improved, " + f"{result.get('old_patterns_cleaned', 0)} old patterns cleaned" + ) + else: + logger.warning(f"Analysis completed with errors: {result.get('error', 'Unknown error')}") + finally: + db.close() + except Exception as e: + logger.error(f"Error running automatic analysis: {str(e)}", exc_info=True) + + def trigger_manual_training(self): + """Manually trigger training (for testing or on-demand training)""" + logger.info("Manual training triggered") + self._run_training() + self.last_training_time = datetime.utcnow() + + def trigger_manual_analysis(self): + """Manually trigger analysis (for testing or on-demand analysis)""" + logger.info("Manual analysis triggered") + self._run_analysis() + self.last_analysis_time = datetime.utcnow() + + +# Global scheduler instance +_global_scheduler: Optional[AITrainingScheduler] = None + + +def get_training_scheduler() -> AITrainingScheduler: + """Get or create the global training scheduler instance""" + global _global_scheduler + if _global_scheduler is None: + _global_scheduler = AITrainingScheduler() + return _global_scheduler + diff --git a/Backend/src/analytics/__init__.py b/Backend/src/analytics/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/analytics/models/__init__.py b/Backend/src/analytics/models/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/models/audit_log.py b/Backend/src/analytics/models/audit_log.py similarity index 95% rename from Backend/src/models/audit_log.py rename to Backend/src/analytics/models/audit_log.py index d0d4d187..f4932d0f 100644 --- a/Backend/src/models/audit_log.py +++ b/Backend/src/analytics/models/audit_log.py @@ -1,7 +1,7 @@ from sqlalchemy import Column, Integer, String, Text, DateTime, ForeignKey, JSON from sqlalchemy.orm import relationship from datetime import datetime -from ..config.database import Base +from ...shared.config.database import Base class AuditLog(Base): __tablename__ = 'audit_logs' diff --git a/Backend/src/analytics/routes/__init__.py b/Backend/src/analytics/routes/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/routes/analytics_routes.py b/Backend/src/analytics/routes/analytics_routes.py similarity index 98% rename from Backend/src/routes/analytics_routes.py rename to Backend/src/analytics/routes/analytics_routes.py index bce4abd2..32c00c0d 100644 --- a/Backend/src/routes/analytics_routes.py +++ b/Backend/src/analytics/routes/analytics_routes.py @@ -1,9 +1,9 @@ from fastapi import APIRouter, Depends, HTTPException, Query from sqlalchemy.orm import Session from typing import Optional -from ..config.database import get_db -from ..middleware.auth import authorize_roles, get_current_user -from ..models.user import User +from ...shared.config.database import get_db +from ...security.middleware.auth import authorize_roles, get_current_user +from ...auth.models.user import User from ..services.analytics_service import AnalyticsService router = APIRouter(prefix='/analytics', tags=['analytics']) diff --git a/Backend/src/routes/audit_routes.py b/Backend/src/analytics/routes/audit_routes.py similarity index 97% rename from Backend/src/routes/audit_routes.py rename to Backend/src/analytics/routes/audit_routes.py index 2dba67b2..776a7549 100644 --- a/Backend/src/routes/audit_routes.py +++ b/Backend/src/analytics/routes/audit_routes.py @@ -3,9 +3,9 @@ from sqlalchemy.orm import Session from sqlalchemy import desc, or_, func from typing import Optional from datetime import datetime -from ..config.database import get_db -from ..middleware.auth import get_current_user, authorize_roles -from ..models.user import User +from ...shared.config.database import get_db +from ...security.middleware.auth import get_current_user, authorize_roles +from ...auth.models.user import User from ..models.audit_log import AuditLog router = APIRouter(prefix='/audit-logs', tags=['audit-logs']) diff --git a/Backend/src/routes/report_routes.py b/Backend/src/analytics/routes/report_routes.py similarity index 96% rename from Backend/src/routes/report_routes.py rename to Backend/src/analytics/routes/report_routes.py index 3b24f84f..1adda9ed 100644 --- a/Backend/src/routes/report_routes.py +++ b/Backend/src/analytics/routes/report_routes.py @@ -3,15 +3,15 @@ from sqlalchemy.orm import Session, load_only, joinedload from sqlalchemy import func, and_ from typing import Optional from datetime import datetime, timedelta -from ..config.database import get_db -from ..middleware.auth import get_current_user, authorize_roles -from ..models.user import User -from ..models.booking import Booking, BookingStatus -from ..models.payment import Payment, PaymentStatus -from ..models.room import Room, RoomStatus -from ..models.service_usage import ServiceUsage -from ..models.service import Service -from ..utils.response_helpers import success_response +from ...shared.config.database import get_db +from ...security.middleware.auth import get_current_user, authorize_roles +from ...auth.models.user import User +from ...bookings.models.booking import Booking, BookingStatus +from ...payments.models.payment import Payment, PaymentStatus +from ...rooms.models.room import Room, RoomStatus +from ...hotel_services.models.service_usage import ServiceUsage +from ...hotel_services.models.service import Service +from ...shared.utils.response_helpers import success_response router = APIRouter(prefix='/reports', tags=['reports']) @router.get('') diff --git a/Backend/src/analytics/schemas/__init__.py b/Backend/src/analytics/schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/analytics/services/__init__.py b/Backend/src/analytics/services/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/services/analytics_service.py b/Backend/src/analytics/services/analytics_service.py similarity index 98% rename from Backend/src/services/analytics_service.py rename to Backend/src/analytics/services/analytics_service.py index 3bad04cb..08039977 100644 --- a/Backend/src/services/analytics_service.py +++ b/Backend/src/analytics/services/analytics_service.py @@ -2,15 +2,15 @@ from sqlalchemy.orm import Session, load_only from sqlalchemy import func, and_, or_, case, extract, distinct from typing import Optional, Dict, List, Any from datetime import datetime, timedelta, date -from ..models.booking import Booking, BookingStatus -from ..models.payment import Payment, PaymentStatus, PaymentMethod -from ..models.room import Room, RoomStatus -from ..models.room_type import RoomType -from ..models.user import User -from ..models.service_usage import ServiceUsage -from ..models.service import Service -from ..models.review import Review, ReviewStatus -from ..models.invoice import Invoice +from ...bookings.models.booking import Booking, BookingStatus +from ...payments.models.payment import Payment, PaymentStatus, PaymentMethod +from ...rooms.models.room import Room, RoomStatus +from ...rooms.models.room_type import RoomType +from ...auth.models.user import User +from ...hotel_services.models.service_usage import ServiceUsage +from ...hotel_services.models.service import Service +from ...reviews.models.review import Review, ReviewStatus +from ...payments.models.invoice import Invoice import logging logger = logging.getLogger(__name__) @@ -290,7 +290,7 @@ class AnalyticsService: start_date = end_date - timedelta(days=30) # Get staff users - from ..models.role import Role + from ...auth.models.role import Role staff_users = db.query(User).join(Role, User.role_id == Role.id).filter( or_(Role.name == 'staff', Role.name == 'admin') ).all() diff --git a/Backend/src/services/audit_service.py b/Backend/src/analytics/services/audit_service.py similarity index 95% rename from Backend/src/services/audit_service.py rename to Backend/src/analytics/services/audit_service.py index cfcc404a..8853b08b 100644 --- a/Backend/src/services/audit_service.py +++ b/Backend/src/analytics/services/audit_service.py @@ -2,7 +2,7 @@ from sqlalchemy.orm import Session from typing import Optional, Dict, Any from datetime import datetime from ..models.audit_log import AuditLog -from ..config.logging_config import get_logger +from ...shared.config.logging_config import get_logger logger = get_logger(__name__) class AuditService: diff --git a/Backend/src/auth/__init__.py b/Backend/src/auth/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/auth/models/__init__.py b/Backend/src/auth/models/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/models/password_reset_token.py b/Backend/src/auth/models/password_reset_token.py similarity index 94% rename from Backend/src/models/password_reset_token.py rename to Backend/src/auth/models/password_reset_token.py index 358eb7ee..0589f49f 100644 --- a/Backend/src/models/password_reset_token.py +++ b/Backend/src/auth/models/password_reset_token.py @@ -1,7 +1,7 @@ from sqlalchemy import Column, Integer, String, DateTime, Boolean, ForeignKey from sqlalchemy.orm import relationship from datetime import datetime -from ..config.database import Base +from ...shared.config.database import Base class PasswordResetToken(Base): __tablename__ = 'password_reset_tokens' diff --git a/Backend/src/models/refresh_token.py b/Backend/src/auth/models/refresh_token.py similarity index 93% rename from Backend/src/models/refresh_token.py rename to Backend/src/auth/models/refresh_token.py index 92c4fd20..c2f8c4db 100644 --- a/Backend/src/models/refresh_token.py +++ b/Backend/src/auth/models/refresh_token.py @@ -1,7 +1,7 @@ from sqlalchemy import Column, Integer, String, DateTime, ForeignKey from sqlalchemy.orm import relationship from datetime import datetime -from ..config.database import Base +from ...shared.config.database import Base class RefreshToken(Base): __tablename__ = 'refresh_tokens' diff --git a/Backend/src/models/role.py b/Backend/src/auth/models/role.py similarity index 93% rename from Backend/src/models/role.py rename to Backend/src/auth/models/role.py index 61ba98f0..d02350fc 100644 --- a/Backend/src/models/role.py +++ b/Backend/src/auth/models/role.py @@ -1,7 +1,7 @@ from sqlalchemy import Column, Integer, String, DateTime from sqlalchemy.orm import relationship from datetime import datetime -from ..config.database import Base +from ...shared.config.database import Base class Role(Base): __tablename__ = 'roles' diff --git a/Backend/src/models/user.py b/Backend/src/auth/models/user.py similarity index 98% rename from Backend/src/models/user.py rename to Backend/src/auth/models/user.py index 648c895c..c36af38c 100644 --- a/Backend/src/models/user.py +++ b/Backend/src/auth/models/user.py @@ -1,7 +1,7 @@ from sqlalchemy import Column, Integer, String, Boolean, Text, ForeignKey, DateTime, Numeric from sqlalchemy.orm import relationship from datetime import datetime -from ..config.database import Base +from ...shared.config.database import Base class User(Base): __tablename__ = 'users' diff --git a/Backend/src/auth/routes/__init__.py b/Backend/src/auth/routes/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/routes/auth_routes.py b/Backend/src/auth/routes/auth_routes.py similarity index 97% rename from Backend/src/routes/auth_routes.py rename to Backend/src/auth/routes/auth_routes.py index 5981ffdb..88fc6c6c 100644 --- a/Backend/src/routes/auth_routes.py +++ b/Backend/src/auth/routes/auth_routes.py @@ -5,12 +5,12 @@ from pathlib import Path import aiofiles import uuid import os -from ..config.database import get_db +from ...shared.config.database import get_db from ..services.auth_service import auth_service from ..schemas.auth import RegisterRequest, LoginRequest, RefreshTokenRequest, ForgotPasswordRequest, ResetPasswordRequest, AuthResponse, TokenResponse, MessageResponse, MFAInitResponse, EnableMFARequest, VerifyMFARequest, MFAStatusResponse, UpdateProfileRequest -from ..middleware.auth import get_current_user +from ...security.middleware.auth import get_current_user from ..models.user import User -from ..services.audit_service import audit_service +from ...analytics.services.audit_service import audit_service from slowapi import Limiter, _rate_limit_exceeded_handler from slowapi.util import get_remote_address from slowapi.errors import RateLimitExceeded @@ -58,7 +58,7 @@ async def register( try: result = await auth_service.register(db=db, name=register_request.name, email=register_request.email, password=register_request.password, phone=register_request.phone) - from ..config.settings import settings + from ...shared.config.settings import settings max_age = 7 * 24 * 60 * 60 # 7 days for registration # Use secure cookies in production (HTTPS required) # Set access token in httpOnly cookie for security @@ -144,7 +144,7 @@ async def login( status='success' ) return {'status': 'success', 'requires_mfa': True, 'user_id': result['user_id']} - from ..config.settings import settings + from ...shared.config.settings import settings max_age = 7 * 24 * 60 * 60 if login_request.rememberMe else 1 * 24 * 60 * 60 # Use secure cookies in production (HTTPS required) # Set access token in httpOnly cookie for security @@ -215,7 +215,7 @@ async def refresh_token( raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail='Refresh token not found') try: result = await auth_service.refresh_access_token(db, refreshToken) - from ..config.settings import settings + from ...shared.config.settings import settings # Set new access token in httpOnly cookie # Use 'lax' in development for cross-origin support, 'strict' in production samesite_value = 'strict' if settings.is_production else 'lax' @@ -250,7 +250,7 @@ async def logout( await auth_service.logout(db, refreshToken) # Delete both access and refresh token cookies - from ..config.settings import settings + from ...shared.config.settings import settings # Use 'lax' in development for cross-origin support, 'strict' in production samesite_value = 'strict' if settings.is_production else 'lax' response.delete_cookie(key='refreshToken', path='/', secure=settings.is_production, samesite=samesite_value) @@ -320,7 +320,7 @@ async def reset_password(request: ResetPasswordRequest, db: Session=Depends(get_ status_code = status.HTTP_404_NOT_FOUND raise HTTPException(status_code=status_code, detail=str(e)) from ..services.mfa_service import mfa_service -from ..config.settings import settings +from ...shared.config.settings import settings @router.get('/mfa/init') async def init_mfa(current_user: User=Depends(get_current_user), db: Session=Depends(get_db)): @@ -380,7 +380,7 @@ async def regenerate_backup_codes(current_user: User=Depends(get_current_user), async def upload_avatar(request: Request, image: UploadFile=File(...), current_user: User=Depends(get_current_user), db: Session=Depends(get_db)): try: # Use comprehensive file validation (magic bytes + size) - from ..utils.file_validation import validate_uploaded_image + from ...shared.utils.file_validation import validate_uploaded_image max_avatar_size = 2 * 1024 * 1024 # 2MB for avatars # Validate file completely (MIME type, size, magic bytes, integrity) diff --git a/Backend/src/routes/user_routes.py b/Backend/src/auth/routes/user_routes.py similarity index 96% rename from Backend/src/routes/user_routes.py rename to Backend/src/auth/routes/user_routes.py index 43b52cfe..8a280658 100644 --- a/Backend/src/routes/user_routes.py +++ b/Backend/src/auth/routes/user_routes.py @@ -3,14 +3,14 @@ from sqlalchemy.orm import Session from sqlalchemy import or_ from typing import Optional import bcrypt -from ..config.database import get_db -from ..middleware.auth import get_current_user, authorize_roles +from ...shared.config.database import get_db +from ...security.middleware.auth import get_current_user, authorize_roles from ..models.user import User from ..models.role import Role -from ..models.booking import Booking, BookingStatus -from ..utils.role_helpers import can_manage_users -from ..utils.response_helpers import success_response -from ..services.audit_service import audit_service +from ...bookings.models.booking import Booking, BookingStatus +from ...shared.utils.role_helpers import can_manage_users +from ...shared.utils.response_helpers import success_response +from ...analytics.services.audit_service import audit_service from ..schemas.user import CreateUserRequest, UpdateUserRequest router = APIRouter(prefix='/users', tags=['users']) diff --git a/Backend/src/auth/schemas/__init__.py b/Backend/src/auth/schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/schemas/auth.py b/Backend/src/auth/schemas/auth.py similarity index 100% rename from Backend/src/schemas/auth.py rename to Backend/src/auth/schemas/auth.py diff --git a/Backend/src/schemas/user.py b/Backend/src/auth/schemas/user.py similarity index 100% rename from Backend/src/schemas/user.py rename to Backend/src/auth/schemas/user.py diff --git a/Backend/src/auth/services/__init__.py b/Backend/src/auth/services/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/services/auth_service.py b/Backend/src/auth/services/auth_service.py similarity index 98% rename from Backend/src/services/auth_service.py rename to Backend/src/auth/services/auth_service.py index 940c1208..e328e23a 100644 --- a/Backend/src/services/auth_service.py +++ b/Backend/src/auth/services/auth_service.py @@ -11,13 +11,13 @@ from ..models.user import User from ..models.refresh_token import RefreshToken from ..models.password_reset_token import PasswordResetToken from ..models.role import Role -from ..utils.mailer import send_email -from ..utils.email_templates import ( +from ...shared.utils.mailer import send_email +from ...shared.utils.email_templates import ( welcome_email_template, password_reset_email_template, password_changed_email_template ) -from ..config.settings import settings +from ...shared.config.settings import settings import os logger = logging.getLogger(__name__) @@ -116,7 +116,7 @@ class AuthService: async def register(self, db: Session, name: str, email: str, password: str, phone: Optional[str] = None) -> dict: # Validate password strength - from ..utils.password_validation import validate_password_strength + from ...shared.utils.password_validation import validate_password_strength is_valid, errors = validate_password_strength(password) if not is_valid: error_message = 'Password does not meet requirements: ' + '; '.join(errors) @@ -361,7 +361,7 @@ class AuthService: raise ValueError("Current password is incorrect") # Validate new password strength - from ..utils.password_validation import validate_password_strength + from ...shared.utils.password_validation import validate_password_strength is_valid, errors = validate_password_strength(password) if not is_valid: error_message = 'New password does not meet requirements: ' + '; '.join(errors) diff --git a/Backend/src/services/mfa_service.py b/Backend/src/auth/services/mfa_service.py similarity index 100% rename from Backend/src/services/mfa_service.py rename to Backend/src/auth/services/mfa_service.py diff --git a/Backend/src/services/oauth_service.py b/Backend/src/auth/services/oauth_service.py similarity index 98% rename from Backend/src/services/oauth_service.py rename to Backend/src/auth/services/oauth_service.py index 71a09fa1..8b6ce888 100644 --- a/Backend/src/services/oauth_service.py +++ b/Backend/src/auth/services/oauth_service.py @@ -6,9 +6,9 @@ import secrets from urllib.parse import urlencode import logging -from ..models.security_event import OAuthProvider, OAuthToken +from ...security.models.security_event import OAuthProvider, OAuthToken from ..models.user import User -from ..config.logging_config import get_logger +from ...shared.config.logging_config import get_logger logger = get_logger(__name__) diff --git a/Backend/src/bookings/__init__.py b/Backend/src/bookings/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/bookings/models/__init__.py b/Backend/src/bookings/models/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/models/booking.py b/Backend/src/bookings/models/booking.py similarity index 98% rename from Backend/src/models/booking.py rename to Backend/src/bookings/models/booking.py index e8a32754..06e2929b 100644 --- a/Backend/src/models/booking.py +++ b/Backend/src/bookings/models/booking.py @@ -2,7 +2,7 @@ from sqlalchemy import Column, Integer, String, DateTime, Numeric, Boolean, Text from sqlalchemy.orm import relationship from datetime import datetime import enum -from ..config.database import Base +from ...shared.config.database import Base class BookingStatus(str, enum.Enum): pending = 'pending' diff --git a/Backend/src/models/checkin_checkout.py b/Backend/src/bookings/models/checkin_checkout.py similarity index 96% rename from Backend/src/models/checkin_checkout.py rename to Backend/src/bookings/models/checkin_checkout.py index 0d9d7ff0..704e7b33 100644 --- a/Backend/src/models/checkin_checkout.py +++ b/Backend/src/bookings/models/checkin_checkout.py @@ -1,7 +1,7 @@ from sqlalchemy import Column, Integer, DateTime, Numeric, Text, ForeignKey from sqlalchemy.orm import relationship from datetime import datetime -from ..config.database import Base +from ...shared.config.database import Base class CheckInCheckOut(Base): __tablename__ = 'checkin_checkout' diff --git a/Backend/src/models/group_booking.py b/Backend/src/bookings/models/group_booking.py similarity index 99% rename from Backend/src/models/group_booking.py rename to Backend/src/bookings/models/group_booking.py index fd8fa6e0..7409d1eb 100644 --- a/Backend/src/models/group_booking.py +++ b/Backend/src/bookings/models/group_booking.py @@ -2,7 +2,7 @@ from sqlalchemy import Column, Integer, String, DateTime, Numeric, Boolean, Text from sqlalchemy.orm import relationship from datetime import datetime import enum -from ..config.database import Base +from ...shared.config.database import Base class GroupBookingStatus(str, enum.Enum): draft = 'draft' diff --git a/Backend/src/bookings/routes/__init__.py b/Backend/src/bookings/routes/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/routes/booking_routes.py b/Backend/src/bookings/routes/booking_routes.py similarity index 96% rename from Backend/src/routes/booking_routes.py rename to Backend/src/bookings/routes/booking_routes.py index c2d00b62..39dc9861 100644 --- a/Backend/src/routes/booking_routes.py +++ b/Backend/src/bookings/routes/booking_routes.py @@ -5,25 +5,25 @@ from typing import Optional from datetime import datetime import random import os -from ..config.database import get_db -from ..config.settings import settings -from ..middleware.auth import get_current_user, authorize_roles -from ..models.user import User -from ..models.role import Role +from ...shared.config.database import get_db +from ...shared.config.settings import settings +from ...security.middleware.auth import get_current_user, authorize_roles +from ...auth.models.user import User +from ...auth.models.role import Role from ..models.booking import Booking, BookingStatus -from ..models.room import Room, RoomStatus -from ..models.room_type import RoomType -from ..models.payment import Payment, PaymentMethod, PaymentType, PaymentStatus -from ..models.service_usage import ServiceUsage -from ..models.user_loyalty import UserLoyalty -from ..models.referral import Referral, ReferralStatus -from ..services.room_service import normalize_images, get_base_url +from ...rooms.models.room import Room, RoomStatus +from ...rooms.models.room_type import RoomType +from ...payments.models.payment import Payment, PaymentMethod, PaymentType, PaymentStatus +from ...hotel_services.models.service_usage import ServiceUsage +from ...loyalty.models.user_loyalty import UserLoyalty +from ...loyalty.models.referral import Referral, ReferralStatus +from ...rooms.services.room_service import normalize_images, get_base_url from fastapi import Request -from ..utils.mailer import send_email -from ..utils.email_templates import booking_confirmation_email_template, booking_status_changed_email_template -from ..services.loyalty_service import LoyaltyService -from ..utils.currency_helpers import get_currency_symbol -from ..utils.response_helpers import success_response +from ...shared.utils.mailer import send_email +from ...shared.utils.email_templates import booking_confirmation_email_template, booking_status_changed_email_template +from ...loyalty.services.loyalty_service import LoyaltyService +from ...shared.utils.currency_helpers import get_currency_symbol +from ...shared.utils.response_helpers import success_response from ..schemas.booking import CreateBookingRequest, UpdateBookingRequest router = APIRouter(prefix='/bookings', tags=['bookings']) @@ -216,7 +216,7 @@ async def create_booking(booking_data: CreateBookingRequest, current_user: User= raise HTTPException(status_code=409, detail='Room already booked for the selected dates') # Check for maintenance blocks - from ..models.room_maintenance import RoomMaintenance, MaintenanceStatus + from ...rooms.models.room_maintenance import RoomMaintenance, MaintenanceStatus maintenance_block = db.query(RoomMaintenance).filter( and_( RoomMaintenance.room_id == room_id, @@ -251,7 +251,7 @@ async def create_booking(booking_data: CreateBookingRequest, current_user: User= # Calculate services total if any (using Pydantic model) services_total = 0.0 if services: - from ..models.service import Service + from ...hotel_services.models.service import Service for service_item in services: service_id = service_item.service_id quantity = service_item.quantity @@ -314,8 +314,8 @@ async def create_booking(booking_data: CreateBookingRequest, current_user: User= # Process referral code if provided if referral_code: try: - from ..services.loyalty_service import LoyaltyService - from ..models.system_settings import SystemSettings + from ...loyalty.services.loyalty_service import LoyaltyService + from ...system.models.system_settings import SystemSettings # Check if loyalty program is enabled setting = db.query(SystemSettings).filter( @@ -338,7 +338,7 @@ async def create_booking(booking_data: CreateBookingRequest, current_user: User= logger.warning(f"Failed to process referral code {referral_code}: {referral_error}") # Don't fail the booking if referral processing fails if payment_method in ['stripe', 'paypal']: - from ..models.payment import Payment, PaymentMethod, PaymentStatus, PaymentType + from ...payments.models.payment import Payment, PaymentMethod, PaymentStatus, PaymentType if payment_method == 'stripe': payment_method_enum = PaymentMethod.stripe elif payment_method == 'paypal': @@ -352,14 +352,14 @@ async def create_booking(booking_data: CreateBookingRequest, current_user: User= db.flush() logger.info(f'Payment created: ID={payment.id}, method={(payment.payment_method.value if hasattr(payment.payment_method, 'value') else payment.payment_method)}') if requires_deposit and deposit_amount > 0: - from ..models.payment import Payment, PaymentMethod, PaymentStatus, PaymentType + from ...payments.models.payment import Payment, PaymentMethod, PaymentStatus, PaymentType deposit_payment = Payment(booking_id=booking.id, amount=deposit_amount, payment_method=PaymentMethod.stripe, payment_type=PaymentType.deposit, deposit_percentage=deposit_percentage, payment_status=PaymentStatus.pending, payment_date=None) db.add(deposit_payment) db.flush() logger.info(f'Deposit payment created: ID={deposit_payment.id}, amount={deposit_amount}, percentage={deposit_percentage}%') # Add service usages (services already extracted from Pydantic model) if services: - from ..models.service import Service + from ...hotel_services.models.service import Service for service_item in services: service_id = service_item.service_id quantity = service_item.quantity @@ -375,7 +375,7 @@ async def create_booking(booking_data: CreateBookingRequest, current_user: User= # Send booking confirmation notification try: - from ..services.notification_service import NotificationService + from ...notifications.services.notification_service import NotificationService if booking.status == BookingStatus.confirmed: NotificationService.send_booking_confirmation(db, booking) except Exception as e: @@ -384,11 +384,11 @@ async def create_booking(booking_data: CreateBookingRequest, current_user: User= logger.warning(f'Failed to send booking confirmation notification: {e}') try: - from ..services.invoice_service import InvoiceService - from ..utils.mailer import send_email + from ...payments.services.invoice_service import InvoiceService + from ...shared.utils.mailer import send_email from sqlalchemy.orm import joinedload, selectinload booking = db.query(Booking).options(selectinload(Booking.service_usages).selectinload(ServiceUsage.service)).filter(Booking.id == booking.id).first() - from ..models.system_settings import SystemSettings + from ...system.models.system_settings import SystemSettings company_settings = {} for key in ['company_name', 'company_address', 'company_phone', 'company_email', 'company_tax_id', 'company_logo_url']: setting = db.query(SystemSettings).filter(SystemSettings.key == key).first() @@ -503,7 +503,7 @@ async def get_booking_by_id(id: int, request: Request, current_user: User=Depend booking = db.query(Booking).options(selectinload(Booking.payments), selectinload(Booking.service_usages).selectinload(ServiceUsage.service), joinedload(Booking.user), joinedload(Booking.room).joinedload(Room.room_type)).filter(Booking.id == id).first() if not booking: raise HTTPException(status_code=404, detail='Booking not found') - from ..utils.role_helpers import is_admin + from ...shared.utils.role_helpers import is_admin if not is_admin(current_user, db) and booking.user_id != current_user.id: raise HTTPException(status_code=403, detail='Forbidden') import logging @@ -612,7 +612,7 @@ async def cancel_booking(id: int, current_user: User=Depends(get_current_user), if not active_booking: # Check for maintenance - from ..models.room_maintenance import RoomMaintenance, MaintenanceStatus + from ...rooms.models.room_maintenance import RoomMaintenance, MaintenanceStatus active_maintenance = db.query(RoomMaintenance).filter( and_( RoomMaintenance.room_id == booking.room_id, @@ -630,7 +630,7 @@ async def cancel_booking(id: int, current_user: User=Depends(get_current_user), db.flush() db.commit() try: - from ..models.system_settings import SystemSettings + from ...system.models.system_settings import SystemSettings client_url_setting = db.query(SystemSettings).filter(SystemSettings.key == 'client_url').first() client_url = client_url_setting.value if client_url_setting and client_url_setting.value else settings.CLIENT_URL or os.getenv('CLIENT_URL', 'http://localhost:5173') email_html = booking_status_changed_email_template(booking_number=booking.booking_number, guest_name=booking.user.full_name if booking.user else 'Guest', status='cancelled', client_url=client_url) @@ -673,7 +673,7 @@ async def update_booking(id: int, booking_data: UpdateBookingRequest, current_us # Set room to cleaning when checked out (housekeeping needed) if room: # Check if there's active maintenance - from ..models.room_maintenance import RoomMaintenance, MaintenanceStatus + from ...rooms.models.room_maintenance import RoomMaintenance, MaintenanceStatus active_maintenance = db.query(RoomMaintenance).filter( and_( RoomMaintenance.room_id == room.id, @@ -710,7 +710,7 @@ async def update_booking(id: int, booking_data: UpdateBookingRequest, current_us if not active_booking: # Check for maintenance - from ..models.room_maintenance import RoomMaintenance, MaintenanceStatus + from ...rooms.models.room_maintenance import RoomMaintenance, MaintenanceStatus active_maintenance = db.query(RoomMaintenance).filter( and_( RoomMaintenance.room_id == room.id, @@ -753,7 +753,7 @@ async def update_booking(id: int, booking_data: UpdateBookingRequest, current_us # Send booking confirmation notification if status changed to confirmed if new_status == BookingStatus.confirmed: try: - from ..services.notification_service import NotificationService + from ...notifications.services.notification_service import NotificationService NotificationService.send_booking_confirmation(db, booking) except Exception as e: import logging @@ -778,7 +778,7 @@ async def update_booking(id: int, booking_data: UpdateBookingRequest, current_us if status_value and old_status != booking.status: if booking.status in [BookingStatus.confirmed, BookingStatus.cancelled]: try: - from ..models.system_settings import SystemSettings + from ...system.models.system_settings import SystemSettings client_url_setting = db.query(SystemSettings).filter(SystemSettings.key == 'client_url').first() client_url = client_url_setting.value if client_url_setting and client_url_setting.value else settings.CLIENT_URL or os.getenv('CLIENT_URL', 'http://localhost:5173') if booking.status == BookingStatus.confirmed: @@ -797,7 +797,7 @@ async def update_booking(id: int, booking_data: UpdateBookingRequest, current_us if booking.user: try: # Check if booking already earned points - from ..models.loyalty_point_transaction import LoyaltyPointTransaction, TransactionSource + from ...loyalty.models.loyalty_point_transaction import LoyaltyPointTransaction, TransactionSource existing_points = db.query(LoyaltyPointTransaction).filter( LoyaltyPointTransaction.booking_id == booking.id, LoyaltyPointTransaction.source == TransactionSource.booking @@ -815,7 +815,7 @@ async def update_booking(id: int, booking_data: UpdateBookingRequest, current_us user_loyalty = db.query(UserLoyalty).filter(UserLoyalty.user_id == booking.user_id).first() if user_loyalty and user_loyalty.referral_code: # Check if there's a referral for this user that hasn't been rewarded yet - from ..models.referral import Referral + from ...loyalty.models.referral import Referral referral = db.query(Referral).filter( Referral.referred_user_id == booking.user_id, Referral.booking_id == booking.id, @@ -999,7 +999,7 @@ async def admin_create_booking(booking_data: dict, current_user: User=Depends(au services = booking_data.get('services', []) services_total = 0.0 if services: - from ..models.service import Service + from ...hotel_services.models.service import Service for service_item in services: service_id = service_item.get('service_id') quantity = service_item.get('quantity', 1) @@ -1078,7 +1078,7 @@ async def admin_create_booking(booking_data: dict, current_user: User=Depends(au db.flush() # Create payment records based on payment_status - from ..models.payment import Payment, PaymentMethod, PaymentStatus, PaymentType + from ...payments.models.payment import Payment, PaymentMethod, PaymentStatus, PaymentType from datetime import datetime as dt # Determine payment method enum @@ -1179,7 +1179,7 @@ async def admin_create_booking(booking_data: dict, current_user: User=Depends(au # Add service usages if any if services: - from ..models.service import Service + from ...hotel_services.models.service import Service for service_item in services: service_id = service_item.get('service_id') quantity = service_item.get('quantity', 1) diff --git a/Backend/src/routes/group_booking_routes.py b/Backend/src/bookings/routes/group_booking_routes.py similarity index 98% rename from Backend/src/routes/group_booking_routes.py rename to Backend/src/bookings/routes/group_booking_routes.py index 28bc6dfb..609d1fed 100644 --- a/Backend/src/routes/group_booking_routes.py +++ b/Backend/src/bookings/routes/group_booking_routes.py @@ -4,18 +4,18 @@ from typing import Optional, List from datetime import datetime from decimal import Decimal -from ..config.database import get_db -from ..middleware.auth import get_current_user, authorize_roles -from ..models.user import User -from ..models.role import Role +from ...shared.config.database import get_db +from ...security.middleware.auth import get_current_user, authorize_roles +from ...auth.models.user import User +from ...auth.models.role import Role from ..models.group_booking import ( GroupBooking, GroupBookingMember, GroupRoomBlock, GroupPayment, GroupBookingStatus, PaymentOption ) -from ..models.room import Room -from ..models.room_type import RoomType +from ...rooms.models.room import Room +from ...rooms.models.room_type import RoomType from ..services.group_booking_service import GroupBookingService -from ..services.room_service import get_base_url +from ...rooms.services.room_service import get_base_url from fastapi import Request router = APIRouter(prefix='/group-bookings', tags=['group-bookings']) diff --git a/Backend/src/bookings/schemas/__init__.py b/Backend/src/bookings/schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/schemas/booking.py b/Backend/src/bookings/schemas/booking.py similarity index 100% rename from Backend/src/schemas/booking.py rename to Backend/src/bookings/schemas/booking.py diff --git a/Backend/src/bookings/services/__init__.py b/Backend/src/bookings/services/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/services/group_booking_service.py b/Backend/src/bookings/services/group_booking_service.py similarity index 99% rename from Backend/src/services/group_booking_service.py rename to Backend/src/bookings/services/group_booking_service.py index a736a7b9..f170e31f 100644 --- a/Backend/src/services/group_booking_service.py +++ b/Backend/src/bookings/services/group_booking_service.py @@ -9,10 +9,10 @@ from ..models.group_booking import ( GroupBookingStatus, PaymentOption ) from ..models.booking import Booking, BookingStatus -from ..models.room import Room, RoomStatus -from ..models.room_type import RoomType -from ..models.user import User -from ..models.payment import Payment, PaymentStatus, PaymentMethod +from ...rooms.models.room import Room, RoomStatus +from ...rooms.models.room_type import RoomType +from ...auth.models.user import User +from ...payments.models.payment import Payment, PaymentStatus, PaymentMethod import logging logger = logging.getLogger(__name__) diff --git a/Backend/src/config/__pycache__/database.cpython-312.pyc b/Backend/src/config/__pycache__/database.cpython-312.pyc deleted file mode 100644 index 54f5dd6d..00000000 Binary files a/Backend/src/config/__pycache__/database.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/config/__pycache__/logging_config.cpython-312.pyc b/Backend/src/config/__pycache__/logging_config.cpython-312.pyc deleted file mode 100644 index ac269567..00000000 Binary files a/Backend/src/config/__pycache__/logging_config.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/config/__pycache__/settings.cpython-312.pyc b/Backend/src/config/__pycache__/settings.cpython-312.pyc deleted file mode 100644 index bc4b79d3..00000000 Binary files a/Backend/src/config/__pycache__/settings.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/content/__init__.py b/Backend/src/content/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/content/models/__init__.py b/Backend/src/content/models/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/models/banner.py b/Backend/src/content/models/banner.py similarity index 96% rename from Backend/src/models/banner.py rename to Backend/src/content/models/banner.py index d417509e..70607469 100644 --- a/Backend/src/models/banner.py +++ b/Backend/src/content/models/banner.py @@ -1,7 +1,7 @@ from sqlalchemy import Column, Integer, String, DateTime, Boolean, Text from sqlalchemy.orm import relationship from datetime import datetime -from ..config.database import Base +from ...shared.config.database import Base class Banner(Base): __tablename__ = 'banners' diff --git a/Backend/src/models/blog.py b/Backend/src/content/models/blog.py similarity index 97% rename from Backend/src/models/blog.py rename to Backend/src/content/models/blog.py index b30ef22f..c2e421b5 100644 --- a/Backend/src/models/blog.py +++ b/Backend/src/content/models/blog.py @@ -1,7 +1,7 @@ from sqlalchemy import Column, Integer, String, Text, DateTime, Boolean, ForeignKey, JSON from sqlalchemy.orm import relationship from datetime import datetime -from ..config.database import Base +from ...shared.config.database import Base class BlogPost(Base): __tablename__ = 'blog_posts' diff --git a/Backend/src/models/cookie_integration_config.py b/Backend/src/content/models/cookie_integration_config.py similarity index 94% rename from Backend/src/models/cookie_integration_config.py rename to Backend/src/content/models/cookie_integration_config.py index 660883b0..e28bd068 100644 --- a/Backend/src/models/cookie_integration_config.py +++ b/Backend/src/content/models/cookie_integration_config.py @@ -1,7 +1,7 @@ from datetime import datetime from sqlalchemy import Column, DateTime, ForeignKey, Integer, String from sqlalchemy.orm import relationship -from ..config.database import Base +from ...shared.config.database import Base class CookieIntegrationConfig(Base): __tablename__ = 'cookie_integration_configs' diff --git a/Backend/src/models/cookie_policy.py b/Backend/src/content/models/cookie_policy.py similarity index 94% rename from Backend/src/models/cookie_policy.py rename to Backend/src/content/models/cookie_policy.py index 3a5b253a..c65a8c02 100644 --- a/Backend/src/models/cookie_policy.py +++ b/Backend/src/content/models/cookie_policy.py @@ -1,7 +1,7 @@ from datetime import datetime from sqlalchemy import Boolean, Column, DateTime, ForeignKey, Integer from sqlalchemy.orm import relationship -from ..config.database import Base +from ...shared.config.database import Base class CookiePolicy(Base): __tablename__ = 'cookie_policies' diff --git a/Backend/src/models/page_content.py b/Backend/src/content/models/page_content.py similarity index 99% rename from Backend/src/models/page_content.py rename to Backend/src/content/models/page_content.py index 7fc18016..f2c466f3 100644 --- a/Backend/src/models/page_content.py +++ b/Backend/src/content/models/page_content.py @@ -2,7 +2,7 @@ from sqlalchemy import Column, Integer, String, Text, DateTime, Boolean, Enum as from sqlalchemy.orm import relationship from datetime import datetime import enum -from ..config.database import Base +from ...shared.config.database import Base class PageType(str, enum.Enum): HOME = 'home' diff --git a/Backend/src/content/routes/__init__.py b/Backend/src/content/routes/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/routes/about_routes.py b/Backend/src/content/routes/about_routes.py similarity index 95% rename from Backend/src/routes/about_routes.py rename to Backend/src/content/routes/about_routes.py index 7328f925..50ce6f0a 100644 --- a/Backend/src/routes/about_routes.py +++ b/Backend/src/content/routes/about_routes.py @@ -1,8 +1,8 @@ from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.orm import Session import json -from ..config.database import get_db -from ..config.logging_config import get_logger +from ...shared.config.database import get_db +from ...shared.config.logging_config import get_logger from ..models.page_content import PageContent, PageType logger = get_logger(__name__) router = APIRouter(prefix='/about', tags=['about']) diff --git a/Backend/src/routes/accessibility_routes.py b/Backend/src/content/routes/accessibility_routes.py similarity index 95% rename from Backend/src/routes/accessibility_routes.py rename to Backend/src/content/routes/accessibility_routes.py index ecaeeef3..0aaa0dc7 100644 --- a/Backend/src/routes/accessibility_routes.py +++ b/Backend/src/content/routes/accessibility_routes.py @@ -1,7 +1,7 @@ from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.orm import Session -from ..config.database import get_db -from ..config.logging_config import get_logger +from ...shared.config.database import get_db +from ...shared.config.logging_config import get_logger from ..models.page_content import PageContent, PageType logger = get_logger(__name__) router = APIRouter(prefix='/accessibility', tags=['accessibility']) diff --git a/Backend/src/routes/admin_privacy_routes.py b/Backend/src/content/routes/admin_privacy_routes.py similarity index 92% rename from Backend/src/routes/admin_privacy_routes.py rename to Backend/src/content/routes/admin_privacy_routes.py index 507f74f7..81d0424e 100644 --- a/Backend/src/routes/admin_privacy_routes.py +++ b/Backend/src/content/routes/admin_privacy_routes.py @@ -1,10 +1,10 @@ from fastapi import APIRouter, Depends, status from sqlalchemy.orm import Session -from ..config.database import get_db -from ..middleware.auth import authorize_roles -from ..models.user import User +from ...shared.config.database import get_db +from ...security.middleware.auth import authorize_roles +from ...auth.models.user import User from ..schemas.admin_privacy import CookieIntegrationSettings, CookieIntegrationSettingsResponse, CookiePolicySettings, CookiePolicySettingsResponse -from ..services.privacy_admin_service import privacy_admin_service +from ...security.services.privacy_admin_service import privacy_admin_service router = APIRouter(prefix='/admin/privacy', tags=['admin-privacy']) @router.get('/cookie-policy', response_model=CookiePolicySettingsResponse, status_code=status.HTTP_200_OK) diff --git a/Backend/src/routes/banner_routes.py b/Backend/src/content/routes/banner_routes.py similarity index 96% rename from Backend/src/routes/banner_routes.py rename to Backend/src/content/routes/banner_routes.py index 92fb4d9d..83d018fb 100644 --- a/Backend/src/routes/banner_routes.py +++ b/Backend/src/content/routes/banner_routes.py @@ -7,9 +7,9 @@ from pathlib import Path import os import aiofiles import uuid -from ..config.database import get_db -from ..middleware.auth import get_current_user, authorize_roles -from ..models.user import User +from ...shared.config.database import get_db +from ...security.middleware.auth import get_current_user, authorize_roles +from ...auth.models.user import User from ..models.banner import Banner router = APIRouter(prefix='/banners', tags=['banners']) @@ -136,8 +136,8 @@ async def upload_banner_image(request: Request, image: UploadFile=File(...), cur filename = f'banner-{uuid.uuid4()}{ext}' file_path = upload_dir / filename # Use comprehensive file validation (magic bytes + size) - from ..config.settings import settings - from ..utils.file_validation import validate_uploaded_image + from ...shared.config.settings import settings + from ...shared.utils.file_validation import validate_uploaded_image max_size = settings.MAX_UPLOAD_SIZE # Validate file completely (MIME type, size, magic bytes, integrity) diff --git a/Backend/src/routes/blog_routes.py b/Backend/src/content/routes/blog_routes.py similarity index 97% rename from Backend/src/routes/blog_routes.py rename to Backend/src/content/routes/blog_routes.py index 0ec47dce..c61fdfcf 100644 --- a/Backend/src/routes/blog_routes.py +++ b/Backend/src/content/routes/blog_routes.py @@ -9,13 +9,13 @@ import os import uuid import aiofiles from pathlib import Path -from ..config.database import get_db -from ..config.logging_config import get_logger -from ..middleware.auth import get_current_user, get_current_user_optional, authorize_roles -from ..models.user import User +from ...shared.config.database import get_db +from ...shared.config.logging_config import get_logger +from ...security.middleware.auth import get_current_user, get_current_user_optional, authorize_roles +from ...auth.models.user import User from ..models.blog import BlogPost from ..schemas.blog import BlogPostCreate, BlogPostUpdate, BlogPostResponse, BlogPostListResponse -from ..utils.response_helpers import success_response +from ...shared.utils.response_helpers import success_response logger = get_logger(__name__) router = APIRouter(prefix='/blog', tags=['blog']) @@ -153,7 +153,7 @@ async def get_blog_post_by_slug( # Only show published posts to non-admin users # Check if user is admin - from ..models.role import Role + from ...auth.models.role import Role is_admin = False if current_user: role = db.query(Role).filter(Role.id == current_user.role_id).first() @@ -540,8 +540,8 @@ async def upload_blog_image( file_path = upload_dir / filename # Validate file - from ..config.settings import settings - from ..utils.file_validation import validate_uploaded_image + from ...shared.config.settings import settings + from ...shared.utils.file_validation import validate_uploaded_image max_size = settings.MAX_UPLOAD_SIZE content = await validate_uploaded_image(image, max_size) diff --git a/Backend/src/routes/cancellation_routes.py b/Backend/src/content/routes/cancellation_routes.py similarity index 95% rename from Backend/src/routes/cancellation_routes.py rename to Backend/src/content/routes/cancellation_routes.py index 816b4940..a67cd91e 100644 --- a/Backend/src/routes/cancellation_routes.py +++ b/Backend/src/content/routes/cancellation_routes.py @@ -1,7 +1,7 @@ from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.orm import Session -from ..config.database import get_db -from ..config.logging_config import get_logger +from ...shared.config.database import get_db +from ...shared.config.logging_config import get_logger from ..models.page_content import PageContent, PageType logger = get_logger(__name__) router = APIRouter(prefix='/cancellation', tags=['cancellation']) diff --git a/Backend/src/routes/contact_content_routes.py b/Backend/src/content/routes/contact_content_routes.py similarity index 94% rename from Backend/src/routes/contact_content_routes.py rename to Backend/src/content/routes/contact_content_routes.py index 65d9324b..cbd46746 100644 --- a/Backend/src/routes/contact_content_routes.py +++ b/Backend/src/content/routes/contact_content_routes.py @@ -1,8 +1,8 @@ from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.orm import Session import json -from ..config.database import get_db -from ..config.logging_config import get_logger +from ...shared.config.database import get_db +from ...shared.config.logging_config import get_logger from ..models.page_content import PageContent, PageType logger = get_logger(__name__) router = APIRouter(prefix='/contact-content', tags=['contact-content']) diff --git a/Backend/src/routes/contact_routes.py b/Backend/src/content/routes/contact_routes.py similarity index 86% rename from Backend/src/routes/contact_routes.py rename to Backend/src/content/routes/contact_routes.py index a4c64057..3470cc05 100644 --- a/Backend/src/routes/contact_routes.py +++ b/Backend/src/content/routes/contact_routes.py @@ -3,12 +3,12 @@ from sqlalchemy.orm import Session from pydantic import BaseModel, EmailStr from typing import Optional import logging -from ..config.database import get_db -from ..models.user import User -from ..models.role import Role -from ..models.system_settings import SystemSettings -from ..utils.mailer import send_email -from ..utils.html_sanitizer import sanitize_text_for_html +from ...shared.config.database import get_db +from ...auth.models.user import User +from ...auth.models.role import Role +from ...system.models.system_settings import SystemSettings +from ...shared.utils.mailer import send_email +from ...shared.utils.html_sanitizer import sanitize_text_for_html logger = logging.getLogger(__name__) router = APIRouter(prefix='/contact', tags=['contact']) @@ -31,7 +31,7 @@ def get_admin_email(db: Session) -> str: admin_user = db.query(User).filter(User.role_id == admin_role.id, User.is_active == True).first() if admin_user: return admin_user.email - from ..config.settings import settings + from ...shared.config.settings import settings if settings.SMTP_FROM_EMAIL: return settings.SMTP_FROM_EMAIL raise HTTPException(status_code=500, detail='Admin email not configured. Please set company_email in system settings or ensure an admin user exists.') diff --git a/Backend/src/routes/faq_routes.py b/Backend/src/content/routes/faq_routes.py similarity index 95% rename from Backend/src/routes/faq_routes.py rename to Backend/src/content/routes/faq_routes.py index cc54bd2d..80036f83 100644 --- a/Backend/src/routes/faq_routes.py +++ b/Backend/src/content/routes/faq_routes.py @@ -1,7 +1,7 @@ from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.orm import Session -from ..config.database import get_db -from ..config.logging_config import get_logger +from ...shared.config.database import get_db +from ...shared.config.logging_config import get_logger from ..models.page_content import PageContent, PageType logger = get_logger(__name__) router = APIRouter(prefix='/faq', tags=['faq']) diff --git a/Backend/src/routes/footer_routes.py b/Backend/src/content/routes/footer_routes.py similarity index 94% rename from Backend/src/routes/footer_routes.py rename to Backend/src/content/routes/footer_routes.py index 250d1711..b7b8f7ea 100644 --- a/Backend/src/routes/footer_routes.py +++ b/Backend/src/content/routes/footer_routes.py @@ -1,8 +1,8 @@ from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.orm import Session import json -from ..config.database import get_db -from ..config.logging_config import get_logger +from ...shared.config.database import get_db +from ...shared.config.logging_config import get_logger from ..models.page_content import PageContent, PageType logger = get_logger(__name__) router = APIRouter(prefix='/footer', tags=['footer']) diff --git a/Backend/src/routes/home_routes.py b/Backend/src/content/routes/home_routes.py similarity index 97% rename from Backend/src/routes/home_routes.py rename to Backend/src/content/routes/home_routes.py index 630986c8..dcedfa30 100644 --- a/Backend/src/routes/home_routes.py +++ b/Backend/src/content/routes/home_routes.py @@ -1,8 +1,8 @@ from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.orm import Session import json -from ..config.database import get_db -from ..config.logging_config import get_logger +from ...shared.config.database import get_db +from ...shared.config.logging_config import get_logger from ..models.page_content import PageContent, PageType logger = get_logger(__name__) router = APIRouter(prefix='/home', tags=['home']) diff --git a/Backend/src/routes/page_content_routes.py b/Backend/src/content/routes/page_content_routes.py similarity index 98% rename from Backend/src/routes/page_content_routes.py rename to Backend/src/content/routes/page_content_routes.py index 01a3fa73..5aa676be 100644 --- a/Backend/src/routes/page_content_routes.py +++ b/Backend/src/content/routes/page_content_routes.py @@ -7,13 +7,13 @@ import json import os import aiofiles import uuid -from ..config.database import get_db -from ..config.logging_config import get_logger -from ..middleware.auth import get_current_user, authorize_roles -from ..models.user import User +from ...shared.config.database import get_db +from ...shared.config.logging_config import get_logger +from ...security.middleware.auth import get_current_user, authorize_roles +from ...auth.models.user import User from ..models.page_content import PageContent, PageType from ..schemas.page_content import PageContentUpdateRequest -from ..utils.html_sanitizer import sanitize_html +from ...shared.utils.html_sanitizer import sanitize_html logger = get_logger(__name__) router = APIRouter(prefix='/page-content', tags=['page-content']) @@ -63,8 +63,8 @@ async def upload_page_content_image(request: Request, image: UploadFile=File(... filename = f'page-content-{uuid.uuid4()}{ext}' file_path = upload_dir / filename # Use comprehensive file validation (magic bytes + size) - from ..config.settings import settings - from ..utils.file_validation import validate_uploaded_image + from ...shared.config.settings import settings + from ...shared.utils.file_validation import validate_uploaded_image max_size = settings.MAX_UPLOAD_SIZE # Validate file completely (MIME type, size, magic bytes, integrity) diff --git a/Backend/src/routes/privacy_routes.py b/Backend/src/content/routes/privacy_routes.py similarity index 96% rename from Backend/src/routes/privacy_routes.py rename to Backend/src/content/routes/privacy_routes.py index 70a233af..96cfc188 100644 --- a/Backend/src/routes/privacy_routes.py +++ b/Backend/src/content/routes/privacy_routes.py @@ -2,10 +2,10 @@ from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.orm import Session import json from datetime import datetime -from ..config.database import get_db -from ..config.logging_config import get_logger +from ...shared.config.database import get_db +from ...shared.config.logging_config import get_logger from ..models.page_content import PageContent, PageType -from ..services.privacy_admin_service import privacy_admin_service +from ...security.services.privacy_admin_service import privacy_admin_service from ..schemas.privacy import CookieConsent, CookieConsentResponse, UpdateCookieConsentRequest, CookieCategoryPreferences from ..schemas.admin_privacy import PublicPrivacyConfigResponse logger = get_logger(__name__) diff --git a/Backend/src/routes/refunds_routes.py b/Backend/src/content/routes/refunds_routes.py similarity index 95% rename from Backend/src/routes/refunds_routes.py rename to Backend/src/content/routes/refunds_routes.py index 3f3109bf..b1eb5075 100644 --- a/Backend/src/routes/refunds_routes.py +++ b/Backend/src/content/routes/refunds_routes.py @@ -1,8 +1,8 @@ from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.orm import Session import json -from ..config.database import get_db -from ..config.logging_config import get_logger +from ...shared.config.database import get_db +from ...shared.config.logging_config import get_logger from ..models.page_content import PageContent, PageType logger = get_logger(__name__) router = APIRouter(prefix='/refunds', tags=['refunds']) diff --git a/Backend/src/routes/terms_routes.py b/Backend/src/content/routes/terms_routes.py similarity index 95% rename from Backend/src/routes/terms_routes.py rename to Backend/src/content/routes/terms_routes.py index f82d58e8..f27b9c55 100644 --- a/Backend/src/routes/terms_routes.py +++ b/Backend/src/content/routes/terms_routes.py @@ -1,8 +1,8 @@ from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.orm import Session import json -from ..config.database import get_db -from ..config.logging_config import get_logger +from ...shared.config.database import get_db +from ...shared.config.logging_config import get_logger from ..models.page_content import PageContent, PageType logger = get_logger(__name__) router = APIRouter(prefix='/terms', tags=['terms']) diff --git a/Backend/src/content/schemas/__init__.py b/Backend/src/content/schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/schemas/admin_privacy.py b/Backend/src/content/schemas/admin_privacy.py similarity index 100% rename from Backend/src/schemas/admin_privacy.py rename to Backend/src/content/schemas/admin_privacy.py diff --git a/Backend/src/schemas/blog.py b/Backend/src/content/schemas/blog.py similarity index 100% rename from Backend/src/schemas/blog.py rename to Backend/src/content/schemas/blog.py diff --git a/Backend/src/schemas/page_content.py b/Backend/src/content/schemas/page_content.py similarity index 100% rename from Backend/src/schemas/page_content.py rename to Backend/src/content/schemas/page_content.py diff --git a/Backend/src/schemas/privacy.py b/Backend/src/content/schemas/privacy.py similarity index 100% rename from Backend/src/schemas/privacy.py rename to Backend/src/content/schemas/privacy.py diff --git a/Backend/src/content/services/__init__.py b/Backend/src/content/services/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/guest_management/__init__.py b/Backend/src/guest_management/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/guest_management/models/__init__.py b/Backend/src/guest_management/models/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/models/guest_communication.py b/Backend/src/guest_management/models/guest_communication.py similarity index 97% rename from Backend/src/models/guest_communication.py rename to Backend/src/guest_management/models/guest_communication.py index 31e06bff..894aa905 100644 --- a/Backend/src/models/guest_communication.py +++ b/Backend/src/guest_management/models/guest_communication.py @@ -2,7 +2,7 @@ from sqlalchemy import Column, Integer, String, Text, ForeignKey, DateTime, Enum from sqlalchemy.orm import relationship from datetime import datetime import enum -from ..config.database import Base +from ...shared.config.database import Base class CommunicationType(str, enum.Enum): email = 'email' diff --git a/Backend/src/models/guest_note.py b/Backend/src/guest_management/models/guest_note.py similarity index 95% rename from Backend/src/models/guest_note.py rename to Backend/src/guest_management/models/guest_note.py index c37e8127..c7d7867e 100644 --- a/Backend/src/models/guest_note.py +++ b/Backend/src/guest_management/models/guest_note.py @@ -1,7 +1,7 @@ from sqlalchemy import Column, Integer, String, Text, ForeignKey, DateTime, Boolean from sqlalchemy.orm import relationship from datetime import datetime -from ..config.database import Base +from ...shared.config.database import Base class GuestNote(Base): __tablename__ = 'guest_notes' diff --git a/Backend/src/models/guest_preference.py b/Backend/src/guest_management/models/guest_preference.py similarity index 97% rename from Backend/src/models/guest_preference.py rename to Backend/src/guest_management/models/guest_preference.py index b3cae213..5e1e18fa 100644 --- a/Backend/src/models/guest_preference.py +++ b/Backend/src/guest_management/models/guest_preference.py @@ -1,7 +1,7 @@ from sqlalchemy import Column, Integer, String, Text, JSON, ForeignKey, DateTime, Boolean from sqlalchemy.orm import relationship from datetime import datetime -from ..config.database import Base +from ...shared.config.database import Base class GuestPreference(Base): __tablename__ = 'guest_preferences' diff --git a/Backend/src/models/guest_segment.py b/Backend/src/guest_management/models/guest_segment.py similarity index 96% rename from Backend/src/models/guest_segment.py rename to Backend/src/guest_management/models/guest_segment.py index d05e58e0..49fbd967 100644 --- a/Backend/src/models/guest_segment.py +++ b/Backend/src/guest_management/models/guest_segment.py @@ -1,7 +1,7 @@ from sqlalchemy import Column, Integer, String, Text, ForeignKey, DateTime, Boolean, JSON, Table from sqlalchemy.orm import relationship from datetime import datetime -from ..config.database import Base +from ...shared.config.database import Base # Association table for many-to-many relationship between users and segments guest_segment_association = Table( diff --git a/Backend/src/models/guest_tag.py b/Backend/src/guest_management/models/guest_tag.py similarity index 96% rename from Backend/src/models/guest_tag.py rename to Backend/src/guest_management/models/guest_tag.py index 91bb9117..6ce69841 100644 --- a/Backend/src/models/guest_tag.py +++ b/Backend/src/guest_management/models/guest_tag.py @@ -1,7 +1,7 @@ from sqlalchemy import Column, Integer, String, ForeignKey, DateTime, Table from sqlalchemy.orm import relationship from datetime import datetime -from ..config.database import Base +from ...shared.config.database import Base # Association table for many-to-many relationship between users and tags guest_tag_association = Table( diff --git a/Backend/src/guest_management/routes/__init__.py b/Backend/src/guest_management/routes/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/routes/guest_profile_routes.py b/Backend/src/guest_management/routes/guest_profile_routes.py similarity index 98% rename from Backend/src/routes/guest_profile_routes.py rename to Backend/src/guest_management/routes/guest_profile_routes.py index 56d68bee..88a0c01b 100644 --- a/Backend/src/routes/guest_profile_routes.py +++ b/Backend/src/guest_management/routes/guest_profile_routes.py @@ -1,16 +1,16 @@ from fastapi import APIRouter, Depends, HTTPException, Query from sqlalchemy.orm import Session from typing import Optional, List -from ..config.database import get_db -from ..middleware.auth import get_current_user, authorize_roles -from ..models.user import User +from ...shared.config.database import get_db +from ...security.middleware.auth import get_current_user, authorize_roles +from ...auth.models.user import User from ..models.guest_preference import GuestPreference from ..models.guest_note import GuestNote from ..models.guest_tag import GuestTag from ..models.guest_communication import GuestCommunication, CommunicationType, CommunicationDirection from ..models.guest_segment import GuestSegment from ..services.guest_profile_service import GuestProfileService -from ..utils.role_helpers import is_customer +from ...shared.utils.role_helpers import is_customer import json router = APIRouter(prefix='/guest-profiles', tags=['guest-profiles']) @@ -90,7 +90,7 @@ async def get_guest_profile( raise HTTPException(status_code=404, detail=f'User with ID {user_id} not found') # Check if user is a customer - from ..utils.role_helpers import is_customer + from ...shared.utils.role_helpers import is_customer if not is_customer(user, db): raise HTTPException(status_code=404, detail=f'User with ID {user_id} is not a guest (customer)') diff --git a/Backend/src/guest_management/schemas/__init__.py b/Backend/src/guest_management/schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/guest_management/services/__init__.py b/Backend/src/guest_management/services/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/services/guest_profile_service.py b/Backend/src/guest_management/services/guest_profile_service.py similarity index 97% rename from Backend/src/services/guest_profile_service.py rename to Backend/src/guest_management/services/guest_profile_service.py index 5ba067f4..d5250546 100644 --- a/Backend/src/services/guest_profile_service.py +++ b/Backend/src/guest_management/services/guest_profile_service.py @@ -3,10 +3,10 @@ from sqlalchemy import func, and_, or_, desc from typing import List, Dict, Optional from datetime import datetime, timedelta from decimal import Decimal -from ..models.user import User -from ..models.booking import Booking, BookingStatus -from ..models.payment import Payment -from ..models.review import Review +from ...auth.models.user import User +from ...bookings.models.booking import Booking, BookingStatus +from ...payments.models.payment import Payment +from ...reviews.models.review import Review from ..models.guest_preference import GuestPreference from ..models.guest_note import GuestNote from ..models.guest_tag import GuestTag @@ -18,7 +18,7 @@ class GuestProfileService: @staticmethod def calculate_lifetime_value(user_id: int, db: Session) -> Decimal: """Calculate guest lifetime value from all bookings and payments""" - from ..models.payment import PaymentStatus + from ...payments.models.payment import PaymentStatus # Get payments through bookings total_revenue = db.query(func.coalesce(func.sum(Payment.amount), 0)).join( @@ -29,7 +29,7 @@ class GuestProfileService: ).scalar() # Also include service bookings - from ..models.service_booking import ServiceBooking, ServiceBookingStatus + from ...hotel_services.models.service_booking import ServiceBooking, ServiceBookingStatus service_revenue = db.query(func.coalesce(func.sum(ServiceBooking.total_amount), 0)).filter( ServiceBooking.user_id == user_id, ServiceBooking.status == ServiceBookingStatus.completed diff --git a/Backend/src/hotel_services/__init__.py b/Backend/src/hotel_services/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/hotel_services/models/__init__.py b/Backend/src/hotel_services/models/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/models/housekeeping_task.py b/Backend/src/hotel_services/models/housekeeping_task.py similarity index 98% rename from Backend/src/models/housekeeping_task.py rename to Backend/src/hotel_services/models/housekeeping_task.py index 5b823e25..51dd6541 100644 --- a/Backend/src/models/housekeeping_task.py +++ b/Backend/src/hotel_services/models/housekeeping_task.py @@ -2,7 +2,7 @@ from sqlalchemy import Column, Integer, String, Text, Enum, ForeignKey, DateTime from sqlalchemy.orm import relationship from datetime import datetime import enum -from ..config.database import Base +from ...shared.config.database import Base class HousekeepingStatus(str, enum.Enum): pending = 'pending' diff --git a/Backend/src/models/service.py b/Backend/src/hotel_services/models/service.py similarity index 94% rename from Backend/src/models/service.py rename to Backend/src/hotel_services/models/service.py index 36ecf3a5..37d90c72 100644 --- a/Backend/src/models/service.py +++ b/Backend/src/hotel_services/models/service.py @@ -1,7 +1,7 @@ from sqlalchemy import Column, Integer, String, Numeric, Boolean, Text, DateTime from sqlalchemy.orm import relationship from datetime import datetime -from ..config.database import Base +from ...shared.config.database import Base class Service(Base): __tablename__ = 'services' diff --git a/Backend/src/models/service_booking.py b/Backend/src/hotel_services/models/service_booking.py similarity index 98% rename from Backend/src/models/service_booking.py rename to Backend/src/hotel_services/models/service_booking.py index d8bc1ed5..39907bac 100644 --- a/Backend/src/models/service_booking.py +++ b/Backend/src/hotel_services/models/service_booking.py @@ -2,7 +2,7 @@ from sqlalchemy import Column, Integer, String, DateTime, Numeric, Text, Enum, F from sqlalchemy.orm import relationship from datetime import datetime import enum -from ..config.database import Base +from ...shared.config.database import Base class ServiceBookingStatus(str, enum.Enum): pending = 'pending' diff --git a/Backend/src/models/service_usage.py b/Backend/src/hotel_services/models/service_usage.py similarity index 96% rename from Backend/src/models/service_usage.py rename to Backend/src/hotel_services/models/service_usage.py index 7ea1cd85..2c237341 100644 --- a/Backend/src/models/service_usage.py +++ b/Backend/src/hotel_services/models/service_usage.py @@ -1,7 +1,7 @@ from sqlalchemy import Column, Integer, DateTime, Numeric, Text, ForeignKey from sqlalchemy.orm import relationship from datetime import datetime -from ..config.database import Base +from ...shared.config.database import Base class ServiceUsage(Base): __tablename__ = 'service_usages' diff --git a/Backend/src/hotel_services/routes/__init__.py b/Backend/src/hotel_services/routes/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/routes/service_booking_routes.py b/Backend/src/hotel_services/routes/service_booking_routes.py similarity index 97% rename from Backend/src/routes/service_booking_routes.py rename to Backend/src/hotel_services/routes/service_booking_routes.py index 52785be5..e73ce3ac 100644 --- a/Backend/src/routes/service_booking_routes.py +++ b/Backend/src/hotel_services/routes/service_booking_routes.py @@ -4,11 +4,11 @@ from typing import Optional from datetime import datetime import random -from ..config.database import get_db -from ..config.logging_config import get_logger -from ..middleware.auth import get_current_user -from ..models.user import User -from ..utils.role_helpers import is_admin +from ...shared.config.database import get_db +from ...shared.config.logging_config import get_logger +from ...security.middleware.auth import get_current_user +from ...auth.models.user import User +from ...shared.utils.role_helpers import is_admin from ..models.service import Service from ..models.service_booking import ( ServiceBooking, @@ -18,8 +18,8 @@ from ..models.service_booking import ( ServicePaymentStatus, ServicePaymentMethod ) -from ..services.stripe_service import StripeService, get_stripe_secret_key, get_stripe_publishable_key -from ..config.settings import settings +from ...payments.services.stripe_service import StripeService, get_stripe_secret_key, get_stripe_publishable_key +from ...shared.config.settings import settings from ..schemas.service_booking import ( CreateServiceBookingRequest, CreateServicePaymentIntentRequest, diff --git a/Backend/src/routes/service_routes.py b/Backend/src/hotel_services/routes/service_routes.py similarity index 97% rename from Backend/src/routes/service_routes.py rename to Backend/src/hotel_services/routes/service_routes.py index d0ba3886..adf8f3b9 100644 --- a/Backend/src/routes/service_routes.py +++ b/Backend/src/hotel_services/routes/service_routes.py @@ -2,12 +2,12 @@ from fastapi import APIRouter, Depends, HTTPException, status, Query from sqlalchemy.orm import Session from sqlalchemy import or_ from typing import Optional -from ..config.database import get_db -from ..middleware.auth import get_current_user, authorize_roles -from ..models.user import User +from ...shared.config.database import get_db +from ...security.middleware.auth import get_current_user, authorize_roles +from ...auth.models.user import User from ..models.service import Service from ..models.service_usage import ServiceUsage -from ..models.booking import Booking, BookingStatus +from ...bookings.models.booking import Booking, BookingStatus router = APIRouter(prefix='/services', tags=['services']) @router.get('/') diff --git a/Backend/src/hotel_services/schemas/__init__.py b/Backend/src/hotel_services/schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/schemas/service_booking.py b/Backend/src/hotel_services/schemas/service_booking.py similarity index 97% rename from Backend/src/schemas/service_booking.py rename to Backend/src/hotel_services/schemas/service_booking.py index e960f6e2..e37a219d 100644 --- a/Backend/src/schemas/service_booking.py +++ b/Backend/src/hotel_services/schemas/service_booking.py @@ -3,7 +3,7 @@ Pydantic schemas for service booking-related requests and responses. """ from pydantic import BaseModel, Field, model_validator from typing import Optional, List -from ..schemas.booking import ServiceItemSchema +from ...bookings.schemas.booking import ServiceItemSchema class CreateServiceBookingRequest(BaseModel): diff --git a/Backend/src/hotel_services/services/__init__.py b/Backend/src/hotel_services/services/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/services/task_service.py b/Backend/src/hotel_services/services/task_service.py similarity index 98% rename from Backend/src/services/task_service.py rename to Backend/src/hotel_services/services/task_service.py index 47676ccc..b25a9aab 100644 --- a/Backend/src/services/task_service.py +++ b/Backend/src/hotel_services/services/task_service.py @@ -2,8 +2,8 @@ from sqlalchemy.orm import Session, joinedload, selectinload from sqlalchemy import and_, or_, func, desc, case from typing import Optional, Dict, List, Any from datetime import datetime, timedelta -from ..models.workflow import Task, TaskComment, TaskStatus, TaskPriority -from ..models.user import User +from ...system.models.workflow import Task, TaskComment, TaskStatus, TaskPriority +from ...auth.models.user import User import logging logger = logging.getLogger(__name__) @@ -215,7 +215,7 @@ class TaskService: # Update workflow instance status if this task belongs to one if task.workflow_instance_id: - from ..services.workflow_service import WorkflowService + from ...system.services.workflow_service import WorkflowService WorkflowService.complete_workflow_instance(db, task.workflow_instance_id) return task diff --git a/Backend/src/loyalty/__init__.py b/Backend/src/loyalty/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/loyalty/models/__init__.py b/Backend/src/loyalty/models/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/models/loyalty_point_transaction.py b/Backend/src/loyalty/models/loyalty_point_transaction.py similarity index 97% rename from Backend/src/models/loyalty_point_transaction.py rename to Backend/src/loyalty/models/loyalty_point_transaction.py index 3fbdea7a..766f4e02 100644 --- a/Backend/src/models/loyalty_point_transaction.py +++ b/Backend/src/loyalty/models/loyalty_point_transaction.py @@ -2,7 +2,7 @@ from sqlalchemy import Column, Integer, String, Numeric, Boolean, Text, DateTime from sqlalchemy.orm import relationship from datetime import datetime import enum -from ..config.database import Base +from ...shared.config.database import Base class TransactionType(str, enum.Enum): earned = 'earned' diff --git a/Backend/src/models/loyalty_reward.py b/Backend/src/loyalty/models/loyalty_reward.py similarity index 98% rename from Backend/src/models/loyalty_reward.py rename to Backend/src/loyalty/models/loyalty_reward.py index c6de5667..3e05eaa9 100644 --- a/Backend/src/models/loyalty_reward.py +++ b/Backend/src/loyalty/models/loyalty_reward.py @@ -2,7 +2,7 @@ from sqlalchemy import Column, Integer, String, Numeric, Boolean, Text, DateTime from sqlalchemy.orm import relationship from datetime import datetime import enum -from ..config.database import Base +from ...shared.config.database import Base class RewardType(str, enum.Enum): discount = 'discount' diff --git a/Backend/src/models/loyalty_tier.py b/Backend/src/loyalty/models/loyalty_tier.py similarity index 96% rename from Backend/src/models/loyalty_tier.py rename to Backend/src/loyalty/models/loyalty_tier.py index 9dd3da3c..e1a62cc2 100644 --- a/Backend/src/models/loyalty_tier.py +++ b/Backend/src/loyalty/models/loyalty_tier.py @@ -2,7 +2,7 @@ from sqlalchemy import Column, Integer, String, Numeric, Boolean, Text, DateTime from sqlalchemy.orm import relationship from datetime import datetime import enum -from ..config.database import Base +from ...shared.config.database import Base class TierLevel(str, enum.Enum): bronze = 'bronze' diff --git a/Backend/src/models/package.py b/Backend/src/loyalty/models/package.py similarity index 98% rename from Backend/src/models/package.py rename to Backend/src/loyalty/models/package.py index ebe7a638..1164f4d2 100644 --- a/Backend/src/models/package.py +++ b/Backend/src/loyalty/models/package.py @@ -2,7 +2,7 @@ from sqlalchemy import Column, Integer, String, Numeric, Boolean, Text, JSON, En from sqlalchemy.orm import relationship from datetime import datetime import enum -from ..config.database import Base +from ...shared.config.database import Base class PackageStatus(str, enum.Enum): active = 'active' diff --git a/Backend/src/models/promotion.py b/Backend/src/loyalty/models/promotion.py similarity index 98% rename from Backend/src/models/promotion.py rename to Backend/src/loyalty/models/promotion.py index ac499744..e2526a13 100644 --- a/Backend/src/models/promotion.py +++ b/Backend/src/loyalty/models/promotion.py @@ -2,7 +2,7 @@ from sqlalchemy import Column, Integer, String, DateTime, Numeric, Boolean, Text from sqlalchemy.orm import relationship from datetime import datetime import enum -from ..config.database import Base +from ...shared.config.database import Base class DiscountType(str, enum.Enum): percentage = 'percentage' diff --git a/Backend/src/models/referral.py b/Backend/src/loyalty/models/referral.py similarity index 97% rename from Backend/src/models/referral.py rename to Backend/src/loyalty/models/referral.py index 8f0bccf5..463e252f 100644 --- a/Backend/src/models/referral.py +++ b/Backend/src/loyalty/models/referral.py @@ -2,7 +2,7 @@ from sqlalchemy import Column, Integer, String, Numeric, Boolean, Text, DateTime from sqlalchemy.orm import relationship from datetime import datetime import enum -from ..config.database import Base +from ...shared.config.database import Base class ReferralStatus(str, enum.Enum): pending = 'pending' diff --git a/Backend/src/models/reward_redemption.py b/Backend/src/loyalty/models/reward_redemption.py similarity index 97% rename from Backend/src/models/reward_redemption.py rename to Backend/src/loyalty/models/reward_redemption.py index 42b9b0cb..edcbbb07 100644 --- a/Backend/src/models/reward_redemption.py +++ b/Backend/src/loyalty/models/reward_redemption.py @@ -2,7 +2,7 @@ from sqlalchemy import Column, Integer, String, Numeric, Boolean, Text, DateTime from sqlalchemy.orm import relationship from datetime import datetime import enum -from ..config.database import Base +from ...shared.config.database import Base class RedemptionStatus(str, enum.Enum): pending = 'pending' diff --git a/Backend/src/models/user_loyalty.py b/Backend/src/loyalty/models/user_loyalty.py similarity index 97% rename from Backend/src/models/user_loyalty.py rename to Backend/src/loyalty/models/user_loyalty.py index c86ee813..d41b0bbd 100644 --- a/Backend/src/models/user_loyalty.py +++ b/Backend/src/loyalty/models/user_loyalty.py @@ -1,7 +1,7 @@ from sqlalchemy import Column, Integer, String, Numeric, Boolean, Text, DateTime, ForeignKey, Date from sqlalchemy.orm import relationship from datetime import datetime -from ..config.database import Base +from ...shared.config.database import Base class UserLoyalty(Base): __tablename__ = 'user_loyalty' diff --git a/Backend/src/loyalty/routes/__init__.py b/Backend/src/loyalty/routes/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/routes/loyalty_routes.py b/Backend/src/loyalty/routes/loyalty_routes.py similarity index 98% rename from Backend/src/routes/loyalty_routes.py rename to Backend/src/loyalty/routes/loyalty_routes.py index 99eaac4c..b062fed7 100644 --- a/Backend/src/routes/loyalty_routes.py +++ b/Backend/src/loyalty/routes/loyalty_routes.py @@ -4,9 +4,9 @@ from sqlalchemy import func, desc from typing import Optional, List from datetime import datetime, date import logging -from ..config.database import get_db -from ..middleware.auth import get_current_user, authorize_roles -from ..models.user import User +from ...shared.config.database import get_db +from ...security.middleware.auth import get_current_user, authorize_roles +from ...auth.models.user import User from ..models.user_loyalty import UserLoyalty from ..models.loyalty_tier import LoyaltyTier, TierLevel from ..models.loyalty_point_transaction import LoyaltyPointTransaction, TransactionType, TransactionSource @@ -40,7 +40,7 @@ async def get_my_loyalty_status( """Get current user's loyalty status""" try: # Check if loyalty program is enabled - from ..models.system_settings import SystemSettings + from ...system.models.system_settings import SystemSettings setting = db.query(SystemSettings).filter( SystemSettings.key == 'loyalty_program_enabled' ).first() @@ -243,7 +243,7 @@ async def get_available_rewards( """Get available rewards for current user""" try: # Check if loyalty program is enabled - from ..models.system_settings import SystemSettings + from ...system.models.system_settings import SystemSettings setting = db.query(SystemSettings).filter( SystemSettings.key == 'loyalty_program_enabled' ).first() @@ -317,7 +317,7 @@ async def redeem_reward( """Redeem points for a reward""" try: # Check if loyalty program is enabled - from ..models.system_settings import SystemSettings + from ...system.models.system_settings import SystemSettings setting = db.query(SystemSettings).filter( SystemSettings.key == 'loyalty_program_enabled' ).first() @@ -497,7 +497,7 @@ async def get_loyalty_program_status( ): """Get loyalty program enabled/disabled status""" try: - from ..models.system_settings import SystemSettings + from ...system.models.system_settings import SystemSettings setting = db.query(SystemSettings).filter( SystemSettings.key == 'loyalty_program_enabled' ).first() @@ -525,7 +525,7 @@ async def update_loyalty_program_status( ): """Enable/disable loyalty program""" try: - from ..models.system_settings import SystemSettings + from ...system.models.system_settings import SystemSettings enabled = status_data.get('enabled', True) setting = db.query(SystemSettings).filter( diff --git a/Backend/src/routes/package_routes.py b/Backend/src/loyalty/routes/package_routes.py similarity index 98% rename from Backend/src/routes/package_routes.py rename to Backend/src/loyalty/routes/package_routes.py index 4b8fcb48..1375d1c5 100644 --- a/Backend/src/routes/package_routes.py +++ b/Backend/src/loyalty/routes/package_routes.py @@ -4,12 +4,12 @@ from sqlalchemy import or_, and_ from typing import Optional, List from datetime import datetime, date from decimal import Decimal -from ..config.database import get_db -from ..middleware.auth import get_current_user, authorize_roles -from ..models.user import User +from ...shared.config.database import get_db +from ...security.middleware.auth import get_current_user, authorize_roles +from ...auth.models.user import User from ..models.package import Package, PackageItem, PackageStatus, PackageItemType -from ..models.rate_plan import RatePlan -from ..models.room_type import RoomType +from ...rooms.models.rate_plan import RatePlan +from ...rooms.models.room_type import RoomType from pydantic import BaseModel router = APIRouter(prefix='/packages', tags=['packages']) diff --git a/Backend/src/routes/promotion_routes.py b/Backend/src/loyalty/routes/promotion_routes.py similarity index 98% rename from Backend/src/routes/promotion_routes.py rename to Backend/src/loyalty/routes/promotion_routes.py index e4fd5bba..b8dbfbe0 100644 --- a/Backend/src/routes/promotion_routes.py +++ b/Backend/src/loyalty/routes/promotion_routes.py @@ -3,10 +3,10 @@ from sqlalchemy.orm import Session from sqlalchemy import or_ from typing import Optional from datetime import datetime -from ..config.database import get_db -from ..config.logging_config import get_logger -from ..middleware.auth import get_current_user, authorize_roles -from ..models.user import User +from ...shared.config.database import get_db +from ...shared.config.logging_config import get_logger +from ...security.middleware.auth import get_current_user, authorize_roles +from ...auth.models.user import User from ..models.promotion import Promotion, DiscountType from ..schemas.promotion import ( ValidatePromotionRequest, diff --git a/Backend/src/loyalty/schemas/__init__.py b/Backend/src/loyalty/schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/schemas/promotion.py b/Backend/src/loyalty/schemas/promotion.py similarity index 100% rename from Backend/src/schemas/promotion.py rename to Backend/src/loyalty/schemas/promotion.py diff --git a/Backend/src/loyalty/services/__init__.py b/Backend/src/loyalty/services/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/services/loyalty_service.py b/Backend/src/loyalty/services/loyalty_service.py similarity index 99% rename from Backend/src/services/loyalty_service.py rename to Backend/src/loyalty/services/loyalty_service.py index 617cecb3..62cfe6d7 100644 --- a/Backend/src/services/loyalty_service.py +++ b/Backend/src/loyalty/services/loyalty_service.py @@ -9,8 +9,8 @@ from ..models.loyalty_point_transaction import LoyaltyPointTransaction, Transact from ..models.loyalty_reward import LoyaltyReward from ..models.reward_redemption import RewardRedemption, RedemptionStatus from ..models.referral import Referral, ReferralStatus -from ..models.booking import Booking, BookingStatus -from ..models.user import User +from ...bookings.models.booking import Booking, BookingStatus +from ...auth.models.user import User import logging logger = logging.getLogger(__name__) @@ -30,7 +30,7 @@ class LoyaltyService: def is_loyalty_enabled(db: Session) -> bool: """Check if loyalty program is enabled""" try: - from ..models.system_settings import SystemSettings + from ...system.models.system_settings import SystemSettings setting = db.query(SystemSettings).filter( SystemSettings.key == 'loyalty_program_enabled' ).first() diff --git a/Backend/src/main.py b/Backend/src/main.py index 23ed1a6f..70952e6c 100644 --- a/Backend/src/main.py +++ b/Backend/src/main.py @@ -15,37 +15,37 @@ import secrets import os import re import logging -from .config.settings import settings -from .config.logging_config import setup_logging, get_logger -from .config.database import engine, Base, get_db +from .shared.config.settings import settings +from .shared.config.logging_config import setup_logging, get_logger +from .shared.config.database import engine, Base, get_db from . import models from sqlalchemy.orm import Session logger = setup_logging() logger.info(f'Starting {settings.APP_NAME} v{settings.APP_VERSION} in {settings.ENVIRONMENT} mode') -from .middleware.error_handler import validation_exception_handler, integrity_error_handler, jwt_error_handler, http_exception_handler, general_exception_handler -from .middleware.request_id import RequestIDMiddleware -from .middleware.security import SecurityHeadersMiddleware -from .middleware.timeout import TimeoutMiddleware -from .middleware.cookie_consent import CookieConsentMiddleware -from .middleware.csrf import CSRFProtectionMiddleware -from .middleware.request_size_limit import RequestSizeLimitMiddleware -from .middleware.admin_ip_whitelist import AdminIPWhitelistMiddleware +from .shared.middleware.error_handler import validation_exception_handler, integrity_error_handler, jwt_error_handler, http_exception_handler, general_exception_handler +from .shared.middleware.request_id import RequestIDMiddleware +from .security.middleware.security import SecurityHeadersMiddleware +from .shared.middleware.timeout import TimeoutMiddleware +from .shared.middleware.cookie_consent import CookieConsentMiddleware +from .security.middleware.csrf import CSRFProtectionMiddleware +from .shared.middleware.request_size_limit import RequestSizeLimitMiddleware +from .security.middleware.admin_ip_whitelist import AdminIPWhitelistMiddleware if settings.is_development: logger.info('Creating database tables (development mode)') Base.metadata.create_all(bind=engine) else: try: - from .models.cookie_policy import CookiePolicy - from .models.cookie_integration_config import CookieIntegrationConfig - from .models.page_content import PageContent + from .content.models.cookie_policy import CookiePolicy + from .content.models.cookie_integration_config import CookieIntegrationConfig + from .content.models.page_content import PageContent logger.info('Ensuring required tables exist') CookiePolicy.__table__.create(bind=engine, checkfirst=True) CookieIntegrationConfig.__table__.create(bind=engine, checkfirst=True) PageContent.__table__.create(bind=engine, checkfirst=True) except Exception as e: logger.error(f'Failed to ensure required tables exist: {e}') -from .routes import auth_routes -from .routes import privacy_routes +from .auth.routes import auth_routes +from .content.routes import privacy_routes app = FastAPI(title=settings.APP_NAME, description='Enterprise-grade Hotel Booking API', version=settings.APP_VERSION, docs_url='/api/docs' if not settings.is_production else None, redoc_url='/api/redoc' if not settings.is_production else None, openapi_url='/api/openapi.json' if not settings.is_production else None) app.add_middleware(RequestIDMiddleware) app.add_middleware(CookieConsentMiddleware) @@ -125,19 +125,26 @@ async def health_check(db: Session=Depends(get_db)): @app.get('/metrics', tags=['monitoring']) async def metrics(): return {'status': 'success', 'service': settings.APP_NAME, 'version': settings.APP_VERSION, 'environment': settings.ENVIRONMENT, 'timestamp': datetime.utcnow().isoformat()} -# Import all route modules -from .routes import ( - room_routes, booking_routes, payment_routes, invoice_routes, banner_routes, - favorite_routes, service_routes, service_booking_routes, promotion_routes, - report_routes, review_routes, user_routes, audit_routes, admin_privacy_routes, - system_settings_routes, contact_routes, page_content_routes, home_routes, - about_routes, contact_content_routes, footer_routes, chat_routes, privacy_routes, - terms_routes, refunds_routes, cancellation_routes, accessibility_routes, - faq_routes, loyalty_routes, guest_profile_routes, analytics_routes, - workflow_routes, task_routes, notification_routes, group_booking_routes, - advanced_room_routes, rate_plan_routes, package_routes, security_routes, - email_campaign_routes, blog_routes +# Import all route modules from feature-based structure +from .auth.routes import auth_routes, user_routes +from .rooms.routes import room_routes, advanced_room_routes, rate_plan_routes +from .bookings.routes import booking_routes, group_booking_routes +from .payments.routes import payment_routes, invoice_routes +from .hotel_services.routes import service_routes, service_booking_routes +from .content.routes import ( + banner_routes, page_content_routes, home_routes, about_routes, + contact_routes, contact_content_routes, footer_routes, privacy_routes, + admin_privacy_routes, terms_routes, refunds_routes, cancellation_routes, + accessibility_routes, faq_routes, blog_routes ) +from .reviews.routes import review_routes, favorite_routes +from .loyalty.routes import promotion_routes, loyalty_routes, package_routes +from .guest_management.routes import guest_profile_routes +from .notifications.routes import chat_routes, notification_routes, email_campaign_routes +from .analytics.routes import analytics_routes, report_routes, audit_routes +from .security.routes import security_routes +from .system.routes import system_settings_routes, workflow_routes, task_routes +from .ai.routes import ai_assistant_routes # Register all routes with /api prefix (removed duplicate registrations) # Using /api prefix as standard, API versioning can be handled via headers if needed @@ -184,6 +191,7 @@ app.include_router(security_routes.router, prefix=api_prefix) app.include_router(email_campaign_routes.router, prefix=api_prefix) app.include_router(page_content_routes.router, prefix=api_prefix) app.include_router(blog_routes.router, prefix=api_prefix) +app.include_router(ai_assistant_routes.router, prefix=api_prefix) logger.info('All routes registered successfully') def ensure_jwt_secret(): @@ -252,6 +260,16 @@ async def startup_event(): if settings.is_production: raise # Fail fast in production + # Start AI Training Scheduler for automatic self-learning + try: + from .ai.services.ai_training_scheduler import get_training_scheduler + scheduler = get_training_scheduler() + scheduler.start() + logger.info('AI Training Scheduler started - automatic self-learning enabled') + except Exception as e: + logger.error(f'Failed to start AI Training Scheduler: {str(e)}', exc_info=True) + # Don't fail app startup if scheduler fails + logger.info(f'{settings.APP_NAME} started successfully') logger.info(f'Environment: {settings.ENVIRONMENT}') logger.info(f'Debug mode: {settings.DEBUG}') @@ -259,6 +277,15 @@ async def startup_event(): @app.on_event('shutdown') async def shutdown_event(): + # Stop AI Training Scheduler + try: + from .ai.services.ai_training_scheduler import get_training_scheduler + scheduler = get_training_scheduler() + scheduler.stop() + logger.info('AI Training Scheduler stopped') + except Exception as e: + logger.error(f'Error stopping AI Training Scheduler: {str(e)}', exc_info=True) + logger.info(f'{settings.APP_NAME} shutting down gracefully') if __name__ == '__main__': import uvicorn diff --git a/Backend/src/middleware/__pycache__/admin_ip_whitelist.cpython-312.pyc b/Backend/src/middleware/__pycache__/admin_ip_whitelist.cpython-312.pyc deleted file mode 100644 index f7cc0fe5..00000000 Binary files a/Backend/src/middleware/__pycache__/admin_ip_whitelist.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/middleware/__pycache__/auth.cpython-312.pyc b/Backend/src/middleware/__pycache__/auth.cpython-312.pyc deleted file mode 100644 index 8a4f74d2..00000000 Binary files a/Backend/src/middleware/__pycache__/auth.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/middleware/__pycache__/cookie_consent.cpython-312.pyc b/Backend/src/middleware/__pycache__/cookie_consent.cpython-312.pyc deleted file mode 100644 index c5e533b0..00000000 Binary files a/Backend/src/middleware/__pycache__/cookie_consent.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/middleware/__pycache__/csrf.cpython-312.pyc b/Backend/src/middleware/__pycache__/csrf.cpython-312.pyc deleted file mode 100644 index cbc3c83b..00000000 Binary files a/Backend/src/middleware/__pycache__/csrf.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/middleware/__pycache__/error_handler.cpython-312.pyc b/Backend/src/middleware/__pycache__/error_handler.cpython-312.pyc deleted file mode 100644 index 8cb39fdf..00000000 Binary files a/Backend/src/middleware/__pycache__/error_handler.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/middleware/__pycache__/request_id.cpython-312.pyc b/Backend/src/middleware/__pycache__/request_id.cpython-312.pyc deleted file mode 100644 index 8e26cf86..00000000 Binary files a/Backend/src/middleware/__pycache__/request_id.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/middleware/__pycache__/request_size_limit.cpython-312.pyc b/Backend/src/middleware/__pycache__/request_size_limit.cpython-312.pyc deleted file mode 100644 index ce2b5033..00000000 Binary files a/Backend/src/middleware/__pycache__/request_size_limit.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/middleware/__pycache__/security.cpython-312.pyc b/Backend/src/middleware/__pycache__/security.cpython-312.pyc deleted file mode 100644 index 21e79969..00000000 Binary files a/Backend/src/middleware/__pycache__/security.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/middleware/__pycache__/timeout.cpython-312.pyc b/Backend/src/middleware/__pycache__/timeout.cpython-312.pyc deleted file mode 100644 index b3a70c52..00000000 Binary files a/Backend/src/middleware/__pycache__/timeout.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/models/__init__.py b/Backend/src/models/__init__.py index 5a9a446d..5d8cf6db 100644 --- a/Backend/src/models/__init__.py +++ b/Backend/src/models/__init__.py @@ -1,48 +1,122 @@ -from .role import Role -from .user import User -from .refresh_token import RefreshToken -from .password_reset_token import PasswordResetToken -from .room_type import RoomType -from .room import Room -from .booking import Booking -from .payment import Payment -from .service import Service -from .service_usage import ServiceUsage -from .service_booking import ServiceBooking, ServiceBookingItem, ServicePayment, ServiceBookingStatus, ServicePaymentStatus, ServicePaymentMethod -from .promotion import Promotion -from .checkin_checkout import CheckInCheckOut -from .banner import Banner -from .blog import BlogPost -from .review import Review -from .favorite import Favorite -from .audit_log import AuditLog -from .cookie_policy import CookiePolicy -from .cookie_integration_config import CookieIntegrationConfig -from .system_settings import SystemSettings -from .invoice import Invoice, InvoiceItem -from .page_content import PageContent, PageType -from .chat import Chat, ChatMessage, ChatStatus -from .loyalty_tier import LoyaltyTier, TierLevel -from .user_loyalty import UserLoyalty -from .loyalty_point_transaction import LoyaltyPointTransaction, TransactionType, TransactionSource -from .loyalty_reward import LoyaltyReward, RewardType, RewardStatus -from .reward_redemption import RewardRedemption, RedemptionStatus -from .referral import Referral, ReferralStatus -from .guest_preference import GuestPreference -from .guest_note import GuestNote -from .guest_tag import GuestTag, guest_tag_association -from .guest_communication import GuestCommunication, CommunicationType, CommunicationDirection -from .guest_segment import GuestSegment, guest_segment_association -from .workflow import Workflow, WorkflowInstance, Task, TaskComment, WorkflowType, WorkflowStatus, WorkflowTrigger, TaskStatus, TaskPriority -from .notification import Notification, NotificationTemplate, NotificationPreference, NotificationDeliveryLog, NotificationChannel, NotificationStatus, NotificationType -from .group_booking import GroupBooking, GroupBookingMember, GroupRoomBlock, GroupPayment, GroupBookingStatus, PaymentOption -from .room_maintenance import RoomMaintenance, MaintenanceType, MaintenanceStatus -from .housekeeping_task import HousekeepingTask, HousekeepingStatus, HousekeepingType -from .room_inspection import RoomInspection, InspectionType, InspectionStatus -from .room_attribute import RoomAttribute -from .rate_plan import RatePlan, RatePlanRule, RatePlanType, RatePlanStatus -from .package import Package, PackageItem, PackageStatus, PackageItemType -from .security_event import SecurityEvent, SecurityEventType, SecurityEventSeverity, IPWhitelist, IPBlacklist, OAuthProvider, OAuthToken -from .gdpr_compliance import DataSubjectRequest, DataSubjectRequestType, DataSubjectRequestStatus, DataRetentionPolicy, ConsentRecord -from .email_campaign import Campaign, CampaignStatus, CampaignType, CampaignSegment, EmailTemplate, CampaignEmail, EmailStatus, EmailClick, DripSequence, DripSequenceStep, DripSequenceEnrollment, Unsubscribe -__all__ = ['Role', 'User', 'RefreshToken', 'PasswordResetToken', 'RoomType', 'Room', 'Booking', 'Payment', 'Service', 'ServiceUsage', 'ServiceBooking', 'ServiceBookingItem', 'ServicePayment', 'ServiceBookingStatus', 'ServicePaymentStatus', 'ServicePaymentMethod', 'Promotion', 'CheckInCheckOut', 'Banner', 'BlogPost', 'Review', 'Favorite', 'AuditLog', 'CookiePolicy', 'CookieIntegrationConfig', 'SystemSettings', 'Invoice', 'InvoiceItem', 'PageContent', 'PageType', 'Chat', 'ChatMessage', 'ChatStatus', 'LoyaltyTier', 'TierLevel', 'UserLoyalty', 'LoyaltyPointTransaction', 'TransactionType', 'TransactionSource', 'LoyaltyReward', 'RewardType', 'RewardStatus', 'RewardRedemption', 'RedemptionStatus', 'Referral', 'ReferralStatus', 'GuestPreference', 'GuestNote', 'GuestTag', 'guest_tag_association', 'GuestCommunication', 'CommunicationType', 'CommunicationDirection', 'GuestSegment', 'guest_segment_association', 'Workflow', 'WorkflowInstance', 'Task', 'TaskComment', 'WorkflowType', 'WorkflowStatus', 'WorkflowTrigger', 'TaskStatus', 'TaskPriority', 'Notification', 'NotificationTemplate', 'NotificationPreference', 'NotificationDeliveryLog', 'NotificationChannel', 'NotificationStatus', 'NotificationType', 'GroupBooking', 'GroupBookingMember', 'GroupRoomBlock', 'GroupPayment', 'GroupBookingStatus', 'PaymentOption', 'RoomMaintenance', 'MaintenanceType', 'MaintenanceStatus', 'HousekeepingTask', 'HousekeepingStatus', 'HousekeepingType', 'RoomInspection', 'InspectionType', 'InspectionStatus', 'RoomAttribute', 'RatePlan', 'RatePlanRule', 'RatePlanType', 'RatePlanStatus', 'Package', 'PackageItem', 'PackageStatus', 'PackageItemType', 'SecurityEvent', 'SecurityEventType', 'SecurityEventSeverity', 'IPWhitelist', 'IPBlacklist', 'OAuthProvider', 'OAuthToken', 'DataSubjectRequest', 'DataSubjectRequestType', 'DataSubjectRequestStatus', 'DataRetentionPolicy', 'ConsentRecord', 'Campaign', 'CampaignStatus', 'CampaignType', 'CampaignSegment', 'EmailTemplate', 'CampaignEmail', 'EmailStatus', 'EmailClick', 'DripSequence', 'DripSequenceStep', 'DripSequenceEnrollment', 'Unsubscribe'] \ No newline at end of file +""" +Central models module - imports from feature-based modules +This maintains backward compatibility while using the new structure +""" + +# Auth models +from ..auth.models.role import Role +from ..auth.models.user import User +from ..auth.models.refresh_token import RefreshToken +from ..auth.models.password_reset_token import PasswordResetToken + +# Room models +from ..rooms.models.room_type import RoomType +from ..rooms.models.room import Room +from ..rooms.models.room_attribute import RoomAttribute +from ..rooms.models.room_maintenance import RoomMaintenance, MaintenanceType, MaintenanceStatus +from ..rooms.models.room_inspection import RoomInspection, InspectionType, InspectionStatus +from ..rooms.models.rate_plan import RatePlan, RatePlanRule, RatePlanType, RatePlanStatus + +# Booking models +from ..bookings.models.booking import Booking +from ..bookings.models.checkin_checkout import CheckInCheckOut +from ..bookings.models.group_booking import GroupBooking, GroupBookingMember, GroupRoomBlock, GroupPayment, GroupBookingStatus, PaymentOption + +# Payment models +from ..payments.models.payment import Payment +from ..payments.models.invoice import Invoice, InvoiceItem + +# Hotel Services models +from ..hotel_services.models.service import Service +from ..hotel_services.models.service_usage import ServiceUsage +from ..hotel_services.models.service_booking import ServiceBooking, ServiceBookingItem, ServicePayment, ServiceBookingStatus, ServicePaymentStatus, ServicePaymentMethod +from ..hotel_services.models.housekeeping_task import HousekeepingTask, HousekeepingStatus, HousekeepingType + +# Content models +from ..content.models.banner import Banner +from ..content.models.blog import BlogPost +from ..content.models.page_content import PageContent, PageType +from ..content.models.cookie_policy import CookiePolicy +from ..content.models.cookie_integration_config import CookieIntegrationConfig + +# Review models +from ..reviews.models.review import Review +from ..reviews.models.favorite import Favorite + +# Analytics models +from ..analytics.models.audit_log import AuditLog + +# System models +from ..system.models.system_settings import SystemSettings +from ..system.models.workflow import Workflow, WorkflowInstance, Task, TaskComment, WorkflowType, WorkflowStatus, WorkflowTrigger, TaskStatus, TaskPriority + +# AI models +from ..ai.models.chat import Chat, ChatMessage, ChatStatus +from ..ai.models.ai_conversation import ( + AIConversation, AIConversationFeedback, AILearnedPattern, + AIKnowledgeEntry, AITrainingMetrics +) + +# Loyalty models +from ..loyalty.models.loyalty_tier import LoyaltyTier, TierLevel +from ..loyalty.models.user_loyalty import UserLoyalty +from ..loyalty.models.loyalty_point_transaction import LoyaltyPointTransaction, TransactionType, TransactionSource +from ..loyalty.models.loyalty_reward import LoyaltyReward, RewardType, RewardStatus +from ..loyalty.models.reward_redemption import RewardRedemption, RedemptionStatus +from ..loyalty.models.referral import Referral, ReferralStatus +from ..loyalty.models.promotion import Promotion +from ..loyalty.models.package import Package, PackageItem, PackageStatus, PackageItemType + +# Guest Management models +from ..guest_management.models.guest_preference import GuestPreference +from ..guest_management.models.guest_note import GuestNote +from ..guest_management.models.guest_tag import GuestTag, guest_tag_association +from ..guest_management.models.guest_communication import GuestCommunication, CommunicationType, CommunicationDirection +from ..guest_management.models.guest_segment import GuestSegment, guest_segment_association + +# Notification models +from ..notifications.models.notification import Notification, NotificationTemplate, NotificationPreference, NotificationDeliveryLog, NotificationChannel, NotificationStatus, NotificationType +from ..notifications.models.email_campaign import Campaign, CampaignStatus, CampaignType, CampaignSegment, EmailTemplate, CampaignEmail, EmailStatus, EmailClick, DripSequence, DripSequenceStep, DripSequenceEnrollment, Unsubscribe + +# Security models +from ..security.models.security_event import SecurityEvent, SecurityEventType, SecurityEventSeverity, IPWhitelist, IPBlacklist, OAuthProvider, OAuthToken +from ..security.models.gdpr_compliance import DataSubjectRequest, DataSubjectRequestType, DataSubjectRequestStatus, DataRetentionPolicy, ConsentRecord + +__all__ = [ + # Auth + 'Role', 'User', 'RefreshToken', 'PasswordResetToken', + # Rooms + 'RoomType', 'Room', 'RoomAttribute', 'RoomMaintenance', 'MaintenanceType', 'MaintenanceStatus', + 'RoomInspection', 'InspectionType', 'InspectionStatus', 'RatePlan', 'RatePlanRule', 'RatePlanType', 'RatePlanStatus', + # Bookings + 'Booking', 'CheckInCheckOut', 'GroupBooking', 'GroupBookingMember', 'GroupRoomBlock', 'GroupPayment', 'GroupBookingStatus', 'PaymentOption', + # Payments + 'Payment', 'Invoice', 'InvoiceItem', + # Hotel Services + 'Service', 'ServiceUsage', 'ServiceBooking', 'ServiceBookingItem', 'ServicePayment', 'ServiceBookingStatus', 'ServicePaymentStatus', 'ServicePaymentMethod', + 'HousekeepingTask', 'HousekeepingStatus', 'HousekeepingType', + # Content + 'Banner', 'BlogPost', 'PageContent', 'PageType', 'CookiePolicy', 'CookieIntegrationConfig', + # Reviews + 'Review', 'Favorite', + # Analytics + 'AuditLog', + # System + 'SystemSettings', 'Workflow', 'WorkflowInstance', 'Task', 'TaskComment', 'WorkflowType', 'WorkflowStatus', 'WorkflowTrigger', 'TaskStatus', 'TaskPriority', + # AI + 'Chat', 'ChatMessage', 'ChatStatus', 'AIConversation', 'AIConversationFeedback', 'AILearnedPattern', 'AIKnowledgeEntry', 'AITrainingMetrics', + # Loyalty + 'LoyaltyTier', 'TierLevel', 'UserLoyalty', 'LoyaltyPointTransaction', 'TransactionType', 'TransactionSource', + 'LoyaltyReward', 'RewardType', 'RewardStatus', 'RewardRedemption', 'RedemptionStatus', 'Referral', 'ReferralStatus', + 'Promotion', 'Package', 'PackageItem', 'PackageStatus', 'PackageItemType', + # Guest Management + 'GuestPreference', 'GuestNote', 'GuestTag', 'guest_tag_association', 'GuestCommunication', 'CommunicationType', 'CommunicationDirection', + 'GuestSegment', 'guest_segment_association', + # Notifications + 'Notification', 'NotificationTemplate', 'NotificationPreference', 'NotificationDeliveryLog', 'NotificationChannel', 'NotificationStatus', 'NotificationType', + 'Campaign', 'CampaignStatus', 'CampaignType', 'CampaignSegment', 'EmailTemplate', 'CampaignEmail', 'EmailStatus', 'EmailClick', + 'DripSequence', 'DripSequenceStep', 'DripSequenceEnrollment', 'Unsubscribe', + # Security + 'SecurityEvent', 'SecurityEventType', 'SecurityEventSeverity', 'IPWhitelist', 'IPBlacklist', 'OAuthProvider', 'OAuthToken', + 'DataSubjectRequest', 'DataSubjectRequestType', 'DataSubjectRequestStatus', 'DataRetentionPolicy', 'ConsentRecord', +] diff --git a/Backend/src/models/__pycache__/__init__.cpython-312.pyc b/Backend/src/models/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 4a206a61..00000000 Binary files a/Backend/src/models/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/models/__pycache__/audit_log.cpython-312.pyc b/Backend/src/models/__pycache__/audit_log.cpython-312.pyc deleted file mode 100644 index 5aa70c07..00000000 Binary files a/Backend/src/models/__pycache__/audit_log.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/models/__pycache__/banner.cpython-312.pyc b/Backend/src/models/__pycache__/banner.cpython-312.pyc deleted file mode 100644 index 6f1a7259..00000000 Binary files a/Backend/src/models/__pycache__/banner.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/models/__pycache__/blog.cpython-312.pyc b/Backend/src/models/__pycache__/blog.cpython-312.pyc deleted file mode 100644 index 83713e12..00000000 Binary files a/Backend/src/models/__pycache__/blog.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/models/__pycache__/booking.cpython-312.pyc b/Backend/src/models/__pycache__/booking.cpython-312.pyc deleted file mode 100644 index 487efac1..00000000 Binary files a/Backend/src/models/__pycache__/booking.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/models/__pycache__/chat.cpython-312.pyc b/Backend/src/models/__pycache__/chat.cpython-312.pyc deleted file mode 100644 index 0f02ac49..00000000 Binary files a/Backend/src/models/__pycache__/chat.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/models/__pycache__/checkin_checkout.cpython-312.pyc b/Backend/src/models/__pycache__/checkin_checkout.cpython-312.pyc deleted file mode 100644 index d5dfef8c..00000000 Binary files a/Backend/src/models/__pycache__/checkin_checkout.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/models/__pycache__/cookie_integration_config.cpython-312.pyc b/Backend/src/models/__pycache__/cookie_integration_config.cpython-312.pyc deleted file mode 100644 index 9a756060..00000000 Binary files a/Backend/src/models/__pycache__/cookie_integration_config.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/models/__pycache__/cookie_policy.cpython-312.pyc b/Backend/src/models/__pycache__/cookie_policy.cpython-312.pyc deleted file mode 100644 index a7653884..00000000 Binary files a/Backend/src/models/__pycache__/cookie_policy.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/models/__pycache__/email_campaign.cpython-312.pyc b/Backend/src/models/__pycache__/email_campaign.cpython-312.pyc deleted file mode 100644 index 0bf935ee..00000000 Binary files a/Backend/src/models/__pycache__/email_campaign.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/models/__pycache__/favorite.cpython-312.pyc b/Backend/src/models/__pycache__/favorite.cpython-312.pyc deleted file mode 100644 index 9e4ba738..00000000 Binary files a/Backend/src/models/__pycache__/favorite.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/models/__pycache__/gdpr_compliance.cpython-312.pyc b/Backend/src/models/__pycache__/gdpr_compliance.cpython-312.pyc deleted file mode 100644 index 4ea80806..00000000 Binary files a/Backend/src/models/__pycache__/gdpr_compliance.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/models/__pycache__/group_booking.cpython-312.pyc b/Backend/src/models/__pycache__/group_booking.cpython-312.pyc deleted file mode 100644 index c54dfbee..00000000 Binary files a/Backend/src/models/__pycache__/group_booking.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/models/__pycache__/guest_communication.cpython-312.pyc b/Backend/src/models/__pycache__/guest_communication.cpython-312.pyc deleted file mode 100644 index b2da0b6a..00000000 Binary files a/Backend/src/models/__pycache__/guest_communication.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/models/__pycache__/guest_note.cpython-312.pyc b/Backend/src/models/__pycache__/guest_note.cpython-312.pyc deleted file mode 100644 index 9b86be55..00000000 Binary files a/Backend/src/models/__pycache__/guest_note.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/models/__pycache__/guest_preference.cpython-312.pyc b/Backend/src/models/__pycache__/guest_preference.cpython-312.pyc deleted file mode 100644 index b362f264..00000000 Binary files a/Backend/src/models/__pycache__/guest_preference.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/models/__pycache__/guest_segment.cpython-312.pyc b/Backend/src/models/__pycache__/guest_segment.cpython-312.pyc deleted file mode 100644 index a6503585..00000000 Binary files a/Backend/src/models/__pycache__/guest_segment.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/models/__pycache__/guest_tag.cpython-312.pyc b/Backend/src/models/__pycache__/guest_tag.cpython-312.pyc deleted file mode 100644 index 1e356f8a..00000000 Binary files a/Backend/src/models/__pycache__/guest_tag.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/models/__pycache__/housekeeping_task.cpython-312.pyc b/Backend/src/models/__pycache__/housekeeping_task.cpython-312.pyc deleted file mode 100644 index 07ceb05a..00000000 Binary files a/Backend/src/models/__pycache__/housekeeping_task.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/models/__pycache__/invoice.cpython-312.pyc b/Backend/src/models/__pycache__/invoice.cpython-312.pyc deleted file mode 100644 index 46ee8f6f..00000000 Binary files a/Backend/src/models/__pycache__/invoice.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/models/__pycache__/loyalty_point_transaction.cpython-312.pyc b/Backend/src/models/__pycache__/loyalty_point_transaction.cpython-312.pyc deleted file mode 100644 index b03f9718..00000000 Binary files a/Backend/src/models/__pycache__/loyalty_point_transaction.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/models/__pycache__/loyalty_reward.cpython-312.pyc b/Backend/src/models/__pycache__/loyalty_reward.cpython-312.pyc deleted file mode 100644 index d2db6252..00000000 Binary files a/Backend/src/models/__pycache__/loyalty_reward.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/models/__pycache__/loyalty_tier.cpython-312.pyc b/Backend/src/models/__pycache__/loyalty_tier.cpython-312.pyc deleted file mode 100644 index 39652193..00000000 Binary files a/Backend/src/models/__pycache__/loyalty_tier.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/models/__pycache__/notification.cpython-312.pyc b/Backend/src/models/__pycache__/notification.cpython-312.pyc deleted file mode 100644 index 81a63fea..00000000 Binary files a/Backend/src/models/__pycache__/notification.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/models/__pycache__/package.cpython-312.pyc b/Backend/src/models/__pycache__/package.cpython-312.pyc deleted file mode 100644 index 066d8e78..00000000 Binary files a/Backend/src/models/__pycache__/package.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/models/__pycache__/page_content.cpython-312.pyc b/Backend/src/models/__pycache__/page_content.cpython-312.pyc deleted file mode 100644 index f656c9cf..00000000 Binary files a/Backend/src/models/__pycache__/page_content.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/models/__pycache__/password_reset_token.cpython-312.pyc b/Backend/src/models/__pycache__/password_reset_token.cpython-312.pyc deleted file mode 100644 index e5936ee0..00000000 Binary files a/Backend/src/models/__pycache__/password_reset_token.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/models/__pycache__/payment.cpython-312.pyc b/Backend/src/models/__pycache__/payment.cpython-312.pyc deleted file mode 100644 index 9b7a4f29..00000000 Binary files a/Backend/src/models/__pycache__/payment.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/models/__pycache__/promotion.cpython-312.pyc b/Backend/src/models/__pycache__/promotion.cpython-312.pyc deleted file mode 100644 index eaeaa143..00000000 Binary files a/Backend/src/models/__pycache__/promotion.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/models/__pycache__/rate_plan.cpython-312.pyc b/Backend/src/models/__pycache__/rate_plan.cpython-312.pyc deleted file mode 100644 index 42d44f9c..00000000 Binary files a/Backend/src/models/__pycache__/rate_plan.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/models/__pycache__/referral.cpython-312.pyc b/Backend/src/models/__pycache__/referral.cpython-312.pyc deleted file mode 100644 index a45decab..00000000 Binary files a/Backend/src/models/__pycache__/referral.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/models/__pycache__/refresh_token.cpython-312.pyc b/Backend/src/models/__pycache__/refresh_token.cpython-312.pyc deleted file mode 100644 index 34942cff..00000000 Binary files a/Backend/src/models/__pycache__/refresh_token.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/models/__pycache__/review.cpython-312.pyc b/Backend/src/models/__pycache__/review.cpython-312.pyc deleted file mode 100644 index 76da59e6..00000000 Binary files a/Backend/src/models/__pycache__/review.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/models/__pycache__/reward_redemption.cpython-312.pyc b/Backend/src/models/__pycache__/reward_redemption.cpython-312.pyc deleted file mode 100644 index 16bb912f..00000000 Binary files a/Backend/src/models/__pycache__/reward_redemption.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/models/__pycache__/role.cpython-312.pyc b/Backend/src/models/__pycache__/role.cpython-312.pyc deleted file mode 100644 index 50939b3e..00000000 Binary files a/Backend/src/models/__pycache__/role.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/models/__pycache__/room.cpython-312.pyc b/Backend/src/models/__pycache__/room.cpython-312.pyc deleted file mode 100644 index b69d4ed6..00000000 Binary files a/Backend/src/models/__pycache__/room.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/models/__pycache__/room_attribute.cpython-312.pyc b/Backend/src/models/__pycache__/room_attribute.cpython-312.pyc deleted file mode 100644 index 3f77515c..00000000 Binary files a/Backend/src/models/__pycache__/room_attribute.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/models/__pycache__/room_inspection.cpython-312.pyc b/Backend/src/models/__pycache__/room_inspection.cpython-312.pyc deleted file mode 100644 index 8e564bc9..00000000 Binary files a/Backend/src/models/__pycache__/room_inspection.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/models/__pycache__/room_maintenance.cpython-312.pyc b/Backend/src/models/__pycache__/room_maintenance.cpython-312.pyc deleted file mode 100644 index 16eda3bc..00000000 Binary files a/Backend/src/models/__pycache__/room_maintenance.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/models/__pycache__/room_type.cpython-312.pyc b/Backend/src/models/__pycache__/room_type.cpython-312.pyc deleted file mode 100644 index 2b07212d..00000000 Binary files a/Backend/src/models/__pycache__/room_type.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/models/__pycache__/security_event.cpython-312.pyc b/Backend/src/models/__pycache__/security_event.cpython-312.pyc deleted file mode 100644 index 1881fb7f..00000000 Binary files a/Backend/src/models/__pycache__/security_event.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/models/__pycache__/service.cpython-312.pyc b/Backend/src/models/__pycache__/service.cpython-312.pyc deleted file mode 100644 index 0620cd10..00000000 Binary files a/Backend/src/models/__pycache__/service.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/models/__pycache__/service_booking.cpython-312.pyc b/Backend/src/models/__pycache__/service_booking.cpython-312.pyc deleted file mode 100644 index e06b7fba..00000000 Binary files a/Backend/src/models/__pycache__/service_booking.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/models/__pycache__/service_usage.cpython-312.pyc b/Backend/src/models/__pycache__/service_usage.cpython-312.pyc deleted file mode 100644 index b64dc058..00000000 Binary files a/Backend/src/models/__pycache__/service_usage.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/models/__pycache__/system_settings.cpython-312.pyc b/Backend/src/models/__pycache__/system_settings.cpython-312.pyc deleted file mode 100644 index c4ed15f4..00000000 Binary files a/Backend/src/models/__pycache__/system_settings.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/models/__pycache__/user.cpython-312.pyc b/Backend/src/models/__pycache__/user.cpython-312.pyc deleted file mode 100644 index 19d96464..00000000 Binary files a/Backend/src/models/__pycache__/user.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/models/__pycache__/user_loyalty.cpython-312.pyc b/Backend/src/models/__pycache__/user_loyalty.cpython-312.pyc deleted file mode 100644 index 09538007..00000000 Binary files a/Backend/src/models/__pycache__/user_loyalty.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/models/__pycache__/workflow.cpython-312.pyc b/Backend/src/models/__pycache__/workflow.cpython-312.pyc deleted file mode 100644 index 93bd0ee9..00000000 Binary files a/Backend/src/models/__pycache__/workflow.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/notifications/__init__.py b/Backend/src/notifications/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/notifications/models/__init__.py b/Backend/src/notifications/models/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/models/email_campaign.py b/Backend/src/notifications/models/email_campaign.py similarity index 99% rename from Backend/src/models/email_campaign.py rename to Backend/src/notifications/models/email_campaign.py index f0367ea6..260250cd 100644 --- a/Backend/src/models/email_campaign.py +++ b/Backend/src/notifications/models/email_campaign.py @@ -2,7 +2,7 @@ from sqlalchemy import Column, Integer, String, Text, DateTime, ForeignKey, JSON from sqlalchemy.orm import relationship from datetime import datetime import enum -from ..config.database import Base +from ...shared.config.database import Base class CampaignStatus(str, enum.Enum): draft = 'draft' diff --git a/Backend/src/models/notification.py b/Backend/src/notifications/models/notification.py similarity index 99% rename from Backend/src/models/notification.py rename to Backend/src/notifications/models/notification.py index 81c5854d..6865a3fc 100644 --- a/Backend/src/models/notification.py +++ b/Backend/src/notifications/models/notification.py @@ -2,7 +2,7 @@ from sqlalchemy import Column, Integer, String, DateTime, Boolean, Text, Enum, F from sqlalchemy.orm import relationship from datetime import datetime import enum -from ..config.database import Base +from ...shared.config.database import Base class NotificationChannel(str, enum.Enum): email = 'email' diff --git a/Backend/src/notifications/routes/__init__.py b/Backend/src/notifications/routes/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/routes/chat_routes.py b/Backend/src/notifications/routes/chat_routes.py similarity index 96% rename from Backend/src/routes/chat_routes.py rename to Backend/src/notifications/routes/chat_routes.py index 0d70288e..ff3026bb 100644 --- a/Backend/src/routes/chat_routes.py +++ b/Backend/src/notifications/routes/chat_routes.py @@ -4,12 +4,12 @@ from sqlalchemy import and_, or_ from typing import List, Optional from datetime import datetime import json -from ..config.database import get_db -from ..config.logging_config import get_logger -from ..middleware.auth import get_current_user, get_current_user_optional -from ..models.user import User -from ..models.chat import Chat, ChatMessage, ChatStatus -from ..models.role import Role +from ...shared.config.database import get_db +from ...shared.config.logging_config import get_logger +from ...security.middleware.auth import get_current_user, get_current_user_optional +from ...auth.models.user import User +from ...ai.models.chat import Chat, ChatMessage, ChatStatus +from ...auth.models.role import Role logger = get_logger(__name__) router = APIRouter(prefix='/chat', tags=['chat']) @@ -251,8 +251,8 @@ async def websocket_chat(websocket: WebSocket, chat_id: int, user_type: str=None current_user = None if user_type == 'staff' and token: try: - from ..middleware.auth import verify_token - from ..config.database import get_db + from ...security.middleware.auth import verify_token + from ...shared.config.database import get_db payload = verify_token(token) user_id = payload.get('userId') db_gen = get_db() @@ -275,7 +275,7 @@ async def websocket_chat(websocket: WebSocket, chat_id: int, user_type: str=None data = await websocket.receive_text() message_data = json.loads(data) if message_data.get('type') == 'message': - from ..config.database import get_db + from ...shared.config.database import get_db db_gen = get_db() db = next(db_gen) try: @@ -323,8 +323,8 @@ async def websocket_staff_notifications(websocket: WebSocket): await websocket.close(code=1008, reason='Token required') return try: - from ..middleware.auth import verify_token - from ..config.database import get_db + from ...security.middleware.auth import verify_token + from ...shared.config.database import get_db payload = verify_token(token) user_id = payload.get('userId') if not user_id: diff --git a/Backend/src/routes/email_campaign_routes.py b/Backend/src/notifications/routes/email_campaign_routes.py similarity index 96% rename from Backend/src/routes/email_campaign_routes.py rename to Backend/src/notifications/routes/email_campaign_routes.py index 4110029e..11c2aa92 100644 --- a/Backend/src/routes/email_campaign_routes.py +++ b/Backend/src/notifications/routes/email_campaign_routes.py @@ -4,9 +4,9 @@ from typing import Optional, List, Union from datetime import datetime from pydantic import BaseModel, EmailStr, field_validator -from ..config.database import get_db -from ..middleware.auth import get_current_user, authorize_roles -from ..models.user import User +from ...shared.config.database import get_db +from ...security.middleware.auth import get_current_user, authorize_roles +from ...auth.models.user import User from ..models.email_campaign import ( Campaign, CampaignStatus, CampaignType, CampaignSegment, EmailTemplate, CampaignEmail, EmailStatus, @@ -175,7 +175,7 @@ async def get_segments( except HTTPException: raise except Exception as e: - from ..config.logging_config import get_logger + from ...shared.config.logging_config import get_logger logger = get_logger(__name__) logger.error(f"Error fetching segments: {str(e)}", exc_info=True) raise HTTPException(status_code=500, detail=f"Failed to fetch segments: {str(e)}") @@ -199,7 +199,7 @@ async def create_segment( except HTTPException: raise except Exception as e: - from ..config.logging_config import get_logger + from ...shared.config.logging_config import get_logger logger = get_logger(__name__) logger.error(f"Error creating segment: {str(e)}", exc_info=True) raise HTTPException(status_code=500, detail=f"Failed to create segment: {str(e)}") @@ -230,7 +230,7 @@ async def get_templates( except HTTPException: raise except Exception as e: - from ..config.logging_config import get_logger + from ...shared.config.logging_config import get_logger logger = get_logger(__name__) logger.error(f"Error fetching templates: {str(e)}", exc_info=True) raise HTTPException(status_code=500, detail=f"Failed to fetch templates: {str(e)}") @@ -259,7 +259,7 @@ async def create_template( except HTTPException: raise except Exception as e: - from ..config.logging_config import get_logger + from ...shared.config.logging_config import get_logger logger = get_logger(__name__) logger.error(f"Error creating template: {str(e)}", exc_info=True) db.rollback() @@ -289,7 +289,7 @@ async def get_drip_sequences( except HTTPException: raise except Exception as e: - from ..config.logging_config import get_logger + from ...shared.config.logging_config import get_logger logger = get_logger(__name__) logger.error(f"Error fetching drip sequences: {str(e)}", exc_info=True) raise HTTPException(status_code=500, detail=f"Failed to fetch drip sequences: {str(e)}") @@ -313,7 +313,7 @@ async def create_drip_sequence( except HTTPException: raise except Exception as e: - from ..config.logging_config import get_logger + from ...shared.config.logging_config import get_logger logger = get_logger(__name__) logger.error(f"Error creating drip sequence: {str(e)}", exc_info=True) raise HTTPException(status_code=500, detail=f"Failed to create drip sequence: {str(e)}") @@ -344,7 +344,7 @@ async def add_drip_step( except HTTPException: raise except Exception as e: - from ..config.logging_config import get_logger + from ...shared.config.logging_config import get_logger logger = get_logger(__name__) logger.error(f"Error adding drip step: {str(e)}", exc_info=True) raise HTTPException(status_code=500, detail=f"Failed to add drip step: {str(e)}") @@ -577,7 +577,7 @@ async def process_drip_sequences( except HTTPException: raise except Exception as e: - from ..config.logging_config import get_logger + from ...shared.config.logging_config import get_logger logger = get_logger(__name__) logger.error(f"Error processing drip sequences: {str(e)}", exc_info=True) raise HTTPException(status_code=500, detail=f"Failed to process drip sequences: {str(e)}") diff --git a/Backend/src/routes/notification_routes.py b/Backend/src/notifications/routes/notification_routes.py similarity index 98% rename from Backend/src/routes/notification_routes.py rename to Backend/src/notifications/routes/notification_routes.py index b560e5c6..8cee6787 100644 --- a/Backend/src/routes/notification_routes.py +++ b/Backend/src/notifications/routes/notification_routes.py @@ -1,9 +1,9 @@ from fastapi import APIRouter, Depends, HTTPException, Query, Body from sqlalchemy.orm import Session from typing import Optional, List, Dict, Any -from ..config.database import get_db -from ..middleware.auth import authorize_roles, get_current_user -from ..models.user import User +from ...shared.config.database import get_db +from ...security.middleware.auth import authorize_roles, get_current_user +from ...auth.models.user import User from ..models.notification import NotificationChannel, NotificationStatus, NotificationType from ..services.notification_service import NotificationService from pydantic import BaseModel diff --git a/Backend/src/notifications/schemas/__init__.py b/Backend/src/notifications/schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/notifications/services/__init__.py b/Backend/src/notifications/services/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/services/email_campaign_service.py b/Backend/src/notifications/services/email_campaign_service.py similarity index 98% rename from Backend/src/services/email_campaign_service.py rename to Backend/src/notifications/services/email_campaign_service.py index 0a9d138e..c62dce35 100644 --- a/Backend/src/services/email_campaign_service.py +++ b/Backend/src/notifications/services/email_campaign_service.py @@ -6,10 +6,10 @@ from ..models.email_campaign import ( CampaignSegment, EmailTemplate, CampaignEmail, EmailClick, DripSequence, DripSequenceStep, DripSequenceEnrollment, Unsubscribe ) -from ..models.user import User -from ..models.booking import Booking -from ..config.logging_config import get_logger -from ..utils.mailer import send_email +from ...auth.models.user import User +from ...bookings.models.booking import Booking +from ...shared.config.logging_config import get_logger +from ...shared.utils.mailer import send_email logger = get_logger(__name__) @@ -72,7 +72,7 @@ class EmailCampaignService: # Role filter if 'role' in criteria: - from ..models.role import Role + from ...auth.models.role import Role role = db.query(Role).filter(Role.name == criteria['role']).first() if role: query = query.filter(User.role_id == role.id) diff --git a/Backend/src/services/notification_service.py b/Backend/src/notifications/services/notification_service.py similarity index 99% rename from Backend/src/services/notification_service.py rename to Backend/src/notifications/services/notification_service.py index 7cc9d665..c4bd9149 100644 --- a/Backend/src/services/notification_service.py +++ b/Backend/src/notifications/services/notification_service.py @@ -6,9 +6,9 @@ from ..models.notification import ( Notification, NotificationTemplate, NotificationPreference, NotificationDeliveryLog, NotificationChannel, NotificationStatus, NotificationType ) -from ..models.user import User -from ..models.booking import Booking -from ..models.payment import Payment +from ...auth.models.user import User +from ...bookings.models.booking import Booking +from ...payments.models.payment import Payment import logging import re diff --git a/Backend/src/payments/__init__.py b/Backend/src/payments/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/payments/models/__init__.py b/Backend/src/payments/models/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/models/invoice.py b/Backend/src/payments/models/invoice.py similarity index 98% rename from Backend/src/models/invoice.py rename to Backend/src/payments/models/invoice.py index f5e18d14..6dc961ff 100644 --- a/Backend/src/models/invoice.py +++ b/Backend/src/payments/models/invoice.py @@ -2,7 +2,7 @@ from sqlalchemy import Column, Integer, String, DateTime, Numeric, Text, Enum, F from sqlalchemy.orm import relationship from datetime import datetime import enum -from ..config.database import Base +from ...shared.config.database import Base class InvoiceStatus(str, enum.Enum): draft = 'draft' diff --git a/Backend/src/models/payment.py b/Backend/src/payments/models/payment.py similarity index 97% rename from Backend/src/models/payment.py rename to Backend/src/payments/models/payment.py index 883b3e7e..45f07295 100644 --- a/Backend/src/models/payment.py +++ b/Backend/src/payments/models/payment.py @@ -2,7 +2,7 @@ from sqlalchemy import Column, Integer, String, DateTime, Numeric, Text, Enum, F from sqlalchemy.orm import relationship from datetime import datetime import enum -from ..config.database import Base +from ...shared.config.database import Base class PaymentMethod(str, enum.Enum): cash = 'cash' diff --git a/Backend/src/payments/routes/__init__.py b/Backend/src/payments/routes/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/routes/invoice_routes.py b/Backend/src/payments/routes/invoice_routes.py similarity index 94% rename from Backend/src/routes/invoice_routes.py rename to Backend/src/payments/routes/invoice_routes.py index 86876e47..23b9dc48 100644 --- a/Backend/src/routes/invoice_routes.py +++ b/Backend/src/payments/routes/invoice_routes.py @@ -2,16 +2,16 @@ from fastapi import APIRouter, Depends, HTTPException, status, Query, Request from sqlalchemy.orm import Session from typing import Optional from datetime import datetime -from ..config.database import get_db -from ..config.logging_config import get_logger -from ..middleware.auth import get_current_user, authorize_roles -from ..models.user import User +from ...shared.config.database import get_db +from ...shared.config.logging_config import get_logger +from ...security.middleware.auth import get_current_user, authorize_roles +from ...auth.models.user import User from ..models.invoice import Invoice, InvoiceStatus -from ..models.booking import Booking +from ...bookings.models.booking import Booking from ..services.invoice_service import InvoiceService -from ..utils.role_helpers import can_access_all_invoices, can_create_invoices -from ..utils.response_helpers import success_response -from ..utils.request_helpers import get_request_id +from ...shared.utils.role_helpers import can_access_all_invoices, can_create_invoices +from ...shared.utils.response_helpers import success_response +from ...shared.utils.request_helpers import get_request_id from ..schemas.invoice import ( CreateInvoiceRequest, UpdateInvoiceRequest, @@ -176,8 +176,8 @@ async def send_invoice_email(request: Request, id: int, current_user: User=Depen raise HTTPException(status_code=404, detail='Invoice not found') from ..routes.booking_routes import _generate_invoice_email_html - from ..models.user import User as UserModel - from ..utils.mailer import send_email + from ...auth.models.user import User as UserModel + from ...shared.utils.mailer import send_email invoice_dict = InvoiceService.invoice_to_dict(invoice) invoice_html = _generate_invoice_email_html(invoice_dict, is_proforma=invoice.is_proforma) diff --git a/Backend/src/routes/payment_routes.py b/Backend/src/payments/routes/payment_routes.py similarity index 96% rename from Backend/src/routes/payment_routes.py rename to Backend/src/payments/routes/payment_routes.py index 8099a888..8bdaf1c7 100644 --- a/Backend/src/routes/payment_routes.py +++ b/Backend/src/payments/routes/payment_routes.py @@ -3,23 +3,23 @@ from sqlalchemy.orm import Session, joinedload, selectinload, load_only from typing import Optional from datetime import datetime import os -from ..config.database import get_db -from ..config.settings import settings -from ..config.logging_config import get_logger -from ..middleware.auth import get_current_user, authorize_roles -from ..models.user import User +from ...shared.config.database import get_db +from ...shared.config.settings import settings +from ...shared.config.logging_config import get_logger +from ...security.middleware.auth import get_current_user, authorize_roles +from ...auth.models.user import User from ..models.payment import Payment, PaymentMethod, PaymentType, PaymentStatus -from ..models.booking import Booking, BookingStatus -from ..utils.role_helpers import can_access_all_payments -from ..utils.currency_helpers import get_currency_symbol -from ..utils.response_helpers import success_response -from ..utils.mailer import send_email -from ..utils.email_templates import payment_confirmation_email_template, booking_status_changed_email_template +from ...bookings.models.booking import Booking, BookingStatus +from ...shared.utils.role_helpers import can_access_all_payments +from ...shared.utils.currency_helpers import get_currency_symbol +from ...shared.utils.response_helpers import success_response +from ...shared.utils.mailer import send_email +from ...shared.utils.email_templates import payment_confirmation_email_template, booking_status_changed_email_template from ..services.stripe_service import StripeService from ..services.paypal_service import PayPalService from ..services.borica_service import BoricaService -from ..services.loyalty_service import LoyaltyService -from ..services.audit_service import audit_service +from ...loyalty.services.loyalty_service import LoyaltyService +from ...analytics.services.audit_service import audit_service from ..schemas.payment import CreatePaymentRequest, UpdatePaymentStatusRequest, CreateStripePaymentIntentRequest logger = get_logger(__name__) @@ -52,7 +52,7 @@ async def cancel_booking_on_payment_failure(booking: Booking, db: Session, reaso db.commit() db.refresh(booking) try: - from ..models.system_settings import SystemSettings + from ...system.models.system_settings import SystemSettings client_url_setting = db.query(SystemSettings).filter(SystemSettings.key == 'client_url').first() client_url = client_url_setting.value if client_url_setting and client_url_setting.value else settings.CLIENT_URL or os.getenv('CLIENT_URL', 'http://localhost:5173') if booking.user: @@ -114,7 +114,7 @@ async def get_payments(booking_id: Optional[int]=Query(None), status_filter: Opt @router.get('/booking/{booking_id}') async def get_payments_by_booking_id(booking_id: int, current_user: User=Depends(get_current_user), db: Session=Depends(get_db)): try: - from ..utils.role_helpers import is_admin + from ...shared.utils.role_helpers import is_admin booking = db.query(Booking).filter(Booking.id == booking_id).first() if not booking: raise HTTPException(status_code=404, detail='Booking not found') @@ -197,7 +197,7 @@ async def create_payment( booking = db.query(Booking).filter(Booking.id == booking_id).first() if not booking: raise HTTPException(status_code=404, detail='Booking not found') - from ..utils.role_helpers import is_admin + from ...shared.utils.role_helpers import is_admin if not is_admin(current_user, db) and booking.user_id != current_user.id: raise HTTPException(status_code=403, detail='Forbidden') payment = Payment(booking_id=booking_id, amount=amount, payment_method=PaymentMethod(payment_method), payment_type=PaymentType(payment_type), payment_status=PaymentStatus.pending, payment_date=datetime.utcnow() if mark_as_paid else None, notes=notes) @@ -211,7 +211,7 @@ async def create_payment( # Send payment receipt notification if payment.payment_status == PaymentStatus.completed: try: - from ..services.notification_service import NotificationService + from ...notifications.services.notification_service import NotificationService NotificationService.send_payment_receipt(db, payment) except Exception as e: import logging @@ -224,7 +224,7 @@ async def create_payment( db.refresh(booking) if booking.status == BookingStatus.confirmed and booking.user: # Check if booking already earned points - from ..models.loyalty_point_transaction import LoyaltyPointTransaction, TransactionSource + from ...loyalty.models.loyalty_point_transaction import LoyaltyPointTransaction, TransactionSource existing_points = db.query(LoyaltyPointTransaction).filter( LoyaltyPointTransaction.booking_id == booking.id, LoyaltyPointTransaction.source == TransactionSource.booking @@ -242,7 +242,7 @@ async def create_payment( if payment.payment_status == PaymentStatus.completed and booking.user: try: - from ..models.system_settings import SystemSettings + from ...system.models.system_settings import SystemSettings client_url_setting = db.query(SystemSettings).filter(SystemSettings.key == 'client_url').first() client_url = client_url_setting.value if client_url_setting and client_url_setting.value else settings.CLIENT_URL or os.getenv('CLIENT_URL', 'http://localhost:5173') currency_setting = db.query(SystemSettings).filter(SystemSettings.key == 'platform_currency').first() @@ -378,7 +378,7 @@ async def update_payment_status( if payment.payment_status == PaymentStatus.completed and old_status != PaymentStatus.completed: # Send payment receipt notification try: - from ..services.notification_service import NotificationService + from ...notifications.services.notification_service import NotificationService NotificationService.send_payment_receipt(db, payment) except Exception as e: import logging @@ -386,7 +386,7 @@ async def update_payment_status( logger.warning(f'Failed to send payment receipt notification: {e}') try: - from ..models.system_settings import SystemSettings + from ...system.models.system_settings import SystemSettings client_url_setting = db.query(SystemSettings).filter(SystemSettings.key == 'client_url').first() client_url = client_url_setting.value if client_url_setting and client_url_setting.value else settings.CLIENT_URL or os.getenv('CLIENT_URL', 'http://localhost:5173') currency_setting = db.query(SystemSettings).filter(SystemSettings.key == 'platform_currency').first() @@ -442,7 +442,7 @@ async def create_stripe_payment_intent(intent_data: CreateStripePaymentIntentReq booking = db.query(Booking).filter(Booking.id == booking_id).first() if not booking: raise HTTPException(status_code=404, detail='Booking not found') - from ..utils.role_helpers import is_admin + from ...shared.utils.role_helpers import is_admin if not is_admin(current_user, db) and booking.user_id != current_user.id: raise HTTPException(status_code=403, detail='Forbidden') if booking.requires_deposit and (not booking.deposit_paid): @@ -498,7 +498,7 @@ async def confirm_stripe_payment(payment_data: dict, current_user: User=Depends( db.refresh(booking) if booking and booking.user: try: - from ..models.system_settings import SystemSettings + from ...system.models.system_settings import SystemSettings client_url_setting = db.query(SystemSettings).filter(SystemSettings.key == 'client_url').first() client_url = client_url_setting.value if client_url_setting and client_url_setting.value else settings.CLIENT_URL or os.getenv('CLIENT_URL', 'http://localhost:5173') currency_setting = db.query(SystemSettings).filter(SystemSettings.key == 'platform_currency').first() @@ -567,7 +567,7 @@ async def create_paypal_order(order_data: dict, current_user: User=Depends(get_c raise HTTPException(status_code=400, detail='booking_id and amount are required') if amount > 100000: raise HTTPException(status_code=400, detail=f"Amount ${amount:,.2f} exceeds PayPal's maximum of $100,000. Please contact support for large payments.") - from ..utils.role_helpers import is_admin + from ...shared.utils.role_helpers import is_admin booking = db.query(Booking).filter(Booking.id == booking_id).first() if not booking: raise HTTPException(status_code=404, detail='Booking not found') @@ -643,7 +643,7 @@ async def capture_paypal_payment(payment_data: dict, current_user: User=Depends( db.refresh(booking) if booking and booking.user: try: - from ..models.system_settings import SystemSettings + from ...system.models.system_settings import SystemSettings client_url_setting = db.query(SystemSettings).filter(SystemSettings.key == 'client_url').first() client_url = client_url_setting.value if client_url_setting and client_url_setting.value else settings.CLIENT_URL or os.getenv('CLIENT_URL', 'http://localhost:5173') currency_setting = db.query(SystemSettings).filter(SystemSettings.key == 'platform_currency').first() @@ -688,7 +688,7 @@ async def create_borica_payment(payment_data: dict, current_user: User=Depends(g raise HTTPException(status_code=400, detail='booking_id and amount are required') if amount > 100000: raise HTTPException(status_code=400, detail=f"Amount {amount:,.2f} exceeds maximum of 100,000. Please contact support for large payments.") - from ..utils.role_helpers import is_admin + from ...shared.utils.role_helpers import is_admin booking = db.query(Booking).filter(Booking.id == booking_id).first() if not booking: raise HTTPException(status_code=404, detail='Booking not found') @@ -759,7 +759,7 @@ async def borica_callback(request: Request, db: Session=Depends(get_db)): if booking and booking.user: try: - from ..models.system_settings import SystemSettings + from ...system.models.system_settings import SystemSettings client_url_setting = db.query(SystemSettings).filter(SystemSettings.key == 'client_url').first() client_url = client_url_setting.value if client_url_setting and client_url_setting.value else settings.CLIENT_URL or os.getenv('CLIENT_URL', 'http://localhost:5173') currency_setting = db.query(SystemSettings).filter(SystemSettings.key == 'platform_currency').first() @@ -813,7 +813,7 @@ async def confirm_borica_payment(response_data: dict, db: Session=Depends(get_db db.refresh(booking) if booking and booking.user: try: - from ..models.system_settings import SystemSettings + from ...system.models.system_settings import SystemSettings client_url_setting = db.query(SystemSettings).filter(SystemSettings.key == 'client_url').first() client_url = client_url_setting.value if client_url_setting and client_url_setting.value else settings.CLIENT_URL or os.getenv('CLIENT_URL', 'http://localhost:5173') currency_setting = db.query(SystemSettings).filter(SystemSettings.key == 'platform_currency').first() diff --git a/Backend/src/payments/schemas/__init__.py b/Backend/src/payments/schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/schemas/invoice.py b/Backend/src/payments/schemas/invoice.py similarity index 100% rename from Backend/src/schemas/invoice.py rename to Backend/src/payments/schemas/invoice.py diff --git a/Backend/src/schemas/payment.py b/Backend/src/payments/schemas/payment.py similarity index 100% rename from Backend/src/schemas/payment.py rename to Backend/src/payments/schemas/payment.py diff --git a/Backend/src/payments/services/__init__.py b/Backend/src/payments/services/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/services/borica_service.py b/Backend/src/payments/services/borica_service.py similarity index 98% rename from Backend/src/services/borica_service.py rename to Backend/src/payments/services/borica_service.py index 3e732dd8..0895e9a2 100644 --- a/Backend/src/services/borica_service.py +++ b/Backend/src/payments/services/borica_service.py @@ -5,10 +5,10 @@ import base64 import urllib.parse from typing import Optional, Dict, Any from datetime import datetime -from ..config.settings import settings +from ...shared.config.settings import settings from ..models.payment import Payment, PaymentMethod, PaymentType, PaymentStatus -from ..models.booking import Booking, BookingStatus -from ..models.system_settings import SystemSettings +from ...bookings.models.booking import Booking, BookingStatus +from ...system.models.system_settings import SystemSettings from sqlalchemy.orm import Session import os diff --git a/Backend/src/services/invoice_service.py b/Backend/src/payments/services/invoice_service.py similarity index 97% rename from Backend/src/services/invoice_service.py rename to Backend/src/payments/services/invoice_service.py index db5b2bc2..85c4802c 100644 --- a/Backend/src/services/invoice_service.py +++ b/Backend/src/payments/services/invoice_service.py @@ -3,11 +3,11 @@ from sqlalchemy import func, and_, or_ from typing import Optional, Dict, Any, List from datetime import datetime, timedelta from ..models.invoice import Invoice, InvoiceItem, InvoiceStatus -from ..models.booking import Booking +from ...bookings.models.booking import Booking from ..models.payment import Payment, PaymentStatus -from ..models.user import User -from ..models.system_settings import SystemSettings -from ..config.logging_config import get_logger +from ...auth.models.user import User +from ...system.models.system_settings import SystemSettings +from ...shared.config.logging_config import get_logger logger = get_logger(__name__) @@ -30,10 +30,10 @@ class InvoiceService: @staticmethod def create_invoice_from_booking(booking_id: int, db: Session, created_by_id: Optional[int]=None, tax_rate: float=0.0, discount_amount: float=0.0, due_days: int=30, is_proforma: bool=False, invoice_amount: Optional[float]=None, request_id: Optional[str]=None, **kwargs) -> Dict[str, Any]: from sqlalchemy.orm import selectinload - from ..models.service_usage import ServiceUsage - from ..models.room import Room - from ..models.room_type import RoomType - from ..models.service import Service + from ...hotel_services.models.service_usage import ServiceUsage + from ...rooms.models.room import Room + from ...rooms.models.room_type import RoomType + from ...hotel_services.models.service import Service logger.info(f'Creating invoice from booking {booking_id}', extra={'booking_id': booking_id, 'request_id': request_id}) booking = db.query(Booking).options( diff --git a/Backend/src/services/paypal_service.py b/Backend/src/payments/services/paypal_service.py similarity index 95% rename from Backend/src/services/paypal_service.py rename to Backend/src/payments/services/paypal_service.py index d3029750..8546d540 100644 --- a/Backend/src/services/paypal_service.py +++ b/Backend/src/payments/services/paypal_service.py @@ -3,11 +3,11 @@ from paypalcheckoutsdk.core import PayPalHttpClient, SandboxEnvironment, LiveEnv from paypalcheckoutsdk.orders import OrdersCreateRequest, OrdersGetRequest, OrdersCaptureRequest from paypalcheckoutsdk.payments import CapturesRefundRequest from typing import Optional, Dict, Any -from ..config.settings import settings -from ..config.logging_config import get_logger +from ...shared.config.settings import settings +from ...shared.config.logging_config import get_logger from ..models.payment import Payment, PaymentMethod, PaymentType, PaymentStatus -from ..models.booking import Booking, BookingStatus -from ..models.system_settings import SystemSettings +from ...bookings.models.booking import Booking, BookingStatus +from ...system.models.system_settings import SystemSettings from sqlalchemy.orm import Session from datetime import datetime import json @@ -215,13 +215,13 @@ class PayPalService: should_send_email = True if should_send_email: try: - from ..utils.mailer import send_email - from ..utils.email_templates import booking_confirmation_email_template - from ..models.system_settings import SystemSettings - from ..models.room import Room + from ...shared.utils.mailer import send_email + from ...shared.utils.email_templates import booking_confirmation_email_template + from ...system.models.system_settings import SystemSettings + from ...rooms.models.room import Room from sqlalchemy.orm import selectinload import os - from ..config.settings import settings + from ...shared.config.settings import settings client_url_setting = db.query(SystemSettings).filter(SystemSettings.key == 'client_url').first() client_url = client_url_setting.value if client_url_setting and client_url_setting.value else settings.CLIENT_URL or os.getenv('CLIENT_URL', 'http://localhost:5173') currency_setting = db.query(SystemSettings).filter(SystemSettings.key == 'platform_currency').first() @@ -239,10 +239,10 @@ class PayPalService: logger.info(f'Booking confirmation email sent to {booking.user.email}') except Exception as email_error: logger.error(f'Failed to send booking confirmation email: {str(email_error)}') - from ..utils.mailer import send_email + from ...shared.utils.mailer import send_email from ..services.invoice_service import InvoiceService from ..routes.booking_routes import _generate_invoice_email_html - from ..models.user import User + from ...auth.models.user import User user = db.query(User).filter(User.id == booking.user_id).first() for invoice in invoices: if invoice.status == InvoiceStatus.paid and invoice.balance_due <= 0: @@ -255,11 +255,11 @@ class PayPalService: logger.info(f'{invoice_type} {invoice.invoice_number} sent to {user.email}') except Exception as email_error: logger.error(f'Failed to send invoice email: {str(email_error)}') - from ..utils.mailer import send_email + from ...shared.utils.mailer import send_email from ..services.invoice_service import InvoiceService from ..models.invoice import InvoiceStatus from ..routes.booking_routes import _generate_invoice_email_html - from ..models.user import User + from ...auth.models.user import User user = db.query(User).filter(User.id == booking.user_id).first() for invoice in invoices: if invoice.status == InvoiceStatus.paid and invoice.balance_due <= 0: diff --git a/Backend/src/services/stripe_service.py b/Backend/src/payments/services/stripe_service.py similarity index 94% rename from Backend/src/services/stripe_service.py rename to Backend/src/payments/services/stripe_service.py index b298acd6..6c90b1a7 100644 --- a/Backend/src/services/stripe_service.py +++ b/Backend/src/payments/services/stripe_service.py @@ -1,11 +1,11 @@ import logging import stripe from typing import Optional, Dict, Any -from ..config.settings import settings -from ..config.logging_config import get_logger +from ...shared.config.settings import settings +from ...shared.config.logging_config import get_logger from ..models.payment import Payment, PaymentMethod, PaymentType, PaymentStatus -from ..models.booking import Booking, BookingStatus -from ..models.system_settings import SystemSettings +from ...bookings.models.booking import Booking, BookingStatus +from ...system.models.system_settings import SystemSettings from sqlalchemy.orm import Session from datetime import datetime logger = get_logger(__name__) @@ -156,13 +156,13 @@ class StripeService: should_send_email = True if should_send_email: try: - from ..utils.mailer import send_email - from ..utils.email_templates import booking_confirmation_email_template - from ..models.system_settings import SystemSettings - from ..models.room import Room + from ...shared.utils.mailer import send_email + from ...shared.utils.email_templates import booking_confirmation_email_template + from ...system.models.system_settings import SystemSettings + from ...rooms.models.room import Room from sqlalchemy.orm import selectinload import os - from ..config.settings import settings + from ...shared.config.settings import settings client_url_setting = db.query(SystemSettings).filter(SystemSettings.key == 'client_url').first() client_url = client_url_setting.value if client_url_setting and client_url_setting.value else settings.CLIENT_URL or os.getenv('CLIENT_URL', 'http://localhost:5173') currency_setting = db.query(SystemSettings).filter(SystemSettings.key == 'platform_currency').first() @@ -180,10 +180,10 @@ class StripeService: logger.info(f'Booking confirmation email sent to {booking.user.email}') except Exception as email_error: logger.error(f'Failed to send booking confirmation email: {str(email_error)}') - from ..utils.mailer import send_email + from ...shared.utils.mailer import send_email from ..services.invoice_service import InvoiceService from ..routes.booking_routes import _generate_invoice_email_html - from ..models.user import User + from ...auth.models.user import User user = db.query(User).filter(User.id == booking.user_id).first() for invoice in invoices: if invoice.status == InvoiceStatus.paid and invoice.balance_due <= 0: @@ -267,10 +267,10 @@ class StripeService: db.refresh(booking) try: if booking.user: - from ..utils.mailer import send_email - from ..utils.email_templates import booking_status_changed_email_template - from ..models.system_settings import SystemSettings - from ..config.settings import settings + from ...shared.utils.mailer import send_email + from ...shared.utils.email_templates import booking_status_changed_email_template + from ...system.models.system_settings import SystemSettings + from ...shared.config.settings import settings import os client_url_setting = db.query(SystemSettings).filter(SystemSettings.key == 'client_url').first() client_url = client_url_setting.value if client_url_setting and client_url_setting.value else settings.CLIENT_URL or os.getenv('CLIENT_URL', 'http://localhost:5173') diff --git a/Backend/src/utils/vnpay_service.py b/Backend/src/payments/services/vnpay_service.py similarity index 100% rename from Backend/src/utils/vnpay_service.py rename to Backend/src/payments/services/vnpay_service.py diff --git a/Backend/src/reviews/__init__.py b/Backend/src/reviews/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/reviews/models/__init__.py b/Backend/src/reviews/models/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/models/favorite.py b/Backend/src/reviews/models/favorite.py similarity index 94% rename from Backend/src/models/favorite.py rename to Backend/src/reviews/models/favorite.py index fe795288..12fab42d 100644 --- a/Backend/src/models/favorite.py +++ b/Backend/src/reviews/models/favorite.py @@ -1,7 +1,7 @@ from sqlalchemy import Column, Integer, ForeignKey, DateTime from sqlalchemy.orm import relationship from datetime import datetime -from ..config.database import Base +from ...shared.config.database import Base class Favorite(Base): __tablename__ = 'favorites' diff --git a/Backend/src/models/review.py b/Backend/src/reviews/models/review.py similarity index 96% rename from Backend/src/models/review.py rename to Backend/src/reviews/models/review.py index a5338a59..c022eef6 100644 --- a/Backend/src/models/review.py +++ b/Backend/src/reviews/models/review.py @@ -2,7 +2,7 @@ from sqlalchemy import Column, Integer, Text, Enum, ForeignKey, DateTime, Index from sqlalchemy.orm import relationship from datetime import datetime import enum -from ..config.database import Base +from ...shared.config.database import Base class ReviewStatus(str, enum.Enum): pending = 'pending' diff --git a/Backend/src/reviews/routes/__init__.py b/Backend/src/reviews/routes/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/routes/favorite_routes.py b/Backend/src/reviews/routes/favorite_routes.py similarity index 95% rename from Backend/src/routes/favorite_routes.py rename to Backend/src/reviews/routes/favorite_routes.py index 48ec57be..4775479a 100644 --- a/Backend/src/routes/favorite_routes.py +++ b/Backend/src/reviews/routes/favorite_routes.py @@ -1,13 +1,13 @@ from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.orm import Session from sqlalchemy import func -from ..config.database import get_db -from ..middleware.auth import get_current_user -from ..models.user import User -from ..models.role import Role +from ...shared.config.database import get_db +from ...security.middleware.auth import get_current_user +from ...auth.models.user import User +from ...auth.models.role import Role from ..models.favorite import Favorite -from ..models.room import Room -from ..models.room_type import RoomType +from ...rooms.models.room import Room +from ...rooms.models.room_type import RoomType from ..models.review import Review, ReviewStatus router = APIRouter(prefix='/favorites', tags=['favorites']) diff --git a/Backend/src/routes/review_routes.py b/Backend/src/reviews/routes/review_routes.py similarity index 97% rename from Backend/src/routes/review_routes.py rename to Backend/src/reviews/routes/review_routes.py index 525cfb46..417ba231 100644 --- a/Backend/src/routes/review_routes.py +++ b/Backend/src/reviews/routes/review_routes.py @@ -1,14 +1,14 @@ from fastapi import APIRouter, Depends, HTTPException, status, Query -from ..utils.response_helpers import success_response, error_response +from ...shared.utils.response_helpers import success_response, error_response from sqlalchemy.orm import Session, joinedload from sqlalchemy import func from typing import Optional -from ..config.database import get_db -from ..config.logging_config import get_logger -from ..middleware.auth import get_current_user, authorize_roles -from ..models.user import User +from ...shared.config.database import get_db +from ...shared.config.logging_config import get_logger +from ...security.middleware.auth import get_current_user, authorize_roles +from ...auth.models.user import User from ..models.review import Review, ReviewStatus -from ..models.room import Room +from ...rooms.models.room import Room from ..schemas.review import CreateReviewRequest logger = get_logger(__name__) diff --git a/Backend/src/reviews/schemas/__init__.py b/Backend/src/reviews/schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/schemas/review.py b/Backend/src/reviews/schemas/review.py similarity index 100% rename from Backend/src/schemas/review.py rename to Backend/src/reviews/schemas/review.py diff --git a/Backend/src/reviews/services/__init__.py b/Backend/src/reviews/services/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/rooms/__init__.py b/Backend/src/rooms/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/rooms/models/__init__.py b/Backend/src/rooms/models/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/models/rate_plan.py b/Backend/src/rooms/models/rate_plan.py similarity index 99% rename from Backend/src/models/rate_plan.py rename to Backend/src/rooms/models/rate_plan.py index 5cfd95fa..2808cdef 100644 --- a/Backend/src/models/rate_plan.py +++ b/Backend/src/rooms/models/rate_plan.py @@ -2,7 +2,7 @@ from sqlalchemy import Column, Integer, String, Numeric, Boolean, Text, JSON, En from sqlalchemy.orm import relationship from datetime import datetime, date import enum -from ..config.database import Base +from ...shared.config.database import Base class RatePlanType(str, enum.Enum): BAR = 'BAR' # Best Available Rate diff --git a/Backend/src/models/room.py b/Backend/src/rooms/models/room.py similarity index 97% rename from Backend/src/models/room.py rename to Backend/src/rooms/models/room.py index 1497841e..9275a599 100644 --- a/Backend/src/models/room.py +++ b/Backend/src/rooms/models/room.py @@ -2,7 +2,7 @@ from sqlalchemy import Column, Integer, String, Numeric, Boolean, Text, JSON, En from sqlalchemy.orm import relationship from datetime import datetime import enum -from ..config.database import Base +from ...shared.config.database import Base class RoomStatus(str, enum.Enum): available = 'available' diff --git a/Backend/src/models/room_attribute.py b/Backend/src/rooms/models/room_attribute.py similarity index 96% rename from Backend/src/models/room_attribute.py rename to Backend/src/rooms/models/room_attribute.py index 9a67acd2..24a0ecb7 100644 --- a/Backend/src/models/room_attribute.py +++ b/Backend/src/rooms/models/room_attribute.py @@ -1,7 +1,7 @@ from sqlalchemy import Column, Integer, String, Text, ForeignKey, DateTime, Boolean, JSON from sqlalchemy.orm import relationship from datetime import datetime -from ..config.database import Base +from ...shared.config.database import Base class RoomAttribute(Base): __tablename__ = 'room_attributes' diff --git a/Backend/src/models/room_inspection.py b/Backend/src/rooms/models/room_inspection.py similarity index 98% rename from Backend/src/models/room_inspection.py rename to Backend/src/rooms/models/room_inspection.py index 734bdb2f..d7528bfd 100644 --- a/Backend/src/models/room_inspection.py +++ b/Backend/src/rooms/models/room_inspection.py @@ -2,7 +2,7 @@ from sqlalchemy import Column, Integer, String, Text, Enum, ForeignKey, DateTime from sqlalchemy.orm import relationship from datetime import datetime import enum -from ..config.database import Base +from ...shared.config.database import Base class InspectionType(str, enum.Enum): pre_checkin = 'pre_checkin' diff --git a/Backend/src/models/room_maintenance.py b/Backend/src/rooms/models/room_maintenance.py similarity index 98% rename from Backend/src/models/room_maintenance.py rename to Backend/src/rooms/models/room_maintenance.py index 94de36be..9744edcb 100644 --- a/Backend/src/models/room_maintenance.py +++ b/Backend/src/rooms/models/room_maintenance.py @@ -2,7 +2,7 @@ from sqlalchemy import Column, Integer, String, Text, Enum, ForeignKey, DateTime from sqlalchemy.orm import relationship from datetime import datetime import enum -from ..config.database import Base +from ...shared.config.database import Base class MaintenanceType(str, enum.Enum): preventive = 'preventive' diff --git a/Backend/src/models/room_type.py b/Backend/src/rooms/models/room_type.py similarity index 95% rename from Backend/src/models/room_type.py rename to Backend/src/rooms/models/room_type.py index ea77b20a..8730ea74 100644 --- a/Backend/src/models/room_type.py +++ b/Backend/src/rooms/models/room_type.py @@ -1,7 +1,7 @@ from sqlalchemy import Column, Integer, String, Numeric, Text, JSON, DateTime from sqlalchemy.orm import relationship from datetime import datetime -from ..config.database import Base +from ...shared.config.database import Base class RoomType(Base): __tablename__ = 'room_types' diff --git a/Backend/src/rooms/routes/__init__.py b/Backend/src/rooms/routes/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/routes/advanced_room_routes.py b/Backend/src/rooms/routes/advanced_room_routes.py similarity index 98% rename from Backend/src/routes/advanced_room_routes.py rename to Backend/src/rooms/routes/advanced_room_routes.py index d9ceee4d..2f663808 100644 --- a/Backend/src/routes/advanced_room_routes.py +++ b/Backend/src/rooms/routes/advanced_room_routes.py @@ -3,15 +3,15 @@ from sqlalchemy.orm import Session, joinedload, load_only from sqlalchemy import and_, or_, func, desc from typing import List, Optional from datetime import datetime, timedelta -from ..config.database import get_db -from ..config.logging_config import get_logger -from ..middleware.auth import get_current_user, authorize_roles -from ..models.user import User -from ..models.role import Role +from ...shared.config.database import get_db +from ...shared.config.logging_config import get_logger +from ...security.middleware.auth import get_current_user, authorize_roles +from ...auth.models.user import User +from ...auth.models.role import Role from ..models.room import Room, RoomStatus -from ..models.booking import Booking, BookingStatus +from ...bookings.models.booking import Booking, BookingStatus from ..models.room_maintenance import RoomMaintenance, MaintenanceType, MaintenanceStatus -from ..models.housekeeping_task import HousekeepingTask, HousekeepingStatus, HousekeepingType +from ...hotel_services.models.housekeeping_task import HousekeepingTask, HousekeepingStatus, HousekeepingType from ..models.room_inspection import RoomInspection, InspectionType, InspectionStatus from ..models.room_attribute import RoomAttribute from ..services.room_assignment_service import RoomAssignmentService diff --git a/Backend/src/routes/rate_plan_routes.py b/Backend/src/rooms/routes/rate_plan_routes.py similarity index 99% rename from Backend/src/routes/rate_plan_routes.py rename to Backend/src/rooms/routes/rate_plan_routes.py index bf9f403a..51221859 100644 --- a/Backend/src/routes/rate_plan_routes.py +++ b/Backend/src/rooms/routes/rate_plan_routes.py @@ -4,12 +4,12 @@ from sqlalchemy import or_, and_ from typing import Optional, List from datetime import datetime, date from decimal import Decimal -from ..config.database import get_db -from ..middleware.auth import get_current_user, authorize_roles -from ..models.user import User +from ...shared.config.database import get_db +from ...security.middleware.auth import get_current_user, authorize_roles +from ...auth.models.user import User from ..models.rate_plan import RatePlan, RatePlanRule, RatePlanType, RatePlanStatus from ..models.room_type import RoomType -from ..models.booking import Booking +from ...bookings.models.booking import Booking from pydantic import BaseModel from typing import Optional as Opt diff --git a/Backend/src/routes/room_routes.py b/Backend/src/rooms/routes/room_routes.py similarity index 98% rename from Backend/src/routes/room_routes.py rename to Backend/src/rooms/routes/room_routes.py index 890e6e59..88bd83f4 100644 --- a/Backend/src/routes/room_routes.py +++ b/Backend/src/rooms/routes/room_routes.py @@ -3,14 +3,14 @@ from sqlalchemy.orm import Session from sqlalchemy import and_, or_, func from typing import List, Optional from datetime import datetime -from ..config.database import get_db -from ..config.logging_config import get_logger -from ..middleware.auth import get_current_user, authorize_roles -from ..models.user import User +from ...shared.config.database import get_db +from ...shared.config.logging_config import get_logger +from ...security.middleware.auth import get_current_user, authorize_roles +from ...auth.models.user import User from ..models.room import Room, RoomStatus from ..models.room_type import RoomType -from ..models.review import Review, ReviewStatus -from ..models.booking import Booking, BookingStatus +from ...reviews.models.review import Review, ReviewStatus +from ...bookings.models.booking import Booking, BookingStatus from ..services.room_service import get_rooms_with_ratings, get_amenities_list, normalize_images, get_base_url import os import aiofiles @@ -434,7 +434,7 @@ async def get_room_booked_dates(id: int, db: Session=Depends(get_db)): @router.get('/{id}/reviews') async def get_room_reviews_route(id: int, db: Session=Depends(get_db)): - from ..models.review import Review, ReviewStatus + from ...reviews.models.review import Review, ReviewStatus try: room = db.query(Room).filter(Room.id == id).first() if not room: diff --git a/Backend/src/rooms/schemas/__init__.py b/Backend/src/rooms/schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/rooms/services/__init__.py b/Backend/src/rooms/services/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/services/room_assignment_service.py b/Backend/src/rooms/services/room_assignment_service.py similarity index 98% rename from Backend/src/services/room_assignment_service.py rename to Backend/src/rooms/services/room_assignment_service.py index 5ab650e8..b704b4a4 100644 --- a/Backend/src/services/room_assignment_service.py +++ b/Backend/src/rooms/services/room_assignment_service.py @@ -7,9 +7,9 @@ from sqlalchemy import and_, or_, func from datetime import datetime from typing import List, Optional, Dict from ..models.room import Room, RoomStatus -from ..models.booking import Booking, BookingStatus +from ...bookings.models.booking import Booking, BookingStatus from ..models.room_attribute import RoomAttribute -from ..models.user import User +from ...auth.models.user import User class RoomAssignmentService: @@ -155,7 +155,7 @@ class RoomAssignmentService: score += 2.0 # Rooms with higher ratings get a boost - from ..models.review import Review, ReviewStatus + from ...reviews.models.review import Review, ReviewStatus avg_rating = db.query(func.avg(Review.rating)).filter( and_( Review.room_id == room.id, diff --git a/Backend/src/services/room_service.py b/Backend/src/rooms/services/room_service.py similarity index 99% rename from Backend/src/services/room_service.py rename to Backend/src/rooms/services/room_service.py index dfb77a20..640ae016 100644 --- a/Backend/src/services/room_service.py +++ b/Backend/src/rooms/services/room_service.py @@ -5,7 +5,7 @@ from datetime import datetime import os from ..models.room import Room, RoomStatus from ..models.room_type import RoomType -from ..models.review import Review, ReviewStatus +from ...reviews.models.review import Review, ReviewStatus def normalize_images(images, base_url: str) -> List[str]: if not images: diff --git a/Backend/src/routes/__pycache__/__init__.cpython-312.pyc b/Backend/src/routes/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index aafd8783..00000000 Binary files a/Backend/src/routes/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/routes/__pycache__/about_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/about_routes.cpython-312.pyc deleted file mode 100644 index 091c832d..00000000 Binary files a/Backend/src/routes/__pycache__/about_routes.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/routes/__pycache__/accessibility_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/accessibility_routes.cpython-312.pyc deleted file mode 100644 index 38f88c55..00000000 Binary files a/Backend/src/routes/__pycache__/accessibility_routes.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/routes/__pycache__/admin_privacy_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/admin_privacy_routes.cpython-312.pyc deleted file mode 100644 index e66585c7..00000000 Binary files a/Backend/src/routes/__pycache__/admin_privacy_routes.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/routes/__pycache__/advanced_room_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/advanced_room_routes.cpython-312.pyc deleted file mode 100644 index db9eec3d..00000000 Binary files a/Backend/src/routes/__pycache__/advanced_room_routes.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/routes/__pycache__/analytics_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/analytics_routes.cpython-312.pyc deleted file mode 100644 index 81f2e9f5..00000000 Binary files a/Backend/src/routes/__pycache__/analytics_routes.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/routes/__pycache__/audit_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/audit_routes.cpython-312.pyc deleted file mode 100644 index 0b0003ed..00000000 Binary files a/Backend/src/routes/__pycache__/audit_routes.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/routes/__pycache__/auth_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/auth_routes.cpython-312.pyc deleted file mode 100644 index 60fe9bf9..00000000 Binary files a/Backend/src/routes/__pycache__/auth_routes.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/routes/__pycache__/banner_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/banner_routes.cpython-312.pyc deleted file mode 100644 index 2c5281a7..00000000 Binary files a/Backend/src/routes/__pycache__/banner_routes.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/routes/__pycache__/blog_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/blog_routes.cpython-312.pyc deleted file mode 100644 index 3bd51b3e..00000000 Binary files a/Backend/src/routes/__pycache__/blog_routes.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/routes/__pycache__/booking_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/booking_routes.cpython-312.pyc deleted file mode 100644 index 879a25c9..00000000 Binary files a/Backend/src/routes/__pycache__/booking_routes.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/routes/__pycache__/cancellation_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/cancellation_routes.cpython-312.pyc deleted file mode 100644 index 5a2bcdfa..00000000 Binary files a/Backend/src/routes/__pycache__/cancellation_routes.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/routes/__pycache__/chat_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/chat_routes.cpython-312.pyc deleted file mode 100644 index eac73833..00000000 Binary files a/Backend/src/routes/__pycache__/chat_routes.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/routes/__pycache__/contact_content_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/contact_content_routes.cpython-312.pyc deleted file mode 100644 index ee77c9a9..00000000 Binary files a/Backend/src/routes/__pycache__/contact_content_routes.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/routes/__pycache__/contact_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/contact_routes.cpython-312.pyc deleted file mode 100644 index a1e5a7eb..00000000 Binary files a/Backend/src/routes/__pycache__/contact_routes.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/routes/__pycache__/email_campaign_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/email_campaign_routes.cpython-312.pyc deleted file mode 100644 index 18787e16..00000000 Binary files a/Backend/src/routes/__pycache__/email_campaign_routes.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/routes/__pycache__/faq_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/faq_routes.cpython-312.pyc deleted file mode 100644 index b9765f7e..00000000 Binary files a/Backend/src/routes/__pycache__/faq_routes.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/routes/__pycache__/favorite_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/favorite_routes.cpython-312.pyc deleted file mode 100644 index 35cb6d19..00000000 Binary files a/Backend/src/routes/__pycache__/favorite_routes.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/routes/__pycache__/footer_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/footer_routes.cpython-312.pyc deleted file mode 100644 index 551f92fc..00000000 Binary files a/Backend/src/routes/__pycache__/footer_routes.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/routes/__pycache__/group_booking_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/group_booking_routes.cpython-312.pyc deleted file mode 100644 index 274d10f1..00000000 Binary files a/Backend/src/routes/__pycache__/group_booking_routes.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/routes/__pycache__/guest_profile_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/guest_profile_routes.cpython-312.pyc deleted file mode 100644 index 866c79f6..00000000 Binary files a/Backend/src/routes/__pycache__/guest_profile_routes.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/routes/__pycache__/home_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/home_routes.cpython-312.pyc deleted file mode 100644 index f478ffff..00000000 Binary files a/Backend/src/routes/__pycache__/home_routes.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/routes/__pycache__/invoice_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/invoice_routes.cpython-312.pyc deleted file mode 100644 index d741b9c1..00000000 Binary files a/Backend/src/routes/__pycache__/invoice_routes.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/routes/__pycache__/loyalty_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/loyalty_routes.cpython-312.pyc deleted file mode 100644 index 22a83a08..00000000 Binary files a/Backend/src/routes/__pycache__/loyalty_routes.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/routes/__pycache__/notification_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/notification_routes.cpython-312.pyc deleted file mode 100644 index 4e02ae84..00000000 Binary files a/Backend/src/routes/__pycache__/notification_routes.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/routes/__pycache__/package_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/package_routes.cpython-312.pyc deleted file mode 100644 index 98c2d51a..00000000 Binary files a/Backend/src/routes/__pycache__/package_routes.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/routes/__pycache__/page_content_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/page_content_routes.cpython-312.pyc deleted file mode 100644 index 7eaf1164..00000000 Binary files a/Backend/src/routes/__pycache__/page_content_routes.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/routes/__pycache__/payment_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/payment_routes.cpython-312.pyc deleted file mode 100644 index c8b8e0d3..00000000 Binary files a/Backend/src/routes/__pycache__/payment_routes.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/routes/__pycache__/privacy_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/privacy_routes.cpython-312.pyc deleted file mode 100644 index 7d7c5bee..00000000 Binary files a/Backend/src/routes/__pycache__/privacy_routes.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/routes/__pycache__/promotion_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/promotion_routes.cpython-312.pyc deleted file mode 100644 index e154744d..00000000 Binary files a/Backend/src/routes/__pycache__/promotion_routes.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/routes/__pycache__/rate_plan_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/rate_plan_routes.cpython-312.pyc deleted file mode 100644 index 68a1255a..00000000 Binary files a/Backend/src/routes/__pycache__/rate_plan_routes.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/routes/__pycache__/refunds_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/refunds_routes.cpython-312.pyc deleted file mode 100644 index a8baff97..00000000 Binary files a/Backend/src/routes/__pycache__/refunds_routes.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/routes/__pycache__/report_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/report_routes.cpython-312.pyc deleted file mode 100644 index a36b695e..00000000 Binary files a/Backend/src/routes/__pycache__/report_routes.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/routes/__pycache__/review_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/review_routes.cpython-312.pyc deleted file mode 100644 index a882b39e..00000000 Binary files a/Backend/src/routes/__pycache__/review_routes.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/routes/__pycache__/room_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/room_routes.cpython-312.pyc deleted file mode 100644 index 7928a89e..00000000 Binary files a/Backend/src/routes/__pycache__/room_routes.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/routes/__pycache__/security_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/security_routes.cpython-312.pyc deleted file mode 100644 index f19111e3..00000000 Binary files a/Backend/src/routes/__pycache__/security_routes.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/routes/__pycache__/service_booking_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/service_booking_routes.cpython-312.pyc deleted file mode 100644 index ce3c466a..00000000 Binary files a/Backend/src/routes/__pycache__/service_booking_routes.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/routes/__pycache__/service_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/service_routes.cpython-312.pyc deleted file mode 100644 index e9f8915a..00000000 Binary files a/Backend/src/routes/__pycache__/service_routes.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/routes/__pycache__/system_settings_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/system_settings_routes.cpython-312.pyc deleted file mode 100644 index 6be3f9b0..00000000 Binary files a/Backend/src/routes/__pycache__/system_settings_routes.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/routes/__pycache__/task_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/task_routes.cpython-312.pyc deleted file mode 100644 index bae90efc..00000000 Binary files a/Backend/src/routes/__pycache__/task_routes.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/routes/__pycache__/terms_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/terms_routes.cpython-312.pyc deleted file mode 100644 index 485b306c..00000000 Binary files a/Backend/src/routes/__pycache__/terms_routes.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/routes/__pycache__/user_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/user_routes.cpython-312.pyc deleted file mode 100644 index b0a7b90f..00000000 Binary files a/Backend/src/routes/__pycache__/user_routes.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/routes/__pycache__/workflow_routes.cpython-312.pyc b/Backend/src/routes/__pycache__/workflow_routes.cpython-312.pyc deleted file mode 100644 index 81f14339..00000000 Binary files a/Backend/src/routes/__pycache__/workflow_routes.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/schemas/__pycache__/admin_privacy.cpython-312.pyc b/Backend/src/schemas/__pycache__/admin_privacy.cpython-312.pyc deleted file mode 100644 index 94961e71..00000000 Binary files a/Backend/src/schemas/__pycache__/admin_privacy.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/schemas/__pycache__/auth.cpython-312.pyc b/Backend/src/schemas/__pycache__/auth.cpython-312.pyc deleted file mode 100644 index 1c408067..00000000 Binary files a/Backend/src/schemas/__pycache__/auth.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/schemas/__pycache__/blog.cpython-312.pyc b/Backend/src/schemas/__pycache__/blog.cpython-312.pyc deleted file mode 100644 index 2872789a..00000000 Binary files a/Backend/src/schemas/__pycache__/blog.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/schemas/__pycache__/booking.cpython-312.pyc b/Backend/src/schemas/__pycache__/booking.cpython-312.pyc deleted file mode 100644 index bd830792..00000000 Binary files a/Backend/src/schemas/__pycache__/booking.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/schemas/__pycache__/invoice.cpython-312.pyc b/Backend/src/schemas/__pycache__/invoice.cpython-312.pyc deleted file mode 100644 index ac7b9c2f..00000000 Binary files a/Backend/src/schemas/__pycache__/invoice.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/schemas/__pycache__/page_content.cpython-312.pyc b/Backend/src/schemas/__pycache__/page_content.cpython-312.pyc deleted file mode 100644 index 0a7d0bdb..00000000 Binary files a/Backend/src/schemas/__pycache__/page_content.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/schemas/__pycache__/payment.cpython-312.pyc b/Backend/src/schemas/__pycache__/payment.cpython-312.pyc deleted file mode 100644 index 16f8ff66..00000000 Binary files a/Backend/src/schemas/__pycache__/payment.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/schemas/__pycache__/privacy.cpython-312.pyc b/Backend/src/schemas/__pycache__/privacy.cpython-312.pyc deleted file mode 100644 index f9900f79..00000000 Binary files a/Backend/src/schemas/__pycache__/privacy.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/schemas/__pycache__/promotion.cpython-312.pyc b/Backend/src/schemas/__pycache__/promotion.cpython-312.pyc deleted file mode 100644 index da73baaa..00000000 Binary files a/Backend/src/schemas/__pycache__/promotion.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/schemas/__pycache__/review.cpython-312.pyc b/Backend/src/schemas/__pycache__/review.cpython-312.pyc deleted file mode 100644 index 5a984d97..00000000 Binary files a/Backend/src/schemas/__pycache__/review.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/schemas/__pycache__/service_booking.cpython-312.pyc b/Backend/src/schemas/__pycache__/service_booking.cpython-312.pyc deleted file mode 100644 index 238851ce..00000000 Binary files a/Backend/src/schemas/__pycache__/service_booking.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/schemas/__pycache__/user.cpython-312.pyc b/Backend/src/schemas/__pycache__/user.cpython-312.pyc deleted file mode 100644 index ea65b8ae..00000000 Binary files a/Backend/src/schemas/__pycache__/user.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/security/__init__.py b/Backend/src/security/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/security/middleware/__init__.py b/Backend/src/security/middleware/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/middleware/admin_ip_whitelist.py b/Backend/src/security/middleware/admin_ip_whitelist.py similarity index 97% rename from Backend/src/middleware/admin_ip_whitelist.py rename to Backend/src/security/middleware/admin_ip_whitelist.py index d68ff10b..dae56a71 100644 --- a/Backend/src/middleware/admin_ip_whitelist.py +++ b/Backend/src/security/middleware/admin_ip_whitelist.py @@ -3,8 +3,8 @@ from starlette.middleware.base import BaseHTTPMiddleware from starlette.responses import JSONResponse from typing import List import ipaddress -from ..config.settings import settings -from ..config.logging_config import get_logger +from ...shared.config.settings import settings +from ...shared.config.logging_config import get_logger logger = get_logger(__name__) diff --git a/Backend/src/middleware/auth.py b/Backend/src/security/middleware/auth.py similarity index 96% rename from Backend/src/middleware/auth.py rename to Backend/src/security/middleware/auth.py index fdff644a..fd1249c6 100644 --- a/Backend/src/middleware/auth.py +++ b/Backend/src/security/middleware/auth.py @@ -4,10 +4,10 @@ from jose import JWTError, jwt from sqlalchemy.orm import Session from typing import Optional import os -from ..config.database import get_db -from ..config.settings import settings -from ..models.user import User -from ..models.role import Role +from ...shared.config.database import get_db +from ...shared.config.settings import settings +from ...auth.models.user import User +from ...auth.models.role import Role security = HTTPBearer(auto_error=False) def get_jwt_secret() -> str: diff --git a/Backend/src/middleware/csrf.py b/Backend/src/security/middleware/csrf.py similarity index 98% rename from Backend/src/middleware/csrf.py rename to Backend/src/security/middleware/csrf.py index 2b162cd4..b5792ea0 100644 --- a/Backend/src/middleware/csrf.py +++ b/Backend/src/security/middleware/csrf.py @@ -5,8 +5,8 @@ from typing import Optional import secrets import hmac import hashlib -from ..config.logging_config import get_logger -from ..config.settings import settings +from ...shared.config.logging_config import get_logger +from ...shared.config.settings import settings logger = get_logger(__name__) diff --git a/Backend/src/middleware/ip_whitelist.py b/Backend/src/security/middleware/ip_whitelist.py similarity index 98% rename from Backend/src/middleware/ip_whitelist.py rename to Backend/src/security/middleware/ip_whitelist.py index 1f17cfd2..7dc6af86 100644 --- a/Backend/src/middleware/ip_whitelist.py +++ b/Backend/src/security/middleware/ip_whitelist.py @@ -3,9 +3,9 @@ from starlette.middleware.base import BaseHTTPMiddleware from starlette.responses import JSONResponse from sqlalchemy.orm import Session from typing import List -from ..config.database import get_db -from ..config.logging_config import get_logger -from ..config.settings import settings +from ...shared.config.database import get_db +from ...shared.config.logging_config import get_logger +from ...shared.config.settings import settings from ..models.security_event import IPWhitelist, IPBlacklist, SecurityEvent, SecurityEventType, SecurityEventSeverity from datetime import datetime import ipaddress diff --git a/Backend/src/middleware/security.py b/Backend/src/security/middleware/security.py similarity index 96% rename from Backend/src/middleware/security.py rename to Backend/src/security/middleware/security.py index 3da0b2f8..e835b87f 100644 --- a/Backend/src/middleware/security.py +++ b/Backend/src/security/middleware/security.py @@ -1,8 +1,8 @@ from fastapi import Request from starlette.middleware.base import BaseHTTPMiddleware from starlette.responses import Response -from ..config.logging_config import get_logger -from ..config.settings import settings +from ...shared.config.logging_config import get_logger +from ...shared.config.settings import settings logger = get_logger(__name__) class SecurityHeadersMiddleware(BaseHTTPMiddleware): diff --git a/Backend/src/security/models/__init__.py b/Backend/src/security/models/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/models/gdpr_compliance.py b/Backend/src/security/models/gdpr_compliance.py similarity index 98% rename from Backend/src/models/gdpr_compliance.py rename to Backend/src/security/models/gdpr_compliance.py index ccac1314..c0875b3b 100644 --- a/Backend/src/models/gdpr_compliance.py +++ b/Backend/src/security/models/gdpr_compliance.py @@ -2,7 +2,7 @@ from sqlalchemy import Column, Integer, String, Text, DateTime, ForeignKey, JSON from sqlalchemy.orm import relationship from datetime import datetime import enum -from ..config.database import Base +from ...shared.config.database import Base class DataSubjectRequestType(str, enum.Enum): access = 'access' # Right to access diff --git a/Backend/src/models/security_event.py b/Backend/src/security/models/security_event.py similarity index 99% rename from Backend/src/models/security_event.py rename to Backend/src/security/models/security_event.py index 2c77b30c..2465ce6c 100644 --- a/Backend/src/models/security_event.py +++ b/Backend/src/security/models/security_event.py @@ -2,7 +2,7 @@ from sqlalchemy import Column, Integer, String, Text, DateTime, ForeignKey, JSON from sqlalchemy.orm import relationship from datetime import datetime import enum -from ..config.database import Base +from ...shared.config.database import Base class SecurityEventType(str, enum.Enum): login_attempt = 'login_attempt' diff --git a/Backend/src/security/routes/__init__.py b/Backend/src/security/routes/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/routes/security_routes.py b/Backend/src/security/routes/security_routes.py similarity index 98% rename from Backend/src/routes/security_routes.py rename to Backend/src/security/routes/security_routes.py index 151f4555..690682bd 100644 --- a/Backend/src/routes/security_routes.py +++ b/Backend/src/security/routes/security_routes.py @@ -4,13 +4,13 @@ from typing import Optional, List from datetime import datetime, timedelta from pydantic import BaseModel, EmailStr import logging -from ..config.logging_config import get_logger +from ...shared.config.logging_config import get_logger logger = get_logger(__name__) -from ..config.database import get_db -from ..middleware.auth import get_current_user, authorize_roles -from ..models.user import User +from ...shared.config.database import get_db +from ...security.middleware.auth import get_current_user, authorize_roles +from ...auth.models.user import User from ..models.security_event import ( SecurityEvent, SecurityEventType, @@ -25,7 +25,7 @@ from ..services.security_scan_service import security_scan_service # OAuth service is optional - only import if httpx is available try: - from ..services.oauth_service import oauth_service + from ...auth.services.oauth_service import oauth_service OAUTH_AVAILABLE = True except ImportError: OAUTH_AVAILABLE = False @@ -590,7 +590,7 @@ async def oauth_callback( ) # Generate JWT tokens for the user - from ..services.auth_service import auth_service + from ...auth.services.auth_service import auth_service tokens = auth_service.generate_tokens(user.id) return { @@ -667,7 +667,7 @@ async def get_user_data( # Users can only access their own data, unless admin if current_user.id != user_id: # Check if user is admin - from ..models.role import Role + from ...auth.models.role import Role role = db.query(Role).filter(Role.id == current_user.role_id).first() if not role or role.name != "admin": raise HTTPException(status_code=403, detail="Access denied") @@ -702,7 +702,7 @@ async def export_user_data( """Export user data (GDPR portability request)""" if current_user.id != user_id: # Check if user is admin - from ..models.role import Role + from ...auth.models.role import Role role = db.query(Role).filter(Role.id == current_user.role_id).first() if not role or role.name != "admin": raise HTTPException(status_code=403, detail="Access denied") diff --git a/Backend/src/security/schemas/__init__.py b/Backend/src/security/schemas/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/security/services/__init__.py b/Backend/src/security/services/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/services/encryption_service.py b/Backend/src/security/services/encryption_service.py similarity index 98% rename from Backend/src/services/encryption_service.py rename to Backend/src/security/services/encryption_service.py index 2d254b7f..72387f16 100644 --- a/Backend/src/services/encryption_service.py +++ b/Backend/src/security/services/encryption_service.py @@ -6,7 +6,7 @@ import base64 import os from typing import Optional import logging -from ..config.settings import settings +from ...shared.config.settings import settings logger = logging.getLogger(__name__) diff --git a/Backend/src/services/gdpr_service.py b/Backend/src/security/services/gdpr_service.py similarity index 97% rename from Backend/src/services/gdpr_service.py rename to Backend/src/security/services/gdpr_service.py index fec41425..aae94f49 100644 --- a/Backend/src/services/gdpr_service.py +++ b/Backend/src/security/services/gdpr_service.py @@ -11,11 +11,11 @@ from ..models.gdpr_compliance import ( DataRetentionPolicy, ConsentRecord ) -from ..models.user import User -from ..models.booking import Booking -from ..models.payment import Payment -from ..models.review import Review -from ..config.logging_config import get_logger +from ...auth.models.user import User +from ...bookings.models.booking import Booking +from ...payments.models.payment import Payment +from ...reviews.models.review import Review +from ...shared.config.logging_config import get_logger logger = get_logger(__name__) diff --git a/Backend/src/services/privacy_admin_service.py b/Backend/src/security/services/privacy_admin_service.py similarity index 90% rename from Backend/src/services/privacy_admin_service.py rename to Backend/src/security/services/privacy_admin_service.py index 006e985a..9912a2f2 100644 --- a/Backend/src/services/privacy_admin_service.py +++ b/Backend/src/security/services/privacy_admin_service.py @@ -1,8 +1,8 @@ from sqlalchemy.orm import Session -from ..models.cookie_policy import CookiePolicy -from ..models.cookie_integration_config import CookieIntegrationConfig -from ..models.user import User -from ..schemas.admin_privacy import CookieIntegrationSettings, CookiePolicySettings, PublicPrivacyConfig +from ...content.models.cookie_policy import CookiePolicy +from ...content.models.cookie_integration_config import CookieIntegrationConfig +from ...auth.models.user import User +from ...content.schemas.admin_privacy import CookieIntegrationSettings, CookiePolicySettings, PublicPrivacyConfig class PrivacyAdminService: diff --git a/Backend/src/services/security_monitoring_service.py b/Backend/src/security/services/security_monitoring_service.py similarity index 98% rename from Backend/src/services/security_monitoring_service.py rename to Backend/src/security/services/security_monitoring_service.py index 4b9a4c7a..7c546028 100644 --- a/Backend/src/services/security_monitoring_service.py +++ b/Backend/src/security/services/security_monitoring_service.py @@ -2,8 +2,8 @@ from sqlalchemy.orm import Session from typing import Optional, List, Dict, Any from datetime import datetime, timedelta from ..models.security_event import SecurityEvent, SecurityEventType, SecurityEventSeverity -from ..models.user import User -from ..config.logging_config import get_logger +from ...auth.models.user import User +from ...shared.config.logging_config import get_logger logger = get_logger(__name__) diff --git a/Backend/src/services/security_scan_service.py b/Backend/src/security/services/security_scan_service.py similarity index 97% rename from Backend/src/services/security_scan_service.py rename to Backend/src/security/services/security_scan_service.py index d2797fa9..7e794acc 100644 --- a/Backend/src/services/security_scan_service.py +++ b/Backend/src/security/services/security_scan_service.py @@ -3,10 +3,10 @@ from typing import List, Dict, Any, Optional from datetime import datetime, timedelta import logging from ..models.security_event import SecurityEvent, SecurityEventType, SecurityEventSeverity -from ..models.user import User -from ..models.booking import Booking -from ..models.payment import Payment -from ..config.logging_config import get_logger +from ...auth.models.user import User +from ...bookings.models.booking import Booking +from ...payments.models.payment import Payment +from ...shared.config.logging_config import get_logger logger = get_logger(__name__) @@ -199,7 +199,7 @@ class SecurityScanService: @staticmethod def _check_expired_tokens(db: Session) -> Optional[Dict[str, Any]]: """Check for expired tokens that should be cleaned up""" - from ..models.refresh_token import RefreshToken + from ...auth.models.refresh_token import RefreshToken expired_tokens = db.query(RefreshToken).filter( RefreshToken.expires_at < datetime.utcnow() @@ -221,7 +221,7 @@ class SecurityScanService: @staticmethod def _check_unusual_payment_patterns(db: Session) -> Optional[Dict[str, Any]]: """Check for unusual payment patterns that might indicate fraud""" - from ..models.payment import PaymentStatus + from ...payments.models.payment import PaymentStatus # Check for multiple failed payments from same IP recent_payments = db.query(Payment).filter( diff --git a/Backend/src/services/__pycache__/analytics_service.cpython-312.pyc b/Backend/src/services/__pycache__/analytics_service.cpython-312.pyc deleted file mode 100644 index e21e3387..00000000 Binary files a/Backend/src/services/__pycache__/analytics_service.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/services/__pycache__/audit_service.cpython-312.pyc b/Backend/src/services/__pycache__/audit_service.cpython-312.pyc deleted file mode 100644 index eb68629c..00000000 Binary files a/Backend/src/services/__pycache__/audit_service.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/services/__pycache__/auth_service.cpython-312.pyc b/Backend/src/services/__pycache__/auth_service.cpython-312.pyc deleted file mode 100644 index e18fc5d9..00000000 Binary files a/Backend/src/services/__pycache__/auth_service.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/services/__pycache__/borica_service.cpython-312.pyc b/Backend/src/services/__pycache__/borica_service.cpython-312.pyc deleted file mode 100644 index 3ee49d46..00000000 Binary files a/Backend/src/services/__pycache__/borica_service.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/services/__pycache__/email_campaign_service.cpython-312.pyc b/Backend/src/services/__pycache__/email_campaign_service.cpython-312.pyc deleted file mode 100644 index 5f48fc38..00000000 Binary files a/Backend/src/services/__pycache__/email_campaign_service.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/services/__pycache__/encryption_service.cpython-312.pyc b/Backend/src/services/__pycache__/encryption_service.cpython-312.pyc deleted file mode 100644 index d80143f4..00000000 Binary files a/Backend/src/services/__pycache__/encryption_service.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/services/__pycache__/gdpr_service.cpython-312.pyc b/Backend/src/services/__pycache__/gdpr_service.cpython-312.pyc deleted file mode 100644 index af2e4634..00000000 Binary files a/Backend/src/services/__pycache__/gdpr_service.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/services/__pycache__/group_booking_service.cpython-312.pyc b/Backend/src/services/__pycache__/group_booking_service.cpython-312.pyc deleted file mode 100644 index c46592a7..00000000 Binary files a/Backend/src/services/__pycache__/group_booking_service.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/services/__pycache__/guest_profile_service.cpython-312.pyc b/Backend/src/services/__pycache__/guest_profile_service.cpython-312.pyc deleted file mode 100644 index 024f6f93..00000000 Binary files a/Backend/src/services/__pycache__/guest_profile_service.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/services/__pycache__/invoice_service.cpython-312.pyc b/Backend/src/services/__pycache__/invoice_service.cpython-312.pyc deleted file mode 100644 index 07e1b940..00000000 Binary files a/Backend/src/services/__pycache__/invoice_service.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/services/__pycache__/loyalty_service.cpython-312.pyc b/Backend/src/services/__pycache__/loyalty_service.cpython-312.pyc deleted file mode 100644 index 3c53755c..00000000 Binary files a/Backend/src/services/__pycache__/loyalty_service.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/services/__pycache__/mfa_service.cpython-312.pyc b/Backend/src/services/__pycache__/mfa_service.cpython-312.pyc deleted file mode 100644 index 8a6a8833..00000000 Binary files a/Backend/src/services/__pycache__/mfa_service.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/services/__pycache__/notification_service.cpython-312.pyc b/Backend/src/services/__pycache__/notification_service.cpython-312.pyc deleted file mode 100644 index 3135b6b7..00000000 Binary files a/Backend/src/services/__pycache__/notification_service.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/services/__pycache__/oauth_service.cpython-312.pyc b/Backend/src/services/__pycache__/oauth_service.cpython-312.pyc deleted file mode 100644 index a5dc5bc7..00000000 Binary files a/Backend/src/services/__pycache__/oauth_service.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/services/__pycache__/paypal_service.cpython-312.pyc b/Backend/src/services/__pycache__/paypal_service.cpython-312.pyc deleted file mode 100644 index c61e52cb..00000000 Binary files a/Backend/src/services/__pycache__/paypal_service.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/services/__pycache__/privacy_admin_service.cpython-312.pyc b/Backend/src/services/__pycache__/privacy_admin_service.cpython-312.pyc deleted file mode 100644 index 50e0fc60..00000000 Binary files a/Backend/src/services/__pycache__/privacy_admin_service.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/services/__pycache__/room_assignment_service.cpython-312.pyc b/Backend/src/services/__pycache__/room_assignment_service.cpython-312.pyc deleted file mode 100644 index a4873c1b..00000000 Binary files a/Backend/src/services/__pycache__/room_assignment_service.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/services/__pycache__/room_service.cpython-312.pyc b/Backend/src/services/__pycache__/room_service.cpython-312.pyc deleted file mode 100644 index 2f0af0c7..00000000 Binary files a/Backend/src/services/__pycache__/room_service.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/services/__pycache__/security_monitoring_service.cpython-312.pyc b/Backend/src/services/__pycache__/security_monitoring_service.cpython-312.pyc deleted file mode 100644 index efc63630..00000000 Binary files a/Backend/src/services/__pycache__/security_monitoring_service.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/services/__pycache__/security_scan_service.cpython-312.pyc b/Backend/src/services/__pycache__/security_scan_service.cpython-312.pyc deleted file mode 100644 index 77c766cd..00000000 Binary files a/Backend/src/services/__pycache__/security_scan_service.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/services/__pycache__/stripe_service.cpython-312.pyc b/Backend/src/services/__pycache__/stripe_service.cpython-312.pyc deleted file mode 100644 index 801f8a30..00000000 Binary files a/Backend/src/services/__pycache__/stripe_service.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/services/__pycache__/task_service.cpython-312.pyc b/Backend/src/services/__pycache__/task_service.cpython-312.pyc deleted file mode 100644 index 35f4ffb7..00000000 Binary files a/Backend/src/services/__pycache__/task_service.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/services/__pycache__/workflow_service.cpython-312.pyc b/Backend/src/services/__pycache__/workflow_service.cpython-312.pyc deleted file mode 100644 index 53c95362..00000000 Binary files a/Backend/src/services/__pycache__/workflow_service.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/shared/__init__.py b/Backend/src/shared/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/shared/config/__init__.py b/Backend/src/shared/config/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/config/database.py b/Backend/src/shared/config/database.py similarity index 100% rename from Backend/src/config/database.py rename to Backend/src/shared/config/database.py diff --git a/Backend/src/config/logging_config.py b/Backend/src/shared/config/logging_config.py similarity index 100% rename from Backend/src/config/logging_config.py rename to Backend/src/shared/config/logging_config.py diff --git a/Backend/src/config/settings.py b/Backend/src/shared/config/settings.py similarity index 100% rename from Backend/src/config/settings.py rename to Backend/src/shared/config/settings.py diff --git a/Backend/src/shared/middleware/__init__.py b/Backend/src/shared/middleware/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/middleware/cookie_consent.py b/Backend/src/shared/middleware/cookie_consent.py similarity index 91% rename from Backend/src/middleware/cookie_consent.py rename to Backend/src/shared/middleware/cookie_consent.py index 6f9a072e..62fa826d 100644 --- a/Backend/src/middleware/cookie_consent.py +++ b/Backend/src/shared/middleware/cookie_consent.py @@ -2,9 +2,9 @@ import json from typing import Callable, Awaitable from fastapi import Request, Response from starlette.middleware.base import BaseHTTPMiddleware -from ..schemas.privacy import CookieConsent, CookieCategoryPreferences -from ..config.settings import settings -from ..config.logging_config import get_logger +from ...content.schemas.privacy import CookieConsent, CookieCategoryPreferences +from ...shared.config.settings import settings +from ...shared.config.logging_config import get_logger logger = get_logger(__name__) COOKIE_CONSENT_COOKIE_NAME = 'cookieConsent' diff --git a/Backend/src/middleware/error_handler.py b/Backend/src/shared/middleware/error_handler.py similarity index 97% rename from Backend/src/middleware/error_handler.py rename to Backend/src/shared/middleware/error_handler.py index fd07f125..f1ce8dec 100644 --- a/Backend/src/middleware/error_handler.py +++ b/Backend/src/shared/middleware/error_handler.py @@ -5,8 +5,8 @@ from sqlalchemy.exc import IntegrityError from jose.exceptions import JWTError import traceback import os -from ..utils.response_helpers import error_response -from ..config.settings import settings +from ...shared.utils.response_helpers import error_response +from ...shared.config.settings import settings def _add_cors_headers(response: JSONResponse, request: Request) -> JSONResponse: """Add CORS headers to response for cross-origin requests.""" @@ -97,7 +97,7 @@ async def http_exception_handler(request: Request, exc: HTTPException): return _add_cors_headers(response, request) async def general_exception_handler(request: Request, exc: Exception): - from ..config.logging_config import get_logger + from ...shared.config.logging_config import get_logger logger = get_logger(__name__) request_id = getattr(request.state, 'request_id', None) logger.error(f'Unhandled exception: {type(exc).__name__}: {str(exc)}', extra={'request_id': request_id, 'path': request.url.path, 'method': request.method, 'exception_type': type(exc).__name__}, exc_info=True) diff --git a/Backend/src/middleware/request_id.py b/Backend/src/shared/middleware/request_id.py similarity index 95% rename from Backend/src/middleware/request_id.py rename to Backend/src/shared/middleware/request_id.py index 57937d48..67689b9a 100644 --- a/Backend/src/middleware/request_id.py +++ b/Backend/src/shared/middleware/request_id.py @@ -2,7 +2,7 @@ import uuid from fastapi import Request from starlette.middleware.base import BaseHTTPMiddleware from starlette.responses import Response -from ..config.logging_config import get_logger +from ...shared.config.logging_config import get_logger logger = get_logger(__name__) class RequestIDMiddleware(BaseHTTPMiddleware): diff --git a/Backend/src/middleware/request_size_limit.py b/Backend/src/shared/middleware/request_size_limit.py similarity index 95% rename from Backend/src/middleware/request_size_limit.py rename to Backend/src/shared/middleware/request_size_limit.py index 4006dac2..2d9b97a9 100644 --- a/Backend/src/middleware/request_size_limit.py +++ b/Backend/src/shared/middleware/request_size_limit.py @@ -1,8 +1,8 @@ from fastapi import Request, HTTPException, status from starlette.middleware.base import BaseHTTPMiddleware from starlette.responses import JSONResponse -from ..config.logging_config import get_logger -from ..config.settings import settings +from ...shared.config.logging_config import get_logger +from ...shared.config.settings import settings logger = get_logger(__name__) diff --git a/Backend/src/middleware/timeout.py b/Backend/src/shared/middleware/timeout.py similarity index 89% rename from Backend/src/middleware/timeout.py rename to Backend/src/shared/middleware/timeout.py index ff0319ee..281e9174 100644 --- a/Backend/src/middleware/timeout.py +++ b/Backend/src/shared/middleware/timeout.py @@ -1,8 +1,8 @@ import asyncio from fastapi import Request, HTTPException, status from starlette.middleware.base import BaseHTTPMiddleware -from ..config.logging_config import get_logger -from ..config.settings import settings +from ...shared.config.logging_config import get_logger +from ...shared.config.settings import settings logger = get_logger(__name__) class TimeoutMiddleware(BaseHTTPMiddleware): diff --git a/Backend/src/shared/utils/__init__.py b/Backend/src/shared/utils/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Backend/src/utils/currency_helpers.py b/Backend/src/shared/utils/currency_helpers.py similarity index 100% rename from Backend/src/utils/currency_helpers.py rename to Backend/src/shared/utils/currency_helpers.py diff --git a/Backend/src/services/currency_service.py b/Backend/src/shared/utils/currency_service.py similarity index 100% rename from Backend/src/services/currency_service.py rename to Backend/src/shared/utils/currency_service.py diff --git a/Backend/src/utils/email_templates.py b/Backend/src/shared/utils/email_templates.py similarity index 99% rename from Backend/src/utils/email_templates.py rename to Backend/src/shared/utils/email_templates.py index 26d44077..5850cd8f 100644 --- a/Backend/src/utils/email_templates.py +++ b/Backend/src/shared/utils/email_templates.py @@ -1,7 +1,7 @@ from datetime import datetime from typing import Optional -from ..config.database import SessionLocal -from ..models.system_settings import SystemSettings +from ...shared.config.database import SessionLocal +from ...system.models.system_settings import SystemSettings def _get_company_settings(): try: diff --git a/Backend/src/utils/error_handler.py b/Backend/src/shared/utils/error_handler.py similarity index 98% rename from Backend/src/utils/error_handler.py rename to Backend/src/shared/utils/error_handler.py index 95aa03c1..6f2fb75d 100644 --- a/Backend/src/utils/error_handler.py +++ b/Backend/src/shared/utils/error_handler.py @@ -8,7 +8,7 @@ from functools import wraps from fastapi import HTTPException from sqlalchemy.orm import Session from typing import Callable, Any -from ..config.logging_config import get_logger +from ...shared.config.logging_config import get_logger logger = get_logger(__name__) diff --git a/Backend/src/utils/file_validation.py b/Backend/src/shared/utils/file_validation.py similarity index 100% rename from Backend/src/utils/file_validation.py rename to Backend/src/shared/utils/file_validation.py diff --git a/Backend/src/utils/html_sanitizer.py b/Backend/src/shared/utils/html_sanitizer.py similarity index 100% rename from Backend/src/utils/html_sanitizer.py rename to Backend/src/shared/utils/html_sanitizer.py diff --git a/Backend/src/utils/mailer.py b/Backend/src/shared/utils/mailer.py similarity index 96% rename from Backend/src/utils/mailer.py rename to Backend/src/shared/utils/mailer.py index 1fa74302..6642544a 100644 --- a/Backend/src/utils/mailer.py +++ b/Backend/src/shared/utils/mailer.py @@ -3,9 +3,9 @@ from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart import os import logging -from ..config.settings import settings -from ..config.database import SessionLocal -from ..models.system_settings import SystemSettings +from ...shared.config.settings import settings +from ...shared.config.database import SessionLocal +from ...system.models.system_settings import SystemSettings logger = logging.getLogger(__name__) def _get_smtp_settings_from_db(): diff --git a/Backend/src/utils/password_validation.py b/Backend/src/shared/utils/password_validation.py similarity index 100% rename from Backend/src/utils/password_validation.py rename to Backend/src/shared/utils/password_validation.py diff --git a/Backend/src/utils/request_helpers.py b/Backend/src/shared/utils/request_helpers.py similarity index 100% rename from Backend/src/utils/request_helpers.py rename to Backend/src/shared/utils/request_helpers.py diff --git a/Backend/src/utils/response_helpers.py b/Backend/src/shared/utils/response_helpers.py similarity index 100% rename from Backend/src/utils/response_helpers.py rename to Backend/src/shared/utils/response_helpers.py diff --git a/Backend/src/utils/role_helpers.py b/Backend/src/shared/utils/role_helpers.py similarity index 95% rename from Backend/src/utils/role_helpers.py rename to Backend/src/shared/utils/role_helpers.py index ab8a8677..9f078f38 100644 --- a/Backend/src/utils/role_helpers.py +++ b/Backend/src/shared/utils/role_helpers.py @@ -2,8 +2,8 @@ Utility functions for role-based access control """ from sqlalchemy.orm import Session -from ..models.user import User -from ..models.role import Role +from ...auth.models.user import User +from ...auth.models.role import Role def get_user_role_name(user: User, db: Session) -> str: """Get the role name for a user""" diff --git a/Backend/src/utils/transaction.py b/Backend/src/shared/utils/transaction.py similarity index 95% rename from Backend/src/utils/transaction.py rename to Backend/src/shared/utils/transaction.py index 0ea6cd0f..c765996f 100644 --- a/Backend/src/utils/transaction.py +++ b/Backend/src/shared/utils/transaction.py @@ -7,7 +7,7 @@ database commits and rollbacks, ensuring data consistency. from contextlib import contextmanager from sqlalchemy.orm import Session from typing import Generator -from ..config.logging_config import get_logger +from ...shared.config.logging_config import get_logger logger = get_logger(__name__) diff --git a/Backend/src/models/system_settings.py b/Backend/src/system/models/system_settings.py similarity index 93% rename from Backend/src/models/system_settings.py rename to Backend/src/system/models/system_settings.py index c0643b88..2a8dc2cf 100644 --- a/Backend/src/models/system_settings.py +++ b/Backend/src/system/models/system_settings.py @@ -1,7 +1,7 @@ from sqlalchemy import Column, Integer, String, DateTime, Text, ForeignKey from sqlalchemy.orm import relationship from datetime import datetime -from ..config.database import Base +from ...shared.config.database import Base class SystemSettings(Base): __tablename__ = 'system_settings' diff --git a/Backend/src/models/workflow.py b/Backend/src/system/models/workflow.py similarity index 99% rename from Backend/src/models/workflow.py rename to Backend/src/system/models/workflow.py index 9ac4ea7e..4a762da2 100644 --- a/Backend/src/models/workflow.py +++ b/Backend/src/system/models/workflow.py @@ -2,7 +2,7 @@ from sqlalchemy import Column, Integer, String, DateTime, Boolean, Text, Enum, F from sqlalchemy.orm import relationship from datetime import datetime import enum -from ..config.database import Base +from ...shared.config.database import Base class WorkflowType(str, enum.Enum): pre_arrival = 'pre_arrival' diff --git a/Backend/src/routes/system_settings_routes.py b/Backend/src/system/routes/system_settings_routes.py similarity index 99% rename from Backend/src/routes/system_settings_routes.py rename to Backend/src/system/routes/system_settings_routes.py index 3c5ebc2b..0c9f91d4 100644 --- a/Backend/src/routes/system_settings_routes.py +++ b/Backend/src/system/routes/system_settings_routes.py @@ -9,12 +9,12 @@ import aiofiles import uuid import os -from ..config.database import get_db -from ..middleware.auth import get_current_user, authorize_roles -from ..models.user import User +from ...shared.config.database import get_db +from ...security.middleware.auth import get_current_user, authorize_roles +from ...auth.models.user import User from ..models.system_settings import SystemSettings -from ..utils.mailer import send_email -from ..services.room_service import get_base_url +from ...shared.utils.mailer import send_email +from ...rooms.services.room_service import get_base_url def normalize_image_url(image_url: str, base_url: str) -> str: if not image_url: diff --git a/Backend/src/routes/task_routes.py b/Backend/src/system/routes/task_routes.py similarity index 98% rename from Backend/src/routes/task_routes.py rename to Backend/src/system/routes/task_routes.py index cf3d94a5..fbcfde80 100644 --- a/Backend/src/routes/task_routes.py +++ b/Backend/src/system/routes/task_routes.py @@ -1,11 +1,11 @@ from fastapi import APIRouter, Depends, HTTPException, Query, Body from sqlalchemy.orm import Session from typing import Optional, List, Dict, Any -from ..config.database import get_db -from ..middleware.auth import authorize_roles, get_current_user -from ..models.user import User +from ...shared.config.database import get_db +from ...security.middleware.auth import authorize_roles, get_current_user +from ...auth.models.user import User from ..models.workflow import TaskStatus, TaskPriority -from ..services.task_service import TaskService +from ...hotel_services.services.task_service import TaskService from pydantic import BaseModel from datetime import datetime diff --git a/Backend/src/routes/workflow_routes.py b/Backend/src/system/routes/workflow_routes.py similarity index 98% rename from Backend/src/routes/workflow_routes.py rename to Backend/src/system/routes/workflow_routes.py index 1a1ef555..156604ac 100644 --- a/Backend/src/routes/workflow_routes.py +++ b/Backend/src/system/routes/workflow_routes.py @@ -1,9 +1,9 @@ from fastapi import APIRouter, Depends, HTTPException, Query, Body from sqlalchemy.orm import Session from typing import Optional, List, Dict, Any -from ..config.database import get_db -from ..middleware.auth import authorize_roles, get_current_user -from ..models.user import User +from ...shared.config.database import get_db +from ...security.middleware.auth import authorize_roles, get_current_user +from ...auth.models.user import User from ..models.workflow import WorkflowType, WorkflowStatus, WorkflowTrigger from ..services.workflow_service import WorkflowService from pydantic import BaseModel diff --git a/Backend/src/services/workflow_service.py b/Backend/src/system/services/workflow_service.py similarity index 98% rename from Backend/src/services/workflow_service.py rename to Backend/src/system/services/workflow_service.py index e92b68e0..e8ed947d 100644 --- a/Backend/src/services/workflow_service.py +++ b/Backend/src/system/services/workflow_service.py @@ -6,9 +6,9 @@ from ..models.workflow import ( Workflow, WorkflowInstance, Task, TaskComment, WorkflowType, WorkflowStatus, WorkflowTrigger, TaskStatus, TaskPriority ) -from ..models.booking import Booking, BookingStatus -from ..models.room import Room -from ..models.user import User +from ...bookings.models.booking import Booking, BookingStatus +from ...rooms.models.room import Room +from ...auth.models.user import User import logging logger = logging.getLogger(__name__) diff --git a/Backend/src/tasks/security_scan_task.py b/Backend/src/system/tasks/security_scan_task.py similarity index 91% rename from Backend/src/tasks/security_scan_task.py rename to Backend/src/system/tasks/security_scan_task.py index e8abaeac..545d8334 100644 --- a/Backend/src/tasks/security_scan_task.py +++ b/Backend/src/system/tasks/security_scan_task.py @@ -6,9 +6,9 @@ to run security scans automatically at scheduled intervals. from datetime import datetime import logging -from ..services.security_scan_service import security_scan_service -from ..config.database import get_db -from ..config.logging_config import get_logger +from ...security.services.security_scan_service import security_scan_service +from ...shared.config.database import get_db +from ...shared.config.logging_config import get_logger logger = get_logger(__name__) diff --git a/Backend/src/tests/conftest.py b/Backend/src/tests/conftest.py index 5ed22d2a..7577961d 100644 --- a/Backend/src/tests/conftest.py +++ b/Backend/src/tests/conftest.py @@ -14,8 +14,8 @@ from pathlib import Path # Add src to path sys.path.insert(0, str(Path(__file__).parent.parent)) -from src.config.database import Base, get_db -from src.config.settings import settings +from src.shared.config.database import Base, get_db +from src.shared.config.settings import settings from src.main import app from src.models.user import User from src.models.role import Role @@ -26,7 +26,7 @@ from src.models.payment import Payment, PaymentMethod, PaymentStatus from src.models.service import Service from src.models.promotion import Promotion from src.models.banner import Banner -from src.services.auth_service import auth_service +from src.auth.services.auth_service import auth_service import bcrypt diff --git a/Backend/src/tests/test_auth_routes.py b/Backend/src/tests/test_auth_routes.py index 4e4b10ca..c946932f 100644 --- a/Backend/src/tests/test_auth_routes.py +++ b/Backend/src/tests/test_auth_routes.py @@ -8,9 +8,9 @@ from sqlalchemy.orm import Session from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from ..main import app -from ..config.database import Base, get_db -from ..models.user import User -from ..models.role import Role +from ...shared.config.database import Base, get_db +from ...auth.models.user import User +from ...auth.models.role import Role import bcrypt # Test database setup diff --git a/Backend/src/tests/test_booking_routes.py b/Backend/src/tests/test_booking_routes.py index b166008e..868af20e 100644 --- a/Backend/src/tests/test_booking_routes.py +++ b/Backend/src/tests/test_booking_routes.py @@ -9,12 +9,12 @@ from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from datetime import datetime, timedelta from ..main import app -from ..config.database import Base, get_db -from ..models.user import User -from ..models.role import Role -from ..models.room import Room, RoomStatus -from ..models.room_type import RoomType -from ..models.booking import Booking, BookingStatus +from ...shared.config.database import Base, get_db +from ...auth.models.user import User +from ...auth.models.role import Role +from ...rooms.models.room import Room, RoomStatus +from ...rooms.models.room_type import RoomType +from ...bookings.models.booking import Booking, BookingStatus import bcrypt # Test database setup diff --git a/Backend/src/utils/__pycache__/currency_helpers.cpython-312.pyc b/Backend/src/utils/__pycache__/currency_helpers.cpython-312.pyc deleted file mode 100644 index ca704c5c..00000000 Binary files a/Backend/src/utils/__pycache__/currency_helpers.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/utils/__pycache__/email_templates.cpython-312.pyc b/Backend/src/utils/__pycache__/email_templates.cpython-312.pyc deleted file mode 100644 index cbebfa54..00000000 Binary files a/Backend/src/utils/__pycache__/email_templates.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/utils/__pycache__/file_validation.cpython-312.pyc b/Backend/src/utils/__pycache__/file_validation.cpython-312.pyc deleted file mode 100644 index 7510c6af..00000000 Binary files a/Backend/src/utils/__pycache__/file_validation.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/utils/__pycache__/html_sanitizer.cpython-312.pyc b/Backend/src/utils/__pycache__/html_sanitizer.cpython-312.pyc deleted file mode 100644 index fed229df..00000000 Binary files a/Backend/src/utils/__pycache__/html_sanitizer.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/utils/__pycache__/mailer.cpython-312.pyc b/Backend/src/utils/__pycache__/mailer.cpython-312.pyc deleted file mode 100644 index 5d5fc330..00000000 Binary files a/Backend/src/utils/__pycache__/mailer.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/utils/__pycache__/request_helpers.cpython-312.pyc b/Backend/src/utils/__pycache__/request_helpers.cpython-312.pyc deleted file mode 100644 index a65270da..00000000 Binary files a/Backend/src/utils/__pycache__/request_helpers.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/utils/__pycache__/response_helpers.cpython-312.pyc b/Backend/src/utils/__pycache__/response_helpers.cpython-312.pyc deleted file mode 100644 index 7e9bf35f..00000000 Binary files a/Backend/src/utils/__pycache__/response_helpers.cpython-312.pyc and /dev/null differ diff --git a/Backend/src/utils/__pycache__/role_helpers.cpython-312.pyc b/Backend/src/utils/__pycache__/role_helpers.cpython-312.pyc deleted file mode 100644 index d80bb7cf..00000000 Binary files a/Backend/src/utils/__pycache__/role_helpers.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/BmpImagePlugin.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/BmpImagePlugin.cpython-312.pyc deleted file mode 100644 index b796b22a..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/BmpImagePlugin.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ExifTags.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ExifTags.cpython-312.pyc deleted file mode 100644 index 105cb8d3..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ExifTags.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/GifImagePlugin.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/GifImagePlugin.cpython-312.pyc deleted file mode 100644 index 77942692..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/GifImagePlugin.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/GimpGradientFile.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/GimpGradientFile.cpython-312.pyc deleted file mode 100644 index 80805bf8..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/GimpGradientFile.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/GimpPaletteFile.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/GimpPaletteFile.cpython-312.pyc deleted file mode 100644 index c2fac7a7..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/GimpPaletteFile.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/Image.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/Image.cpython-312.pyc deleted file mode 100644 index a7ea10f5..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/Image.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageChops.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageChops.cpython-312.pyc deleted file mode 100644 index 2495824f..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageChops.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageColor.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageColor.cpython-312.pyc deleted file mode 100644 index 39009a6f..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageColor.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageDraw.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageDraw.cpython-312.pyc deleted file mode 100644 index 275c1af1..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageDraw.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageFile.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageFile.cpython-312.pyc deleted file mode 100644 index b8d6bf18..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageFile.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageMode.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageMode.cpython-312.pyc deleted file mode 100644 index 04ed2e9d..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageMode.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ImagePalette.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ImagePalette.cpython-312.pyc deleted file mode 100644 index c734fa06..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ImagePalette.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageSequence.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageSequence.cpython-312.pyc deleted file mode 100644 index 6ac8cc7f..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageSequence.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/JpegImagePlugin.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/JpegImagePlugin.cpython-312.pyc deleted file mode 100644 index 0f289685..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/JpegImagePlugin.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/JpegPresets.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/JpegPresets.cpython-312.pyc deleted file mode 100644 index 16ab2dd9..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/JpegPresets.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/PaletteFile.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/PaletteFile.cpython-312.pyc deleted file mode 100644 index 1c61d7b4..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/PaletteFile.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/PngImagePlugin.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/PngImagePlugin.cpython-312.pyc deleted file mode 100644 index 312fe135..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/PngImagePlugin.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/PpmImagePlugin.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/PpmImagePlugin.cpython-312.pyc deleted file mode 100644 index 3df18104..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/PpmImagePlugin.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/TiffTags.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/TiffTags.cpython-312.pyc deleted file mode 100644 index 7b73c68a..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/TiffTags.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 77575b97..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/_binary.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/_binary.cpython-312.pyc deleted file mode 100644 index debb3d45..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/_binary.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/_util.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/_util.cpython-312.pyc deleted file mode 100644 index a8657e00..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/_util.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/_version.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/_version.cpython-312.pyc deleted file mode 100644 index efaa774a..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/_version.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/__pycache__/png.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/__pycache__/png.cpython-312.pyc deleted file mode 100644 index d8f25b2a..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/__pycache__/png.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/__pycache__/six.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/__pycache__/six.cpython-312.pyc deleted file mode 100644 index 6d8c79c5..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/__pycache__/six.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/__pycache__/typing_extensions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/__pycache__/typing_extensions.cpython-312.pyc deleted file mode 100644 index 3a31168a..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/__pycache__/typing_extensions.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/aiofiles/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/aiofiles/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 47c3d780..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/aiofiles/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/aiofiles/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/aiofiles/__pycache__/base.cpython-312.pyc deleted file mode 100644 index 34b358f3..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/aiofiles/__pycache__/base.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/aiofiles/tempfile/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/aiofiles/tempfile/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index e6741e32..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/aiofiles/tempfile/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/aiofiles/tempfile/__pycache__/temptypes.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/aiofiles/tempfile/__pycache__/temptypes.cpython-312.pyc deleted file mode 100644 index 0340305f..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/aiofiles/tempfile/__pycache__/temptypes.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/aiofiles/threadpool/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/aiofiles/threadpool/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index c489af88..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/aiofiles/threadpool/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/aiofiles/threadpool/__pycache__/binary.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/aiofiles/threadpool/__pycache__/binary.cpython-312.pyc deleted file mode 100644 index 49ac95d0..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/aiofiles/threadpool/__pycache__/binary.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/aiofiles/threadpool/__pycache__/text.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/aiofiles/threadpool/__pycache__/text.cpython-312.pyc deleted file mode 100644 index 0f3c0974..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/aiofiles/threadpool/__pycache__/text.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/aiofiles/threadpool/__pycache__/utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/aiofiles/threadpool/__pycache__/utils.cpython-312.pyc deleted file mode 100644 index a071aef0..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/aiofiles/threadpool/__pycache__/utils.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 731e8e18..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/api.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/api.cpython-312.pyc deleted file mode 100644 index cc272f60..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/api.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/auth.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/auth.cpython-312.pyc deleted file mode 100644 index a5406ee7..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/auth.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/email.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/email.cpython-312.pyc deleted file mode 100644 index a7bcae01..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/email.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/errors.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/errors.cpython-312.pyc deleted file mode 100644 index f71076a1..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/errors.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/esmtp.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/esmtp.cpython-312.pyc deleted file mode 100644 index 571fd853..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/esmtp.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/protocol.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/protocol.cpython-312.pyc deleted file mode 100644 index 1440bfeb..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/protocol.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/response.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/response.cpython-312.pyc deleted file mode 100644 index b91196ca..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/response.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/smtp.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/smtp.cpython-312.pyc deleted file mode 100644 index b29df119..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/smtp.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/typing.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/typing.cpython-312.pyc deleted file mode 100644 index cd3ea2f4..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/typing.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 7c40d44c..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/alembic/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/__pycache__/command.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/__pycache__/command.cpython-312.pyc deleted file mode 100644 index e5b0425d..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/alembic/__pycache__/command.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/__pycache__/config.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/__pycache__/config.cpython-312.pyc deleted file mode 100644 index e71f2454..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/alembic/__pycache__/config.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/__pycache__/context.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/__pycache__/context.cpython-312.pyc deleted file mode 100644 index 46f99ee1..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/alembic/__pycache__/context.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/__pycache__/op.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/__pycache__/op.cpython-312.pyc deleted file mode 100644 index eb388e34..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/alembic/__pycache__/op.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/autogenerate/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/autogenerate/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 4a616c8e..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/alembic/autogenerate/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/autogenerate/__pycache__/api.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/autogenerate/__pycache__/api.cpython-312.pyc deleted file mode 100644 index ac58ecf0..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/alembic/autogenerate/__pycache__/api.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/autogenerate/__pycache__/compare.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/autogenerate/__pycache__/compare.cpython-312.pyc deleted file mode 100644 index fcc88a52..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/alembic/autogenerate/__pycache__/compare.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/autogenerate/__pycache__/render.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/autogenerate/__pycache__/render.cpython-312.pyc deleted file mode 100644 index 576ead09..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/alembic/autogenerate/__pycache__/render.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/autogenerate/__pycache__/rewriter.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/autogenerate/__pycache__/rewriter.cpython-312.pyc deleted file mode 100644 index e7145d33..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/alembic/autogenerate/__pycache__/rewriter.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/ddl/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/ddl/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index d9657436..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/alembic/ddl/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/ddl/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/ddl/__pycache__/base.cpython-312.pyc deleted file mode 100644 index 3e997212..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/alembic/ddl/__pycache__/base.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/ddl/__pycache__/impl.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/ddl/__pycache__/impl.cpython-312.pyc deleted file mode 100644 index 238d48e2..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/alembic/ddl/__pycache__/impl.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/ddl/__pycache__/mssql.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/ddl/__pycache__/mssql.cpython-312.pyc deleted file mode 100644 index 5acbf8c7..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/alembic/ddl/__pycache__/mssql.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/ddl/__pycache__/mysql.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/ddl/__pycache__/mysql.cpython-312.pyc deleted file mode 100644 index f35befea..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/alembic/ddl/__pycache__/mysql.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/ddl/__pycache__/oracle.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/ddl/__pycache__/oracle.cpython-312.pyc deleted file mode 100644 index db7fca23..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/alembic/ddl/__pycache__/oracle.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/ddl/__pycache__/postgresql.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/ddl/__pycache__/postgresql.cpython-312.pyc deleted file mode 100644 index d58ebc51..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/alembic/ddl/__pycache__/postgresql.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/ddl/__pycache__/sqlite.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/ddl/__pycache__/sqlite.cpython-312.pyc deleted file mode 100644 index c3af3bd5..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/alembic/ddl/__pycache__/sqlite.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/operations/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/operations/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index f71e7488..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/alembic/operations/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/operations/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/operations/__pycache__/base.cpython-312.pyc deleted file mode 100644 index 0063659f..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/alembic/operations/__pycache__/base.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/operations/__pycache__/batch.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/operations/__pycache__/batch.cpython-312.pyc deleted file mode 100644 index 016821bc..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/alembic/operations/__pycache__/batch.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/operations/__pycache__/ops.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/operations/__pycache__/ops.cpython-312.pyc deleted file mode 100644 index 29befe7d..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/alembic/operations/__pycache__/ops.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/operations/__pycache__/schemaobj.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/operations/__pycache__/schemaobj.cpython-312.pyc deleted file mode 100644 index b597aedc..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/alembic/operations/__pycache__/schemaobj.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/operations/__pycache__/toimpl.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/operations/__pycache__/toimpl.cpython-312.pyc deleted file mode 100644 index 26c16a22..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/alembic/operations/__pycache__/toimpl.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/runtime/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/runtime/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 4ee5fcc6..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/alembic/runtime/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/runtime/__pycache__/environment.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/runtime/__pycache__/environment.cpython-312.pyc deleted file mode 100644 index 91ca0ba5..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/alembic/runtime/__pycache__/environment.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/runtime/__pycache__/migration.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/runtime/__pycache__/migration.cpython-312.pyc deleted file mode 100644 index e4f90bb9..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/alembic/runtime/__pycache__/migration.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/script/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/script/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 3dad6ce9..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/alembic/script/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/script/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/script/__pycache__/base.cpython-312.pyc deleted file mode 100644 index cf1d4eca..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/alembic/script/__pycache__/base.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/script/__pycache__/revision.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/script/__pycache__/revision.cpython-312.pyc deleted file mode 100644 index 9267029a..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/alembic/script/__pycache__/revision.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/script/__pycache__/write_hooks.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/script/__pycache__/write_hooks.cpython-312.pyc deleted file mode 100644 index 091d680d..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/alembic/script/__pycache__/write_hooks.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/util/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/util/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 3a6cd320..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/alembic/util/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/util/__pycache__/compat.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/util/__pycache__/compat.cpython-312.pyc deleted file mode 100644 index be1fa177..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/alembic/util/__pycache__/compat.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/util/__pycache__/editor.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/util/__pycache__/editor.cpython-312.pyc deleted file mode 100644 index d139ac5c..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/alembic/util/__pycache__/editor.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/util/__pycache__/exc.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/util/__pycache__/exc.cpython-312.pyc deleted file mode 100644 index f2bc74e7..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/alembic/util/__pycache__/exc.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/util/__pycache__/langhelpers.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/util/__pycache__/langhelpers.cpython-312.pyc deleted file mode 100644 index 08c0c07e..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/alembic/util/__pycache__/langhelpers.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/util/__pycache__/messaging.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/util/__pycache__/messaging.cpython-312.pyc deleted file mode 100644 index a3e5dc9e..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/alembic/util/__pycache__/messaging.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/util/__pycache__/pyfiles.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/util/__pycache__/pyfiles.cpython-312.pyc deleted file mode 100644 index 0a6a26a1..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/alembic/util/__pycache__/pyfiles.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/util/__pycache__/sqla_compat.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/util/__pycache__/sqla_compat.cpython-312.pyc deleted file mode 100644 index 98ebdc1b..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/alembic/util/__pycache__/sqla_compat.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/annotated_types/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/annotated_types/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 34459304..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/annotated_types/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index eb02f314..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/anyio/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/__pycache__/from_thread.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/__pycache__/from_thread.cpython-312.pyc deleted file mode 100644 index 11032773..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/anyio/__pycache__/from_thread.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/__pycache__/lowlevel.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/__pycache__/lowlevel.cpython-312.pyc deleted file mode 100644 index e85045a7..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/anyio/__pycache__/lowlevel.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/__pycache__/to_thread.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/__pycache__/to_thread.cpython-312.pyc deleted file mode 100644 index 24dcba9b..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/anyio/__pycache__/to_thread.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/_backends/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/_backends/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 2ed58217..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/anyio/_backends/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/_backends/__pycache__/_asyncio.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/_backends/__pycache__/_asyncio.cpython-312.pyc deleted file mode 100644 index 4e8f26b3..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/anyio/_backends/__pycache__/_asyncio.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 78b221cf..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_compat.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_compat.cpython-312.pyc deleted file mode 100644 index 5fc25e08..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_compat.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_eventloop.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_eventloop.cpython-312.pyc deleted file mode 100644 index ce7bb6b7..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_eventloop.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_exceptions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_exceptions.cpython-312.pyc deleted file mode 100644 index 40f6fd14..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_exceptions.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_fileio.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_fileio.cpython-312.pyc deleted file mode 100644 index 810a87ff..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_fileio.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_resources.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_resources.cpython-312.pyc deleted file mode 100644 index a3e340b4..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_resources.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_signals.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_signals.cpython-312.pyc deleted file mode 100644 index a6aa1461..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_signals.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_sockets.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_sockets.cpython-312.pyc deleted file mode 100644 index 72544100..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_sockets.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_streams.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_streams.cpython-312.pyc deleted file mode 100644 index 63b46bf3..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_streams.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_subprocesses.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_subprocesses.cpython-312.pyc deleted file mode 100644 index 6adfeea3..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_subprocesses.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_synchronization.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_synchronization.cpython-312.pyc deleted file mode 100644 index 05ab1255..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_synchronization.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_tasks.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_tasks.cpython-312.pyc deleted file mode 100644 index 471767bc..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_tasks.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_testing.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_testing.cpython-312.pyc deleted file mode 100644 index a31b4541..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_testing.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_typedattr.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_typedattr.cpython-312.pyc deleted file mode 100644 index cb74b210..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_typedattr.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 1724b5b4..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_resources.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_resources.cpython-312.pyc deleted file mode 100644 index d43b3259..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_resources.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_sockets.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_sockets.cpython-312.pyc deleted file mode 100644 index b0756337..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_sockets.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_streams.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_streams.cpython-312.pyc deleted file mode 100644 index c6035583..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_streams.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_subprocesses.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_subprocesses.cpython-312.pyc deleted file mode 100644 index 0938df15..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_subprocesses.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_tasks.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_tasks.cpython-312.pyc deleted file mode 100644 index de853864..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_tasks.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_testing.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_testing.cpython-312.pyc deleted file mode 100644 index 7e9f0c8d..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_testing.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/streams/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/streams/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index acbc05d7..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/anyio/streams/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/streams/__pycache__/memory.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/streams/__pycache__/memory.cpython-312.pyc deleted file mode 100644 index c442d585..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/anyio/streams/__pycache__/memory.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/streams/__pycache__/stapled.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/streams/__pycache__/stapled.cpython-312.pyc deleted file mode 100644 index e34f74a5..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/anyio/streams/__pycache__/stapled.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/streams/__pycache__/tls.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/streams/__pycache__/tls.cpython-312.pyc deleted file mode 100644 index d69a02d9..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/anyio/streams/__pycache__/tls.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/bcrypt/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bcrypt/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 795c49b1..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/bcrypt/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 25b2c08e..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/bleach/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/__pycache__/callbacks.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/__pycache__/callbacks.cpython-312.pyc deleted file mode 100644 index 89e7a347..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/bleach/__pycache__/callbacks.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/__pycache__/html5lib_shim.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/__pycache__/html5lib_shim.cpython-312.pyc deleted file mode 100644 index c8fbf9ac..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/bleach/__pycache__/html5lib_shim.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/__pycache__/linkifier.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/__pycache__/linkifier.cpython-312.pyc deleted file mode 100644 index 92bb8221..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/bleach/__pycache__/linkifier.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/__pycache__/parse_shim.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/__pycache__/parse_shim.cpython-312.pyc deleted file mode 100644 index 2faa0926..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/bleach/__pycache__/parse_shim.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/__pycache__/sanitizer.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/__pycache__/sanitizer.cpython-312.pyc deleted file mode 100644 index b322e54b..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/bleach/__pycache__/sanitizer.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 2a651707..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/__pycache__/parse.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/__pycache__/parse.cpython-312.pyc deleted file mode 100644 index 0fe6248b..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/__pycache__/parse.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index c4aefade..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/__pycache__/_inputstream.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/__pycache__/_inputstream.cpython-312.pyc deleted file mode 100644 index 6623940c..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/__pycache__/_inputstream.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/__pycache__/_tokenizer.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/__pycache__/_tokenizer.cpython-312.pyc deleted file mode 100644 index dcbc6e59..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/__pycache__/_tokenizer.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/__pycache__/_utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/__pycache__/_utils.cpython-312.pyc deleted file mode 100644 index d20f3013..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/__pycache__/_utils.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/__pycache__/constants.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/__pycache__/constants.cpython-312.pyc deleted file mode 100644 index 46a7a523..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/__pycache__/constants.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/__pycache__/html5parser.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/__pycache__/html5parser.cpython-312.pyc deleted file mode 100644 index 8480f652..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/__pycache__/html5parser.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/__pycache__/serializer.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/__pycache__/serializer.cpython-312.pyc deleted file mode 100644 index 00eccdc1..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/__pycache__/serializer.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/_trie/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/_trie/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index b6f1c0bf..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/_trie/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/_trie/__pycache__/_base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/_trie/__pycache__/_base.cpython-312.pyc deleted file mode 100644 index 93b78d66..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/_trie/__pycache__/_base.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/_trie/__pycache__/py.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/_trie/__pycache__/py.cpython-312.pyc deleted file mode 100644 index 0913b8db..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/_trie/__pycache__/py.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/filters/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/filters/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 0da68e4c..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/filters/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/filters/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/filters/__pycache__/base.cpython-312.pyc deleted file mode 100644 index 0724b922..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/filters/__pycache__/base.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-312.pyc deleted file mode 100644 index 7d5083f3..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index e952866e..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/treebuilders/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/treebuilders/__pycache__/base.cpython-312.pyc deleted file mode 100644 index 2daf0f4f..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/treebuilders/__pycache__/base.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 6571f10c..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/certifi/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/certifi/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index eece9f2f..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/certifi/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/certifi/__pycache__/core.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/certifi/__pycache__/core.cpython-312.pyc deleted file mode 100644 index c50579ca..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/certifi/__pycache__/core.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cffi/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cffi/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 69ce6554..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cffi/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cffi/__pycache__/api.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cffi/__pycache__/api.cpython-312.pyc deleted file mode 100644 index ccd482d3..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cffi/__pycache__/api.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cffi/__pycache__/error.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cffi/__pycache__/error.cpython-312.pyc deleted file mode 100644 index cab99c9f..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cffi/__pycache__/error.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cffi/__pycache__/lock.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cffi/__pycache__/lock.cpython-312.pyc deleted file mode 100644 index 051742e6..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cffi/__pycache__/lock.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cffi/__pycache__/model.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cffi/__pycache__/model.cpython-312.pyc deleted file mode 100644 index 8cc7838a..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cffi/__pycache__/model.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 450be934..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/api.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/api.cpython-312.pyc deleted file mode 100644 index f8058d54..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/api.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/cd.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/cd.cpython-312.pyc deleted file mode 100644 index 11a8413b..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/cd.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/constant.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/constant.cpython-312.pyc deleted file mode 100644 index 329a0eb7..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/constant.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/legacy.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/legacy.cpython-312.pyc deleted file mode 100644 index 3a66e51e..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/legacy.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/models.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/models.cpython-312.pyc deleted file mode 100644 index 74fbb05d..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/models.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/utils.cpython-312.pyc deleted file mode 100644 index 9d1aafc7..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/utils.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/version.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/version.cpython-312.pyc deleted file mode 100644 index 6ada84ac..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/charset_normalizer/__pycache__/version.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/click/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/click/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index d32cbd45..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/click/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/click/__pycache__/_compat.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/click/__pycache__/_compat.cpython-312.pyc deleted file mode 100644 index d60fa63c..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/click/__pycache__/_compat.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/click/__pycache__/_utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/click/__pycache__/_utils.cpython-312.pyc deleted file mode 100644 index 5303a25a..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/click/__pycache__/_utils.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/click/__pycache__/core.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/click/__pycache__/core.cpython-312.pyc deleted file mode 100644 index f0890920..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/click/__pycache__/core.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/click/__pycache__/decorators.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/click/__pycache__/decorators.cpython-312.pyc deleted file mode 100644 index 42d27b97..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/click/__pycache__/decorators.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/click/__pycache__/exceptions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/click/__pycache__/exceptions.cpython-312.pyc deleted file mode 100644 index ce303a28..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/click/__pycache__/exceptions.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/click/__pycache__/formatting.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/click/__pycache__/formatting.cpython-312.pyc deleted file mode 100644 index 73fbb11c..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/click/__pycache__/formatting.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/click/__pycache__/globals.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/click/__pycache__/globals.cpython-312.pyc deleted file mode 100644 index 89b635e7..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/click/__pycache__/globals.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/click/__pycache__/parser.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/click/__pycache__/parser.cpython-312.pyc deleted file mode 100644 index 5627c80d..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/click/__pycache__/parser.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/click/__pycache__/termui.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/click/__pycache__/termui.cpython-312.pyc deleted file mode 100644 index 1c77cb4c..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/click/__pycache__/termui.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/click/__pycache__/types.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/click/__pycache__/types.cpython-312.pyc deleted file mode 100644 index 50cebef4..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/click/__pycache__/types.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/click/__pycache__/utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/click/__pycache__/utils.cpython-312.pyc deleted file mode 100644 index 76bf5f63..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/click/__pycache__/utils.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/__pycache__/__about__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/__pycache__/__about__.cpython-312.pyc deleted file mode 100644 index 20e2ee20..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/__pycache__/__about__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 4e6df774..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/__pycache__/exceptions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/__pycache__/exceptions.cpython-312.pyc deleted file mode 100644 index c9c901a9..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/__pycache__/exceptions.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/__pycache__/fernet.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/__pycache__/fernet.cpython-312.pyc deleted file mode 100644 index 6ce20e0e..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/__pycache__/fernet.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/__pycache__/utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/__pycache__/utils.cpython-312.pyc deleted file mode 100644 index 63892bfb..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/__pycache__/utils.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index eeeef84c..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/__pycache__/_oid.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/__pycache__/_oid.cpython-312.pyc deleted file mode 100644 index 9f72801a..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/__pycache__/_oid.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/backends/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/backends/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 83bd5c90..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/backends/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/backends/openssl/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/backends/openssl/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 8eb410c1..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/backends/openssl/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/backends/openssl/__pycache__/backend.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/backends/openssl/__pycache__/backend.cpython-312.pyc deleted file mode 100644 index b161a284..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/backends/openssl/__pycache__/backend.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/bindings/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/bindings/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index c9625a28..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/bindings/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/bindings/openssl/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/bindings/openssl/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index ae3171a5..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/bindings/openssl/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/bindings/openssl/__pycache__/_conditional.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/bindings/openssl/__pycache__/_conditional.cpython-312.pyc deleted file mode 100644 index fa9efc2d..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/bindings/openssl/__pycache__/_conditional.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/bindings/openssl/__pycache__/binding.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/bindings/openssl/__pycache__/binding.cpython-312.pyc deleted file mode 100644 index df6fc35e..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/bindings/openssl/__pycache__/binding.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/decrepit/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/decrepit/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 37c376df..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/decrepit/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/decrepit/ciphers/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/decrepit/ciphers/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 8d696a25..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/decrepit/ciphers/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/decrepit/ciphers/__pycache__/algorithms.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/decrepit/ciphers/__pycache__/algorithms.cpython-312.pyc deleted file mode 100644 index f7acfa3f..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/decrepit/ciphers/__pycache__/algorithms.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 7ac68e70..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/_asymmetric.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/_asymmetric.cpython-312.pyc deleted file mode 100644 index 153678cd..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/_asymmetric.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/_cipheralgorithm.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/_cipheralgorithm.cpython-312.pyc deleted file mode 100644 index 90962e3e..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/_cipheralgorithm.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/_serialization.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/_serialization.cpython-312.pyc deleted file mode 100644 index df3e3291..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/_serialization.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/constant_time.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/constant_time.cpython-312.pyc deleted file mode 100644 index 66895bec..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/constant_time.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/hashes.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/hashes.cpython-312.pyc deleted file mode 100644 index aeb00d1f..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/hashes.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/hmac.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/hmac.cpython-312.pyc deleted file mode 100644 index 9dd7f6f9..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/hmac.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/keywrap.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/keywrap.cpython-312.pyc deleted file mode 100644 index 1d4218f3..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/keywrap.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/padding.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/padding.cpython-312.pyc deleted file mode 100644 index 3e1651aa..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/padding.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 44f0728e..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/dh.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/dh.cpython-312.pyc deleted file mode 100644 index 1d851a77..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/dh.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/dsa.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/dsa.cpython-312.pyc deleted file mode 100644 index dc11d5e2..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/dsa.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/ec.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/ec.cpython-312.pyc deleted file mode 100644 index 1964efe7..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/ec.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/ed25519.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/ed25519.cpython-312.pyc deleted file mode 100644 index ba9ce528..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/ed25519.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/ed448.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/ed448.cpython-312.pyc deleted file mode 100644 index a103a52a..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/ed448.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/padding.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/padding.cpython-312.pyc deleted file mode 100644 index b501c3e2..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/padding.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/rsa.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/rsa.cpython-312.pyc deleted file mode 100644 index dab05009..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/rsa.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/types.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/types.cpython-312.pyc deleted file mode 100644 index 0c796aa9..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/types.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/utils.cpython-312.pyc deleted file mode 100644 index 0d96b94f..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/utils.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/x25519.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/x25519.cpython-312.pyc deleted file mode 100644 index 5b850d8a..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/x25519.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/x448.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/x448.cpython-312.pyc deleted file mode 100644 index 33bdc8b1..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/x448.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/ciphers/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/ciphers/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 992f920c..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/ciphers/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/ciphers/__pycache__/aead.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/ciphers/__pycache__/aead.cpython-312.pyc deleted file mode 100644 index 53165ff9..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/ciphers/__pycache__/aead.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/ciphers/__pycache__/algorithms.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/ciphers/__pycache__/algorithms.cpython-312.pyc deleted file mode 100644 index e436fc03..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/ciphers/__pycache__/algorithms.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/ciphers/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/ciphers/__pycache__/base.cpython-312.pyc deleted file mode 100644 index e4becf1a..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/ciphers/__pycache__/base.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/ciphers/__pycache__/modes.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/ciphers/__pycache__/modes.cpython-312.pyc deleted file mode 100644 index 12385c72..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/ciphers/__pycache__/modes.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/kdf/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/kdf/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index bc3daee1..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/kdf/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/kdf/__pycache__/pbkdf2.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/kdf/__pycache__/pbkdf2.cpython-312.pyc deleted file mode 100644 index 016a0c6a..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/kdf/__pycache__/pbkdf2.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/serialization/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/serialization/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index c8f443ef..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/serialization/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/serialization/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/serialization/__pycache__/base.cpython-312.pyc deleted file mode 100644 index c5c34993..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/serialization/__pycache__/base.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/serialization/__pycache__/ssh.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/serialization/__pycache__/ssh.cpython-312.pyc deleted file mode 100644 index 7c0a70f2..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/serialization/__pycache__/ssh.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 3c9f74e5..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/base.cpython-312.pyc deleted file mode 100644 index 36245790..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/base.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/certificate_transparency.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/certificate_transparency.cpython-312.pyc deleted file mode 100644 index 37327060..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/certificate_transparency.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/extensions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/extensions.cpython-312.pyc deleted file mode 100644 index 4550b459..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/extensions.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/general_name.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/general_name.cpython-312.pyc deleted file mode 100644 index 0fd09543..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/general_name.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/name.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/name.cpython-312.pyc deleted file mode 100644 index 1d5cf10c..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/name.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/oid.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/oid.cpython-312.pyc deleted file mode 100644 index 02678a99..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/oid.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/verification.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/verification.cpython-312.pyc deleted file mode 100644 index 5099e2da..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/verification.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/deprecated/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/deprecated/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 26a6ae0f..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/deprecated/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/deprecated/__pycache__/classic.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/deprecated/__pycache__/classic.cpython-312.pyc deleted file mode 100644 index b7b805fa..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/deprecated/__pycache__/classic.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/deprecated/__pycache__/params.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/deprecated/__pycache__/params.cpython-312.pyc deleted file mode 100644 index 126f5085..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/deprecated/__pycache__/params.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/deprecated/__pycache__/sphinx.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/deprecated/__pycache__/sphinx.cpython-312.pyc deleted file mode 100644 index 7b1edb63..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/deprecated/__pycache__/sphinx.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/dotenv/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/dotenv/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 9b08bf6d..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/dotenv/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/dotenv/__pycache__/main.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/dotenv/__pycache__/main.cpython-312.pyc deleted file mode 100644 index 2cff7149..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/dotenv/__pycache__/main.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/dotenv/__pycache__/parser.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/dotenv/__pycache__/parser.cpython-312.pyc deleted file mode 100644 index 2bfa8953..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/dotenv/__pycache__/parser.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/dotenv/__pycache__/variables.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/dotenv/__pycache__/variables.cpython-312.pyc deleted file mode 100644 index 9b35ef07..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/dotenv/__pycache__/variables.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/email_validator/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/email_validator/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index af16bf04..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/email_validator/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/email_validator/__pycache__/exceptions_types.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/email_validator/__pycache__/exceptions_types.cpython-312.pyc deleted file mode 100644 index 0123bf13..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/email_validator/__pycache__/exceptions_types.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/email_validator/__pycache__/rfc_constants.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/email_validator/__pycache__/rfc_constants.cpython-312.pyc deleted file mode 100644 index afdef37f..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/email_validator/__pycache__/rfc_constants.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/email_validator/__pycache__/syntax.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/email_validator/__pycache__/syntax.cpython-312.pyc deleted file mode 100644 index ca955e87..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/email_validator/__pycache__/syntax.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/email_validator/__pycache__/validate_email.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/email_validator/__pycache__/validate_email.cpython-312.pyc deleted file mode 100644 index 942703cc..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/email_validator/__pycache__/validate_email.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/email_validator/__pycache__/version.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/email_validator/__pycache__/version.cpython-312.pyc deleted file mode 100644 index 35fbde4e..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/email_validator/__pycache__/version.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 19ac2e58..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/_compat.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/_compat.cpython-312.pyc deleted file mode 100644 index 13e79d4e..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/_compat.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/applications.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/applications.cpython-312.pyc deleted file mode 100644 index 6d4fdfc1..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/applications.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/background.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/background.cpython-312.pyc deleted file mode 100644 index b710ff06..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/background.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/concurrency.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/concurrency.cpython-312.pyc deleted file mode 100644 index 2c35c6ee..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/concurrency.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/datastructures.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/datastructures.cpython-312.pyc deleted file mode 100644 index 63d2983c..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/datastructures.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/encoders.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/encoders.cpython-312.pyc deleted file mode 100644 index 11d3c69d..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/encoders.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/exception_handlers.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/exception_handlers.cpython-312.pyc deleted file mode 100644 index 7d9f1aa7..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/exception_handlers.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/exceptions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/exceptions.cpython-312.pyc deleted file mode 100644 index c5b8da0f..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/exceptions.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/logger.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/logger.cpython-312.pyc deleted file mode 100644 index 34e63c54..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/logger.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/param_functions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/param_functions.cpython-312.pyc deleted file mode 100644 index b07cb7e3..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/param_functions.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/params.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/params.cpython-312.pyc deleted file mode 100644 index 359df0f5..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/params.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/requests.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/requests.cpython-312.pyc deleted file mode 100644 index 466fd711..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/requests.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/responses.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/responses.cpython-312.pyc deleted file mode 100644 index 2a713d92..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/responses.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/routing.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/routing.cpython-312.pyc deleted file mode 100644 index 1f04aa5b..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/routing.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/staticfiles.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/staticfiles.cpython-312.pyc deleted file mode 100644 index 04e32a53..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/staticfiles.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/types.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/types.cpython-312.pyc deleted file mode 100644 index 1d3e0233..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/types.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/utils.cpython-312.pyc deleted file mode 100644 index 52a8a04c..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/utils.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/websockets.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/websockets.cpython-312.pyc deleted file mode 100644 index 58b11da6..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/websockets.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/dependencies/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/dependencies/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index bc104ef2..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/fastapi/dependencies/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/dependencies/__pycache__/models.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/dependencies/__pycache__/models.cpython-312.pyc deleted file mode 100644 index 3fcb7987..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/fastapi/dependencies/__pycache__/models.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/dependencies/__pycache__/utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/dependencies/__pycache__/utils.cpython-312.pyc deleted file mode 100644 index 6e113790..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/fastapi/dependencies/__pycache__/utils.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/middleware/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/middleware/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index a71e4fa0..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/fastapi/middleware/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/middleware/__pycache__/asyncexitstack.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/middleware/__pycache__/asyncexitstack.cpython-312.pyc deleted file mode 100644 index 3e8a80f8..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/fastapi/middleware/__pycache__/asyncexitstack.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/middleware/__pycache__/cors.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/middleware/__pycache__/cors.cpython-312.pyc deleted file mode 100644 index a0e03f94..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/fastapi/middleware/__pycache__/cors.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/openapi/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/openapi/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 82fee2c4..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/fastapi/openapi/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/openapi/__pycache__/constants.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/openapi/__pycache__/constants.cpython-312.pyc deleted file mode 100644 index 5d18a877..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/fastapi/openapi/__pycache__/constants.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/openapi/__pycache__/docs.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/openapi/__pycache__/docs.cpython-312.pyc deleted file mode 100644 index ae5473b2..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/fastapi/openapi/__pycache__/docs.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/openapi/__pycache__/models.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/openapi/__pycache__/models.cpython-312.pyc deleted file mode 100644 index f8fc42b3..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/fastapi/openapi/__pycache__/models.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/openapi/__pycache__/utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/openapi/__pycache__/utils.cpython-312.pyc deleted file mode 100644 index 5a614694..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/fastapi/openapi/__pycache__/utils.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 57a09b74..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/api_key.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/api_key.cpython-312.pyc deleted file mode 100644 index f4717924..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/api_key.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/base.cpython-312.pyc deleted file mode 100644 index 484fa801..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/base.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/http.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/http.cpython-312.pyc deleted file mode 100644 index f2c35eb3..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/http.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/oauth2.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/oauth2.cpython-312.pyc deleted file mode 100644 index d6a02e4c..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/oauth2.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/open_id_connect_url.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/open_id_connect_url.cpython-312.pyc deleted file mode 100644 index e8de984c..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/open_id_connect_url.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/utils.cpython-312.pyc deleted file mode 100644 index ba1b8f93..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/utils.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/greenlet/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/greenlet/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 62fab2c1..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/greenlet/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 4a3f03b2..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_abnf.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_abnf.cpython-312.pyc deleted file mode 100644 index 307efa92..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_abnf.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_connection.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_connection.cpython-312.pyc deleted file mode 100644 index 98a0b898..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_connection.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_events.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_events.cpython-312.pyc deleted file mode 100644 index ed8b0b5f..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_events.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_headers.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_headers.cpython-312.pyc deleted file mode 100644 index 9bf9871b..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_headers.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_readers.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_readers.cpython-312.pyc deleted file mode 100644 index 749eb35d..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_readers.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_receivebuffer.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_receivebuffer.cpython-312.pyc deleted file mode 100644 index 212f53a1..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_receivebuffer.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_state.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_state.cpython-312.pyc deleted file mode 100644 index 6e8e60f3..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_state.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_util.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_util.cpython-312.pyc deleted file mode 100644 index 409a1fc9..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_util.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_version.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_version.cpython-312.pyc deleted file mode 100644 index e18a8f40..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_version.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_writers.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_writers.cpython-312.pyc deleted file mode 100644 index f4ca341c..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/h11/__pycache__/_writers.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 41b78124..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpcore/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/__pycache__/_api.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/__pycache__/_api.cpython-312.pyc deleted file mode 100644 index ce707b9e..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpcore/__pycache__/_api.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/__pycache__/_exceptions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/__pycache__/_exceptions.cpython-312.pyc deleted file mode 100644 index 220706e0..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpcore/__pycache__/_exceptions.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/__pycache__/_models.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/__pycache__/_models.cpython-312.pyc deleted file mode 100644 index 5901eeef..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpcore/__pycache__/_models.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/__pycache__/_ssl.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/__pycache__/_ssl.cpython-312.pyc deleted file mode 100644 index 990abe20..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpcore/__pycache__/_ssl.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/__pycache__/_synchronization.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/__pycache__/_synchronization.cpython-312.pyc deleted file mode 100644 index 344ea370..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpcore/__pycache__/_synchronization.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/__pycache__/_trace.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/__pycache__/_trace.cpython-312.pyc deleted file mode 100644 index 6f287881..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpcore/__pycache__/_trace.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/__pycache__/_utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/__pycache__/_utils.cpython-312.pyc deleted file mode 100644 index fb5150d8..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpcore/__pycache__/_utils.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 56197452..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/connection.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/connection.cpython-312.pyc deleted file mode 100644 index ea6d8c90..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/connection.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/connection_pool.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/connection_pool.cpython-312.pyc deleted file mode 100644 index cf79b745..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/connection_pool.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/http11.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/http11.cpython-312.pyc deleted file mode 100644 index fcee7ab6..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/http11.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/http2.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/http2.cpython-312.pyc deleted file mode 100644 index 930bd1f1..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/http2.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/http_proxy.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/http_proxy.cpython-312.pyc deleted file mode 100644 index b11a20c1..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/http_proxy.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/interfaces.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/interfaces.cpython-312.pyc deleted file mode 100644 index d508b399..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/interfaces.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/socks_proxy.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/socks_proxy.cpython-312.pyc deleted file mode 100644 index 93ab0b1f..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpcore/_async/__pycache__/socks_proxy.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index ee995e85..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/anyio.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/anyio.cpython-312.pyc deleted file mode 100644 index 4049a7f8..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/anyio.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/auto.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/auto.cpython-312.pyc deleted file mode 100644 index bfdc76a6..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/auto.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/base.cpython-312.pyc deleted file mode 100644 index 2565cc96..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/base.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/mock.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/mock.cpython-312.pyc deleted file mode 100644 index cd0d7e03..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/mock.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/sync.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/sync.cpython-312.pyc deleted file mode 100644 index e45951f4..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/sync.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/trio.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/trio.cpython-312.pyc deleted file mode 100644 index 3f42306a..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpcore/_backends/__pycache__/trio.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index fffafcf0..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/connection.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/connection.cpython-312.pyc deleted file mode 100644 index 329122ab..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/connection.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/connection_pool.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/connection_pool.cpython-312.pyc deleted file mode 100644 index 0e8a0d66..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/connection_pool.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/http11.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/http11.cpython-312.pyc deleted file mode 100644 index 9acdf160..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/http11.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/http2.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/http2.cpython-312.pyc deleted file mode 100644 index 6d4f6b2c..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/http2.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/http_proxy.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/http_proxy.cpython-312.pyc deleted file mode 100644 index aa311cd9..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/http_proxy.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/interfaces.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/interfaces.cpython-312.pyc deleted file mode 100644 index 77621796..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/interfaces.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/socks_proxy.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/socks_proxy.cpython-312.pyc deleted file mode 100644 index 2099f52e..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpcore/_sync/__pycache__/socks_proxy.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httptools/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httptools/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 0c473e8b..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httptools/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httptools/__pycache__/_version.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httptools/__pycache__/_version.cpython-312.pyc deleted file mode 100644 index 959fc73e..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httptools/__pycache__/_version.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httptools/parser/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httptools/parser/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 4e93220d..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httptools/parser/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httptools/parser/__pycache__/errors.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httptools/parser/__pycache__/errors.cpython-312.pyc deleted file mode 100644 index b5a73483..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httptools/parser/__pycache__/errors.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httptools/parser/__pycache__/protocol.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httptools/parser/__pycache__/protocol.cpython-312.pyc deleted file mode 100644 index 0070ee07..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httptools/parser/__pycache__/protocol.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 454f0557..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/__version__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/__version__.cpython-312.pyc deleted file mode 100644 index b717cd0b..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/__version__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_api.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_api.cpython-312.pyc deleted file mode 100644 index 91bae824..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_api.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_auth.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_auth.cpython-312.pyc deleted file mode 100644 index 3f507523..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_auth.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_client.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_client.cpython-312.pyc deleted file mode 100644 index 400ed724..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_client.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_compat.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_compat.cpython-312.pyc deleted file mode 100644 index 966e3642..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_compat.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_config.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_config.cpython-312.pyc deleted file mode 100644 index e06c2acc..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_config.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_content.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_content.cpython-312.pyc deleted file mode 100644 index ecab8a8e..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_content.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_decoders.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_decoders.cpython-312.pyc deleted file mode 100644 index ddaf8525..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_decoders.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_exceptions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_exceptions.cpython-312.pyc deleted file mode 100644 index dfb3bba5..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_exceptions.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_main.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_main.cpython-312.pyc deleted file mode 100644 index 8c680bd7..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_main.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_models.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_models.cpython-312.pyc deleted file mode 100644 index 81671264..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_models.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_multipart.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_multipart.cpython-312.pyc deleted file mode 100644 index 041ef623..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_multipart.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_status_codes.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_status_codes.cpython-312.pyc deleted file mode 100644 index c44b8e1c..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_status_codes.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_types.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_types.cpython-312.pyc deleted file mode 100644 index daf260cf..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_types.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_urlparse.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_urlparse.cpython-312.pyc deleted file mode 100644 index cb204d7b..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_urlparse.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_urls.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_urls.cpython-312.pyc deleted file mode 100644 index e8fbd3ae..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_urls.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_utils.cpython-312.pyc deleted file mode 100644 index cf73fa9b..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_utils.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 96bc2572..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/asgi.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/asgi.cpython-312.pyc deleted file mode 100644 index 238c5210..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/asgi.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/base.cpython-312.pyc deleted file mode 100644 index b75c754f..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/base.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/default.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/default.cpython-312.pyc deleted file mode 100644 index 8adc1681..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/default.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/mock.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/mock.cpython-312.pyc deleted file mode 100644 index 0955bd5b..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/mock.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/wsgi.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/wsgi.cpython-312.pyc deleted file mode 100644 index ef9bba39..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/wsgi.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/idna/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/idna/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index f523ba29..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/idna/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/idna/__pycache__/core.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/idna/__pycache__/core.cpython-312.pyc deleted file mode 100644 index f4e16082..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/idna/__pycache__/core.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/idna/__pycache__/idnadata.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/idna/__pycache__/idnadata.cpython-312.pyc deleted file mode 100644 index c8117e60..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/idna/__pycache__/idnadata.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/idna/__pycache__/intranges.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/idna/__pycache__/intranges.cpython-312.pyc deleted file mode 100644 index 478f0049..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/idna/__pycache__/intranges.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/idna/__pycache__/package_data.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/idna/__pycache__/package_data.cpython-312.pyc deleted file mode 100644 index 6feaa5dc..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/idna/__pycache__/package_data.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/idna/__pycache__/uts46data.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/idna/__pycache__/uts46data.cpython-312.pyc deleted file mode 100644 index 5bf6b566..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/idna/__pycache__/uts46data.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 16bfc9e1..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/constants.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/constants.cpython-312.pyc deleted file mode 100644 index ad5045fa..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/constants.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/exceptions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/exceptions.cpython-312.pyc deleted file mode 100644 index 0e3d48e1..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/exceptions.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/jwk.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/jwk.cpython-312.pyc deleted file mode 100644 index 8ab87d7d..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/jwk.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/jws.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/jws.cpython-312.pyc deleted file mode 100644 index 6107b9af..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/jws.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/jwt.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/jwt.cpython-312.pyc deleted file mode 100644 index eb8e6313..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/jwt.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/utils.cpython-312.pyc deleted file mode 100644 index e38b8d48..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/utils.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/jose/backends/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/jose/backends/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 3cfeb32b..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/jose/backends/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/jose/backends/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/jose/backends/__pycache__/base.cpython-312.pyc deleted file mode 100644 index fb53262f..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/jose/backends/__pycache__/base.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/jose/backends/__pycache__/cryptography_backend.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/jose/backends/__pycache__/cryptography_backend.cpython-312.pyc deleted file mode 100644 index a787e178..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/jose/backends/__pycache__/cryptography_backend.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index d158c236..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/limits/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/__pycache__/_version.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/__pycache__/_version.cpython-312.pyc deleted file mode 100644 index 3c7e458b..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/limits/__pycache__/_version.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/__pycache__/errors.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/__pycache__/errors.cpython-312.pyc deleted file mode 100644 index b8670cbd..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/limits/__pycache__/errors.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/__pycache__/limits.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/__pycache__/limits.cpython-312.pyc deleted file mode 100644 index 2f6fa1a3..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/limits/__pycache__/limits.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/__pycache__/strategies.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/__pycache__/strategies.cpython-312.pyc deleted file mode 100644 index 5066e3b1..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/limits/__pycache__/strategies.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/__pycache__/typing.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/__pycache__/typing.cpython-312.pyc deleted file mode 100644 index 4aa0ee7f..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/limits/__pycache__/typing.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/__pycache__/util.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/__pycache__/util.cpython-312.pyc deleted file mode 100644 index 551e0cc1..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/limits/__pycache__/util.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/aio/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/aio/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 7439a880..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/limits/aio/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/aio/__pycache__/strategies.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/aio/__pycache__/strategies.cpython-312.pyc deleted file mode 100644 index 291ae1d8..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/limits/aio/__pycache__/strategies.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 12ff1e6c..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/__pycache__/base.cpython-312.pyc deleted file mode 100644 index 1265a57b..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/__pycache__/base.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/__pycache__/memory.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/__pycache__/memory.cpython-312.pyc deleted file mode 100644 index 1718b1a8..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/__pycache__/memory.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/__pycache__/mongodb.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/__pycache__/mongodb.cpython-312.pyc deleted file mode 100644 index c3686161..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/__pycache__/mongodb.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/memcached/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/memcached/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 457e9756..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/memcached/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/memcached/__pycache__/bridge.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/memcached/__pycache__/bridge.cpython-312.pyc deleted file mode 100644 index 0f5881cc..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/memcached/__pycache__/bridge.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/memcached/__pycache__/emcache.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/memcached/__pycache__/emcache.cpython-312.pyc deleted file mode 100644 index 94a01907..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/memcached/__pycache__/emcache.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/memcached/__pycache__/memcachio.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/memcached/__pycache__/memcachio.cpython-312.pyc deleted file mode 100644 index c5402471..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/memcached/__pycache__/memcachio.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/redis/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/redis/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 2886cb1a..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/redis/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/redis/__pycache__/bridge.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/redis/__pycache__/bridge.cpython-312.pyc deleted file mode 100644 index d5ef1989..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/redis/__pycache__/bridge.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/redis/__pycache__/coredis.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/redis/__pycache__/coredis.cpython-312.pyc deleted file mode 100644 index 9a27f2ce..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/redis/__pycache__/coredis.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/redis/__pycache__/redispy.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/redis/__pycache__/redispy.cpython-312.pyc deleted file mode 100644 index c3f7c8fa..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/redis/__pycache__/redispy.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/redis/__pycache__/valkey.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/redis/__pycache__/valkey.cpython-312.pyc deleted file mode 100644 index e42a1849..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/redis/__pycache__/valkey.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index bfafbbcd..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/base.cpython-312.pyc deleted file mode 100644 index 9263b63e..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/base.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/memcached.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/memcached.cpython-312.pyc deleted file mode 100644 index 055306ae..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/memcached.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/memory.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/memory.cpython-312.pyc deleted file mode 100644 index c0ce8d03..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/memory.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/mongodb.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/mongodb.cpython-312.pyc deleted file mode 100644 index 092b5ff7..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/mongodb.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/redis.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/redis.cpython-312.pyc deleted file mode 100644 index f88d5291..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/redis.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/redis_cluster.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/redis_cluster.cpython-312.pyc deleted file mode 100644 index 91830365..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/redis_cluster.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/redis_sentinel.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/redis_sentinel.cpython-312.pyc deleted file mode 100644 index 4d85e846..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/redis_sentinel.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/registry.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/registry.cpython-312.pyc deleted file mode 100644 index a0410de4..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/registry.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/mako/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/mako/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 43e14cb8..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/mako/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/mako/__pycache__/_ast_util.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/mako/__pycache__/_ast_util.cpython-312.pyc deleted file mode 100644 index 4e720637..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/mako/__pycache__/_ast_util.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/mako/__pycache__/ast.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/mako/__pycache__/ast.cpython-312.pyc deleted file mode 100644 index 34dfe8f8..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/mako/__pycache__/ast.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/mako/__pycache__/cache.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/mako/__pycache__/cache.cpython-312.pyc deleted file mode 100644 index 01b753a0..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/mako/__pycache__/cache.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/mako/__pycache__/codegen.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/mako/__pycache__/codegen.cpython-312.pyc deleted file mode 100644 index 3b937af5..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/mako/__pycache__/codegen.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/mako/__pycache__/compat.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/mako/__pycache__/compat.cpython-312.pyc deleted file mode 100644 index b74742c2..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/mako/__pycache__/compat.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/mako/__pycache__/exceptions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/mako/__pycache__/exceptions.cpython-312.pyc deleted file mode 100644 index 173bd8aa..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/mako/__pycache__/exceptions.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/mako/__pycache__/filters.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/mako/__pycache__/filters.cpython-312.pyc deleted file mode 100644 index 3cbab225..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/mako/__pycache__/filters.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/mako/__pycache__/lexer.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/mako/__pycache__/lexer.cpython-312.pyc deleted file mode 100644 index 27562941..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/mako/__pycache__/lexer.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/mako/__pycache__/parsetree.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/mako/__pycache__/parsetree.cpython-312.pyc deleted file mode 100644 index d474b5d4..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/mako/__pycache__/parsetree.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/mako/__pycache__/pygen.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/mako/__pycache__/pygen.cpython-312.pyc deleted file mode 100644 index 9f3e9ff3..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/mako/__pycache__/pygen.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/mako/__pycache__/pyparser.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/mako/__pycache__/pyparser.cpython-312.pyc deleted file mode 100644 index 7de206c1..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/mako/__pycache__/pyparser.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/mako/__pycache__/runtime.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/mako/__pycache__/runtime.cpython-312.pyc deleted file mode 100644 index 260e76ff..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/mako/__pycache__/runtime.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/mako/__pycache__/template.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/mako/__pycache__/template.cpython-312.pyc deleted file mode 100644 index ded10a55..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/mako/__pycache__/template.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/mako/__pycache__/util.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/mako/__pycache__/util.cpython-312.pyc deleted file mode 100644 index 55d898e0..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/mako/__pycache__/util.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/mako/ext/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/mako/ext/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index fcb82f06..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/mako/ext/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/mako/ext/__pycache__/pygmentplugin.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/mako/ext/__pycache__/pygmentplugin.cpython-312.pyc deleted file mode 100644 index 91daa811..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/mako/ext/__pycache__/pygmentplugin.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/markupsafe/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/markupsafe/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index f16873a9..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/markupsafe/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/multipart/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/multipart/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 9211fa05..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/multipart/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/multipart/__pycache__/decoders.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/multipart/__pycache__/decoders.cpython-312.pyc deleted file mode 100644 index 42c5b9ac..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/multipart/__pycache__/decoders.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/multipart/__pycache__/exceptions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/multipart/__pycache__/exceptions.cpython-312.pyc deleted file mode 100644 index 2607d2b3..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/multipart/__pycache__/exceptions.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/multipart/__pycache__/multipart.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/multipart/__pycache__/multipart.cpython-312.pyc deleted file mode 100644 index e87f3c65..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/multipart/__pycache__/multipart.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/packaging/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/packaging/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 4a1a5c10..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/packaging/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/packaging/__pycache__/_structures.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/packaging/__pycache__/_structures.cpython-312.pyc deleted file mode 100644 index 4aa32fe4..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/packaging/__pycache__/_structures.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/packaging/__pycache__/version.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/packaging/__pycache__/version.cpython-312.pyc deleted file mode 100644 index eff75247..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/packaging/__pycache__/version.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 2bed8584..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/__pycache__/config.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/__pycache__/config.cpython-312.pyc deleted file mode 100644 index 388fc07a..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/__pycache__/config.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index b4671938..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/access_token.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/access_token.cpython-312.pyc deleted file mode 100644 index 899516db..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/access_token.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/access_token_request.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/access_token_request.cpython-312.pyc deleted file mode 100644 index 97882416..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/access_token_request.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/environment.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/environment.cpython-312.pyc deleted file mode 100644 index 35096f48..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/environment.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/paypal_http_client.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/paypal_http_client.cpython-312.pyc deleted file mode 100644 index bb7ec43f..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/paypal_http_client.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/refresh_token_request.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/refresh_token_request.cpython-312.pyc deleted file mode 100644 index c0a43e65..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/refresh_token_request.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/util.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/util.cpython-312.pyc deleted file mode 100644 index 5624dfd5..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/util.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index e332d449..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/orders_authorize_request.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/orders_authorize_request.cpython-312.pyc deleted file mode 100644 index 0e66a296..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/orders_authorize_request.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/orders_capture_request.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/orders_capture_request.cpython-312.pyc deleted file mode 100644 index 5b7e5335..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/orders_capture_request.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/orders_create_request.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/orders_create_request.cpython-312.pyc deleted file mode 100644 index ca2b3c45..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/orders_create_request.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/orders_get_request.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/orders_get_request.cpython-312.pyc deleted file mode 100644 index b86a6c98..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/orders_get_request.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/orders_patch_request.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/orders_patch_request.cpython-312.pyc deleted file mode 100644 index c8bd4c16..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/orders_patch_request.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/orders_validate_request.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/orders_validate_request.cpython-312.pyc deleted file mode 100644 index 01d2654c..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/orders_validate_request.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/payments/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/payments/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index ce6970a5..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/payments/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/payments/__pycache__/authorizations_capture_request.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/payments/__pycache__/authorizations_capture_request.cpython-312.pyc deleted file mode 100644 index b72fbede..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/payments/__pycache__/authorizations_capture_request.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/payments/__pycache__/authorizations_get_request.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/payments/__pycache__/authorizations_get_request.cpython-312.pyc deleted file mode 100644 index 4ba481d4..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/payments/__pycache__/authorizations_get_request.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/payments/__pycache__/authorizations_reauthorize_request.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/payments/__pycache__/authorizations_reauthorize_request.cpython-312.pyc deleted file mode 100644 index a048a05d..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/payments/__pycache__/authorizations_reauthorize_request.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/payments/__pycache__/authorizations_void_request.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/payments/__pycache__/authorizations_void_request.cpython-312.pyc deleted file mode 100644 index 72697a3d..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/payments/__pycache__/authorizations_void_request.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/payments/__pycache__/captures_get_request.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/payments/__pycache__/captures_get_request.cpython-312.pyc deleted file mode 100644 index 97eefb20..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/payments/__pycache__/captures_get_request.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/payments/__pycache__/captures_refund_request.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/payments/__pycache__/captures_refund_request.cpython-312.pyc deleted file mode 100644 index e4aca873..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/payments/__pycache__/captures_refund_request.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/payments/__pycache__/refunds_get_request.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/payments/__pycache__/refunds_get_request.cpython-312.pyc deleted file mode 100644 index 00b3d08c..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/payments/__pycache__/refunds_get_request.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalhttp/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalhttp/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index fbf7e2f9..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/paypalhttp/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalhttp/__pycache__/encoder.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalhttp/__pycache__/encoder.cpython-312.pyc deleted file mode 100644 index 1cbf073f..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/paypalhttp/__pycache__/encoder.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalhttp/__pycache__/environment.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalhttp/__pycache__/environment.cpython-312.pyc deleted file mode 100644 index d4d6e52c..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/paypalhttp/__pycache__/environment.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalhttp/__pycache__/file.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalhttp/__pycache__/file.cpython-312.pyc deleted file mode 100644 index 1987e356..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/paypalhttp/__pycache__/file.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalhttp/__pycache__/http_client.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalhttp/__pycache__/http_client.cpython-312.pyc deleted file mode 100644 index 9a2fc64f..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/paypalhttp/__pycache__/http_client.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalhttp/__pycache__/http_error.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalhttp/__pycache__/http_error.cpython-312.pyc deleted file mode 100644 index acf7955f..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/paypalhttp/__pycache__/http_error.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalhttp/__pycache__/http_response.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalhttp/__pycache__/http_response.cpython-312.pyc deleted file mode 100644 index 28a37638..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/paypalhttp/__pycache__/http_response.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalhttp/serializers/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalhttp/serializers/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index ee95ea3a..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/paypalhttp/serializers/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalhttp/serializers/__pycache__/form_encoded_serializer.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalhttp/serializers/__pycache__/form_encoded_serializer.cpython-312.pyc deleted file mode 100644 index 22e9be5c..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/paypalhttp/serializers/__pycache__/form_encoded_serializer.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalhttp/serializers/__pycache__/form_part.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalhttp/serializers/__pycache__/form_part.cpython-312.pyc deleted file mode 100644 index e3d0c95e..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/paypalhttp/serializers/__pycache__/form_part.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalhttp/serializers/__pycache__/json_serializer.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalhttp/serializers/__pycache__/json_serializer.cpython-312.pyc deleted file mode 100644 index a4865d6a..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/paypalhttp/serializers/__pycache__/json_serializer.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalhttp/serializers/__pycache__/multipart_serializer.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalhttp/serializers/__pycache__/multipart_serializer.cpython-312.pyc deleted file mode 100644 index e618d745..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/paypalhttp/serializers/__pycache__/multipart_serializer.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalhttp/serializers/__pycache__/text_serializer.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalhttp/serializers/__pycache__/text_serializer.cpython-312.pyc deleted file mode 100644 index 9a5edaaf..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/paypalhttp/serializers/__pycache__/text_serializer.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index dfc05d82..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/_migration.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/_migration.cpython-312.pyc deleted file mode 100644 index 00615fce..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/_migration.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/annotated_handlers.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/annotated_handlers.cpython-312.pyc deleted file mode 100644 index aa52cd2a..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/annotated_handlers.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/color.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/color.cpython-312.pyc deleted file mode 100644 index c7934843..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/color.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/config.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/config.cpython-312.pyc deleted file mode 100644 index 78b3671a..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/config.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/errors.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/errors.cpython-312.pyc deleted file mode 100644 index 2f0a92b6..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/errors.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/fields.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/fields.cpython-312.pyc deleted file mode 100644 index 18459f94..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/fields.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/functional_validators.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/functional_validators.cpython-312.pyc deleted file mode 100644 index 99005068..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/functional_validators.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/json_schema.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/json_schema.cpython-312.pyc deleted file mode 100644 index dc363b0b..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/json_schema.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/main.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/main.cpython-312.pyc deleted file mode 100644 index 0bebced4..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/main.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/networks.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/networks.cpython-312.pyc deleted file mode 100644 index 9fd83441..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/networks.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/type_adapter.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/type_adapter.cpython-312.pyc deleted file mode 100644 index 4366cfbc..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/type_adapter.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/types.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/types.cpython-312.pyc deleted file mode 100644 index 318815df..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/types.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/version.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/version.cpython-312.pyc deleted file mode 100644 index c5b2eb7c..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/version.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/warnings.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/warnings.cpython-312.pyc deleted file mode 100644 index 3367d579..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/warnings.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 6ea746e6..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_config.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_config.cpython-312.pyc deleted file mode 100644 index 4a294e3c..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_config.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_core_metadata.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_core_metadata.cpython-312.pyc deleted file mode 100644 index b4778199..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_core_metadata.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_core_utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_core_utils.cpython-312.pyc deleted file mode 100644 index e9df91fd..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_core_utils.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_decorators.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_decorators.cpython-312.pyc deleted file mode 100644 index c6cd95ea..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_decorators.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_decorators_v1.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_decorators_v1.cpython-312.pyc deleted file mode 100644 index 891f51c8..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_decorators_v1.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_discriminated_union.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_discriminated_union.cpython-312.pyc deleted file mode 100644 index 7cc5eea4..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_discriminated_union.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_fields.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_fields.cpython-312.pyc deleted file mode 100644 index 1ea2c7b2..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_fields.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_forward_ref.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_forward_ref.cpython-312.pyc deleted file mode 100644 index 5cee4736..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_forward_ref.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_generate_schema.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_generate_schema.cpython-312.pyc deleted file mode 100644 index cbc14573..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_generate_schema.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_generics.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_generics.cpython-312.pyc deleted file mode 100644 index 0414e887..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_generics.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_internal_dataclass.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_internal_dataclass.cpython-312.pyc deleted file mode 100644 index e1e422d8..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_internal_dataclass.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_known_annotated_metadata.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_known_annotated_metadata.cpython-312.pyc deleted file mode 100644 index 44780604..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_known_annotated_metadata.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_mock_val_ser.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_mock_val_ser.cpython-312.pyc deleted file mode 100644 index e949844e..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_mock_val_ser.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_model_construction.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_model_construction.cpython-312.pyc deleted file mode 100644 index 7af1d8cb..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_model_construction.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_repr.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_repr.cpython-312.pyc deleted file mode 100644 index edd03c7d..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_repr.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_schema_generation_shared.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_schema_generation_shared.cpython-312.pyc deleted file mode 100644 index 68a0639a..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_schema_generation_shared.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_std_types_schema.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_std_types_schema.cpython-312.pyc deleted file mode 100644 index 5a0e4080..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_std_types_schema.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_typing_extra.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_typing_extra.cpython-312.pyc deleted file mode 100644 index 09ba755d..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_typing_extra.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_utils.cpython-312.pyc deleted file mode 100644 index 62466e23..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_utils.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_validate_call.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_validate_call.cpython-312.pyc deleted file mode 100644 index 65ad5c33..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_validate_call.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_validators.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_validators.cpython-312.pyc deleted file mode 100644 index cc924761..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_validators.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/deprecated/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/deprecated/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index c466859a..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pydantic/deprecated/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/deprecated/__pycache__/class_validators.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/deprecated/__pycache__/class_validators.cpython-312.pyc deleted file mode 100644 index b6b8c0e8..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pydantic/deprecated/__pycache__/class_validators.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/plugin/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/plugin/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 3ce8c689..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pydantic/plugin/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/plugin/__pycache__/_loader.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/plugin/__pycache__/_loader.cpython-312.pyc deleted file mode 100644 index 77b54323..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pydantic/plugin/__pycache__/_loader.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/plugin/__pycache__/_schema_validator.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/plugin/__pycache__/_schema_validator.cpython-312.pyc deleted file mode 100644 index 5dd960d0..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pydantic/plugin/__pycache__/_schema_validator.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic_core/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic_core/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 64d4c09e..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pydantic_core/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic_core/__pycache__/core_schema.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic_core/__pycache__/core_schema.cpython-312.pyc deleted file mode 100644 index 4c39def5..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pydantic_core/__pycache__/core_schema.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic_settings/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic_settings/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 0a78465f..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pydantic_settings/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic_settings/__pycache__/main.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic_settings/__pycache__/main.cpython-312.pyc deleted file mode 100644 index 87d11f37..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pydantic_settings/__pycache__/main.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic_settings/__pycache__/sources.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic_settings/__pycache__/sources.cpython-312.pyc deleted file mode 100644 index c714ac41..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pydantic_settings/__pycache__/sources.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic_settings/__pycache__/utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic_settings/__pycache__/utils.cpython-312.pyc deleted file mode 100644 index 96c7c71a..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pydantic_settings/__pycache__/utils.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic_settings/__pycache__/version.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic_settings/__pycache__/version.cpython-312.pyc deleted file mode 100644 index c081c9d0..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pydantic_settings/__pycache__/version.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pygments/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pygments/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index acda9a50..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pygments/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pygments/__pycache__/filter.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pygments/__pycache__/filter.cpython-312.pyc deleted file mode 100644 index 99ea4bea..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pygments/__pycache__/filter.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pygments/__pycache__/formatter.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pygments/__pycache__/formatter.cpython-312.pyc deleted file mode 100644 index 36a6b748..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pygments/__pycache__/formatter.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pygments/__pycache__/lexer.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pygments/__pycache__/lexer.cpython-312.pyc deleted file mode 100644 index 7c3fbdb1..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pygments/__pycache__/lexer.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pygments/__pycache__/modeline.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pygments/__pycache__/modeline.cpython-312.pyc deleted file mode 100644 index 80b50db4..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pygments/__pycache__/modeline.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pygments/__pycache__/plugin.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pygments/__pycache__/plugin.cpython-312.pyc deleted file mode 100644 index 95c3ef5c..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pygments/__pycache__/plugin.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pygments/__pycache__/regexopt.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pygments/__pycache__/regexopt.cpython-312.pyc deleted file mode 100644 index fea4616e..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pygments/__pycache__/regexopt.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pygments/__pycache__/style.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pygments/__pycache__/style.cpython-312.pyc deleted file mode 100644 index 3a25edb0..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pygments/__pycache__/style.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pygments/__pycache__/token.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pygments/__pycache__/token.cpython-312.pyc deleted file mode 100644 index 50b426df..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pygments/__pycache__/token.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pygments/__pycache__/unistring.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pygments/__pycache__/unistring.cpython-312.pyc deleted file mode 100644 index ffada4ac..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pygments/__pycache__/unistring.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pygments/__pycache__/util.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pygments/__pycache__/util.cpython-312.pyc deleted file mode 100644 index 85a5e80b..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pygments/__pycache__/util.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pygments/filters/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pygments/filters/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 61cbd188..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pygments/filters/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pygments/formatters/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pygments/formatters/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 50178757..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pygments/formatters/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pygments/formatters/__pycache__/_mapping.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pygments/formatters/__pycache__/_mapping.cpython-312.pyc deleted file mode 100644 index ef792eb3..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pygments/formatters/__pycache__/_mapping.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pygments/formatters/__pycache__/html.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pygments/formatters/__pycache__/html.cpython-312.pyc deleted file mode 100644 index 71d6d7b0..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pygments/formatters/__pycache__/html.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 2b5c0226..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_css_builtins.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_css_builtins.cpython-312.pyc deleted file mode 100644 index cb64f89e..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_css_builtins.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_lua_builtins.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_lua_builtins.cpython-312.pyc deleted file mode 100644 index 6c188465..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_lua_builtins.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_mapping.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_mapping.cpython-312.pyc deleted file mode 100644 index 676f2cb1..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_mapping.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_scheme_builtins.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_scheme_builtins.cpython-312.pyc deleted file mode 100644 index ef37291a..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_scheme_builtins.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/actionscript.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/actionscript.cpython-312.pyc deleted file mode 100644 index b93e2d37..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/actionscript.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/agile.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/agile.cpython-312.pyc deleted file mode 100644 index 72ff9e8a..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/agile.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/css.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/css.cpython-312.pyc deleted file mode 100644 index ba547685..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/css.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/d.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/d.cpython-312.pyc deleted file mode 100644 index 886e0b97..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/d.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/data.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/data.cpython-312.pyc deleted file mode 100644 index 8033c4f2..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/data.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/factor.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/factor.cpython-312.pyc deleted file mode 100644 index 3a97f1d3..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/factor.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/html.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/html.cpython-312.pyc deleted file mode 100644 index 24bceb50..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/html.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/iolang.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/iolang.cpython-312.pyc deleted file mode 100644 index 197dcb3e..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/iolang.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/javascript.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/javascript.cpython-312.pyc deleted file mode 100644 index 266a0acf..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/javascript.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/jvm.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/jvm.cpython-312.pyc deleted file mode 100644 index 9ad238ac..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/jvm.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/lisp.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/lisp.cpython-312.pyc deleted file mode 100644 index 243cf40a..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/lisp.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/perl.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/perl.cpython-312.pyc deleted file mode 100644 index bd73b9e0..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/perl.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/php.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/php.cpython-312.pyc deleted file mode 100644 index 782b947e..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/php.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/python.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/python.cpython-312.pyc deleted file mode 100644 index 427a9c93..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/python.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/ruby.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/ruby.cpython-312.pyc deleted file mode 100644 index 9da7d592..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/ruby.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/scripting.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/scripting.cpython-312.pyc deleted file mode 100644 index 34a8dd58..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/scripting.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/tcl.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/tcl.cpython-312.pyc deleted file mode 100644 index 0963bff4..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/tcl.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/web.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/web.cpython-312.pyc deleted file mode 100644 index a735e659..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/web.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/webmisc.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/webmisc.cpython-312.pyc deleted file mode 100644 index f5e4d1f1..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/webmisc.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pygments/styles/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pygments/styles/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 08ab876f..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pygments/styles/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pygments/styles/__pycache__/_mapping.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pygments/styles/__pycache__/_mapping.cpython-312.pyc deleted file mode 100644 index 1e431ae7..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pygments/styles/__pycache__/_mapping.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pygments/styles/__pycache__/default.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pygments/styles/__pycache__/default.cpython-312.pyc deleted file mode 100644 index 2553eea5..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pygments/styles/__pycache__/default.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 765257eb..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/_auth.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/_auth.cpython-312.pyc deleted file mode 100644 index d1bcb5ef..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/_auth.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/charset.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/charset.cpython-312.pyc deleted file mode 100644 index 0b8e034e..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/charset.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/connections.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/connections.cpython-312.pyc deleted file mode 100644 index f34b4726..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/connections.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/converters.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/converters.cpython-312.pyc deleted file mode 100644 index cee875b8..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/converters.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/cursors.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/cursors.cpython-312.pyc deleted file mode 100644 index 403938ba..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/cursors.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/err.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/err.cpython-312.pyc deleted file mode 100644 index 692a0b4d..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/err.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/optionfile.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/optionfile.cpython-312.pyc deleted file mode 100644 index 35ca9cde..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/optionfile.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/protocol.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/protocol.cpython-312.pyc deleted file mode 100644 index edf5de4a..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/protocol.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/times.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/times.cpython-312.pyc deleted file mode 100644 index 4fbdb8d0..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pymysql/__pycache__/times.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pymysql/constants/__pycache__/CLIENT.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pymysql/constants/__pycache__/CLIENT.cpython-312.pyc deleted file mode 100644 index 2350b0d1..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pymysql/constants/__pycache__/CLIENT.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pymysql/constants/__pycache__/COMMAND.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pymysql/constants/__pycache__/COMMAND.cpython-312.pyc deleted file mode 100644 index e8d4c9f5..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pymysql/constants/__pycache__/COMMAND.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pymysql/constants/__pycache__/CR.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pymysql/constants/__pycache__/CR.cpython-312.pyc deleted file mode 100644 index bf7ce678..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pymysql/constants/__pycache__/CR.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pymysql/constants/__pycache__/ER.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pymysql/constants/__pycache__/ER.cpython-312.pyc deleted file mode 100644 index 467c7272..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pymysql/constants/__pycache__/ER.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pymysql/constants/__pycache__/FIELD_TYPE.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pymysql/constants/__pycache__/FIELD_TYPE.cpython-312.pyc deleted file mode 100644 index 1bbeed1e..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pymysql/constants/__pycache__/FIELD_TYPE.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pymysql/constants/__pycache__/SERVER_STATUS.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pymysql/constants/__pycache__/SERVER_STATUS.cpython-312.pyc deleted file mode 100644 index efa1ea8b..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pymysql/constants/__pycache__/SERVER_STATUS.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pymysql/constants/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pymysql/constants/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 4dd23781..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pymysql/constants/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pyotp/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pyotp/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 995dc8ae..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pyotp/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pyotp/__pycache__/compat.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pyotp/__pycache__/compat.cpython-312.pyc deleted file mode 100644 index 525cb088..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pyotp/__pycache__/compat.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pyotp/__pycache__/hotp.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pyotp/__pycache__/hotp.cpython-312.pyc deleted file mode 100644 index 4b9be985..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pyotp/__pycache__/hotp.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pyotp/__pycache__/otp.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pyotp/__pycache__/otp.cpython-312.pyc deleted file mode 100644 index 3345a265..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pyotp/__pycache__/otp.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pyotp/__pycache__/totp.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pyotp/__pycache__/totp.cpython-312.pyc deleted file mode 100644 index a80630f6..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pyotp/__pycache__/totp.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pyotp/__pycache__/utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pyotp/__pycache__/utils.cpython-312.pyc deleted file mode 100644 index 20c5771f..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pyotp/__pycache__/utils.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pyotp/contrib/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pyotp/contrib/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 67a4daac..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pyotp/contrib/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/pyotp/contrib/__pycache__/steam.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pyotp/contrib/__pycache__/steam.cpython-312.pyc deleted file mode 100644 index 3e71e64d..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/pyotp/contrib/__pycache__/steam.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/qrcode/__pycache__/LUT.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/qrcode/__pycache__/LUT.cpython-312.pyc deleted file mode 100644 index 83a218b6..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/qrcode/__pycache__/LUT.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/qrcode/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/qrcode/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index c55d3a3a..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/qrcode/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/qrcode/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/qrcode/__pycache__/base.cpython-312.pyc deleted file mode 100644 index 909ffaaf..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/qrcode/__pycache__/base.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/qrcode/__pycache__/constants.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/qrcode/__pycache__/constants.cpython-312.pyc deleted file mode 100644 index 6a531cb3..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/qrcode/__pycache__/constants.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/qrcode/__pycache__/exceptions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/qrcode/__pycache__/exceptions.cpython-312.pyc deleted file mode 100644 index 58ac6c54..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/qrcode/__pycache__/exceptions.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/qrcode/__pycache__/main.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/qrcode/__pycache__/main.cpython-312.pyc deleted file mode 100644 index 1cac8e7d..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/qrcode/__pycache__/main.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/qrcode/__pycache__/util.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/qrcode/__pycache__/util.cpython-312.pyc deleted file mode 100644 index 7f871d8b..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/qrcode/__pycache__/util.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/qrcode/compat/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/qrcode/compat/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 3e3c199b..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/qrcode/compat/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/qrcode/compat/__pycache__/pil.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/qrcode/compat/__pycache__/pil.cpython-312.pyc deleted file mode 100644 index 7cbcb6ed..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/qrcode/compat/__pycache__/pil.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/qrcode/image/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/qrcode/image/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 890ab716..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/qrcode/image/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/qrcode/image/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/qrcode/image/__pycache__/base.cpython-312.pyc deleted file mode 100644 index 8a97b02b..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/qrcode/image/__pycache__/base.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/qrcode/image/__pycache__/pure.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/qrcode/image/__pycache__/pure.cpython-312.pyc deleted file mode 100644 index 10d95aa2..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/qrcode/image/__pycache__/pure.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/qrcode/image/styles/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/qrcode/image/styles/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 2cb03e5d..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/qrcode/image/styles/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/qrcode/image/styles/moduledrawers/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/qrcode/image/styles/moduledrawers/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 97b64867..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/qrcode/image/styles/moduledrawers/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/qrcode/image/styles/moduledrawers/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/qrcode/image/styles/moduledrawers/__pycache__/base.cpython-312.pyc deleted file mode 100644 index 9cb98b87..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/qrcode/image/styles/moduledrawers/__pycache__/base.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/qrcode/image/styles/moduledrawers/__pycache__/pil.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/qrcode/image/styles/moduledrawers/__pycache__/pil.cpython-312.pyc deleted file mode 100644 index 9f2ca9dc..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/qrcode/image/styles/moduledrawers/__pycache__/pil.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index f203940a..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/__version__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/__version__.cpython-312.pyc deleted file mode 100644 index f70e7098..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/__version__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/_internal_utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/_internal_utils.cpython-312.pyc deleted file mode 100644 index 3c53496f..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/_internal_utils.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/adapters.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/adapters.cpython-312.pyc deleted file mode 100644 index b2e03b3c..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/adapters.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/api.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/api.cpython-312.pyc deleted file mode 100644 index d55b49e8..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/api.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/auth.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/auth.cpython-312.pyc deleted file mode 100644 index 6f1412fa..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/auth.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/certs.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/certs.cpython-312.pyc deleted file mode 100644 index 0909afb6..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/certs.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/compat.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/compat.cpython-312.pyc deleted file mode 100644 index da2c2ad2..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/compat.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/cookies.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/cookies.cpython-312.pyc deleted file mode 100644 index 59df7285..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/cookies.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/exceptions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/exceptions.cpython-312.pyc deleted file mode 100644 index 44fc5e35..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/exceptions.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/hooks.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/hooks.cpython-312.pyc deleted file mode 100644 index 0a8b9cbf..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/hooks.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/models.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/models.cpython-312.pyc deleted file mode 100644 index 03fbd802..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/models.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/packages.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/packages.cpython-312.pyc deleted file mode 100644 index 41fca48e..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/packages.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/sessions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/sessions.cpython-312.pyc deleted file mode 100644 index f8335783..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/sessions.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/status_codes.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/status_codes.cpython-312.pyc deleted file mode 100644 index 2ff50836..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/status_codes.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/structures.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/structures.cpython-312.pyc deleted file mode 100644 index 092d11cc..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/structures.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/utils.cpython-312.pyc deleted file mode 100644 index dd06de27..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/requests/__pycache__/utils.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/slowapi/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/slowapi/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index bc13765e..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/slowapi/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/slowapi/__pycache__/errors.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/slowapi/__pycache__/errors.cpython-312.pyc deleted file mode 100644 index f50c1631..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/slowapi/__pycache__/errors.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/slowapi/__pycache__/extension.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/slowapi/__pycache__/extension.cpython-312.pyc deleted file mode 100644 index 651ddcb9..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/slowapi/__pycache__/extension.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/slowapi/__pycache__/util.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/slowapi/__pycache__/util.cpython-312.pyc deleted file mode 100644 index 9006d7e6..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/slowapi/__pycache__/util.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/slowapi/__pycache__/wrappers.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/slowapi/__pycache__/wrappers.cpython-312.pyc deleted file mode 100644 index bb9bd85c..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/slowapi/__pycache__/wrappers.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sniffio/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sniffio/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 7313a9f6..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sniffio/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sniffio/__pycache__/_impl.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sniffio/__pycache__/_impl.cpython-312.pyc deleted file mode 100644 index bd2a4773..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sniffio/__pycache__/_impl.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sniffio/__pycache__/_version.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sniffio/__pycache__/_version.cpython-312.pyc deleted file mode 100644 index 7c26fce2..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sniffio/__pycache__/_version.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 25c8f518..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/__pycache__/events.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/__pycache__/events.cpython-312.pyc deleted file mode 100644 index 9c205c78..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/__pycache__/events.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/__pycache__/exc.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/__pycache__/exc.cpython-312.pyc deleted file mode 100644 index 80f0719a..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/__pycache__/exc.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/__pycache__/inspection.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/__pycache__/inspection.cpython-312.pyc deleted file mode 100644 index 35f85a3a..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/__pycache__/inspection.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/__pycache__/log.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/__pycache__/log.cpython-312.pyc deleted file mode 100644 index ee8b8708..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/__pycache__/log.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/__pycache__/schema.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/__pycache__/schema.cpython-312.pyc deleted file mode 100644 index c0e0daff..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/__pycache__/schema.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/__pycache__/types.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/__pycache__/types.cpython-312.pyc deleted file mode 100644 index d7b63867..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/__pycache__/types.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/connectors/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/connectors/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index fc86b14d..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/connectors/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/connectors/__pycache__/pyodbc.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/connectors/__pycache__/pyodbc.cpython-312.pyc deleted file mode 100644 index 1b5c088a..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/connectors/__pycache__/pyodbc.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/cyextension/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/cyextension/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index a41a7de1..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/cyextension/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index aa022c52..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/__pycache__/_typing.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/__pycache__/_typing.cpython-312.pyc deleted file mode 100644 index f2b25dbf..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/__pycache__/_typing.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index e4f1bf29..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/aiomysql.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/aiomysql.cpython-312.pyc deleted file mode 100644 index a0ad5680..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/aiomysql.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/asyncmy.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/asyncmy.cpython-312.pyc deleted file mode 100644 index 826a7834..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/asyncmy.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/base.cpython-312.pyc deleted file mode 100644 index 59dd7383..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/base.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/cymysql.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/cymysql.cpython-312.pyc deleted file mode 100644 index 55a421f1..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/cymysql.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/dml.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/dml.cpython-312.pyc deleted file mode 100644 index 6643f6b7..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/dml.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/enumerated.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/enumerated.cpython-312.pyc deleted file mode 100644 index c3410ad0..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/enumerated.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/expression.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/expression.cpython-312.pyc deleted file mode 100644 index 1cddc07d..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/expression.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/json.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/json.cpython-312.pyc deleted file mode 100644 index c3b552cd..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/json.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/mariadbconnector.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/mariadbconnector.cpython-312.pyc deleted file mode 100644 index 964cb2a2..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/mariadbconnector.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/mysqlconnector.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/mysqlconnector.cpython-312.pyc deleted file mode 100644 index 6d23c1cb..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/mysqlconnector.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/mysqldb.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/mysqldb.cpython-312.pyc deleted file mode 100644 index 9a948292..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/mysqldb.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/pymysql.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/pymysql.cpython-312.pyc deleted file mode 100644 index 71641cc1..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/pymysql.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/pyodbc.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/pyodbc.cpython-312.pyc deleted file mode 100644 index 87fbe3f3..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/pyodbc.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/reflection.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/reflection.cpython-312.pyc deleted file mode 100644 index 688f8caa..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/reflection.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/reserved_words.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/reserved_words.cpython-312.pyc deleted file mode 100644 index 06618b9f..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/reserved_words.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/types.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/types.cpython-312.pyc deleted file mode 100644 index a9982b2a..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__pycache__/types.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 21727b7d..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/_psycopg_common.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/_psycopg_common.cpython-312.pyc deleted file mode 100644 index f99bf7f3..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/_psycopg_common.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/array.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/array.cpython-312.pyc deleted file mode 100644 index abe336da..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/array.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/asyncpg.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/asyncpg.cpython-312.pyc deleted file mode 100644 index d9f850ec..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/asyncpg.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/base.cpython-312.pyc deleted file mode 100644 index a20e8ccf..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/base.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/dml.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/dml.cpython-312.pyc deleted file mode 100644 index 33cbb614..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/dml.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/ext.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/ext.cpython-312.pyc deleted file mode 100644 index ec06bd93..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/ext.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/hstore.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/hstore.cpython-312.pyc deleted file mode 100644 index c1cdec7b..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/hstore.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/json.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/json.cpython-312.pyc deleted file mode 100644 index 4e4040d3..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/json.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/named_types.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/named_types.cpython-312.pyc deleted file mode 100644 index d58ccdf8..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/named_types.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/operators.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/operators.cpython-312.pyc deleted file mode 100644 index 12f75f8f..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/operators.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/pg8000.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/pg8000.cpython-312.pyc deleted file mode 100644 index 11eadd37..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/pg8000.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/pg_catalog.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/pg_catalog.cpython-312.pyc deleted file mode 100644 index eae8d3aa..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/pg_catalog.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/psycopg.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/psycopg.cpython-312.pyc deleted file mode 100644 index 8e22fc2c..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/psycopg.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/psycopg2.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/psycopg2.cpython-312.pyc deleted file mode 100644 index c1316fe8..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/psycopg2.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/psycopg2cffi.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/psycopg2cffi.cpython-312.pyc deleted file mode 100644 index 4a14ae8c..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/psycopg2cffi.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/ranges.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/ranges.cpython-312.pyc deleted file mode 100644 index 3920e119..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/ranges.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/types.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/types.cpython-312.pyc deleted file mode 100644 index f35e1613..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__pycache__/types.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 5f0b7dd8..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/_py_processors.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/_py_processors.cpython-312.pyc deleted file mode 100644 index 043bc1ce..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/_py_processors.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/base.cpython-312.pyc deleted file mode 100644 index 22cbb639..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/base.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/characteristics.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/characteristics.cpython-312.pyc deleted file mode 100644 index e20559c6..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/characteristics.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/create.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/create.cpython-312.pyc deleted file mode 100644 index 78dfa066..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/create.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/cursor.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/cursor.cpython-312.pyc deleted file mode 100644 index e6d82271..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/cursor.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/default.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/default.cpython-312.pyc deleted file mode 100644 index ac20e3fb..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/default.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/events.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/events.cpython-312.pyc deleted file mode 100644 index a97e9d5d..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/events.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/interfaces.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/interfaces.cpython-312.pyc deleted file mode 100644 index 675d5d86..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/interfaces.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/mock.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/mock.cpython-312.pyc deleted file mode 100644 index 43c96c64..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/mock.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/processors.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/processors.cpython-312.pyc deleted file mode 100644 index f9a62ec4..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/processors.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/reflection.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/reflection.cpython-312.pyc deleted file mode 100644 index c1767305..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/reflection.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/result.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/result.cpython-312.pyc deleted file mode 100644 index 79ceece8..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/result.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/row.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/row.cpython-312.pyc deleted file mode 100644 index d225e8d7..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/row.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/strategies.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/strategies.cpython-312.pyc deleted file mode 100644 index 1c765f86..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/strategies.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/url.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/url.cpython-312.pyc deleted file mode 100644 index 4cab5bdc..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/url.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/util.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/util.cpython-312.pyc deleted file mode 100644 index 52e34aaa..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/engine/__pycache__/util.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/event/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/event/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index d0288b16..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/event/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/event/__pycache__/api.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/event/__pycache__/api.cpython-312.pyc deleted file mode 100644 index 33393d6e..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/event/__pycache__/api.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/event/__pycache__/attr.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/event/__pycache__/attr.cpython-312.pyc deleted file mode 100644 index 33b9ecd4..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/event/__pycache__/attr.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/event/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/event/__pycache__/base.cpython-312.pyc deleted file mode 100644 index 0ae51106..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/event/__pycache__/base.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/event/__pycache__/legacy.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/event/__pycache__/legacy.cpython-312.pyc deleted file mode 100644 index 7b8adcd4..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/event/__pycache__/legacy.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/event/__pycache__/registry.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/event/__pycache__/registry.cpython-312.pyc deleted file mode 100644 index 2dc1ffd4..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/event/__pycache__/registry.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/ext/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/ext/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index d51006bc..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/ext/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/ext/__pycache__/compiler.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/ext/__pycache__/compiler.cpython-312.pyc deleted file mode 100644 index 01aa3669..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/ext/__pycache__/compiler.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/ext/declarative/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/ext/declarative/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 915f1957..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/ext/declarative/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/ext/declarative/__pycache__/extensions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/ext/declarative/__pycache__/extensions.cpython-312.pyc deleted file mode 100644 index f56242bf..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/ext/declarative/__pycache__/extensions.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/future/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/future/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 7a9321ac..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/future/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/future/__pycache__/engine.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/future/__pycache__/engine.cpython-312.pyc deleted file mode 100644 index 4fcb52bc..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/future/__pycache__/engine.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 58533128..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/_orm_constructors.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/_orm_constructors.cpython-312.pyc deleted file mode 100644 index af0b1eda..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/_orm_constructors.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/_typing.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/_typing.cpython-312.pyc deleted file mode 100644 index d9d60150..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/_typing.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/attributes.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/attributes.cpython-312.pyc deleted file mode 100644 index 7a82000d..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/attributes.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/base.cpython-312.pyc deleted file mode 100644 index 3764452e..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/base.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/bulk_persistence.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/bulk_persistence.cpython-312.pyc deleted file mode 100644 index b85c6cb5..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/bulk_persistence.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/clsregistry.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/clsregistry.cpython-312.pyc deleted file mode 100644 index 00b3c27d..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/clsregistry.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/collections.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/collections.cpython-312.pyc deleted file mode 100644 index 2e3da5b0..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/collections.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/context.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/context.cpython-312.pyc deleted file mode 100644 index 668df89c..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/context.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/decl_api.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/decl_api.cpython-312.pyc deleted file mode 100644 index c008a423..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/decl_api.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/decl_base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/decl_base.cpython-312.pyc deleted file mode 100644 index 2fa48d86..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/decl_base.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/dependency.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/dependency.cpython-312.pyc deleted file mode 100644 index 05c9a0b5..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/dependency.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/descriptor_props.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/descriptor_props.cpython-312.pyc deleted file mode 100644 index 2cc8c85f..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/descriptor_props.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/dynamic.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/dynamic.cpython-312.pyc deleted file mode 100644 index 43ce462c..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/dynamic.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/evaluator.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/evaluator.cpython-312.pyc deleted file mode 100644 index 7878e83b..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/evaluator.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/events.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/events.cpython-312.pyc deleted file mode 100644 index b84840ad..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/events.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/exc.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/exc.cpython-312.pyc deleted file mode 100644 index 9e008261..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/exc.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/identity.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/identity.cpython-312.pyc deleted file mode 100644 index 48eac4c6..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/identity.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/instrumentation.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/instrumentation.cpython-312.pyc deleted file mode 100644 index 4290fa7e..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/instrumentation.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/interfaces.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/interfaces.cpython-312.pyc deleted file mode 100644 index b08156dd..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/interfaces.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/loading.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/loading.cpython-312.pyc deleted file mode 100644 index fd57fb5e..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/loading.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/mapped_collection.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/mapped_collection.cpython-312.pyc deleted file mode 100644 index fb04eb19..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/mapped_collection.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/mapper.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/mapper.cpython-312.pyc deleted file mode 100644 index 958476e0..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/mapper.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/path_registry.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/path_registry.cpython-312.pyc deleted file mode 100644 index 57ff2e85..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/path_registry.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/persistence.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/persistence.cpython-312.pyc deleted file mode 100644 index fb554d6f..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/persistence.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/properties.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/properties.cpython-312.pyc deleted file mode 100644 index 6121533d..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/properties.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/query.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/query.cpython-312.pyc deleted file mode 100644 index e362b91a..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/query.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/relationships.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/relationships.cpython-312.pyc deleted file mode 100644 index 5af4483a..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/relationships.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/scoping.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/scoping.cpython-312.pyc deleted file mode 100644 index ad5b9b52..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/scoping.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/session.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/session.cpython-312.pyc deleted file mode 100644 index fdf60702..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/session.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/state.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/state.cpython-312.pyc deleted file mode 100644 index ba8c4ccf..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/state.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/state_changes.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/state_changes.cpython-312.pyc deleted file mode 100644 index b55eeb09..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/state_changes.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/strategies.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/strategies.cpython-312.pyc deleted file mode 100644 index 9d7d7631..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/strategies.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/strategy_options.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/strategy_options.cpython-312.pyc deleted file mode 100644 index 3b2130a7..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/strategy_options.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/sync.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/sync.cpython-312.pyc deleted file mode 100644 index e3dfad1d..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/sync.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/unitofwork.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/unitofwork.cpython-312.pyc deleted file mode 100644 index feea3804..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/unitofwork.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/util.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/util.cpython-312.pyc deleted file mode 100644 index 939a13c3..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/util.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/writeonly.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/writeonly.cpython-312.pyc deleted file mode 100644 index 36a5e20d..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/orm/__pycache__/writeonly.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/pool/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/pool/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 1de55a9f..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/pool/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/pool/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/pool/__pycache__/base.cpython-312.pyc deleted file mode 100644 index e61ba4b4..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/pool/__pycache__/base.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/pool/__pycache__/events.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/pool/__pycache__/events.cpython-312.pyc deleted file mode 100644 index e1951a5f..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/pool/__pycache__/events.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/pool/__pycache__/impl.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/pool/__pycache__/impl.cpython-312.pyc deleted file mode 100644 index 509a41b0..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/pool/__pycache__/impl.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 1ee5ae5c..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/_dml_constructors.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/_dml_constructors.cpython-312.pyc deleted file mode 100644 index eb327c67..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/_dml_constructors.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/_elements_constructors.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/_elements_constructors.cpython-312.pyc deleted file mode 100644 index 97dd5cdb..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/_elements_constructors.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/_orm_types.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/_orm_types.cpython-312.pyc deleted file mode 100644 index bf1b3f29..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/_orm_types.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/_selectable_constructors.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/_selectable_constructors.cpython-312.pyc deleted file mode 100644 index a421a715..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/_selectable_constructors.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/_typing.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/_typing.cpython-312.pyc deleted file mode 100644 index 6666fe95..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/_typing.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/annotation.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/annotation.cpython-312.pyc deleted file mode 100644 index ababa497..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/annotation.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/base.cpython-312.pyc deleted file mode 100644 index 81050f3b..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/base.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/cache_key.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/cache_key.cpython-312.pyc deleted file mode 100644 index fe47607a..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/cache_key.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/coercions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/coercions.cpython-312.pyc deleted file mode 100644 index 8f1e3114..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/coercions.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/compiler.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/compiler.cpython-312.pyc deleted file mode 100644 index a2d716a1..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/compiler.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/crud.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/crud.cpython-312.pyc deleted file mode 100644 index e3a89ff1..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/crud.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/ddl.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/ddl.cpython-312.pyc deleted file mode 100644 index e334c0c4..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/ddl.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/default_comparator.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/default_comparator.cpython-312.pyc deleted file mode 100644 index 608341dd..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/default_comparator.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/dml.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/dml.cpython-312.pyc deleted file mode 100644 index 066f2c32..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/dml.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/elements.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/elements.cpython-312.pyc deleted file mode 100644 index d0048a00..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/elements.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/events.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/events.cpython-312.pyc deleted file mode 100644 index 1c0d0593..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/events.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/expression.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/expression.cpython-312.pyc deleted file mode 100644 index b37ac5f4..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/expression.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/functions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/functions.cpython-312.pyc deleted file mode 100644 index dd0b746c..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/functions.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/lambdas.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/lambdas.cpython-312.pyc deleted file mode 100644 index 73b5a12c..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/lambdas.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/naming.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/naming.cpython-312.pyc deleted file mode 100644 index 9b476e0d..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/naming.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/operators.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/operators.cpython-312.pyc deleted file mode 100644 index 0888880d..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/operators.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/roles.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/roles.cpython-312.pyc deleted file mode 100644 index 62639cac..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/roles.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/schema.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/schema.cpython-312.pyc deleted file mode 100644 index e1f02b3f..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/schema.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/selectable.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/selectable.cpython-312.pyc deleted file mode 100644 index 0d84d0ab..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/selectable.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/sqltypes.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/sqltypes.cpython-312.pyc deleted file mode 100644 index 635fa779..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/sqltypes.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/traversals.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/traversals.cpython-312.pyc deleted file mode 100644 index 74113b67..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/traversals.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/type_api.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/type_api.cpython-312.pyc deleted file mode 100644 index d5031bf2..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/type_api.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/util.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/util.cpython-312.pyc deleted file mode 100644 index 63b37d1f..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/util.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/visitors.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/visitors.cpython-312.pyc deleted file mode 100644 index dbf1f8d6..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/sql/__pycache__/visitors.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 9586dbf6..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/_collections.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/_collections.cpython-312.pyc deleted file mode 100644 index 629e708a..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/_collections.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/_concurrency_py3k.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/_concurrency_py3k.cpython-312.pyc deleted file mode 100644 index a2bdb2f0..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/_concurrency_py3k.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/_has_cy.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/_has_cy.cpython-312.pyc deleted file mode 100644 index 873843d9..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/_has_cy.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/compat.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/compat.cpython-312.pyc deleted file mode 100644 index db908b15..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/compat.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/concurrency.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/concurrency.cpython-312.pyc deleted file mode 100644 index 2352c455..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/concurrency.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/deprecations.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/deprecations.cpython-312.pyc deleted file mode 100644 index 887081bc..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/deprecations.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/langhelpers.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/langhelpers.cpython-312.pyc deleted file mode 100644 index 00b62a3b..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/langhelpers.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/preloaded.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/preloaded.cpython-312.pyc deleted file mode 100644 index ea90949f..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/preloaded.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/queue.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/queue.cpython-312.pyc deleted file mode 100644 index a2ce8d11..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/queue.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/topological.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/topological.cpython-312.pyc deleted file mode 100644 index 9bc44435..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/topological.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/typing.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/typing.cpython-312.pyc deleted file mode 100644 index 2c63bef4..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/sqlalchemy/util/__pycache__/typing.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 6cfaf23d..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/_compat.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/_compat.cpython-312.pyc deleted file mode 100644 index 3ebf80be..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/_compat.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/_utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/_utils.cpython-312.pyc deleted file mode 100644 index 3cd91596..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/_utils.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/applications.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/applications.cpython-312.pyc deleted file mode 100644 index eda77be7..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/applications.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/background.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/background.cpython-312.pyc deleted file mode 100644 index 752ccb7c..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/background.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/concurrency.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/concurrency.cpython-312.pyc deleted file mode 100644 index b403f430..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/concurrency.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/config.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/config.cpython-312.pyc deleted file mode 100644 index 6d60db71..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/config.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/convertors.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/convertors.cpython-312.pyc deleted file mode 100644 index 7effcaf6..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/convertors.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/datastructures.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/datastructures.cpython-312.pyc deleted file mode 100644 index e207851f..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/datastructures.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/exceptions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/exceptions.cpython-312.pyc deleted file mode 100644 index e94d22ae..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/exceptions.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/formparsers.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/formparsers.cpython-312.pyc deleted file mode 100644 index f94cf157..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/formparsers.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/requests.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/requests.cpython-312.pyc deleted file mode 100644 index 229d731c..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/requests.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/responses.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/responses.cpython-312.pyc deleted file mode 100644 index dd6e9d82..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/responses.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/routing.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/routing.cpython-312.pyc deleted file mode 100644 index 6d78cedc..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/routing.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/staticfiles.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/staticfiles.cpython-312.pyc deleted file mode 100644 index db09ce9f..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/staticfiles.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/status.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/status.cpython-312.pyc deleted file mode 100644 index be080f4e..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/status.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/types.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/types.cpython-312.pyc deleted file mode 100644 index 6a8be8ad..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/types.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/websockets.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/websockets.cpython-312.pyc deleted file mode 100644 index ef867caf..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/starlette/__pycache__/websockets.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/starlette/middleware/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/starlette/middleware/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 895ff6ed..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/starlette/middleware/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/starlette/middleware/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/starlette/middleware/__pycache__/base.cpython-312.pyc deleted file mode 100644 index 3b15fb7b..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/starlette/middleware/__pycache__/base.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/starlette/middleware/__pycache__/cors.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/starlette/middleware/__pycache__/cors.cpython-312.pyc deleted file mode 100644 index 3f3cc142..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/starlette/middleware/__pycache__/cors.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/starlette/middleware/__pycache__/errors.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/starlette/middleware/__pycache__/errors.cpython-312.pyc deleted file mode 100644 index 86c4e767..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/starlette/middleware/__pycache__/errors.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/starlette/middleware/__pycache__/exceptions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/starlette/middleware/__pycache__/exceptions.cpython-312.pyc deleted file mode 100644 index 5c88689a..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/starlette/middleware/__pycache__/exceptions.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 41816b2b..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_api_mode.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_api_mode.cpython-312.pyc deleted file mode 100644 index 4d55c194..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_api_mode.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_api_version.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_api_version.cpython-312.pyc deleted file mode 100644 index d1d8f78e..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_api_version.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_app_info.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_app_info.cpython-312.pyc deleted file mode 100644 index ce4e3329..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_app_info.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_base_address.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_base_address.cpython-312.pyc deleted file mode 100644 index 48c12cd5..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_base_address.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_encode.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_encode.cpython-312.pyc deleted file mode 100644 index bac465f3..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_encode.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_error.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_error.cpython-312.pyc deleted file mode 100644 index 3e24de70..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_error.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_error_object.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_error_object.cpython-312.pyc deleted file mode 100644 index 657965ca..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_error_object.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_http_client.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_http_client.cpython-312.pyc deleted file mode 100644 index bf5162cf..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_http_client.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_request_metrics.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_request_metrics.cpython-312.pyc deleted file mode 100644 index 79a21b32..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_request_metrics.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_request_options.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_request_options.cpython-312.pyc deleted file mode 100644 index 11b483f9..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_request_options.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_requestor_options.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_requestor_options.cpython-312.pyc deleted file mode 100644 index b6d6101d..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_requestor_options.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_stripe_object.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_stripe_object.cpython-312.pyc deleted file mode 100644 index 7c711cb7..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_stripe_object.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_stripe_response.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_stripe_response.cpython-312.pyc deleted file mode 100644 index abb3c864..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_stripe_response.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_util.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_util.cpython-312.pyc deleted file mode 100644 index 280867a6..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_util.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_version.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_version.cpython-312.pyc deleted file mode 100644 index 6ac829a7..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/stripe/__pycache__/_version.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 8091b7b9..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/_base_connection.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/_base_connection.cpython-312.pyc deleted file mode 100644 index 9a97adbe..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/_base_connection.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/_collections.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/_collections.cpython-312.pyc deleted file mode 100644 index bf3d45fc..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/_collections.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/_request_methods.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/_request_methods.cpython-312.pyc deleted file mode 100644 index 929e9d0a..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/_request_methods.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/_version.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/_version.cpython-312.pyc deleted file mode 100644 index bc4b158c..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/_version.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/connection.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/connection.cpython-312.pyc deleted file mode 100644 index 2cc38246..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/connection.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/connectionpool.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/connectionpool.cpython-312.pyc deleted file mode 100644 index cd352c78..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/connectionpool.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/exceptions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/exceptions.cpython-312.pyc deleted file mode 100644 index 0ec5d7a7..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/exceptions.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/fields.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/fields.cpython-312.pyc deleted file mode 100644 index ed1b2b75..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/fields.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/filepost.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/filepost.cpython-312.pyc deleted file mode 100644 index edc2b3ce..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/filepost.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/poolmanager.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/poolmanager.cpython-312.pyc deleted file mode 100644 index b016ace9..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/poolmanager.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/response.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/response.cpython-312.pyc deleted file mode 100644 index 87f22365..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/urllib3/__pycache__/response.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/contrib/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/contrib/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 7ee35c9f..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/urllib3/contrib/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/contrib/__pycache__/socks.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/contrib/__pycache__/socks.cpython-312.pyc deleted file mode 100644 index 52910834..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/urllib3/contrib/__pycache__/socks.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/http2/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/http2/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 4f5eaeb1..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/urllib3/http2/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/http2/__pycache__/probe.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/http2/__pycache__/probe.cpython-312.pyc deleted file mode 100644 index 4265ff1e..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/urllib3/http2/__pycache__/probe.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 54e851b4..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/connection.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/connection.cpython-312.pyc deleted file mode 100644 index 0f17a5a9..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/connection.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/proxy.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/proxy.cpython-312.pyc deleted file mode 100644 index c562a2ef..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/proxy.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/request.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/request.cpython-312.pyc deleted file mode 100644 index a2b6e9b7..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/request.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/response.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/response.cpython-312.pyc deleted file mode 100644 index 73b2a5cf..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/response.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/retry.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/retry.cpython-312.pyc deleted file mode 100644 index 408019d4..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/retry.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/ssl_.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/ssl_.cpython-312.pyc deleted file mode 100644 index 7a1e23f8..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/ssl_.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/ssl_match_hostname.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/ssl_match_hostname.cpython-312.pyc deleted file mode 100644 index a422f053..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/ssl_match_hostname.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/ssltransport.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/ssltransport.cpython-312.pyc deleted file mode 100644 index 97aaf157..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/ssltransport.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/timeout.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/timeout.cpython-312.pyc deleted file mode 100644 index 6b797605..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/timeout.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/url.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/url.cpython-312.pyc deleted file mode 100644 index aacd18d7..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/url.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/util.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/util.cpython-312.pyc deleted file mode 100644 index 1ec28fc5..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/util.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/wait.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/wait.cpython-312.pyc deleted file mode 100644 index c3493052..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/urllib3/util/__pycache__/wait.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 3c4c691c..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/uvicorn/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/__pycache__/_subprocess.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/__pycache__/_subprocess.cpython-312.pyc deleted file mode 100644 index 44a631b5..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/uvicorn/__pycache__/_subprocess.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/__pycache__/_types.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/__pycache__/_types.cpython-312.pyc deleted file mode 100644 index f94fe161..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/uvicorn/__pycache__/_types.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/__pycache__/config.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/__pycache__/config.cpython-312.pyc deleted file mode 100644 index 65e98b86..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/uvicorn/__pycache__/config.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/__pycache__/importer.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/__pycache__/importer.cpython-312.pyc deleted file mode 100644 index d1f0d23f..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/uvicorn/__pycache__/importer.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/__pycache__/logging.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/__pycache__/logging.cpython-312.pyc deleted file mode 100644 index 7c1dea90..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/uvicorn/__pycache__/logging.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/__pycache__/main.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/__pycache__/main.cpython-312.pyc deleted file mode 100644 index 864e70a2..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/uvicorn/__pycache__/main.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/__pycache__/server.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/__pycache__/server.cpython-312.pyc deleted file mode 100644 index d74c7931..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/uvicorn/__pycache__/server.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/lifespan/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/lifespan/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index ffaf035b..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/uvicorn/lifespan/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/lifespan/__pycache__/on.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/lifespan/__pycache__/on.cpython-312.pyc deleted file mode 100644 index 1b74e8f6..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/uvicorn/lifespan/__pycache__/on.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/loops/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/loops/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 7f8e7598..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/uvicorn/loops/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/loops/__pycache__/auto.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/loops/__pycache__/auto.cpython-312.pyc deleted file mode 100644 index 9d1366a0..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/uvicorn/loops/__pycache__/auto.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/loops/__pycache__/uvloop.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/loops/__pycache__/uvloop.cpython-312.pyc deleted file mode 100644 index bbafb54c..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/uvicorn/loops/__pycache__/uvloop.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/middleware/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/middleware/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 21f4a33f..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/uvicorn/middleware/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/middleware/__pycache__/asgi2.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/middleware/__pycache__/asgi2.cpython-312.pyc deleted file mode 100644 index b1155b8e..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/uvicorn/middleware/__pycache__/asgi2.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/middleware/__pycache__/message_logger.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/middleware/__pycache__/message_logger.cpython-312.pyc deleted file mode 100644 index 63d82a01..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/uvicorn/middleware/__pycache__/message_logger.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/middleware/__pycache__/proxy_headers.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/middleware/__pycache__/proxy_headers.cpython-312.pyc deleted file mode 100644 index 0ef96fe3..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/uvicorn/middleware/__pycache__/proxy_headers.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/middleware/__pycache__/wsgi.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/middleware/__pycache__/wsgi.cpython-312.pyc deleted file mode 100644 index e8129d48..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/uvicorn/middleware/__pycache__/wsgi.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 900450cc..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/__pycache__/utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/__pycache__/utils.cpython-312.pyc deleted file mode 100644 index f3e20916..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/__pycache__/utils.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/http/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/http/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 5198ca18..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/http/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/http/__pycache__/auto.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/http/__pycache__/auto.cpython-312.pyc deleted file mode 100644 index 6243278d..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/http/__pycache__/auto.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/http/__pycache__/flow_control.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/http/__pycache__/flow_control.cpython-312.pyc deleted file mode 100644 index 0b68490f..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/http/__pycache__/flow_control.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/http/__pycache__/httptools_impl.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/http/__pycache__/httptools_impl.cpython-312.pyc deleted file mode 100644 index b0221a36..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/http/__pycache__/httptools_impl.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/websockets/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/websockets/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index d9c90f62..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/websockets/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/websockets/__pycache__/auto.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/websockets/__pycache__/auto.cpython-312.pyc deleted file mode 100644 index 735f8bca..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/websockets/__pycache__/auto.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/websockets/__pycache__/websockets_impl.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/websockets/__pycache__/websockets_impl.cpython-312.pyc deleted file mode 100644 index 438e8a7e..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/uvicorn/protocols/websockets/__pycache__/websockets_impl.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/supervisors/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/supervisors/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 9f84e614..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/uvicorn/supervisors/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/supervisors/__pycache__/basereload.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/supervisors/__pycache__/basereload.cpython-312.pyc deleted file mode 100644 index 685ee863..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/uvicorn/supervisors/__pycache__/basereload.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/supervisors/__pycache__/multiprocess.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/supervisors/__pycache__/multiprocess.cpython-312.pyc deleted file mode 100644 index f8d344a9..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/uvicorn/supervisors/__pycache__/multiprocess.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvicorn/supervisors/__pycache__/watchfilesreload.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvicorn/supervisors/__pycache__/watchfilesreload.cpython-312.pyc deleted file mode 100644 index 593420ca..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/uvicorn/supervisors/__pycache__/watchfilesreload.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvloop/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvloop/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 89497c31..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/uvloop/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvloop/__pycache__/_noop.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvloop/__pycache__/_noop.cpython-312.pyc deleted file mode 100644 index dc0f28b1..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/uvloop/__pycache__/_noop.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvloop/__pycache__/_version.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvloop/__pycache__/_version.cpython-312.pyc deleted file mode 100644 index f1ad73b5..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/uvloop/__pycache__/_version.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/uvloop/includes/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/uvloop/includes/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index b88bc5d9..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/uvloop/includes/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/watchfiles/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/watchfiles/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 49400b70..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/watchfiles/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/watchfiles/__pycache__/filters.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/watchfiles/__pycache__/filters.cpython-312.pyc deleted file mode 100644 index fa274bfd..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/watchfiles/__pycache__/filters.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/watchfiles/__pycache__/main.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/watchfiles/__pycache__/main.cpython-312.pyc deleted file mode 100644 index 20d66660..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/watchfiles/__pycache__/main.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/watchfiles/__pycache__/run.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/watchfiles/__pycache__/run.cpython-312.pyc deleted file mode 100644 index 02169eb6..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/watchfiles/__pycache__/run.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/watchfiles/__pycache__/version.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/watchfiles/__pycache__/version.cpython-312.pyc deleted file mode 100644 index 1ce06e69..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/watchfiles/__pycache__/version.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/webencodings/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/webencodings/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 883dce51..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/webencodings/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/webencodings/__pycache__/labels.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/webencodings/__pycache__/labels.cpython-312.pyc deleted file mode 100644 index ba735a8a..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/webencodings/__pycache__/labels.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 29e352fd..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/datastructures.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/datastructures.cpython-312.pyc deleted file mode 100644 index dee0f5f5..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/datastructures.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/exceptions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/exceptions.cpython-312.pyc deleted file mode 100644 index a35e46cf..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/exceptions.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/frames.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/frames.cpython-312.pyc deleted file mode 100644 index c31ba29e..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/frames.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/headers.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/headers.cpython-312.pyc deleted file mode 100644 index 69a8525b..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/headers.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/http11.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/http11.cpython-312.pyc deleted file mode 100644 index 537a667a..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/http11.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/imports.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/imports.cpython-312.pyc deleted file mode 100644 index a96f1e43..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/imports.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/protocol.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/protocol.cpython-312.pyc deleted file mode 100644 index 647356c9..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/protocol.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/server.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/server.cpython-312.pyc deleted file mode 100644 index ef43549d..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/server.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/streams.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/streams.cpython-312.pyc deleted file mode 100644 index ee430dcc..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/streams.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/typing.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/typing.cpython-312.pyc deleted file mode 100644 index 19965edc..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/typing.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/utils.cpython-312.pyc deleted file mode 100644 index d8a87d3e..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/utils.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/version.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/version.cpython-312.pyc deleted file mode 100644 index 0689773f..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/websockets/__pycache__/version.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/websockets/asyncio/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/websockets/asyncio/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 9537c252..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/websockets/asyncio/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/websockets/asyncio/__pycache__/compatibility.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/websockets/asyncio/__pycache__/compatibility.cpython-312.pyc deleted file mode 100644 index d22ae148..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/websockets/asyncio/__pycache__/compatibility.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/websockets/extensions/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/websockets/extensions/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 46d6015e..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/websockets/extensions/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/websockets/extensions/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/websockets/extensions/__pycache__/base.cpython-312.pyc deleted file mode 100644 index 51addb78..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/websockets/extensions/__pycache__/base.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/websockets/extensions/__pycache__/permessage_deflate.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/websockets/extensions/__pycache__/permessage_deflate.cpython-312.pyc deleted file mode 100644 index b1710943..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/websockets/extensions/__pycache__/permessage_deflate.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/websockets/legacy/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/websockets/legacy/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 8b6ec681..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/websockets/legacy/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/websockets/legacy/__pycache__/exceptions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/websockets/legacy/__pycache__/exceptions.cpython-312.pyc deleted file mode 100644 index e71f421a..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/websockets/legacy/__pycache__/exceptions.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/websockets/legacy/__pycache__/framing.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/websockets/legacy/__pycache__/framing.cpython-312.pyc deleted file mode 100644 index 9836535c..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/websockets/legacy/__pycache__/framing.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/websockets/legacy/__pycache__/handshake.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/websockets/legacy/__pycache__/handshake.cpython-312.pyc deleted file mode 100644 index 78630a77..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/websockets/legacy/__pycache__/handshake.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/websockets/legacy/__pycache__/http.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/websockets/legacy/__pycache__/http.cpython-312.pyc deleted file mode 100644 index 8cc2bf25..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/websockets/legacy/__pycache__/http.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/websockets/legacy/__pycache__/protocol.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/websockets/legacy/__pycache__/protocol.cpython-312.pyc deleted file mode 100644 index 9083fc80..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/websockets/legacy/__pycache__/protocol.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/websockets/legacy/__pycache__/server.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/websockets/legacy/__pycache__/server.cpython-312.pyc deleted file mode 100644 index bad3507e..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/websockets/legacy/__pycache__/server.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 2738a53a..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/__wrapt__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/__wrapt__.cpython-312.pyc deleted file mode 100644 index 8378e28c..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/__wrapt__.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/arguments.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/arguments.cpython-312.pyc deleted file mode 100644 index 5449368f..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/arguments.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/decorators.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/decorators.cpython-312.pyc deleted file mode 100644 index 570e3002..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/decorators.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/importer.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/importer.cpython-312.pyc deleted file mode 100644 index 80682b89..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/importer.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/patches.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/patches.cpython-312.pyc deleted file mode 100644 index 047f2eb6..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/patches.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/proxies.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/proxies.cpython-312.pyc deleted file mode 100644 index 097c27ad..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/proxies.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/weakrefs.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/weakrefs.cpython-312.pyc deleted file mode 100644 index e98213d6..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/weakrefs.cpython-312.pyc and /dev/null differ diff --git a/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/wrappers.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/wrappers.cpython-312.pyc deleted file mode 100644 index 49d3e9fb..00000000 Binary files a/Backend/venv/lib/python3.12/site-packages/wrapt/__pycache__/wrappers.cpython-312.pyc and /dev/null differ diff --git a/Frontend/src/App.tsx b/Frontend/src/App.tsx index 9575c996..46c46c89 100644 --- a/Frontend/src/App.tsx +++ b/Frontend/src/App.tsx @@ -8,27 +8,27 @@ import { } from 'react-router-dom'; import { ToastContainer } from 'react-toastify'; import 'react-toastify/dist/ReactToastify.css'; -import { LoadingProvider, useNavigationLoading, useLoading } from './contexts/LoadingContext'; -import { CookieConsentProvider } from './contexts/CookieConsentContext'; -import { CurrencyProvider } from './contexts/CurrencyContext'; -import { CompanySettingsProvider } from './contexts/CompanySettingsContext'; -import { AuthModalProvider } from './contexts/AuthModalContext'; -import { AntibotProvider } from './contexts/AntibotContext'; -import OfflineIndicator from './components/common/OfflineIndicator'; -import CookieConsentBanner from './components/common/CookieConsentBanner'; -import CookiePreferencesModal from './components/common/CookiePreferencesModal'; -import AnalyticsLoader from './components/common/AnalyticsLoader'; -import Loading from './components/common/Loading'; -import Preloader from './components/common/Preloader'; -import ScrollToTop from './components/common/ScrollToTop'; -import AuthModalManager from './components/modals/AuthModalManager'; -import ResetPasswordRouteHandler from './components/auth/ResetPasswordRouteHandler'; -import ErrorBoundaryRoute from './components/common/ErrorBoundaryRoute'; +import { LoadingProvider, useNavigationLoading, useLoading } from './shared/contexts/LoadingContext'; +import { CookieConsentProvider } from './shared/contexts/CookieConsentContext'; +import { CurrencyProvider } from './features/payments/contexts/CurrencyContext'; +import { CompanySettingsProvider } from './shared/contexts/CompanySettingsContext'; +import { AuthModalProvider } from './features/auth/contexts/AuthModalContext'; +import { AntibotProvider } from './features/auth/contexts/AntibotContext'; +import OfflineIndicator from './shared/components/OfflineIndicator'; +import CookieConsentBanner from './shared/components/CookieConsentBanner'; +import CookiePreferencesModal from './shared/components/CookiePreferencesModal'; +import AnalyticsLoader from './shared/components/AnalyticsLoader'; +import Loading from './shared/components/Loading'; +import Preloader from './shared/components/Preloader'; +import ScrollToTop from './shared/components/ScrollToTop'; +import AuthModalManager from './features/auth/components/AuthModalManager'; +import ResetPasswordRouteHandler from './features/auth/components/ResetPasswordRouteHandler'; +import ErrorBoundaryRoute from './shared/components/ErrorBoundaryRoute'; import useAuthStore from './store/useAuthStore'; import useFavoritesStore from './store/useFavoritesStore'; -import { LayoutMain } from './components/layout'; +import LayoutMain from './shared/components/LayoutMain'; import AdminLayout from './pages/AdminLayout'; import { @@ -37,9 +37,9 @@ import { StaffRoute, AccountantRoute, CustomerRoute -} from './components/auth'; +} from './features/auth/components'; -const HomePage = lazy(() => import('./pages/HomePage')); +const HomePage = lazy(() => import('./features/content/pages/HomePage')); const DashboardPage = lazy(() => import('./pages/customer/DashboardPage')); const RoomListPage = lazy(() => import('./pages/customer/RoomListPage')); const RoomDetailPage = lazy(() => import('./pages/customer/RoomDetailPage')); @@ -59,16 +59,16 @@ const InvoiceEditPage = lazy(() => import('./pages/admin/InvoiceEditPage')); const ProfilePage = lazy(() => import('./pages/customer/ProfilePage')); const LoyaltyPage = lazy(() => import('./pages/customer/LoyaltyPage')); const GroupBookingPage = lazy(() => import('./pages/customer/GroupBookingPage')); -const AboutPage = lazy(() => import('./pages/AboutPage')); -const ContactPage = lazy(() => import('./pages/ContactPage')); -const PrivacyPolicyPage = lazy(() => import('./pages/PrivacyPolicyPage')); -const TermsPage = lazy(() => import('./pages/TermsPage')); -const RefundsPolicyPage = lazy(() => import('./pages/RefundsPolicyPage')); -const CancellationPolicyPage = lazy(() => import('./pages/CancellationPolicyPage')); -const AccessibilityPage = lazy(() => import('./pages/AccessibilityPage')); -const FAQPage = lazy(() => import('./pages/FAQPage')); -const BlogPage = lazy(() => import('./pages/BlogPage')); -const BlogDetailPage = lazy(() => import('./pages/BlogDetailPage')); +const AboutPage = lazy(() => import('./features/content/pages/AboutPage')); +const ContactPage = lazy(() => import('./features/content/pages/ContactPage')); +const PrivacyPolicyPage = lazy(() => import('./features/content/pages/PrivacyPolicyPage')); +const TermsPage = lazy(() => import('./features/content/pages/TermsPage')); +const RefundsPolicyPage = lazy(() => import('./features/content/pages/RefundsPolicyPage')); +const CancellationPolicyPage = lazy(() => import('./features/content/pages/CancellationPolicyPage')); +const AccessibilityPage = lazy(() => import('./features/content/pages/AccessibilityPage')); +const FAQPage = lazy(() => import('./features/content/pages/FAQPage')); +const BlogPage = lazy(() => import('./features/content/pages/BlogPage')); +const BlogDetailPage = lazy(() => import('./features/content/pages/BlogDetailPage')); const AdminDashboardPage = lazy(() => import('./pages/admin/DashboardPage')); const InvoiceManagementPage = lazy(() => import('./pages/admin/InvoiceManagementPage')); @@ -111,7 +111,7 @@ const AccountantInvoiceManagementPage = lazy(() => import('./pages/accountant/In const AccountantAnalyticsDashboardPage = lazy(() => import('./pages/accountant/AnalyticsDashboardPage')); const AccountantLayout = lazy(() => import('./pages/AccountantLayout')); -const NotFoundPage = lazy(() => import('./pages/NotFoundPage')); +const NotFoundPage = lazy(() => import('./shared/pages/NotFoundPage')); // Component to track navigation changes - must be inside Router const NavigationTracker: React.FC = () => { diff --git a/Frontend/src/components/common/index.ts b/Frontend/src/components/common/index.ts deleted file mode 100644 index 9f08e1d0..00000000 --- a/Frontend/src/components/common/index.ts +++ /dev/null @@ -1,14 +0,0 @@ -export { default as EmptyState } from './EmptyState'; -export { default as ErrorBoundary } from './ErrorBoundary'; -export { default as Loading } from './Loading'; -export { default as OptimizedImage } from './OptimizedImage'; -export { default as Pagination } from './Pagination'; -export { default as PaymentMethodSelector } from './PaymentMethodSelector'; -export { default as PaymentStatusBadge } from './PaymentStatusBadge'; -export { default as ConfirmationDialog } from './ConfirmationDialog'; -export { default as GlobalLoading } from './GlobalLoading'; -export { default as OfflineIndicator } from './OfflineIndicator'; -export { default as Skeleton } from './Skeleton'; -export { default as ScrollToTop } from './ScrollToTop'; -export { default as ExportButton } from './ExportButton'; - diff --git a/Frontend/src/features/ai/components/AIAssistantWidget.tsx b/Frontend/src/features/ai/components/AIAssistantWidget.tsx new file mode 100644 index 00000000..7f57be1c --- /dev/null +++ b/Frontend/src/features/ai/components/AIAssistantWidget.tsx @@ -0,0 +1,249 @@ +/** + * AI Assistant Widget Component + * Provides an AI-powered chat interface for hotel management queries + */ + +import React, { useState, useRef, useEffect } from 'react'; +import { Send, Bot, X, Minimize2, Maximize2, Loader2 } from 'lucide-react'; +import { chatWithAI, AIChatResponse } from '../services/aiAssistantService'; +import { toast } from 'react-toastify'; + +interface Message { + id: string; + role: 'user' | 'assistant'; + content: string; + timestamp: Date; + intent?: string; +} + +interface AIAssistantWidgetProps { + className?: string; +} + +const AIAssistantWidget: React.FC = ({ className = '' }) => { + const [isOpen, setIsOpen] = useState(false); + const [isMinimized, setIsMinimized] = useState(false); + const [messages, setMessages] = useState([ + { + id: '1', + role: 'assistant', + content: 'Hello! I\'m your AI assistant. I can help you with questions about rooms, bookings, invoices, payments, and chat messages. How can I assist you today?', + timestamp: new Date(), + }, + ]); + const [inputValue, setInputValue] = useState(''); + const [isLoading, setIsLoading] = useState(false); + const messagesEndRef = useRef(null); + const inputRef = useRef(null); + + const scrollToBottom = () => { + messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' }); + }; + + useEffect(() => { + scrollToBottom(); + }, [messages]); + + useEffect(() => { + if (isOpen && inputRef.current) { + inputRef.current.focus(); + } + }, [isOpen]); + + const handleSend = async () => { + if (!inputValue.trim() || isLoading) return; + + const userMessage: Message = { + id: Date.now().toString(), + role: 'user', + content: inputValue.trim(), + timestamp: new Date(), + }; + + setMessages((prev) => [...prev, userMessage]); + setInputValue(''); + setIsLoading(true); + + try { + const response: AIChatResponse = await chatWithAI(userMessage.content); + + const assistantMessage: Message = { + id: (Date.now() + 1).toString(), + role: 'assistant', + content: response.response, + timestamp: new Date(), + intent: response.intent, + }; + + setMessages((prev) => [...prev, assistantMessage]); + } catch (error: any) { + console.error('AI Assistant Error:', error); + + // Extract error message + let errorMessage = 'I apologize, but I encountered an error. Please try again.'; + + if (error.response) { + // Server responded with error + const detail = error.response.data?.detail || error.response.data?.message; + if (detail) { + errorMessage = `Error: ${detail}`; + toast.error(detail); + } else { + toast.error(`Error ${error.response.status}: ${error.response.statusText}`); + } + } else if (error.request) { + // Request made but no response + errorMessage = 'Unable to connect to the server. Please check your connection.'; + toast.error('Connection error. Please check your network.'); + } else { + // Something else happened + errorMessage = `Error: ${error.message || 'Unknown error'}`; + toast.error(error.message || 'An unexpected error occurred'); + } + + const errorMsg: Message = { + id: (Date.now() + 1).toString(), + role: 'assistant', + content: errorMessage, + timestamp: new Date(), + }; + setMessages((prev) => [...prev, errorMsg]); + } finally { + setIsLoading(false); + } + }; + + const handleKeyPress = (e: React.KeyboardEvent) => { + if (e.key === 'Enter' && !e.shiftKey) { + e.preventDefault(); + handleSend(); + } + }; + + const clearChat = () => { + setMessages([ + { + id: '1', + role: 'assistant', + content: 'Hello! I\'m your AI assistant. How can I help you today?', + timestamp: new Date(), + }, + ]); + }; + + if (!isOpen) { + return ( + + ); + } + + return ( +
+ {/* Header */} +
+
+ +

AI Assistant

+
+
+ + + +
+
+ + {!isMinimized && ( + <> + {/* Messages */} +
+ {messages.map((message) => ( +
+
+

{message.content}

+ {message.intent && message.role === 'assistant' && ( +

Intent: {message.intent}

+ )} +
+
+ ))} + {isLoading && ( +
+
+ +
+
+ )} +
+
+ + {/* Input */} +
+
+ setInputValue(e.target.value)} + onKeyPress={handleKeyPress} + placeholder="Ask about rooms, bookings, invoices..." + className="flex-1 px-4 py-2 border-2 border-slate-200 rounded-xl focus:border-amber-400 focus:ring-4 focus:ring-amber-100 transition-all duration-200 text-slate-700" + disabled={isLoading} + /> + +
+

+ Try: "Which rooms are occupied?" or "Show me booking BK12345" +

+
+ + )} +
+ ); +}; + +export default AIAssistantWidget; + diff --git a/Frontend/src/features/ai/services/aiAssistantService.ts b/Frontend/src/features/ai/services/aiAssistantService.ts new file mode 100644 index 00000000..0a870202 --- /dev/null +++ b/Frontend/src/features/ai/services/aiAssistantService.ts @@ -0,0 +1,169 @@ +/** + * AI Assistant Service + * Handles communication with the AI assistant backend + */ + +import apiClient from '../../../shared/services/apiClient'; + +export interface AIChatRequest { + message: string; + context?: Record; +} + +export interface AIChatResponse { + response: string; + intent: string; + data_used: Record; + timestamp: string; + user_role?: string; // Added: user role information +} + +export interface SystemStatus { + user_role?: string; // Added: user role information + timestamp: string; + room_status: { + total_rooms: number; + available: number; + occupied: number; + maintenance?: number; + cleaning?: number; + occupancy_rate: number; + rooms_with_active_bookings?: number; + }; + booking_summary?: { + upcoming_checkins: number; + upcoming_checkouts: number; + active_bookings: number; + pending_bookings: number; + }; + user_bookings?: Array<{ + booking_number: string; + status: string; + check_in: string; + check_out: string; + total_price: number; + room_number?: string; + room_type?: string; + }>; + payment_summary?: { + total_revenue: number; + pending_amount: number; + completed_payments: number; + }; + invoice_summary?: { + total_invoices: number; + overdue_invoices: number; + status_breakdown?: Record; + }; + user_invoices?: Array<{ + invoice_number: string; + status: string; + total_amount: number; + balance_due: number; + due_date: string; + booking_number?: string; + }>; + user_payments?: Array<{ + id: number; + amount: number; + payment_method: string; + payment_status: string; + payment_date: string; + booking_number?: string; + }>; + unanswered_chats?: Array<{ + chat_id: number; + visitor_name: string; + last_message: string; + waiting_hours: number; + }>; + room_problems?: Array<{ + room_number: string; + issue_type: string; + description: string; + }>; + application_knowledge?: { + features: string[]; + role_info: Record; + }; +} + +export interface OccupiedRoom { + room_number: string; + room_type: string; + floor: number; + booking_id: number; + guest_name: string; + check_in: string; + check_out: string; +} + +/** + * Send a message to the AI assistant + */ +export const chatWithAI = async ( + message: string, + context?: Record +): Promise => { + const response = await apiClient.post<{ status: string; data: AIChatResponse }>( + '/ai-assistant/chat', + { message, context } + ); + return response.data.data; +}; + +/** + * Get comprehensive system status + */ +export const getAIStatus = async (): Promise => { + const response = await apiClient.get<{ status: string; data: SystemStatus }>( + '/ai-assistant/status' + ); + return response.data.data; +}; + +/** + * Get list of occupied rooms + */ +export const getOccupiedRooms = async ( + roomNumber?: string +): Promise => { + const response = await apiClient.get<{ status: string; data: { rooms: OccupiedRoom[] } }>( + '/ai-assistant/rooms/occupied', + { params: roomNumber ? { room_number: roomNumber } : {} } + ); + return response.data.data.rooms; +}; + +/** + * Get rooms with problems + */ +export const getRoomProblems = async (): Promise> => { + const response = await apiClient.get<{ status: string; data: { problems: any[] } }>( + '/ai-assistant/rooms/problems' + ); + return response.data.data.problems; +}; + +/** + * Get unanswered chat messages + */ +export const getUnansweredChats = async ( + hours: number = 24 +): Promise> => { + const response = await apiClient.get<{ status: string; data: { chats: any[] } }>( + '/ai-assistant/chats/unanswered', + { params: { hours } } + ); + return response.data.data.chats; +}; + diff --git a/Frontend/src/features/ai/services/index.ts b/Frontend/src/features/ai/services/index.ts new file mode 100644 index 00000000..e69de29b diff --git a/Frontend/src/components/analytics/CustomReportBuilder.tsx b/Frontend/src/features/analytics/components/CustomReportBuilder.tsx similarity index 99% rename from Frontend/src/components/analytics/CustomReportBuilder.tsx rename to Frontend/src/features/analytics/components/CustomReportBuilder.tsx index edf17eef..97a428a7 100644 --- a/Frontend/src/components/analytics/CustomReportBuilder.tsx +++ b/Frontend/src/features/analytics/components/CustomReportBuilder.tsx @@ -6,8 +6,8 @@ import { Square, } from 'lucide-react'; import { toast } from 'react-toastify'; -import { exportData } from '../../utils/exportUtils'; -import analyticsService from '../../services/api/analyticsService'; +import { exportData } from '../../../shared/utils/exportUtils'; +import analyticsService from '../services/analyticsService'; interface ReportMetric { id: string; diff --git a/Frontend/src/components/analytics/SimpleChart.tsx b/Frontend/src/features/analytics/components/SimpleChart.tsx similarity index 100% rename from Frontend/src/components/analytics/SimpleChart.tsx rename to Frontend/src/features/analytics/components/SimpleChart.tsx diff --git a/Frontend/src/services/api/analyticsService.ts b/Frontend/src/features/analytics/services/analyticsService.ts similarity index 99% rename from Frontend/src/services/api/analyticsService.ts rename to Frontend/src/features/analytics/services/analyticsService.ts index 38415593..57df24fe 100644 --- a/Frontend/src/services/api/analyticsService.ts +++ b/Frontend/src/features/analytics/services/analyticsService.ts @@ -1,4 +1,4 @@ -import apiClient from './apiClient'; +import apiClient from '../../../shared/services/apiClient'; // ==================== REVENUE ANALYTICS ==================== diff --git a/Frontend/src/services/api/auditService.ts b/Frontend/src/features/analytics/services/auditService.ts similarity index 97% rename from Frontend/src/services/api/auditService.ts rename to Frontend/src/features/analytics/services/auditService.ts index d53e697b..e9d07e88 100644 --- a/Frontend/src/services/api/auditService.ts +++ b/Frontend/src/features/analytics/services/auditService.ts @@ -1,4 +1,4 @@ -import apiClient from './apiClient'; +import apiClient from '../../../shared/services/apiClient'; export interface AuditLog { id: number; diff --git a/Frontend/src/services/api/dashboardService.ts b/Frontend/src/features/analytics/services/dashboardService.ts similarity index 94% rename from Frontend/src/services/api/dashboardService.ts rename to Frontend/src/features/analytics/services/dashboardService.ts index cffebaeb..44dfef93 100644 --- a/Frontend/src/services/api/dashboardService.ts +++ b/Frontend/src/features/analytics/services/dashboardService.ts @@ -1,4 +1,4 @@ -import apiClient from './apiClient'; +import apiClient from '../../../shared/services/apiClient'; export interface CustomerDashboardStats { total_bookings: number; diff --git a/Frontend/src/features/analytics/services/index.ts b/Frontend/src/features/analytics/services/index.ts new file mode 100644 index 00000000..e69de29b diff --git a/Frontend/src/services/api/reportService.ts b/Frontend/src/features/analytics/services/reportService.ts similarity index 97% rename from Frontend/src/services/api/reportService.ts rename to Frontend/src/features/analytics/services/reportService.ts index f91a5607..38a3e1b0 100644 --- a/Frontend/src/services/api/reportService.ts +++ b/Frontend/src/features/analytics/services/reportService.ts @@ -1,4 +1,4 @@ -import apiClient from './apiClient'; +import apiClient from '../../../shared/services/apiClient'; export interface ReportData { total_bookings: number; diff --git a/Frontend/src/components/auth/AccountantRoute.tsx b/Frontend/src/features/auth/components/AccountantRoute.tsx similarity index 93% rename from Frontend/src/components/auth/AccountantRoute.tsx rename to Frontend/src/features/auth/components/AccountantRoute.tsx index 5317983f..b561e254 100644 --- a/Frontend/src/components/auth/AccountantRoute.tsx +++ b/Frontend/src/features/auth/components/AccountantRoute.tsx @@ -1,7 +1,7 @@ import React, { useEffect } from 'react'; import { Navigate } from 'react-router-dom'; -import useAuthStore from '../../store/useAuthStore'; -import { useAuthModal } from '../../contexts/AuthModalContext'; +import useAuthStore from '../../../store/useAuthStore'; +import { useAuthModal } from '../contexts/AuthModalContext'; interface AccountantRouteProps { children: React.ReactNode; diff --git a/Frontend/src/components/auth/AdminRoute.tsx b/Frontend/src/features/auth/components/AdminRoute.tsx similarity index 92% rename from Frontend/src/components/auth/AdminRoute.tsx rename to Frontend/src/features/auth/components/AdminRoute.tsx index 3df428e1..37b7b34a 100644 --- a/Frontend/src/components/auth/AdminRoute.tsx +++ b/Frontend/src/features/auth/components/AdminRoute.tsx @@ -1,7 +1,7 @@ import React, { useEffect } from 'react'; import { Navigate } from 'react-router-dom'; -import useAuthStore from '../../store/useAuthStore'; -import { useAuthModal } from '../../contexts/AuthModalContext'; +import useAuthStore from '../../../store/useAuthStore'; +import { useAuthModal } from '../contexts/AuthModalContext'; interface AdminRouteProps { children: React.ReactNode; diff --git a/Frontend/src/components/modals/AuthModalManager.tsx b/Frontend/src/features/auth/components/AuthModalManager.tsx similarity index 91% rename from Frontend/src/components/modals/AuthModalManager.tsx rename to Frontend/src/features/auth/components/AuthModalManager.tsx index da51b10e..778c32e9 100644 --- a/Frontend/src/components/modals/AuthModalManager.tsx +++ b/Frontend/src/features/auth/components/AuthModalManager.tsx @@ -1,10 +1,10 @@ import React, { useEffect } from 'react'; -import { useAuthModal } from '../../contexts/AuthModalContext'; +import { useAuthModal } from '../contexts/AuthModalContext'; import LoginModal from './LoginModal'; import RegisterModal from './RegisterModal'; import ForgotPasswordModal from './ForgotPasswordModal'; import ResetPasswordModal from './ResetPasswordModal'; -import useAuthStore from '../../store/useAuthStore'; +import useAuthStore from '../../../store/useAuthStore'; const AuthModalManager: React.FC = () => { const { isOpen, modalType, resetPasswordParams, openModal } = useAuthModal(); diff --git a/Frontend/src/components/auth/CustomerRoute.tsx b/Frontend/src/features/auth/components/CustomerRoute.tsx similarity index 93% rename from Frontend/src/components/auth/CustomerRoute.tsx rename to Frontend/src/features/auth/components/CustomerRoute.tsx index 3c2b86c9..d6dde499 100644 --- a/Frontend/src/components/auth/CustomerRoute.tsx +++ b/Frontend/src/features/auth/components/CustomerRoute.tsx @@ -1,7 +1,7 @@ import React, { useEffect } from 'react'; import { Navigate } from 'react-router-dom'; -import useAuthStore from '../../store/useAuthStore'; -import { useAuthModal } from '../../contexts/AuthModalContext'; +import useAuthStore from '../../../store/useAuthStore'; +import { useAuthModal } from '../contexts/AuthModalContext'; interface CustomerRouteProps { children: React.ReactNode; diff --git a/Frontend/src/components/modals/ForgotPasswordModal.tsx b/Frontend/src/features/auth/components/ForgotPasswordModal.tsx similarity index 97% rename from Frontend/src/components/modals/ForgotPasswordModal.tsx rename to Frontend/src/features/auth/components/ForgotPasswordModal.tsx index c66c3ea5..62374f45 100644 --- a/Frontend/src/components/modals/ForgotPasswordModal.tsx +++ b/Frontend/src/features/auth/components/ForgotPasswordModal.tsx @@ -2,12 +2,12 @@ import React, { useState, useEffect } from 'react'; import { useForm } from 'react-hook-form'; import { yupResolver } from '@hookform/resolvers/yup'; import { X, Mail, ArrowLeft, Send, Loader2, CheckCircle } from 'lucide-react'; -import useAuthStore from '../../store/useAuthStore'; -import { forgotPasswordSchema, ForgotPasswordFormData } from '../../utils/validationSchemas'; -import { useCompanySettings } from '../../contexts/CompanySettingsContext'; -import { useAuthModal } from '../../contexts/AuthModalContext'; -import { useAntibotForm } from '../../hooks/useAntibotForm'; -import HoneypotField from '../common/HoneypotField'; +import useAuthStore from '../../../store/useAuthStore'; +import { forgotPasswordSchema, ForgotPasswordFormData } from '../../../shared/utils/validationSchemas'; +import { useCompanySettings } from '../../../shared/contexts/CompanySettingsContext'; +import { useAuthModal } from '../contexts/AuthModalContext'; +import { useAntibotForm } from '../hooks/useAntibotForm'; +import HoneypotField from '../../../shared/components/HoneypotField'; import { toast } from 'react-toastify'; const ForgotPasswordModal: React.FC = () => { diff --git a/Frontend/src/components/modals/LoginModal.tsx b/Frontend/src/features/auth/components/LoginModal.tsx similarity index 96% rename from Frontend/src/components/modals/LoginModal.tsx rename to Frontend/src/features/auth/components/LoginModal.tsx index 239cb881..b8e7eabe 100644 --- a/Frontend/src/components/modals/LoginModal.tsx +++ b/Frontend/src/features/auth/components/LoginModal.tsx @@ -2,16 +2,16 @@ import React, { useState, useEffect } from 'react'; import { useForm } from 'react-hook-form'; import { yupResolver } from '@hookform/resolvers/yup'; import { X, Eye, EyeOff, LogIn, Loader2, Mail, Lock, Shield, ArrowLeft } from 'lucide-react'; -import useAuthStore from '../../store/useAuthStore'; -import { loginSchema, LoginFormData } from '../../utils/validationSchemas'; -import { useCompanySettings } from '../../contexts/CompanySettingsContext'; -import { useAuthModal } from '../../contexts/AuthModalContext'; +import useAuthStore from '../../../store/useAuthStore'; +import { loginSchema, LoginFormData } from '../../../shared/utils/validationSchemas'; +import { useCompanySettings } from '../../../shared/contexts/CompanySettingsContext'; +import { useAuthModal } from '../contexts/AuthModalContext'; import * as yup from 'yup'; import { toast } from 'react-toastify'; -import Recaptcha from '../common/Recaptcha'; -import { recaptchaService } from '../../services/api/systemSettingsService'; -import { useAntibotForm } from '../../hooks/useAntibotForm'; -import HoneypotField from '../common/HoneypotField'; +import Recaptcha from '../../../shared/components/Recaptcha'; +import { recaptchaService } from '../../../features/system/services/systemSettingsService'; +import { useAntibotForm } from '../hooks/useAntibotForm'; +import HoneypotField from '../../../shared/components/HoneypotField'; const mfaTokenSchema = yup.object().shape({ mfaToken: yup diff --git a/Frontend/src/components/auth/ProtectedRoute.tsx b/Frontend/src/features/auth/components/ProtectedRoute.tsx similarity index 89% rename from Frontend/src/components/auth/ProtectedRoute.tsx rename to Frontend/src/features/auth/components/ProtectedRoute.tsx index cf2ee9ad..619a00d7 100644 --- a/Frontend/src/components/auth/ProtectedRoute.tsx +++ b/Frontend/src/features/auth/components/ProtectedRoute.tsx @@ -1,6 +1,6 @@ import React, { useEffect } from 'react'; -import useAuthStore from '../../store/useAuthStore'; -import { useAuthModal } from '../../contexts/AuthModalContext'; +import useAuthStore from '../../../store/useAuthStore'; +import { useAuthModal } from '../contexts/AuthModalContext'; interface ProtectedRouteProps { children: React.ReactNode; diff --git a/Frontend/src/components/modals/RegisterModal.tsx b/Frontend/src/features/auth/components/RegisterModal.tsx similarity index 96% rename from Frontend/src/components/modals/RegisterModal.tsx rename to Frontend/src/features/auth/components/RegisterModal.tsx index c14a580a..56147636 100644 --- a/Frontend/src/components/modals/RegisterModal.tsx +++ b/Frontend/src/features/auth/components/RegisterModal.tsx @@ -2,15 +2,15 @@ import React, { useState, useEffect } from 'react'; import { useForm } from 'react-hook-form'; import { yupResolver } from '@hookform/resolvers/yup'; import { X, Eye, EyeOff, UserPlus, Loader2, Mail, Lock, User, Phone, CheckCircle2, XCircle } from 'lucide-react'; -import useAuthStore from '../../store/useAuthStore'; -import { registerSchema, RegisterFormData } from '../../utils/validationSchemas'; -import { useCompanySettings } from '../../contexts/CompanySettingsContext'; -import { useAuthModal } from '../../contexts/AuthModalContext'; +import useAuthStore from '../../../store/useAuthStore'; +import { registerSchema, RegisterFormData } from '../../../shared/utils/validationSchemas'; +import { useCompanySettings } from '../../../shared/contexts/CompanySettingsContext'; +import { useAuthModal } from '../contexts/AuthModalContext'; import { toast } from 'react-toastify'; -import Recaptcha from '../common/Recaptcha'; -import { recaptchaService } from '../../services/api/systemSettingsService'; -import { useAntibotForm } from '../../hooks/useAntibotForm'; -import HoneypotField from '../common/HoneypotField'; +import Recaptcha from '../../../shared/components/Recaptcha'; +import { recaptchaService } from '../../system/services/systemSettingsService'; +import { useAntibotForm } from '../hooks/useAntibotForm'; +import HoneypotField from '../../../shared/components/HoneypotField'; const PasswordRequirement: React.FC<{ met: boolean; text: string }> = ({ met, text }) => (
diff --git a/Frontend/src/components/modals/ResetPasswordModal.tsx b/Frontend/src/features/auth/components/ResetPasswordModal.tsx similarity index 98% rename from Frontend/src/components/modals/ResetPasswordModal.tsx rename to Frontend/src/features/auth/components/ResetPasswordModal.tsx index 4c943070..ad0007a8 100644 --- a/Frontend/src/components/modals/ResetPasswordModal.tsx +++ b/Frontend/src/features/auth/components/ResetPasswordModal.tsx @@ -2,10 +2,10 @@ import React, { useState, useEffect } from 'react'; import { useForm } from 'react-hook-form'; import { yupResolver } from '@hookform/resolvers/yup'; import { X, Eye, EyeOff, Lock, Loader2, CheckCircle2, XCircle, AlertCircle, KeyRound } from 'lucide-react'; -import useAuthStore from '../../store/useAuthStore'; -import { resetPasswordSchema, ResetPasswordFormData } from '../../utils/validationSchemas'; -import { useCompanySettings } from '../../contexts/CompanySettingsContext'; -import { useAuthModal } from '../../contexts/AuthModalContext'; +import useAuthStore from '../../../store/useAuthStore'; +import { resetPasswordSchema, ResetPasswordFormData } from '../../../shared/utils/validationSchemas'; +import { useCompanySettings } from '../../../shared/contexts/CompanySettingsContext'; +import { useAuthModal } from '../contexts/AuthModalContext'; const PasswordRequirement: React.FC<{ met: boolean; text: string }> = ({ met, text }) => (
diff --git a/Frontend/src/components/auth/ResetPasswordRouteHandler.tsx b/Frontend/src/features/auth/components/ResetPasswordRouteHandler.tsx similarity index 88% rename from Frontend/src/components/auth/ResetPasswordRouteHandler.tsx rename to Frontend/src/features/auth/components/ResetPasswordRouteHandler.tsx index 505c087a..78fcc259 100644 --- a/Frontend/src/components/auth/ResetPasswordRouteHandler.tsx +++ b/Frontend/src/features/auth/components/ResetPasswordRouteHandler.tsx @@ -1,6 +1,6 @@ import { useEffect } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; -import { useAuthModal } from '../../contexts/AuthModalContext'; +import { useAuthModal } from '../contexts/AuthModalContext'; const ResetPasswordRouteHandler: React.FC = () => { const { token } = useParams<{ token: string }>(); diff --git a/Frontend/src/components/auth/StaffRoute.tsx b/Frontend/src/features/auth/components/StaffRoute.tsx similarity index 92% rename from Frontend/src/components/auth/StaffRoute.tsx rename to Frontend/src/features/auth/components/StaffRoute.tsx index 04381ec6..3d1ef361 100644 --- a/Frontend/src/components/auth/StaffRoute.tsx +++ b/Frontend/src/features/auth/components/StaffRoute.tsx @@ -1,7 +1,7 @@ import React, { useEffect } from 'react'; import { Navigate } from 'react-router-dom'; -import useAuthStore from '../../store/useAuthStore'; -import { useAuthModal } from '../../contexts/AuthModalContext'; +import useAuthStore from '../../../store/useAuthStore'; +import { useAuthModal } from '../contexts/AuthModalContext'; interface StaffRouteProps { children: React.ReactNode; diff --git a/Frontend/src/components/auth/index.ts b/Frontend/src/features/auth/components/index.ts similarity index 100% rename from Frontend/src/components/auth/index.ts rename to Frontend/src/features/auth/components/index.ts diff --git a/Frontend/src/contexts/AntibotContext.tsx b/Frontend/src/features/auth/contexts/AntibotContext.tsx similarity index 99% rename from Frontend/src/contexts/AntibotContext.tsx rename to Frontend/src/features/auth/contexts/AntibotContext.tsx index 6eb9662e..cfc08268 100644 --- a/Frontend/src/contexts/AntibotContext.tsx +++ b/Frontend/src/features/auth/contexts/AntibotContext.tsx @@ -8,7 +8,7 @@ import { clearRateLimit, getFingerprintHash, type AntibotValidationResult, -} from '../utils/antibot'; +} from '../../../shared/utils/antibot'; interface AntibotContextType { timing: FormTiming; diff --git a/Frontend/src/contexts/AuthModalContext.tsx b/Frontend/src/features/auth/contexts/AuthModalContext.tsx similarity index 100% rename from Frontend/src/contexts/AuthModalContext.tsx rename to Frontend/src/features/auth/contexts/AuthModalContext.tsx diff --git a/Frontend/src/hooks/useAntibotForm.ts b/Frontend/src/features/auth/hooks/useAntibotForm.ts similarity index 100% rename from Frontend/src/hooks/useAntibotForm.ts rename to Frontend/src/features/auth/hooks/useAntibotForm.ts diff --git a/Frontend/src/services/api/authService.ts b/Frontend/src/features/auth/services/authService.ts similarity index 98% rename from Frontend/src/services/api/authService.ts rename to Frontend/src/features/auth/services/authService.ts index 681d003f..33b58150 100644 --- a/Frontend/src/services/api/authService.ts +++ b/Frontend/src/features/auth/services/authService.ts @@ -1,4 +1,4 @@ -import apiClient from './apiClient'; +import apiClient from '../../../shared/services/apiClient'; export interface LoginCredentials { email: string; diff --git a/Frontend/src/features/auth/services/index.ts b/Frontend/src/features/auth/services/index.ts new file mode 100644 index 00000000..b7b05bf6 --- /dev/null +++ b/Frontend/src/features/auth/services/index.ts @@ -0,0 +1,3 @@ +// Auth services +export * from './authService'; +export * from './userService'; diff --git a/Frontend/src/services/api/userService.ts b/Frontend/src/features/auth/services/userService.ts similarity index 98% rename from Frontend/src/services/api/userService.ts rename to Frontend/src/features/auth/services/userService.ts index 2667a5e7..b43afa38 100644 --- a/Frontend/src/services/api/userService.ts +++ b/Frontend/src/features/auth/services/userService.ts @@ -1,4 +1,4 @@ -import apiClient from './apiClient'; +import apiClient from '../../../shared/services/apiClient'; export interface User { id: number; diff --git a/Frontend/src/components/booking/CancelBookingModal.tsx b/Frontend/src/features/bookings/components/CancelBookingModal.tsx similarity index 98% rename from Frontend/src/components/booking/CancelBookingModal.tsx rename to Frontend/src/features/bookings/components/CancelBookingModal.tsx index 3d306afe..09695787 100644 --- a/Frontend/src/components/booking/CancelBookingModal.tsx +++ b/Frontend/src/features/bookings/components/CancelBookingModal.tsx @@ -1,8 +1,8 @@ import React, { useState } from 'react'; import { X, AlertTriangle, XCircle, Loader2, Info } from 'lucide-react'; -import { cancelBooking, type Booking } from '../../services/api/bookingService'; +import { cancelBooking, type Booking } from '../services/bookingService'; import { toast } from 'react-toastify'; -import { useFormatCurrency } from '../../hooks/useFormatCurrency'; +import { useFormatCurrency } from '../../payments/hooks/useFormatCurrency'; interface CancelBookingModalProps { isOpen: boolean; diff --git a/Frontend/src/components/booking/InvoiceInfoModal.tsx b/Frontend/src/features/bookings/components/InvoiceInfoModal.tsx similarity index 100% rename from Frontend/src/components/booking/InvoiceInfoModal.tsx rename to Frontend/src/features/bookings/components/InvoiceInfoModal.tsx diff --git a/Frontend/src/components/booking/LuxuryBookingModal.tsx b/Frontend/src/features/bookings/components/LuxuryBookingModal.tsx similarity index 97% rename from Frontend/src/components/booking/LuxuryBookingModal.tsx rename to Frontend/src/features/bookings/components/LuxuryBookingModal.tsx index 702fccc3..c8b39f3a 100644 --- a/Frontend/src/components/booking/LuxuryBookingModal.tsx +++ b/Frontend/src/features/bookings/components/LuxuryBookingModal.tsx @@ -18,28 +18,29 @@ import { Receipt, } from 'lucide-react'; import { toast } from 'react-toastify'; -import { getRoomById, getRoomBookedDates, type Room } from '../../services/api/roomService'; +import { getRoomById, getRoomBookedDates, type Room } from '../../rooms/services/roomService'; import { createBooking, checkRoomAvailability, type BookingData, -} from '../../services/api/bookingService'; -import { serviceService, Service, promotionService, Promotion } from '../../services/api'; -import useAuthStore from '../../store/useAuthStore'; +} from '../services/bookingService'; +import serviceService, { Service } from '../../hotel_services/services/serviceService'; +import promotionService, { Promotion } from '../../loyalty/services/promotionService'; +import useAuthStore from '../../../store/useAuthStore'; import { bookingValidationSchema, type BookingFormData, -} from '../../validators/bookingValidator'; -import { useFormatCurrency } from '../../hooks/useFormatCurrency'; -import { formatDateLocal } from '../../utils/format'; -import Recaptcha from '../common/Recaptcha'; -import { recaptchaService } from '../../services/api/systemSettingsService'; -import StripePaymentModal from '../payments/StripePaymentModal'; -import PayPalPaymentModal from '../payments/PayPalPaymentModal'; -import CashPaymentModal from '../payments/CashPaymentModal'; -import InvoiceInfoModal from '../booking/InvoiceInfoModal'; -import { useAntibotForm } from '../../hooks/useAntibotForm'; -import HoneypotField from '../common/HoneypotField'; +} from '../../../shared/utils/bookingValidator'; +import { useFormatCurrency } from '../../payments/hooks/useFormatCurrency'; +import { formatDateLocal } from '../../../shared/utils/format'; +import Recaptcha from '../../../shared/components/Recaptcha'; +import { recaptchaService } from '../../../features/system/services/systemSettingsService'; +import StripePaymentModal from '../../payments/components/StripePaymentModal'; +import PayPalPaymentModal from '../../payments/components/PayPalPaymentModal'; +import CashPaymentModal from '../../payments/components/CashPaymentModal'; +import InvoiceInfoModal from './InvoiceInfoModal'; +import { useAntibotForm } from '../../auth/hooks/useAntibotForm'; +import HoneypotField from '../../../shared/components/HoneypotField'; interface LuxuryBookingModalProps { roomId: number; @@ -443,7 +444,7 @@ const LuxuryBookingModal: React.FC = ({ if (createdBookingId) { // Check booking status before showing success toast try { - const { getBookingById } = await import('../../services/api/bookingService'); + const { getBookingById } = await import('../services/bookingService'); const bookingResponse = await getBookingById(createdBookingId); if (bookingResponse.success && bookingResponse.data?.booking) { const booking = bookingResponse.data.booking; diff --git a/Frontend/src/services/api/bookingService.ts b/Frontend/src/features/bookings/services/bookingService.ts similarity index 99% rename from Frontend/src/services/api/bookingService.ts rename to Frontend/src/features/bookings/services/bookingService.ts index 85e541c6..0da6d400 100644 --- a/Frontend/src/services/api/bookingService.ts +++ b/Frontend/src/features/bookings/services/bookingService.ts @@ -1,4 +1,4 @@ -import apiClient from './apiClient'; +import apiClient from '../../../shared/services/apiClient'; export interface BookingData { room_id: number; diff --git a/Frontend/src/services/api/groupBookingService.ts b/Frontend/src/features/bookings/services/groupBookingService.ts similarity index 99% rename from Frontend/src/services/api/groupBookingService.ts rename to Frontend/src/features/bookings/services/groupBookingService.ts index 75f438b4..94f9cc1a 100644 --- a/Frontend/src/services/api/groupBookingService.ts +++ b/Frontend/src/features/bookings/services/groupBookingService.ts @@ -1,4 +1,4 @@ -import apiClient from './apiClient'; +import apiClient from '../../../shared/services/apiClient'; export interface RoomBlock { room_type_id: number; diff --git a/Frontend/src/features/bookings/services/index.ts b/Frontend/src/features/bookings/services/index.ts new file mode 100644 index 00000000..e69de29b diff --git a/Frontend/src/pages/AboutPage.tsx b/Frontend/src/features/content/pages/AboutPage.tsx similarity index 99% rename from Frontend/src/pages/AboutPage.tsx rename to Frontend/src/features/content/pages/AboutPage.tsx index 3d3e1251..978d8ff4 100644 --- a/Frontend/src/pages/AboutPage.tsx +++ b/Frontend/src/features/content/pages/AboutPage.tsx @@ -10,10 +10,10 @@ import { } from 'lucide-react'; import * as LucideIcons from 'lucide-react'; import { Link } from 'react-router-dom'; -import { pageContentService } from '../services/api'; -import type { PageContent } from '../services/api/pageContentService'; -import { useCompanySettings } from '../contexts/CompanySettingsContext'; -import { createSanitizedHtml } from '../utils/htmlSanitizer'; +import pageContentService from '../services/pageContentService'; +import type { PageContent } from '../services/pageContentService'; +import { useCompanySettings } from '../../../shared/contexts/CompanySettingsContext'; +import { createSanitizedHtml } from '../../../shared/utils/htmlSanitizer'; const AboutPage: React.FC = () => { const { settings } = useCompanySettings(); diff --git a/Frontend/src/pages/AccessibilityPage.tsx b/Frontend/src/features/content/pages/AccessibilityPage.tsx similarity index 95% rename from Frontend/src/pages/AccessibilityPage.tsx rename to Frontend/src/features/content/pages/AccessibilityPage.tsx index d8f3880b..b5355542 100644 --- a/Frontend/src/pages/AccessibilityPage.tsx +++ b/Frontend/src/features/content/pages/AccessibilityPage.tsx @@ -1,11 +1,11 @@ import React, { useState, useEffect } from 'react'; import { Accessibility, ArrowLeft } from 'lucide-react'; import { Link } from 'react-router-dom'; -import { pageContentService } from '../services/api'; -import type { PageContent } from '../services/api/pageContentService'; -import { useCompanySettings } from '../contexts/CompanySettingsContext'; -import Loading from '../components/common/Loading'; -import { createSanitizedHtml } from '../utils/htmlSanitizer'; +import pageContentService from '../services/pageContentService'; +import type { PageContent } from '../services/pageContentService'; +import { useCompanySettings } from '../../../shared/contexts/CompanySettingsContext'; +import Loading from '../../../shared/components/Loading'; +import { createSanitizedHtml } from '../../../shared/utils/htmlSanitizer'; const AccessibilityPage: React.FC = () => { const { settings } = useCompanySettings(); diff --git a/Frontend/src/pages/BlogDetailPage.tsx b/Frontend/src/features/content/pages/BlogDetailPage.tsx similarity index 98% rename from Frontend/src/pages/BlogDetailPage.tsx rename to Frontend/src/features/content/pages/BlogDetailPage.tsx index cff32fdd..87672ede 100644 --- a/Frontend/src/pages/BlogDetailPage.tsx +++ b/Frontend/src/features/content/pages/BlogDetailPage.tsx @@ -1,9 +1,9 @@ import React, { useState, useEffect } from 'react'; import { useParams, Link, useNavigate } from 'react-router-dom'; import { Calendar, User, Tag, ArrowLeft, Eye, Share2, ArrowRight } from 'lucide-react'; -import { blogService, BlogPost } from '../services/api'; -import Loading from '../components/common/Loading'; -import { createSanitizedHtml } from '../utils/htmlSanitizer'; +import blogService, { BlogPost } from '../services/blogService'; +import Loading from '../../../shared/components/Loading'; +import { createSanitizedHtml } from '../../../shared/utils/htmlSanitizer'; const BlogDetailPage: React.FC = () => { const { slug } = useParams<{ slug: string }>(); diff --git a/Frontend/src/pages/BlogPage.tsx b/Frontend/src/features/content/pages/BlogPage.tsx similarity index 98% rename from Frontend/src/pages/BlogPage.tsx rename to Frontend/src/features/content/pages/BlogPage.tsx index c2c360aa..b1548554 100644 --- a/Frontend/src/pages/BlogPage.tsx +++ b/Frontend/src/features/content/pages/BlogPage.tsx @@ -1,9 +1,9 @@ import React, { useState, useEffect } from 'react'; import { Link } from 'react-router-dom'; import { Calendar, User, Tag, Search, ArrowRight, Eye, Sparkles, BookOpen } from 'lucide-react'; -import { blogService, BlogPost } from '../services/api'; -import Loading from '../components/common/Loading'; -import Pagination from '../components/common/Pagination'; +import blogService, { BlogPost } from '../services/blogService'; +import Loading from '../../../shared/components/Loading'; +import Pagination from '../../../shared/components/Pagination'; const BlogPage: React.FC = () => { const [posts, setPosts] = useState([]); diff --git a/Frontend/src/pages/CancellationPolicyPage.tsx b/Frontend/src/features/content/pages/CancellationPolicyPage.tsx similarity index 95% rename from Frontend/src/pages/CancellationPolicyPage.tsx rename to Frontend/src/features/content/pages/CancellationPolicyPage.tsx index 4aec01f5..ff373e4e 100644 --- a/Frontend/src/pages/CancellationPolicyPage.tsx +++ b/Frontend/src/features/content/pages/CancellationPolicyPage.tsx @@ -1,11 +1,10 @@ import React, { useState, useEffect } from 'react'; import { XCircle, ArrowLeft } from 'lucide-react'; import { Link } from 'react-router-dom'; -import { pageContentService } from '../services/api'; -import type { PageContent } from '../services/api/pageContentService'; -import { useCompanySettings } from '../contexts/CompanySettingsContext'; -import Loading from '../components/common/Loading'; -import { createSanitizedHtml } from '../utils/htmlSanitizer'; +import pageContentService, { PageContent } from '../services/pageContentService'; +import { useCompanySettings } from '../../../shared/contexts/CompanySettingsContext'; +import Loading from '../../../shared/components/Loading'; +import { createSanitizedHtml } from '../../../shared/utils/htmlSanitizer'; const CancellationPolicyPage: React.FC = () => { const { settings } = useCompanySettings(); diff --git a/Frontend/src/pages/ContactPage.tsx b/Frontend/src/features/content/pages/ContactPage.tsx similarity index 97% rename from Frontend/src/pages/ContactPage.tsx rename to Frontend/src/features/content/pages/ContactPage.tsx index cb92488a..b1474784 100644 --- a/Frontend/src/pages/ContactPage.tsx +++ b/Frontend/src/features/content/pages/ContactPage.tsx @@ -1,15 +1,15 @@ import React, { useState, useEffect } from 'react'; import { Mail, Phone, MapPin, Send, User, MessageSquare } from 'lucide-react'; -import { submitContactForm } from '../services/api/contactService'; -import { pageContentService } from '../services/api'; -import type { PageContent } from '../services/api/pageContentService'; -import { useCompanySettings } from '../contexts/CompanySettingsContext'; +import { submitContactForm } from '../services/contactService'; +import pageContentService from '../services/pageContentService'; +import type { PageContent } from '../services/pageContentService'; +import { useCompanySettings } from '../../../shared/contexts/CompanySettingsContext'; import { toast } from 'react-toastify'; -import Recaptcha from '../components/common/Recaptcha'; -import { recaptchaService } from '../services/api/systemSettingsService'; -import ChatWidget from '../components/chat/ChatWidget'; -import { useAntibotForm } from '../hooks/useAntibotForm'; -import HoneypotField from '../components/common/HoneypotField'; +import Recaptcha from '../../../shared/components/Recaptcha'; +import { recaptchaService } from '../../../features/system/services/systemSettingsService'; +import ChatWidget from '../../notifications/components/ChatWidget'; +import { useAntibotForm } from '../../../features/auth/hooks/useAntibotForm'; +import HoneypotField from '../../../shared/components/HoneypotField'; const ContactPage: React.FC = () => { const { settings } = useCompanySettings(); diff --git a/Frontend/src/pages/FAQPage.tsx b/Frontend/src/features/content/pages/FAQPage.tsx similarity index 95% rename from Frontend/src/pages/FAQPage.tsx rename to Frontend/src/features/content/pages/FAQPage.tsx index 653b296b..0732b08b 100644 --- a/Frontend/src/pages/FAQPage.tsx +++ b/Frontend/src/features/content/pages/FAQPage.tsx @@ -1,11 +1,11 @@ import React, { useState, useEffect } from 'react'; import { HelpCircle, ArrowLeft } from 'lucide-react'; import { Link } from 'react-router-dom'; -import { pageContentService } from '../services/api'; -import type { PageContent } from '../services/api/pageContentService'; -import { useCompanySettings } from '../contexts/CompanySettingsContext'; -import Loading from '../components/common/Loading'; -import { createSanitizedHtml } from '../utils/htmlSanitizer'; +import pageContentService from '../services/pageContentService'; +import type { PageContent } from '../services/pageContentService'; +import { useCompanySettings } from '../../../shared/contexts/CompanySettingsContext'; +import Loading from '../../../shared/components/Loading'; +import { createSanitizedHtml } from '../../../shared/utils/htmlSanitizer'; const FAQPage: React.FC = () => { const { settings } = useCompanySettings(); diff --git a/Frontend/src/pages/HomePage.tsx b/Frontend/src/features/content/pages/HomePage.tsx similarity index 99% rename from Frontend/src/pages/HomePage.tsx rename to Frontend/src/features/content/pages/HomePage.tsx index 3b641611..b77a9898 100644 --- a/Frontend/src/pages/HomePage.tsx +++ b/Frontend/src/features/content/pages/HomePage.tsx @@ -15,15 +15,13 @@ import { RoomCardSkeleton, RoomCarousel, SearchRoomForm, -} from '../components/rooms'; -import { - bannerService, - roomService, - pageContentService -} from '../services/api'; -import type { Banner } from '../services/api/bannerService'; -import type { Room } from '../services/api/roomService'; -import type { PageContent } from '../services/api/pageContentService'; +} from '../../rooms/components'; +import bannerService from '../services/bannerService'; +import roomService from '../../rooms/services/roomService'; +import pageContentService from '../services/pageContentService'; +import type { Banner } from '../services/bannerService'; +import type { Room } from '../../rooms/services/roomService'; +import type { PageContent } from '../services/pageContentService'; const HomePage: React.FC = () => { const [banners, setBanners] = useState([]); diff --git a/Frontend/src/pages/PrivacyPolicyPage.tsx b/Frontend/src/features/content/pages/PrivacyPolicyPage.tsx similarity index 95% rename from Frontend/src/pages/PrivacyPolicyPage.tsx rename to Frontend/src/features/content/pages/PrivacyPolicyPage.tsx index 3f18cf89..ac919082 100644 --- a/Frontend/src/pages/PrivacyPolicyPage.tsx +++ b/Frontend/src/features/content/pages/PrivacyPolicyPage.tsx @@ -1,11 +1,11 @@ import React, { useState, useEffect } from 'react'; import { Shield, ArrowLeft } from 'lucide-react'; import { Link } from 'react-router-dom'; -import { pageContentService } from '../services/api'; -import type { PageContent } from '../services/api/pageContentService'; -import { useCompanySettings } from '../contexts/CompanySettingsContext'; -import Loading from '../components/common/Loading'; -import { createSanitizedHtml } from '../utils/htmlSanitizer'; +import pageContentService from '../services/pageContentService'; +import type { PageContent } from '../services/pageContentService'; +import { useCompanySettings } from '../../../shared/contexts/CompanySettingsContext'; +import Loading from '../../../shared/components/Loading'; +import { createSanitizedHtml } from '../../../shared/utils/htmlSanitizer'; const PrivacyPolicyPage: React.FC = () => { const { settings } = useCompanySettings(); diff --git a/Frontend/src/pages/RefundsPolicyPage.tsx b/Frontend/src/features/content/pages/RefundsPolicyPage.tsx similarity index 95% rename from Frontend/src/pages/RefundsPolicyPage.tsx rename to Frontend/src/features/content/pages/RefundsPolicyPage.tsx index 1c80af1b..780c9567 100644 --- a/Frontend/src/pages/RefundsPolicyPage.tsx +++ b/Frontend/src/features/content/pages/RefundsPolicyPage.tsx @@ -1,11 +1,11 @@ import React, { useState, useEffect } from 'react'; import { RefreshCw, ArrowLeft } from 'lucide-react'; import { Link } from 'react-router-dom'; -import { pageContentService } from '../services/api'; -import type { PageContent } from '../services/api/pageContentService'; -import { useCompanySettings } from '../contexts/CompanySettingsContext'; -import Loading from '../components/common/Loading'; -import { createSanitizedHtml } from '../utils/htmlSanitizer'; +import pageContentService from '../services/pageContentService'; +import type { PageContent } from '../services/pageContentService'; +import { useCompanySettings } from '../../../shared/contexts/CompanySettingsContext'; +import Loading from '../../../shared/components/Loading'; +import { createSanitizedHtml } from '../../../shared/utils/htmlSanitizer'; const RefundsPolicyPage: React.FC = () => { const { settings } = useCompanySettings(); diff --git a/Frontend/src/pages/TermsPage.tsx b/Frontend/src/features/content/pages/TermsPage.tsx similarity index 95% rename from Frontend/src/pages/TermsPage.tsx rename to Frontend/src/features/content/pages/TermsPage.tsx index 6a12103c..a3f6be79 100644 --- a/Frontend/src/pages/TermsPage.tsx +++ b/Frontend/src/features/content/pages/TermsPage.tsx @@ -1,11 +1,11 @@ import React, { useState, useEffect } from 'react'; import { Scale, ArrowLeft } from 'lucide-react'; import { Link } from 'react-router-dom'; -import { pageContentService } from '../services/api'; -import type { PageContent } from '../services/api/pageContentService'; -import { useCompanySettings } from '../contexts/CompanySettingsContext'; -import Loading from '../components/common/Loading'; -import { createSanitizedHtml } from '../utils/htmlSanitizer'; +import pageContentService from '../services/pageContentService'; +import type { PageContent } from '../services/pageContentService'; +import { useCompanySettings } from '../../../shared/contexts/CompanySettingsContext'; +import Loading from '../../../shared/components/Loading'; +import { createSanitizedHtml } from '../../../shared/utils/htmlSanitizer'; const TermsPage: React.FC = () => { const { settings } = useCompanySettings(); diff --git a/Frontend/src/services/api/adminPrivacyService.ts b/Frontend/src/features/content/services/adminPrivacyService.ts similarity index 96% rename from Frontend/src/services/api/adminPrivacyService.ts rename to Frontend/src/features/content/services/adminPrivacyService.ts index f66f97f4..93eb7e64 100644 --- a/Frontend/src/services/api/adminPrivacyService.ts +++ b/Frontend/src/features/content/services/adminPrivacyService.ts @@ -1,4 +1,4 @@ -import apiClient from './apiClient'; +import apiClient from '../../../shared/services/apiClient'; export type CookiePolicySettings = { analytics_enabled: boolean; diff --git a/Frontend/src/services/api/bannerService.ts b/Frontend/src/features/content/services/bannerService.ts similarity index 98% rename from Frontend/src/services/api/bannerService.ts rename to Frontend/src/features/content/services/bannerService.ts index 95fe5f91..64b0d7c1 100644 --- a/Frontend/src/services/api/bannerService.ts +++ b/Frontend/src/features/content/services/bannerService.ts @@ -1,4 +1,4 @@ -import apiClient from './apiClient'; +import apiClient from '../../../shared/services/apiClient'; export interface Banner { id: number; diff --git a/Frontend/src/services/api/blogService.ts b/Frontend/src/features/content/services/blogService.ts similarity index 98% rename from Frontend/src/services/api/blogService.ts rename to Frontend/src/features/content/services/blogService.ts index 8def7620..d6d7df85 100644 --- a/Frontend/src/services/api/blogService.ts +++ b/Frontend/src/features/content/services/blogService.ts @@ -1,4 +1,4 @@ -import apiClient from './apiClient'; +import apiClient from '../../../shared/services/apiClient'; export interface BlogSection { type: 'hero' | 'text' | 'image' | 'gallery' | 'quote' | 'features' | 'cta' | 'video'; diff --git a/Frontend/src/services/api/contactService.ts b/Frontend/src/features/content/services/contactService.ts similarity index 88% rename from Frontend/src/services/api/contactService.ts rename to Frontend/src/features/content/services/contactService.ts index 48224afe..8144c936 100644 --- a/Frontend/src/services/api/contactService.ts +++ b/Frontend/src/features/content/services/contactService.ts @@ -1,4 +1,4 @@ -import apiClient from './apiClient'; +import apiClient from '../../../shared/services/apiClient'; export interface ContactFormData { name: string; diff --git a/Frontend/src/features/content/services/index.ts b/Frontend/src/features/content/services/index.ts new file mode 100644 index 00000000..e69de29b diff --git a/Frontend/src/services/api/pageContentService.ts b/Frontend/src/features/content/services/pageContentService.ts similarity index 99% rename from Frontend/src/services/api/pageContentService.ts rename to Frontend/src/features/content/services/pageContentService.ts index 3aef89cb..36b92d1f 100644 --- a/Frontend/src/services/api/pageContentService.ts +++ b/Frontend/src/features/content/services/pageContentService.ts @@ -1,4 +1,4 @@ -import apiClient from './apiClient'; +import apiClient from '../../../shared/services/apiClient'; export type PageType = 'home' | 'contact' | 'about' | 'footer' | 'seo' | 'privacy' | 'terms' | 'refunds' | 'cancellation' | 'accessibility' | 'faq'; diff --git a/Frontend/src/services/api/privacyService.ts b/Frontend/src/features/content/services/privacyService.ts similarity index 96% rename from Frontend/src/services/api/privacyService.ts rename to Frontend/src/features/content/services/privacyService.ts index b9c61391..53e6a6ee 100644 --- a/Frontend/src/services/api/privacyService.ts +++ b/Frontend/src/features/content/services/privacyService.ts @@ -1,4 +1,4 @@ -import apiClient from './apiClient'; +import apiClient from '../../../shared/services/apiClient'; export type CookieCategoryPreferences = { necessary: boolean; diff --git a/Frontend/src/services/api/guestProfileService.ts b/Frontend/src/features/guest_management/services/guestProfileService.ts similarity index 99% rename from Frontend/src/services/api/guestProfileService.ts rename to Frontend/src/features/guest_management/services/guestProfileService.ts index 7a93fd1c..f5ce03cf 100644 --- a/Frontend/src/services/api/guestProfileService.ts +++ b/Frontend/src/features/guest_management/services/guestProfileService.ts @@ -1,4 +1,4 @@ -import apiClient from './apiClient'; +import apiClient from '../../../shared/services/apiClient'; export interface GuestPreference { preferred_room_location?: string; diff --git a/Frontend/src/features/guest_management/services/index.ts b/Frontend/src/features/guest_management/services/index.ts new file mode 100644 index 00000000..e69de29b diff --git a/Frontend/src/components/shared/CreateBookingModal.tsx b/Frontend/src/features/hotel_services/components/CreateBookingModal.tsx similarity index 98% rename from Frontend/src/components/shared/CreateBookingModal.tsx rename to Frontend/src/features/hotel_services/components/CreateBookingModal.tsx index c366eb4f..c0c61a65 100644 --- a/Frontend/src/components/shared/CreateBookingModal.tsx +++ b/Frontend/src/features/hotel_services/components/CreateBookingModal.tsx @@ -1,10 +1,12 @@ import React, { useState, useEffect } from 'react'; import { X, Search, Calendar, Users, DollarSign, CreditCard, FileText, User } from 'lucide-react'; -import { bookingService, roomService, userService } from '../../services/api'; -import type { Room } from '../../services/api/roomService'; -import type { User as UserType } from '../../services/api/userService'; +import bookingService from '../../bookings/services/bookingService'; +import roomService from '../../rooms/services/roomService'; +import userService from '../../auth/services/userService'; +import type { Room } from '../../rooms/services/roomService'; +import type { User as UserType } from '../../auth/services/userService'; import { toast } from 'react-toastify'; -import { useFormatCurrency } from '../../hooks/useFormatCurrency'; +import { useFormatCurrency } from '../../payments/hooks/useFormatCurrency'; import DatePicker from 'react-datepicker'; import 'react-datepicker/dist/react-datepicker.css'; diff --git a/Frontend/src/components/shared/CreateGroupBookingModal.tsx b/Frontend/src/features/hotel_services/components/CreateGroupBookingModal.tsx similarity index 99% rename from Frontend/src/components/shared/CreateGroupBookingModal.tsx rename to Frontend/src/features/hotel_services/components/CreateGroupBookingModal.tsx index 3ad89cd8..189f5d3b 100644 --- a/Frontend/src/components/shared/CreateGroupBookingModal.tsx +++ b/Frontend/src/features/hotel_services/components/CreateGroupBookingModal.tsx @@ -1,8 +1,9 @@ import React, { useState, useEffect } from 'react'; import { X, Plus, Trash2, Calendar, DollarSign, FileText, Building2, Loader2 } from 'lucide-react'; -import { groupBookingService, roomService, Room } from '../../services/api'; +import groupBookingService from '../../bookings/services/groupBookingService'; +import roomService, { Room } from '../../rooms/services/roomService'; import { toast } from 'react-toastify'; -import { useFormatCurrency } from '../../hooks/useFormatCurrency'; +import { useFormatCurrency } from '../../payments/hooks/useFormatCurrency'; import DatePicker from 'react-datepicker'; import 'react-datepicker/dist/react-datepicker.css'; diff --git a/Frontend/src/components/shared/HousekeepingManagement.tsx b/Frontend/src/features/hotel_services/components/HousekeepingManagement.tsx similarity index 98% rename from Frontend/src/components/shared/HousekeepingManagement.tsx rename to Frontend/src/features/hotel_services/components/HousekeepingManagement.tsx index afcdd312..340d3b0c 100644 --- a/Frontend/src/components/shared/HousekeepingManagement.tsx +++ b/Frontend/src/features/hotel_services/components/HousekeepingManagement.tsx @@ -9,12 +9,12 @@ import { Clock, } from 'lucide-react'; import { toast } from 'react-toastify'; -import Loading from '../common/Loading'; -import Pagination from '../common/Pagination'; -import advancedRoomService, { HousekeepingTask, ChecklistItem } from '../../services/api/advancedRoomService'; -import { roomService, Room } from '../../services/api'; -import { userService, User as UserType } from '../../services/api'; -import useAuthStore from '../../store/useAuthStore'; +import Loading from '../../../shared/components/Loading'; +import Pagination from '../../../shared/components/Pagination'; +import advancedRoomService, { HousekeepingTask, ChecklistItem } from '../../rooms/services/advancedRoomService'; +import roomService, { Room } from '../../rooms/services/roomService'; +import userService, { User as UserType } from '../../auth/services/userService'; +import useAuthStore from '../../../store/useAuthStore'; import DatePicker from 'react-datepicker'; import 'react-datepicker/dist/react-datepicker.css'; diff --git a/Frontend/src/components/shared/InspectionManagement.tsx b/Frontend/src/features/hotel_services/components/InspectionManagement.tsx similarity index 98% rename from Frontend/src/components/shared/InspectionManagement.tsx rename to Frontend/src/features/hotel_services/components/InspectionManagement.tsx index 0f4bea29..aa62f0dc 100644 --- a/Frontend/src/components/shared/InspectionManagement.tsx +++ b/Frontend/src/features/hotel_services/components/InspectionManagement.tsx @@ -11,16 +11,16 @@ import { Star, } from 'lucide-react'; import { toast } from 'react-toastify'; -import Loading from '../common/Loading'; -import Pagination from '../common/Pagination'; +import Loading from '../../../shared/components/Loading'; +import Pagination from '../../../shared/components/Pagination'; import advancedRoomService, { RoomInspection, InspectionChecklistItem, Issue, -} from '../../services/api/advancedRoomService'; -import { roomService, Room } from '../../services/api'; -import { userService, User as UserType } from '../../services/api'; -import useAuthStore from '../../store/useAuthStore'; +} from '../../rooms/services/advancedRoomService'; +import roomService, { Room } from '../../rooms/services/roomService'; +import userService, { User as UserType } from '../../auth/services/userService'; +import useAuthStore from '../../../store/useAuthStore'; import DatePicker from 'react-datepicker'; import 'react-datepicker/dist/react-datepicker.css'; diff --git a/Frontend/src/components/shared/MaintenanceManagement.tsx b/Frontend/src/features/hotel_services/components/MaintenanceManagement.tsx similarity index 98% rename from Frontend/src/components/shared/MaintenanceManagement.tsx rename to Frontend/src/features/hotel_services/components/MaintenanceManagement.tsx index 80dda9c7..08c38980 100644 --- a/Frontend/src/components/shared/MaintenanceManagement.tsx +++ b/Frontend/src/features/hotel_services/components/MaintenanceManagement.tsx @@ -8,12 +8,12 @@ import { CheckCircle, } from 'lucide-react'; import { toast } from 'react-toastify'; -import Loading from '../common/Loading'; -import Pagination from '../common/Pagination'; -import advancedRoomService, { MaintenanceRecord } from '../../services/api/advancedRoomService'; -import { roomService, Room } from '../../services/api'; -import { userService, User as UserType } from '../../services/api'; -import useAuthStore from '../../store/useAuthStore'; +import Loading from '../../../shared/components/Loading'; +import Pagination from '../../../shared/components/Pagination'; +import advancedRoomService, { MaintenanceRecord } from '../../rooms/services/advancedRoomService'; +import roomService, { Room } from '../../rooms/services/roomService'; +import userService, { User as UserType } from '../../auth/services/userService'; +import useAuthStore from '../../../store/useAuthStore'; import DatePicker from 'react-datepicker'; import 'react-datepicker/dist/react-datepicker.css'; diff --git a/Frontend/src/components/shared/index.ts b/Frontend/src/features/hotel_services/components/index.ts similarity index 100% rename from Frontend/src/components/shared/index.ts rename to Frontend/src/features/hotel_services/components/index.ts diff --git a/Frontend/src/features/hotel_services/services/index.ts b/Frontend/src/features/hotel_services/services/index.ts new file mode 100644 index 00000000..e69de29b diff --git a/Frontend/src/services/api/serviceService.ts b/Frontend/src/features/hotel_services/services/serviceService.ts similarity index 98% rename from Frontend/src/services/api/serviceService.ts rename to Frontend/src/features/hotel_services/services/serviceService.ts index 16fc1f03..dbbb4f21 100644 --- a/Frontend/src/services/api/serviceService.ts +++ b/Frontend/src/features/hotel_services/services/serviceService.ts @@ -1,4 +1,4 @@ -import apiClient from './apiClient'; +import apiClient from '../../../shared/services/apiClient'; export interface Service { id: number; diff --git a/Frontend/src/features/loyalty/services/index.ts b/Frontend/src/features/loyalty/services/index.ts new file mode 100644 index 00000000..e69de29b diff --git a/Frontend/src/services/api/loyaltyService.ts b/Frontend/src/features/loyalty/services/loyaltyService.ts similarity index 99% rename from Frontend/src/services/api/loyaltyService.ts rename to Frontend/src/features/loyalty/services/loyaltyService.ts index bf820285..3510f0f7 100644 --- a/Frontend/src/services/api/loyaltyService.ts +++ b/Frontend/src/features/loyalty/services/loyaltyService.ts @@ -1,4 +1,4 @@ -import apiClient from './apiClient'; +import apiClient from '../../../shared/services/apiClient'; export interface LoyaltyTier { id: number; diff --git a/Frontend/src/services/api/packageService.ts b/Frontend/src/features/loyalty/services/packageService.ts similarity index 98% rename from Frontend/src/services/api/packageService.ts rename to Frontend/src/features/loyalty/services/packageService.ts index 16e3bf80..c25b94e1 100644 --- a/Frontend/src/services/api/packageService.ts +++ b/Frontend/src/features/loyalty/services/packageService.ts @@ -1,4 +1,4 @@ -import apiClient from './apiClient'; +import apiClient from '../../../shared/services/apiClient'; export type PackageStatus = 'active' | 'inactive' | 'scheduled' | 'expired'; export type PackageItemType = 'room' | 'service' | 'breakfast' | 'activity' | 'amenity' | 'discount'; diff --git a/Frontend/src/services/api/promotionService.ts b/Frontend/src/features/loyalty/services/promotionService.ts similarity index 98% rename from Frontend/src/services/api/promotionService.ts rename to Frontend/src/features/loyalty/services/promotionService.ts index e63d4476..41aba79c 100644 --- a/Frontend/src/services/api/promotionService.ts +++ b/Frontend/src/features/loyalty/services/promotionService.ts @@ -1,4 +1,4 @@ -import apiClient from './apiClient'; +import apiClient from '../../../shared/services/apiClient'; export interface Promotion { id: number; diff --git a/Frontend/src/components/chat/ChatWidget.tsx b/Frontend/src/features/notifications/components/ChatWidget.tsx similarity index 98% rename from Frontend/src/components/chat/ChatWidget.tsx rename to Frontend/src/features/notifications/components/ChatWidget.tsx index fe2a9677..ea93da52 100644 --- a/Frontend/src/components/chat/ChatWidget.tsx +++ b/Frontend/src/features/notifications/components/ChatWidget.tsx @@ -1,10 +1,11 @@ import React, { useState, useEffect, useRef } from 'react'; import { MessageCircle, X, Send, Minimize2, Maximize2, Clock } from 'lucide-react'; -import { chatService, contactService, type Chat, type ChatMessage, type ContactFormData } from '../../services/api'; -import useAuthStore from '../../store/useAuthStore'; -import { useCompanySettings } from '../../contexts/CompanySettingsContext'; +import chatService, { type Chat, type ChatMessage } from '../services/chatService'; +import contactService, { type ContactFormData } from '../../content/services/contactService'; +import useAuthStore from '../../../store/useAuthStore'; +import { useCompanySettings } from '../../../shared/contexts/CompanySettingsContext'; import { toast } from 'react-toastify'; -import ConfirmationDialog from '../common/ConfirmationDialog'; +import ConfirmationDialog from '../../../shared/components/ConfirmationDialog'; interface ChatWidgetProps { onClose?: () => void; diff --git a/Frontend/src/components/notifications/InAppNotificationBell.tsx b/Frontend/src/features/notifications/components/InAppNotificationBell.tsx similarity index 97% rename from Frontend/src/components/notifications/InAppNotificationBell.tsx rename to Frontend/src/features/notifications/components/InAppNotificationBell.tsx index 9a86b32c..6eb3ae1a 100644 --- a/Frontend/src/components/notifications/InAppNotificationBell.tsx +++ b/Frontend/src/features/notifications/components/InAppNotificationBell.tsx @@ -1,9 +1,9 @@ import React, { useState, useEffect, useRef } from 'react'; import { Bell } from 'lucide-react'; import { toast } from 'react-toastify'; -import notificationService, { Notification } from '../../services/api/notificationService'; -import { formatDate } from '../../utils/format'; -import useAuthStore from '../../store/useAuthStore'; +import notificationService, { Notification } from '../services/notificationService'; +import { formatDate } from '../../../shared/utils/format'; +import useAuthStore from '../../../store/useAuthStore'; const InAppNotificationBell: React.FC = () => { const { isAuthenticated, token, isLoading } = useAuthStore(); diff --git a/Frontend/src/components/notifications/NotificationPreferences.tsx b/Frontend/src/features/notifications/components/NotificationPreferences.tsx similarity index 99% rename from Frontend/src/components/notifications/NotificationPreferences.tsx rename to Frontend/src/features/notifications/components/NotificationPreferences.tsx index 79f77420..1e4d2835 100644 --- a/Frontend/src/components/notifications/NotificationPreferences.tsx +++ b/Frontend/src/features/notifications/components/NotificationPreferences.tsx @@ -1,8 +1,8 @@ import React, { useState, useEffect } from 'react'; import { Bell, Mail, MessageSquare, Smartphone, Save } from 'lucide-react'; import { toast } from 'react-toastify'; -import { Loading } from '../common'; -import notificationService, { NotificationPreferences as NotificationPreferencesType } from '../../services/api/notificationService'; +import Loading from '../../../shared/components/Loading'; +import notificationService, { NotificationPreferences as NotificationPreferencesType } from '../services/notificationService'; const NotificationPreferences: React.FC = () => { const [preferences, setPreferences] = useState(null); diff --git a/Frontend/src/components/notifications/NotificationTemplatesModal.tsx b/Frontend/src/features/notifications/components/NotificationTemplatesModal.tsx similarity index 98% rename from Frontend/src/components/notifications/NotificationTemplatesModal.tsx rename to Frontend/src/features/notifications/components/NotificationTemplatesModal.tsx index 1a014611..c59e2940 100644 --- a/Frontend/src/components/notifications/NotificationTemplatesModal.tsx +++ b/Frontend/src/features/notifications/components/NotificationTemplatesModal.tsx @@ -1,7 +1,7 @@ import React, { useState, useEffect } from 'react'; import { X, Plus } from 'lucide-react'; import { toast } from 'react-toastify'; -import notificationService, { NotificationTemplate } from '../../services/api/notificationService'; +import notificationService, { NotificationTemplate } from '../services/notificationService'; interface NotificationTemplatesModalProps { onClose: () => void; diff --git a/Frontend/src/components/notifications/SendNotificationModal.tsx b/Frontend/src/features/notifications/components/SendNotificationModal.tsx similarity index 99% rename from Frontend/src/components/notifications/SendNotificationModal.tsx rename to Frontend/src/features/notifications/components/SendNotificationModal.tsx index f5231f45..1438f64f 100644 --- a/Frontend/src/components/notifications/SendNotificationModal.tsx +++ b/Frontend/src/features/notifications/components/SendNotificationModal.tsx @@ -1,7 +1,7 @@ import React, { useState, useEffect } from 'react'; import { X } from 'lucide-react'; import { toast } from 'react-toastify'; -import notificationService from '../../services/api/notificationService'; +import notificationService from '../services/notificationService'; interface SendNotificationModalProps { onClose: () => void; diff --git a/Frontend/src/components/chat/StaffChatNotification.tsx b/Frontend/src/features/notifications/components/StaffChatNotification.tsx similarity index 97% rename from Frontend/src/components/chat/StaffChatNotification.tsx rename to Frontend/src/features/notifications/components/StaffChatNotification.tsx index c2afe21b..eef755cc 100644 --- a/Frontend/src/components/chat/StaffChatNotification.tsx +++ b/Frontend/src/features/notifications/components/StaffChatNotification.tsx @@ -2,9 +2,9 @@ import React, { useEffect, useState } from 'react'; import { Bell } from 'lucide-react'; import { useNavigate } from 'react-router-dom'; import { toast } from 'react-toastify'; -import useAuthStore from '../../store/useAuthStore'; -import { type Chat } from '../../services/api'; -import { useChatNotifications } from '../../contexts/ChatNotificationContext'; +import useAuthStore from '../../../store/useAuthStore'; +import { type Chat } from '../services/chatService'; +import { useChatNotifications } from '../contexts/ChatNotificationContext'; const StaffChatNotification: React.FC = () => { const [notificationWs, setNotificationWs] = useState(null); diff --git a/Frontend/src/contexts/ChatNotificationContext.tsx b/Frontend/src/features/notifications/contexts/ChatNotificationContext.tsx similarity index 94% rename from Frontend/src/contexts/ChatNotificationContext.tsx rename to Frontend/src/features/notifications/contexts/ChatNotificationContext.tsx index 134ec0d5..e6f20fc8 100644 --- a/Frontend/src/contexts/ChatNotificationContext.tsx +++ b/Frontend/src/features/notifications/contexts/ChatNotificationContext.tsx @@ -1,6 +1,6 @@ import React, { createContext, useContext, useState, ReactNode, useEffect } from 'react'; -import useAuthStore from '../store/useAuthStore'; -import { chatService } from '../services/api'; +import useAuthStore from '../../../store/useAuthStore'; +import chatService from '../services/chatService'; interface ChatNotificationContextType { unreadCount: number; diff --git a/Frontend/src/services/api/chatService.ts b/Frontend/src/features/notifications/services/chatService.ts similarity index 97% rename from Frontend/src/services/api/chatService.ts rename to Frontend/src/features/notifications/services/chatService.ts index 5424079b..7e7e0d79 100644 --- a/Frontend/src/services/api/chatService.ts +++ b/Frontend/src/features/notifications/services/chatService.ts @@ -1,4 +1,4 @@ -import apiClient from './apiClient'; +import apiClient from '../../../shared/services/apiClient'; export interface Chat { id: number; diff --git a/Frontend/src/services/api/emailCampaignService.ts b/Frontend/src/features/notifications/services/emailCampaignService.ts similarity index 98% rename from Frontend/src/services/api/emailCampaignService.ts rename to Frontend/src/features/notifications/services/emailCampaignService.ts index 7c45633f..5cc04246 100644 --- a/Frontend/src/services/api/emailCampaignService.ts +++ b/Frontend/src/features/notifications/services/emailCampaignService.ts @@ -1,4 +1,4 @@ -import apiClient from './apiClient'; +import apiClient from '../../../shared/services/apiClient'; export interface Campaign { id: number; diff --git a/Frontend/src/features/notifications/services/index.ts b/Frontend/src/features/notifications/services/index.ts new file mode 100644 index 00000000..e69de29b diff --git a/Frontend/src/services/api/notificationService.ts b/Frontend/src/features/notifications/services/notificationService.ts similarity index 98% rename from Frontend/src/services/api/notificationService.ts rename to Frontend/src/features/notifications/services/notificationService.ts index f9868d30..72f72f73 100644 --- a/Frontend/src/services/api/notificationService.ts +++ b/Frontend/src/features/notifications/services/notificationService.ts @@ -1,4 +1,4 @@ -import apiClient from './apiClient'; +import apiClient from '../../../shared/services/apiClient'; export interface Notification { id: number; diff --git a/Frontend/src/components/payments/BoricaPaymentModal.tsx b/Frontend/src/features/payments/components/BoricaPaymentModal.tsx similarity index 98% rename from Frontend/src/components/payments/BoricaPaymentModal.tsx rename to Frontend/src/features/payments/components/BoricaPaymentModal.tsx index ede3d482..e6022b28 100644 --- a/Frontend/src/components/payments/BoricaPaymentModal.tsx +++ b/Frontend/src/features/payments/components/BoricaPaymentModal.tsx @@ -1,8 +1,8 @@ import React, { useState, useEffect } from 'react'; -import { createBoricaPayment } from '../../services/api/paymentService'; +import { createBoricaPayment } from '../services/paymentService'; import { X, Loader2, AlertCircle, CreditCard } from 'lucide-react'; import { toast } from 'react-toastify'; -import { useFormatCurrency } from '../../hooks/useFormatCurrency'; +import { useFormatCurrency } from '../hooks/useFormatCurrency'; interface BoricaPaymentModalProps { isOpen: boolean; diff --git a/Frontend/src/components/payments/CashPaymentModal.tsx b/Frontend/src/features/payments/components/CashPaymentModal.tsx similarity index 98% rename from Frontend/src/components/payments/CashPaymentModal.tsx rename to Frontend/src/features/payments/components/CashPaymentModal.tsx index 9f17d584..ddc4c668 100644 --- a/Frontend/src/components/payments/CashPaymentModal.tsx +++ b/Frontend/src/features/payments/components/CashPaymentModal.tsx @@ -1,6 +1,6 @@ import React, { useState } from 'react'; import { X, CheckCircle, CreditCard } from 'lucide-react'; -import { useFormatCurrency } from '../../hooks/useFormatCurrency'; +import { useFormatCurrency } from '../hooks/useFormatCurrency'; import DepositPaymentModal from './DepositPaymentModal'; interface CashPaymentModalProps { diff --git a/Frontend/src/components/payments/DepositPaymentModal.tsx b/Frontend/src/features/payments/components/DepositPaymentModal.tsx similarity index 98% rename from Frontend/src/components/payments/DepositPaymentModal.tsx rename to Frontend/src/features/payments/components/DepositPaymentModal.tsx index 5f0a63cd..52bee937 100644 --- a/Frontend/src/components/payments/DepositPaymentModal.tsx +++ b/Frontend/src/features/payments/components/DepositPaymentModal.tsx @@ -8,13 +8,13 @@ import { Loader2, } from 'lucide-react'; import { toast } from 'react-toastify'; -import { getBookingById, type Booking } from '../../services/api/bookingService'; -import CancelBookingModal from '../booking/CancelBookingModal'; +import { getBookingById, type Booking } from '../../bookings/services/bookingService'; +import CancelBookingModal from '../../bookings/components/CancelBookingModal'; import { getPaymentsByBookingId, type Payment, -} from '../../services/api/paymentService'; -import { useFormatCurrency } from '../../hooks/useFormatCurrency'; +} from '../services/paymentService'; +import { useFormatCurrency } from '../hooks/useFormatCurrency'; import StripePaymentModal from './StripePaymentModal'; import PayPalPaymentModal from './PayPalPaymentModal'; diff --git a/Frontend/src/components/payments/PayPalPaymentModal.tsx b/Frontend/src/features/payments/components/PayPalPaymentModal.tsx similarity index 98% rename from Frontend/src/components/payments/PayPalPaymentModal.tsx rename to Frontend/src/features/payments/components/PayPalPaymentModal.tsx index 908da518..6aabea50 100644 --- a/Frontend/src/components/payments/PayPalPaymentModal.tsx +++ b/Frontend/src/features/payments/components/PayPalPaymentModal.tsx @@ -1,8 +1,8 @@ import React, { useState, useEffect } from 'react'; -import { createPayPalOrder } from '../../services/api/paymentService'; +import { createPayPalOrder } from '../services/paymentService'; import { X, Loader2, AlertCircle } from 'lucide-react'; import { toast } from 'react-toastify'; -import { useFormatCurrency } from '../../hooks/useFormatCurrency'; +import { useFormatCurrency } from '../hooks/useFormatCurrency'; interface PayPalPaymentModalProps { isOpen: boolean; diff --git a/Frontend/src/components/payments/PayPalPaymentWrapper.tsx b/Frontend/src/features/payments/components/PayPalPaymentWrapper.tsx similarity index 98% rename from Frontend/src/components/payments/PayPalPaymentWrapper.tsx rename to Frontend/src/features/payments/components/PayPalPaymentWrapper.tsx index cbc8d364..a5c3972d 100644 --- a/Frontend/src/components/payments/PayPalPaymentWrapper.tsx +++ b/Frontend/src/features/payments/components/PayPalPaymentWrapper.tsx @@ -1,7 +1,7 @@ import React, { useState, useEffect } from 'react'; -import { createPayPalOrder } from '../../services/api/paymentService'; +import { createPayPalOrder } from '../services/paymentService'; import { Loader2, AlertCircle } from 'lucide-react'; -import { useFormatCurrency } from '../../hooks/useFormatCurrency'; +import { useFormatCurrency } from '../hooks/useFormatCurrency'; interface PayPalPaymentWrapperProps { bookingId: number; diff --git a/Frontend/src/components/payments/StripePaymentForm.tsx b/Frontend/src/features/payments/components/StripePaymentForm.tsx similarity index 100% rename from Frontend/src/components/payments/StripePaymentForm.tsx rename to Frontend/src/features/payments/components/StripePaymentForm.tsx diff --git a/Frontend/src/components/payments/StripePaymentModal.tsx b/Frontend/src/features/payments/components/StripePaymentModal.tsx similarity index 99% rename from Frontend/src/components/payments/StripePaymentModal.tsx rename to Frontend/src/features/payments/components/StripePaymentModal.tsx index e8a55b7b..5134f42f 100644 --- a/Frontend/src/components/payments/StripePaymentModal.tsx +++ b/Frontend/src/features/payments/components/StripePaymentModal.tsx @@ -2,7 +2,7 @@ import React, { useState, useEffect } from 'react'; import { loadStripe, StripeElementsOptions } from '@stripe/stripe-js'; import { Elements } from '@stripe/react-stripe-js'; import StripePaymentForm from './StripePaymentForm'; -import { createStripePaymentIntent, confirmStripePayment } from '../../services/api/paymentService'; +import { createStripePaymentIntent, confirmStripePayment } from '../services/paymentService'; import { X, Loader2, AlertCircle } from 'lucide-react'; import { toast } from 'react-toastify'; diff --git a/Frontend/src/components/payments/StripePaymentWrapper.tsx b/Frontend/src/features/payments/components/StripePaymentWrapper.tsx similarity index 99% rename from Frontend/src/components/payments/StripePaymentWrapper.tsx rename to Frontend/src/features/payments/components/StripePaymentWrapper.tsx index 898bebb5..f86148ba 100644 --- a/Frontend/src/components/payments/StripePaymentWrapper.tsx +++ b/Frontend/src/features/payments/components/StripePaymentWrapper.tsx @@ -2,7 +2,7 @@ import React, { useState, useEffect } from 'react'; import { loadStripe, StripeElementsOptions } from '@stripe/stripe-js'; import { Elements } from '@stripe/react-stripe-js'; import StripePaymentForm from './StripePaymentForm'; -import { createStripePaymentIntent, confirmStripePayment } from '../../services/api/paymentService'; +import { createStripePaymentIntent, confirmStripePayment } from '../services/paymentService'; import { Loader2, AlertCircle } from 'lucide-react'; interface StripePaymentWrapperProps { diff --git a/Frontend/src/contexts/CurrencyContext.tsx b/Frontend/src/features/payments/contexts/CurrencyContext.tsx similarity index 93% rename from Frontend/src/contexts/CurrencyContext.tsx rename to Frontend/src/features/payments/contexts/CurrencyContext.tsx index c339efaf..85320b3e 100644 --- a/Frontend/src/contexts/CurrencyContext.tsx +++ b/Frontend/src/features/payments/contexts/CurrencyContext.tsx @@ -5,8 +5,8 @@ import React, { useState, ReactNode, } from 'react'; -import { CURRENCY } from '../utils/constants'; -import systemSettingsService from '../services/api/systemSettingsService'; +import { CURRENCY } from '../../../shared/utils/constants'; +import systemSettingsService from '../../../features/system/services/systemSettingsService'; type CurrencyContextValue = { currency: string; diff --git a/Frontend/src/hooks/useFormatCurrency.ts b/Frontend/src/features/payments/hooks/useFormatCurrency.ts similarity index 83% rename from Frontend/src/hooks/useFormatCurrency.ts rename to Frontend/src/features/payments/hooks/useFormatCurrency.ts index 4374a861..315906bc 100644 --- a/Frontend/src/hooks/useFormatCurrency.ts +++ b/Frontend/src/features/payments/hooks/useFormatCurrency.ts @@ -1,6 +1,6 @@ import { useMemo } from 'react'; import { useCurrency } from '../contexts/CurrencyContext'; -import { formatCurrency as formatCurrencyUtil } from '../utils/format'; +import { formatCurrency as formatCurrencyUtil } from '../../../shared/utils/format'; export const useFormatCurrency = () => { const { currency } = useCurrency(); diff --git a/Frontend/src/features/payments/services/index.ts b/Frontend/src/features/payments/services/index.ts new file mode 100644 index 00000000..e69de29b diff --git a/Frontend/src/services/api/invoiceService.ts b/Frontend/src/features/payments/services/invoiceService.ts similarity index 99% rename from Frontend/src/services/api/invoiceService.ts rename to Frontend/src/features/payments/services/invoiceService.ts index f7d3f97a..bbd72d4b 100644 --- a/Frontend/src/services/api/invoiceService.ts +++ b/Frontend/src/features/payments/services/invoiceService.ts @@ -1,4 +1,4 @@ -import apiClient from './apiClient'; +import apiClient from '../../../shared/services/apiClient'; export interface InvoiceItem { id: number; diff --git a/Frontend/src/services/api/paymentService.ts b/Frontend/src/features/payments/services/paymentService.ts similarity index 99% rename from Frontend/src/services/api/paymentService.ts rename to Frontend/src/features/payments/services/paymentService.ts index 9a793f6c..02805724 100644 --- a/Frontend/src/services/api/paymentService.ts +++ b/Frontend/src/features/payments/services/paymentService.ts @@ -1,4 +1,4 @@ -import apiClient from './apiClient'; +import apiClient from '../../../shared/services/apiClient'; export interface PaymentData { booking_id: number; diff --git a/Frontend/src/services/api/favoriteService.ts b/Frontend/src/features/reviews/services/favoriteService.ts similarity index 92% rename from Frontend/src/services/api/favoriteService.ts rename to Frontend/src/features/reviews/services/favoriteService.ts index fc254111..b0269d21 100644 --- a/Frontend/src/services/api/favoriteService.ts +++ b/Frontend/src/features/reviews/services/favoriteService.ts @@ -1,5 +1,5 @@ -import apiClient from './apiClient'; -import type { Room } from './roomService'; +import apiClient from '../../../shared/services/apiClient'; +import type { Room } from '../../rooms/services/roomService'; export interface Favorite { id: number; diff --git a/Frontend/src/features/reviews/services/index.ts b/Frontend/src/features/reviews/services/index.ts new file mode 100644 index 00000000..e69de29b diff --git a/Frontend/src/services/api/reviewService.ts b/Frontend/src/features/reviews/services/reviewService.ts similarity index 97% rename from Frontend/src/services/api/reviewService.ts rename to Frontend/src/features/reviews/services/reviewService.ts index 127367f5..dbd796f3 100644 --- a/Frontend/src/services/api/reviewService.ts +++ b/Frontend/src/features/reviews/services/reviewService.ts @@ -1,4 +1,4 @@ -import apiClient from './apiClient'; +import apiClient from '../../../shared/services/apiClient'; export interface Review { id: number; diff --git a/Frontend/src/components/rooms/BannerCarousel.tsx b/Frontend/src/features/rooms/components/BannerCarousel.tsx similarity index 99% rename from Frontend/src/components/rooms/BannerCarousel.tsx rename to Frontend/src/features/rooms/components/BannerCarousel.tsx index caa3c278..1caa15c2 100644 --- a/Frontend/src/components/rooms/BannerCarousel.tsx +++ b/Frontend/src/features/rooms/components/BannerCarousel.tsx @@ -1,6 +1,6 @@ import React, { useState, useEffect } from 'react'; import { ChevronLeft, ChevronRight } from 'lucide-react'; -import type { Banner } from '../../services/api/bannerService'; +import type { Banner } from '../../content/services/bannerService'; interface BannerCarouselProps { banners: Banner[]; diff --git a/Frontend/src/components/rooms/BannerSkeleton.tsx b/Frontend/src/features/rooms/components/BannerSkeleton.tsx similarity index 100% rename from Frontend/src/components/rooms/BannerSkeleton.tsx rename to Frontend/src/features/rooms/components/BannerSkeleton.tsx diff --git a/Frontend/src/components/rooms/FavoriteButton.tsx b/Frontend/src/features/rooms/components/FavoriteButton.tsx similarity index 96% rename from Frontend/src/components/rooms/FavoriteButton.tsx rename to Frontend/src/features/rooms/components/FavoriteButton.tsx index 836b2501..a96d5fe6 100644 --- a/Frontend/src/components/rooms/FavoriteButton.tsx +++ b/Frontend/src/features/rooms/components/FavoriteButton.tsx @@ -1,7 +1,7 @@ import React, { useState } from 'react'; import { Heart } from 'lucide-react'; -import useFavoritesStore from '../../store/useFavoritesStore'; -import useAuthStore from '../../store/useAuthStore'; +import useFavoritesStore from '../../../store/useFavoritesStore'; +import useAuthStore from '../../../store/useAuthStore'; interface FavoriteButtonProps { roomId: number; diff --git a/Frontend/src/components/rooms/Pagination.tsx b/Frontend/src/features/rooms/components/Pagination.tsx similarity index 100% rename from Frontend/src/components/rooms/Pagination.tsx rename to Frontend/src/features/rooms/components/Pagination.tsx diff --git a/Frontend/src/components/rooms/RatingStars.tsx b/Frontend/src/features/rooms/components/RatingStars.tsx similarity index 100% rename from Frontend/src/components/rooms/RatingStars.tsx rename to Frontend/src/features/rooms/components/RatingStars.tsx diff --git a/Frontend/src/components/rooms/ReviewSection.tsx b/Frontend/src/features/rooms/components/ReviewSection.tsx similarity index 96% rename from Frontend/src/components/rooms/ReviewSection.tsx rename to Frontend/src/features/rooms/components/ReviewSection.tsx index 1e9c4f00..42df700f 100644 --- a/Frontend/src/components/rooms/ReviewSection.tsx +++ b/Frontend/src/features/rooms/components/ReviewSection.tsx @@ -8,13 +8,13 @@ import { getRoomReviews, createReview, type Review, -} from '../../services/api/reviewService'; -import useAuthStore from '../../store/useAuthStore'; -import { useAuthModal } from '../../contexts/AuthModalContext'; -import Recaptcha from '../common/Recaptcha'; -import { recaptchaService } from '../../services/api/systemSettingsService'; -import { useAntibotForm } from '../../hooks/useAntibotForm'; -import HoneypotField from '../common/HoneypotField'; +} from '../../reviews/services/reviewService'; +import useAuthStore from '../../../store/useAuthStore'; +import { useAuthModal } from '../../auth/contexts/AuthModalContext'; +import Recaptcha from '../../../shared/components/Recaptcha'; +import { recaptchaService } from '../../system/services/systemSettingsService'; +import { useAntibotForm } from '../../auth/hooks/useAntibotForm'; +import HoneypotField from '../../../shared/components/HoneypotField'; interface ReviewSectionProps { roomId: number; diff --git a/Frontend/src/components/rooms/RoomAmenities.tsx b/Frontend/src/features/rooms/components/RoomAmenities.tsx similarity index 100% rename from Frontend/src/components/rooms/RoomAmenities.tsx rename to Frontend/src/features/rooms/components/RoomAmenities.tsx diff --git a/Frontend/src/components/rooms/RoomCard.tsx b/Frontend/src/features/rooms/components/RoomCard.tsx similarity index 98% rename from Frontend/src/components/rooms/RoomCard.tsx rename to Frontend/src/features/rooms/components/RoomCard.tsx index e5553be1..643c3bff 100644 --- a/Frontend/src/components/rooms/RoomCard.tsx +++ b/Frontend/src/features/rooms/components/RoomCard.tsx @@ -10,9 +10,9 @@ import { ArrowRight, Crown, } from 'lucide-react'; -import type { Room } from '../../services/api/roomService'; +import type { Room } from '../services/roomService'; import FavoriteButton from './FavoriteButton'; -import { useFormatCurrency } from '../../hooks/useFormatCurrency'; +import { useFormatCurrency } from '../../payments/hooks/useFormatCurrency'; interface RoomCardProps { room: Room; diff --git a/Frontend/src/components/rooms/RoomCardSkeleton.tsx b/Frontend/src/features/rooms/components/RoomCardSkeleton.tsx similarity index 100% rename from Frontend/src/components/rooms/RoomCardSkeleton.tsx rename to Frontend/src/features/rooms/components/RoomCardSkeleton.tsx diff --git a/Frontend/src/components/rooms/RoomCarousel.tsx b/Frontend/src/features/rooms/components/RoomCarousel.tsx similarity index 99% rename from Frontend/src/components/rooms/RoomCarousel.tsx rename to Frontend/src/features/rooms/components/RoomCarousel.tsx index 7bab3cb9..a703651f 100644 --- a/Frontend/src/components/rooms/RoomCarousel.tsx +++ b/Frontend/src/features/rooms/components/RoomCarousel.tsx @@ -1,6 +1,6 @@ import React, { useState, useEffect } from 'react'; import { ChevronLeft, ChevronRight } from 'lucide-react'; -import type { Room } from '../../services/api/roomService'; +import type { Room } from '../services/roomService'; import RoomCard from './RoomCard'; interface RoomCarouselProps { diff --git a/Frontend/src/components/rooms/RoomFilter.tsx b/Frontend/src/features/rooms/components/RoomFilter.tsx similarity index 99% rename from Frontend/src/components/rooms/RoomFilter.tsx rename to Frontend/src/features/rooms/components/RoomFilter.tsx index 0e09fc73..3e70c0d2 100644 --- a/Frontend/src/components/rooms/RoomFilter.tsx +++ b/Frontend/src/features/rooms/components/RoomFilter.tsx @@ -2,7 +2,7 @@ import React, { useState, useEffect } from 'react'; import DatePicker from 'react-datepicker'; import 'react-datepicker/dist/react-datepicker.css'; import { useSearchParams } from 'react-router-dom'; -import { useFormatCurrency } from '../../hooks/useFormatCurrency'; +import { useFormatCurrency } from '../../payments/hooks/useFormatCurrency'; import { Calendar, DollarSign, Users, X } from 'lucide-react'; interface RoomFilterProps { @@ -93,7 +93,7 @@ const RoomFilter: React.FC = ({ onFilterChange }) => { useEffect(() => { let mounted = true; - import('../../services/api/roomService').then((mod) => { + import('../services/roomService').then((mod) => { mod.getAmenities().then((res) => { const list = res.data?.amenities || []; if (mounted) setAvailableAmenities(list); diff --git a/Frontend/src/components/rooms/RoomGallery.tsx b/Frontend/src/features/rooms/components/RoomGallery.tsx similarity index 100% rename from Frontend/src/components/rooms/RoomGallery.tsx rename to Frontend/src/features/rooms/components/RoomGallery.tsx diff --git a/Frontend/src/components/rooms/SearchRoomForm.tsx b/Frontend/src/features/rooms/components/SearchRoomForm.tsx similarity index 100% rename from Frontend/src/components/rooms/SearchRoomForm.tsx rename to Frontend/src/features/rooms/components/SearchRoomForm.tsx diff --git a/Frontend/src/components/rooms/__tests__/RoomCard.test.tsx b/Frontend/src/features/rooms/components/__tests__/RoomCard.test.tsx similarity index 94% rename from Frontend/src/components/rooms/__tests__/RoomCard.test.tsx rename to Frontend/src/features/rooms/components/__tests__/RoomCard.test.tsx index a6deff57..646f05d5 100644 --- a/Frontend/src/components/rooms/__tests__/RoomCard.test.tsx +++ b/Frontend/src/features/rooms/components/__tests__/RoomCard.test.tsx @@ -1,7 +1,7 @@ import { describe, it, expect, vi, beforeEach } from 'vitest'; -import { render, screen } from '../../../test/utils/test-utils'; +import { render, screen } from '../../../../test/utils/test-utils'; import RoomCard from '../RoomCard'; -import type { Room } from '../../../services/api/roomService'; +import type { Room } from '../../services/roomService'; // Mock the FavoriteButton component vi.mock('../FavoriteButton', () => ({ @@ -11,7 +11,7 @@ vi.mock('../FavoriteButton', () => ({ })); // Mock the useFormatCurrency hook -vi.mock('../../../hooks/useFormatCurrency', () => ({ +vi.mock('../../../features/payments/hooks/useFormatCurrency', () => ({ useFormatCurrency: () => ({ formatCurrency: (amount: number) => `$${amount}`, }), diff --git a/Frontend/src/components/rooms/index.ts b/Frontend/src/features/rooms/components/index.ts similarity index 100% rename from Frontend/src/components/rooms/index.ts rename to Frontend/src/features/rooms/components/index.ts diff --git a/Frontend/src/services/api/advancedRoomService.ts b/Frontend/src/features/rooms/services/advancedRoomService.ts similarity index 99% rename from Frontend/src/services/api/advancedRoomService.ts rename to Frontend/src/features/rooms/services/advancedRoomService.ts index 0323d0f2..2315ab10 100644 --- a/Frontend/src/services/api/advancedRoomService.ts +++ b/Frontend/src/features/rooms/services/advancedRoomService.ts @@ -1,4 +1,4 @@ -import apiClient from './apiClient'; +import apiClient from '../../../shared/services/apiClient'; // Types export interface MaintenanceRecord { diff --git a/Frontend/src/features/rooms/services/index.ts b/Frontend/src/features/rooms/services/index.ts new file mode 100644 index 00000000..e69de29b diff --git a/Frontend/src/services/api/ratePlanService.ts b/Frontend/src/features/rooms/services/ratePlanService.ts similarity index 98% rename from Frontend/src/services/api/ratePlanService.ts rename to Frontend/src/features/rooms/services/ratePlanService.ts index f43a1d6b..acfb4e95 100644 --- a/Frontend/src/services/api/ratePlanService.ts +++ b/Frontend/src/features/rooms/services/ratePlanService.ts @@ -1,4 +1,4 @@ -import apiClient from './apiClient'; +import apiClient from '../../../shared/services/apiClient'; export type RatePlanType = 'BAR' | 'non_refundable' | 'advance_purchase' | 'corporate' | 'government' | 'military' | 'long_stay' | 'package'; export type RatePlanStatus = 'active' | 'inactive' | 'scheduled' | 'expired'; diff --git a/Frontend/src/services/api/roomService.ts b/Frontend/src/features/rooms/services/roomService.ts similarity index 99% rename from Frontend/src/services/api/roomService.ts rename to Frontend/src/features/rooms/services/roomService.ts index 24450474..4da09e85 100644 --- a/Frontend/src/services/api/roomService.ts +++ b/Frontend/src/features/rooms/services/roomService.ts @@ -1,4 +1,4 @@ -import apiClient from './apiClient'; +import apiClient from '../../../shared/services/apiClient'; export interface Room { id: number; diff --git a/Frontend/src/features/security/services/index.ts b/Frontend/src/features/security/services/index.ts new file mode 100644 index 00000000..e69de29b diff --git a/Frontend/src/services/api/securityService.ts b/Frontend/src/features/security/services/securityService.ts similarity index 99% rename from Frontend/src/services/api/securityService.ts rename to Frontend/src/features/security/services/securityService.ts index 5d536327..f5067659 100644 --- a/Frontend/src/services/api/securityService.ts +++ b/Frontend/src/features/security/services/securityService.ts @@ -1,4 +1,4 @@ -import apiClient from './apiClient'; +import apiClient from '../../../shared/services/apiClient'; export interface SecurityEvent { id: number; diff --git a/Frontend/src/components/tasks/CreateTaskModal.tsx b/Frontend/src/features/system/components/CreateTaskModal.tsx similarity index 99% rename from Frontend/src/components/tasks/CreateTaskModal.tsx rename to Frontend/src/features/system/components/CreateTaskModal.tsx index a56a8a5b..0454bc47 100644 --- a/Frontend/src/components/tasks/CreateTaskModal.tsx +++ b/Frontend/src/features/system/components/CreateTaskModal.tsx @@ -1,7 +1,7 @@ import React, { useState } from 'react'; import { X } from 'lucide-react'; import { toast } from 'react-toastify'; -import taskService from '../../services/api/taskService'; +import taskService from '../services/taskService'; interface CreateTaskModalProps { onClose: () => void; diff --git a/Frontend/src/components/admin/IconPicker.tsx b/Frontend/src/features/system/components/IconPicker.tsx similarity index 100% rename from Frontend/src/components/admin/IconPicker.tsx rename to Frontend/src/features/system/components/IconPicker.tsx diff --git a/Frontend/src/components/tasks/TaskDetailModal.tsx b/Frontend/src/features/system/components/TaskDetailModal.tsx similarity index 98% rename from Frontend/src/components/tasks/TaskDetailModal.tsx rename to Frontend/src/features/system/components/TaskDetailModal.tsx index 6ab7367b..15f31c38 100644 --- a/Frontend/src/components/tasks/TaskDetailModal.tsx +++ b/Frontend/src/features/system/components/TaskDetailModal.tsx @@ -1,9 +1,9 @@ import React, { useState } from 'react'; import { X, CheckCircle2, Clock, User, Calendar, Send, Play } from 'lucide-react'; import { toast } from 'react-toastify'; -import { Task } from '../../services/api/taskService'; -import taskService from '../../services/api/taskService'; -import { formatDate } from '../../utils/format'; +import { Task } from '../services/taskService'; +import taskService from '../services/taskService'; +import { formatDate } from '../../../shared/utils/format'; interface TaskDetailModalProps { task: Task; diff --git a/Frontend/src/components/tasks/TaskFilters.tsx b/Frontend/src/features/system/components/TaskFilters.tsx similarity index 100% rename from Frontend/src/components/tasks/TaskFilters.tsx rename to Frontend/src/features/system/components/TaskFilters.tsx diff --git a/Frontend/src/components/workflows/WorkflowBuilder.tsx b/Frontend/src/features/system/components/WorkflowBuilder.tsx similarity index 99% rename from Frontend/src/components/workflows/WorkflowBuilder.tsx rename to Frontend/src/features/system/components/WorkflowBuilder.tsx index e4178d6d..d20823a9 100644 --- a/Frontend/src/components/workflows/WorkflowBuilder.tsx +++ b/Frontend/src/features/system/components/WorkflowBuilder.tsx @@ -1,7 +1,7 @@ import React, { useState } from 'react'; import { X, Plus, Trash2, GripVertical, Save } from 'lucide-react'; import { toast } from 'react-toastify'; -import workflowService, { Workflow, WorkflowStep } from '../../services/api/workflowService'; +import workflowService, { Workflow, WorkflowStep } from '../services/workflowService'; interface WorkflowBuilderProps { workflow?: Workflow | null; diff --git a/Frontend/src/components/workflows/WorkflowDetailModal.tsx b/Frontend/src/features/system/components/WorkflowDetailModal.tsx similarity index 98% rename from Frontend/src/components/workflows/WorkflowDetailModal.tsx rename to Frontend/src/features/system/components/WorkflowDetailModal.tsx index 68d4748e..a9828a98 100644 --- a/Frontend/src/components/workflows/WorkflowDetailModal.tsx +++ b/Frontend/src/features/system/components/WorkflowDetailModal.tsx @@ -1,6 +1,6 @@ import React from 'react'; import { X } from 'lucide-react'; -import { Workflow } from '../../services/api/workflowService'; +import { Workflow } from '../services/workflowService'; interface WorkflowDetailModalProps { workflow: Workflow; diff --git a/Frontend/src/features/system/services/index.ts b/Frontend/src/features/system/services/index.ts new file mode 100644 index 00000000..e69de29b diff --git a/Frontend/src/services/api/systemSettingsService.ts b/Frontend/src/features/system/services/systemSettingsService.ts similarity index 99% rename from Frontend/src/services/api/systemSettingsService.ts rename to Frontend/src/features/system/services/systemSettingsService.ts index 211c8d92..6ded7a95 100644 --- a/Frontend/src/services/api/systemSettingsService.ts +++ b/Frontend/src/features/system/services/systemSettingsService.ts @@ -1,4 +1,4 @@ -import apiClient from './apiClient'; +import apiClient from '../../../shared/services/apiClient'; export interface PlatformCurrencyResponse { status: string; diff --git a/Frontend/src/services/api/taskService.ts b/Frontend/src/features/system/services/taskService.ts similarity index 98% rename from Frontend/src/services/api/taskService.ts rename to Frontend/src/features/system/services/taskService.ts index 43189455..5cb9371b 100644 --- a/Frontend/src/services/api/taskService.ts +++ b/Frontend/src/features/system/services/taskService.ts @@ -1,4 +1,4 @@ -import apiClient from './apiClient'; +import apiClient from '../../../shared/services/apiClient'; export interface Task { id: number; diff --git a/Frontend/src/services/api/workflowService.ts b/Frontend/src/features/system/services/workflowService.ts similarity index 98% rename from Frontend/src/services/api/workflowService.ts rename to Frontend/src/features/system/services/workflowService.ts index 0600c081..74e044e1 100644 --- a/Frontend/src/services/api/workflowService.ts +++ b/Frontend/src/features/system/services/workflowService.ts @@ -1,4 +1,4 @@ -import apiClient from './apiClient'; +import apiClient from '../../../shared/services/apiClient'; export interface WorkflowStep { title: string; diff --git a/Frontend/src/hooks/index.ts b/Frontend/src/hooks/index.ts index 67347257..f93110f9 100644 --- a/Frontend/src/hooks/index.ts +++ b/Frontend/src/hooks/index.ts @@ -1,9 +1,9 @@ -export { default as useDebounce } from './useDebounce'; -export { useAsync } from './useAsync'; -export { useLocalStorage } from './useLocalStorage'; -export { useOffline } from './useOffline'; -export { useClickOutside } from './useClickOutside'; -export { default as usePagePerformance } from './usePagePerformance'; -export { useResponsive } from './useResponsive'; -export type { UseResponsiveReturn, ResponsiveState } from './useResponsive'; +export { default as useDebounce } from '../shared/hooks/useDebounce'; +export { useAsync } from '../shared/hooks/useAsync'; +export { useLocalStorage } from '../shared/hooks/useLocalStorage'; +export { useOffline } from '../shared/hooks/useOffline'; +export { useClickOutside } from '../shared/hooks/useClickOutside'; +export { default as usePagePerformance } from '../shared/hooks/usePagePerformance'; +export { useResponsive } from '../shared/hooks/useResponsive'; +export type { UseResponsiveReturn, ResponsiveState } from '../shared/hooks/useResponsive'; diff --git a/Frontend/src/main.tsx b/Frontend/src/main.tsx index 70a0808f..ebeb770b 100644 --- a/Frontend/src/main.tsx +++ b/Frontend/src/main.tsx @@ -1,8 +1,7 @@ import React from 'react'; import ReactDOM from 'react-dom/client'; import App from './App.tsx'; -import ErrorBoundary from - './components/common/ErrorBoundary.tsx'; +import ErrorBoundary from './shared/components/ErrorBoundary'; import './styles/index.css'; import 'react-datepicker/dist/react-datepicker.css'; import './styles/datepicker.css'; diff --git a/Frontend/src/pages/AccountantLayout.tsx b/Frontend/src/pages/AccountantLayout.tsx index 86a8222d..2279ef82 100644 --- a/Frontend/src/pages/AccountantLayout.tsx +++ b/Frontend/src/pages/AccountantLayout.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { Outlet } from 'react-router-dom'; -import { SidebarAccountant } from '../components/layout'; -import { useResponsive } from '../hooks'; +import SidebarAccountant from '../shared/components/SidebarAccountant'; +import { useResponsive } from '../shared/hooks/useResponsive'; const AccountantLayout: React.FC = () => { const { isMobile } = useResponsive(); diff --git a/Frontend/src/pages/AdminLayout.tsx b/Frontend/src/pages/AdminLayout.tsx index 6399a4a2..833992b1 100644 --- a/Frontend/src/pages/AdminLayout.tsx +++ b/Frontend/src/pages/AdminLayout.tsx @@ -1,8 +1,9 @@ import React, { useState, Suspense, useEffect } from 'react'; import { Outlet, useLocation } from 'react-router-dom'; -import { SidebarAdmin } from '../components/layout'; +import { SidebarAdmin } from '../shared/components'; import { Sparkles, Zap } from 'lucide-react'; import { useResponsive } from '../hooks'; +import AIAssistantWidget from '../features/ai/components/AIAssistantWidget'; // Luxury Loading Overlay const LuxuryLoadingOverlay: React.FC = () => { @@ -106,6 +107,9 @@ const AdminLayout: React.FC = () => {
+ {/* AI Assistant Widget */} + + {/* Custom CSS for shimmer animation */}