Overview
The DataStore module is the central data management layer for Reseñas Gastronómicas. It handles all review data operations, provides Firebase integration for cloud storage, and manages real-time data synchronization.
Module Structure
The DataStore is implemented as a singleton object with the following properties:
Array of all review objects loaded from Firebase or sample data
Loading state indicator for async operations
Firebase real-time listener cleanup function
Methods
init()
Initializes the DataStore module, sets up Firebase connection, loads reviews, and establishes real-time listeners.
Returns a promise that resolves when initialization is complete
Process:
- Initializes Firebase service
- Loads all reviews from Firebase
- Sets up real-time data listener
Example:
import { DataStore } from './modules/datastore.js';
// Initialize on app startup
await DataStore.init();
console.log(`Loaded ${DataStore.reviews.length} reviews`);
loadReviews()
Loads all reviews from Firebase. Falls back to sample data if Firebase fails.
await DataStore.loadReviews();
Returns a promise that resolves when reviews are loaded
Behavior:
- Sets
isLoading to true during load
- Fetches reviews from FirebaseService
- On error, loads sample data as fallback
- Sets
isLoading to false when complete
Example:
// Manually reload reviews
await DataStore.loadReviews();
setupRealTimeListener()
Establishes Firebase real-time listener for automatic data synchronization.
DataStore.setupRealTimeListener();
Behavior:
- Cancels previous listener if exists
- Creates new Firebase listener
- Updates
reviews array on changes
- Dispatches
reviewsUpdated custom event to document
Event Dispatched:
document.dispatchEvent(new CustomEvent('reviewsUpdated'));
Example:
// Listen for review updates
document.addEventListener('reviewsUpdated', () => {
console.log('Reviews updated!', DataStore.reviews);
});
addReview(review)
Adds a new review to Firebase.
const newReview = await DataStore.addReview(reviewData);
Review object to addDate in DD/MM/YYYY format
Reviewer data object with reviewer names as keys
Returns the newly created review with assigned ID
Example:
const newReview = await DataStore.addReview({
restaurant: "El Emperador",
dish: "Pizza Margherita",
photo: "https://example.com/photo.jpg",
date: "15/09/2025",
reviewers: {
gian: { rating: 9, review: "¡Increíble! La masa estaba perfecta." },
yami: { rating: 8, review: "Me encantó." }
}
});
console.log('Created review:', newReview.id);
updateReview(id, review)
Updates an existing review in Firebase.
const updated = await DataStore.updateReview(id, reviewData);
Updated review data (same structure as addReview)
Returns the updated review object
Example:
const updated = await DataStore.updateReview('review-123', {
restaurant: "El Emperador",
dish: "Pizza Napolitana",
photo: "https://example.com/photo.jpg",
date: "16/09/2025",
reviewers: {
gian: { rating: 10, review: "¡Perfecto!" }
}
});
deleteReview(id)
Deletes a review from Firebase.
await DataStore.deleteReview(id);
Returns true if deletion was successful
Example:
try {
await DataStore.deleteReview('review-123');
console.log('Review deleted successfully');
} catch (error) {
console.error('Failed to delete review:', error);
}
getReviews(filter)
Retrieves reviews with optional restaurant filter.
const reviews = DataStore.getReviews('all');
Filter by restaurant name, or ‘all’ for all reviews
Filtered array of review objects
Example:
// Get all reviews
const allReviews = DataStore.getReviews('all');
// Get reviews for specific restaurant
const emperadorReviews = DataStore.getReviews('El Emperador');
getRestaurants()
Returns a unique list of all restaurant names.
const restaurants = DataStore.getRestaurants();
Array of unique restaurant names
Example:
const restaurants = DataStore.getRestaurants();
console.log('Restaurants:', restaurants);
// Output: ["El Emperador", "La Trattoría", "Burger House"]
searchReviews(query)
Searches reviews by restaurant, dish, or review content.
const results = DataStore.searchReviews('pizza');
Search term (case-insensitive)
Array of matching reviews
Search Fields:
- Restaurant name
- Dish name
- Review text from all reviewers
Example:
// Search for pizza
const pizzaReviews = DataStore.searchReviews('pizza');
// Search returns all reviews if query is empty
const all = DataStore.searchReviews('');
loadSampleData()
Loads sample data as fallback when Firebase is unavailable.
DataStore.loadSampleData();
Behavior:
- Populates
reviews array with hardcoded sample data
- Ensures app remains functional without Firebase
destroy()
Cleans up resources and removes real-time listener.
Example:
// Cleanup on app shutdown
window.addEventListener('beforeunload', () => {
DataStore.destroy();
});
Data Structure
Review Object
{
id: "sample-1",
restaurant: "El Emperador",
dish: "Pizza Margherita",
photo: "https://images.unsplash.com/photo-xyz",
date: "15/09/2025",
reviewers: {
gian: {
rating: 9,
review: "¡Increíble! La masa estaba perfecta."
},
yami: {
rating: 8,
review: "Me encantó, aunque le faltó más queso."
}
}
}
Events
reviewsUpdated
Dispatched when reviews data changes (add, update, delete).
document.addEventListener('reviewsUpdated', () => {
// Handle reviews update
UI.renderReviews();
Stats.update();
});
Source Code
Source: workspace/source/src/js/modules/datastore.js:1