From 12eea232997339779efd679f082e03cd217ec5c8 Mon Sep 17 00:00:00 2001 From: andrei Date: Thu, 3 Jul 2025 15:50:02 +0500 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=BA=D0=B0=D1=81=D0=BA=D0=B0=D0=B4=D0=BD?= =?UTF-8?q?=D0=BE=D0=B5=20=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=20=D0=B4=D0=BB=D1=8F=20=D0=BC=D0=BE=D0=B4=D0=B5=D0=BB=D0=B5?= =?UTF-8?q?=D0=B9.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/app/Dockerfile | 3 ++- api/app/domain/models/appointment_types.py | 4 ++-- api/app/domain/models/appointments.py | 2 +- api/app/domain/models/lens.py | 2 +- api/app/domain/models/lens_types.py | 4 ++-- api/app/domain/models/mailing.py | 4 ++-- api/app/domain/models/mailing_delivery_methods.py | 2 +- api/app/domain/models/mailing_options.py | 4 ++-- api/app/domain/models/patients.py | 8 ++++---- api/app/domain/models/recipients.py | 4 ++-- api/app/domain/models/sets.py | 2 +- api/app/infrastructure/backup_service.py | 6 ++---- api/k8s/helm/visus-api/templates/deployment.yaml | 7 +++++++ api/k8s/helm/visus-api/values.yaml | 3 ++- api/req.txt | 4 +++- 15 files changed, 34 insertions(+), 25 deletions(-) diff --git a/api/app/Dockerfile b/api/app/Dockerfile index be6473e..c0997f4 100644 --- a/api/app/Dockerfile +++ b/api/app/Dockerfile @@ -3,6 +3,7 @@ FROM python:3.10-slim RUN apt-get update && apt-get install -y \ libpq-dev \ libmagic1 \ + postgresql-client \ && rm -rf /var/lib/apt/lists/* WORKDIR /app @@ -15,4 +16,4 @@ COPY . . EXPOSE 8000 -CMD ["uvicorn", "app.main:app", "--host=0.0.0.0"] +CMD ["uvicorn", "app.main:app", "--host=0.0.0.0"] \ No newline at end of file diff --git a/api/app/domain/models/appointment_types.py b/api/app/domain/models/appointment_types.py index f35c976..c436231 100644 --- a/api/app/domain/models/appointment_types.py +++ b/api/app/domain/models/appointment_types.py @@ -11,5 +11,5 @@ class AppointmentType(BaseModel): title = Column(VARCHAR(150), nullable=False, unique=True) - appointments = relationship('Appointment', back_populates='type') - scheduled_appointments = relationship('ScheduledAppointment', back_populates='type') + appointments = relationship('Appointment', back_populates='type', cascade="all, delete") + scheduled_appointments = relationship('ScheduledAppointment', back_populates='type', cascade="all, delete") diff --git a/api/app/domain/models/appointments.py b/api/app/domain/models/appointments.py index 65a7b4b..9bb4697 100644 --- a/api/app/domain/models/appointments.py +++ b/api/app/domain/models/appointments.py @@ -22,4 +22,4 @@ class Appointment(BaseModel): doctor = relationship('User', back_populates='appointments') type = relationship('AppointmentType', back_populates='appointments') - files = relationship('AppointmentFile', back_populates='appointment') + files = relationship('AppointmentFile', back_populates='appointment', cascade="all, delete") diff --git a/api/app/domain/models/lens.py b/api/app/domain/models/lens.py index 010d0d0..f97c37e 100644 --- a/api/app/domain/models/lens.py +++ b/api/app/domain/models/lens.py @@ -30,4 +30,4 @@ class Lens(BaseModel): type = relationship('LensType', back_populates='lenses') - lens_issues = relationship('LensIssue', back_populates='lens') + lens_issues = relationship('LensIssue', back_populates='lens', cascade="all, delete") diff --git a/api/app/domain/models/lens_types.py b/api/app/domain/models/lens_types.py index 6b1abdd..4c6e289 100644 --- a/api/app/domain/models/lens_types.py +++ b/api/app/domain/models/lens_types.py @@ -11,5 +11,5 @@ class LensType(BaseModel): title = Column(VARCHAR(150), nullable=False, unique=True) - lenses = relationship('Lens', back_populates='type') - contents = relationship('SetContent', back_populates='type') + lenses = relationship('Lens', back_populates='type', cascade="all, delete") + contents = relationship('SetContent', back_populates='type', cascade="all, delete") diff --git a/api/app/domain/models/mailing.py b/api/app/domain/models/mailing.py index a9e64a1..006b64c 100644 --- a/api/app/domain/models/mailing.py +++ b/api/app/domain/models/mailing.py @@ -18,5 +18,5 @@ class Mailing(BaseModel): user = relationship('User', back_populates='mailing') - recipients = relationship('Recipient', back_populates='mailing') - mailing_options = relationship('MailingOption', back_populates='mailing') + recipients = relationship('Recipient', back_populates='mailing', cascade="all, delete") + mailing_options = relationship('MailingOption', back_populates='mailing', cascade="all, delete") diff --git a/api/app/domain/models/mailing_delivery_methods.py b/api/app/domain/models/mailing_delivery_methods.py index 70dac3b..9c0eb61 100644 --- a/api/app/domain/models/mailing_delivery_methods.py +++ b/api/app/domain/models/mailing_delivery_methods.py @@ -11,4 +11,4 @@ class MailingDeliveryMethod(BaseModel): title = Column(VARCHAR(200), nullable=False) - mailing = relationship('MailingOption', back_populates='method') + mailing = relationship('MailingOption', back_populates='method', cascade="all, delete") diff --git a/api/app/domain/models/mailing_options.py b/api/app/domain/models/mailing_options.py index d93eeb8..98a9ab5 100644 --- a/api/app/domain/models/mailing_options.py +++ b/api/app/domain/models/mailing_options.py @@ -13,5 +13,5 @@ class MailingOption(BaseModel): nullable=False) mailing_id = Column(Integer, ForeignKey(f'{settings.SCHEMA}.mailing.id', ondelete='CASCADE'), nullable=False) - method = relationship('MailingDeliveryMethod', back_populates='mailing') - mailing = relationship('Mailing', back_populates='mailing_options') + method = relationship('MailingDeliveryMethod', back_populates='mailing', cascade="all, delete") + mailing = relationship('Mailing', back_populates='mailing_options', cascade="all, delete") diff --git a/api/app/domain/models/patients.py b/api/app/domain/models/patients.py index f8be359..54f54de 100644 --- a/api/app/domain/models/patients.py +++ b/api/app/domain/models/patients.py @@ -19,7 +19,7 @@ class Patient(BaseModel): diagnosis = Column(String) correction = Column(String) - lens_issues = relationship('LensIssue', back_populates='patient') - appointments = relationship('Appointment', back_populates='patient') - mailing = relationship('Recipient', back_populates='patient') - scheduled_appointments = relationship('ScheduledAppointment', back_populates='patient') + lens_issues = relationship('LensIssue', back_populates='patient', cascade="all, delete") + appointments = relationship('Appointment', back_populates='patient', cascade="all, delete") + mailing = relationship('Recipient', back_populates='patient', cascade="all, delete") + scheduled_appointments = relationship('ScheduledAppointment', back_populates='patient', cascade="all, delete") diff --git a/api/app/domain/models/recipients.py b/api/app/domain/models/recipients.py index e38c4ea..62f1a2f 100644 --- a/api/app/domain/models/recipients.py +++ b/api/app/domain/models/recipients.py @@ -12,5 +12,5 @@ class Recipient(BaseModel): patient_id = Column(Integer, ForeignKey(f'{settings.SCHEMA}.patients.id', ondelete='CASCADE'), nullable=False) mailing_id = Column(Integer, ForeignKey(f'{settings.SCHEMA}.mailing.id', ondelete='CASCADE'), nullable=False) - patient = relationship('Patient', back_populates='mailing') - mailing = relationship('Mailing', back_populates='recipients') + patient = relationship('Patient', back_populates='mailing', cascade="all, delete") + mailing = relationship('Mailing', back_populates='recipients', cascade="all, delete") diff --git a/api/app/domain/models/sets.py b/api/app/domain/models/sets.py index 4f09678..7b29dd5 100644 --- a/api/app/domain/models/sets.py +++ b/api/app/domain/models/sets.py @@ -11,4 +11,4 @@ class Set(BaseModel): title = Column(VARCHAR(150), nullable=False, unique=True) - contents = relationship('SetContent', back_populates='set') + contents = relationship('SetContent', back_populates='set', cascade="all, delete") diff --git a/api/app/infrastructure/backup_service.py b/api/app/infrastructure/backup_service.py index a143ed8..855dfb2 100644 --- a/api/app/infrastructure/backup_service.py +++ b/api/app/infrastructure/backup_service.py @@ -1,16 +1,14 @@ import datetime import io import os -import shutil import subprocess import tarfile from typing import Optional -from fastapi_maintenance import maintenance_mode_on import aiofiles +import magic from fastapi import HTTPException, UploadFile -from magic import magic -from sqlalchemy.ext.asyncio import AsyncSession, AsyncEngine +from sqlalchemy.ext.asyncio import AsyncSession from starlette.responses import FileResponse from werkzeug.utils import secure_filename diff --git a/api/k8s/helm/visus-api/templates/deployment.yaml b/api/k8s/helm/visus-api/templates/deployment.yaml index 8b31812..581458b 100644 --- a/api/k8s/helm/visus-api/templates/deployment.yaml +++ b/api/k8s/helm/visus-api/templates/deployment.yaml @@ -19,6 +19,13 @@ spec: ports: - containerPort: {{ .Values.service.port }} env: + - name: PG_DUMP_PATH + value: "{{ .Values.env.PG_DUMP_PATH }}" + - name: BACKUP_DB_URL + valueFrom: + secretKeyRef: + name: visus-api-secret + key: BACKUP_DB_URL - name: SECRET_KEY valueFrom: secretKeyRef: diff --git a/api/k8s/helm/visus-api/values.yaml b/api/k8s/helm/visus-api/values.yaml index 0683a5e..1933b9f 100644 --- a/api/k8s/helm/visus-api/values.yaml +++ b/api/k8s/helm/visus-api/values.yaml @@ -32,4 +32,5 @@ ingress: env: LOG_LEVEL: info LOG_FILE: logs/app.log - ALGORITHM: HS256 \ No newline at end of file + ALGORITHM: HS256 + PG_DUMP_PATH: pg_dump \ No newline at end of file diff --git a/api/req.txt b/api/req.txt index 7fd94e6..7e4afec 100644 --- a/api/req.txt +++ b/api/req.txt @@ -12,4 +12,6 @@ pyjwt==2.10.1 python-magic==0.4.27 aiofiles==24.1.0 python-multipart==0.0.20 -fastapi-maintenance==0.0.4 \ No newline at end of file +fastapi-maintenance==0.0.4 +python-magic==0.4.27 +libmagic==1.0 \ No newline at end of file