diff --git a/.gitmodules b/.gitmodules
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/docker-compose.yml b/docker-compose.yml
index 289d9488abb1326c19488edb1971add797601e22..6e37787a0a52a053d821eb2793c5891ac80e94c0 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -111,11 +111,7 @@ services:
     environment:
       - NODE_ENV=production
       - PORT=8004
-      - DB_HOST=reviews-db
-      - DB_PORT=3306
-      - DB_USER=root
-      - DB_PASSWORD="N007MysqlRootpassword27!"
-      - DB_NAME=reviews_db
+      - DATABASE_URL=postgresql://admin:abc123@reviews-db:5432/reviews_db
     volumes:
       - ./microservice-reviews:/app
       - /app/node_modules
@@ -127,20 +123,21 @@ services:
 
   reviews-db:
     container_name: reviews-db
-    image: mysql:5.7
+    image: postgres:15
     environment:
-      - MYSQL_ROOT_PASSWORD=N007MysqlRootpassword27!
-      - MYSQL_DATABASE=reviews_db
-    command: --general-log=0 --slow-query-log=0 --log-error
+      - POSTGRES_USER=admin
+      - POSTGRES_PASSWORD=abc123
+      - POSTGRES_DB=reviews_db
+    command: postgres -c log_min_messages=error
     ports:
-      - "8104:3306"
+      - "8104:5432"
     volumes:
-      - reviews_mysql_data:/var/lib/mysql
+      - reviews_postgres_data:/var/lib/postgresql/data
     networks:
       - microservices-network
     healthcheck:
-      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p N007MysqlRootpassword27!"]
-      interval: 10s
+      test: ["CMD-SHELL", "pg_isready -U admin -d reviews_db"]
+      interval: 5s
       timeout: 5s
       retries: 5
 
@@ -167,7 +164,7 @@ services:
       - recommendations_mongodb_data:/data/db
     ports:
       - "8105:27017"
-    command: mongod --quiet
+    command: mongod --quiet --logpath /dev/null 
     networks:
       - microservices-network
     healthcheck:
@@ -188,5 +185,5 @@ volumes:
   frontend_node_modules:
   users_postgres_data:
   events_postgres_data:
-  reviews_mysql_data:
+  reviews_postgres_data:
   recommendations_mongodb_data: 
diff --git a/frontend/src/components/components/Recommendations/BestRatedEvents.d.ts b/frontend/src/components/components/Recommendations/BestRatedEvents.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..3dce7a8405bc81e7b8a1667bf72246651c94cef5
--- /dev/null
+++ b/frontend/src/components/components/Recommendations/BestRatedEvents.d.ts
@@ -0,0 +1,2 @@
+declare const BestRatedList: () => JSX.Element;
+export default BestRatedList; 
diff --git a/frontend/src/components/components/Recommendations/BestRatedEvents.jsx b/frontend/src/components/components/Recommendations/BestRatedEvents.jsx
index 69e7045c43c247caf3aaebe7d87ab251ba54737c..46b661114b4911aab0fd0f2eb43f487588e03122 100644
--- a/frontend/src/components/components/Recommendations/BestRatedEvents.jsx
+++ b/frontend/src/components/components/Recommendations/BestRatedEvents.jsx
@@ -44,4 +44,4 @@ function BestRatedList() {
   }
 }
 
-export default BestRatedList
+export default BestRatedList;
diff --git a/frontend/src/components/components/Recommendations/RecommendationService.ts b/frontend/src/components/components/Recommendations/RecommendationService.ts
index 8005be599e9479528fa14b2eec24c99b8e32cd5e..b7f67419c66ee42e3ba2ed95840d450bf740c4b6 100644
--- a/frontend/src/components/components/Recommendations/RecommendationService.ts
+++ b/frontend/src/components/components/Recommendations/RecommendationService.ts
@@ -6,19 +6,7 @@ export const handleRecommendedEvents = async (userId: any) => {
     try {
         // First get the liked tags
         const likedTags = await getLikedTags(userId);
-        
-        // Get events
-        const eventsResponse = await fetch('http://localhost:8000/events/events', {
-            headers: {
-                'Content-Type': 'application/json'
-            }
-        });
-
-        if (!eventsResponse.ok) {
-            throw new Error(`Failed to fetch events: ${eventsResponse.statusText}`);
-        }
-
-        const events = await eventsResponse.json();
+        const eventsWithRatings = await getEventsWithRatings();
 
         // Make the suggestions request with both events and likedTags in the body
         const res = await fetch(`http://localhost:8005/suggestions`, {
@@ -29,7 +17,7 @@ export const handleRecommendedEvents = async (userId: any) => {
             },
             body: JSON.stringify({
                 userId,
-                events,
+                events: eventsWithRatings, 
                 likedTags
             })
         });
@@ -53,15 +41,19 @@ export const handleRecommendedEvents = async (userId: any) => {
 
 export const handleRatedEvents = async () => {
     try {
+        const eventsWithRatings = await getEventsWithRatings();
+
         const res = await fetch('http://localhost:8005/suggestions/review-based', {
+            method: 'POST',
+            headers: { 'Content-Type': 'application/json' },
+            body: JSON.stringify({ events: eventsWithRatings })
         });
 
         if (!res.ok) {
             throw new Error(`HTTP error! status: ${res.status}`);
         }
 
-        const data = await res.json();
-        return data;
+        return await res.json();
     } catch (err: any) {
         console.error('Error in handleRatedEvents:', err);
         return `Error: ${err.message}`;
@@ -89,4 +81,45 @@ const getLikedTags = async (id: string): Promise<string[]> => {
       console.error('Error in getLikedTags:', err);
       return [];
     }
-  };
\ No newline at end of file
+  };
+
+const getEventsWithRatings = async (): Promise<any[]> => {
+    const eventsResponse = await fetch('http://localhost:8000/events/events', {
+        headers: { 
+            ...getAuthHeaders(),
+            'Content-Type': 'application/json'
+         }
+    });
+
+    if (!eventsResponse.ok) {
+        throw new Error(`Failed to fetch events: ${eventsResponse.statusText}`);
+    }
+
+    const events = await eventsResponse.json();
+
+    const eventsWithRatings = await Promise.all(events.map(async (event: any) => {
+        try {
+            const ratingResponse = await fetch(`http://localhost:8000/reviews/review?eventId=${event.id}`, {
+                headers: {
+                    ...getAuthHeaders(),
+                    'Content-Type': 'application/json' 
+                }
+            });
+
+            if (!ratingResponse.ok) {
+                console.warn(`Failed to fetch rating for event ${event.id}: ${ratingResponse.statusText}`);
+                return { ...event, rating: 0 };
+            }
+
+            const ratingData = await ratingResponse.json();
+            const rating = ratingData[0]?.rating ?? 0;
+
+            return { ...event, rating };
+        } catch (err) {
+            console.error(`Error fetching rating for event ${event.id}:`, err);
+            return { ...event, rating: 0 };
+        }
+    }));
+
+    return eventsWithRatings;
+};
diff --git a/frontend/src/components/components/Recommendations/Recommendations.d.ts b/frontend/src/components/components/Recommendations/Recommendations.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5f8847a8563317a173368ca63751cb9eafce13e2
--- /dev/null
+++ b/frontend/src/components/components/Recommendations/Recommendations.d.ts
@@ -0,0 +1,2 @@
+declare const RecommendationList: () => JSX.Element;
+export default RecommendationList;
diff --git a/frontend/src/components/components/Recommendations/Recommendations.jsx b/frontend/src/components/components/Recommendations/Recommendations.jsx
index 7570389a8b065bfc35b02f5da0fee4532f31ba1f..7da8cdd853322489ab32d5faf5cab8297513d6be 100644
--- a/frontend/src/components/components/Recommendations/Recommendations.jsx
+++ b/frontend/src/components/components/Recommendations/Recommendations.jsx
@@ -2,20 +2,20 @@ import { useState, useEffect, useContext } from 'react'
 import { handleRecommendedEvents } from './RecommendationService'
 import './Recommendations.css'
 import { SessionContext } from '../../pages/App/App';
-
+import { useNavigate } from 'react-router-dom';
 
 function RecommendationList() {
   const sessionData = useContext(SessionContext);
   const [recommendations, setRecommendation] = useState([])
   const [loading, setLoading] = useState(true);
   const [error, setError] = useState(null);
+  const navigate = useNavigate();
 
   useEffect(() => {
     const fetchEvents = async () => {
       try {
         const data = await handleRecommendedEvents(sessionData.user.id);
         setRecommendation(data);
-        console.log(data);
       } catch (err) {
         setError(err.message);
       } finally {
diff --git a/frontend/src/components/pages/App/App.tsx b/frontend/src/components/pages/App/App.tsx
index dec290ea72887bfb2446e8f03f4bfd029c8df0cf..4da12f1be2614c92cd81ad9ad81e4940498f8831 100644
--- a/frontend/src/components/pages/App/App.tsx
+++ b/frontend/src/components/pages/App/App.tsx
@@ -105,8 +105,6 @@ function App() {
             <Route path="/browse/:query?" element={<BrowsingPage />} />
             <Route path="/event/:eventId" element={<Events />} />
             <Route path="/BookingManagement" element={<BookingManagement />} />
-            {/*Probably unnecessary, remove later if so*/}
-            <Route path="/review:eventId" />
           </Routes>
         </div>
       </BrowserRouter>
diff --git a/frontend/src/components/pages/BrowsingPage/BrowsingPage.tsx b/frontend/src/components/pages/BrowsingPage/BrowsingPage.tsx
index f1bae18446df1e6526b3134924717db82f96592c..a52696d4fbfa888598f7fa3c1b57d69cbda9686d 100644
--- a/frontend/src/components/pages/BrowsingPage/BrowsingPage.tsx
+++ b/frontend/src/components/pages/BrowsingPage/BrowsingPage.tsx
@@ -60,15 +60,12 @@ function BrowsingPage() {
         };
 
         fetchEvents();
-    }, []); // Empty dependency array means this effect runs once on mount
+    }, []);
 
     const eventOnClick = (event: Event) => {
         navigate(`/event/${event.id}`, { state: { event } });
     };
 
-    // For debugging purposes
-    console.log('Current events state:', events);
-
     return (
         <div className={styles.pageContent}>
             {isLoading && <p>Loading events...</p>}
diff --git a/frontend/src/components/pages/Events/Events.module.scss b/frontend/src/components/pages/Events/Events.module.scss
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..2e951651d5f237d72e92e9b6fd5ef71bdf0624df 100644
--- a/frontend/src/components/pages/Events/Events.module.scss
+++ b/frontend/src/components/pages/Events/Events.module.scss
@@ -0,0 +1,136 @@
+.eventContainer {
+  max-width: 800px;
+  margin: 2rem auto;
+  padding: 2rem;
+  background: white;
+  border-radius: 8px;
+  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
+
+  h1 {
+    margin-bottom: 2rem;
+    color: #333;
+  }
+
+  .eventInfo {
+    margin-bottom: 2rem;
+
+    p {
+      margin-bottom: 1rem;
+      color: #666;
+      line-height: 1.5;
+
+      strong {
+        color: #333;
+      }
+    }
+  }
+
+  .actions {
+    display: flex;
+    gap: 1rem;
+    margin-top: 2rem;
+
+    .bookButton {
+      background: #007bff;
+      color: white;
+      padding: 0.75rem 1.5rem;
+      border: none;
+      border-radius: 4px;
+      font-size: 1rem;
+      cursor: pointer;
+      transition: background-color 0.2s;
+
+      &:hover {
+        background: #0056b3;
+      }
+    }
+
+    .reviewsButton {
+      background: #f8f9fa;
+      color: #007bff;
+      padding: 0.75rem 1.5rem;
+      border: 1px solid #007bff;
+      border-radius: 4px;
+      font-size: 1rem;
+      cursor: pointer;
+      transition: all 0.2s;
+
+      &:hover {
+        background: #007bff;
+        color: white;
+      }
+    }
+  }
+
+  .reviewsSection {
+    margin-top: 2rem;
+    padding-top: 2rem;
+    border-top: 1px solid #eee;
+
+    .reviews-container {
+      h2 {
+        margin-bottom: 1.5rem;
+        color: #333;
+        font-size: 1.5rem;
+      }
+
+      .review-form {
+        background: #f8f9fa;
+        padding: 1.5rem;
+        border-radius: 8px;
+        margin-bottom: 2rem;
+
+        h3 {
+          margin-bottom: 1rem;
+          color: #333;
+          font-size: 1.25rem;
+        }
+      }
+
+      .reviews-list {
+        .review-card {
+          background: white;
+          padding: 1.5rem;
+          border-radius: 8px;
+          box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
+          margin-bottom: 1.5rem;
+
+          h3 {
+            margin-bottom: 1rem;
+            color: #333;
+          }
+        }
+      }
+    }
+  }
+}
+
+.errorContainer {
+  max-width: 800px;
+  margin: 2rem auto;
+  padding: 2rem;
+  background: white;
+  border-radius: 8px;
+  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
+  text-align: center;
+
+  p {
+    margin-bottom: 1rem;
+    color: #dc3545;
+  }
+
+  button {
+    background: #007bff;
+    color: white;
+    padding: 0.75rem 1.5rem;
+    border: none;
+    border-radius: 4px;
+    font-size: 1rem;
+    cursor: pointer;
+    transition: background-color 0.2s;
+
+    &:hover {
+      background: #0056b3;
+    }
+  }
+}
diff --git a/frontend/src/components/pages/Events/Events.tsx b/frontend/src/components/pages/Events/Events.tsx
index 769d525fd37808f653940474daf8cac70765c02e..1b688bdd42e82a08a89bb1e08a29b63e16093754 100644
--- a/frontend/src/components/pages/Events/Events.tsx
+++ b/frontend/src/components/pages/Events/Events.tsx
@@ -1,12 +1,15 @@
 import { useNavigate, useLocation } from 'react-router-dom';
 import styles from './Events.module.scss';
-import Reviews from '../../components/Reviews/Review';
+import { Link } from 'react-router-dom';
+import Reviews from '../Reviews/Reviews';
+import { useState } from 'react';
 
 function Events() {
     // Pulls parameters from navigate function
     const { state } = useLocation();
     const navigate = useNavigate();
-    
+    const [showReviews, setShowReviews] = useState(false);
+
     // Basic error checking
     if (!state || !state.event) {
         return (
@@ -18,14 +21,14 @@ function Events() {
             </div>
         );
     }
-    
+
     const { event } = state;
-    
+
     // Check if the event has passed
     const currentDate = new Date();
     const eventEndDate = new Date(event.end);
     const hasEventPassed = eventEndDate < currentDate;
-    
+
     // If the event has passed, don't display it
     if (hasEventPassed) {
         return (
@@ -37,20 +40,24 @@ function Events() {
             </div>
         );
     }
-    
+
     const bookButtonOnClick = () => {
         navigate('/BookingManagement', {
-            state: { 
+            state: {
                 action: "create",
                 eventId: event.id
             }
         });
     };
 
+    const toggleReviews = () => {
+        setShowReviews(!showReviews);
+    };
+
     return (
         <div className={styles.eventContainer || ""}>
             <h1>{event.name}</h1>
-            
+
             <div className={styles.eventInfo || ""}>
                 <p><strong>Start:</strong> {new Date(event.start).toLocaleString()}</p>
                 <p><strong>End:</strong> {new Date(event.end).toLocaleString()}</p>
@@ -60,17 +67,30 @@ function Events() {
                     <p><strong>Description:</strong> {event.description}</p>
                 )}
             </div>
-            
-            <button 
-                onClick={bookButtonOnClick}
-                className={styles.bookButton || ""}
-            > 
-                Book Now
-            </button>
-            
-            {/* <Reviews/> */}
+
+            <div className={styles.actions}>
+                <button
+                    onClick={bookButtonOnClick}
+                    className={styles.bookButton || ""}
+                >
+                    Book Now
+                </button>
+
+                <button
+                    onClick={toggleReviews}
+                    className={styles.reviewsButton || ""}
+                >
+                    {showReviews ? 'Hide Reviews' : 'View Reviews'}
+                </button>
+            </div>
+
+            {showReviews && (
+                <div className={styles.reviewsSection}>
+                    <Reviews eventId={event.id} />
+                </div>
+            )}
         </div>
     );
 }
 
-export default Events;
\ No newline at end of file
+export default Events;
diff --git a/frontend/src/components/pages/LandingPage/LandingPage.tsx b/frontend/src/components/pages/LandingPage/LandingPage.tsx
index 862455dd91ce55ec4151260581eff5ffb55200ed..8432df4fecf38d894e72d6cc0b316c56616f67cd 100644
--- a/frontend/src/components/pages/LandingPage/LandingPage.tsx
+++ b/frontend/src/components/pages/LandingPage/LandingPage.tsx
@@ -1,17 +1,17 @@
 import styles from './LandingPage.module.scss';
-import RecommendationList from '../../components/Recommendations/Recommendations.jsx'
-import BestRatedList from '../../components/Recommendations/BestRatedEvents.jsx'
+import RecommendationList from '../../../components/components/Recommendations/Recommendations';
+import BestRatedList from '../../../components/components/Recommendations/BestRatedEvents';
 
 function LandingPage() {
   return (
-  <>
-    <div className={styles.LandingPage} data-testid="LandingPage">
-      <p>Landing Page</p>
-      <RecommendationList/>
-      <BestRatedList/>
-    </div>
-  </>
+    <>
+      <div className={styles.LandingPage} data-testid="LandingPage">
+        <p>Landing Page</p>
+        <RecommendationList />
+        <BestRatedList />
+      </div>
+    </>
   )
-} 
+}
 
 export default LandingPage;
diff --git a/frontend/src/components/pages/Reviews/Reviews.scss b/frontend/src/components/pages/Reviews/Reviews.scss
new file mode 100644
index 0000000000000000000000000000000000000000..f26e9399b69f244065749285b40496976b525a68
--- /dev/null
+++ b/frontend/src/components/pages/Reviews/Reviews.scss
@@ -0,0 +1,222 @@
+.reviews-container {
+  max-width: 1200px;
+  margin: 0 auto;
+  padding: 20px;
+
+  .reviews-header {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    margin-bottom: 20px;
+
+    h2 {
+      margin: 0;
+    }
+
+    .create-review-button {
+      padding: 8px 16px;
+      background-color: #007bff;
+      color: white;
+      border: none;
+      border-radius: 4px;
+      cursor: pointer;
+      font-size: 14px;
+      transition: background-color 0.2s;
+
+      &:hover {
+        background-color: #0056b3;
+      }
+    }
+  }
+
+  .review-form {
+    background-color: #f8f9fa;
+    padding: 20px;
+    border-radius: 8px;
+    margin-bottom: 20px;
+    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
+    transition: all 0.3s ease;
+
+    h3 {
+      margin-top: 0;
+      margin-bottom: 20px;
+    }
+
+    form {
+      display: grid;
+      gap: 15px;
+
+      >div {
+        display: flex;
+        flex-direction: column;
+        gap: 5px;
+
+        label {
+          font-weight: 500;
+        }
+
+        input,
+        textarea {
+          padding: 8px;
+          border: 1px solid #ced4da;
+          border-radius: 4px;
+          font-size: 14px;
+
+          &:focus {
+            outline: none;
+            border-color: #80bdff;
+            box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
+          }
+        }
+
+        textarea {
+          min-height: 100px;
+          resize: vertical;
+        }
+      }
+
+      .sub-ratings {
+        display: grid;
+        grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
+        gap: 15px;
+        padding: 15px;
+        background-color: #e9ecef;
+        border-radius: 4px;
+
+        h4 {
+          grid-column: 1 / -1;
+          margin: 0;
+        }
+
+        >div {
+          display: flex;
+          flex-direction: column;
+          gap: 5px;
+        }
+      }
+
+      button[type="submit"] {
+        padding: 10px 20px;
+        background-color: #28a745;
+        color: white;
+        border: none;
+        border-radius: 4px;
+        cursor: pointer;
+        font-size: 16px;
+        transition: background-color 0.2s;
+
+        &:hover {
+          background-color: #218838;
+        }
+      }
+    }
+  }
+
+  .reviews-list {
+    display: grid;
+    gap: 2rem;
+
+    .review-card {
+      background: white;
+      padding: 2rem;
+      border-radius: 8px;
+      box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
+
+      h3 {
+        margin-bottom: 1rem;
+        color: #333;
+      }
+
+      .rating {
+        font-size: 1.25rem;
+        font-weight: 600;
+        color: #007bff;
+        margin-bottom: 1rem;
+      }
+
+      .sub-ratings {
+        display: grid;
+        grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
+        gap: 1rem;
+        margin-bottom: 1.5rem;
+        padding: 1rem;
+        background: #f8f9fa;
+        border-radius: 4px;
+
+        >div {
+          color: #666;
+        }
+      }
+
+      .comments {
+        margin-bottom: 1.5rem;
+
+        >div {
+          margin-bottom: 1rem;
+
+          h4 {
+            color: #444;
+            margin-bottom: 0.5rem;
+          }
+
+          p {
+            color: #666;
+            line-height: 1.5;
+          }
+        }
+
+        .positive {
+          h4 {
+            color: #28a745;
+          }
+        }
+
+        .negative {
+          h4 {
+            color: #dc3545;
+          }
+        }
+      }
+
+      .review-footer {
+        display: flex;
+        justify-content: space-between;
+        align-items: center;
+        padding-top: 1rem;
+        border-top: 1px solid #eee;
+
+        .votes {
+          display: flex;
+          gap: 1rem;
+
+          button {
+            background: none;
+            border: 1px solid #ddd;
+            padding: 0.5rem 1rem;
+            border-radius: 4px;
+            cursor: pointer;
+            transition: all 0.2s;
+
+            &:hover {
+              background: #f8f9fa;
+              border-color: #007bff;
+              color: #007bff;
+            }
+          }
+        }
+
+        .meta {
+          display: flex;
+          gap: 1rem;
+          color: #666;
+          font-size: 0.9rem;
+
+          .verified {
+            color: #28a745;
+            font-weight: 600;
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/frontend/src/components/pages/Reviews/Reviews.tsx b/frontend/src/components/pages/Reviews/Reviews.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..59fca8c5f1ea83b4d572ba1068c2ec13c0d99b90
--- /dev/null
+++ b/frontend/src/components/pages/Reviews/Reviews.tsx
@@ -0,0 +1,341 @@
+import React, { useState, useEffect, useContext } from 'react';
+import { getAuthHeaders, handleAuthError } from '../../../utils/auth';
+import { SessionContext } from '../App/App';
+import './Reviews.scss';
+
+interface Review {
+  id: string;
+  userId: string;
+  itemId: string;
+  title: string;
+  positiveComment: string;
+  negativeComment: string;
+  rating: number;
+  comment: string;
+  helpful: number;
+  unhelpful: number;
+  createdAt: string;
+  staffRating: number;
+  facilitiesRating: number;
+  cleanlinessRating: number;
+  comfortRating: number;
+  valueRating: number;
+  locationRating: number;
+  overallRating: number;
+}
+
+interface ReviewsProps {
+  eventId: string;
+}
+
+const Reviews: React.FC<ReviewsProps> = ({ eventId }) => {
+  const sessionData = useContext(SessionContext);
+  const [reviews, setReviews] = useState<Review[]>([]);
+  const [loading, setLoading] = useState(true);
+  const [error, setError] = useState<string | null>(null);
+  const [showReviewForm, setShowReviewForm] = useState(false);
+  const [newReview, setNewReview] = useState({
+    userId: sessionData.user.id,
+    title: '',
+    positiveComment: '',
+    negativeComment: '',
+    rating: 0,
+    comment: '',
+    staffRating: 0,
+    facilitiesRating: 0,
+    cleanlinessRating: 0,
+    comfortRating: 0,
+    valueRating: 0,
+    locationRating: 0,
+  });
+
+  useEffect(() => {
+    fetchReviews();
+  }, [eventId]);
+
+  const fetchReviews = async () => {
+    try {
+      const headers = getAuthHeaders();
+      const response = await fetch(`http://localhost:8000/reviews/review?eventId=${eventId}`, {
+        headers,
+      });
+
+      if (!response.ok) {
+        throw new Error('Failed to fetch reviews');
+      }
+
+      const data = await response.json();
+      setReviews(data);
+      setLoading(false);
+    } catch (error) {
+      if (error instanceof Error && error.message.includes('No authentication token found')) {
+        handleAuthError();
+      } else {
+        setError('Failed to load reviews');
+        setLoading(false);
+      }
+    }
+  };
+
+  const handleSubmitReview = async (e: React.FormEvent) => {
+    e.preventDefault();
+    try {
+      const headers = getAuthHeaders();
+      const response = await fetch('http://localhost:8000/reviews/review', {
+        method: 'POST',
+        headers,
+        body: JSON.stringify({
+          ...newReview,
+          eventId,
+        }),
+      });
+
+      if (!response.ok) {
+        throw new Error('Failed to submit review');
+      }
+
+      // Refresh reviews after successful submission
+      fetchReviews();
+      // Reset form
+      setNewReview({
+        userId: sessionData.user.id,
+        title: '',
+        positiveComment: '',
+        negativeComment: '',
+        rating: 0,
+        comment: '',
+        staffRating: 0,
+        facilitiesRating: 0,
+        cleanlinessRating: 0,
+        comfortRating: 0,
+        valueRating: 0,
+        locationRating: 0,
+      });
+    } catch (error) {
+      if (error instanceof Error && error.message.includes('No authentication token found')) {
+        handleAuthError();
+      } else {
+        setError('Failed to submit review');
+      }
+    }
+  };
+
+  const handleVote = async (reviewId: string, type: 'upvote' | 'downvote') => {
+    try {
+      const headers = getAuthHeaders();
+      const response = await fetch(`http://localhost:8000/reviews/review/${reviewId}/${type}`, {
+        method: 'PUT',
+        headers: {
+          ...headers,
+          'Content-Type': 'application/json'
+        },
+        body: JSON.stringify({
+          userId: sessionData.user.id
+        })
+      });
+
+      if (!response.ok) {
+        const errorData = await response.json();
+        throw new Error(errorData.error || `Failed to ${type}`);
+      }
+
+      // Refresh reviews after successful vote
+      fetchReviews();
+    } catch (error) {
+      if (error instanceof Error && error.message.includes('No authentication token found')) {
+        handleAuthError();
+      } else {
+        setError(error instanceof Error ? error.message : `Failed to ${type}`);
+      }
+    }
+  };
+
+  if (loading) return <div>Loading reviews...</div>;
+  if (error) return <div>Error: {error}</div>;
+
+  return (
+    <div className="reviews-container">
+      <div className="reviews-header">
+        <h2>Reviews</h2>
+        <button
+          className="create-review-button"
+          onClick={() => setShowReviewForm(!showReviewForm)}
+        >
+          {showReviewForm ? 'Hide Review Form' : 'Create Review'}
+        </button>
+      </div>
+
+      {/* Review Form */}
+      {showReviewForm && (
+        <div className="review-form">
+          <h3>Write a Review</h3>
+          <form onSubmit={handleSubmitReview}>
+            <div>
+              <label>Title:</label>
+              <input
+                type="text"
+                value={newReview.title}
+                onChange={(e) => setNewReview({ ...newReview, title: e.target.value })}
+                required
+              />
+            </div>
+
+            <div>
+              <label>Positive Comments:</label>
+              <textarea
+                value={newReview.positiveComment}
+                onChange={(e) => setNewReview({ ...newReview, positiveComment: e.target.value })}
+                required
+              />
+            </div>
+
+            <div>
+              <label>Negative Comments:</label>
+              <textarea
+                value={newReview.negativeComment}
+                onChange={(e) => setNewReview({ ...newReview, negativeComment: e.target.value })}
+                required
+              />
+            </div>
+
+            <div>
+              <label>Overall Rating (1-10):</label>
+              <input
+                type="number"
+                min="1"
+                max="10"
+                value={newReview.rating}
+                onChange={(e) => setNewReview({ ...newReview, rating: Number(e.target.value) })}
+                required
+              />
+            </div>
+
+            <div>
+              <label>Additional Comments:</label>
+              <textarea
+                value={newReview.comment}
+                onChange={(e) => setNewReview({ ...newReview, comment: e.target.value })}
+              />
+            </div>
+
+            <div className="sub-ratings">
+              <h4>Sub-ratings (1-10):</h4>
+              <div>
+                <label>Staff:</label>
+                <input
+                  type="number"
+                  min="1"
+                  max="10"
+                  value={newReview.staffRating}
+                  onChange={(e) => setNewReview({ ...newReview, staffRating: Number(e.target.value) })}
+                />
+              </div>
+              <div>
+                <label>Facilities:</label>
+                <input
+                  type="number"
+                  min="1"
+                  max="10"
+                  value={newReview.facilitiesRating}
+                  onChange={(e) => setNewReview({ ...newReview, facilitiesRating: Number(e.target.value) })}
+                />
+              </div>
+              <div>
+                <label>Cleanliness:</label>
+                <input
+                  type="number"
+                  min="1"
+                  max="10"
+                  value={newReview.cleanlinessRating}
+                  onChange={(e) => setNewReview({ ...newReview, cleanlinessRating: Number(e.target.value) })}
+                />
+              </div>
+              <div>
+                <label>Comfort:</label>
+                <input
+                  type="number"
+                  min="1"
+                  max="10"
+                  value={newReview.comfortRating}
+                  onChange={(e) => setNewReview({ ...newReview, comfortRating: Number(e.target.value) })}
+                />
+              </div>
+              <div>
+                <label>Value:</label>
+                <input
+                  type="number"
+                  min="1"
+                  max="10"
+                  value={newReview.valueRating}
+                  onChange={(e) => setNewReview({ ...newReview, valueRating: Number(e.target.value) })}
+                />
+              </div>
+              <div>
+                <label>Location:</label>
+                <input
+                  type="number"
+                  min="1"
+                  max="10"
+                  value={newReview.locationRating}
+                  onChange={(e) => setNewReview({ ...newReview, locationRating: Number(e.target.value) })}
+                />
+              </div>
+            </div>
+
+            <button type="submit">Submit Review</button>
+          </form>
+        </div>
+      )}
+
+      {/* Reviews List */}
+      <div className="reviews-list">
+        {reviews.map((review) => (
+          <div key={review.id} className="review-card">
+            <h3>{review.title}</h3>
+            <div className="rating">Overall Rating: {review.rating}/10</div>
+            <div className="sub-ratings">
+              <div>Staff: {review.staffRating}/10</div>
+              <div>Facilities: {review.facilitiesRating}/10</div>
+              <div>Cleanliness: {review.cleanlinessRating}/10</div>
+              <div>Comfort: {review.comfortRating}/10</div>
+              <div>Value: {review.valueRating}/10</div>
+              <div>Location: {review.locationRating}/10</div>
+            </div>
+            <div className="comments">
+              <div className="positive">
+                <h4>Positive:</h4>
+                <p>{review.positiveComment}</p>
+              </div>
+              <div className="negative">
+                <h4>Negative:</h4>
+                <p>{review.negativeComment}</p>
+              </div>
+              {review.comment && (
+                <div className="additional">
+                  <h4>Additional Comments:</h4>
+                  <p>{review.comment}</p>
+                </div>
+              )}
+            </div>
+            <div className="review-footer">
+              <div className="votes">
+                <button onClick={() => handleVote(review.id, 'upvote')}>
+                  Helpful ({review.helpful})
+                </button>
+                <button onClick={() => handleVote(review.id, 'downvote')}>
+                  Unhelpful ({review.unhelpful})
+                </button>
+              </div>
+              <div className="meta">
+                <span>By {review.userId}</span>
+                <span>{new Date(review.createdAt).toLocaleDateString()}</span>
+              </div>
+            </div>
+          </div>
+        ))}
+      </div>
+    </div>
+  );
+};
+
+export default Reviews; 
diff --git a/microservice-recommendation/routes/suggestions.js b/microservice-recommendation/routes/suggestions.js
index c0ac8cd53d3986e28dbf894ba4c84baf49bcbbde..d14a188e5497b926b9f1e581d2a474b207fe5728 100644
--- a/microservice-recommendation/routes/suggestions.js
+++ b/microservice-recommendation/routes/suggestions.js
@@ -15,8 +15,9 @@ router.post('/', async (req, res) => {
       const { userId, events, likedTags } = req.body;
       console.log('userId from session data', userId);
 
-      const tagMatchWeight = 0.7;
-      const reviewScoreWeight = 0.3;
+      const tagMatchWeight = 1;
+      const reviewScoreWeight = 0.9;
+      const totalWeight = tagMatchWeight + reviewScoreWeight;
 
       // Score each event
       const eventScores = await Promise.all(events.map(async (event) => {
@@ -24,10 +25,9 @@ router.post('/', async (req, res) => {
           const tagMatchScore = matchingTags.length / event.tags.length;
 
           // TODO: Replace with actual rating from review microservice
-          const eventRating = 4; // hardcoded out of 5
-          const reviewScore = eventRating / 5;
+          const reviewScore = event.rating/10
 
-          const finalScore = (tagMatchScore * tagMatchWeight) + (reviewScore * reviewScoreWeight);
+          const finalScore = ((tagMatchScore * tagMatchWeight) + (reviewScore * reviewScoreWeight)) / totalWeight;
 
           return { event, finalScore };
       }));
@@ -49,25 +49,23 @@ router.post('/', async (req, res) => {
   }
 });
 
-router.get('/review-based', async (req,res)=>{
-  try{
-    const events = [
-      { id: 1, name: 'hmmm', tags: ['tech', 'innovation'], rating:5 },
-      { id: 2, name: 'uhhhhhhh', tags: ['outdoors', 'music'], rating:10 },
-      { id: 3, name: 'yhhhh', tags: ['literature'], rating: 9 },
-      { id: 4, name: '...', tags: ['business', 'tech'], rating: 3 },
-    ];
-
-    // Score each event
-    const eventsByRating = await Promise.all(events.map(async (event) => {
-      const rating = event.rating;
-      return { event, rating };
-    }));
+router.post('/review-based', async (req, res) => {
+  try {
+    const { events } = req.body;
 
-    const eventOrdered = eventsByRating.sort((a, b) => b.rating - a.rating);
+    if (!Array.isArray(events)) {
+      return res.status(400).json({ message: 'Invalid or missing events array.' });
+    }
 
-    // TODO: Customize response shape later
-    const response = eventOrdered.map(({ event, rating }) => ({
+    // Score and sort events by rating
+    const eventsByRating = events
+      .map(event => ({
+        event,
+        rating: typeof event.rating === 'number' ? event.rating : 0
+      }))
+      .sort((a, b) => b.rating - a.rating);
+
+    const response = eventsByRating.map(({ event, rating }) => ({
       name: event.name,
       rating: rating,
     }));
@@ -75,9 +73,10 @@ router.get('/review-based', async (req,res)=>{
     res.json(response);
 
   } catch (err) {
-    console.error("Error fetching recommendations:", err);
+    console.error("Error fetching review-based recommendations:", err);
     res.status(500).json({ message: 'Server error fetching recommendations.' });
   }
 });
 
+
 module.exports = router
\ No newline at end of file
diff --git a/microservice-reviews/.env b/microservice-reviews/.env
deleted file mode 100644
index 2c231e05663dc803a9a74e6c58390cbdcb656ff0..0000000000000000000000000000000000000000
--- a/microservice-reviews/.env
+++ /dev/null
@@ -1,8 +0,0 @@
-# MYSQL env
-MYSQL_ROOT_PASSWORD="N007MysqlRootpassword27!"
-MYSQL_DATABASE=reviews_db
-
-# App env
-DB_HOST=review-mysql
-DB_PORT=3306
-PORT=8004
diff --git a/microservice-reviews/Dockerfile b/microservice-reviews/Dockerfile
index 43e4d54c5b5b3a55b366737572657692e286e8ae..521c17af42ebb4f3bf910554dc234167fdd009d5 100644
--- a/microservice-reviews/Dockerfile
+++ b/microservice-reviews/Dockerfile
@@ -3,13 +3,18 @@ FROM node:23
 # Working directory
 WORKDIR /app
 
-# Copy the rest
-COPY . .
+# Copy package.json and package-lock.json
+COPY package*.json ./
 
+# Install dependencies including development dependencies
 RUN npm install
 
+COPY . .
+
 # Expose port
-EXPOSE 3000
+EXPOSE 8004
+
+ENV NODE_ENV=development
 
-# Run command
-CMD ["sh", "-c", "node backend/server.js"]
\ No newline at end of file
+# Run command with nodemon for development
+CMD ["sh", "-c", "npm run db:deploy && npx prisma db seed && npm run dev"]
diff --git a/microservice-reviews/backend/server.js b/microservice-reviews/backend/server.js
deleted file mode 100644
index 1573c961b37d98db3e39ac52a9c2f80a314b2a20..0000000000000000000000000000000000000000
--- a/microservice-reviews/backend/server.js
+++ /dev/null
@@ -1,170 +0,0 @@
-const express = require('express');
-const mongoose = require('mongoose');
-const cors = require('cors');
-const multer = require('multer');
-const path = require('path');
-
-const app = express();
-const port = 3001;
-
-app.use(cors());
-app.use(express.json());
-
-// Serve static files (for uploaded photos)
-app.use('/uploads', express.static(path.join(__dirname, 'uploads')));
-
-// Set up multer for file uploads
-const storage = multer.diskStorage({
-  destination: function (req, file, cb) {
-    cb(null, 'uploads/'); // Ensure the 'uploads' directory exists
-  },
-  filename: function (req, file, cb) {
-    const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1e9);
-    cb(null, uniqueSuffix + '-' + file.originalname);
-  }
-});
-const upload = multer({ storage });
-
-// Connect to MongoDB
-mongoose.connect('mongodb://localhost:27017/standalone_reviews', { 
-  useNewUrlParser: true,
-  useUnifiedTopology: true 
-})
-  .then(() => console.log('MongoDB Connected'))
-  .catch(err => console.error(err));
-
-// Define the Review schema
-const reviewSchema = new mongoose.Schema({
-  userId: { type: String, required: true },
-  itemId: { type: String, required: true }, // Event ID
-  title: { type: String },                // Overall comment header
-  positiveComment: { type: String },      // Things liked (":)")
-  negativeComment: { type: String },      // Things disliked (":(")
-  rating: { type: Number, required: true, min: 1, max: 10 }, // Overall rating on a 1-10 scale
-  comment: { type: String },              // Fallback / additional comment
-  helpful: { type: Number, default: 0 },   // Thumbs-up count
-  unhelpful: { type: Number, default: 0 }, // Thumbs-down count
-  verifiedBuyer: { type: Boolean, default: false },
-  photoUrl: { type: String },
-  createdAt: { type: Date, default: Date.now },
-  // Sub-ratings (optional, can be computed into overallRating if desired)
-  staffRating: { type: Number, default: 0 },
-  facilitiesRating: { type: Number, default: 0 },
-  cleanlinessRating: { type: Number, default: 0 },
-  comfortRating: { type: Number, default: 0 },
-  valueRating: { type: Number, default: 0 },
-  locationRating: { type: Number, default: 0 },
-  overallRating: { type: Number, default: 0 }
-});
-
-const Review = mongoose.model('Review', reviewSchema);
-
-// GET endpoint for fetching reviews (optional filtering by eventId)
-app.get('/review', async (req, res) => {
-  try {
-    const { eventId } = req.query;
-    let reviews;
-    if (eventId) {
-      reviews = await Review.find({ itemId: eventId });
-    } else {
-      reviews = await Review.find();
-    }
-    res.json(reviews);
-  } catch (error) {
-    res.status(500).json({ error: error.message });
-  }
-});
-
-// POST endpoint for creating a review with photo upload
-app.post('/review', upload.single('image'), async (req, res) => {
-  try {
-    const {
-      customer_name, eventId, rating, comment,
-      verifiedBuyer, staffRating, facilitiesRating,
-      cleanlinessRating, comfortRating, valueRating,
-      locationRating, title, positiveComment, negativeComment
-    } = req.body;
-    
-    // Handle file upload, if present
-    let photoUrl = "";
-    if (req.file) {
-      photoUrl = `${req.protocol}://${req.get('host')}/uploads/${req.file.filename}`;
-    }
-    
-    // Compute overallRating from sub-ratings (average of non-zero values)
-    const subRatings = [
-      Number(staffRating) || 0,
-      Number(facilitiesRating) || 0,
-      Number(cleanlinessRating) || 0,
-      Number(comfortRating) || 0,
-      Number(valueRating) || 0,
-      Number(locationRating) || 0
-    ];
-    const validSubRatings = subRatings.filter(r => r > 0);
-    const overallRating = validSubRatings.length > 0 
-      ? (validSubRatings.reduce((a, b) => a + b, 0) / validSubRatings.length).toFixed(1)
-      : 0;
-    
-    const reviewData = {
-      userId: customer_name,
-      itemId: eventId,
-      title,
-      positiveComment,
-      negativeComment,
-      rating: Number(rating),
-      comment,
-      verifiedBuyer: verifiedBuyer === 'true',
-      photoUrl,
-      staffRating: Number(staffRating) || 0,
-      facilitiesRating: Number(facilitiesRating) || 0,
-      cleanlinessRating: Number(cleanlinessRating) || 0,
-      comfortRating: Number(comfortRating) || 0,
-      valueRating: Number(valueRating) || 0,
-      locationRating: Number(locationRating) || 0,
-      overallRating: Number(overallRating)
-    };
-
-    const review = new Review(reviewData);
-    await review.save();
-    res.status(201).json(review);
-  } catch (error) {
-    res.status(400).json({ error: error.message });
-  }
-});
-
-// PUT endpoint for upvoting (helpful)
-app.put('/review/:id/upvote', async (req, res) => {
-  try {
-    const reviewId = req.params.id;
-    const review = await Review.findById(reviewId);
-    if (!review) {
-      return res.status(404).json({ error: 'Review not found' });
-    }
-    review.helpful = (review.helpful || 0) + 1;
-    await review.save();
-    res.status(200).json({ message: 'Upvote successful', helpful: review.helpful });
-  } catch (error) {
-    res.status(400).json({ error: error.message });
-  }
-});
-
-// PUT endpoint for downvoting (unhelpful)
-app.put('/review/:id/downvote', async (req, res) => {
-  try {
-    const reviewId = req.params.id;
-    const review = await Review.findById(reviewId);
-    if (!review) {
-      return res.status(404).json({ error: 'Review not found' });
-    }
-    review.unhelpful = (review.unhelpful || 0) + 1;
-    await review.save();
-    res.status(200).json({ message: 'Downvote successful', unhelpful: review.unhelpful });
-  } catch (error) {
-    res.status(400).json({ error: error.message });
-  }
-});
-
-app.listen(port, '0.0.0.0', () => {
-  console.log(`Reviews API running on http://localhost:${port}`);
-});
-
diff --git a/microservice-reviews/docker-compose.yml b/microservice-reviews/docker-compose.yml
deleted file mode 100644
index 4393b2058478a6f6abc595399ebddfe1ec65cab2..0000000000000000000000000000000000000000
--- a/microservice-reviews/docker-compose.yml
+++ /dev/null
@@ -1,39 +0,0 @@
-services:
-  app:
-    build: .
-    ports:
-      - "8004:8004"
-    environment:
-      - NODE_ENV=production
-      - PORT=${PORT}
-      - DB_HOST=${DB_HOST}
-      - DB_PORT=${DB_PORT}
-      - DB_PASSWORD=${MYSQL_ROOT_PASSWORD}
-      - DB_NAME=${MYSQL_DATABASE}
-    volumes:
-      - .:/app
-      - /app/node_modules
-    depends_on:
-      mysql:
-        condition: service_healthy
-
-  mysql:
-    container_name: review-mysql
-    image: mysql:5.7
-    restart: always
-    environment:
-      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
-      MYSQL_DATABASE: ${MYSQL_DATABASE}
-    ports:
-      - "8104:3306"
-    volumes:
-      - mysql_data:/var/lib/mysql
-    healthcheck:
-      test: [ "CMD", "mysqladmin", "ping", "-h", "localhost" ]
-      interval: 10s
-      timeout: 5s
-      retries: 5
-
-volumes:
-    mysql_data:
-        driver: local
diff --git a/microservice-reviews/frontend/README.md b/microservice-reviews/frontend/README.md
deleted file mode 100644
index 58beeaccd87e230076cab531b8f418f40b6d1aeb..0000000000000000000000000000000000000000
--- a/microservice-reviews/frontend/README.md
+++ /dev/null
@@ -1,70 +0,0 @@
-# Getting Started with Create React App
-
-This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).
-
-## Available Scripts
-
-In the project directory, you can run:
-
-### `npm start`
-
-Runs the app in the development mode.\
-Open [http://localhost:3000](http://localhost:3000) to view it in your browser.
-
-The page will reload when you make changes.\
-You may also see any lint errors in the console.
-
-### `npm test`
-
-Launches the test runner in the interactive watch mode.\
-See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.
-
-### `npm run build`
-
-Builds the app for production to the `build` folder.\
-It correctly bundles React in production mode and optimizes the build for the best performance.
-
-The build is minified and the filenames include the hashes.\
-Your app is ready to be deployed!
-
-See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.
-
-### `npm run eject`
-
-**Note: this is a one-way operation. Once you `eject`, you can't go back!**
-
-If you aren't satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.
-
-Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you're on your own.
-
-You don't have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn't feel obligated to use this feature. However we understand that this tool wouldn't be useful if you couldn't customize it when you are ready for it.
-
-## Learn More
-
-You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).
-
-To learn React, check out the [React documentation](https://reactjs.org/).
-
-### Code Splitting
-
-This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting)
-
-### Analyzing the Bundle Size
-
-This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size)
-
-### Making a Progressive Web App
-
-This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app)
-
-### Advanced Configuration
-
-This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration)
-
-### Deployment
-
-This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment)
-
-### `npm run build` fails to minify
-
-This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify)
diff --git a/microservice-reviews/frontend/public/favicon.ico b/microservice-reviews/frontend/public/favicon.ico
deleted file mode 100644
index a11777cc471a4344702741ab1c8a588998b1311a..0000000000000000000000000000000000000000
Binary files a/microservice-reviews/frontend/public/favicon.ico and /dev/null differ
diff --git a/microservice-reviews/frontend/public/index.html b/microservice-reviews/frontend/public/index.html
deleted file mode 100644
index aa069f27cbd9d53394428171c3989fd03db73c76..0000000000000000000000000000000000000000
--- a/microservice-reviews/frontend/public/index.html
+++ /dev/null
@@ -1,43 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-  <head>
-    <meta charset="utf-8" />
-    <link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
-    <meta name="viewport" content="width=device-width, initial-scale=1" />
-    <meta name="theme-color" content="#000000" />
-    <meta
-      name="description"
-      content="Web site created using create-react-app"
-    />
-    <link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
-    <!--
-      manifest.json provides metadata used when your web app is installed on a
-      user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
-    -->
-    <link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
-    <!--
-      Notice the use of %PUBLIC_URL% in the tags above.
-      It will be replaced with the URL of the `public` folder during the build.
-      Only files inside the `public` folder can be referenced from the HTML.
-
-      Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
-      work correctly both with client-side routing and a non-root public URL.
-      Learn how to configure a non-root public URL by running `npm run build`.
-    -->
-    <title>React App</title>
-  </head>
-  <body>
-    <noscript>You need to enable JavaScript to run this app.</noscript>
-    <div id="root"></div>
-    <!--
-      This HTML file is a template.
-      If you open it directly in the browser, you will see an empty page.
-
-      You can add webfonts, meta tags, or analytics to this file.
-      The build step will place the bundled scripts into the <body> tag.
-
-      To begin the development, run `npm start` or `yarn start`.
-      To create a production bundle, use `npm run build` or `yarn build`.
-    -->
-  </body>
-</html>
diff --git a/microservice-reviews/frontend/public/logo192.png b/microservice-reviews/frontend/public/logo192.png
deleted file mode 100644
index fc44b0a3796c0e0a64c3d858ca038bd4570465d9..0000000000000000000000000000000000000000
Binary files a/microservice-reviews/frontend/public/logo192.png and /dev/null differ
diff --git a/microservice-reviews/frontend/public/logo512.png b/microservice-reviews/frontend/public/logo512.png
deleted file mode 100644
index a4e47a6545bc15971f8f63fba70e4013df88a664..0000000000000000000000000000000000000000
Binary files a/microservice-reviews/frontend/public/logo512.png and /dev/null differ
diff --git a/microservice-reviews/frontend/public/manifest.json b/microservice-reviews/frontend/public/manifest.json
deleted file mode 100644
index 080d6c77ac21bb2ef88a6992b2b73ad93daaca92..0000000000000000000000000000000000000000
--- a/microservice-reviews/frontend/public/manifest.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
-  "short_name": "React App",
-  "name": "Create React App Sample",
-  "icons": [
-    {
-      "src": "favicon.ico",
-      "sizes": "64x64 32x32 24x24 16x16",
-      "type": "image/x-icon"
-    },
-    {
-      "src": "logo192.png",
-      "type": "image/png",
-      "sizes": "192x192"
-    },
-    {
-      "src": "logo512.png",
-      "type": "image/png",
-      "sizes": "512x512"
-    }
-  ],
-  "start_url": ".",
-  "display": "standalone",
-  "theme_color": "#000000",
-  "background_color": "#ffffff"
-}
diff --git a/microservice-reviews/frontend/public/robots.txt b/microservice-reviews/frontend/public/robots.txt
deleted file mode 100644
index e9e57dc4d41b9b46e05112e9f45b7ea6ac0ba15e..0000000000000000000000000000000000000000
--- a/microservice-reviews/frontend/public/robots.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-# https://www.robotstxt.org/robotstxt.html
-User-agent: *
-Disallow:
diff --git a/microservice-reviews/frontend/src/App.css b/microservice-reviews/frontend/src/App.css
deleted file mode 100644
index 74b5e053450a48a6bdb4d71aad648e7af821975c..0000000000000000000000000000000000000000
--- a/microservice-reviews/frontend/src/App.css
+++ /dev/null
@@ -1,38 +0,0 @@
-.App {
-  text-align: center;
-}
-
-.App-logo {
-  height: 40vmin;
-  pointer-events: none;
-}
-
-@media (prefers-reduced-motion: no-preference) {
-  .App-logo {
-    animation: App-logo-spin infinite 20s linear;
-  }
-}
-
-.App-header {
-  background-color: #282c34;
-  min-height: 100vh;
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-  justify-content: center;
-  font-size: calc(10px + 2vmin);
-  color: white;
-}
-
-.App-link {
-  color: #61dafb;
-}
-
-@keyframes App-logo-spin {
-  from {
-    transform: rotate(0deg);
-  }
-  to {
-    transform: rotate(360deg);
-  }
-}
diff --git a/microservice-reviews/frontend/src/App.js b/microservice-reviews/frontend/src/App.js
deleted file mode 100644
index de35e812e56d19f85560dd64839a9de7078af4f2..0000000000000000000000000000000000000000
--- a/microservice-reviews/frontend/src/App.js
+++ /dev/null
@@ -1,17 +0,0 @@
-import React from 'react';
-import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
-import Home from './pages/Home';
-import EventDetail from './pages/EventDetail';
-
-function App() {
-  return (
-    <Router>
-      <Routes>
-        <Route path="/" element={<Home />} />
-        <Route path="/events/:eventId" element={<EventDetail />} />
-      </Routes>
-    </Router>
-  );
-}
-
-export default App;
diff --git a/microservice-reviews/frontend/src/App.test.js b/microservice-reviews/frontend/src/App.test.js
deleted file mode 100644
index 1f03afeece5ac28064fa3c73a29215037465f789..0000000000000000000000000000000000000000
--- a/microservice-reviews/frontend/src/App.test.js
+++ /dev/null
@@ -1,8 +0,0 @@
-import { render, screen } from '@testing-library/react';
-import App from './App';
-
-test('renders learn react link', () => {
-  render(<App />);
-  const linkElement = screen.getByText(/learn react/i);
-  expect(linkElement).toBeInTheDocument();
-});
diff --git a/microservice-reviews/frontend/src/components/CreateReview.css b/microservice-reviews/frontend/src/components/CreateReview.css
deleted file mode 100644
index 072fcd44b549987f5d842246f09e91bbf2c02ae8..0000000000000000000000000000000000000000
--- a/microservice-reviews/frontend/src/components/CreateReview.css
+++ /dev/null
@@ -1,138 +0,0 @@
-.create-review-form {
-  background: #ffffff;
-  border: 1px solid #e0e0e0;
-  padding: 20px;
-  margin-top: 20px;
-  border-radius: 8px;
-  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
-  font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
-}
-
-.create-review-form h2 {
-  margin-bottom: 15px;
-  color: #333;
-}
-
-.form-group {
-  margin-bottom: 15px;
-  display: flex;
-  flex-direction: column;
-}
-
-.form-group label {
-  margin-bottom: 5px;
-  font-weight: 600;
-  color: #444;
-}
-
-.form-group input[type="text"],
-.form-group textarea {
-  padding: 10px;
-  border: 1px solid #ccc;
-  border-radius: 4px;
-  font-size: 14px;
-}
-
-.form-group textarea {
-  resize: vertical;
-  min-height: 80px;
-}
-
-.subratings-container {
-  background: #f9f9f9;
-  border: 1px solid #ddd;
-  padding: 15px;
-  margin-bottom: 15px;
-  border-radius: 6px;
-}
-
-.subratings-container h3 {
-  margin-bottom: 10px;
-  font-size: 15px;
-  color: #333;
-  font-weight: 600;
-}
-
-.smiley-rating-row {
-  display: flex;
-  align-items: center;
-  margin-bottom: 12px;
-  gap: 10px;
-}
-
-.smiley-rating-row label {
-  min-width: 130px;
-  font-size: 14px;
-  color: #555;
-  font-weight: 500;
-}
-
-.smiley-scale {
-  display: flex;
-  gap: 8px;
-}
-
-.smiley-cell {
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-  cursor: pointer;
-  padding: 5px;
-  border: 1px solid transparent;
-  border-radius: 4px;
-  transition: background-color 0.2s, border-color 0.2s;
-}
-
-.smiley-cell:hover {
-  background-color: #e9f5ff;
-  border-color: #007bff;
-}
-
-.smiley-cell.selected {
-  background-color: #cceeff;
-  border-color: #007bff;
-}
-
-.rating-number {
-  font-size: 12px;
-  margin-bottom: 2px;
-  color: #333;
-}
-
-.emoji-face {
-  font-size: 22px;
-}
-
-.overall-rating {
-  margin-top: 15px;
-  font-size: 14px;
-  font-weight: normal;
-  color: #333;
-}
-
-.create-review-form button {
-  background-color: #007bff;
-  color: #ffffff;
-  padding: 10px 16px;
-  border: none;
-  border-radius: 4px;
-  font-size: 15px;
-  cursor: pointer;
-  transition: background-color 0.2s;
-}
-
-.create-review-form button:hover {
-  background-color: #0056b3;
-}
-
-.error-msg {
-  color: #d32f2f;
-  margin-bottom: 10px;
-  font-size: 14px;
-}
-
-.success-msg {
-  color: #388e3c;
-  margin-bottom: 10px;
-  font-size: 14px;
-}
diff --git a/microservice-reviews/frontend/src/components/CreateReview.jsx b/microservice-reviews/frontend/src/components/CreateReview.jsx
deleted file mode 100644
index 0b4c1b9745863bb732c67279cb4db372a62f7be0..0000000000000000000000000000000000000000
--- a/microservice-reviews/frontend/src/components/CreateReview.jsx
+++ /dev/null
@@ -1,184 +0,0 @@
-import React, { useState } from 'react';
-import axios from 'axios';
-import './CreateReview.css';
-
-const SmileyRatingRow = ({ label, value, setValue }) => {
-  // Define ratings for scale 1-10 with corresponding emoji
-  const ratings = [
-    { value: 1, emoji: "😡" },
-    { value: 2, emoji: "😠" },
-    { value: 3, emoji: "😞" },
-    { value: 4, emoji: "😟" },
-    { value: 5, emoji: "😐" },
-    { value: 6, emoji: "🙂" },
-    { value: 7, emoji: "😀" },
-    { value: 8, emoji: "😃" },
-    { value: 9, emoji: "😍" },
-    { value: 10, emoji: "🤩" }
-  ];
-
-  return (
-    <div className="smiley-rating-row">
-      <label>{label}</label>
-      <div className="smiley-scale">
-        {ratings.map((item) => (
-          <div
-            key={item.value}
-            className={`smiley-cell ${value === item.value ? "selected" : ""}`}
-            onClick={() => setValue(item.value)}
-          >
-            <div className="rating-number">{item.value}</div>
-            <div className="emoji-face">{item.emoji}</div>
-          </div>
-        ))}
-      </div>
-    </div>
-  );
-};
-
-const CreateReview = ({ eventId, onReviewAdded }) => {
-  const [customerName, setCustomerName] = useState('');
-  const [title, setTitle] = useState('');
-  const [positiveComment, setPositiveComment] = useState('');
-  const [negativeComment, setNegativeComment] = useState('');
-  const [comment, setComment] = useState('');
-  const [rating, setRating] = useState(5); // overall rating input if needed (optional)
-
-  // Sub-ratings using smiley rating rows for different aspects
-  const [staffRating, setStaffRating] = useState(0);
-  const [facilitiesRating, setFacilitiesRating] = useState(0);
-  const [cleanlinessRating, setCleanlinessRating] = useState(0);
-  const [comfortRating, setComfortRating] = useState(0);
-  const [valueRating, setValueRating] = useState(0);
-  const [locationRating, setLocationRating] = useState(0);
-
-  const [error, setError] = useState('');
-  const [success, setSuccess] = useState('');
-
-  // Compute overall rating from sub-ratings (average of non-zero values)
-  const subRatings = [
-    staffRating, facilitiesRating, cleanlinessRating,
-    comfortRating, valueRating, locationRating
-  ];
-  const validRatings = subRatings.filter(r => r > 0);
-  const overallRating = validRatings.length ? (
-    (validRatings.reduce((a, b) => a + b, 0) / validRatings.length).toFixed(1)
-  ) : 0;
-
-  const handleSubmit = async (e) => {
-    e.preventDefault();
-    const payload = {
-      customer_name: customerName,
-      eventId,
-      //  computed overallRating from sub-ratings:
-      rating: Number(overallRating) || Number(rating),
-      title,
-      positiveComment,
-      negativeComment,
-      comment,
-      staffRating,
-      facilitiesRating,
-      cleanlinessRating,
-      comfortRating,
-      valueRating,
-      locationRating
-    };
-
-    try {
-      await axios.post('http://localhost:8004/review', payload)
-      setSuccess('Review submitted successfully!');
-      setError('');
-      // Clear form fields
-      setCustomerName('');
-      setTitle('');
-      setPositiveComment('');
-      setNegativeComment('');
-      setComment('');
-      setRating(5);
-      setStaffRating(0);
-      setFacilitiesRating(0);
-      setCleanlinessRating(0);
-      setComfortRating(0);
-      setValueRating(0);
-      setLocationRating(0);
-      if (onReviewAdded) onReviewAdded();
-    } catch (err) {
-      console.error(err);
-      setError('Failed to submit review.');
-      setSuccess('');
-    }
-  };
-
-  return (
-    <form className="create-review-form" onSubmit={handleSubmit}>
-      <h2>Write a Review</h2>
-      {error && <div className="error-msg">{error}</div>}
-      {success && <div className="success-msg">{success}</div>}
-
-      <div className="form-group">
-        <label>Your Name:</label>
-        <input
-          type="text"
-          value={customerName}
-          onChange={(e) => setCustomerName(e.target.value)}
-          required
-        />
-      </div>
-
-      <div className="form-group">
-        <label>Overall Title:</label>
-        <input
-          type="text"
-          value={title}
-          onChange={(e) => setTitle(e.target.value)}
-          placeholder="e.g. 'Amazing experience!'"
-        />
-      </div>
-
-      <div className="form-group">
-        <label>Positive Feedback:</label>
-        <textarea
-          value={positiveComment}
-          onChange={(e) => setPositiveComment(e.target.value)}
-          placeholder="What did you enjoy?"
-        />
-      </div>
-
-      <div className="form-group">
-        <label>Negative Feedback:</label>
-        <textarea
-          value={negativeComment}
-          onChange={(e) => setNegativeComment(e.target.value)}
-          placeholder="What could be improved?"
-        />
-      </div>
-
-      <div className="form-group">
-        <label>Additional Comments:</label>
-        <textarea
-          value={comment}
-          onChange={(e) => setComment(e.target.value)}
-          placeholder="Any extra details you'd like to share..."
-          rows="3"
-        />
-      </div>
-
-      <div className="subratings-container">
-        <h3>Rate the following aspects:</h3>
-        <SmileyRatingRow label="Staff" value={staffRating} setValue={setStaffRating} />
-        <SmileyRatingRow label="Facilities" value={facilitiesRating} setValue={setFacilitiesRating} />
-        <SmileyRatingRow label="Cleanliness" value={cleanlinessRating} setValue={setCleanlinessRating} />
-        <SmileyRatingRow label="Comfort" value={comfortRating} setValue={setComfortRating} />
-        <SmileyRatingRow label="Value for Money" value={valueRating} setValue={setValueRating} />
-        <SmileyRatingRow label="Location" value={locationRating} setValue={setLocationRating} />
-        <p className="overall-rating">
-          Overall Score: <strong>{overallRating}</strong>
-        </p>
-      </div>
-      
-      <button type="submit">Submit Review</button>
-    </form>
-  );
-};
-
-export default CreateReview;
diff --git a/microservice-reviews/frontend/src/components/Reviews.css b/microservice-reviews/frontend/src/components/Reviews.css
deleted file mode 100644
index bc0dc11e4daa082514b5d1e023593967216bfff0..0000000000000000000000000000000000000000
--- a/microservice-reviews/frontend/src/components/Reviews.css
+++ /dev/null
@@ -1,176 +0,0 @@
-.reviews-container {
-  border: 1px solid #e5e5e5;
-  padding: 20px;
-  background: #ffffff;
-  border-radius: 8px;
-  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
-  margin-bottom: 20px;
-  font-family: Arial, sans-serif;
-}
-
-.photo-carousel {
-  display: flex;
-  overflow-x: auto;
-  margin-bottom: 20px;
-  gap: 10px;
-}
-.photo-carousel img {
-  width: 150px;
-  height: 100px;
-  object-fit: cover;
-  border-radius: 4px;
-  border: 1px solid #ddd;
-}
-
-.reviews-controls {
-  display: flex;
-  flex-wrap: wrap;
-  gap: 15px;
-  margin-bottom: 20px;
-  align-items: center;
-}
-
-.control-group {
-  display: flex;
-  align-items: center;
-  gap: 8px;
-}
-
-.control-group label {
-  font-weight: bold;
-  font-size: 14px;
-  color: #333;
-}
-
-.rating-buttons button {
-  border: 1px solid #007bff;
-  background: #fff;
-  color: #007bff;
-  padding: 5px 8px;
-  border-radius: 4px;
-  cursor: pointer;
-  font-size: 14px;
-  margin-right: 5px;
-  transition: background-color 0.2s, color 0.2s;
-}
-.rating-buttons button:hover {
-  background-color: #007bff;
-  color: #fff;
-}
-.rating-buttons button.active {
-  background-color: #007bff;
-  color: #fff;
-}
-.clear-button {
-  border: 1px solid #888;
-  background: #fff;
-  color: #888;
-  padding: 5px 8px;
-  border-radius: 4px;
-  cursor: pointer;
-  font-size: 14px;
-}
-.clear-button:hover {
-  background: #888;
-  color: #fff;
-}
-
-.control-group input[type="text"] {
-  padding: 7px 10px;
-  border: 1px solid #ccc;
-  border-radius: 4px;
-  font-size: 14px;
-}
-
-.loading-spinner {
-  text-align: center;
-  font-size: 16px;
-  padding: 20px;
-}
-
-.error {
-  text-align: center;
-  color: #d32f2f;
-  font-size: 15px;
-  padding: 20px;
-}
-
-.reviews-list {
-  display: flex;
-  flex-direction: column;
-  gap: 15px;
-}
-
-.review-item {
-  background: #f7f7f7;
-  padding: 15px;
-  border-radius: 6px;
-  border: 1px solid #ddd;
-}
-
-.review-item h4 {
-  margin: 0 0 5px;
-  font-size: 16px;
-}
-
-.overall-rating {
-  color: #ffbf00;
-  font-weight: bold;
-}
-
-.review-title {
-  margin: 5px 0;
-  color: #333;
-  font-size: 18px;
-  font-weight: bold;
-}
-
-.review-sub-comments {
-  margin: 8px 0;
-  font-size: 14px;
-}
-
-.positive-comment {
-  color: green;
-}
-.negative-comment {
-  color: red;
-}
-
-.additional-comment {
-  font-style: italic;
-  margin: 8px 0;
-}
-
-.review-date {
-  color: #999;
-  font-size: 12px;
-}
-
-.review-feedback {
-  display: flex;
-  gap: 10px;
-  margin-top: 10px;
-}
-
-.feedback-button {
-  background-color: transparent;
-  border: 1px solid #007bff;
-  color: #007bff;
-  padding: 5px 10px;
-  border-radius: 4px;
-  cursor: pointer;
-  transition: background-color 0.2s, color 0.2s;
-  font-size: 14px;
-}
-.feedback-button:hover {
-  background-color: #007bff;
-  color: #fff;
-}
-
-.no-reviews {
-  text-align: center;
-  color: #555;
-  font-size: 16px;
-  padding: 20px;
-}
diff --git a/microservice-reviews/frontend/src/components/Reviews.jsx b/microservice-reviews/frontend/src/components/Reviews.jsx
deleted file mode 100644
index e8d7a14f4996bebb1b22684f6b0c39c36e127d33..0000000000000000000000000000000000000000
--- a/microservice-reviews/frontend/src/components/Reviews.jsx
+++ /dev/null
@@ -1,215 +0,0 @@
-import React, { useEffect, useState, useRef } from 'react';
-import axios from 'axios';
-import './Reviews.css';
-
-const Reviews = ({ eventId }) => {
-  const [reviews, setReviews] = useState([]);
-  const [loading, setLoading] = useState(true);
-  const [error, setError] = useState("");
-  const [sortOrder, setSortOrder] = useState("mostRelevant");
-  const [filterRating, setFilterRating] = useState(0);
-  const [textFilter, setTextFilter] = useState("");
-  const [updatingId, setUpdatingId] = useState(null);
-
-  const carouselRef = useRef(null);
-  
-  useEffect(() => {
-    fetchReviews();
-    // eslint-disable-next-line react-hooks/exhaustive-deps
-  }, [eventId, sortOrder, filterRating, textFilter]);
-
-  const fetchReviews = () => {
-    setLoading(true);
-    axios.get(`http://localhost:8004/review?eventId=${eventId}`)
-      .then(response => {
-        let fetchedReviews = response.data;
-        // Apply rating filter if active
-        if (filterRating > 0) {
-          fetchedReviews = fetchedReviews.filter(r => r.rating === filterRating);
-        }
-        // Apply text filter (case-insensitive search on comment)
-        if (textFilter.trim() !== "") {
-          const search = textFilter.trim().toLowerCase();
-          fetchedReviews = fetchedReviews.filter(r =>
-            r.comment && r.comment.toLowerCase().includes(search)
-          );
-        }
-        fetchedReviews = sortReviews(fetchedReviews, sortOrder);
-        setReviews(fetchedReviews);
-        setLoading(false);
-      })
-      .catch(err => {
-        console.error(err);
-        setError("Failed to fetch reviews.");
-        setLoading(false);
-      });
-  };
-
-  const sortReviews = (reviews, order) => {
-    const sorted = [...reviews];
-    if (order === "mostRecent") {
-      sorted.sort((a, b) => new Date(b.createdAt) - new Date(a.createdAt));
-    } else if (order === "mostHelpful") {
-      sorted.sort((a, b) => (b.helpful || 0) - (a.helpful || 0));
-    }
-    // "mostRelevant" leaves reviews in default fetched order
-    return sorted;
-  };
-
-  const handleRatingFilter = (rating) => {
-    setFilterRating(prev => (prev === rating ? 0 : rating));
-  };
-
-  const handleUpvote = (reviewId) => {
-    setUpdatingId(reviewId);
-    axios.put(`http://localhost:8004/review/${reviewId}/upvote`)
-      .then(() => {
-        setReviews(prev =>
-          prev.map(r =>
-            r._id === reviewId ? { ...r, helpful: (r.helpful || 0) + 1 } : r
-          )
-        );
-        setUpdatingId(null);
-      })
-      .catch(err => {
-        console.error(err);
-        setUpdatingId(null);
-      });
-  };
-
-  const handleDownvote = (reviewId) => {
-    setUpdatingId(reviewId);
-    axios.put(`http://localhost:8004/review/${reviewId}/downvote`)
-      .then(() => {
-        setReviews(prev =>
-          prev.map(r =>
-            r._id === reviewId ? { ...r, unhelpful: (r.unhelpful || 0) + 1 } : r
-          )
-        );
-        setUpdatingId(null);
-      })
-      .catch(err => {
-        console.error(err);
-        setUpdatingId(null);
-      });
-  };
-
-  // Helper to highlight search text in review comment
-  const highlightText = (text, filter) => {
-    if (!filter) return text;
-    const parts = text.split(new RegExp(`(${filter})`, 'gi'));
-    return parts.map((part, i) =>
-      part.toLowerCase() === filter.toLowerCase() ? <mark key={i}>{part}</mark> : part
-    );
-  };
-
-  // Gather photos for a simple photo carousel (if available)
-  const photos = reviews.filter(r => r.photoUrl).map(r => r.photoUrl);
-
-  return (
-    <div className="reviews-container">
-      {/* Photo Carousel */}
-      {photos.length > 0 && (
-        <div className="photo-carousel" ref={carouselRef}>
-          {photos.map((url, index) => (
-            <img key={index} src={url} alt={`Customer ${index + 1}`} />
-          ))}
-        </div>
-      )}
-      
-      <div className="reviews-controls">
-        <div className="control-group">
-          <label>Sort By:</label>
-          <select value={sortOrder} onChange={(e) => setSortOrder(e.target.value)}>
-            <option value="mostRelevant">Most Relevant</option>
-            <option value="mostRecent">Most Recent</option>
-            <option value="mostHelpful">Most Helpful</option>
-          </select>
-        </div>
-        <div className="control-group">
-          <label>Filter by Rating:</label>
-          <div className="rating-buttons">
-            {[1, 2, 3, 4, 5].map(star => (
-              <button 
-                key={star}
-                onClick={() => handleRatingFilter(star)}
-                className={filterRating === star ? "active" : ""}
-              >
-                {star}★
-              </button>
-            ))}
-            {filterRating !== 0 && (
-              <button className="clear-button" onClick={() => setFilterRating(0)}>Clear</button>
-            )}
-          </div>
-        </div>
-        <div className="control-group">
-          <input 
-            type="text"
-            placeholder="Search reviews..."
-            value={textFilter}
-            onChange={(e) => setTextFilter(e.target.value)}
-          />
-        </div>
-      </div>
-      
-      {loading && <div className="loading-spinner">Loading reviews...</div>}
-      {error && <div className="error">{error}</div>}
-      
-      <div className="reviews-list">
-        {reviews.length > 0 ? (
-          reviews.map(review => (
-            <div key={review._id || review.id} className="review-item">
-              <h4>
-                {review.userId} - <span className="overall-rating">{review.rating} / 10</span>
-              </h4>
-              {review.title && (
-                <h3 className="review-title">{review.title}</h3>
-              )}
-              <div className="review-sub-comments">
-                {review.positiveComment && (
-                  <p className="positive-comment">
-                    <span className="emoji">😊</span> {review.positiveComment}
-                  </p>
-                )}
-                {review.negativeComment && (
-                  <p className="negative-comment">
-                    <span className="emoji">😞</span> {review.negativeComment}
-                  </p>
-                )}
-              </div>
-              {review.comment && (
-                <div className="additional-comment">
-                  <em>"{highlightText(review.comment, textFilter)}"</em>
-                </div>
-              )}
-              <small className="review-date">
-                {new Date(review.createdAt).toLocaleString()}
-              </small>
-              <div className="review-feedback">
-                <button 
-                  className="feedback-button"
-                  onClick={() => handleUpvote(review._id)}
-                  disabled={updatingId === review._id}
-                >
-                  👍 {review.helpful || 0}
-                </button>
-                <button 
-                  className="feedback-button"
-                  onClick={() => handleDownvote(review._id)}
-                  disabled={updatingId === review._id}
-                >
-                  👎 {review.unhelpful || 0}
-                </button>
-              </div>
-            </div>
-          ))
-        ) : (
-          <div className="no-reviews">No reviews found.</div>
-        )}
-      </div>
-    </div>
-  );
-};
-
-export default Reviews;
diff --git a/microservice-reviews/frontend/src/components/StarFilter.jsx b/microservice-reviews/frontend/src/components/StarFilter.jsx
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/microservice-reviews/frontend/src/index.css b/microservice-reviews/frontend/src/index.css
deleted file mode 100644
index ec2585e8c0bb8188184ed1e0703c4c8f2a8419b0..0000000000000000000000000000000000000000
--- a/microservice-reviews/frontend/src/index.css
+++ /dev/null
@@ -1,13 +0,0 @@
-body {
-  margin: 0;
-  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
-    'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
-    sans-serif;
-  -webkit-font-smoothing: antialiased;
-  -moz-osx-font-smoothing: grayscale;
-}
-
-code {
-  font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
-    monospace;
-}
diff --git a/microservice-reviews/frontend/src/index.js b/microservice-reviews/frontend/src/index.js
deleted file mode 100644
index d563c0fb10ba0e42724b21286eb546ee4e5734fc..0000000000000000000000000000000000000000
--- a/microservice-reviews/frontend/src/index.js
+++ /dev/null
@@ -1,17 +0,0 @@
-import React from 'react';
-import ReactDOM from 'react-dom/client';
-import './index.css';
-import App from './App';
-import reportWebVitals from './reportWebVitals';
-
-const root = ReactDOM.createRoot(document.getElementById('root'));
-root.render(
-  <React.StrictMode>
-    <App />
-  </React.StrictMode>
-);
-
-// If you want to start measuring performance in your app, pass a function
-// to log results (for example: reportWebVitals(console.log))
-// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
-reportWebVitals();
diff --git a/microservice-reviews/frontend/src/logo.svg b/microservice-reviews/frontend/src/logo.svg
deleted file mode 100644
index 9dfc1c058cebbef8b891c5062be6f31033d7d186..0000000000000000000000000000000000000000
--- a/microservice-reviews/frontend/src/logo.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 841.9 595.3"><g fill="#61DAFB"><path d="M666.3 296.5c0-32.5-40.7-63.3-103.1-82.4 14.4-63.6 8-114.2-20.2-130.4-6.5-3.8-14.1-5.6-22.4-5.6v22.3c4.6 0 8.3.9 11.4 2.6 13.6 7.8 19.5 37.5 14.9 75.7-1.1 9.4-2.9 19.3-5.1 29.4-19.6-4.8-41-8.5-63.5-10.9-13.5-18.5-27.5-35.3-41.6-50 32.6-30.3 63.2-46.9 84-46.9V78c-27.5 0-63.5 19.6-99.9 53.6-36.4-33.8-72.4-53.2-99.9-53.2v22.3c20.7 0 51.4 16.5 84 46.6-14 14.7-28 31.4-41.3 49.9-22.6 2.4-44 6.1-63.6 11-2.3-10-4-19.7-5.2-29-4.7-38.2 1.1-67.9 14.6-75.8 3-1.8 6.9-2.6 11.5-2.6V78.5c-8.4 0-16 1.8-22.6 5.6-28.1 16.2-34.4 66.7-19.9 130.1-62.2 19.2-102.7 49.9-102.7 82.3 0 32.5 40.7 63.3 103.1 82.4-14.4 63.6-8 114.2 20.2 130.4 6.5 3.8 14.1 5.6 22.5 5.6 27.5 0 63.5-19.6 99.9-53.6 36.4 33.8 72.4 53.2 99.9 53.2 8.4 0 16-1.8 22.6-5.6 28.1-16.2 34.4-66.7 19.9-130.1 62-19.1 102.5-49.9 102.5-82.3zm-130.2-66.7c-3.7 12.9-8.3 26.2-13.5 39.5-4.1-8-8.4-16-13.1-24-4.6-8-9.5-15.8-14.4-23.4 14.2 2.1 27.9 4.7 41 7.9zm-45.8 106.5c-7.8 13.5-15.8 26.3-24.1 38.2-14.9 1.3-30 2-45.2 2-15.1 0-30.2-.7-45-1.9-8.3-11.9-16.4-24.6-24.2-38-7.6-13.1-14.5-26.4-20.8-39.8 6.2-13.4 13.2-26.8 20.7-39.9 7.8-13.5 15.8-26.3 24.1-38.2 14.9-1.3 30-2 45.2-2 15.1 0 30.2.7 45 1.9 8.3 11.9 16.4 24.6 24.2 38 7.6 13.1 14.5 26.4 20.8 39.8-6.3 13.4-13.2 26.8-20.7 39.9zm32.3-13c5.4 13.4 10 26.8 13.8 39.8-13.1 3.2-26.9 5.9-41.2 8 4.9-7.7 9.8-15.6 14.4-23.7 4.6-8 8.9-16.1 13-24.1zM421.2 430c-9.3-9.6-18.6-20.3-27.8-32 9 .4 18.2.7 27.5.7 9.4 0 18.7-.2 27.8-.7-9 11.7-18.3 22.4-27.5 32zm-74.4-58.9c-14.2-2.1-27.9-4.7-41-7.9 3.7-12.9 8.3-26.2 13.5-39.5 4.1 8 8.4 16 13.1 24 4.7 8 9.5 15.8 14.4 23.4zM420.7 163c9.3 9.6 18.6 20.3 27.8 32-9-.4-18.2-.7-27.5-.7-9.4 0-18.7.2-27.8.7 9-11.7 18.3-22.4 27.5-32zm-74 58.9c-4.9 7.7-9.8 15.6-14.4 23.7-4.6 8-8.9 16-13 24-5.4-13.4-10-26.8-13.8-39.8 13.1-3.1 26.9-5.8 41.2-7.9zm-90.5 125.2c-35.4-15.1-58.3-34.9-58.3-50.6 0-15.7 22.9-35.6 58.3-50.6 8.6-3.7 18-7 27.7-10.1 5.7 19.6 13.2 40 22.5 60.9-9.2 20.8-16.6 41.1-22.2 60.6-9.9-3.1-19.3-6.5-28-10.2zM310 490c-13.6-7.8-19.5-37.5-14.9-75.7 1.1-9.4 2.9-19.3 5.1-29.4 19.6 4.8 41 8.5 63.5 10.9 13.5 18.5 27.5 35.3 41.6 50-32.6 30.3-63.2 46.9-84 46.9-4.5-.1-8.3-1-11.3-2.7zm237.2-76.2c4.7 38.2-1.1 67.9-14.6 75.8-3 1.8-6.9 2.6-11.5 2.6-20.7 0-51.4-16.5-84-46.6 14-14.7 28-31.4 41.3-49.9 22.6-2.4 44-6.1 63.6-11 2.3 10.1 4.1 19.8 5.2 29.1zm38.5-66.7c-8.6 3.7-18 7-27.7 10.1-5.7-19.6-13.2-40-22.5-60.9 9.2-20.8 16.6-41.1 22.2-60.6 9.9 3.1 19.3 6.5 28.1 10.2 35.4 15.1 58.3 34.9 58.3 50.6-.1 15.7-23 35.6-58.4 50.6zM320.8 78.4z"/><circle cx="420.9" cy="296.5" r="45.7"/><path d="M520.5 78.1z"/></g></svg>
\ No newline at end of file
diff --git a/microservice-reviews/frontend/src/pages/EventDetail.css b/microservice-reviews/frontend/src/pages/EventDetail.css
deleted file mode 100644
index 2afeaedd07eb58c7b9f7f4a8ed48d1d1ab1ea9c7..0000000000000000000000000000000000000000
--- a/microservice-reviews/frontend/src/pages/EventDetail.css
+++ /dev/null
@@ -1,41 +0,0 @@
-.event-detail-container {
-    max-width: 800px;
-    margin: 0 auto;
-    padding: 20px;
-    font-family: Arial, sans-serif;
-  }
-  
-  .event-header {
-    margin-bottom: 20px;
-  }
-  
-  .event-header a {
-    text-decoration: none;
-    color: blue;
-  }
-  
-  .event-header h2 {
-    margin-top: 10px;
-    margin-bottom: 5px;
-  }
-  
-  .event-header p {
-    color: #555;
-  }
-  
-  .review-section, .review-form-section {
-    margin-top: 20px;
-  }
-  
-  .loading {
-    text-align: center;
-    font-size: 1.2em;
-    padding: 20px;
-  }
-  
-  .error {
-    color: red;
-    text-align: center;
-    padding: 20px;
-  }
-  
\ No newline at end of file
diff --git a/microservice-reviews/frontend/src/pages/EventDetail.jsx b/microservice-reviews/frontend/src/pages/EventDetail.jsx
deleted file mode 100644
index a88992edb6c1efb5a235fa838b675c22d0bec255..0000000000000000000000000000000000000000
--- a/microservice-reviews/frontend/src/pages/EventDetail.jsx
+++ /dev/null
@@ -1,53 +0,0 @@
-import React, { useEffect, useState } from 'react';
-import { useParams, Link } from 'react-router-dom';
-import Reviews from '../components/Reviews';
-import CreateReview from '../components/CreateReview';
-import './EventDetail.css';
-
-const dummyEvents = {
-  '1': { id: '1', name: 'Tech Conference 2023', description: 'A conference about tech trends.' },
-  '2': { id: '2', name: 'Music Festival', description: 'Great live music all day.' },
-  '3': { id: '3', name: 'Art Expo', description: 'Showcase of modern art.' },
-};
-
-const EventDetail = () => {
-  const { eventId } = useParams();
-  const [eventDetail, setEventDetail] = useState(null);
-  const [loading, setLoading] = useState(true);
-  const [error, setError] = useState("");
-
-  // For demo: using dummy event data.
-  useEffect(() => {
-    const event = dummyEvents[eventId];
-    if (event) {
-      setEventDetail(event);
-    } else {
-      setError("Event not found");
-    }
-    setLoading(false);
-  }, [eventId]);
-
-  if (loading) return <div className="loading">Loading event...</div>;
-  if (error) return <div className="error">{error}</div>;
-
-  return (
-    <div className="event-detail-container">
-      <div className="event-header">
-        <Link to="/">← Back</Link>
-        <h2>{eventDetail.name}</h2>
-        <p>{eventDetail.description}</p>
-      </div>
-      <hr />
-      <div className="review-section">
-        <h3>Reviews for this event:</h3>
-        <Reviews eventId={eventId} />
-      </div>
-      <div className="review-form-section">
-        <h3>Add Your Review:</h3>
-        <CreateReview eventId={eventId} />
-      </div>
-    </div>
-  );
-};
-
-export default EventDetail;
diff --git a/microservice-reviews/frontend/src/pages/Home.css b/microservice-reviews/frontend/src/pages/Home.css
deleted file mode 100644
index 3d8ebc8ccb6514429a770fd20a1ac1229ff16ace..0000000000000000000000000000000000000000
--- a/microservice-reviews/frontend/src/pages/Home.css
+++ /dev/null
@@ -1,31 +0,0 @@
-.home-container {
-  max-width: 800px;
-  margin: 0 auto;
-  padding: 20px;
-  font-family: Arial, sans-serif;
-}
-
-.event-list {
-  display: flex;
-  flex-direction: column;
-  gap: 15px;
-  margin-top: 20px;
-}
-
-.event-card {
-  border: 1px solid #ddd;
-  padding: 15px;
-  border-radius: 4px;
-  background: #fff;
-}
-
-.event-link {
-  display: inline-block;
-  margin-top: 10px;
-  color: #007bff;
-  text-decoration: none;
-}
-
-.event-link:hover {
-  text-decoration: underline;
-}
diff --git a/microservice-reviews/frontend/src/pages/Home.jsx b/microservice-reviews/frontend/src/pages/Home.jsx
deleted file mode 100644
index 0ab55d578a878758592e4da618d4949843a530fd..0000000000000000000000000000000000000000
--- a/microservice-reviews/frontend/src/pages/Home.jsx
+++ /dev/null
@@ -1,28 +0,0 @@
-import React from 'react';
-import { Link } from 'react-router-dom';
-import './Home.css';
-
-const dummyEvents = [
-  { id: "1", name: "Tech Conference 2023", description: "A conference about tech trends." },
-  { id: "2", name: "Music Festival", description: "Great live music all day." },
-  { id: "3", name: "Art Expo", description: "Showcase of modern art." }
-];
-
-const Home = () => {
-  return (
-    <div className="home-container">
-      <h1>Upcoming Events</h1>
-      <div className="event-list">
-        {dummyEvents.map(event => (
-          <div key={event.id} className="event-card">
-            <h3>{event.name}</h3>
-            <p>{event.description}</p>
-            <Link to={`/events/${event.id}`} className="event-link">View Details</Link>
-          </div>
-        ))}
-      </div>
-    </div>
-  );
-};
-
-export default Home;
diff --git a/microservice-reviews/frontend/src/reportWebVitals.js b/microservice-reviews/frontend/src/reportWebVitals.js
deleted file mode 100644
index 5253d3ad9e6be6690549cb255f5952337b02401d..0000000000000000000000000000000000000000
--- a/microservice-reviews/frontend/src/reportWebVitals.js
+++ /dev/null
@@ -1,13 +0,0 @@
-const reportWebVitals = onPerfEntry => {
-  if (onPerfEntry && onPerfEntry instanceof Function) {
-    import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
-      getCLS(onPerfEntry);
-      getFID(onPerfEntry);
-      getFCP(onPerfEntry);
-      getLCP(onPerfEntry);
-      getTTFB(onPerfEntry);
-    });
-  }
-};
-
-export default reportWebVitals;
diff --git a/microservice-reviews/frontend/src/setupTests.js b/microservice-reviews/frontend/src/setupTests.js
deleted file mode 100644
index 8f2609b7b3e0e3897ab3bcaad13caf6876e48699..0000000000000000000000000000000000000000
--- a/microservice-reviews/frontend/src/setupTests.js
+++ /dev/null
@@ -1,5 +0,0 @@
-// jest-dom adds custom jest matchers for asserting on DOM nodes.
-// allows you to do things like:
-// expect(element).toHaveTextContent(/react/i)
-// learn more: https://github.com/testing-library/jest-dom
-import '@testing-library/jest-dom';
diff --git a/microservice-reviews/package-lock.json b/microservice-reviews/package-lock.json
index 579463366ec735418526cc5aa829f5d0d541ca6b..3b20d7c912effc074f3940cdf6773bdcdedc0508 100644
--- a/microservice-reviews/package-lock.json
+++ b/microservice-reviews/package-lock.json
@@ -1,19 +1,527 @@
 {
-  "name": "microservice-reviews",
+  "name": "reviews-service",
   "version": "1.0.0",
   "lockfileVersion": 3,
   "requires": true,
   "packages": {
     "": {
-      "name": "microservice-reviews",
+      "name": "reviews-service",
       "version": "1.0.0",
-      "license": "ISC",
       "dependencies": {
+        "@prisma/client": "^6.6.0",
         "cors": "^2.8.5",
-        "dotenv": "^16.4.7",
-        "express": "^4.21.2",
-        "microservice-reviews": "file:",
-        "mysql2": "^3.14.0"
+        "express": "^4.18.2"
+      },
+      "devDependencies": {
+        "prisma": "^6.6.0"
+      }
+    },
+    "node_modules/@esbuild/aix-ppc64": {
+      "version": "0.25.3",
+      "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.3.tgz",
+      "integrity": "sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "aix"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/android-arm": {
+      "version": "0.25.3",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.3.tgz",
+      "integrity": "sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/android-arm64": {
+      "version": "0.25.3",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.3.tgz",
+      "integrity": "sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/android-x64": {
+      "version": "0.25.3",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.3.tgz",
+      "integrity": "sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/darwin-arm64": {
+      "version": "0.25.3",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.3.tgz",
+      "integrity": "sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/darwin-x64": {
+      "version": "0.25.3",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.3.tgz",
+      "integrity": "sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/freebsd-arm64": {
+      "version": "0.25.3",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.3.tgz",
+      "integrity": "sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/freebsd-x64": {
+      "version": "0.25.3",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.3.tgz",
+      "integrity": "sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-arm": {
+      "version": "0.25.3",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.3.tgz",
+      "integrity": "sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-arm64": {
+      "version": "0.25.3",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.3.tgz",
+      "integrity": "sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-ia32": {
+      "version": "0.25.3",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.3.tgz",
+      "integrity": "sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-loong64": {
+      "version": "0.25.3",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.3.tgz",
+      "integrity": "sha512-P4BLP5/fjyihmXCELRGrLd793q/lBtKMQl8ARGpDxgzgIKJDRJ/u4r1A/HgpBpKpKZelGct2PGI4T+axcedf6g==",
+      "cpu": [
+        "loong64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-mips64el": {
+      "version": "0.25.3",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.3.tgz",
+      "integrity": "sha512-eRAOV2ODpu6P5divMEMa26RRqb2yUoYsuQQOuFUexUoQndm4MdpXXDBbUoKIc0iPa4aCO7gIhtnYomkn2x+bag==",
+      "cpu": [
+        "mips64el"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-ppc64": {
+      "version": "0.25.3",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.3.tgz",
+      "integrity": "sha512-ZC4jV2p7VbzTlnl8nZKLcBkfzIf4Yad1SJM4ZMKYnJqZFD4rTI+pBG65u8ev4jk3/MPwY9DvGn50wi3uhdaghg==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-riscv64": {
+      "version": "0.25.3",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.3.tgz",
+      "integrity": "sha512-LDDODcFzNtECTrUUbVCs6j9/bDVqy7DDRsuIXJg6so+mFksgwG7ZVnTruYi5V+z3eE5y+BJZw7VvUadkbfg7QA==",
+      "cpu": [
+        "riscv64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-s390x": {
+      "version": "0.25.3",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.3.tgz",
+      "integrity": "sha512-s+w/NOY2k0yC2p9SLen+ymflgcpRkvwwa02fqmAwhBRI3SC12uiS10edHHXlVWwfAagYSY5UpmT/zISXPMW3tQ==",
+      "cpu": [
+        "s390x"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-x64": {
+      "version": "0.25.3",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.3.tgz",
+      "integrity": "sha512-nQHDz4pXjSDC6UfOE1Fw9Q8d6GCAd9KdvMZpfVGWSJztYCarRgSDfOVBY5xwhQXseiyxapkiSJi/5/ja8mRFFA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/netbsd-arm64": {
+      "version": "0.25.3",
+      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.3.tgz",
+      "integrity": "sha512-1QaLtOWq0mzK6tzzp0jRN3eccmN3hezey7mhLnzC6oNlJoUJz4nym5ZD7mDnS/LZQgkrhEbEiTn515lPeLpgWA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "netbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/netbsd-x64": {
+      "version": "0.25.3",
+      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.3.tgz",
+      "integrity": "sha512-i5Hm68HXHdgv8wkrt+10Bc50zM0/eonPb/a/OFVfB6Qvpiirco5gBA5bz7S2SHuU+Y4LWn/zehzNX14Sp4r27g==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "netbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/openbsd-arm64": {
+      "version": "0.25.3",
+      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.3.tgz",
+      "integrity": "sha512-zGAVApJEYTbOC6H/3QBr2mq3upG/LBEXr85/pTtKiv2IXcgKV0RT0QA/hSXZqSvLEpXeIxah7LczB4lkiYhTAQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "openbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/openbsd-x64": {
+      "version": "0.25.3",
+      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.3.tgz",
+      "integrity": "sha512-fpqctI45NnCIDKBH5AXQBsD0NDPbEFczK98hk/aa6HJxbl+UtLkJV2+Bvy5hLSLk3LHmqt0NTkKNso1A9y1a4w==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "openbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/sunos-x64": {
+      "version": "0.25.3",
+      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.3.tgz",
+      "integrity": "sha512-ROJhm7d8bk9dMCUZjkS8fgzsPAZEjtRJqCAmVgB0gMrvG7hfmPmz9k1rwO4jSiblFjYmNvbECL9uhaPzONMfgA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "sunos"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/win32-arm64": {
+      "version": "0.25.3",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.3.tgz",
+      "integrity": "sha512-YWcow8peiHpNBiIXHwaswPnAXLsLVygFwCB3A7Bh5jRkIBFWHGmNQ48AlX4xDvQNoMZlPYzjVOQDYEzWCqufMQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/win32-ia32": {
+      "version": "0.25.3",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.3.tgz",
+      "integrity": "sha512-qspTZOIGoXVS4DpNqUYUs9UxVb04khS1Degaw/MnfMe7goQ3lTfQ13Vw4qY/Nj0979BGvMRpAYbs/BAxEvU8ew==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/win32-x64": {
+      "version": "0.25.3",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.3.tgz",
+      "integrity": "sha512-ICgUR+kPimx0vvRzf+N/7L7tVSQeE3BYY+NhHRHXS1kBuPO7z2+7ea2HbhDyZdTephgvNvKrlDDKUexuCVBVvg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@prisma/client": {
+      "version": "6.6.0",
+      "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.6.0.tgz",
+      "integrity": "sha512-vfp73YT/BHsWWOAuthKQ/1lBgESSqYqAWZEYyTdGXyFAHpmewwWL2Iz6ErIzkj4aHbuc6/cGSsE6ZY+pBO04Cg==",
+      "hasInstallScript": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": ">=18.18"
+      },
+      "peerDependencies": {
+        "prisma": "*",
+        "typescript": ">=5.1.0"
+      },
+      "peerDependenciesMeta": {
+        "prisma": {
+          "optional": true
+        },
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@prisma/config": {
+      "version": "6.6.0",
+      "resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.6.0.tgz",
+      "integrity": "sha512-d8FlXRHsx72RbN8nA2QCRORNv5AcUnPXgtPvwhXmYkQSMF/j9cKaJg+9VcUzBRXGy9QBckNzEQDEJZdEOZ+ubA==",
+      "devOptional": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "esbuild": ">=0.12 <1",
+        "esbuild-register": "3.6.0"
+      }
+    },
+    "node_modules/@prisma/debug": {
+      "version": "6.6.0",
+      "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.6.0.tgz",
+      "integrity": "sha512-DL6n4IKlW5k2LEXzpN60SQ1kP/F6fqaCgU/McgaYsxSf43GZ8lwtmXLke9efS+L1uGmrhtBUP4npV/QKF8s2ZQ==",
+      "devOptional": true,
+      "license": "Apache-2.0"
+    },
+    "node_modules/@prisma/engines": {
+      "version": "6.6.0",
+      "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.6.0.tgz",
+      "integrity": "sha512-nC0IV4NHh7500cozD1fBoTwTD1ydJERndreIjpZr/S3mno3P6tm8qnXmIND5SwUkibNeSJMpgl4gAnlqJ/gVlg==",
+      "devOptional": true,
+      "hasInstallScript": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@prisma/debug": "6.6.0",
+        "@prisma/engines-version": "6.6.0-53.f676762280b54cd07c770017ed3711ddde35f37a",
+        "@prisma/fetch-engine": "6.6.0",
+        "@prisma/get-platform": "6.6.0"
+      }
+    },
+    "node_modules/@prisma/engines-version": {
+      "version": "6.6.0-53.f676762280b54cd07c770017ed3711ddde35f37a",
+      "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.6.0-53.f676762280b54cd07c770017ed3711ddde35f37a.tgz",
+      "integrity": "sha512-JzRaQ5Em1fuEcbR3nUsMNYaIYrOT1iMheenjCvzZblJcjv/3JIuxXN7RCNT5i6lRkLodW5ojCGhR7n5yvnNKrw==",
+      "devOptional": true,
+      "license": "Apache-2.0"
+    },
+    "node_modules/@prisma/fetch-engine": {
+      "version": "6.6.0",
+      "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.6.0.tgz",
+      "integrity": "sha512-Ohfo8gKp05LFLZaBlPUApM0M7k43a0jmo86YY35u1/4t+vuQH9mRGU7jGwVzGFY3v+9edeb/cowb1oG4buM1yw==",
+      "devOptional": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@prisma/debug": "6.6.0",
+        "@prisma/engines-version": "6.6.0-53.f676762280b54cd07c770017ed3711ddde35f37a",
+        "@prisma/get-platform": "6.6.0"
+      }
+    },
+    "node_modules/@prisma/get-platform": {
+      "version": "6.6.0",
+      "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.6.0.tgz",
+      "integrity": "sha512-3qCwmnT4Jh5WCGUrkWcc6VZaw0JY7eWN175/pcb5Z6FiLZZ3ygY93UX0WuV41bG51a6JN/oBH0uywJ90Y+V5eA==",
+      "devOptional": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@prisma/debug": "6.6.0"
       }
     },
     "node_modules/accepts": {
@@ -35,15 +543,6 @@
       "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
       "license": "MIT"
     },
-    "node_modules/aws-ssl-profiles": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz",
-      "integrity": "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 6.0.0"
-      }
-    },
     "node_modules/body-parser": {
       "version": "1.20.3",
       "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
@@ -164,15 +663,6 @@
         "ms": "2.0.0"
       }
     },
-    "node_modules/denque": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz",
-      "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==",
-      "license": "Apache-2.0",
-      "engines": {
-        "node": ">=0.10"
-      }
-    },
     "node_modules/depd": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
@@ -192,18 +682,6 @@
         "npm": "1.2.8000 || >= 1.4.16"
       }
     },
-    "node_modules/dotenv": {
-      "version": "16.4.7",
-      "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz",
-      "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==",
-      "license": "BSD-2-Clause",
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://dotenvx.com"
-      }
-    },
     "node_modules/dunder-proto": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
@@ -263,6 +741,85 @@
         "node": ">= 0.4"
       }
     },
+    "node_modules/esbuild": {
+      "version": "0.25.3",
+      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.3.tgz",
+      "integrity": "sha512-qKA6Pvai73+M2FtftpNKRxJ78GIjmFXFxd/1DVBqGo/qNhLSfv+G12n9pNoWdytJC8U00TrViOwpjT0zgqQS8Q==",
+      "devOptional": true,
+      "hasInstallScript": true,
+      "license": "MIT",
+      "bin": {
+        "esbuild": "bin/esbuild"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "optionalDependencies": {
+        "@esbuild/aix-ppc64": "0.25.3",
+        "@esbuild/android-arm": "0.25.3",
+        "@esbuild/android-arm64": "0.25.3",
+        "@esbuild/android-x64": "0.25.3",
+        "@esbuild/darwin-arm64": "0.25.3",
+        "@esbuild/darwin-x64": "0.25.3",
+        "@esbuild/freebsd-arm64": "0.25.3",
+        "@esbuild/freebsd-x64": "0.25.3",
+        "@esbuild/linux-arm": "0.25.3",
+        "@esbuild/linux-arm64": "0.25.3",
+        "@esbuild/linux-ia32": "0.25.3",
+        "@esbuild/linux-loong64": "0.25.3",
+        "@esbuild/linux-mips64el": "0.25.3",
+        "@esbuild/linux-ppc64": "0.25.3",
+        "@esbuild/linux-riscv64": "0.25.3",
+        "@esbuild/linux-s390x": "0.25.3",
+        "@esbuild/linux-x64": "0.25.3",
+        "@esbuild/netbsd-arm64": "0.25.3",
+        "@esbuild/netbsd-x64": "0.25.3",
+        "@esbuild/openbsd-arm64": "0.25.3",
+        "@esbuild/openbsd-x64": "0.25.3",
+        "@esbuild/sunos-x64": "0.25.3",
+        "@esbuild/win32-arm64": "0.25.3",
+        "@esbuild/win32-ia32": "0.25.3",
+        "@esbuild/win32-x64": "0.25.3"
+      }
+    },
+    "node_modules/esbuild-register": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.6.0.tgz",
+      "integrity": "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==",
+      "devOptional": true,
+      "license": "MIT",
+      "dependencies": {
+        "debug": "^4.3.4"
+      },
+      "peerDependencies": {
+        "esbuild": ">=0.12 <1"
+      }
+    },
+    "node_modules/esbuild-register/node_modules/debug": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
+      "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+      "devOptional": true,
+      "license": "MIT",
+      "dependencies": {
+        "ms": "^2.1.3"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/esbuild-register/node_modules/ms": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+      "devOptional": true,
+      "license": "MIT"
+    },
     "node_modules/escape-html": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
@@ -360,6 +917,21 @@
         "node": ">= 0.6"
       }
     },
+    "node_modules/fsevents": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+      "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+      "dev": true,
+      "hasInstallScript": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+      }
+    },
     "node_modules/function-bind": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
@@ -369,15 +941,6 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/generate-function": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz",
-      "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==",
-      "license": "MIT",
-      "dependencies": {
-        "is-property": "^1.0.2"
-      }
-    },
     "node_modules/get-intrinsic": {
       "version": "1.3.0",
       "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
@@ -494,42 +1057,6 @@
         "node": ">= 0.10"
       }
     },
-    "node_modules/is-property": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
-      "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==",
-      "license": "MIT"
-    },
-    "node_modules/long": {
-      "version": "5.3.1",
-      "resolved": "https://registry.npmjs.org/long/-/long-5.3.1.tgz",
-      "integrity": "sha512-ka87Jz3gcx/I7Hal94xaN2tZEOPoUOEVftkQqZx2EeQRN7LGdfLlI3FvZ+7WDplm+vK2Urx9ULrvSowtdCieng==",
-      "license": "Apache-2.0"
-    },
-    "node_modules/lru-cache": {
-      "version": "7.18.3",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
-      "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
-      "license": "ISC",
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/lru.min": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.2.tgz",
-      "integrity": "sha512-Nv9KddBcQSlQopmBHXSsZVY5xsdlZkdH/Iey0BlcBYggMd4two7cZnKOK9vmy3nY0O5RGH99z1PCeTpPqszUYg==",
-      "license": "MIT",
-      "engines": {
-        "bun": ">=1.0.0",
-        "deno": ">=1.30.0",
-        "node": ">=8.0.0"
-      },
-      "funding": {
-        "type": "github",
-        "url": "https://github.com/sponsors/wellwelwel"
-      }
-    },
     "node_modules/math-intrinsics": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
@@ -566,10 +1093,6 @@
         "node": ">= 0.6"
       }
     },
-    "node_modules/microservice-reviews": {
-      "resolved": "",
-      "link": true
-    },
     "node_modules/mime": {
       "version": "1.6.0",
       "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
@@ -609,50 +1132,6 @@
       "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
       "license": "MIT"
     },
-    "node_modules/mysql2": {
-      "version": "3.14.0",
-      "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.14.0.tgz",
-      "integrity": "sha512-8eMhmG6gt/hRkU1G+8KlGOdQi2w+CgtNoD1ksXZq9gQfkfDsX4LHaBwTe1SY0Imx//t2iZA03DFnyYKPinxSRw==",
-      "license": "MIT",
-      "dependencies": {
-        "aws-ssl-profiles": "^1.1.1",
-        "denque": "^2.1.0",
-        "generate-function": "^2.3.1",
-        "iconv-lite": "^0.6.3",
-        "long": "^5.2.1",
-        "lru.min": "^1.0.0",
-        "named-placeholders": "^1.1.3",
-        "seq-queue": "^0.0.5",
-        "sqlstring": "^2.3.2"
-      },
-      "engines": {
-        "node": ">= 8.0"
-      }
-    },
-    "node_modules/mysql2/node_modules/iconv-lite": {
-      "version": "0.6.3",
-      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
-      "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
-      "license": "MIT",
-      "dependencies": {
-        "safer-buffer": ">= 2.1.2 < 3.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/named-placeholders": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz",
-      "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==",
-      "license": "MIT",
-      "dependencies": {
-        "lru-cache": "^7.14.1"
-      },
-      "engines": {
-        "node": ">=12.0.0"
-      }
-    },
     "node_modules/negotiator": {
       "version": "0.6.3",
       "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
@@ -710,6 +1189,35 @@
       "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==",
       "license": "MIT"
     },
+    "node_modules/prisma": {
+      "version": "6.6.0",
+      "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.6.0.tgz",
+      "integrity": "sha512-SYCUykz+1cnl6Ugd8VUvtTQq5+j1Q7C0CtzKPjQ8JyA2ALh0EEJkMCS+KgdnvKW1lrxjtjCyJSHOOT236mENYg==",
+      "devOptional": true,
+      "hasInstallScript": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@prisma/config": "6.6.0",
+        "@prisma/engines": "6.6.0"
+      },
+      "bin": {
+        "prisma": "build/index.js"
+      },
+      "engines": {
+        "node": ">=18.18"
+      },
+      "optionalDependencies": {
+        "fsevents": "2.3.3"
+      },
+      "peerDependencies": {
+        "typescript": ">=5.1.0"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/proxy-addr": {
       "version": "2.0.7",
       "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
@@ -827,11 +1335,6 @@
       "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
       "license": "MIT"
     },
-    "node_modules/seq-queue": {
-      "version": "0.0.5",
-      "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz",
-      "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q=="
-    },
     "node_modules/serve-static": {
       "version": "1.16.2",
       "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz",
@@ -925,15 +1428,6 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/sqlstring": {
-      "version": "2.3.3",
-      "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz",
-      "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
     "node_modules/statuses": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
diff --git a/microservice-reviews/package.json b/microservice-reviews/package.json
index 2dad3872d4e1eacbffc888179b2616aabf73d786..90337023a7b9bee0e4578c1ba08b55346e34ac65 100644
--- a/microservice-reviews/package.json
+++ b/microservice-reviews/package.json
@@ -1,20 +1,23 @@
 {
-  "name": "microservice-reviews",
+  "name": "reviews-service",
   "version": "1.0.0",
-  "description": "\"# Reviews Microservice\"",
-  "license": "ISC",
-  "author": "",
-  "type": "commonjs",
-  "main": "backend/index.js",
+  "description": "Reviews microservice",
+  "main": "backend/server.js",
   "scripts": {
-    "test": "echo \"Error: no test specified\" && exit 1",
-    "start": "node backend/index.js"
+    "start": "node src/server.js",
+    "dev": "npx nodemon src/server.js",
+    "db:deploy": "prisma migrate deploy && prisma generate"
+  },
+  "prisma": {
+    "seed": "node prisma/seed.js"
   },
   "dependencies": {
+    "@prisma/client": "^6.6.0",
     "cors": "^2.8.5",
-    "dotenv": "^16.4.7",
-    "express": "^4.21.2",
-    "microservice-reviews": "file:",
-    "mysql2": "^3.14.0"
+    "express": "^4.18.2",
+    "nodemon": "^3.1.7"
+  },
+  "devDependencies": {
+    "prisma": "^6.6.0"
   }
 }
diff --git a/microservice-reviews/prisma/migrations/20250426144511_/migration.sql b/microservice-reviews/prisma/migrations/20250426144511_/migration.sql
new file mode 100644
index 0000000000000000000000000000000000000000..6246450fd6bed935cdc6cebd08475b9a46c53ebf
--- /dev/null
+++ b/microservice-reviews/prisma/migrations/20250426144511_/migration.sql
@@ -0,0 +1,30 @@
+-- CreateTable
+CREATE TABLE "Review" (
+    "id" TEXT NOT NULL,
+    "userId" TEXT NOT NULL,
+    "itemId" TEXT NOT NULL,
+    "title" TEXT,
+    "positiveComment" TEXT,
+    "negativeComment" TEXT,
+    "rating" INTEGER NOT NULL,
+    "comment" TEXT,
+    "helpful" INTEGER NOT NULL DEFAULT 0,
+    "unhelpful" INTEGER NOT NULL DEFAULT 0,
+    "verifiedBuyer" BOOLEAN NOT NULL DEFAULT false,
+    "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    "staffRating" INTEGER NOT NULL DEFAULT 0,
+    "facilitiesRating" INTEGER NOT NULL DEFAULT 0,
+    "cleanlinessRating" INTEGER NOT NULL DEFAULT 0,
+    "comfortRating" INTEGER NOT NULL DEFAULT 0,
+    "valueRating" INTEGER NOT NULL DEFAULT 0,
+    "locationRating" INTEGER NOT NULL DEFAULT 0,
+    "overallRating" DOUBLE PRECISION NOT NULL DEFAULT 0,
+
+    CONSTRAINT "Review_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateIndex
+CREATE INDEX "Review_userId_idx" ON "Review"("userId");
+
+-- CreateIndex
+CREATE INDEX "Review_itemId_idx" ON "Review"("itemId");
diff --git a/microservice-reviews/prisma/migrations/20250426153225_/migration.sql b/microservice-reviews/prisma/migrations/20250426153225_/migration.sql
new file mode 100644
index 0000000000000000000000000000000000000000..3a1a9e64d9b4c49de53e45b23504918bff669376
--- /dev/null
+++ b/microservice-reviews/prisma/migrations/20250426153225_/migration.sql
@@ -0,0 +1,19 @@
+-- AlterTable
+ALTER TABLE "Review" ADD COLUMN     "photoUrl" TEXT;
+
+-- CreateTable
+CREATE TABLE "Vote" (
+    "id" TEXT NOT NULL,
+    "reviewId" TEXT NOT NULL,
+    "userId" TEXT NOT NULL,
+    "type" TEXT NOT NULL,
+    "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+
+    CONSTRAINT "Vote_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateIndex
+CREATE UNIQUE INDEX "Vote_reviewId_userId_key" ON "Vote"("reviewId", "userId");
+
+-- AddForeignKey
+ALTER TABLE "Vote" ADD CONSTRAINT "Vote_reviewId_fkey" FOREIGN KEY ("reviewId") REFERENCES "Review"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
diff --git a/microservice-reviews/prisma/migrations/20250426154737_/migration.sql b/microservice-reviews/prisma/migrations/20250426154737_/migration.sql
new file mode 100644
index 0000000000000000000000000000000000000000..d45e331bc5a84085fa2a36282bc5a3c422a4b12c
--- /dev/null
+++ b/microservice-reviews/prisma/migrations/20250426154737_/migration.sql
@@ -0,0 +1,10 @@
+/*
+  Warnings:
+
+  - You are about to drop the column `photoUrl` on the `Review` table. All the data in the column will be lost.
+  - You are about to drop the column `verifiedBuyer` on the `Review` table. All the data in the column will be lost.
+
+*/
+-- AlterTable
+ALTER TABLE "Review" DROP COLUMN "photoUrl",
+DROP COLUMN "verifiedBuyer";
diff --git a/microservice-reviews/prisma/migrations/migration_lock.toml b/microservice-reviews/prisma/migrations/migration_lock.toml
new file mode 100644
index 0000000000000000000000000000000000000000..044d57cdb0d5b5bff3475112359a4ee70439bf78
--- /dev/null
+++ b/microservice-reviews/prisma/migrations/migration_lock.toml
@@ -0,0 +1,3 @@
+# Please do not edit this file manually
+# It should be added in your version-control system (e.g., Git)
+provider = "postgresql"
diff --git a/microservice-reviews/prisma/schema.prisma b/microservice-reviews/prisma/schema.prisma
new file mode 100644
index 0000000000000000000000000000000000000000..de1f904dfc9be4d78801de0768768403447b070b
--- /dev/null
+++ b/microservice-reviews/prisma/schema.prisma
@@ -0,0 +1,46 @@
+generator client {
+  provider = "prisma-client-js"
+}
+
+datasource db {
+  provider = "postgresql"
+  url      = env("DATABASE_URL")
+}
+
+model Vote {
+  id        String   @id @default(uuid())
+  reviewId  String
+  userId    String
+  type      String   // 'UPVOTE' or 'DOWNVOTE'
+  createdAt DateTime @default(now())
+
+  review Review @relation(fields: [reviewId], references: [id])
+
+  @@unique([reviewId, userId])
+}
+
+model Review {
+  id                String   @id @default(uuid())
+  userId            String
+  itemId            String
+  title             String?
+  positiveComment   String?
+  negativeComment   String?
+  rating            Int
+  comment           String?
+  helpful           Int      @default(0)
+  unhelpful         Int      @default(0)
+  createdAt         DateTime @default(now())
+  staffRating       Int      @default(0)
+  facilitiesRating  Int      @default(0)
+  cleanlinessRating Int      @default(0)
+  comfortRating     Int      @default(0)
+  valueRating       Int      @default(0)
+  locationRating    Int      @default(0)
+  overallRating     Float    @default(0)
+
+  votes Vote[]
+
+  @@index([userId])
+  @@index([itemId])
+} 
diff --git a/microservice-reviews/prisma/seed.js b/microservice-reviews/prisma/seed.js
new file mode 100644
index 0000000000000000000000000000000000000000..a98b834c5c7859fa84edc1f1707dd55365446769
--- /dev/null
+++ b/microservice-reviews/prisma/seed.js
@@ -0,0 +1,119 @@
+const { PrismaClient } = require('@prisma/client');
+const prisma = new PrismaClient();
+
+const main = async () => {
+  // Clear existing reviews
+  await prisma.review.deleteMany();
+
+  // Create sample reviews using actual user IDs and event IDs
+  const reviews = [
+    {
+      userId: 'cm9mr9ug500000cjx6jqhd7z2', // User ID from users service
+      itemId: 'evt-001', // Tech Conference 2025
+      title: 'Amazing Tech Conference!',
+      positiveComment: 'The speakers were incredibly knowledgeable and the sessions were well-organized',
+      negativeComment: 'The venue was a bit crowded during peak hours',
+      rating: 9,
+      comment: 'Overall a great experience, would definitely recommend to any tech enthusiast!',
+      helpful: 5,
+      unhelpful: 1,
+      staffRating: 9,
+      facilitiesRating: 8,
+      cleanlinessRating: 9,
+      comfortRating: 7,
+      valueRating: 8,
+      locationRating: 9,
+      overallRating: 8.3
+    },
+    {
+      userId: 'cm9mr9ug500000cjx6jqhd7z2', // User ID from users service
+      itemId: 'evt-002', // Music Festival
+      title: 'Unforgettable Music Experience',
+      positiveComment: 'The lineup was amazing and the sound quality was perfect',
+      negativeComment: 'Food options were limited and overpriced',
+      rating: 7,
+      comment: 'Had a great time but the food situation could be improved',
+      helpful: 3,
+      unhelpful: 0,
+      staffRating: 8,
+      facilitiesRating: 9,
+      cleanlinessRating: 8,
+      comfortRating: 7,
+      valueRating: 6,
+      locationRating: 9,
+      overallRating: 7.8
+    },
+    {
+      userId: 'cm9mr9ug500000cjx6jqhd7z2', // User ID from users service
+      itemId: 'evt-003', // Business Workshop
+      title: 'Excellent Leadership Workshop',
+      positiveComment: 'The instructor was very engaging and the content was practical',
+      negativeComment: 'The workshop was a bit short, could have used more time',
+      rating: 8,
+      comment: 'Learned a lot of valuable skills that I can apply immediately',
+      helpful: 4,
+      unhelpful: 2,
+      staffRating: 8,
+      facilitiesRating: 9,
+      cleanlinessRating: 8,
+      comfortRating: 7,
+      valueRating: 8,
+      locationRating: 6,
+      overallRating: 7.7
+    },
+    {
+      userId: 'cm9mr9ug500000cjx6jqhd7z2', // User ID from users service
+      itemId: 'evt-004', // Art Exhibition
+      title: 'Beautiful Art Showcase',
+      positiveComment: 'The artwork was stunning and well-curated',
+      negativeComment: 'Some pieces were too crowded to view properly',
+      rating: 8,
+      comment: 'A wonderful experience for art lovers',
+      helpful: 3,
+      unhelpful: 1,
+      staffRating: 8,
+      facilitiesRating: 7,
+      cleanlinessRating: 9,
+      comfortRating: 8,
+      valueRating: 7,
+      locationRating: 8,
+      overallRating: 7.8
+    },
+    {
+      userId: 'cm9mr9ug500000cjx6jqhd7z2', // User ID from users service
+      itemId: 'evt-005', // Charity Run
+      title: 'Great Cause, Well Organized',
+      positiveComment: 'The event was well-organized and the route was scenic',
+      negativeComment: 'The start was a bit chaotic',
+      rating: 8,
+      comment: 'Proud to support such a worthy cause',
+      helpful: 4,
+      unhelpful: 0,
+      staffRating: 8,
+      facilitiesRating: 8,
+      cleanlinessRating: 9,
+      comfortRating: 7,
+      valueRating: 8,
+      locationRating: 8,
+      overallRating: 8.0
+    }
+  ];
+
+  // Create reviews
+  for (const review of reviews) {
+    await prisma.review.create({
+      data: review
+    });
+  }
+
+  console.log('Seed data created successfully');
+};
+
+main()
+  .catch((e) => {
+    console.error(e);
+    process.exit(1);
+  })
+  .finally(async () => {
+    await prisma.$disconnect();
+  });
diff --git a/microservice-reviews/server.js b/microservice-reviews/server.js
deleted file mode 100644
index a8242db6c940f09463401a8edc77dc78faa1a9a1..0000000000000000000000000000000000000000
--- a/microservice-reviews/server.js
+++ /dev/null
@@ -1,21 +0,0 @@
-const express = require('express');
-const app = express();
-const port = 8004;
-
-app.use(express.json());
-
-app.listen(port, () => {
-    console.log(`Rating Service running on http://localhost:${port}`);
-});
-
-const Review = require('./models/Review');
-
-app.post('/review', async (req, res) => {
-    try {
-        const review = new Review(req.body);
-        await review.save();
-        res.status(201).json(review);
-    } catch (error) {
-        res.status(400).json({ error: error.message });
-    }
-});
\ No newline at end of file
diff --git a/microservice-reviews/src/server.js b/microservice-reviews/src/server.js
new file mode 100644
index 0000000000000000000000000000000000000000..c9cee2dd338452e9be7d56274435f22342071514
--- /dev/null
+++ b/microservice-reviews/src/server.js
@@ -0,0 +1,267 @@
+const express = require('express');
+const { PrismaClient } = require('@prisma/client');
+const cors = require('cors');
+
+const app = express();
+const port = process.env.PORT || 8004;
+const prisma = new PrismaClient();
+
+app.use(cors());
+app.use(express.json());
+
+// GET endpoint for fetching reviews
+app.get('/review', async (req, res) => {
+  try {
+    const { eventId } = req.query;
+    const reviews = await prisma.review.findMany({
+      where: eventId ? { itemId: eventId } : undefined
+    });
+    res.json(reviews);
+  } catch (error) {
+    res.status(500).json({ error: error.message });
+  }
+});
+
+// POST endpoint for creating a review
+app.post('/review', async (req, res) => {
+  try {
+    console.log('Received review creation request with body:', req.body);
+
+    const {
+      userId, eventId, rating, comment,
+      staffRating, facilitiesRating,
+      cleanlinessRating, comfortRating, valueRating,
+      locationRating, title, positiveComment, negativeComment
+    } = req.body;
+
+    // Validate required fields
+    if (!userId || !eventId || !rating) {
+      console.log('Missing required fields:', { userId, eventId, rating });
+      return res.status(400).json({ error: 'Missing required fields' });
+    }
+
+    // Compute overallRating from sub-ratings (average of non-zero values)
+    const subRatings = [
+      Number(staffRating) || 0,
+      Number(facilitiesRating) || 0,
+      Number(cleanlinessRating) || 0,
+      Number(comfortRating) || 0,
+      Number(valueRating) || 0,
+      Number(locationRating) || 0
+    ];
+    const validSubRatings = subRatings.filter(r => r > 0);
+    const overallRating = validSubRatings.length > 0
+      ? (validSubRatings.reduce((a, b) => a + b, 0) / validSubRatings.length).toFixed(1)
+      : 0;
+
+    console.log('Creating review with data:', {
+      userId,
+      itemId: eventId,
+      title,
+      positiveComment,
+      negativeComment,
+      rating: Number(rating),
+      comment,
+      staffRating: Number(staffRating) || 0,
+      facilitiesRating: Number(facilitiesRating) || 0,
+      cleanlinessRating: Number(cleanlinessRating) || 0,
+      comfortRating: Number(comfortRating) || 0,
+      valueRating: Number(valueRating) || 0,
+      locationRating: Number(locationRating) || 0,
+      overallRating: Number(overallRating)
+    });
+
+    const review = await prisma.review.create({
+      data: {
+        userId,
+        itemId: eventId,
+        title,
+        positiveComment,
+        negativeComment,
+        rating: Number(rating),
+        comment,
+        staffRating: Number(staffRating) || 0,
+        facilitiesRating: Number(facilitiesRating) || 0,
+        cleanlinessRating: Number(cleanlinessRating) || 0,
+        comfortRating: Number(comfortRating) || 0,
+        valueRating: Number(valueRating) || 0,
+        locationRating: Number(locationRating) || 0,
+        overallRating: Number(overallRating)
+      }
+    });
+
+    console.log('Successfully created review:', review);
+    res.status(201).json(review);
+  } catch (error) {
+    console.error('Error creating review:', error);
+    res.status(400).json({ error: error.message });
+  }
+});
+
+// PUT endpoint for upvoting (helpful)
+app.put('/review/:id/upvote', async (req, res) => {
+  try {
+    const reviewId = req.params.id;
+    const userId = req.body.userId; // Get userId from request body
+
+    // First check if the review exists and get its userId
+    const review = await prisma.review.findUnique({
+      where: { id: reviewId }
+    });
+
+    if (!review) {
+      return res.status(404).json({ error: 'Review not found' });
+    }
+
+    // Check if user is trying to vote on their own review
+    if (review.userId === userId) {
+      return res.status(400).json({ error: 'Cannot vote on your own review' });
+    }
+
+    // Check if user has already voted
+    const existingVote = await prisma.vote.findFirst({
+      where: {
+        reviewId: reviewId,
+        userId: userId
+      }
+    });
+
+    if (existingVote) {
+      return res.status(400).json({ error: 'You have already voted on this review' });
+    }
+
+    // Create the vote record
+    await prisma.vote.create({
+      data: {
+        reviewId: reviewId,
+        userId: userId,
+        type: 'UPVOTE'
+      }
+    });
+
+    // Update the review's helpful count
+    const updatedReview = await prisma.review.update({
+      where: { id: reviewId },
+      data: { helpful: { increment: 1 } }
+    });
+
+    res.status(200).json({ message: 'Upvote successful', helpful: updatedReview.helpful });
+  } catch (error) {
+    console.error('Error upvoting review:', error);
+    res.status(400).json({ error: error.message });
+  }
+});
+
+// PUT endpoint for downvoting (unhelpful)
+app.put('/review/:id/downvote', async (req, res) => {
+  try {
+    const reviewId = req.params.id;
+    const userId = req.body.userId; // Get userId from request body
+
+    // First check if the review exists and get its userId
+    const review = await prisma.review.findUnique({
+      where: { id: reviewId }
+    });
+
+    if (!review) {
+      return res.status(404).json({ error: 'Review not found' });
+    }
+
+    // Check if user is trying to vote on their own review
+    if (review.userId === userId) {
+      return res.status(400).json({ error: 'Cannot vote on your own review' });
+    }
+
+    // Check if user has already voted
+    const existingVote = await prisma.vote.findFirst({
+      where: {
+        reviewId: reviewId,
+        userId: userId
+      }
+    });
+
+    if (existingVote) {
+      return res.status(400).json({ error: 'You have already voted on this review' });
+    }
+
+    // Create the vote record
+    await prisma.vote.create({
+      data: {
+        reviewId: reviewId,
+        userId: userId,
+        type: 'DOWNVOTE'
+      }
+    });
+
+    // Update the review's unhelpful count
+    const updatedReview = await prisma.review.update({
+      where: { id: reviewId },
+      data: { unhelpful: { increment: 1 } }
+    });
+
+    res.status(200).json({ message: 'Downvote successful', unhelpful: updatedReview.unhelpful });
+  } catch (error) {
+    console.error('Error downvoting review:', error);
+    res.status(400).json({ error: error.message });
+  }
+});
+
+// PUT endpoint for updating a review
+app.put('/review/:id', async (req, res) => {
+  try {
+    const reviewId = req.params.id;
+    const {
+      title, positiveComment, negativeComment, rating,
+      comment, staffRating, facilitiesRating,
+      cleanlinessRating, comfortRating, valueRating,
+      locationRating
+    } = req.body;
+
+    // Compute overallRating from sub-ratings (average of non-zero values)
+    const subRatings = [
+      Number(staffRating) || 0,
+      Number(facilitiesRating) || 0,
+      Number(cleanlinessRating) || 0,
+      Number(comfortRating) || 0,
+      Number(valueRating) || 0,
+      Number(locationRating) || 0
+    ];
+    const validSubRatings = subRatings.filter(r => r > 0);
+    const overallRating = validSubRatings.length > 0
+      ? (validSubRatings.reduce((a, b) => a + b, 0) / validSubRatings.length).toFixed(1)
+      : 0;
+
+    const review = await prisma.review.update({
+      where: { id: reviewId },
+      data: {
+        title,
+        positiveComment,
+        negativeComment,
+        rating: Number(rating),
+        comment,
+        staffRating: Number(staffRating) || 0,
+        facilitiesRating: Number(facilitiesRating) || 0,
+        cleanlinessRating: Number(cleanlinessRating) || 0,
+        comfortRating: Number(comfortRating) || 0,
+        valueRating: Number(valueRating) || 0,
+        locationRating: Number(locationRating) || 0,
+        overallRating: Number(overallRating)
+      }
+    });
+
+    if (!review) {
+      return res.status(404).json({ error: 'Review not found' });
+    }
+
+    res.status(200).json(review);
+  } catch (error) {
+    res.status(400).json({ error: error.message });
+  }
+});
+
+app.listen(port, '0.0.0.0', () => {
+  console.log(`Reviews API running on http://localhost:${port}`);
+});
+
+module.exports = { prisma }; // Export prisma for seed.js
+
diff --git a/microservice-users/Dockerfile b/microservice-users/Dockerfile
index ff7c11059fca6ce9500d278aa48dda4282428473..1f11d48a2783ebf2284fe9e08f7d72fd4713118e 100644
--- a/microservice-users/Dockerfile
+++ b/microservice-users/Dockerfile
@@ -9,9 +9,6 @@ COPY package*.json ./
 # Install dependencies including development dependencies
 RUN npm install
 
-# We don't need to copy the rest of the files here
-# as we'll be using volume mounts in development
-
 COPY . .
 
 # Expose port
diff --git a/package-lock.json b/package-lock.json
deleted file mode 100644
index 34cc747739e04c4bd1f6b0cdba40076ee331a61e..0000000000000000000000000000000000000000
--- a/package-lock.json
+++ /dev/null
@@ -1,83 +0,0 @@
-{
-  "name": "application",
-  "lockfileVersion": 3,
-  "requires": true,
-  "packages": {
-    "": {
-      "dependencies": {
-        "react": "^19.1.0"
-      },
-      "devDependencies": {
-        "@types/react": "^19.1.2",
-        "@types/react-dom": "^19.1.2",
-        "@types/react-router-dom": "^5.3.3"
-      }
-    },
-    "node_modules/@types/history": {
-      "version": "4.7.11",
-      "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz",
-      "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/@types/react": {
-      "version": "19.1.2",
-      "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.2.tgz",
-      "integrity": "sha512-oxLPMytKchWGbnQM9O7D67uPa9paTNxO7jVoNMXgkkErULBPhPARCfkKL9ytcIJJRGjbsVwW4ugJzyFFvm/Tiw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "csstype": "^3.0.2"
-      }
-    },
-    "node_modules/@types/react-dom": {
-      "version": "19.1.2",
-      "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.2.tgz",
-      "integrity": "sha512-XGJkWF41Qq305SKWEILa1O8vzhb3aOo3ogBlSmiqNko/WmRb6QIaweuZCXjKygVDXpzXb5wyxKTSOsmkuqj+Qw==",
-      "dev": true,
-      "license": "MIT",
-      "peerDependencies": {
-        "@types/react": "^19.0.0"
-      }
-    },
-    "node_modules/@types/react-router": {
-      "version": "5.1.20",
-      "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz",
-      "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@types/history": "^4.7.11",
-        "@types/react": "*"
-      }
-    },
-    "node_modules/@types/react-router-dom": {
-      "version": "5.3.3",
-      "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz",
-      "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@types/history": "^4.7.11",
-        "@types/react": "*",
-        "@types/react-router": "*"
-      }
-    },
-    "node_modules/csstype": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
-      "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/react": {
-      "version": "19.1.0",
-      "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz",
-      "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    }
-  }
-}
diff --git a/package.json b/package.json
deleted file mode 100644
index cc4807179edfad047b858bfe8334bb78fe88a3fc..0000000000000000000000000000000000000000
--- a/package.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-  "dependencies": {
-    "react": "^19.1.0"
-  },
-  "devDependencies": {
-    "@types/react": "^19.1.2",
-    "@types/react-dom": "^19.1.2",
-    "@types/react-router-dom": "^5.3.3"
-  }
-}