46 lines
1.1 KiB
JavaScript
46 lines
1.1 KiB
JavaScript
import {
|
|
collection,
|
|
query,
|
|
where,
|
|
orderBy,
|
|
limit,
|
|
getDocs,
|
|
} from 'firebase/firestore';
|
|
import { db } from './firebase.js';
|
|
|
|
const studentsRef = collection(db, 'students');
|
|
|
|
/**
|
|
* Search students by name (case-insensitive prefix match).
|
|
* Firestore doesn't support native full-text search, so we use a
|
|
* `nameLower` field stored at write-time and do a range query.
|
|
*
|
|
* Expected document structure:
|
|
* { name: "John Smith", nameLower: "john smith", classYear: "1985" }
|
|
*/
|
|
export async function searchStudents(searchTerm) {
|
|
const term = searchTerm.trim().toLowerCase();
|
|
if (!term) return [];
|
|
|
|
const end = term + '\uf8ff'; // Unicode high character for prefix range
|
|
const q = query(
|
|
studentsRef,
|
|
where('nameLower', '>=', term),
|
|
where('nameLower', '<=', end),
|
|
orderBy('nameLower'),
|
|
limit(50)
|
|
);
|
|
|
|
try {
|
|
const snapshot = await getDocs(q);
|
|
const results = [];
|
|
snapshot.forEach((doc) => {
|
|
results.push({ id: doc.id, ...doc.data() });
|
|
});
|
|
return results;
|
|
} catch (error) {
|
|
console.error('Error searching students:', error);
|
|
return [];
|
|
}
|
|
}
|