From dabc7dd308bc6f5a6da3de84a0c9a70245d4f551 Mon Sep 17 00:00:00 2001 From: deepvasoya Date: Tue, 13 May 2025 11:15:29 +0530 Subject: [PATCH] feat: appointment relation table fix: relations for clinic doc and clinic --- apis/__init__.py | 4 ++- apis/endpoints/clinicDoctor.py | 23 +++++++++++++ ...a3a9b7d17bdd_appointment_relation_table.py | 33 +++++++++++++++++++ models/AppointmentRelations.py | 14 ++++++++ models/ClinicDoctors.py | 17 ++++++++++ models/Clinics.py | 1 + models/MasterAppointmentTypes.py | 13 ++++++++ models/__init__.py | 6 ++++ schemas/BaseSchemas.py | 10 ++++-- schemas/CreateSchemas.py | 4 +++ schemas/ResponseSchemas.py | 19 +++++++++++ schemas/UpdateSchemas.py | 4 +++ services/clinicDoctorsServices.py | 21 ++++++++++++ 13 files changed, 166 insertions(+), 3 deletions(-) create mode 100644 apis/endpoints/clinicDoctor.py create mode 100644 migrations/versions/a3a9b7d17bdd_appointment_relation_table.py create mode 100644 models/AppointmentRelations.py create mode 100644 models/ClinicDoctors.py create mode 100644 models/MasterAppointmentTypes.py create mode 100644 services/clinicDoctorsServices.py diff --git a/apis/__init__.py b/apis/__init__.py index 31502eb..ff2c555 100644 --- a/apis/__init__.py +++ b/apis/__init__.py @@ -5,7 +5,7 @@ from fastapi.security import HTTPBearer # Import the security scheme bearer_scheme = HTTPBearer(scheme_name="Bearer Authentication") -from .endpoints import clinics, doctors, calender, appointments, patients, admin, auth, s3, users +from .endpoints import clinics, doctors, calender, appointments, patients, admin, auth, s3, users, clinicDoctor api_router = APIRouter() # api_router.include_router(twilio.router, prefix="/twilio") @@ -14,6 +14,7 @@ api_router.include_router(doctors.router, prefix="/doctors", tags=["doctors"]) api_router.include_router(calender.router, prefix="/calender", tags=["calender"]) api_router.include_router(appointments.router, prefix="/appointments", tags=["appointments"]) api_router.include_router(patients.router, prefix="/patients", tags=["patients"]) + api_router.include_router( admin.router, prefix="/admin", @@ -22,3 +23,4 @@ api_router.include_router( api_router.include_router(auth.router, prefix="/auth", tags=["auth"]) api_router.include_router(s3.router, dependencies=[Depends(auth_required)], prefix="/s3", tags=["s3"]) api_router.include_router(users.router, prefix="/users", tags=["users"], dependencies=[Depends(auth_required)]) +api_router.include_router(clinicDoctor.router, prefix="/clinic-doctors", tags=["clinic-doctors"], dependencies=[Depends(auth_required)]) diff --git a/apis/endpoints/clinicDoctor.py b/apis/endpoints/clinicDoctor.py new file mode 100644 index 0000000..4b3e491 --- /dev/null +++ b/apis/endpoints/clinicDoctor.py @@ -0,0 +1,23 @@ +from fastapi import APIRouter +from schemas.ApiResponse import ApiResponse +from schemas.CreateSchemas import ClinicDoctorCreate +from schemas.UpdateSchemas import ClinicDoctorUpdate +from services.clinicDoctorsServices import ClinicDoctorsServices + +router = APIRouter() + + +@router.post("/clinic-doctor") +def create_clinic_doctor(clinic_doctor: ClinicDoctorCreate): + clinic_doctor = ClinicDoctorsServices().create_clinic_doctor(clinic_doctor) + return ApiResponse(data=clinic_doctor, message="Clinic doctor created successfully") + +@router.put("/clinic-doctor/{clinic_doctor_id}") +def update_clinic_doctor(clinic_doctor_id: int, clinic_doctor: ClinicDoctorUpdate): + clinic_doctor = ClinicDoctorsServices().update_clinic_doctor(clinic_doctor) + return ApiResponse(data=clinic_doctor, message="Clinic doctor updated successfully") + +@router.delete("/clinic-doctor/{clinic_doctor_id}") +def delete_clinic_doctor(clinic_doctor_id: int): + ClinicDoctorsServices().delete_clinic_doctor(clinic_doctor_id) + return ApiResponse(data="OK", message="Clinic doctor deleted successfully") diff --git a/migrations/versions/a3a9b7d17bdd_appointment_relation_table.py b/migrations/versions/a3a9b7d17bdd_appointment_relation_table.py new file mode 100644 index 0000000..aad7ba7 --- /dev/null +++ b/migrations/versions/a3a9b7d17bdd_appointment_relation_table.py @@ -0,0 +1,33 @@ +"""appointment relation table + +Revision ID: a3a9b7d17bdd +Revises: 827c736d4aeb +Create Date: 2025-05-13 11:09:24.512689 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = 'a3a9b7d17bdd' +down_revision: Union[str, None] = '827c736d4aeb' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + op.add_column('clinic_doctors', sa.Column('clinic_id', sa.Integer(), nullable=True)) + op.create_foreign_key(None, 'clinic_doctors', 'clinics', ['clinic_id'], ['id']) + # ### end Alembic commands ### + + +def downgrade() -> None: + """Downgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(None, 'clinic_doctors', type_='foreignkey') + op.drop_column('clinic_doctors', 'clinic_id') + # ### end Alembic commands ### diff --git a/models/AppointmentRelations.py b/models/AppointmentRelations.py new file mode 100644 index 0000000..41094ec --- /dev/null +++ b/models/AppointmentRelations.py @@ -0,0 +1,14 @@ +from sqlalchemy import Column, ForeignKey, Integer +from database import Base +from .CustomBase import CustomBase +from sqlalchemy.orm import relationship + +class AppointmentRelations(Base, CustomBase): + __tablename__ = "appointment_relations" + + id = Column(Integer, primary_key=True, index=True) + appointment_type_id = Column(Integer, ForeignKey("master_appointment_types.id")) + clinic_doctor_id = Column(Integer, ForeignKey("clinic_doctors.id")) + + clinicDoctors = relationship("ClinicDoctors", back_populates="appointmentRelations") + masterAppointmentTypes = relationship("MasterAppointmentTypes", back_populates="appointmentRelations") \ No newline at end of file diff --git a/models/ClinicDoctors.py b/models/ClinicDoctors.py new file mode 100644 index 0000000..138513b --- /dev/null +++ b/models/ClinicDoctors.py @@ -0,0 +1,17 @@ +from sqlalchemy import Column, Enum, Integer, String, ForeignKey,Table +from database import Base +from enums.enums import ClinicUserRoles, ClinicDoctorStatus +from .CustomBase import CustomBase +from sqlalchemy.orm import relationship + +class ClinicDoctors(Base, CustomBase): + __tablename__ = "clinic_doctors" + + id = Column(Integer, primary_key=True, index=True) + name = Column(String) + role = Column(Enum(ClinicUserRoles)) + status = Column(Enum(ClinicDoctorStatus)) + + appointmentRelations = relationship("AppointmentRelations", back_populates="clinicDoctors") + clinic_id = Column(Integer, ForeignKey("clinics.id")) + clinic = relationship("Clinics", back_populates="clinicDoctors") \ No newline at end of file diff --git a/models/Clinics.py b/models/Clinics.py index 7fb1599..e16db9e 100644 --- a/models/Clinics.py +++ b/models/Clinics.py @@ -42,3 +42,4 @@ class Clinics(Base, CustomBase): doctors = relationship("Doctors", back_populates="clinic") + clinicDoctors = relationship("ClinicDoctors", back_populates="clinic") \ No newline at end of file diff --git a/models/MasterAppointmentTypes.py b/models/MasterAppointmentTypes.py new file mode 100644 index 0000000..241836c --- /dev/null +++ b/models/MasterAppointmentTypes.py @@ -0,0 +1,13 @@ +from sqlalchemy import Column, Integer, String +from database import Base +from .CustomBase import CustomBase +from sqlalchemy.orm import relationship + +class MasterAppointmentTypes(Base, CustomBase): + __tablename__ = "master_appointment_types" + + id = Column(Integer, primary_key=True, index=True) + type = Column(String) + + appointmentRelations = relationship("AppointmentRelations", back_populates="masterAppointmentTypes") + clinicDoctors = relationship("ClinicDoctors", back_populates="masterAppointmentTypes") \ No newline at end of file diff --git a/models/__init__.py b/models/__init__.py index e7d7f98..2edd73e 100644 --- a/models/__init__.py +++ b/models/__init__.py @@ -4,6 +4,9 @@ from .Doctors import Doctors from .Patients import Patients from .Appointments import Appointments from .Calendar import Calenders +from .AppointmentRelations import AppointmentRelations +from .MasterAppointmentTypes import MasterAppointmentTypes +from .ClinicDoctors import ClinicDoctors __all__ = [ "Users", @@ -12,4 +15,7 @@ __all__ = [ "Patients", "Appointments", "Calenders", + "AppointmentRelations", + "MasterAppointmentTypes", + "ClinicDoctors", ] diff --git a/schemas/BaseSchemas.py b/schemas/BaseSchemas.py index d82dbf2..df1e356 100644 --- a/schemas/BaseSchemas.py +++ b/schemas/BaseSchemas.py @@ -2,7 +2,7 @@ from datetime import datetime from typing import List, Optional from pydantic import BaseModel, EmailStr -from enums.enums import AppointmentStatus, ClinicUserRoles, UserType, Integration +from enums.enums import AppointmentStatus, ClinicDoctorStatus, ClinicDoctorType, ClinicUserRoles, UserType, Integration # Base schemas (shared attributes for create/read operations) @@ -69,4 +69,10 @@ class UserBase(BaseModel): email: EmailStr password: str clinicRole: Optional[ClinicUserRoles] = None - userType: Optional[UserType] = None \ No newline at end of file + userType: Optional[UserType] = None + + +class ClinicDoctorBase(BaseModel): + name: str + role: ClinicDoctorType + status: ClinicDoctorStatus \ No newline at end of file diff --git a/schemas/CreateSchemas.py b/schemas/CreateSchemas.py index dde4b53..0e60c73 100644 --- a/schemas/CreateSchemas.py +++ b/schemas/CreateSchemas.py @@ -37,3 +37,7 @@ class UserCreate(BaseModel): user: UserBase # Clinic data sent from frontend clinic: ClinicBase + + +class ClinicDoctorCreate(ClinicDoctorBase): + pass diff --git a/schemas/ResponseSchemas.py b/schemas/ResponseSchemas.py index edd453f..866c2b4 100644 --- a/schemas/ResponseSchemas.py +++ b/schemas/ResponseSchemas.py @@ -12,6 +12,16 @@ class Clinic(ClinicBase): class Config: orm_mode = True + +class ClinicDoctorResponse(ClinicDoctorBase): + id: int + create_time: datetime + update_time: datetime + + class Config: + orm_mode = True + + class UserResponse(UserBase): id: int create_time: datetime @@ -124,3 +134,12 @@ class AppointmentDetailed(AppointmentSchema): doctor: Doctor patient: Patient + + +class ClinicDoctor(ClinicDoctorBase): + id: int + create_time: datetime + update_time: datetime + + class Config: + orm_mode = True \ No newline at end of file diff --git a/schemas/UpdateSchemas.py b/schemas/UpdateSchemas.py index 77bee3c..6819023 100644 --- a/schemas/UpdateSchemas.py +++ b/schemas/UpdateSchemas.py @@ -44,3 +44,7 @@ class UserUpdate(BaseModel): userType: Optional[UserType] = None profile_pic: Optional[str] = None password: Optional[str] = None + + +class ClinicDoctorUpdate(ClinicDoctorBase): + pass diff --git a/services/clinicDoctorsServices.py b/services/clinicDoctorsServices.py new file mode 100644 index 0000000..be083dc --- /dev/null +++ b/services/clinicDoctorsServices.py @@ -0,0 +1,21 @@ +from schemas.CreateSchemas import ClinicDoctorCreate +from schemas.UpdateSchemas import ClinicDoctorUpdate +from database import get_db +from models import ClinicDoctors + +class ClinicDoctorsServices: + def __init__(self): + self.db = next(get_db()) + + def create_clinic_doctor(self, clinic_doctor: ClinicDoctorCreate): + clinic_doctor = ClinicDoctors(**clinic_doctor.dict()) + self.db.add(clinic_doctor) + self.db.commit() + self.db.refresh(clinic_doctor) + return clinic_doctor + + def update_clinic_doctor(self, clinic_doctor_id: int, clinic_doctor: ClinicDoctorUpdate): + pass + + def delete_clinic_doctor(self, clinic_doctor_id: int): + pass \ No newline at end of file