feat (patient): upload done
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user