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) }