Files
kashilo/js/services/directus/listings.js

162 lines
3.8 KiB
JavaScript

import { client } from './client.js'
const DEFAULT_FIELDS = [
'id',
'status',
'title',
'slug',
'price',
'currency',
'condition',
'expires_at',
'date_created',
'user_created',
'images.directus_files_id.id',
'category.id',
'category.name',
'category.slug',
'category.icon',
'location.id',
'location.name',
'location.postal_code',
'location.country',
'location.latitude',
'location.longitude',
'verified'
]
const DETAIL_FIELDS = [
'id',
'status',
'title',
'slug',
'description',
'price',
'currency',
'price_mode',
'price_type',
'condition',
'shipping',
'shipping_cost',
'expires_at',
'date_created',
'user_created',
'images.directus_files_id.id',
'category.id',
'category.name',
'category.slug',
'category.translations.*',
'location.id',
'location.name',
'location.postal_code',
'location.country',
'monero_address',
'contact_public_key',
'views',
'verified',
'verification_code',
'verification_date',
'verification_image'
]
export async function getListings(options = {}) {
const params = {
fields: options.fields || DEFAULT_FIELDS,
filter: options.filter || {
status: { _eq: 'published' },
_or: [
{ expires_at: { _null: true } },
{ expires_at: { _gt: '$NOW' } }
]
},
sort: options.sort || ['-date_created'],
limit: options.limit || 20,
page: options.page || 1
}
if (options.search) {
params.search = options.search
}
const response = await client.get('/items/listings', params)
return {
items: response.data,
meta: response.meta
}
}
export async function getListing(id) {
const response = await client.get(`/items/listings/${id}`, {
fields: DETAIL_FIELDS
})
return response.data
}
export async function createListing(data) {
const response = await client.post('/items/listings', data)
return response?.data || response
}
export async function updateListing(id, data) {
const response = await client.patch(`/items/listings/${id}`, data)
return response.data
}
export async function incrementListingViews(id) {
try {
const listing = await getListing(id)
if (!listing) return null
const newViews = (listing.views || 0) + 1
const response = await fetch(`${client.baseUrl}/items/listings/${id}`, {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ views: newViews })
})
if (!response.ok) return null
return newViews
} catch (e) {
console.warn('Failed to increment views:', e)
return null
}
}
export async function deleteListing(id) {
return client.delete(`/items/listings/${id}`)
}
export async function getMyListings() {
const response = await client.get('/items/listings', {
fields: ['*', 'images.directus_files_id.id', 'category.id', 'category.name', 'location.name'],
filter: { user_created: { _eq: '$CURRENT_USER' } },
sort: ['-date_created']
})
return response.data || []
}
export async function searchListings(query, options = {}) {
return getListings({
search: query,
...options
})
}
export async function getListingsByCategory(categoryId, options = {}) {
return getListings({
filter: {
status: { _eq: 'published' },
category: { _eq: categoryId }
},
...options
})
}
export async function getListingsByLocation(locationId, options = {}) {
return getListings({
filter: {
status: { _eq: 'published' },
location: { _eq: locationId }
},
...options
})
}