61 lines
1.7 KiB
JavaScript
61 lines
1.7 KiB
JavaScript
/**
|
|
* Listings Service - Higher-level API for listing operations
|
|
* Wraps directus.js with business logic and convenience methods
|
|
*/
|
|
|
|
import { directus } from './directus.js'
|
|
|
|
class ListingsService {
|
|
async getListingsWithFilters(filters = {}) {
|
|
const directusFilter = { status: { _eq: 'published' } }
|
|
|
|
if (filters.category) {
|
|
directusFilter.category = { slug: { _eq: filters.category } }
|
|
}
|
|
|
|
if (filters.location) {
|
|
directusFilter.location = { _eq: filters.location }
|
|
}
|
|
|
|
if (filters.minPrice != null) {
|
|
directusFilter.price = directusFilter.price || {}
|
|
directusFilter.price._gte = filters.minPrice
|
|
}
|
|
|
|
if (filters.maxPrice != null) {
|
|
directusFilter.price = directusFilter.price || {}
|
|
directusFilter.price._lte = filters.maxPrice
|
|
}
|
|
|
|
if (filters.condition) {
|
|
directusFilter.condition = { _eq: filters.condition }
|
|
}
|
|
|
|
if (filters.shipping === true) {
|
|
directusFilter.shipping = { _eq: true }
|
|
}
|
|
|
|
if (filters.priceType) {
|
|
directusFilter.price_type = { _eq: filters.priceType }
|
|
}
|
|
|
|
const sortMap = {
|
|
'newest': ['-date_created'],
|
|
'oldest': ['date_created'],
|
|
'price_asc': ['price'],
|
|
'price_desc': ['-price'],
|
|
'views': ['-views']
|
|
}
|
|
|
|
return directus.getListings({
|
|
filter: directusFilter,
|
|
sort: sortMap[filters.sort] || ['-date_created'],
|
|
limit: filters.limit || 20,
|
|
page: filters.page || 1,
|
|
search: filters.search
|
|
})
|
|
}
|
|
}
|
|
|
|
export const listingsService = new ListingsService()
|