diff --git a/internal/domain/_template/single/dto.go b/internal/domain/_template/single/dto.go index ba3e602b..472137a4 100644 --- a/internal/domain/_template/single/dto.go +++ b/internal/domain/_template/single/dto.go @@ -9,9 +9,14 @@ type Createdto struct { type ReadListDto struct { Code string `json:"code"` Name string `json:"name"` + + Page int `json:"page"` + PageSize int `json:"page_size"` + NoPagination int `json:"no_pagination"` } type ReadDetailDto struct { + Id uint `json:"id"` Code string `json:"code"` Name string `json:"name"` } @@ -24,3 +29,9 @@ type Updatedto struct { type Deletedto struct { Id uint `json:"id"` } + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int64 `json:"count"` +} diff --git a/internal/use-case/_use-case-template/crud/case.go b/internal/use-case/_use-case-template/crud/case.go index cf617ff7..6312c950 100644 --- a/internal/use-case/_use-case-template/crud/case.go +++ b/internal/use-case/_use-case-template/crud/case.go @@ -5,29 +5,36 @@ Any functions that are available to be used externally. package crud import ( + "strconv" + dg "github.com/karincake/apem/db-gorm-pg" + lo "github.com/karincake/apem/logero" d "github.com/karincake/dodol" "gorm.io/gorm" - e "simrs-vx/internal/domain/main-entities/single" + e "simrs-vx/internal/domain/_template/single" ) const source = "crud" func Create(input e.Createdto) (*d.Data, error) { + data := e.Single{} + + setData(&data, &input) err := dg.I.Transaction(func(tx *gorm.DB) error { + lo.I. for i := range createPreMw { - if err := createPreMw[i](&input, &data, dg.I); err != nil { + if err := createPreMw[i](&input, &data, tx); err != nil { return nil } } - - if err := dg.I.Create(&data).Error; err != nil { + slog. + if result, err := CreateData(&data, tx).Error; err != nil { return nil } for i := range createPostMw { - if err := createPostMw[i](&input, &data, dg.I); err != nil { + if err := createPostMw[i](&input, &data, tx); err != nil { return nil } } @@ -46,26 +53,129 @@ func Create(input e.Createdto) (*d.Data, error) { } func ReadList(input e.ReadListDto) (*d.Data, error) { - data := d.Data{} - query := dg.I - query.Find(&data) - if err := query.Error; err != nil { - return nil, err - } + err := dg.I.Transaction(func(tx *gorm.DB) error { + for i := range readListPreMw { + if err := readListPreMw[i](&input, &data, tx); err != nil { + return nil + } + } + + data, meta, err := ReadListData(input, tx) + if err != nil { + return nil, err + } + + for i := range readListPostMw { + if err := readListPostMw[i](&input, &data, tx); err != nil { + return nil + } + } + + return nil + }) + return &d.Data{ - Meta: d.II{}, + Meta: d.IS{ + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(meta.PageNumber), + "page_size": strconv.Itoa(meta.PageSize), + "record_totalCount": strconv.Itoa(meta.Count), + }, Data: data, }, nil } -func ReadDetail() { +func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { + err := dg.I.Transaction(func(tx *gorm.DB) error { + for i := range readDetailPreMw { + if err := readDetailPreMw[i](&input, &data, tx); err != nil { + return nil + } + } + data, err := ReadDetailData(input, tx) + if err != nil { + return nil, err + } + for i := range readDetailPostMw { + if err := readDetailPostMw[i](&input, &data, tx); err != nil { + return nil + } + } + return nil + }) + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "fetched", + }, + Data: data, + }, nil +} + +func Update(input e.Updatedto) (*d.Data, error) { + err := dg.I.Transaction(func(tx *gorm.DB) error { + data, err := ReadDetailData(input, tx) + if err != nil { + return nil + } + + setData(&data, &input) + for i := range updatePreMw { + if err := updatePreMw[i](&input, &data, tx); err != nil { + return nil + } + } + if err := UpdateData(*data, tx); err != nil { + return nil + } + for i := range updatePostMw { + if err := updatePostMw[i](&input, &data, tx); err != nil { + return nil + } + } + return nil + }) + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "updated", + }, + Data: data, + }, nil } -func Update() { - -} - -func Delete() { +func Delete(input e.Deletedto) (*d.Data, error) { + err := dg.I.Transaction(func(tx *gorm.DB) error { + data, err := ReadDetailData(input, tx) + if err != nil { + return nil + } + for i := range deletePreMw { + if err := deletePreMw[i](&input, &data, tx); err != nil { + return nil + } + } + if err := DeleteData(data, tx); err != nil { + return nil + } + for i := range deletePostMw { + if err := deletePostMw[i](&input, &data, tx); err != nil { + return nil + } + } + }) + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "deleted", + }, + Data: data, + }, nil } diff --git a/internal/use-case/_use-case-template/crud/lib.go b/internal/use-case/_use-case-template/crud/lib.go index 0283c7d8..24ee2398 100644 --- a/internal/use-case/_use-case-template/crud/lib.go +++ b/internal/use-case/_use-case-template/crud/lib.go @@ -1,25 +1,101 @@ package crud import ( - e "simrs-vx/internal/domain/main-entities/single" + e "simrs-vx/internal/domain/_template/single" dg "github.com/karincake/apem/db-gorm-pg" + gh "github.com/karincake/getuk" "gorm.io/gorm" ) -func CreateData(input e.Createdto, tx ...*gorm.DB) (*e.Single, error) { - data := e.Single{} - - var db *gorm.DB - if tx != nil { - db = tx +func CreateData(input *e.Single, dbx ...*gorm.DB) (*e.Single, error) { + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] } else { - db = dg.I + tx = dg.I } - if err := dg.I.Create(&data).Error; err != nil { + if err := tx.Create(&data).Error; err != nil { return nil, err } return &data, err } + +func ReadListData(input e.ReadListDto, dbx ...*gorm.DB) ([]e.Single, *e.MetaDto, error) { + data := []e.Single{} + pagination := gh.Pagination{} + count := int64(0) + meta := e.MetaDto{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + tx = tx. + Model(&e.Single{}). + // Joins("Patient"). // if needed + // Preload("Patient"). // if needed + Scopes(gh.Filter(input)). + Count(&count). + Scopes(gh.Paginate(input, &pagination)). + Order("CreatedAt DESC") + + if err := tx.Find(&data).Error; err != nil { + if err == gorm.ErrRecordNotFound { + return nil, &meta, nil + } + return nil, nil, err + + } + meta.Count = count + meta.PageNumber = pagination.PageNumber + meta.PageSize = pagination.PageSize + return data, &meta, nil +} + +func ReadDetailData(input e.ReadDetailDto, dbx ...*gorm.DB) (*e.Single, error) { + data := e.Single{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.First(&data, input.Id).Error; err != nil { + if err == gorm.ErrRecordNotFound { + return nil, nil + } + return nil, err + } + + return &data, nil +} + +func UpdateData(input e.Single, dbx ...*gorm.DB) error { + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + return tx.Save(&input).Error +} + +func DeleteData(input *e.Single, dbx ...*gorm.DB) error { + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + return tx.Delete(input).Error +}