package models import ( "database/sql" "database/sql/driver" "time" ) // NullableInt32 is a custom type to replace sql.NullInt32 for swagger compatibility type NullableInt32 struct { Int32 int32 `json:"int32,omitempty"` Valid bool `json:"valid"` } // Scan implements the sql.Scanner interface for NullableInt32 func (n *NullableInt32) Scan(value interface{}) error { var ni sql.NullInt32 if err := ni.Scan(value); err != nil { return err } n.Int32 = ni.Int32 n.Valid = ni.Valid return nil } // Value implements the driver.Valuer interface for NullableInt32 func (n NullableInt32) Value() (driver.Value, error) { if !n.Valid { return nil, nil } return n.Int32, nil } // Metadata untuk pagination - dioptimalkan type MetaResponse struct { Limit int `json:"limit"` Offset int `json:"offset"` Total int `json:"total"` TotalPages int `json:"total_pages"` CurrentPage int `json:"current_page"` HasNext bool `json:"has_next"` HasPrev bool `json:"has_prev"` } // Aggregate data untuk summary type AggregateData struct { TotalActive int `json:"total_active"` TotalDraft int `json:"total_draft"` TotalInactive int `json:"total_inactive"` ByStatus map[string]int `json:"by_status"` ByDinas map[string]int `json:"by_dinas,omitempty"` ByJenis map[string]int `json:"by_jenis,omitempty"` LastUpdated *time.Time `json:"last_updated,omitempty"` CreatedToday int `json:"created_today"` UpdatedToday int `json:"updated_today"` } // Error response yang konsisten type ErrorResponse struct { Error string `json:"error"` Code int `json:"code"` Message string `json:"message"` Timestamp time.Time `json:"timestamp"` } // Validation constants const ( StatusDraft = "draft" StatusActive = "active" StatusInactive = "inactive" StatusDeleted = "deleted" ) // ValidStatuses untuk validasi var ValidStatuses = []string{StatusDraft, StatusActive, StatusInactive} // IsValidStatus helper function func IsValidStatus(status string) bool { for _, validStatus := range ValidStatuses { if status == validStatus { return true } } return false }