Initial Commit
This commit is contained in:
45
src/students.js
Normal file
45
src/students.js
Normal file
@@ -0,0 +1,45 @@
|
||||
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 [];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user