Skip to main content

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:
reviews
Array<Review>
Array of all review objects loaded from Firebase or sample data
isLoading
boolean
Loading state indicator for async operations
unsubscribe
Function | null
Firebase real-time listener cleanup function

Methods

init()

Initializes the DataStore module, sets up Firebase connection, loads reviews, and establishes real-time listeners.
await DataStore.init();
void
Promise<void>
Returns a promise that resolves when initialization is complete
Process:
  1. Initializes Firebase service
  2. Loads all reviews from Firebase
  3. 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();
void
Promise<void>
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
required
Review object to add
restaurant
string
required
Restaurant name
dish
string
required
Dish name
photo
string
required
Photo URL
date
string
required
Date in DD/MM/YYYY format
reviewers
object
required
Reviewer data object with reviewer names as keys
review
Promise<object>
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);
id
string
required
Review ID to update
review
object
required
Updated review data (same structure as addReview)
review
Promise<object>
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);
id
string
required
Review ID to delete
success
Promise<boolean>
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
string
default:"'all'"
Filter by restaurant name, or ‘all’ for all reviews
reviews
Array<Review>
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();
restaurants
Array<string>
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');
query
string
required
Search term (case-insensitive)
results
Array<Review>
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.
DataStore.destroy();
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

Build docs developers (and LLMs) love