create search api route

This commit is contained in:
Juthatip McDevitt 2024-03-15 12:28:25 -05:00
parent cd79548dfc
commit 917b01c521
3 changed files with 48 additions and 6 deletions

View file

@ -1,7 +1,6 @@
import { useEffect, useState } from "react"
import {useParams} from 'react-router-dom'
import {Swiper, SwiperSlide} from 'swiper/react'
import { useSelector } from 'react-redux';
import 'swiper/css';
import 'swiper/css/free-mode';
import 'swiper/css/navigation';
@ -16,7 +15,6 @@ const Listing = () => {
const [loading, setLoading] = useState(false);
const [error, setError] = useState(false);
const [listing, setListing] = useState(null);
const { currentUser } = useSelector((state) => state.user);
useEffect(() => {
const fetchListing = async() =>{
try {
@ -89,10 +87,10 @@ const Listing = () => {
</div>
</div>
<p className='text-slate-800 flex flex-col mb-6'>
<span className='font-semibold text-black mt-4 mb-2 text-xl'>About this property</span>
<span className='font-semibold text-black mt-4 mb-2 text-xl capitalize'>About this property</span>
<span>{listing.description}</span>
</p>
<button className='bg-blue-950 text-white rounded-md uppercase hover:opacity-95 p-2 mb-10 text-sm'>Contact Agent</button>
<button onClick={() => window.location = 'mailto:chicagoland@example.com'} className='bg-blue-950 text-white rounded-md uppercase hover:opacity-95 p-2 mb-10 text-sm'>Contact Agent</button>
</div>
</>
}

View file

@ -56,4 +56,47 @@ export const getListing = async (req, res, next) => {
} catch (error) {
next(error);
}
};
export const getListings = async (req, res, next) => {
try {
const limit = parseInt(req.query.limit) || 9;
const startIndex = parseInt(req.query.startIndex) || 0;
let offer = req.query.offer;
if(offer === undefined || offer === 'false'){
offer = {$in: [false, true]};
}
let furnished = req.query.furnished;
if(furnished === undefined || furnished === 'false'){
furnished = {$in: [false, true]};
}
let parking = req.query.parking;
if(parking === undefined || parking === 'false'){
parking = {$in: [false, true]};
}
let type = req.query.type;
if(type === undefined || type === 'all'){
type = {$in: ['sale', 'rent']};
}
const searchTerm = req.query.searchTerm || '';
const sort = req.query.sort || 'createdAt';
const order = req.query.order || 'desc';
const listings = await Listing.find({
name: {
$regex: searchTerm,
$options: 'i'
},
offer,
furnished,
parking,
type,
}).sort({ [sort]: order }).limit(limit).skip(startIndex);
return res.status(200).json(listings);
} catch (error) {
next(error);
}
};

View file

@ -1,5 +1,5 @@
import express from 'express';
import { createListing, deleteListing, updateListing, getListing } from '../controllers/listing.controller.js';
import { createListing, deleteListing, updateListing, getListing, getListings } from '../controllers/listing.controller.js';
import { verifyToken } from '../utils/verifyUser.js';
@ -9,5 +9,6 @@ router.post('/create', verifyToken, createListing)
router.delete('/delete/:id', verifyToken, deleteListing)
router.post('/update/:id', verifyToken, updateListing)
router.get('/get/:id', getListing)
router.get('/get', getListings)
export default router;