115 lines
4.5 KiB
Python
115 lines
4.5 KiB
Python
# app/services/submission_service.py
|
|
from sqlalchemy.orm import Session
|
|
from typing import Optional, Dict, Any
|
|
from app.models.submission import Submission
|
|
from app.schemas.submission import SubmissionCreate
|
|
|
|
|
|
class SubmissionService:
|
|
def __init__(self, db: Session):
|
|
self.db = db
|
|
|
|
def create_submission(self, submission_data: SubmissionCreate):
|
|
"""Создать новую submission"""
|
|
submission = Submission(
|
|
form_id=submission_data.form_id,
|
|
submission_data=submission_data.data, # ← используем submission_data
|
|
submission_metadata=submission_data.metadata.dict() if submission_data.metadata else {},
|
|
status="completed"
|
|
)
|
|
self.db.add(submission)
|
|
self.db.commit()
|
|
self.db.refresh(submission)
|
|
|
|
# Возвращаем словарь, соответствующий схеме
|
|
return {
|
|
"id": submission.id,
|
|
"submission_uuid": str(submission.submission_uuid),
|
|
"form_id": submission.form_id,
|
|
"submission_data": submission.submission_data,
|
|
"submission_metadata": submission.submission_metadata,
|
|
"status": submission.status,
|
|
"submitted_at": submission.submitted_at,
|
|
"created_at": submission.created_at,
|
|
"updated_at": submission.updated_at,
|
|
"submitted_by": submission.submitted_by,
|
|
"completion_time_seconds": submission.completion_time_seconds,
|
|
"referrer": submission.referrer
|
|
}
|
|
|
|
def get_submission_by_id(self, submission_id: int):
|
|
"""Получить submission по ID"""
|
|
submission = self.db.query(Submission).filter(Submission.id == submission_id).first()
|
|
if not submission:
|
|
return None
|
|
|
|
return {
|
|
"id": submission.id,
|
|
"submission_uuid": str(submission.submission_uuid),
|
|
"form_id": submission.form_id,
|
|
"submission_data": submission.submission_data,
|
|
"submission_metadata": submission.submission_metadata,
|
|
"status": submission.status,
|
|
"submitted_at": submission.submitted_at,
|
|
"created_at": submission.created_at,
|
|
"updated_at": submission.updated_at,
|
|
"submitted_by": submission.submitted_by,
|
|
"completion_time_seconds": submission.completion_time_seconds,
|
|
"referrer": submission.referrer
|
|
}
|
|
|
|
def get_submissions_by_form(self, form_id: int, page=1, per_page=20, status=None):
|
|
"""Получить все submission формы"""
|
|
query = self.db.query(Submission).filter(Submission.form_id == form_id)
|
|
if status:
|
|
query = query.filter(Submission.status == status)
|
|
|
|
total = query.count()
|
|
items = query.offset((page - 1) * per_page).limit(per_page).all()
|
|
|
|
items_list = []
|
|
for submission in items:
|
|
items_list.append({
|
|
"id": submission.id,
|
|
"submission_uuid": str(submission.submission_uuid),
|
|
"form_id": submission.form_id,
|
|
"submission_data": submission.submission_data,
|
|
"submission_metadata": submission.submission_metadata,
|
|
"status": submission.status,
|
|
"submitted_at": submission.submitted_at,
|
|
"created_at": submission.created_at,
|
|
"updated_at": submission.updated_at,
|
|
"submitted_by": submission.submitted_by,
|
|
"completion_time_seconds": submission.completion_time_seconds,
|
|
"referrer": submission.referrer
|
|
})
|
|
|
|
return {
|
|
"items": items_list,
|
|
"total": total,
|
|
"page": page,
|
|
"per_page": per_page,
|
|
"pages": (total + per_page - 1) // per_page
|
|
}
|
|
|
|
def update_submission(self, submission_id: int, data: Dict[str, Any]):
|
|
"""Обновить submission"""
|
|
submission = self.db.query(Submission).filter(Submission.id == submission_id).first()
|
|
if not submission:
|
|
return None
|
|
|
|
submission.submission_data = data
|
|
self.db.commit()
|
|
self.db.refresh(submission)
|
|
|
|
return self.get_submission_by_id(submission_id)
|
|
|
|
def delete_submission(self, submission_id: int):
|
|
"""Удалить submission"""
|
|
submission = self.db.query(Submission).filter(Submission.id == submission_id).first()
|
|
if not submission:
|
|
return False
|
|
|
|
self.db.delete(submission)
|
|
self.db.commit()
|
|
return True |