Files
2026-02-13 15:57:28 +07:00

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