456 lines
13 KiB
Go
456 lines
13 KiB
Go
package pasien
|
|
|
|
import (
|
|
"api-service/internal/models"
|
|
"database/sql"
|
|
"encoding/json"
|
|
"time"
|
|
)
|
|
|
|
// Pasien represents the data structure for the m_pasien table
|
|
// with proper null handling and optimized JSON marshaling
|
|
type Pasien struct {
|
|
ID int32 `json:"id" db:"id"`
|
|
Nomr sql.NullString `json:"nomr,omitempty" db:"nomr"`
|
|
Status sql.NullString `json:"status,omitempty" db:"status"`
|
|
Title sql.NullString `json:"title,omitempty" db:"title"`
|
|
Nama sql.NullString `json:"nama,omitempty" db:"nama"`
|
|
Tempat sql.NullString `json:"tempat,omitempty" db:"tempat"`
|
|
Tgllahir sql.NullTime `json:"tgllahir,omitempty" db:"tgllahir"`
|
|
Jeniskelamin sql.NullString `json:"jeniskelamin,omitempty" db:"jeniskelamin"`
|
|
Alamat sql.NullString `json:"alamat,omitempty" db:"alamat"`
|
|
Kelurahan sql.NullInt64 `json:"kelurahan,omitempty" db:"kelurahan"`
|
|
Kdkecamatan sql.NullInt32 `json:"kdkecamatan,omitempty" db:"kdkecamatan"`
|
|
Kota sql.NullInt32 `json:"kota,omitempty" db:"kota"`
|
|
Kdprovinsi sql.NullInt32 `json:"kdprovinsi,omitempty" db:"kdprovinsi"`
|
|
Agama sql.NullInt32 `json:"agama,omitempty" db:"agama"`
|
|
NoKartu sql.NullString `json:"noKartu,omitempty" db:"no_kartu"`
|
|
NoktpBaru sql.NullString `json:"noktpBaru,omitempty" db:"noktp_baru"`
|
|
CreatedAt sql.NullTime `json:"createdAt,omitempty" db:"created_at"`
|
|
UpdatedAt sql.NullTime `json:"updatedAt,omitempty" db:"updated_at"`
|
|
Idprovinsi int32 `json:"idprovinsi" db:"idprovinsi"`
|
|
Namaprovinsi sql.NullString `json:"namaprovinsi,omitempty" db:"namaprovinsi"`
|
|
Idkota int32 `json:"idkota" db:"idkota"`
|
|
Namakota sql.NullString `json:"namakota,omitempty" db:"namakota"`
|
|
Idkecamatan int64 `json:"idkecamatan" db:"idkecamatan"`
|
|
Namakecamatan sql.NullString `json:"namakecamatan,omitempty" db:"namakecamatan"`
|
|
Idkelurahan int64 `json:"idkelurahan" db:"idkelurahan"`
|
|
Namakelurahan sql.NullString `json:"namakelurahan,omitempty" db:"namakelurahan"`
|
|
}
|
|
|
|
// Custom JSON marshaling for Pasien so NULL values don't appear in response
|
|
func (r Pasien) MarshalJSON() ([]byte, error) {
|
|
type Alias Pasien
|
|
aux := &struct {
|
|
*Alias
|
|
Nomr *string `json:"nomr,omitempty"`
|
|
Status *string `json:"status,omitempty"`
|
|
Title *string `json:"title,omitempty"`
|
|
Nama *string `json:"nama,omitempty"`
|
|
Tempat *string `json:"tempat,omitempty"`
|
|
Tgllahir *time.Time `json:"tgllahir,omitempty"`
|
|
Jeniskelamin *string `json:"jeniskelamin,omitempty"`
|
|
Alamat *string `json:"alamat,omitempty"`
|
|
Kelurahan *int64 `json:"kelurahan,omitempty"`
|
|
Kdkecamatan *int32 `json:"kdkecamatan,omitempty"`
|
|
Kota *int32 `json:"kota,omitempty"`
|
|
Kdprovinsi *int32 `json:"kdprovinsi,omitempty"`
|
|
Agama *int32 `json:"agama,omitempty"`
|
|
NoKartu *string `json:"noKartu,omitempty"`
|
|
NoktpBaru *string `json:"noktpBaru,omitempty"`
|
|
CreatedAt *time.Time `json:"createdAt,omitempty"`
|
|
UpdatedAt *time.Time `json:"updatedAt,omitempty"`
|
|
Namaprovinsi *string `json:"namaprovinsi,omitempty"`
|
|
Namakota *string `json:"namakota,omitempty"`
|
|
Namakecamatan *string `json:"namakecamatan,omitempty"`
|
|
Namakelurahan *string `json:"namakelurahan,omitempty"`
|
|
}{
|
|
Alias: (*Alias)(&r),
|
|
}
|
|
|
|
if r.Nomr.Valid {
|
|
aux.Nomr = &r.Nomr.String
|
|
}
|
|
if r.Status.Valid {
|
|
aux.Status = &r.Status.String
|
|
}
|
|
if r.Title.Valid {
|
|
aux.Title = &r.Title.String
|
|
}
|
|
if r.Nama.Valid {
|
|
aux.Nama = &r.Nama.String
|
|
}
|
|
if r.Tempat.Valid {
|
|
aux.Tempat = &r.Tempat.String
|
|
}
|
|
if r.Tgllahir.Valid {
|
|
aux.Tgllahir = &r.Tgllahir.Time
|
|
}
|
|
if r.Jeniskelamin.Valid {
|
|
aux.Jeniskelamin = &r.Jeniskelamin.String
|
|
}
|
|
if r.Alamat.Valid {
|
|
aux.Alamat = &r.Alamat.String
|
|
}
|
|
if r.Kelurahan.Valid {
|
|
aux.Kelurahan = &r.Kelurahan.Int64
|
|
}
|
|
if r.Kdkecamatan.Valid {
|
|
aux.Kdkecamatan = &r.Kdkecamatan.Int32
|
|
}
|
|
if r.Kota.Valid {
|
|
aux.Kota = &r.Kota.Int32
|
|
}
|
|
if r.Kdprovinsi.Valid {
|
|
aux.Kdprovinsi = &r.Kdprovinsi.Int32
|
|
}
|
|
if r.Agama.Valid {
|
|
aux.Agama = &r.Agama.Int32
|
|
}
|
|
if r.NoKartu.Valid {
|
|
aux.NoKartu = &r.NoKartu.String
|
|
}
|
|
if r.NoktpBaru.Valid {
|
|
aux.NoktpBaru = &r.NoktpBaru.String
|
|
}
|
|
if r.CreatedAt.Valid {
|
|
aux.CreatedAt = &r.CreatedAt.Time
|
|
}
|
|
if r.UpdatedAt.Valid {
|
|
aux.UpdatedAt = &r.UpdatedAt.Time
|
|
}
|
|
if r.Namaprovinsi.Valid {
|
|
aux.Namaprovinsi = &r.Namaprovinsi.String
|
|
}
|
|
if r.Namakota.Valid {
|
|
aux.Namakota = &r.Namakota.String
|
|
}
|
|
if r.Namakecamatan.Valid {
|
|
aux.Namakecamatan = &r.Namakecamatan.String
|
|
}
|
|
if r.Namakelurahan.Valid {
|
|
aux.Namakelurahan = &r.Namakelurahan.String
|
|
}
|
|
return json.Marshal(aux)
|
|
}
|
|
|
|
// Helper method to safely get Nomr
|
|
func (r *Pasien) GetNomr() string {
|
|
if r.Nomr.Valid {
|
|
return r.Nomr.String
|
|
}
|
|
return ""
|
|
}
|
|
|
|
// Helper method to safely get Status
|
|
func (r *Pasien) GetStatus() string {
|
|
if r.Status.Valid {
|
|
return r.Status.String
|
|
}
|
|
return ""
|
|
}
|
|
|
|
// Helper method to safely get Title
|
|
func (r *Pasien) GetTitle() string {
|
|
if r.Title.Valid {
|
|
return r.Title.String
|
|
}
|
|
return ""
|
|
}
|
|
|
|
// Helper method to safely get Nama
|
|
func (r *Pasien) GetNama() string {
|
|
if r.Nama.Valid {
|
|
return r.Nama.String
|
|
}
|
|
return ""
|
|
}
|
|
|
|
// Helper method to safely get Tempat
|
|
func (r *Pasien) GetTempat() string {
|
|
if r.Tempat.Valid {
|
|
return r.Tempat.String
|
|
}
|
|
return ""
|
|
}
|
|
|
|
// Helper method to safely get Tgllahir
|
|
func (r *Pasien) GetTgllahir() time.Time {
|
|
if r.Tgllahir.Valid {
|
|
return r.Tgllahir.Time
|
|
}
|
|
return time.Time{}
|
|
}
|
|
|
|
// Helper method to safely get Jeniskelamin
|
|
func (r *Pasien) GetJeniskelamin() string {
|
|
if r.Jeniskelamin.Valid {
|
|
return r.Jeniskelamin.String
|
|
}
|
|
return ""
|
|
}
|
|
|
|
// Helper method to safely get Alamat
|
|
func (r *Pasien) GetAlamat() string {
|
|
if r.Alamat.Valid {
|
|
return r.Alamat.String
|
|
}
|
|
return ""
|
|
}
|
|
|
|
// Helper method to safely get Kelurahan
|
|
func (r *Pasien) GetKelurahan() int64 {
|
|
if r.Kelurahan.Valid {
|
|
return r.Kelurahan.Int64
|
|
}
|
|
return 0
|
|
}
|
|
|
|
// Helper method to safely get Kdkecamatan
|
|
func (r *Pasien) GetKdkecamatan() int32 {
|
|
if r.Kdkecamatan.Valid {
|
|
return r.Kdkecamatan.Int32
|
|
}
|
|
return 0
|
|
}
|
|
|
|
// Helper method to safely get Kota
|
|
func (r *Pasien) GetKota() int32 {
|
|
if r.Kota.Valid {
|
|
return r.Kota.Int32
|
|
}
|
|
return 0
|
|
}
|
|
|
|
// Helper method to safely get Kdprovinsi
|
|
func (r *Pasien) GetKdprovinsi() int32 {
|
|
if r.Kdprovinsi.Valid {
|
|
return r.Kdprovinsi.Int32
|
|
}
|
|
return 0
|
|
}
|
|
|
|
// Helper method to safely get Agama
|
|
func (r *Pasien) GetAgama() int32 {
|
|
if r.Agama.Valid {
|
|
return r.Agama.Int32
|
|
}
|
|
return 0
|
|
}
|
|
|
|
// Helper method to safely get NoKartu
|
|
func (r *Pasien) GetNoKartu() string {
|
|
if r.NoKartu.Valid {
|
|
return r.NoKartu.String
|
|
}
|
|
return ""
|
|
}
|
|
|
|
// Helper method to safely get NoktpBaru
|
|
func (r *Pasien) GetNoktpBaru() string {
|
|
if r.NoktpBaru.Valid {
|
|
return r.NoktpBaru.String
|
|
}
|
|
return ""
|
|
}
|
|
|
|
// Helper method to safely get CreatedAt
|
|
func (r *Pasien) GetCreatedAt() time.Time {
|
|
if r.CreatedAt.Valid {
|
|
return r.CreatedAt.Time
|
|
}
|
|
return time.Time{}
|
|
}
|
|
|
|
// Helper method to safely get UpdatedAt
|
|
func (r *Pasien) GetUpdatedAt() time.Time {
|
|
if r.UpdatedAt.Valid {
|
|
return r.UpdatedAt.Time
|
|
}
|
|
return time.Time{}
|
|
}
|
|
|
|
// Helper method to safely get Namaprovinsi
|
|
func (r *Pasien) GetNamaprovinsi() string {
|
|
if r.Namaprovinsi.Valid {
|
|
return r.Namaprovinsi.String
|
|
}
|
|
return ""
|
|
}
|
|
|
|
// Helper method to safely get Namakota
|
|
func (r *Pasien) GetNamakota() string {
|
|
if r.Namakota.Valid {
|
|
return r.Namakota.String
|
|
}
|
|
return ""
|
|
}
|
|
|
|
// Helper method to safely get Namakecamatan
|
|
func (r *Pasien) GetNamakecamatan() string {
|
|
if r.Namakecamatan.Valid {
|
|
return r.Namakecamatan.String
|
|
}
|
|
return ""
|
|
}
|
|
|
|
// Helper method to safely get Namakelurahan
|
|
func (r *Pasien) GetNamakelurahan() string {
|
|
if r.Namakelurahan.Valid {
|
|
return r.Namakelurahan.String
|
|
}
|
|
return ""
|
|
}
|
|
|
|
// Response struct for delete
|
|
type PasienDeleteResponse struct {
|
|
Message string `json:"message"`
|
|
ID string `json:"id"`
|
|
}
|
|
|
|
// Response struct for by age
|
|
type PasienAgeStatsResponse struct {
|
|
Message string `json:"message"`
|
|
Data map[string]interface{} `json:"data"`
|
|
}
|
|
|
|
// Response struct for create
|
|
type PasienCreateResponse struct {
|
|
Message string `json:"message"`
|
|
Data *Pasien `json:"data"`
|
|
}
|
|
|
|
// Request struct for create
|
|
type PasienCreateRequest struct {
|
|
Status *string `json:"status" validate:"required,oneof=draft active inactive"`
|
|
ID *int32 `json:"id"`
|
|
Nomr *string `json:"nomr"`
|
|
Title *string `json:"title" validate:"required,min=1,max=100"`
|
|
Nama *string `json:"nama" validate:"required,min=1,max=100"`
|
|
Tempat *string `json:"tempat"`
|
|
Tgllahir *time.Time `json:"tgllahir"`
|
|
Jeniskelamin *string `json:"jeniskelamin" validate:"oneof=L P"`
|
|
Alamat *string `json:"alamat"`
|
|
Kelurahan *int64 `json:"kelurahan"`
|
|
Kdkecamatan *int32 `json:"kdkecamatan"`
|
|
Kota *int32 `json:"kota"`
|
|
Kdprovinsi *int32 `json:"kdprovinsi"`
|
|
Agama *int32 `json:"agama"`
|
|
NoKartu *string `json:"noKartu"`
|
|
NoktpBaru *string `json:"noktpBaru"`
|
|
}
|
|
|
|
// Response struct for GET list
|
|
type PasienGetResponse struct {
|
|
Message string `json:"message"`
|
|
Data []Pasien `json:"data"`
|
|
Meta models.MetaResponse `json:"meta"`
|
|
Summary *models.AggregateData `json:"summary,omitempty"`
|
|
}
|
|
|
|
// Response struct for update
|
|
type PasienUpdateResponse struct {
|
|
Message string `json:"message"`
|
|
Data *Pasien `json:"data"`
|
|
}
|
|
|
|
// Update request
|
|
type PasienUpdateRequest struct {
|
|
ID *int32 `json:"-" validate:"required"`
|
|
Status *string `json:"status" validate:"required,oneof=draft active inactive"`
|
|
Nomr *string `json:"nomr"`
|
|
Title *string `json:"title" validate:"omitempty,min=1,max=255"`
|
|
Nama *string `json:"nama" validate:"required,min=1,max=100"`
|
|
Tempat *string `json:"tempat"`
|
|
Tgllahir *time.Time `json:"tgllahir"`
|
|
Jeniskelamin *string `json:"jeniskelamin" validate:"oneof=L P"`
|
|
Alamat *string `json:"alamat"`
|
|
Kelurahan *int64 `json:"kelurahan"`
|
|
Kdkecamatan *int32 `json:"kdkecamatan"`
|
|
Kota *int32 `json:"kota"`
|
|
Kdprovinsi *int32 `json:"kdprovinsi"`
|
|
Agama *int32 `json:"agama"`
|
|
NoKartu *string `json:"noKartu"`
|
|
NoktpBaru *string `json:"noktpBaru"`
|
|
}
|
|
|
|
// Response struct for get by ID
|
|
type PasienGetByIDResponse struct {
|
|
Message string `json:"message"`
|
|
Data *Pasien `json:"data"`
|
|
}
|
|
|
|
// Response struct for get by nomr
|
|
type PasienGetByNomrResponse struct {
|
|
Message string `json:"message"`
|
|
Data []Pasien `json:"data"`
|
|
Meta models.MetaResponse `json:"meta"`
|
|
Summary *models.AggregateData `json:"summary,omitempty"`
|
|
}
|
|
|
|
// Filter struct for query parameters
|
|
type PasienFilter struct {
|
|
Search *string `json:"search,omitempty" form:"search"`
|
|
DateFrom *time.Time `json:"date_from,omitempty" form:"date_from"`
|
|
DateTo *time.Time `json:"date_to,omitempty" form:"date_to"`
|
|
Status *string `json:"status,omitempty" form:"status"`
|
|
}
|
|
|
|
type PasienData struct {
|
|
Nomr string `json:"nomr" db:"nomr"`
|
|
NamaLengkap string `json:"nama" db:"nama"`
|
|
NoTelp string `json:"notelp" db:"notelp"`
|
|
JenisKelamin string `json:"jeniskelamin" db:"jeniskelamin"`
|
|
TTL time.Time `json:"tgllahir" db:"tgllahir"`
|
|
Alamat string `json:"alamat" db:"alamat"`
|
|
IdProvinsi int `json:"idprovinsi" db:"idprovinsi"`
|
|
IdKota int `json:"idkota" db:"idkota"`
|
|
IdKecamatan int `json:"idkecamatan" db:"idkecamatan"`
|
|
IdKelurahan int `json:"idkelurahan" db:"idkelurahan"`
|
|
NamaProvinsi string `json:"namaprovinsi" db:"namaprovinsi"`
|
|
NamaKota string `json:"namakota" db:"namakota"`
|
|
NamaKecamatan string `json:"namakecamatan" db:"namakecamatan"`
|
|
NamaKelurahan string `json:"namakelurahan" db:"namakelurahan"`
|
|
}
|
|
|
|
func (p PasienData) MarshalJSON() ([]byte, error) {
|
|
// Struct untuk output JSON
|
|
output := struct {
|
|
Nomr string `json:"nomr"`
|
|
NamaLengkap string `json:"nama"`
|
|
NoTelp string `json:"notelp"`
|
|
JenisKelamin string `json:"jeniskelamin"`
|
|
TglLahir string `json:"tgllahir"`
|
|
Alamat string `json:"alamat"`
|
|
IdProvinsi int `json:"idprovinsi"`
|
|
IdKota int `json:"idkota"`
|
|
IdKecamatan int `json:"idkecamatan"`
|
|
IdKelurahan int `json:"idkelurahan"`
|
|
NamaProvinsi string `json:"namaprovinsi"`
|
|
NamaKota string `json:"namakota"`
|
|
NamaKecamatan string `json:"namakecamatan"`
|
|
NamaKelurahan string `json:"namakelurahan"`
|
|
}{
|
|
Nomr: p.Nomr,
|
|
NamaLengkap: p.NamaLengkap,
|
|
NoTelp: p.NoTelp,
|
|
JenisKelamin: p.JenisKelamin,
|
|
Alamat: p.Alamat,
|
|
IdProvinsi: p.IdProvinsi,
|
|
IdKota: p.IdKota,
|
|
IdKecamatan: p.IdKecamatan,
|
|
IdKelurahan: p.IdKelurahan,
|
|
NamaProvinsi: p.NamaProvinsi,
|
|
NamaKota: p.NamaKota,
|
|
NamaKecamatan: p.NamaKecamatan,
|
|
NamaKelurahan: p.NamaKelurahan,
|
|
}
|
|
|
|
// ✅ Format tanggal lahir
|
|
if !p.TTL.IsZero() {
|
|
output.TglLahir = p.TTL.Format("2006-01-02")
|
|
}
|
|
|
|
return json.Marshal(output)
|
|
}
|