* fix(style): formatting inconsistencies across codebase - Remove trailing semicolons from TypeScript imports - Fix Vue template indentation and line breaks - Standardize component attribute formatting - Remove unnecessary empty lines - Reorder import statements for consistency * chore: update import path and add editorconfig Update SidebarNavLink import path to match new component structure and add standard editorconfig for consistent code formatting
172 lines
3.8 KiB
TypeScript
172 lines
3.8 KiB
TypeScript
export default defineEventHandler(async (event) => {
|
|
const body = await readBody(event)
|
|
|
|
// Mock data lengkap
|
|
const mockData = [
|
|
{
|
|
id: 'RSC001',
|
|
resource_type: 'Encounter',
|
|
patient: {
|
|
name: 'Ahmad Wepe',
|
|
mrn: 'RM001234',
|
|
},
|
|
status: 2, // 0: failed, 1: pending, 2: success
|
|
updated_at: '2025-01-15',
|
|
fhir_id: 'ENC-00123',
|
|
},
|
|
{
|
|
id: 'RSC002',
|
|
resource_type: 'Patient',
|
|
patient: {
|
|
name: 'Siti Aminah',
|
|
mrn: 'RM001235',
|
|
},
|
|
status: 1,
|
|
updated_at: '2025-01-10',
|
|
fhir_id: 'PAT-001235',
|
|
},
|
|
{
|
|
id: 'RSC003',
|
|
resource_type: 'Observation',
|
|
patient: {
|
|
name: 'Budi Antono',
|
|
mrn: 'RM001236',
|
|
},
|
|
status: 0,
|
|
updated_at: '2025-01-11',
|
|
fhir_id: 'OBS-001236',
|
|
},
|
|
{
|
|
id: 'RSC004',
|
|
resource_type: 'Encounter',
|
|
patient: {
|
|
name: 'Maria Sari',
|
|
mrn: 'RM001237',
|
|
},
|
|
status: 2,
|
|
updated_at: '2025-01-12',
|
|
fhir_id: 'ENC-001237',
|
|
},
|
|
{
|
|
id: 'RSC005',
|
|
resource_type: 'Patient',
|
|
patient: {
|
|
name: 'Joko Widodo',
|
|
mrn: 'RM001238',
|
|
},
|
|
status: 1,
|
|
updated_at: '2025-01-13',
|
|
fhir_id: 'PAT-001238',
|
|
},
|
|
{
|
|
id: 'RSC006',
|
|
resource_type: 'Observation',
|
|
patient: {
|
|
name: 'Dewi Sartika',
|
|
mrn: 'RM001239',
|
|
},
|
|
status: 2,
|
|
updated_at: '2025-01-14',
|
|
fhir_id: 'OBS-001239',
|
|
},
|
|
{
|
|
id: 'RSC007',
|
|
resource_type: 'Encounter',
|
|
patient: {
|
|
name: 'Rudi Hartono',
|
|
mrn: 'RM001240',
|
|
},
|
|
status: 0,
|
|
updated_at: '2025-01-16',
|
|
fhir_id: 'ENC-001240',
|
|
},
|
|
{
|
|
id: 'RSC008',
|
|
resource_type: 'Patient',
|
|
patient: {
|
|
name: 'Sri Mulyani',
|
|
mrn: 'RM001241',
|
|
},
|
|
status: 2,
|
|
updated_at: '2025-01-17',
|
|
fhir_id: 'PAT-001241',
|
|
},
|
|
]
|
|
|
|
// Ekstrak parameter filter dari request body
|
|
const {
|
|
status,
|
|
resource_type,
|
|
date_from,
|
|
date_to,
|
|
search,
|
|
page = 1,
|
|
limit = 10,
|
|
} = body
|
|
|
|
let filteredData = [...mockData]
|
|
|
|
// Filter berdasarkan status
|
|
if (status !== undefined && status !== null && status !== '') {
|
|
filteredData = filteredData.filter(item => item.status === Number(status))
|
|
}
|
|
|
|
// Filter berdasarkan resource_type (transaction type)
|
|
if (resource_type && resource_type !== 'all') {
|
|
filteredData = filteredData.filter(item =>
|
|
item.resource_type.toLowerCase() === resource_type.toLowerCase(),
|
|
)
|
|
}
|
|
|
|
// Filter berdasarkan rentang tanggal
|
|
if (date_from) {
|
|
filteredData = filteredData.filter(item =>
|
|
new Date(item.updated_at) >= new Date(date_from),
|
|
)
|
|
}
|
|
|
|
if (date_to) {
|
|
filteredData = filteredData.filter(item =>
|
|
new Date(item.updated_at) <= new Date(date_to),
|
|
)
|
|
}
|
|
|
|
// Filter berdasarkan pencarian nama pasien atau MRN
|
|
if (search) {
|
|
filteredData = filteredData.filter(item =>
|
|
item.patient.name.toLowerCase().includes(search.toLowerCase())
|
|
|| item.patient.mrn.toLowerCase().includes(search.toLowerCase())
|
|
|| item.fhir_id.toLowerCase().includes(search.toLowerCase()),
|
|
)
|
|
}
|
|
|
|
// Pagination
|
|
const totalItems = filteredData.length
|
|
const totalPages = Math.ceil(totalItems / limit)
|
|
const offset = (page - 1) * limit
|
|
const paginatedData = filteredData.slice(offset, offset + limit)
|
|
|
|
// Simulasi delay untuk loading state
|
|
await new Promise(resolve => setTimeout(resolve, 300))
|
|
|
|
return {
|
|
success: true,
|
|
data: paginatedData,
|
|
meta: {
|
|
total: totalItems,
|
|
page: Number(page),
|
|
limit: Number(limit),
|
|
total_pages: totalPages,
|
|
has_next: page < totalPages,
|
|
has_prev: page > 1,
|
|
},
|
|
filters: {
|
|
status,
|
|
resource_type,
|
|
date_from,
|
|
date_to,
|
|
search,
|
|
},
|
|
}
|
|
})
|