feat (patient): upload done

This commit is contained in:
dpurbosakti
2025-09-24 14:24:57 +07:00
parent 016fcc667c
commit f618a2d6d0
10 changed files with 229 additions and 37 deletions
@@ -1,6 +1,7 @@
package patient
import (
"errors"
"strconv"
e "simrs-vx/internal/domain/main-entities/patient"
@@ -10,6 +11,8 @@ import (
upc "simrs-vx/internal/use-case/main-use-case/person-contact"
upr "simrs-vx/internal/use-case/main-use-case/person-relative"
ere "simrs-vx/internal/domain/references/encounter"
pl "simrs-vx/pkg/logger"
pu "simrs-vx/pkg/use-case-helper"
@@ -359,3 +362,73 @@ func Search(input e.SearchDto) (*d.Data, error) {
Data: data.ToResponse(),
}, nil
}
func Upload(input e.UploadDto) (*d.Data, error) {
rdDto := e.ReadDetailDto{Id: uint16(input.Id)}
var data *e.Patient
var err error
event := pl.Event{
Feature: "Upload",
Source: source,
}
// Start log
pl.SetLogInfo(&event, input, "started", "upload")
err = dg.I.Transaction(func(tx *gorm.DB) error {
if !ere.IsValidUploadCode(input.Code) {
return errors.New("invalid upload code")
}
pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail")
if data, err = ReadDetailData(rdDto, &event, tx); err != nil {
return err
}
if data.Person == nil {
return errors.New("person not found")
}
person := data.Person
input.MedRecNumber = *data.Number
pubUrl, err := uploadAndGenerateFileUrl(input, &event)
if err != nil {
event.Action = ""
}
switch input.Code {
case ere.UCPRN:
person.ResidentIdentityFileUrl = &pubUrl
case ere.UCPDL:
person.DrivingLicenseFileUrl = &pubUrl
case ere.UCPP:
person.PassportFileUrl = &pubUrl
case ere.UCPFC:
person.FamilyIdentityFileUrl = &pubUrl
default:
return errors.New("invalid upload code")
}
if err := tx.Save(&person).Error; err != nil {
return err
}
pl.SetLogInfo(&event, nil, "complete")
return nil
})
if err != nil {
return nil, err
}
return &d.Data{
Meta: d.IS{
"source": source,
"structure": "single-data",
"status": "uploaded",
},
Data: data.ToResponse(),
}, nil
}
@@ -6,8 +6,16 @@ package patient
import (
"fmt"
e "simrs-vx/internal/domain/main-entities/patient"
"path/filepath"
"strconv"
"strings"
"time"
e "simrs-vx/internal/domain/main-entities/patient"
pl "simrs-vx/pkg/logger"
pmh "simrs-vx/pkg/minio-helper"
puh "simrs-vx/pkg/upload-helper"
dg "github.com/karincake/apem/db-gorm-pg"
)
@@ -81,3 +89,33 @@ func GenerateNextMedicalRecordNumber() (string, error) {
return fmt.Sprintf(format, nextInt), nil
}
func uploadAndGenerateFileUrl(input e.UploadDto, event *pl.Event) (string, error) {
pl.SetLogInfo(event, input, "started", "uploadAndGenerateFileUrl")
bucket := string(input.Code)
ext := strings.ToLower(filepath.Ext(input.Filename))
if !puh.IsValidFileType(ext, bucket) {
return "", fmt.Errorf("invalid file type: %s", input.Filename)
}
objectName := fmt.Sprintf("%s%d%s", input.MedRecNumber, time.Now().UnixNano(), ext)
uploadInput := pmh.UploadReaderInput{
BucketName: bucket,
Name: objectName,
File: input.File,
Size: input.Size,
ContentType: input.MimeType,
}
_, err := pmh.I.PutObject(uploadInput)
if err != nil {
return "", err
}
// Build URL for access
publicUrl := pmh.I.GenerateUrl(bucket, objectName)
pl.SetLogInfo(event, nil, "complete")
return publicUrl, nil
}