package repository import ( "fmt" "time" "devone.aplikasi.web.id/gitea/mario/go-ohif-proxy/internal/api/models" "devone.aplikasi.web.id/gitea/mario/go-ohif-proxy/internal/database" "github.com/jmoiron/sqlx" ) // DBStudy represents a study from the database type DBStudy struct { ID int `db:"id"` Study_PatientID string `db:"Study_PatientID"` StudyIUID string `db:"StudyIUID"` StudyAccessionNumber string `db:"StudyAccessionNumber"` StudyDate time.Time `db:"StudyDate"` StudyCreatedAt time.Time `db:"StudyCreatedAt"` StudyUpdatedAt time.Time `db:"StudyUpdatedAt"` } // StudyRepository handles database operations related to studies type StudyRepository struct { *Repository } // NewStudyRepository creates a new study repository func NewStudyRepository() *StudyRepository { return &StudyRepository{ Repository: NewRepository(), } } // GetPatientStudies retrieves all studies for a patient func (r *StudyRepository) GetPatientStudies(patientID string) ([]string, []string, error) { var studies []DBStudy query := `SELECT * FROM study WHERE Study_PatientID = ?` err := database.DB.Select(&studies, query, patientID) if err != nil { return nil, nil, fmt.Errorf("database error getting patient studies: %w", err) } var studyUIDs []string var accessionNumbers []string for _, study := range studies { studyUIDs = append(studyUIDs, study.StudyIUID) if study.StudyAccessionNumber != "" { accessionNumbers = append(accessionNumbers, study.StudyAccessionNumber) } } return studyUIDs, accessionNumbers, nil } // GetStudyByUID retrieves a study by its UID func (r *StudyRepository) GetStudyByUID(studyUID string) (*DBStudy, error) { var study DBStudy query := `SELECT * FROM study WHERE StudyIUID = ?` err := database.DB.Get(&study, query, studyUID) if err != nil { return nil, fmt.Errorf("database error getting study: %w", err) } return &study, nil } // CreateStudyTx creates a new study record for a patient within a transaction func (r *StudyRepository) CreateStudyTx(tx *sqlx.Tx, patientID string, study models.Study) error { // Parse study date if provided var studyDate *time.Time if study.StudyDate != "" { parsedTime, err := time.Parse("2006-01-02", study.StudyDate) if err != nil { return fmt.Errorf("invalid study date format: %w", err) } studyDate = &parsedTime } query := `INSERT INTO study (Study_PatientID, StudyIUID, StudyAccessionNumber, StudyDate, StudyCreatedAt, StudyUpdatedAt) VALUES (?, ?, ?, ?, NOW(), NOW())` _, err := tx.Exec(query, patientID, study.StudyInstanceUID, study.AccessionNumber, studyDate) if err != nil { return fmt.Errorf("database error creating study: %w", err) } return nil }