diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000000..13566b81b0 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/FitHub.iml b/.idea/FitHub.iml new file mode 100644 index 0000000000..8b8c395472 --- /dev/null +++ b/.idea/FitHub.iml @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000000..105ce2da2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000000..eeba9c4765 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000000..8ca56c2588 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000000..35eb1ddfbb --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000000..63409b8617 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,27 @@ +FROM python:3.11-slim + +WORKDIR /appcode + +# downloads +RUN apt-get update && apt-get install -y \ + build-essential \ + curl \ + git \ + libfreetype6-dev \ + pkg-config \ + && rm -rf /var/lib/apt/lists/* + +# RUN mkdir /requirements +# COPY ./src/requirements.txt /requirements/requirements.txt + +COPY ./src/requirements.txt . + +RUN pip3 install -r requirements.txt + +# lists all the packages +RUN ls + +EXPOSE 8501 + +# docker container runs streamlit +CMD ["streamlit", "run", "Home.py", "--server.port=8501", "--server.address=0.0.0.0"] \ No newline at end of file diff --git a/api/.env.template b/api/.env.template index 3a51ab40f9..34c813ae1f 100644 --- a/api/.env.template +++ b/api/.env.template @@ -3,4 +3,4 @@ DB_USER=root DB_HOST=db DB_PORT=3306 DB_NAME=ngo_db -MYSQL_ROOT_PASSWORD= +MYSQL_ROOT_PASSWORD= \ No newline at end of file diff --git a/api/Dockerfile b/api/Dockerfile index da960bce51..3302e1c4ef 100644 --- a/api/Dockerfile +++ b/api/Dockerfile @@ -10,5 +10,4 @@ COPY . . EXPOSE 4000 # Run Python in unbuffered mode to ensure logs are immediately visible -CMD ["python", "-u", "backend_app.py"] - +CMD ["python", "-u", "backend_app.py"] \ No newline at end of file diff --git a/api/backend/__init__.py b/api/backend/__init__.py new file mode 100644 index 0000000000..9debdf695a --- /dev/null +++ b/api/backend/__init__.py @@ -0,0 +1,10 @@ +#------------------------------------------------------------ +# This file creates a shared DB connection resource +#------------------------------------------------------------ +from flaskext.mysql import MySQL +from pymysql import cursors + + +# the parameter instructs the connection to return data +# as a dictionary object. +db = MySQL(cursorclass=cursors.DictCursor) \ No newline at end of file diff --git a/api/backend/admin/__init__.py b/api/backend/admin/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/api/backend/admin/admin_routes.py b/api/backend/admin/admin_routes.py new file mode 100644 index 0000000000..8f782560c2 --- /dev/null +++ b/api/backend/admin/admin_routes.py @@ -0,0 +1,165 @@ +from flask import Blueprint, request, jsonify, make_response +from backend.db_connection import db + +admin = Blueprint('admin', __name__) + +# USER STORY 1 — View unresolved reports +@admin.route('/reports/pending', methods=['GET']) +def get_pending_reports(): + cursor = db.get_db().cursor() + cursor.execute(""" + SELECT ReportID, Severity, Note, ReportedItem + FROM Reports + WHERE Resolved = 0; + """) + data = cursor.fetchall() + + the_response = make_response(jsonify(data)) + the_response.status_code = 200 + return the_response + + +# USER STORY 1 — Resolve a report +@admin.route('/reports//resolve', methods=['PUT']) +def resolve_report(report_id): + cursor = db.get_db().cursor() + cursor.execute(""" + UPDATE Reports + SET Resolved = 1, ResolvedAt = NOW() + WHERE ReportID = %s; + """, (report_id,)) + + db.get_db().commit() + + the_response = make_response(jsonify({"message": "Report resolved"})) + the_response.status_code = 200 + return the_response + + +# USER STORY 2 — Update user role +@admin.route('/users//role', methods=['PUT']) +def update_user_role(user_id): + new_role = request.json.get("role") + + cursor = db.get_db().cursor() + cursor.execute(""" + UPDATE Users + SET Role = %s + WHERE UserID = %s; + """, (new_role, user_id)) + + db.get_db().commit() + + the_response = make_response(jsonify({"message": "User role updated"})) + the_response.status_code = 200 + return the_response + + +# USER STORY 3 — Deactivate user +@admin.route('/users//deactivate', methods=['PUT']) +def deactivate_user(user_id): + cursor = db.get_db().cursor() + cursor.execute(""" + UPDATE Users + SET IsActive = 0 + WHERE UserID = %s; + """, (user_id,)) + + db.get_db().commit() + + the_response = make_response(jsonify({"message": "User deactivated"})) + the_response.status_code = 200 + return the_response + +# USER STORY 4 — Create announcement +@admin.route('/announcements', methods=['POST']) +def create_announcement(): + data = request.json + announcer = data.get("announcer_id") + message = data.get("message") + + cursor = db.get_db().cursor() + + cursor.execute(""" + INSERT INTO Announcements (AnnouncerID, Message, AnnouncedAt) + VALUES (%s, %s, NOW()); + """, (announcer, message)) + + announcement_id = cursor.lastrowid + + cursor.execute(""" + INSERT INTO AnnouncementsReceived (AnnouncementID, UserID) + SELECT %s, UserID FROM Users WHERE IsActive = 1; + """, (announcement_id,)) + + db.get_db().commit() + + the_response = make_response(jsonify({"message": "Announcement created"})) + the_response.status_code = 201 + return the_response + + +# USER STORY 5 — Analytics summary +@admin.route('/analytics/summary', methods=['GET']) +def analytics_summary(): + cursor = db.get_db().cursor() + cursor.execute(""" + SELECT + (SELECT COUNT(*) FROM Users) AS TotalUsers, + (SELECT COUNT(*) FROM Items) AS TotalListings, + (SELECT COUNT(*) FROM Reports WHERE Resolved = 0) AS OpenReports; + """) + data = cursor.fetchall() + + the_response = make_response(jsonify(data)) + the_response.status_code = 200 + return the_response + + +# USER STORY 6 — Delete duplicate items +@admin.route('/items/duplicates', methods=['DELETE']) +def delete_duplicate_items(): + cursor = db.get_db().cursor() + cursor.execute(""" + DELETE i FROM Items i + JOIN ( + SELECT Title, OwnerID, MIN(ItemID) AS KeepID + FROM Items + GROUP BY Title, OwnerID + ) base + ON i.Title = base.Title + AND i.OwnerID = base.OwnerID + AND i.ItemID != base.KeepID; + """) + + db.get_db().commit() + + the_response = make_response(jsonify({"message": "Duplicate items removed"})) + the_response.status_code = 200 + return the_response + + +# USER STORY 6 + 1 — Delete specific item +@admin.route('/items/', methods=['DELETE']) +def delete_item(item_id): + try: + cursor = db.get_db().cursor() + + cursor.execute("DELETE FROM Images WHERE ItemID = %s;", (item_id,)) + cursor.execute("DELETE FROM ItemTags WHERE ItemID = %s;", (item_id,)) + cursor.execute("DELETE FROM OrderItems WHERE ItemID = %s;", (item_id,)) + cursor.execute("DELETE FROM Reports WHERE ReportedItem = %s;", (item_id,)) + cursor.execute("DELETE FROM Items WHERE ItemID = %s;", (item_id,)) + + db.get_db().commit() + + the_response = make_response(jsonify({"message": "Item removed"})) + the_response.status_code = 200 + return the_response + + except Exception as e: + db.get_db().rollback() + + the_response = make_response(jsonify({"error": str(e)})) + the_response.status_code = 500 + return the_response diff --git a/api/backend/dataAnalysts/__init__.py b/api/backend/dataAnalysts/__init__.py new file mode 100644 index 0000000000..1e6fbac184 --- /dev/null +++ b/api/backend/dataAnalysts/__init__.py @@ -0,0 +1,10 @@ +#------------------------------------------------------------ +# This file creates a shared DB connection resource +#------------------------------------------------------------ +from flaskext.mysql import MySQL +from pymysql import cursors + + +# the parameter instructs the connection to return data +# as a dictionary object. +db = MySQL(cursorclass=cursors.DictCursor) diff --git a/api/backend/dataAnalysts/dataAnalyst_routes.py b/api/backend/dataAnalysts/dataAnalyst_routes.py new file mode 100644 index 0000000000..721fe4a223 --- /dev/null +++ b/api/backend/dataAnalysts/dataAnalyst_routes.py @@ -0,0 +1,157 @@ +######## +# Data Analyst endpoints +######## + + +from flask import Blueprint, request, jsonify, make_response, current_app +from backend.db_connection import db +dataAnalyst = Blueprint('dataAnalysts', __name__) + + +#-----User Story 1------ +#As a Senior Data Analyst, I want to view available listings with +# their posting dates, so I can monitor listing performance. + +@dataAnalyst.route('/listings', methods=['GET']) +def get_all_listings(): + cursor = db.get_db().cursor() + + the_query = ''' + SELECT + ItemID, + ListedAt, + COUNT(*) OVER () AS TotalAvailable + FROM Items + WHERE IsAvailable = 1; + ''' + + cursor.execute(the_query) + theData = cursor.fetchall() + + the_response = make_response(jsonify(theData)) + the_response.status_code = 200 + the_response.mimetype = 'application/json' + return the_response +#-----User Story 1------ + + + +#-----User Story 2------ +#As a Senior Data Analyst, I want to see user counts by age and gender, +# so I can identify growth opportunities. + +@dataAnalyst.route('/users///', methods=['GET']) +def get_all_users_by_age_and_gender(gender, agemin, agemax): + cursor = db.get_db().cursor() + + the_query = ''' + SELECT + UserID, + Gender, + DATE_FORMAT(FROM_DAYS(DATEDIFF(CURDATE(), DOB)), '%%Y') + 0 AS Age + FROM Users + WHERE Gender = %s + AND (DATE_FORMAT(FROM_DAYS(DATEDIFF(CURDATE(), DOB)), '%%Y') + 0) + BETWEEN %s AND %s; +''' + + cursor.execute(the_query, (gender, agemin, agemax)) + theData = cursor.fetchall() + + the_response = make_response(jsonify(theData)) + the_response.status_code = 200 + the_response.mimetype = 'application/json' + return the_response + +#-----User Story 2------ + + + +#-----User Story 3------ +#As a Senior Data Analyst, I want to count how many listings are in each +# category(pants, shirts, tanks) so I can find what users need more of. + +@dataAnalyst.route('/listings/category', methods=['GET']) +def get_listings_category(): + cursor = db.get_db().cursor() + the_query = ''' + SELECT + Category, + COUNT(ItemID) AS AvailableListings + FROM Items + WHERE IsAvailable = 1 + GROUP BY Category; + ''' + + cursor.execute(the_query) + theData = cursor.fetchall() + + the_response = make_response(jsonify(theData)) + the_response.status_code = 200 + the_response.mimetype = 'application/json' + return the_response +#-----User Story 3------ + + +#-----User Story 4------ +#As a Senior Data Analyst, I want to track swaps and takes per user, so I can measure engagement. + +@dataAnalyst.route('/users/countorders', methods=['GET']) +def get_orders_per_users(): + cursor = db.get_db().cursor() + + the_query = ''' + SELECT + u.UserID, + COUNT(o_received.OrderID) AS OrdersReceived, + COUNT(o_given.OrderID) AS OrdersGiven + FROM Users u + LEFT JOIN Orders o_received + ON u.UserID = o_received.ReceiverID + LEFT JOIN Orders o_given + ON u.UserID = o_given.GivenByID + GROUP BY u.UserID; + ''' + + cursor.execute(the_query) + theData = cursor.fetchall() + + the_response = make_response(jsonify(theData)) + the_response.status_code = 200 + the_response.mimetype = 'application/json' + return the_response +#-----User Story 4------ + + + +#-----User Story 5------ +#As a Senior Data Analyst, I want to see shipments with above-average +# delivery times (excluding those still in transit), so I can flag carriers who have a pattern of delays. + +@dataAnalyst.route('/shipments/delay', methods=['GET']) +def get_shipments_delay(): + cursor = db.get_db().cursor() + + the_query = ''' + SELECT + s.ShippingID, + s.DateShipped, + s.DateArrived, + DATEDIFF(s.DateArrived, s.DateShipped) AS DeliveryTime + FROM Shippings s + WHERE s.DateArrived IS NOT NULL + AND DATEDIFF(s.DateArrived, s.DateShipped) > ( + SELECT AVG(DATEDIFF(DateArrived, DateShipped)) + FROM Shippings + WHERE DateArrived IS NOT NULL + ); + ''' + + cursor.execute(the_query) + theData = cursor.fetchall() + + the_response = make_response(jsonify(theData)) + the_response.status_code = 200 + the_response.mimetype = 'application/json' + return the_response +#-----User Story 5------ diff --git a/api/backend/db_connection/db.py b/api/backend/db_connection/db.py new file mode 100644 index 0000000000..de2223ecce --- /dev/null +++ b/api/backend/db_connection/db.py @@ -0,0 +1,24 @@ +import os +import mysql.connector +from dotenv import load_dotenv + +load_dotenv() + +class DB: + def __init__(self): + self.db = None + + def get_db(self): + if self.db is None or not self.db.is_connected(): + self.db = mysql.connector.connect( + host=os.getenv("DB_HOST", "db"), + port=int(os.getenv("DB_PORT", 3306)), + user=os.getenv("DB_USER", "root"), + password=os.getenv("DB_PASSWORD", "1234"), + database=os.getenv("DB_NAME", "fithub"), + auth_plugin='mysql_native_password', + autocommit=False + ) + return self.db + +db = DB() diff --git a/api/backend/rest_entry.py b/api/backend/rest_entry.py index d1b8e5b913..22dd79f473 100644 --- a/api/backend/rest_entry.py +++ b/api/backend/rest_entry.py @@ -7,6 +7,12 @@ from backend.db_connection import db from backend.simple.simple_routes import simple_routes from backend.ngos.ngo_routes import ngos +from backend.dataAnalysts.dataAnalyst_routes import dataAnalyst +from backend.admin.admin_routes import admin + +logging.basicConfig(level=logging.DEBUG) + + def create_app(): app = Flask(__name__) @@ -16,7 +22,7 @@ def create_app(): # Configure file logging if needed # Uncomment the code in the setup_logging function - # setup_logging(app) + # setup_logging(app) # Load environment variables # This function reads all the values from inside @@ -33,13 +39,11 @@ def create_app(): # # these are for the DB object to be able to connect to MySQL. # app.config['MYSQL_DATABASE_USER'] = 'root' - app.config["MYSQL_DATABASE_USER"] = os.getenv("DB_USER").strip() - app.config["MYSQL_DATABASE_PASSWORD"] = os.getenv("MYSQL_ROOT_PASSWORD").strip() - app.config["MYSQL_DATABASE_HOST"] = os.getenv("DB_HOST").strip() - app.config["MYSQL_DATABASE_PORT"] = int(os.getenv("DB_PORT").strip()) - app.config["MYSQL_DATABASE_DB"] = os.getenv( - "DB_NAME" - ).strip() # Change this to your DB name + app.config["MYSQL_DATABASE_USER"] = os.getenv("DB_USER", "root").strip() + app.config["MYSQL_DATABASE_PASSWORD"] = os.getenv("MYSQL_ROOT_PASSWORD", "password").strip() + app.config["MYSQL_DATABASE_HOST"] = os.getenv("DB_HOST", "db").strip() + app.config["MYSQL_DATABASE_PORT"] = int(os.getenv("DB_PORT", "3306").strip()) + app.config["MYSQL_DATABASE_DB"] = os.getenv("DB_NAME", "fithub").strip() # Initialize the database object with the settings above. app.logger.info("current_app(): starting the database connection") @@ -50,6 +54,9 @@ def create_app(): app.logger.info("create_app(): registering blueprints with Flask app object.") app.register_blueprint(simple_routes) app.register_blueprint(ngos, url_prefix="/ngo") + app.register_blueprint(dataAnalyst, url_prefix="/d") + app.register_blueprint(admin, url_prefix="/a") + # Don't forget to return the app object return app @@ -57,7 +64,7 @@ def create_app(): def setup_logging(app): """ Configure logging for the Flask application in both files and console (Docker Desktop for this project) - + Args: app: Flask application instance to configure logging for """ @@ -73,8 +80,8 @@ def setup_logging(app): # file_handler.setFormatter(logging.Formatter( # '%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d]' # )) - - # Make sure we are capturing all levels of logging into the log files. + + # Make sure we are capturing all levels of logging into the log files. # file_handler.setLevel(logging.DEBUG) # Capture all levels in file # app.logger.addHandler(file_handler) @@ -87,5 +94,4 @@ def setup_logging(app): # console_handler.setLevel(logging.DEBUG) # app.logger.addHandler(console_handler) pass - - \ No newline at end of file + diff --git a/api/backend/swapper/_init_.py b/api/backend/swapper/_init_.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/api/backend/swapper/swapper_routes.py b/api/backend/swapper/swapper_routes.py new file mode 100644 index 0000000000..f678b8d32d --- /dev/null +++ b/api/backend/swapper/swapper_routes.py @@ -0,0 +1,45 @@ +######## +# swapper endpoints +######## + + +from flask import Blueprint, request, jsonify, make_response, current_app +from backend.db_connection import db +swapper = Blueprint('swappers', __name__) + + +#-----User Story 1------ +#As a Senior Data Analyst, I want to view available listings with +# their posting dates, so I can monitor listing performance. + +@swapper.route('/listings////', methods=['GET']) +def get_all_listings(): + cursor = db.get_db().cursor() + + the_query = ''' + SET @SizeFilter = 'M'; + SET @ConditionFilter = 'Good'; + SET @TagFilter = 'Vintage'; + + + SELECT DISTINCT i.ItemID, i.Title, i.Category, i.Description, i.Size, i.`Condition`, i.`Type`, u.Name AS OwnerName + FROM Items i + INNER JOIN Users u ON i.OwnerID = u.UserID + LEFT JOIN ItemTags it ON i.ItemID = it.ItemID + LEFT JOIN Tags t ON it.TagID = t.TagID + WHERE i.IsAvailable = 1 + AND i.`Type` = 'Swap' + AND i.Size = @SizeFilter + AND i.`Condition` = @ConditionFilter + AND t.Title = @TagFilter; + + ''' + + cursor.execute(the_query) + theData = cursor.fetchall() + + the_response = make_response(jsonify(theData)) + the_response.status_code = 200 + the_response.mimetype = 'application/json' + return the_response +#-----User Story 1------ diff --git a/app/Dockerfile b/app/Dockerfile index d60510b150..8db98a4339 100644 --- a/app/Dockerfile +++ b/app/Dockerfile @@ -1,6 +1,6 @@ FROM python:3.11-slim -WORKDIR /appcode +WORKDIR /app RUN apt-get update && apt-get install -y \ build-essential \ @@ -10,13 +10,11 @@ RUN apt-get update && apt-get install -y \ pkg-config \ && rm -rf /var/lib/apt/lists/* -# RUN mkdir /requirements -# COPY ./src/requirements.txt /requirements/requirements.txt - COPY ./src/requirements.txt . - RUN pip3 install -r requirements.txt +COPY ./src ./ + EXPOSE 8501 CMD ["streamlit", "run", "Home.py", "--server.port=8501", "--server.address=0.0.0.0"] diff --git a/app/src/Home.py b/app/src/Home.py index abe97588aa..10dcce2538 100644 --- a/app/src/Home.py +++ b/app/src/Home.py @@ -1,79 +1,143 @@ -################################################## -# This is the main/entry-point file for the -# sample application for your project -################################################## - -# Set up basic logging infrastructure import logging -logging.basicConfig(format='%(filename)s:%(lineno)s:%(levelname)s -- %(message)s', level=logging.INFO) -logger = logging.getLogger(__name__) - -# import the main streamlit library as well -# as SideBarLinks function from src/modules folder import streamlit as st from modules.nav import SideBarLinks -# streamlit supports reguarl and wide layout (how the controls -# are organized/displayed on the screen). -st.set_page_config(layout = 'wide') +# Logging +logging.basicConfig(format='%(filename)s:%(lineno)s:%(levelname)s -- %(message)s', level=logging.INFO) +logger = logging.getLogger(__name__) -# If a user is at this page, we assume they are not -# authenticated. So we change the 'authenticated' value -# in the streamlit session_state to false. +# Page config +st.set_page_config(layout='wide') st.session_state['authenticated'] = False -# Use the SideBarLinks function from src/modules/nav.py to control -# the links displayed on the left-side panel. -# IMPORTANT: ensure src/.streamlit/config.toml sets -# showSidebarNavigation = false in the [client] section +# Sidebar SideBarLinks(show_home=True) # *************************************************** -# The major content of this page +# CSS Styling +# *************************************************** +st.markdown(""" + +""", unsafe_allow_html=True) + # *************************************************** +# Main content +# *************************************************** + +# Logo centered at top +st.markdown('
', unsafe_allow_html=True) +st.markdown('
', unsafe_allow_html=True) -# set the title of the page and provide a simple prompt. -logger.info("Loading the Home page of the app") -st.title('CS 3200 Project Template') -st.write('\n\n') -# st.write('### Overview:') -# st.write('\n') -st.write('#### HI! As which user would you like to log in?') +# Swap into Style text +st.markdown('
Swap into style and swap roles
', unsafe_allow_html=True) -# For each of the user personas for which we are implementing -# functionality, we put a button on the screen that the user -# can click to MIMIC logging in as that mock user. +# Admin emoji + button +col1, col2 = st.columns([80, 1000], gap="small") +with col1: + st.markdown('
🧑🏻‍💼
', unsafe_allow_html=True) +with col2: + if st.button("Admin", key="Admin", use_container_width=True): + st.session_state['authenticated'] = True + st.session_state['role'] = 'Admin: Aisha' + st.session_state['first_name'] = 'Aisha' + logger.info("Logging in as Admin Persona") + st.switch_page('pages/05_Admin_Home.py') -if st.button("Act as John, a Political Strategy Advisor", - type = 'primary', - use_container_width=True): - # when user clicks the button, they are now considered authenticated - st.session_state['authenticated'] = True - # we set the role of the current user - st.session_state['role'] = 'pol_strat_advisor' - # we add the first name of the user (so it can be displayed on - # subsequent pages). - st.session_state['first_name'] = 'John' - # finally, we ask streamlit to switch to another page, in this case, the - # landing page for this particular user type - logger.info("Logging in as Political Strategy Advisor Persona") - st.switch_page('pages/00_Pol_Strat_Home.py') +st.markdown('
', unsafe_allow_html=True) -if st.button('Act as Mohammad, an USAID worker', - type = 'primary', - use_container_width=True): - st.session_state['authenticated'] = True - st.session_state['role'] = 'usaid_worker' - st.session_state['first_name'] = 'Mohammad' - st.switch_page('pages/10_USAID_Worker_Home.py') +# Data Analyst emoji + button +col1, col2 = st.columns([80, 1000], gap="small") +with col1: + st.markdown('
👩🏽‍💻
', unsafe_allow_html=True) +with col2: + if st.button("Data Analyst", key="Data Analyst", use_container_width=True): + st.session_state['authenticated'] = True + st.session_state['role'] = 'Data Analyst: Blair' + st.session_state['first_name'] = 'Blair' + logger.info("Logging in as Data Analyst Persona") + st.switch_page('pages/00_DADash.py') -if st.button('Act as System Administrator', - type = 'primary', - use_container_width=True): - st.session_state['authenticated'] = True - st.session_state['role'] = 'administrator' - st.session_state['first_name'] = 'SysAdmin' - st.switch_page('pages/20_Admin_Home.py') +st.markdown('
', unsafe_allow_html=True) +# Swapper emoji + button +col1, col2 = st.columns([80, 1000], gap="small") +with col1: + st.markdown('
🙋🏼‍♂️
', unsafe_allow_html=True) +with col2: + if st.button("Swapper", key="Swapper", use_container_width=True): + st.session_state['authenticated'] = True + st.session_state['role'] = 'Swapper: Andrea' + st.session_state['first_name'] = 'Andrea' + logger.info("Logging in as Swapper Persona") + st.switch_page('pages/00_SwapperDash.py') +st.markdown('
', unsafe_allow_html=True) +# Taker emoji + button +col1, col2 = st.columns([80, 1000], gap="small") +with col1: + st.markdown('
🙋🏼‍♀️
', unsafe_allow_html=True) +with col2: + if st.button("Taker", key="Taker", use_container_width=True): + st.session_state['authenticated'] = True + st.session_state['role'] = 'Taker: Alice' + st.session_state['first_name'] = 'Alice' + logger.info("Logging in as Taker Persona") + st.switch_page('pages/00_TakerDash.py') \ No newline at end of file diff --git a/app/src/assets/FitHubLogo+Tagline.png b/app/src/assets/FitHubLogo+Tagline.png new file mode 100644 index 0000000000..185cdce688 Binary files /dev/null and b/app/src/assets/FitHubLogo+Tagline.png differ diff --git a/app/src/assets/FitHublogo.png b/app/src/assets/FitHublogo.png new file mode 100644 index 0000000000..1e235e3825 Binary files /dev/null and b/app/src/assets/FitHublogo.png differ diff --git a/app/src/modules/nav.py b/app/src/modules/nav.py index 9b674e3d89..18783d894d 100644 --- a/app/src/modules/nav.py +++ b/app/src/modules/nav.py @@ -12,7 +12,7 @@ def HomeNav(): def AboutPageNav(): st.sidebar.page_link("pages/30_About.py", label="About", icon="🧠") - +''' #### ------------------------ Examples for Role of pol_strat_advisor ------------------------ def PolStratAdvHomeNav(): @@ -63,12 +63,15 @@ def ClassificationNav(): #### ------------------------ System Admin Role ------------------------ def AdminPageNav(): - st.sidebar.page_link("pages/20_Admin_Home.py", label="System Admin", icon="🖥️") + st.sidebar.page_link("pages/20_Admin_Dashboard.py", label="System Admin", icon="🖥️") st.sidebar.page_link( "pages/21_ML_Model_Mgmt.py", label="ML Model Management", icon="🏢" ) + + + # --------------------------------Links Function ----------------------------------------------- def SideBarLinks(show_home=False): """ @@ -76,7 +79,7 @@ def SideBarLinks(show_home=False): """ # add a logo to the sidebar always - st.sidebar.image("assets/logo.png", width=150) + st.sidebar.image("assets/fitlogo.png", width=150) # If there is no logged in user, redirect to the Home (Landing) page if "authenticated" not in st.session_state: @@ -119,3 +122,52 @@ def SideBarLinks(show_home=False): del st.session_state["role"] del st.session_state["authenticated"] st.switch_page("Home.py") + +''' +#Admin Nav Micah +def ReportsManagementNav(): + st.sidebar.page_link("pages/10_Reports_Management.py", label="Reports Management") +def AdminUserToolsNav(): + st.sidebar.page_link("pages/20_Admin_User_Tools.py", label="Admin User Tools" ) +def ItemCleanupNav(): + st.sidebar.page_link("pages/30_Item_Cleanup.py", label="Item Cleanup" ) +def AdminHomeNav(): + st.sidebar.page_link("pages/05_Admin_Home.py", label= "Admin Home") +# --------------------------------Links Function ----------------------------------------------- +def SideBarLinks(show_home=False): + """ + This function handles adding links to the sidebar of the app based upon the logged-in user's role, which was put in the streamlit session_state object when logging in. + """ + + # add a logo to the sidebar always + st.sidebar.image("assets/FitHublogo.png", width=150) + + # If there is no logged in user, redirect to the Home (Landing) page + if "authenticated" not in st.session_state: + st.session_state.authenticated = False + st.switch_page("Home.py") + + if show_home: + # Show the Home page link (the landing page) + HomeNav() + + # Show the other page navigators depending on the users' role. + if st.session_state["authenticated"]: + + + # If the user is an administrator, give them access to the administrator pages + if st.session_state["role"] == "admin": + AdminHomeNav() + AdminUserToolsNav() + ItemCleanupNav() + ReportsManagementNav() + + # Always show the About page at the bottom of the list of links + AboutPageNav() + + if st.session_state["authenticated"]: + # Always show a logout button if there is a logged in user + if st.sidebar.button("Logout"): + del st.session_state["role"] + del st.session_state["authenticated"] + st.switch_page("Home.py") \ No newline at end of file diff --git a/app/src/pages/00_AdminDash.py b/app/src/pages/00_AdminDash.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/src/pages/00_DADash.py b/app/src/pages/00_DADash.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/src/pages/00_SwapperDash.py b/app/src/pages/00_SwapperDash.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/src/pages/00_TakerDash.py b/app/src/pages/00_TakerDash.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/src/pages/02_Map_Demo.py b/app/src/pages/02_Map_Demo.py index 5ca09a9633..e9908375a5 100644 --- a/app/src/pages/02_Map_Demo.py +++ b/app/src/pages/02_Map_Demo.py @@ -10,7 +10,7 @@ SideBarLinks() # add the logo -add_logo("assets/logo.png", height=400) +add_logo("src/assets/logo.png", height=400) # set up the page st.markdown("# Mapping Demo") diff --git a/app/src/pages/05_Admin_Home.py b/app/src/pages/05_Admin_Home.py new file mode 100644 index 0000000000..d5d5c789b1 --- /dev/null +++ b/app/src/pages/05_Admin_Home.py @@ -0,0 +1,100 @@ +import logging +import streamlit as st +from streamlit_extras.app_logo import add_logo +from modules.nav import SideBarLinks + +logger = logging.getLogger(__name__) + +# Page config +st.set_page_config(layout="wide") + +# Sidebar with logo +SideBarLinks() +add_logo("assets/FitHublogo.png") + +# Log admin dashboard access +logger.info(f"Admin Dashboard loaded by {st.session_state.get('first_name', 'Unknown')}") + + +# CSS Styling + +st.markdown(""" + +""", unsafe_allow_html=True) + + +# Admin Dashboard UI + + +st.markdown('
🧑🏻‍💼 Admin Dashboard
', unsafe_allow_html=True) + +st.markdown('
Manage the platform and user operations
', unsafe_allow_html=True) +st.write("") # spacing + + +col1, col2, col3 = st.columns([1, 1, 1]) + +with col1: + if st.button("Manage Reports"): + st.switch_page("pages/10_Reports_Management.py") + +with col2: + if st.button("User Roles"): + logger.info("Navigating to User Roles page") + st.switch_page("pages/20_Admin_User_Tools.py") + +with col3: + if st.button("Item Cleanup Tools"): + logger.info("Navigating to Item Cleanup Tools") + st.switch_page("pages/30_Item_Cleanup.py") + diff --git a/app/src/pages/10_Reports_Management.py b/app/src/pages/10_Reports_Management.py new file mode 100644 index 0000000000..fa263a41a1 --- /dev/null +++ b/app/src/pages/10_Reports_Management.py @@ -0,0 +1,93 @@ +import logging +logger = logging.getLogger(__name__) + +import streamlit as st +import requests +from streamlit_extras.app_logo import add_logo +from modules.nav import SideBarLinks +st.set_page_config(layout="wide") +SideBarLinks() +add_logo("assets/FitHublogo.png") + + + +API_BASE = "http://api:4000/a" + +st.markdown(""" + +""", unsafe_allow_html=True) + +st.markdown('
📑 Reports Management
', unsafe_allow_html=True) + +# View Pending Reports +st.markdown('
View Pending Reports
', unsafe_allow_html=True) + +try: + response = requests.get(f"{API_BASE}/reports/pending") + if response.status_code == 200: + reports = response.json() + st.write(f"Found **{len(reports)} pending reports**") + + for report in reports: + with st.expander(f"Report #{report['ReportID']} — Severity {report['Severity']}"): + st.write(f"**Note:** {report['Note']}") + st.write(f"**Reported Item:** {report['ReportedItem']}") + else: + st.error("Failed to fetch reports.") +except requests.exceptions.RequestException: + st.error("Could not connect") + + + +# Resolve a Report +st.markdown('
Resolve a Report
', unsafe_allow_html=True) + +col1, col2 = st.columns(2) + +with col1: + report_id = st.number_input("Enter Report ID", min_value=1, step=1) + +with col2: + if st.button("Resolve Report"): + try: + resp = requests.put(f"{API_BASE}/reports/{report_id}/resolve") + st.write(resp.json()) + except: + st.error("Could not resolve the report.") diff --git a/app/src/pages/12_API_Test.py b/app/src/pages/12_API_Test.py index cbf17b4cda..51c009b2fa 100644 --- a/app/src/pages/12_API_Test.py +++ b/app/src/pages/12_API_Test.py @@ -7,19 +7,106 @@ SideBarLinks() -st.write("# Accessing a REST API from Within Streamlit") -""" -Simply retrieving data from a REST api running in a separate Docker Container. +st.write("# API Test Page") +st.write("Testing all Admin API routes from Streamlit.") -If the container isn't running, this will be very unhappy. But the Streamlit app -should not totally die. -""" +API_BASE = "http://api:4000/a" + +st.markdown("---") + +# ============================ +# USER STORY 1 — View Pending Reports +# ============================ +st.write("### View Pending Reports") + +try: + response = requests.get(f"{API_BASE}/reports/pending") + st.write(response.json()) +except: + st.write("Could not connect to API.") + + +# ============================ +# USER STORY 1 — Resolve Report +# ============================ +st.write("### Resolve Report (example: report_id = 1)") + +try: + response = requests.put(f"{API_BASE}/reports/1/resolve") + st.write(response.json()) +except: + st.write("Could not resolve report.") + + +# ============================ +# USER STORY 2 — Update User Role +# ============================ +st.write("### Update User Role (example: user_id = 1 → admin)") + +try: + payload = {"role": "admin"} + response = requests.put(f"{API_BASE}/users/1/role", json=payload) + st.write(response.json()) +except: + st.write("Could not update user role.") + + +# ============================ +# USER STORY 3 — Deactivate User +# ============================ +st.write("### Deactivate User (example: user_id = 1)") + +try: + response = requests.put(f"{API_BASE}/users/1/deactivate") + st.write(response.json()) +except: + st.write("Could not deactivate user.") + + +# ============================ +# USER STORY 4 — Create Announcement +# ============================ +st.write("### Create Announcement") + +try: + payload = {"announcer_id": 1, "message": "Test announcement"} + response = requests.post(f"{API_BASE}/announcements", json=payload) + st.write(response.json()) +except: + st.write("Could not create announcement.") + + +# ============================ +# USER STORY 5 — Analytics Summary +# ============================ +st.write("### Analytics Summary") -data = {} try: - data = requests.get('http://web-api:4000/data').json() + response = requests.get(f"{API_BASE}/analytics/summary") + st.write(response.json()) except: - st.write("**Important**: Could not connect to sample api, so using dummy data.") - data = {"a":{"b": "123", "c": "hello"}, "z": {"b": "456", "c": "goodbye"}} + st.write("Could not load analytics summary.") -st.dataframe(data) + +# ============================ +# USER STORY 6 — Delete Duplicate Items +# ============================ +st.write("### Delete Duplicate Items") + +try: + response = requests.delete(f"{API_BASE}/items/duplicates") + st.write(response.json()) +except: + st.write("Could not delete duplicate items.") + + +# ============================ +# USER STORY 6+1 — Delete Specific Item +# ============================ +st.write("### Delete Specific Item (example: item_id = 1)") + +try: + response = requests.delete(f"{API_BASE}/items/1") + st.write(response.json()) +except: + st.write("Could not delete item.") diff --git a/app/src/pages/20_Admin_Home.py b/app/src/pages/20_Admin_Dashboard.py similarity index 100% rename from app/src/pages/20_Admin_Home.py rename to app/src/pages/20_Admin_Dashboard.py diff --git a/app/src/pages/20_Admin_User_Tools.py b/app/src/pages/20_Admin_User_Tools.py new file mode 100644 index 0000000000..2953852909 --- /dev/null +++ b/app/src/pages/20_Admin_User_Tools.py @@ -0,0 +1,95 @@ +import logging +logger = logging.getLogger(__name__) + +import streamlit as st +from modules.nav import SideBarLinks +import requests + +st.set_page_config(layout="wide") +SideBarLinks() + +API_BASE = "http://api:4000/a" + +st.markdown(""" + +""", unsafe_allow_html=True) + +st.markdown('
Admin: User Management
', unsafe_allow_html=True) + +col1, col2 = st.columns(2) + +# UPDATE USER ROLE +with col1: + st.markdown('
Update User Role
', unsafe_allow_html=True) + + user_id = st.number_input("User ID:", step=1, min_value=1) + + new_role = st.selectbox( + "Select Role", + ["admin", "user", "worker"] + ) + + if st.button("Update Role", use_container_width=True): + logger.info(f"Updating role for user {user_id} → {new_role}") + try: + response = requests.put( + f"{API_BASE}/users/{int(user_id)}/role", + json={"role": new_role} + ) + st.write(response.json()) + except: + st.error("Could not update role.") + + +# DEACTIVATE USER +with col2: + st.markdown('
Deactivate User
', unsafe_allow_html=True) + + deactivate_user_id = st.number_input("User ID to Deactivate:", step=1, min_value=1) + + if st.button("Deactivate User", use_container_width=True): + logger.info(f"Deactivating user {deactivate_user_id}") + try: + response = requests.put( + f"{API_BASE}/users/{int(deactivate_user_id)}/deactivate" + ) + st.write(response.json()) + except: + st.error("Could not deactivate user.") diff --git a/app/src/pages/30_Item_Cleanup.py b/app/src/pages/30_Item_Cleanup.py new file mode 100644 index 0000000000..dab177097d --- /dev/null +++ b/app/src/pages/30_Item_Cleanup.py @@ -0,0 +1,81 @@ +import logging +logger = logging.getLogger(__name__) + +import streamlit as st +import requests +from streamlit_extras.app_logo import add_logo +from modules.nav import SideBarLinks + +st.set_page_config(layout="wide") +SideBarLinks() +add_logo("assets/FitHublogo.png") + +API_BASE = "http://api:4000/a" + +st.markdown(""" + +""", unsafe_allow_html=True) + + +st.markdown('
🧹 Item Cleanup Tools
', unsafe_allow_html=True) + + +# Remove Duplicate Items +st.markdown('
Remove Duplicate Items
', unsafe_allow_html=True) + +if st.button("Delete Duplicate Items", use_container_width=True): + try: + resp = requests.delete(f"{API_BASE}/items/duplicates") + st.write(resp.json()) + except: + st.error("Error deleting duplicate items.") + + +# Delete Specific Item +st.markdown('
Delete Specific Item
', unsafe_allow_html=True) + +item_id = st.number_input("Enter Item ID to Delete", min_value=1, step=1) + +if st.button("Delete Item", use_container_width=True): + try: + resp = requests.delete(f"{API_BASE}/items/{item_id}") + st.write(resp.json()) + except: + st.error("Error deleting item.") diff --git a/app/src/requirements.txt b/app/src/requirements.txt index 7dcf713448..6ac31a620e 100644 --- a/app/src/requirements.txt +++ b/app/src/requirements.txt @@ -1,6 +1,6 @@ altair pandas -streamlit +streamlit==1.39.0 streamlit-extras world-bank-data matplotlib diff --git a/app/src/requirements.txt.save b/app/src/requirements.txt.save new file mode 100644 index 0000000000..941aa91699 --- /dev/null +++ b/app/src/requirements.txt.save @@ -0,0 +1,15 @@ +altair +pandas +streamlt==1.39.0 +streamlit-extras +world-bank-data +matplotlib +numpy +pydeck +requests +openai +validators +plotly +seaborn +scikit-learn +shap diff --git a/database-files/fithub.sql b/database-files/fithub.sql new file mode 100644 index 0000000000..7fc9ca7947 --- /dev/null +++ b/database-files/fithub.sql @@ -0,0 +1,948 @@ +DROP DATABASE IF EXISTS fithub; +CREATE DATABASE fithub; +USE fithub; + +DROP TABLE IF EXISTS Users; +-- USERS TABLE +CREATE TABLE Users ( +UserID INT AUTO_INCREMENT PRIMARY KEY, +Name VARCHAR(100) NOT NULL, +Email VARCHAR(255) NOT NULL UNIQUE, +Phone VARCHAR(20) NOT NULL, +Address VARCHAR(255) NOT NULL, +DOB DATE NOT NULL, +Gender VARCHAR(20) NOT NULL, +IsActive BOOLEAN NOT NULL, +Role VARCHAR(100) NOT NULL +); + +DROP TABLE IF EXISTS Announcements; +-- ANNOUNCEMENTS +CREATE TABLE Announcements ( +AnnouncementID INT AUTO_INCREMENT PRIMARY KEY, +AnnouncerID INT NOT NULL, +Message TEXT NOT NULL, +AnnouncedAt DATETIME NOT NULL, +FOREIGN KEY (AnnouncerID) REFERENCES Users(UserID) +); + +DROP TABLE IF EXISTS AnnouncementsReceived; +-- ANNOUNCEMENTSRECEIVED +CREATE TABLE AnnouncementsReceived ( +AnnouncementID INT NOT NULL, +UserID INT NOT NULL, +PRIMARY KEY (AnnouncementID, UserID), +FOREIGN KEY (AnnouncementID) REFERENCES Announcements(AnnouncementID), +FOREIGN KEY (UserID) REFERENCES Users(UserID) +); + +DROP TABLE IF EXISTS Items; +-- ITEMS +CREATE TABLE Items ( +ItemID INT AUTO_INCREMENT PRIMARY KEY, +Title VARCHAR(255) NOT NULL, +Category VARCHAR(100) NOT NULL, +Description TEXT NOT NULL, +Size VARCHAR(10) NOT NULL, +`Condition` VARCHAR(100) NOT NULL, +IsAvailable BOOLEAN NOT NULL, +OwnerID INT NOT NULL, +ListedAt DATETIME NOT NULL, +`Type` VARCHAR(10) NOT NULL, +FOREIGN KEY (OwnerID) REFERENCES Users(UserID) +); + +DROP TABLE IF EXISTS Reports; +-- REPORTS +CREATE TABLE Reports ( +ReportID INT AUTO_INCREMENT PRIMARY KEY NOT NULL, +Note TEXT NOT NULL, +Severity INT NOT NULL, +Resolved BOOLEAN NOT NULL, +ReporterID INT NOT NULL, +ReportedUser INT NULL, +ReportedItem INT NULL, +ResolverID INT NULL, +ResolvedAt DATETIME NULL, +FOREIGN KEY (ReporterID) REFERENCES Users(UserID), +FOREIGN KEY (ReportedUser) REFERENCES Users(UserID), +FOREIGN KEY (ReportedItem) REFERENCES Items(ItemID), +FOREIGN KEY (ResolverID) REFERENCES Users(UserID) +); + +DROP TABLE IF EXISTS Images; +-- IMAGES +CREATE TABLE Images ( +ImageID INT AUTO_INCREMENT PRIMARY KEY, +ItemID INT NOT NULL, +ImageURL TEXT NOT NULL, +ImageOrderNum INT NOT NULL, +FOREIGN KEY (ItemID) REFERENCES Items(ItemID) +); + +DROP TABLE IF EXISTS Tags; +-- TAGS +CREATE TABLE Tags ( +TagID INT AUTO_INCREMENT PRIMARY KEY, +Title VARCHAR(100) NOT NULL +); + +DROP TABLE IF EXISTS ItemTags; +-- ITEMTAGS +CREATE TABLE ItemTags ( +ItemID INT NOT NULL, +TagID INT NOT NULL, +PRIMARY KEY (ItemID, TagID), +FOREIGN KEY (ItemID) REFERENCES Items(ItemID), +FOREIGN KEY (TagID) REFERENCES Tags(TagID) +); + +DROP TABLE IF EXISTS Shippings; +-- SHIPPING +CREATE TABLE Shippings ( +ShippingID INT AUTO_INCREMENT PRIMARY KEY, +Carrier VARCHAR(100) NOT NULL, +TrackingNum VARCHAR(255) NOT NULL, +DateShipped DATE NOT NULL, +DateArrived DATE NULL +); + +DROP TABLE IF EXISTS Orders; +-- ORDERS +CREATE TABLE Orders ( +OrderID INT AUTO_INCREMENT PRIMARY KEY, +GivenByID INT NOT NULL, +ReceiverID INT NOT NULL, +CreatedAt DATETIME NOT NULL, +ShippingID INT NULL, +FOREIGN KEY (GivenByID) REFERENCES Users(UserID), +FOREIGN KEY (ReceiverID) REFERENCES Users(UserID), +FOREIGN KEY (ShippingID) REFERENCES Shippings(ShippingID) +); + +DROP TABLE IF EXISTS OrderItems; +-- ORDERITEMS +CREATE TABLE OrderItems ( +OrderID INT NOT NULL, +ItemID INT NOT NULL, +PRIMARY KEY (OrderID, ItemID), +FOREIGN KEY (ItemID) REFERENCES Items(ItemID), +FOREIGN KEY (OrderID) REFERENCES Orders(OrderID) +); + +DROP TABLE IF EXISTS Feedback; +-- FEEDBACK +CREATE TABLE Feedback ( +FeedbackID INT AUTO_INCREMENT PRIMARY KEY, +OrderID INT NOT NULL, +Rating INT NOT NULL, +Comment TEXT NOT NULL, +CreatedAt DATETIME NOT NULL, +CreatedByID INT NOT NULL, +FOREIGN KEY (OrderID) REFERENCES Orders(OrderID), +FOREIGN KEY (CreatedByID) REFERENCES Users(UserID), +CHECK (Rating BETWEEN 1 AND 5) +); + +-- RESET ALL DATA +SET FOREIGN_KEY_CHECKS = 0; + +TRUNCATE TABLE AnnouncementsReceived; +TRUNCATE TABLE ItemTags; +TRUNCATE TABLE OrderItems; +TRUNCATE TABLE Feedback; +TRUNCATE TABLE Reports; +TRUNCATE TABLE Images; +TRUNCATE TABLE Orders; +TRUNCATE TABLE Shippings; +TRUNCATE TABLE Items; +TRUNCATE TABLE Announcements; +TRUNCATE TABLE Tags; +TRUNCATE TABLE Users; + +SET FOREIGN_KEY_CHECKS = 1; + +-- INSERT USERS +insert into Users (Name, Email, Phone, Address, DOB, Gender, IsActive, Role) values ('Aisha Seth', 'aseth@fithub.org', '783-714-6861', '696 Rowland Alley', '1994-03-16', 'Female', true, 'admin'); +insert into Users (Name, Email, Phone, Address, DOB, Gender, IsActive, Role) values ('Blair Williams', 'bwilliams@fithub.org', '607-164-4550', '3 Namekagon Terrace', '1997-11-04', 'Female', true, 'analyst'); +insert into Users (Name, Email, Phone, Address, DOB, Gender, IsActive, Role) values ('Waylen Phipard-Shears', 'wpshears2@fithub.org', '585-571-4741', '46 Doe Crossing Trail', '2000-02-05', 'Male', true, 'admin'); +insert into Users (Name, Email, Phone, Address, DOB, Gender, IsActive, Role) values ('Meggie Aleksankin', 'maleksankin3@stumbleupon.com', '170-363-5841', '9711 Carberry Trail', '2006-09-30', 'Female', true, 'taker'); +insert into Users (Name, Email, Phone, Address, DOB, Gender, IsActive, Role) values ('Kingsly Swires', 'kswires4@desdev.cn', '869-764-4936', '5 Dovetail Court', '2000-01-05', 'Male', true, 'swapper'); +insert into Users (Name, Email, Phone, Address, DOB, Gender, IsActive, Role) values ('Gilberto Jordison', 'gjordison5@google.com.br', '215-415-1029', '08 Annamark Junction', '2007-11-03', 'Male', true, 'taker'); +insert into Users (Name, Email, Phone, Address, DOB, Gender, IsActive, Role) values ('Atlante Kindall', 'akindall6@about.me', '709-939-0916', '762 Anderson Park', '2000-12-04', 'Bigender', true, 'swapper'); +insert into Users (Name, Email, Phone, Address, DOB, Gender, IsActive, Role) values ('Alexi Moreinu', 'amoreinu7@dell.com', '979-373-6083', '02727 Luster Park', '2003-02-06', 'Female', true, 'taker'); +insert into Users (Name, Email, Phone, Address, DOB, Gender, IsActive, Role) values ('Milly Gue', 'mgue8@businessweek.com', '879-895-9007', '52 Alpine Terrace', '2006-02-10', 'Polygender', true, 'swapper'); +insert into Users (Name, Email, Phone, Address, DOB, Gender, IsActive, Role) values ('Doralynn Hamlyn', 'dhamlyn9@fotki.com', '323-337-9508', '813 Debs Trail', '2002-01-25', 'Female', true, 'taker'); +insert into Users (Name, Email, Phone, Address, DOB, Gender, IsActive, Role) values ('Mahmoud Klazenga', 'mklazengaa@jiathis.com', '641-148-8235', '705 Prairie Rose Court', '2001-12-23', 'Male', true, 'swapper'); +insert into Users (Name, Email, Phone, Address, DOB, Gender, IsActive, Role) values ('Agustin Stickells', 'astickellsb@cnbc.com', '740-855-4464', '13 Myrtle Terrace', '2006-05-19', 'Male', true, 'taker'); +insert into Users (Name, Email, Phone, Address, DOB, Gender, IsActive, Role) values ('Efren Everingham', 'eeveringhamc@reverbnation.com', '191-543-6910', '95491 Goodland Circle', '2001-09-05', 'Agender', true, 'swapper'); +insert into Users (Name, Email, Phone, Address, DOB, Gender, IsActive, Role) values ('Penn Robilart', 'probilartd@odnoklassniki.ru', '167-291-8605', '1449 Fulton Place', '2007-12-23', 'Male', false, 'taker'); +insert into Users (Name, Email, Phone, Address, DOB, Gender, IsActive, Role) values ('Hillier Thompkins', 'hthompkinse@vinaora.com', '504-931-0747', '50 Fallview Trail', '2007-08-09', 'Male', true, 'swapper'); +insert into Users (Name, Email, Phone, Address, DOB, Gender, IsActive, Role) values ('Maryanna Sedgwick', 'msedgwickf@usnews.com', '216-694-7935', '4 Bashford Road', '2006-04-16', 'Female', false, 'taker'); +insert into Users (Name, Email, Phone, Address, DOB, Gender, IsActive, Role) values ('Quintilla Reimer', 'qreimerg@plala.or.jp', '253-962-6818', '107 Lyons Court', '2007-07-24', 'Female', true, 'swapper'); +insert into Users (Name, Email, Phone, Address, DOB, Gender, IsActive, Role) values ('Lurette Matyushenko', 'lmatyushenkoh@woothemes.com', '615-436-3277', '26 Donald Street', '2002-02-22', 'Female', true, 'taker'); +insert into Users (Name, Email, Phone, Address, DOB, Gender, IsActive, Role) values ('Rhona Smissen', 'rsmisseni@statcounter.com', '714-336-8319', '0 Steensland Trail', '2008-05-02', 'Female', true, 'swapper'); +insert into Users (Name, Email, Phone, Address, DOB, Gender, IsActive, Role) values ('Lurleen Loody', 'lloodyj@jimdo.com', '624-862-3836', '9524 Ohio Alley', '2001-09-15', 'Agender', true, 'taker'); +insert into Users (Name, Email, Phone, Address, DOB, Gender, IsActive, Role) values ('Parrnell O''Docherty', 'podochertyk@cnet.com', '403-914-1659', '84 Garrison Alley', '2007-02-06', 'Male', true, 'swapper'); +insert into Users (Name, Email, Phone, Address, DOB, Gender, IsActive, Role) values ('Jarret Brimilcome', 'jbrimilcomel@reverbnation.com', '230-152-1964', '6 Prentice Park', '2000-10-10', 'Male', false, 'taker'); +insert into Users (Name, Email, Phone, Address, DOB, Gender, IsActive, Role) values ('Imogene Waddam', 'iwaddamm@soundcloud.com', '916-806-9329', '52632 Hauk Alley', '2005-08-04', 'Female', true, 'swapper'); +insert into Users (Name, Email, Phone, Address, DOB, Gender, IsActive, Role) values ('Zebadiah Corthes', 'zcorthesn@gnu.org', '202-670-1925', '9 Shelley Court', '2003-08-07', 'Male', true, 'taker'); +insert into Users (Name, Email, Phone, Address, DOB, Gender, IsActive, Role) values ('Jacqui De Wolfe', 'jdeo@sourceforge.net', '915-247-4278', '49958 Brown Way', '2007-03-24', 'Female', true, 'swapper'); +insert into Users (Name, Email, Phone, Address, DOB, Gender, IsActive, Role) values ('Rutter Bartolomeo', 'rbartolomeop@amazonaws.com', '529-202-7689', '47026 Merchant Drive', '2006-04-29', 'Male', true, 'taker'); +insert into Users (Name, Email, Phone, Address, DOB, Gender, IsActive, Role) values ('Lana Ferriday', 'lferridayq@dailymail.co.uk', '748-446-1428', '89 Sachs Street', '2008-10-12', 'Non-binary', true, 'swapper'); +insert into Users (Name, Email, Phone, Address, DOB, Gender, IsActive, Role) values ('Caitlin Cadlock', 'ccadlockr@japanpost.jp', '202-514-4711', '5024 Riverside Way', '2008-08-08', 'Female', true, 'taker'); +insert into Users (Name, Email, Phone, Address, DOB, Gender, IsActive, Role) values ('Doria True', 'dtrues@hatena.ne.jp', '673-877-5502', '935 Old Shore Place', '2004-12-12', 'Female', true, 'swapper'); +insert into Users (Name, Email, Phone, Address, DOB, Gender, IsActive, Role) values ('Willamina Guite', 'wguitet@apple.com', '879-495-7973', '5 Magdeline Road', '2007-12-14', 'Female', true, 'taker'); +insert into Users (Name, Email, Phone, Address, DOB, Gender, IsActive, Role) values ('Halli Conneely', 'hconneelyu@weebly.com', '412-281-1093', '7 Swallow Park', '2005-05-04', 'Female', true, 'swapper'); +insert into Users (Name, Email, Phone, Address, DOB, Gender, IsActive, Role) values ('Rivkah Truscott', 'rtruscottv@wikispaces.com', '969-724-2894', '6534 Schmedeman Terrace', '2004-09-15', 'Female', true, 'taker'); +insert into Users (Name, Email, Phone, Address, DOB, Gender, IsActive, Role) values ('Germana Praill', 'gpraillw@webs.com', '418-980-7134', '8847 Prairieview Hill', '2003-09-10', 'Female', true, 'swapper'); +insert into Users (Name, Email, Phone, Address, DOB, Gender, IsActive, Role) values ('Andrej Simants', 'asimantsx@tripod.com', '938-331-1813', '455 Sunfield Hill', '2004-05-03', 'Male', true, 'taker'); +insert into Users (Name, Email, Phone, Address, DOB, Gender, IsActive, Role) values ('Arabele Kinningley', 'akinningleyy@biglobe.ne.jp', '209-478-2254', '1184 Northridge Crossing', '2007-01-22', 'Female', true, 'swapper'); +insert into Users (Name, Email, Phone, Address, DOB, Gender, IsActive, Role) values ('Bryant Fernao', 'bfernaoz@canalblog.com', '338-119-6662', '0 Melody Alley', '2001-12-14', 'Male', true, 'taker'); +insert into Users (Name, Email, Phone, Address, DOB, Gender, IsActive, Role) values ('Granthem Klossek', 'gklossek10@tumblr.com', '796-347-3135', '5 Warbler Trail', '2004-11-07', 'Male', true, 'swapper'); +insert into Users (Name, Email, Phone, Address, DOB, Gender, IsActive, Role) values ('Delmar Rigbye', 'drigbye11@wisc.edu', '434-650-1264', '15275 Elgar Road', '2007-06-04', 'Male', true, 'taker'); +insert into Users (Name, Email, Phone, Address, DOB, Gender, IsActive, Role) values ('Kimmie Bickersteth', 'kbickersteth12@bizjournals.com', '975-673-6496', '39909 Iowa Junction', '2007-12-02', 'Bigender', false, 'swapper'); +insert into Users (Name, Email, Phone, Address, DOB, Gender, IsActive, Role) values ('Inger Valeri', 'ivaleri13@baidu.com', '364-888-1308', '7012 Oak Terrace', '2006-04-25', 'Male', true, 'taker'); +SELECT * FROM Users; + +-- INSERT ANNOUNCEMENTS +insert into Announcements (AnnouncerID, Message, AnnouncedAt) values (1, 'Join our upcoming virtual swap meet on Saturday!', '2025-09-28 13:21:51'); +insert into Announcements (AnnouncerID, Message, AnnouncedAt) values (1, 'Weekend challenge: Swap at least one item and leave feedback for your partner.', '2025-08-01 16:36:36'); +insert into Announcements (AnnouncerID, Message, AnnouncedAt) values (1, 'Pro tip: Use aesthetic tags like Y2K or Coquette or Streetwear.', '2025-03-11 20:58:34'); +insert into Announcements (AnnouncerID, Message, AnnouncedAt) values (1, 'Stay tuned for exclusive discounts from our partner brands.', '2025-11-06 23:10:44'); +insert into Announcements (AnnouncerID, Message, AnnouncedAt) values (1, 'Pro tip: Use aesthetic tags like Y2K or Coquette or Streetwear.', '2025-09-17 04:32:57'); +insert into Announcements (AnnouncerID, Message, AnnouncedAt) values (1, 'Join our upcoming virtual swap meet on Saturday!', '2025-11-04 15:55:27'); +insert into Announcements (AnnouncerID, Message, AnnouncedAt) values (1, 'Stay tuned for exclusive discounts from our partner brands.', '2025-10-25 15:57:13'); +insert into Announcements (AnnouncerID, Message, AnnouncedAt) values (1, 'Check out our instagram for styling tips and trend forecasts.', '2025-07-17 18:26:16'); +insert into Announcements (AnnouncerID, Message, AnnouncedAt) values (1, 'Pro tip: Use aesthetic tags like Y2K or Coquette or Streetwear.', '2025-05-22 00:51:36'); +insert into Announcements (AnnouncerID, Message, AnnouncedAt) values (3, 'Welcome to FitHub! List your pre-loved fits and swap with the community.', '2025-11-04 22:59:25'); +insert into Announcements (AnnouncerID, Message, AnnouncedAt) values (1, 'Check out our instagram for styling tips and trend forecasts.', '2025-01-11 08:47:13'); +insert into Announcements (AnnouncerID, Message, AnnouncedAt) values (1, 'Join our upcoming virtual swap meet on Saturday!', '2025-08-22 18:09:21'); +insert into Announcements (AnnouncerID, Message, AnnouncedAt) values (1, 'Pro tip: Use aesthetic tags like Y2K or Coquette or Streetwear.', '2025-10-26 06:51:08'); +insert into Announcements (AnnouncerID, Message, AnnouncedAt) values (1, 'Weekend challenge: Swap at least one item and leave feedback for your partner.', '2025-07-19 03:52:09'); +insert into Announcements (AnnouncerID, Message, AnnouncedAt) values (1, 'Welcome to FitHub! List your pre-loved fits and swap with the community.', '2025-04-05 13:12:29'); +insert into Announcements (AnnouncerID, Message, AnnouncedAt) values (1, 'Weekend challenge: Swap at least one item and leave feedback for your partner.', '2025-06-17 01:28:50'); +insert into Announcements (AnnouncerID, Message, AnnouncedAt) values (1, 'Weekend challenge: Swap at least one item and leave feedback for your partner.', '2025-05-28 07:40:04'); +insert into Announcements (AnnouncerID, Message, AnnouncedAt) values (3, 'Welcome to FitHub! List your pre-loved fits and swap with the community.', '2025-08-08 08:40:40'); +insert into Announcements (AnnouncerID, Message, AnnouncedAt) values (1, 'Check out our instagram for styling tips and trend forecasts.', '2025-09-28 00:20:16'); +insert into Announcements (AnnouncerID, Message, AnnouncedAt) values (1, 'Congratulations on completing your first swap! Keep it up!', '2025-05-21 16:43:09'); +insert into Announcements (AnnouncerID, Message, AnnouncedAt) values (1, 'Welcome to FitHub! List your pre-loved fits and swap with the community.', '2024-12-19 23:24:03'); +insert into Announcements (AnnouncerID, Message, AnnouncedAt) values (3, 'Weekend challenge: Swap at least one item and leave feedback for your partner.', '2025-06-19 04:43:36'); +insert into Announcements (AnnouncerID, Message, AnnouncedAt) values (1, 'Maintenance scheduled for tomorrow at 2 PM.', '2025-08-27 12:21:49'); +insert into Announcements (AnnouncerID, Message, AnnouncedAt) values (1, 'Don''t forget to update your profile with your latest fits!', '2025-01-15 02:08:41'); +insert into Announcements (AnnouncerID, Message, AnnouncedAt) values (1, 'Pro tip: Use aesthetic tags like Y2K or Coquette or Streetwear.', '2025-03-21 12:25:44'); +insert into Announcements (AnnouncerID, Message, AnnouncedAt) values (1, 'Join our upcoming virtual swap meet on Saturday!', '2025-08-26 14:55:50'); +insert into Announcements (AnnouncerID, Message, AnnouncedAt) values (1, 'Maintenance scheduled for tomorrow at 2 PM.', '2025-11-13 01:45:41'); +insert into Announcements (AnnouncerID, Message, AnnouncedAt) values (3, 'Weekend challenge: Swap at least one item and leave feedback for your partner.', '2025-01-31 00:23:15'); +insert into Announcements (AnnouncerID, Message, AnnouncedAt) values (1, 'Weekend challenge: Swap at least one item and leave feedback for your partner.', '2024-12-13 22:59:34'); +insert into Announcements (AnnouncerID, Message, AnnouncedAt) values (1, 'Maintenance scheduled for tomorrow at 2 PM.', '2024-12-22 07:56:02'); +insert into Announcements (AnnouncerID, Message, AnnouncedAt) values (1, 'Stay tuned for exclusive discounts from our partner brands.', '2025-08-30 14:14:36'); +insert into Announcements (AnnouncerID, Message, AnnouncedAt) values (1, 'Check out our instagram for styling tips and trend forecasts.', '2025-02-03 15:17:06'); +insert into Announcements (AnnouncerID, Message, AnnouncedAt) values (3, 'Welcome to FitHub! List your pre-loved fits and swap with the community.', '2025-08-11 00:50:35'); +insert into Announcements (AnnouncerID, Message, AnnouncedAt) values (1, 'Don''t forget to update your profile with your latest fits!', '2025-02-27 07:22:15'); +insert into Announcements (AnnouncerID, Message, AnnouncedAt) values (1, 'Congratulations on completing your first swap! Keep it up!', '2025-11-02 16:02:45'); +insert into Announcements (AnnouncerID, Message, AnnouncedAt) values (3, 'Congratulations on completing your first swap! Keep it up!', '2025-11-03 00:38:50'); +insert into Announcements (AnnouncerID, Message, AnnouncedAt) values (1, 'Join our upcoming virtual swap meet on Saturday!', '2025-06-16 17:46:37'); +insert into Announcements (AnnouncerID, Message, AnnouncedAt) values (1, 'Pro tip: Use aesthetic tags like Y2K or Coquette or Streetwear.', '2025-06-29 15:13:14'); +insert into Announcements (AnnouncerID, Message, AnnouncedAt) values (1, 'Stay tuned for exclusive discounts from our partner brands.', '2025-07-25 01:21:11'); +insert into Announcements (AnnouncerID, Message, AnnouncedAt) values (3, 'Congratulations on completing your first swap! Keep it up!', '2025-06-17 07:06:11'); +SELECT * FROM Announcements; + +-- INSERT ANNOUNCEMENTS RECEIVED +insert into AnnouncementsReceived (AnnouncementID, UserID) values (36, 39); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (17, 3); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (19, 20); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (14, 4); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (35, 15); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (8, 4); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (10, 13); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (40, 22); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (2, 15); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (7, 22); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (25, 16); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (7, 6); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (34, 34); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (30, 26); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (26, 22); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (29, 11); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (22, 23); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (1, 40); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (6, 30); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (20, 21); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (14, 30); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (7, 33); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (38, 19); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (32, 17); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (23, 10); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (17, 18); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (3, 15); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (21, 24); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (1, 10); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (22, 9); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (39, 37); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (16, 32); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (16, 14); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (33, 27); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (5, 25); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (29, 5); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (31, 21); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (16, 36); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (32, 36); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (5, 36); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (30, 31); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (10, 38); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (31, 40); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (31, 3); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (12, 7); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (16, 18); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (16, 7); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (4, 34); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (24, 37); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (35, 9); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (13, 36); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (38, 10); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (30, 30); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (2, 18); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (5, 19); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (32, 35); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (11, 9); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (4, 13); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (37, 11); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (7, 17); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (34, 5); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (24, 26); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (18, 6); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (13, 38); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (7, 37); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (33, 6); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (35, 22); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (24, 6); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (21, 28); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (25, 30); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (20, 26); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (25, 26); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (25, 22); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (13, 39); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (23, 12); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (40, 4); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (13, 11); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (13, 9); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (34, 19); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (34, 12); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (14, 15); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (19, 10); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (18, 14); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (19, 26); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (40, 38); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (39, 33); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (30, 35); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (4, 15); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (35, 7); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (26, 6); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (5, 9); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (26, 31); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (1, 8); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (32, 12); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (36, 8); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (21, 4); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (9, 11); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (16, 20); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (8, 19); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (35, 11); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (1, 18); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (27, 9); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (32, 19); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (11, 7); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (33, 35); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (12, 38); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (14, 14); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (19, 31); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (14, 23); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (6, 29); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (6, 26); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (33, 14); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (17, 5); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (23, 39); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (26, 5); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (9, 15); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (22, 15); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (21, 7); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (19, 38); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (8, 15); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (1, 16); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (12, 33); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (3, 12); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (18, 7); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (23, 26); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (3, 30); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (30, 24); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (28, 33); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (2, 4); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (15, 23); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (21, 37); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (13, 37); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (22, 17); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (7, 16); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (1, 35); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (23, 4); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (12, 23); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (18, 26); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (35, 25); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (17, 22); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (28, 11); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (40, 7); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (24, 24); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (17, 24); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (25, 31); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (18, 5); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (18, 16); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (31, 37); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (30, 8); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (25, 15); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (21, 22); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (6, 35); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (9, 31); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (22, 16); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (10, 39); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (35, 10); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (40, 15); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (18, 25); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (10, 34); +insert into AnnouncementsReceived (AnnouncementID, UserID) values (21, 34); +SELECT * FROM AnnouncementsReceived; + +-- INSERT ITEMS +insert into Items (Title, Category, Description, Size, `Condition`, IsAvailable, OwnerID, ListedAt, `Type`) values ('Converse Chuck Taylor', 'shoes', 'Red high tops, some wear on soles', 'M', 'Good', true, 8, '2025-02-13 16:45:00', 'take'); +insert into Items (Title, Category, Description, Size, `Condition`, IsAvailable, OwnerID, ListedAt, `Type`) values ('Vintage Band Tee', 't-shirt', 'Nirvana concert tee from the 90s', 'M', 'Good', true, 6, '2025-02-14 10:30:00', 'swap'); +insert into Items (Title, Category, Description, Size, `Condition`, IsAvailable, OwnerID, ListedAt, `Type`) values ('Leather Moto Jacket', 'jacket', 'Black leather jacket, slightly worn', 'L', 'Very good', true, 4, '2025-02-14 13:00:00', 'take'); +insert into Items (Title, Category, Description, Size, `Condition`, IsAvailable, OwnerID, ListedAt, `Type`) values ('Floral Midi Dress', 'dress', 'Spring floral pattern, never worn', 'M', 'Excellent', true, 5, '2025-02-15 11:20:00', 'swap'); +insert into Items (Title, Category, Description, Size, `Condition`, IsAvailable, OwnerID, ListedAt, `Type`) values ('High-Waisted Mom Jeans', 'jeans', 'Light wash, straight leg fit', 'M', 'Good', true, 6, '2025-02-15 15:05:00', 'take'); +insert into Items (Title, Category, Description, Size, `Condition`, IsAvailable, OwnerID, ListedAt, `Type`) values ('Oversized Knit Sweater', 'sweater', 'Cream chunky knit, cozy for winter', 'L', 'Very good', true, 7, '2025-02-16 09:45:00', 'swap'); +insert into Items (Title, Category, Description, Size, `Condition`, IsAvailable, OwnerID, ListedAt, `Type`) values ('Black Chelsea Boots', 'shoes', 'Leather ankle boots, small scuff on heel', 'M', 'Good', true, 8, '2025-02-16 14:10:00', 'take'); +insert into Items (Title, Category, Description, Size, `Condition`, IsAvailable, OwnerID, ListedAt, `Type`) values ('Puffer Winter Coat', 'coat', 'Long black puffer, very warm with hood', 'L', 'Excellent', true, 9, '2025-02-17 10:00:00', 'swap'); +insert into Items (Title, Category, Description, Size, `Condition`, IsAvailable, OwnerID, ListedAt, `Type`) values ('Corduroy Mini Skirt', 'skirt', 'Brown corduroy mini skirt with pockets', 'S', 'Very good', true, 10, '2025-02-17 16:20:00', 'take'); +insert into Items (Title, Category, Description, Size, `Condition`, IsAvailable, OwnerID, ListedAt, `Type`) values ('Graphic Hoodie', 'hoodie', 'Gray hoodie with retro print on back', 'M', 'Good', true, 11, '2025-02-18 13:40:00', 'swap'); +insert into Items (Title, Category, Description, Size, `Condition`, IsAvailable, OwnerID, ListedAt, `Type`) values ('Running Sneakers', 'shoes', 'White running shoes, lightly used', 'M', 'Good', true, 12, '2025-02-18 18:05:00', 'take'); +insert into Items (Title, Category, Description, Size, `Condition`, IsAvailable, OwnerID, ListedAt, `Type`) values ('Plaid Flannel Shirt', 'shirt', 'Red and navy flannel, soft fabric', 'M', 'Very good', true, 13, '2025-02-19 09:25:00', 'swap'); +insert into Items (Title, Category, Description, Size, `Condition`, IsAvailable, OwnerID, ListedAt, `Type`) values ('Denim Jacket', 'jacket', 'Classic blue denim jacket, slightly cropped', 'M', 'Excellent', true, 14, '2025-02-19 14:50:00', 'take'); +insert into Items (Title, Category, Description, Size, `Condition`, IsAvailable, OwnerID, ListedAt, `Type`) values ('Silk Blouse', 'blouse', 'Ivory silk button-up, barely worn', 'M', 'Excellent', true, 15, '2025-02-20 11:15:00', 'swap'); +insert into Items (Title, Category, Description, Size, `Condition`, IsAvailable, OwnerID, ListedAt, `Type`) values ('Wide-Leg Trousers', 'pants', 'Black high-waisted wide-leg dress pants', 'M', 'Very good', true, 16, '2025-02-20 17:30:00', 'take'); +insert into Items (Title, Category, Description, Size, `Condition`, IsAvailable, OwnerID, ListedAt, `Type`) values ('Striped Long-Sleeve Tee', 't-shirt', 'Navy and white striped tee with boat neck', 'S', 'Good', true, 17, '2025-02-21 10:10:00', 'swap'); +insert into Items (Title, Category, Description, Size, `Condition`, IsAvailable, OwnerID, ListedAt, `Type`) values ('Raincoat', 'coat', 'Yellow waterproof raincoat with hood', 'M', 'Very good', true, 18, '2025-02-21 13:55:00', 'take'); +insert into Items (Title, Category, Description, Size, `Condition`, IsAvailable, OwnerID, ListedAt, `Type`) values ('Black Leggings', 'pants', 'High-rise leggings that are squat-proof', 'M', 'Good', true, 19, '2025-02-22 09:05:00', 'swap'); +insert into Items (Title, Category, Description, Size, `Condition`, IsAvailable, OwnerID, ListedAt, `Type`) values ('Chunky Platform Sandals', 'shoes', 'Black platform sandals, worn twice', 'M', 'Excellent', true, 20, '2025-02-22 15:45:00', 'take'); +insert into Items (Title, Category, Description, Size, `Condition`, IsAvailable, OwnerID, ListedAt, `Type`) values ('Cable Knit Cardigan', 'sweater', 'Olive green button-up cable knit cardigan', 'M', 'Very good', true, 21, '2025-02-23 12:20:00', 'swap'); +insert into Items (Title, Category, Description, Size, `Condition`, IsAvailable, OwnerID, ListedAt, `Type`) values ('Bodycon Party Dress', 'dress', 'Black bodycon dress with square neckline', 'S', 'Good', true, 22, '2025-02-23 18:40:00', 'take'); +insert into Items (Title, Category, Description, Size, `Condition`, IsAvailable, OwnerID, ListedAt, `Type`) values ('Tennis Skirt', 'skirt', 'White pleated tennis skirt, small stain near hem', 'S', 'Fair', false, 23, '2025-02-24 09:35:00', 'swap'); +insert into Items (Title, Category, Description, Size, `Condition`, IsAvailable, OwnerID, ListedAt, `Type`) values ('Oversized Blazer', 'blazer', 'Gray checkered blazer with boyfriend fit', 'M', 'Very good', true, 24, '2025-02-24 14:25:00', 'take'); +insert into Items (Title, Category, Description, Size, `Condition`, IsAvailable, OwnerID, ListedAt, `Type`) values ('Fleece Quarter-Zip', 'sweater', 'Navy fleece quarter-zip, super soft', 'L', 'Good', true, 25, '2025-02-25 08:50:00', 'swap'); +insert into Items (Title, Category, Description, Size, `Condition`, IsAvailable, OwnerID, ListedAt, `Type`) values ('Cargo Pants', 'pants', 'Khaki cargo pants with side pockets', 'M', 'Good', true, 26, '2025-02-25 16:05:00', 'take'); +insert into Items (Title, Category, Description, Size, `Condition`, IsAvailable, OwnerID, ListedAt, `Type`) values ('Combat Boots', 'shoes', 'Black lace-up combat boots, broken in but solid', 'M', 'Fair', false, 27, '2025-02-26 11:40:00', 'swap'); +insert into Items (Title, Category, Description, Size, `Condition`, IsAvailable, OwnerID, ListedAt, `Type`) values ('Maxi Skirt', 'skirt', 'Flowy floral maxi skirt with side slit', 'M', 'Very good', true, 28, '2025-02-26 17:15:00', 'take'); +insert into Items (Title, Category, Description, Size, `Condition`, IsAvailable, OwnerID, ListedAt, `Type`) values ('Cropped Tank Top', 'tank top', 'Black ribbed cropped tank top', 'S', 'Excellent', true, 29, '2025-02-27 10:05:00', 'swap'); +insert into Items (Title, Category, Description, Size, `Condition`, IsAvailable, OwnerID, ListedAt, `Type`) values ('Linen Button-Up Shirt', 'shirt', 'Beige linen button-up, relaxed fit', 'L', 'Very good', true, 30, '2025-02-27 15:20:00', 'take'); +insert into Items (Title, Category, Description, Size, `Condition`, IsAvailable, OwnerID, ListedAt, `Type`) values ('Track Jacket', 'jacket', 'Vintage blue track jacket with white stripes', 'M', 'Good', true, 31, '2025-02-28 09:55:00', 'swap'); +insert into Items (Title, Category, Description, Size, `Condition`, IsAvailable, OwnerID, ListedAt, `Type`) values ('High-Neck Sweater Dress', 'dress', 'Camel knit sweater dress, midi length', 'M', 'Excellent', true, 32, '2025-02-28 18:10:00', 'take'); +insert into Items (Title, Category, Description, Size, `Condition`, IsAvailable, OwnerID, ListedAt, `Type`) values ('Slip Dress', 'dress', 'Sage green satin slip dress', 'S', 'Very good', true, 33, '2025-03-01 11:30:00', 'swap'); +insert into Items (Title, Category, Description, Size, `Condition`, IsAvailable, OwnerID, ListedAt, `Type`) values ('Baggy Sweatpants', 'pants', 'Gray sweatpants with drawstring waist', 'M', 'Good', true, 34, '2025-03-01 16:45:00', 'take'); +insert into Items (Title, Category, Description, Size, `Condition`, IsAvailable, OwnerID, ListedAt, `Type`) values ('Sherpa Lined Denim Jacket', 'jacket', 'Blue denim jacket with cream sherpa lining', 'L', 'Very good', true, 35, '2025-03-02 10:15:00', 'swap'); +insert into Items (Title, Category, Description, Size, `Condition`, IsAvailable, OwnerID, ListedAt, `Type`) values ('Athletic Shorts', 'shorts', 'Black running shorts with built-in liner', 'M', 'Good', true, 36, '2025-03-02 14:35:00', 'take'); +insert into Items (Title, Category, Description, Size, `Condition`, IsAvailable, OwnerID, ListedAt, `Type`) values ('Turtleneck Top', 'top', 'Black fitted turtleneck, great for layering', 'S', 'Excellent', true, 37, '2025-03-03 09:25:00', 'swap'); +insert into Items (Title, Category, Description, Size, `Condition`, IsAvailable, OwnerID, ListedAt, `Type`) values ('Oversized Graphic Tee', 't-shirt', 'Washed black tee with festival graphic', 'L', 'Good', true, 38, '2025-03-03 13:50:00', 'take'); +insert into Items (Title, Category, Description, Size, `Condition`, IsAvailable, OwnerID, ListedAt, `Type`) values ('Suede Ankle Boots', 'shoes', 'Tan suede ankle boots, minor crease on toe', 'M', 'Very good', true, 39, '2025-03-04 11:05:00', 'swap'); +insert into Items (Title, Category, Description, Size, `Condition`, IsAvailable, OwnerID, ListedAt, `Type`) values ('Polo Shirt', 'shirt', 'Forest green polo shirt, slightly faded collar', 'M', 'Fair', false, 40, '2025-03-04 17:40:00', 'take'); +insert into Items (Title, Category, Description, Size, `Condition`, IsAvailable, OwnerID, ListedAt, `Type`) values ('Quilted Vest', 'vest', 'Black quilted vest, lightweight layering piece', 'M', 'Good', true, 4, '2025-03-05 10:55:00', 'swap'); +SELECT * FROM Items; + +-- INSERT REPORTS +insert into Reports (Note, Severity, Resolved, ReporterID, ReportedUser, ReportedItem, ResolverID, ResolvedAt) values ('Small stain near hem', 5, true, 18, null, 26, 3, '2025-03-31 21:13:09'); +insert into Reports (Note, Severity, Resolved, ReporterID, ReportedUser, ReportedItem, ResolverID, ResolvedAt) values ('Small stain near hem', 2, true, 9, null, 17, 1, '2025-01-01 00:00:00'); +insert into Reports (Note, Severity, Resolved, ReporterID, ReportedUser, ReportedItem, ResolverID, ResolvedAt) values ('Hoodie had a loose thread', 5, true, 14, null, 4, null, '2025-01-01 00:00:00'); +insert into Reports (Note, Severity, Resolved, ReporterID, ReportedUser, ReportedItem, ResolverID, ResolvedAt) values ('Small stain near hem', 4, true, 8, null, 4, null, '2025-02-02 04:29:51'); +insert into Reports (Note, Severity, Resolved, ReporterID, ReportedUser, ReportedItem, ResolverID, ResolvedAt) values ('Admin flagged due to inappropriate content', 5, true, 26, null, 5, null, '2025-01-01 00:00:00'); +insert into Reports (Note, Severity, Resolved, ReporterID, ReportedUser, ReportedItem, ResolverID, ResolvedAt) values ('Duplicate listing issue', 5, true, 11, null, 37, 3, '2025-01-01 00:00:00'); +insert into Reports (Note, Severity, Resolved, ReporterID, ReportedUser, ReportedItem, ResolverID, ResolvedAt) values ('Admin flagged due to inappropriate content', 4, false, 4, null, 26, null, null); +insert into Reports (Note, Severity, Resolved, ReporterID, ReportedUser, ReportedItem, ResolverID, ResolvedAt) values ('Hoodie had a loose thread', 1, true, 34, null, 30, 3, '2024-12-27 00:27:56'); +insert into Reports (Note, Severity, Resolved, ReporterID, ReportedUser, ReportedItem, ResolverID, ResolvedAt) values ('Duplicate listing issue', 1, true, 7, null, 27, 3, '2025-01-18 18:59:23'); +insert into Reports (Note, Severity, Resolved, ReporterID, ReportedUser, ReportedItem, ResolverID, ResolvedAt) values ('Admin flagged due to inappropriate content', 3, true, 14, null, 16, 3, '2025-01-01 00:00:00'); +insert into Reports (Note, Severity, Resolved, ReporterID, ReportedUser, ReportedItem, ResolverID, ResolvedAt) values ('Small stain near hem', 4, false, 34, 21, 3, null, null); +insert into Reports (Note, Severity, Resolved, ReporterID, ReportedUser, ReportedItem, ResolverID, ResolvedAt) values ('Duplicate listing issue', 3, true, 1, null, 25, 3, '2025-01-01 00:00:00'); +insert into Reports (Note, Severity, Resolved, ReporterID, ReportedUser, ReportedItem, ResolverID, ResolvedAt) values ('Admin flagged due to inappropriate content', 3, true, 35, 33, 30, null, '2025-08-25 17:10:51'); +insert into Reports (Note, Severity, Resolved, ReporterID, ReportedUser, ReportedItem, ResolverID, ResolvedAt) values ('Hoodie had a loose thread', 5, true, 6, null, 39, null, '2025-01-01 00:00:00'); +insert into Reports (Note, Severity, Resolved, ReporterID, ReportedUser, ReportedItem, ResolverID, ResolvedAt) values ('Admin flagged due to inappropriate content', 3, false, 22, null, 13, null, null); +insert into Reports (Note, Severity, Resolved, ReporterID, ReportedUser, ReportedItem, ResolverID, ResolvedAt) values ('Small stain near hem', 4, false, 7, null, 5, null, null); +insert into Reports (Note, Severity, Resolved, ReporterID, ReportedUser, ReportedItem, ResolverID, ResolvedAt) values ('Hoodie had a loose thread', 4, true, 14, null, 2, 1, '2025-01-01 00:00:00'); +insert into Reports (Note, Severity, Resolved, ReporterID, ReportedUser, ReportedItem, ResolverID, ResolvedAt) values ('Jeans arrived more faded', 3, false, 27, null, 28, 3, null); +insert into Reports (Note, Severity, Resolved, ReporterID, ReportedUser, ReportedItem, ResolverID, ResolvedAt) values ('Duplicate listing issue', 5, true, 27, null, 7, null, '2025-03-23 04:42:22'); +insert into Reports (Note, Severity, Resolved, ReporterID, ReportedUser, ReportedItem, ResolverID, ResolvedAt) values ('Duplicate listing issue', 5, false, 3, null, 27, null, null); +insert into Reports (Note, Severity, Resolved, ReporterID, ReportedUser, ReportedItem, ResolverID, ResolvedAt) values ('Jeans arrived more faded', 3, true, 16, null, 20, null, '2025-01-01 00:00:00'); +insert into Reports (Note, Severity, Resolved, ReporterID, ReportedUser, ReportedItem, ResolverID, ResolvedAt) values ('Hoodie had a loose thread', 2, false, 33, null, 40, 3, null); +insert into Reports (Note, Severity, Resolved, ReporterID, ReportedUser, ReportedItem, ResolverID, ResolvedAt) values ('Duplicate listing issue', 4, true, 31, null, 22, null, '2025-06-04 18:25:33'); +insert into Reports (Note, Severity, Resolved, ReporterID, ReportedUser, ReportedItem, ResolverID, ResolvedAt) values ('Small stain near hem', 4, false, 38, 23, 33, 3, null); +insert into Reports (Note, Severity, Resolved, ReporterID, ReportedUser, ReportedItem, ResolverID, ResolvedAt) values ('Small stain near hem', 1, false, 31, null, 34, 1, null); +insert into Reports (Note, Severity, Resolved, ReporterID, ReportedUser, ReportedItem, ResolverID, ResolvedAt) values ('Admin flagged due to inappropriate content', 1, true, 6, null, 11, null, '2024-12-21 05:50:41'); +insert into Reports (Note, Severity, Resolved, ReporterID, ReportedUser, ReportedItem, ResolverID, ResolvedAt) values ('Hoodie had a loose thread', 1, true, 9, null, 10, null, '2025-01-01 00:00:00'); +insert into Reports (Note, Severity, Resolved, ReporterID, ReportedUser, ReportedItem, ResolverID, ResolvedAt) values ('Jeans arrived more faded', 4, false, 26, null, 8, null, null); +insert into Reports (Note, Severity, Resolved, ReporterID, ReportedUser, ReportedItem, ResolverID, ResolvedAt) values ('Small stain near hem', 1, true, 4, null, 8, 3, '2025-01-01 00:00:00'); +insert into Reports (Note, Severity, Resolved, ReporterID, ReportedUser, ReportedItem, ResolverID, ResolvedAt) values ('Jeans arrived more faded', 1, false, 25, null, 4, 3, null); +insert into Reports (Note, Severity, Resolved, ReporterID, ReportedUser, ReportedItem, ResolverID, ResolvedAt) values ('Jeans arrived more faded', 4, false, 5, null, 25, 1, null); +insert into Reports (Note, Severity, Resolved, ReporterID, ReportedUser, ReportedItem, ResolverID, ResolvedAt) values ('Duplicate listing issue', 4, true, 40, 11, 33, null, '2025-01-01 00:00:00'); +insert into Reports (Note, Severity, Resolved, ReporterID, ReportedUser, ReportedItem, ResolverID, ResolvedAt) values ('Small stain near hem', 2, false, 21, null, 38, null, null); +insert into Reports (Note, Severity, Resolved, ReporterID, ReportedUser, ReportedItem, ResolverID, ResolvedAt) values ('Small stain near hem', 4, true, 11, null, 20, null, '2025-09-06 09:53:11'); +insert into Reports (Note, Severity, Resolved, ReporterID, ReportedUser, ReportedItem, ResolverID, ResolvedAt) values ('Jeans arrived more faded', 5, true, 18, null, 18, null, '2025-01-01 00:00:00'); +insert into Reports (Note, Severity, Resolved, ReporterID, ReportedUser, ReportedItem, ResolverID, ResolvedAt) values ('Hoodie had a loose thread', 2, false, 36, null, 17, 3, null); +insert into Reports (Note, Severity, Resolved, ReporterID, ReportedUser, ReportedItem, ResolverID, ResolvedAt) values ('Hoodie had a loose thread', 5, false, 17, 32, 7, 1, null); +insert into Reports (Note, Severity, Resolved, ReporterID, ReportedUser, ReportedItem, ResolverID, ResolvedAt) values ('Hoodie had a loose thread', 4, true, 25, 29, 21, 1, '2025-02-22 01:12:01'); +insert into Reports (Note, Severity, Resolved, ReporterID, ReportedUser, ReportedItem, ResolverID, ResolvedAt) values ('Admin flagged due to inappropriate content', 3, true, 35, null, 38, 1, '2025-10-14 07:18:46'); +insert into Reports (Note, Severity, Resolved, ReporterID, ReportedUser, ReportedItem, ResolverID, ResolvedAt) values ('Jeans arrived more faded', 5, true, 3, null, 37, null, '2025-10-10 17:59:23'); +SELECT * FROM Reports; + +-- INSERT IMAGES +insert into Images (ItemID, ImageURL, ImageOrderNum) values (1, 'https://example.com/image1.jpg', 16); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (2, 'https://example.com/image2.jpg', 29); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (3, 'https://example.com/image3.jpg', 29); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (4, 'https://example.com/image4.jpg', 37); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (5, 'https://example.com/image5.jpg', 28); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (6, 'https://example.com/image6.jpg', 10); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (7, 'https://example.com/image7.jpg', 39); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (8, 'https://example.com/image8.jpg', 4); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (9, 'https://example.com/image9.jpg', 20); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (10, 'https://example.com/image10.jpg', 25); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (11, 'https://example.com/image11.jpg', 3); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (12, 'https://example.com/image12.jpg', 30); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (13, 'https://example.com/image13.jpg', 18); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (14, 'https://example.com/image14.jpg', 17); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (15, 'https://example.com/image15.jpg', 23); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (16, 'https://example.com/image16.jpg', 12); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (17, 'https://example.com/image17.jpg', 37); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (18, 'https://example.com/image18.jpg', 32); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (19, 'https://example.com/image19.jpg', 8); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (20, 'https://example.com/image20.jpg', 27); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (21, 'https://example.com/image21.jpg', 6); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (22, 'https://example.com/image22.jpg', 11); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (23, 'https://example.com/image23.jpg', 36); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (24, 'https://example.com/image24.jpg', 40); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (25, 'https://example.com/image25.jpg', 28); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (26, 'https://example.com/image26.jpg', 30); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (27, 'https://example.com/image27.jpg', 4); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (28, 'https://example.com/image28.jpg', 34); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (29, 'https://example.com/image29.jpg', 19); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (30, 'https://example.com/image30.jpg', 26); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (31, 'https://example.com/image31.jpg', 19); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (32, 'https://example.com/image32.jpg', 26); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (33, 'https://example.com/image33.jpg', 39); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (34, 'https://example.com/image34.jpg', 26); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (35, 'https://example.com/image35.jpg', 40); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (36, 'https://example.com/image36.jpg', 4); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (37, 'https://example.com/image37.jpg', 24); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (38, 'https://example.com/image38.jpg', 14); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (39, 'https://example.com/image39.jpg', 20); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (40, 'https://example.com/image40.jpg', 33); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (1, 'https://example.com/image41.jpg', 7); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (2, 'https://example.com/image42.jpg', 22); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (3, 'https://example.com/image43.jpg', 15); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (4, 'https://example.com/image44.jpg', 33); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (5, 'https://example.com/image45.jpg', 18); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (6, 'https://example.com/image46.jpg', 9); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (7, 'https://example.com/image47.jpg', 31); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (8, 'https://example.com/image48.jpg', 13); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (9, 'https://example.com/image49.jpg', 35); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (10, 'https://example.com/image50.jpg', 3); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (11, 'https://example.com/image51.jpg', 21); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (12, 'https://example.com/image52.jpg', 30); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (13, 'https://example.com/image53.jpg', 16); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (14, 'https://example.com/image54.jpg', 11); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (15, 'https://example.com/image55.jpg', 27); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (16, 'https://example.com/image56.jpg', 8); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (17, 'https://example.com/image57.jpg', 40); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (18, 'https://example.com/image58.jpg', 17); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (19, 'https://example.com/image59.jpg', 24); +insert into Images (ItemID, ImageURL, ImageOrderNum) values (20, 'https://example.com/image60.jpg', 6); +SELECT * FROM Images; + +-- INSERT TAGS +insert into Tags (Title) values ('Y2K'); +insert into Tags (Title) values ('Chic'); +insert into Tags (Title) values ('Bohemian'); +insert into Tags (Title) values ('Preppy'); +insert into Tags (Title) values ('Retro'); +insert into Tags (Title) values ('Eclectic'); +insert into Tags (Title) values ('Preppy'); +insert into Tags (Title) values ('Sporty'); +insert into Tags (Title) values ('Eclectic'); +insert into Tags (Title) values ('Edgy'); +insert into Tags (Title) values ('Minimalist'); +insert into Tags (Title) values ('Sophisticated'); +insert into Tags (Title) values ('Bohemian'); +insert into Tags (Title) values ('Sporty'); +insert into Tags (Title) values ('Chic'); +insert into Tags (Title) values ('Chic'); +insert into Tags (Title) values ('Urban'); +insert into Tags (Title) values ('Y2K'); +insert into Tags (Title) values ('Preppy'); +insert into Tags (Title) values ('Sophisticated'); +insert into Tags (Title) values ('Minimalist'); +insert into Tags (Title) values ('Sophisticated'); +insert into Tags (Title) values ('Sporty'); +insert into Tags (Title) values ('Minimalist'); +insert into Tags (Title) values ('Urban'); +insert into Tags (Title) values ('Edgy'); +insert into Tags (Title) values ('Chic'); +insert into Tags (Title) values ('Edgy'); +insert into Tags (Title) values ('Eclectic'); +insert into Tags (Title) values ('Y2K'); +insert into Tags (Title) values ('Y2K'); +insert into Tags (Title) values ('Minimalist'); +insert into Tags (Title) values ('Retro'); +insert into Tags (Title) values ('Urban'); +insert into Tags (Title) values ('Chic'); +insert into Tags (Title) values ('Y2K'); +insert into Tags (Title) values ('Sophisticated'); +insert into Tags (Title) values ('Preppy'); +insert into Tags (Title) values ('Edgy'); +insert into Tags (Title) values ('Eclectic'); +SELECT * FROM Tags; + +-- INSERT ITEMTAGS +insert into ItemTags (ItemID, TagID) values (1, 1); +insert into ItemTags (ItemID, TagID) values (2, 2); +insert into ItemTags (ItemID, TagID) values (2, 9); +insert into ItemTags (ItemID, TagID) values (3, 10); +insert into ItemTags (ItemID, TagID) values (4, 4); +insert into ItemTags (ItemID, TagID) values (4, 11); +insert into ItemTags (ItemID, TagID) values (5, 5); +insert into ItemTags (ItemID, TagID) values (5, 12); +insert into ItemTags (ItemID, TagID) values (5, 19); +insert into ItemTags (ItemID, TagID) values (6, 6); +insert into ItemTags (ItemID, TagID) values (6, 13); +insert into ItemTags (ItemID, TagID) values (6, 20); +insert into ItemTags (ItemID, TagID) values (7, 7); +insert into ItemTags (ItemID, TagID) values (7, 14); +insert into ItemTags (ItemID, TagID) values (7, 21); +insert into ItemTags (ItemID, TagID) values (8, 8); +insert into ItemTags (ItemID, TagID) values (8, 15); +insert into ItemTags (ItemID, TagID) values (8, 22); +insert into ItemTags (ItemID, TagID) values (9, 9); +insert into ItemTags (ItemID, TagID) values (9, 16); +insert into ItemTags (ItemID, TagID) values (9, 23); +insert into ItemTags (ItemID, TagID) values (10, 10); +insert into ItemTags (ItemID, TagID) values (10, 17); +insert into ItemTags (ItemID, TagID) values (10, 24); +insert into ItemTags (ItemID, TagID) values (11, 11); +insert into ItemTags (ItemID, TagID) values (11, 18); +insert into ItemTags (ItemID, TagID) values (11, 25); +insert into ItemTags (ItemID, TagID) values (12, 12); +insert into ItemTags (ItemID, TagID) values (12, 19); +insert into ItemTags (ItemID, TagID) values (12, 26); +insert into ItemTags (ItemID, TagID) values (13, 13); +insert into ItemTags (ItemID, TagID) values (13, 20); +insert into ItemTags (ItemID, TagID) values (13, 27); +insert into ItemTags (ItemID, TagID) values (14, 14); +insert into ItemTags (ItemID, TagID) values (14, 21); +insert into ItemTags (ItemID, TagID) values (14, 28); +insert into ItemTags (ItemID, TagID) values (14, 35); +insert into ItemTags (ItemID, TagID) values (15, 15); +insert into ItemTags (ItemID, TagID) values (15, 22); +insert into ItemTags (ItemID, TagID) values (15, 29); +insert into ItemTags (ItemID, TagID) values (15, 36); +insert into ItemTags (ItemID, TagID) values (16, 16); +insert into ItemTags (ItemID, TagID) values (16, 23); +insert into ItemTags (ItemID, TagID) values (16, 30); +insert into ItemTags (ItemID, TagID) values (16, 37); +insert into ItemTags (ItemID, TagID) values (17, 17); +insert into ItemTags (ItemID, TagID) values (17, 24); +insert into ItemTags (ItemID, TagID) values (17, 31); +insert into ItemTags (ItemID, TagID) values (17, 38); +insert into ItemTags (ItemID, TagID) values (18, 18); +insert into ItemTags (ItemID, TagID) values (18, 25); +insert into ItemTags (ItemID, TagID) values (18, 32); +insert into ItemTags (ItemID, TagID) values (18, 39); +insert into ItemTags (ItemID, TagID) values (19, 19); +insert into ItemTags (ItemID, TagID) values (19, 26); +insert into ItemTags (ItemID, TagID) values (19, 33); +insert into ItemTags (ItemID, TagID) values (19, 40); +insert into ItemTags (ItemID, TagID) values (20, 20); +insert into ItemTags (ItemID, TagID) values (20, 27); +insert into ItemTags (ItemID, TagID) values (20, 34); +insert into ItemTags (ItemID, TagID) values (20, 1); +insert into ItemTags (ItemID, TagID) values (21, 21); +insert into ItemTags (ItemID, TagID) values (21, 28); +insert into ItemTags (ItemID, TagID) values (21, 35); +insert into ItemTags (ItemID, TagID) values (21, 2); +insert into ItemTags (ItemID, TagID) values (22, 22); +insert into ItemTags (ItemID, TagID) values (22, 29); +insert into ItemTags (ItemID, TagID) values (22, 36); +insert into ItemTags (ItemID, TagID) values (22, 3); +insert into ItemTags (ItemID, TagID) values (23, 23); +insert into ItemTags (ItemID, TagID) values (23, 30); +insert into ItemTags (ItemID, TagID) values (23, 37); +insert into ItemTags (ItemID, TagID) values (23, 4); +insert into ItemTags (ItemID, TagID) values (23, 11); +insert into ItemTags (ItemID, TagID) values (24, 24); +insert into ItemTags (ItemID, TagID) values (24, 31); +insert into ItemTags (ItemID, TagID) values (24, 38); +insert into ItemTags (ItemID, TagID) values (24, 5); +insert into ItemTags (ItemID, TagID) values (24, 12); +insert into ItemTags (ItemID, TagID) values (25, 25); +insert into ItemTags (ItemID, TagID) values (25, 32); +insert into ItemTags (ItemID, TagID) values (25, 39); +insert into ItemTags (ItemID, TagID) values (25, 6); +insert into ItemTags (ItemID, TagID) values (25, 13); +insert into ItemTags (ItemID, TagID) values (26, 26); +insert into ItemTags (ItemID, TagID) values (26, 33); +insert into ItemTags (ItemID, TagID) values (26, 40); +insert into ItemTags (ItemID, TagID) values (26, 7); +insert into ItemTags (ItemID, TagID) values (26, 14); +insert into ItemTags (ItemID, TagID) values (27, 27); +insert into ItemTags (ItemID, TagID) values (27, 34); +insert into ItemTags (ItemID, TagID) values (27, 1); +insert into ItemTags (ItemID, TagID) values (27, 8); +insert into ItemTags (ItemID, TagID) values (27, 15); +insert into ItemTags (ItemID, TagID) values (28, 28); +insert into ItemTags (ItemID, TagID) values (28, 35); +insert into ItemTags (ItemID, TagID) values (28, 2); +insert into ItemTags (ItemID, TagID) values (28, 9); +insert into ItemTags (ItemID, TagID) values (28, 16); +insert into ItemTags (ItemID, TagID) values (29, 29); +insert into ItemTags (ItemID, TagID) values (29, 36); +insert into ItemTags (ItemID, TagID) values (29, 3); +insert into ItemTags (ItemID, TagID) values (29, 10); +insert into ItemTags (ItemID, TagID) values (29, 17); +insert into ItemTags (ItemID, TagID) values (30, 30); +insert into ItemTags (ItemID, TagID) values (30, 37); +insert into ItemTags (ItemID, TagID) values (30, 4); +insert into ItemTags (ItemID, TagID) values (30, 11); +insert into ItemTags (ItemID, TagID) values (30, 18); +insert into ItemTags (ItemID, TagID) values (31, 31); +insert into ItemTags (ItemID, TagID) values (31, 38); +insert into ItemTags (ItemID, TagID) values (31, 5); +insert into ItemTags (ItemID, TagID) values (31, 12); +insert into ItemTags (ItemID, TagID) values (31, 19); +insert into ItemTags (ItemID, TagID) values (32, 32); +insert into ItemTags (ItemID, TagID) values (32, 39); +insert into ItemTags (ItemID, TagID) values (32, 6); +insert into ItemTags (ItemID, TagID) values (32, 13); +insert into ItemTags (ItemID, TagID) values (32, 20); +insert into ItemTags (ItemID, TagID) values (33, 33); +insert into ItemTags (ItemID, TagID) values (33, 40); +insert into ItemTags (ItemID, TagID) values (33, 7); +insert into ItemTags (ItemID, TagID) values (33, 14); +insert into ItemTags (ItemID, TagID) values (33, 21); +insert into ItemTags (ItemID, TagID) values (34, 34); +insert into ItemTags (ItemID, TagID) values (34, 1); +insert into ItemTags (ItemID, TagID) values (34, 8); +insert into ItemTags (ItemID, TagID) values (34, 15); +insert into ItemTags (ItemID, TagID) values (34, 22); +insert into ItemTags (ItemID, TagID) values (35, 35); +insert into ItemTags (ItemID, TagID) values (35, 2); +insert into ItemTags (ItemID, TagID) values (35, 9); +insert into ItemTags (ItemID, TagID) values (35, 16); +insert into ItemTags (ItemID, TagID) values (35, 23); +insert into ItemTags (ItemID, TagID) values (36, 36); +insert into ItemTags (ItemID, TagID) values (36, 3); +insert into ItemTags (ItemID, TagID) values (36, 10); +insert into ItemTags (ItemID, TagID) values (36, 17); +insert into ItemTags (ItemID, TagID) values (36, 24); +insert into ItemTags (ItemID, TagID) values (37, 37); +insert into ItemTags (ItemID, TagID) values (37, 4); +insert into ItemTags (ItemID, TagID) values (37, 11); +insert into ItemTags (ItemID, TagID) values (37, 18); +insert into ItemTags (ItemID, TagID) values (37, 25); +insert into ItemTags (ItemID, TagID) values (38, 38); +insert into ItemTags (ItemID, TagID) values (38, 5); +insert into ItemTags (ItemID, TagID) values (38, 12); +insert into ItemTags (ItemID, TagID) values (38, 19); +insert into ItemTags (ItemID, TagID) values (38, 26); +insert into ItemTags (ItemID, TagID) values (39, 39); +insert into ItemTags (ItemID, TagID) values (39, 6); +insert into ItemTags (ItemID, TagID) values (39, 13); +insert into ItemTags (ItemID, TagID) values (39, 20); +insert into ItemTags (ItemID, TagID) values (39, 27); +insert into ItemTags (ItemID, TagID) values (40, 40); +insert into ItemTags (ItemID, TagID) values (40, 7); +insert into ItemTags (ItemID, TagID) values (40, 14); +insert into ItemTags (ItemID, TagID) values (40, 21); +insert into ItemTags (ItemID, TagID) values (40, 28); +SELECT * FROM ItemTags; + +-- INSERT SHIPPINGS +insert into Shippings (Carrier, TrackingNum, DateShipped, DateArrived) values ('FedEx', '111918230', '2025-10-12', '2025-04-07'); +insert into Shippings (Carrier, TrackingNum, DateShipped, DateArrived) values ('USPS', '065201611', '2025-03-23', null); +insert into Shippings (Carrier, TrackingNum, DateShipped, DateArrived) values ('UPS', '071122535', '2025-02-16', null); +insert into Shippings (Carrier, TrackingNum, DateShipped, DateArrived) values ('UPS', '043308620', '2025-11-27', '2025-02-06'); +insert into Shippings (Carrier, TrackingNum, DateShipped, DateArrived) values ('USPS', '084309015', '2025-02-14', null); +insert into Shippings (Carrier, TrackingNum, DateShipped, DateArrived) values ('USPS', '091902049', '2025-03-24', null); +insert into Shippings (Carrier, TrackingNum, DateShipped, DateArrived) values ('UPS', '322280485', '2025-05-10', '2024-12-21'); +insert into Shippings (Carrier, TrackingNum, DateShipped, DateArrived) values ('UPS', '091803818', '2025-09-21', '2025-10-06'); +insert into Shippings (Carrier, TrackingNum, DateShipped, DateArrived) values ('UPS', '054001725', '2025-11-12', null); +insert into Shippings (Carrier, TrackingNum, DateShipped, DateArrived) values ('USPS', '271070791', '2025-03-03', null); +insert into Shippings (Carrier, TrackingNum, DateShipped, DateArrived) values ('UPS', '111909825', '2025-02-14', '2025-07-19'); +insert into Shippings (Carrier, TrackingNum, DateShipped, DateArrived) values ('USPS', '082903497', '2025-02-11', '2025-01-14'); +insert into Shippings (Carrier, TrackingNum, DateShipped, DateArrived) values ('FedEx', '053207766', '2025-02-18', '2025-09-19'); +insert into Shippings (Carrier, TrackingNum, DateShipped, DateArrived) values ('FedEx', '042206503', '2025-07-20', '2025-03-23'); +insert into Shippings (Carrier, TrackingNum, DateShipped, DateArrived) values ('FedEx', '082903536', '2025-01-02', null); +insert into Shippings (Carrier, TrackingNum, DateShipped, DateArrived) values ('UPS', '111912197', '2025-04-14', null); +insert into Shippings (Carrier, TrackingNum, DateShipped, DateArrived) values ('USPS', '072401048', '2025-06-30', '2025-09-14'); +insert into Shippings (Carrier, TrackingNum, DateShipped, DateArrived) values ('USPS', '121142850', '2025-01-07', '2025-01-05'); +insert into Shippings (Carrier, TrackingNum, DateShipped, DateArrived) values ('USPS', '063104668', '2025-04-03', '2024-12-31'); +insert into Shippings (Carrier, TrackingNum, DateShipped, DateArrived) values ('FedEx', '071923190', '2025-02-14', '2025-01-02'); +insert into Shippings (Carrier, TrackingNum, DateShipped, DateArrived) values ('UPS', '071925350', '2024-12-30', '2025-10-01'); +insert into Shippings (Carrier, TrackingNum, DateShipped, DateArrived) values ('FedEx', '082908560', '2025-10-25', '2024-12-22'); +insert into Shippings (Carrier, TrackingNum, DateShipped, DateArrived) values ('UPS', '081006201', '2025-05-04', '2024-12-04'); +insert into Shippings (Carrier, TrackingNum, DateShipped, DateArrived) values ('FedEx', '113114595', '2025-11-10', '2024-12-08'); +insert into Shippings (Carrier, TrackingNum, DateShipped, DateArrived) values ('UPS', '091400606', '2025-04-06', null); +insert into Shippings (Carrier, TrackingNum, DateShipped, DateArrived) values ('FedEx', '044103523', '2025-11-17', '2025-08-04'); +insert into Shippings (Carrier, TrackingNum, DateShipped, DateArrived) values ('FedEx', '081206496', '2025-09-20', null); +insert into Shippings (Carrier, TrackingNum, DateShipped, DateArrived) values ('FedEx', '081204281', '2025-06-29', null); +insert into Shippings (Carrier, TrackingNum, DateShipped, DateArrived) values ('UPS', '061105232', '2025-10-17', '2024-12-07'); +insert into Shippings (Carrier, TrackingNum, DateShipped, DateArrived) values ('FedEx', '102103630', '2025-01-10', null); +insert into Shippings (Carrier, TrackingNum, DateShipped, DateArrived) values ('UPS', '072412778', '2025-04-10', null); +insert into Shippings (Carrier, TrackingNum, DateShipped, DateArrived) values ('USPS', '102101111', '2025-05-11', null); +insert into Shippings (Carrier, TrackingNum, DateShipped, DateArrived) values ('FedEx', '113123625', '2025-06-06', null); +insert into Shippings (Carrier, TrackingNum, DateShipped, DateArrived) values ('USPS', '101113935', '2025-03-19', null); +insert into Shippings (Carrier, TrackingNum, DateShipped, DateArrived) values ('UPS', '031317636', '2024-12-20', '2025-08-27'); +insert into Shippings (Carrier, TrackingNum, DateShipped, DateArrived) values ('USPS', '125107079', '2025-10-28', null); +insert into Shippings (Carrier, TrackingNum, DateShipped, DateArrived) values ('FedEx', '123103606', '2025-03-15', '2024-12-17'); +insert into Shippings (Carrier, TrackingNum, DateShipped, DateArrived) values ('FedEx', '081517693', '2025-05-04', null); +insert into Shippings (Carrier, TrackingNum, DateShipped, DateArrived) values ('UPS', '061191848', '2025-07-26', '2025-04-09'); +insert into Shippings (Carrier, TrackingNum, DateShipped, DateArrived) values ('FedEx', '021409567', '2025-05-15', '2024-12-25'); +SELECT * FROM Shippings; + +-- INSERT ORDERS +insert into Orders (GivenByID, ReceiverID, CreatedAt, ShippingId) values (19, 20, '2025-02-19 07:58:27', null); +insert into Orders (GivenByID, ReceiverID, CreatedAt, ShippingId) values (34, 39, '2025-07-07 17:09:11', null); +insert into Orders (GivenByID, ReceiverID, CreatedAt, ShippingId) values (38, 37, '2025-09-05 12:45:25', 24); +insert into Orders (GivenByID, ReceiverID, CreatedAt, ShippingId) values (30, 12, '2025-10-21 04:21:01', null); +insert into Orders (GivenByID, ReceiverID, CreatedAt, ShippingId) values (5, 17, '2024-12-09 15:55:35', null); +insert into Orders (GivenByID, ReceiverID, CreatedAt, ShippingId) values (7, 32, '2025-09-04 11:12:10', null); +insert into Orders (GivenByID, ReceiverID, CreatedAt, ShippingId) values (20, 31, '2025-08-22 12:31:24', null); +insert into Orders (GivenByID, ReceiverID, CreatedAt, ShippingId) values (13, 34, '2025-07-31 05:58:32', 1); +insert into Orders (GivenByID, ReceiverID, CreatedAt, ShippingId) values (10, 5, '2025-08-19 19:01:50', null); +insert into Orders (GivenByID, ReceiverID, CreatedAt, ShippingId) values (31, 27, '2025-01-12 11:46:27', 24); +insert into Orders (GivenByID, ReceiverID, CreatedAt, ShippingId) values (27, 22, '2025-11-01 02:09:36', 39); +insert into Orders (GivenByID, ReceiverID, CreatedAt, ShippingId) values (28, 27, '2025-06-13 20:56:44', null); +insert into Orders (GivenByID, ReceiverID, CreatedAt, ShippingId) values (21, 25, '2025-11-18 07:55:06', 36); +insert into Orders (GivenByID, ReceiverID, CreatedAt, ShippingId) values (37, 9, '2025-10-10 02:14:04', null); +insert into Orders (GivenByID, ReceiverID, CreatedAt, ShippingId) values (18, 8, '2025-08-31 22:18:28', 7); +insert into Orders (GivenByID, ReceiverID, CreatedAt, ShippingId) values (9, 23, '2025-03-18 04:06:18', 10); +insert into Orders (GivenByID, ReceiverID, CreatedAt, ShippingId) values (6, 14, '2025-10-27 13:04:25', null); +insert into Orders (GivenByID, ReceiverID, CreatedAt, ShippingId) values (32, 33, '2025-10-19 23:00:27', 31); +insert into Orders (GivenByID, ReceiverID, CreatedAt, ShippingId) values (18, 28, '2025-02-12 21:37:36', null); +insert into Orders (GivenByID, ReceiverID, CreatedAt, ShippingId) values (38, 31, '2025-06-10 16:54:11', 20); +insert into Orders (GivenByID, ReceiverID, CreatedAt, ShippingId) values (28, 14, '2025-04-30 12:25:51', 26); +insert into Orders (GivenByID, ReceiverID, CreatedAt, ShippingId) values (24, 13, '2025-08-29 08:27:20', 10); +insert into Orders (GivenByID, ReceiverID, CreatedAt, ShippingId) values (36, 38, '2025-01-24 00:21:47', 30); +insert into Orders (GivenByID, ReceiverID, CreatedAt, ShippingId) values (35, 19, '2025-08-04 07:59:49', null); +insert into Orders (GivenByID, ReceiverID, CreatedAt, ShippingId) values (26, 19, '2025-04-30 10:02:05', 15); +insert into Orders (GivenByID, ReceiverID, CreatedAt, ShippingId) values (10, 7, '2025-07-29 21:25:15', null); +insert into Orders (GivenByID, ReceiverID, CreatedAt, ShippingId) values (22, 36, '2025-02-18 14:42:53', 16); +insert into Orders (GivenByID, ReceiverID, CreatedAt, ShippingId) values (9, 24, '2025-03-02 11:48:24', null); +insert into Orders (GivenByID, ReceiverID, CreatedAt, ShippingId) values (17, 15, '2025-09-29 09:33:08', null); +insert into Orders (GivenByID, ReceiverID, CreatedAt, ShippingId) values (31, 16, '2024-12-26 04:54:04', 25); +insert into Orders (GivenByID, ReceiverID, CreatedAt, ShippingId) values (8, 33, '2025-07-22 17:57:32', 9); +insert into Orders (GivenByID, ReceiverID, CreatedAt, ShippingId) values (33, 5, '2025-08-05 09:47:41', null); +insert into Orders (GivenByID, ReceiverID, CreatedAt, ShippingId) values (8, 35, '2025-03-12 10:35:51', 30); +insert into Orders (GivenByID, ReceiverID, CreatedAt, ShippingId) values (22, 36, '2025-01-28 14:50:15', 10); +insert into Orders (GivenByID, ReceiverID, CreatedAt, ShippingId) values (12, 14, '2025-09-22 03:09:00', null); +insert into Orders (GivenByID, ReceiverID, CreatedAt, ShippingId) values (32, 30, '2025-07-30 17:27:00', 4); +insert into Orders (GivenByID, ReceiverID, CreatedAt, ShippingId) values (23, 19, '2024-12-15 01:58:36', 25); +insert into Orders (GivenByID, ReceiverID, CreatedAt, ShippingId) values (23, 16, '2025-01-04 22:53:58', 37); +insert into Orders (GivenByID, ReceiverID, CreatedAt, ShippingId) values (3, 37, '2025-09-10 06:51:50', 28); +insert into Orders (GivenByID, ReceiverID, CreatedAt, ShippingId) values (24, 30, '2025-09-27 08:18:22', null); +SELECT * FROM Orders; + +-- INSERT ORDER ITEMS +insert into OrderItems (OrderID, ItemID) values (1, 1); +insert into OrderItems (OrderID, ItemID) values (2, 2); +insert into OrderItems (OrderID, ItemID) values (3, 3); +insert into OrderItems (OrderID, ItemID) values (4, 4); +insert into OrderItems (OrderID, ItemID) values (5, 5); +insert into OrderItems (OrderID, ItemID) values (6, 6); +insert into OrderItems (OrderID, ItemID) values (7, 7); +insert into OrderItems (OrderID, ItemID) values (8, 8); +insert into OrderItems (OrderID, ItemID) values (9, 9); +insert into OrderItems (OrderID, ItemID) values (10, 10); +insert into OrderItems (OrderID, ItemID) values (11, 11); +insert into OrderItems (OrderID, ItemID) values (12, 12); +insert into OrderItems (OrderID, ItemID) values (13, 13); +insert into OrderItems (OrderID, ItemID) values (14, 14); +insert into OrderItems (OrderID, ItemID) values (15, 15); +insert into OrderItems (OrderID, ItemID) values (16, 16); +insert into OrderItems (OrderID, ItemID) values (17, 17); +insert into OrderItems (OrderID, ItemID) values (18, 18); +insert into OrderItems (OrderID, ItemID) values (19, 19); +insert into OrderItems (OrderID, ItemID) values (20, 20); +insert into OrderItems (OrderID, ItemID) values (21, 21); +insert into OrderItems (OrderID, ItemID) values (22, 22); +insert into OrderItems (OrderID, ItemID) values (23, 23); +insert into OrderItems (OrderID, ItemID) values (24, 24); +insert into OrderItems (OrderID, ItemID) values (25, 25); +insert into OrderItems (OrderID, ItemID) values (26, 26); +insert into OrderItems (OrderID, ItemID) values (27, 27); +insert into OrderItems (OrderID, ItemID) values (28, 28); +insert into OrderItems (OrderID, ItemID) values (29, 29); +insert into OrderItems (OrderID, ItemID) values (30, 30); +SELECT * FROM OrderItems; + +-- INSERT FEEDBACK +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (11, 3, 'Not bad', '2025-05-16 06:31:13', 8); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (10, 5, 'Seller was very understanding and offered a refund', '2025-03-24 04:15:44', 31); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (6, 1, 'but still cute', '2024-12-22 06:05:15', 23); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (4, 1, 'need a replacement', '2025-01-17 09:48:26', 22); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (2, 3, 'need a replacement', '2025-03-09 18:56:52', 28); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (19, 4, 'exceeded my expectations!', '2024-12-05 18:08:46', 12); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (7, 5, 'Packaging was damaged during shipping', '2025-07-01 16:00:07', 35); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (4, 1, 'Item was exactly what I was looking for', '2025-06-13 14:03:55', 31); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (20, 2, 'Exactly what I was looking for', '2025-07-25 01:05:25', 22); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (14, 5, 'Item was exactly as pictured', '2025-04-09 17:37:49', 33); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (20, 2, 'very impressed', '2025-02-15 07:48:49', 20); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (11, 3, 'Item was exactly what I was looking for', '2025-08-15 22:32:51', 35); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (15, 2, 'very satisfied', '2025-06-21 18:40:59', 5); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (10, 1, 'not what I was expecting', '2025-03-25 18:14:51', 25); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (11, 2, 'pleasantly surprised', '2024-12-09 11:18:54', 34); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (14, 5, 'Item was damaged during shipping', '2024-12-29 07:09:14', 13); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (1, 2, 'Product was better than I expected', '2025-10-23 22:50:01', 19); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (16, 5, 'Item arrived damaged', '2025-08-08 03:47:13', 10); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (11, 5, 'A bit disappointed', '2025-03-21 05:48:31', 14); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (7, 1, 'very happy with my purchase', '2025-02-08 05:52:32', 26); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (12, 1, 'but could be better', '2025-05-08 03:20:49', 34); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (5, 1, 'misleading information', '2025-07-03 23:47:02', 31); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (7, 4, 'Seller was very helpful and responsive', '2024-12-17 09:04:44', 12); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (17, 2, 'Product was better than I expected', '2025-12-01 03:14:15', 6); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (1, 2, 'disappointed', '2025-11-15 18:34:48', 18); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (3, 5, 'Item was exactly as pictured', '2025-03-25 02:26:45', 39); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (6, 1, 'Item was exactly as pictured', '2025-01-20 17:41:02', 8); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (17, 1, 'Fast shipping', '2025-08-31 23:08:11', 29); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (8, 2, 'Item was exactly as pictured', '2025-03-02 01:58:08', 36); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (17, 2, 'disappointed', '2025-01-20 20:35:37', 17); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (9, 3, 'but still decent', '2025-09-23 22:07:39', 26); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (16, 4, 'Shipping took longer than expected', '2024-12-03 10:38:45', 26); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (12, 4, 'Quality could be improved', '2025-10-28 06:14:09', 14); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (20, 3, 'Product was better than I expected', '2025-07-05 02:16:36', 19); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (3, 3, 'Overall satisfied with my order', '2025-01-09 07:54:44', 39); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (3, 2, 'Item was damaged during shipping', '2025-02-04 19:37:01', 6); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (3, 3, 'but still usable', '2025-05-04 00:34:26', 30); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (19, 3, 'but it''ll do', '2025-10-18 09:49:28', 25); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (18, 5, 'but still cute', '2025-01-10 19:13:27', 22); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (8, 1, 'Item was damaged during shipping', '2025-11-17 14:31:04', 32); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (4, 3, 'Would buy from this seller again', '2025-04-13 18:58:20', 11); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (2, 3, 'Quality could be improved', '2025-10-24 04:22:30', 39); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (20, 5, 'Great product', '2025-08-26 12:18:02', 19); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (1, 3, 'Fast shipping', '2025-03-19 13:32:25', 29); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (2, 2, 'Exactly what I was looking for', '2025-05-13 06:56:13', 13); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (8, 3, 'very happy with my purchase', '2025-07-14 11:05:05', 34); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (19, 1, 'but it''ll do', '2025-08-05 11:52:33', 22); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (2, 1, 'disappointing', '2025-04-25 12:30:43', 11); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (7, 4, 'Overall satisfied with my order', '2025-01-12 02:18:06', 32); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (17, 2, 'but could be better', '2025-01-05 16:37:40', 34); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (8, 2, 'Item was missing a piece', '2025-06-22 18:05:42', 18); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (17, 5, 'Fast shipping', '2025-11-28 11:37:06', 8); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (4, 1, 'Good value for the price', '2025-08-16 07:22:41', 32); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (4, 2, 'but still nice', '2025-09-21 23:26:17', 5); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (10, 4, 'Item looks different from the photos', '2024-12-21 02:06:10', 6); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (19, 4, 'Seller was friendly and easy to work with', '2025-01-18 02:06:14', 22); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (2, 5, 'Item was damaged during shipping', '2025-10-20 15:01:40', 20); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (18, 2, 'Exactly as described', '2025-05-13 08:50:44', 21); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (18, 2, 'exceeded my expectations!', '2025-11-27 03:42:19', 28); +insert into Feedback (OrderID, Rating, Comment, CreatedAt, CreatedByID) values (15, 2, 'great customer service', '2025-01-07 18:42:59', 11); +SELECT * FROM Feedback; \ No newline at end of file diff --git a/database-files/ngo_db.sql b/database-files/ngo_db.sql deleted file mode 100644 index 2c9bebe085..0000000000 --- a/database-files/ngo_db.sql +++ /dev/null @@ -1,71 +0,0 @@ -DROP DATABASE IF EXISTS ngo_db; -CREATE DATABASE IF NOT EXISTS ngo_db; - -USE ngo_db; - - -CREATE TABLE IF NOT EXISTS WorldNGOs ( - NGO_ID INT AUTO_INCREMENT PRIMARY KEY, - Name VARCHAR(255) NOT NULL, - Country VARCHAR(100) NOT NULL, - Founding_Year INTEGER, - Focus_Area VARCHAR(100), - Website VARCHAR(255) -); - -CREATE TABLE IF NOT EXISTS Projects ( - Project_ID INT AUTO_INCREMENT PRIMARY KEY, - Project_Name VARCHAR(255) NOT NULL, - Focus_Area VARCHAR(100), - Budget DECIMAL(15, 2), - NGO_ID INT, - Start_Date DATE, - End_Date DATE, - FOREIGN KEY (NGO_ID) REFERENCES WorldNGOs(NGO_ID) -); - -CREATE TABLE IF NOT EXISTS Donors ( - Donor_ID INT AUTO_INCREMENT PRIMARY KEY, - Donor_Name VARCHAR(255) NOT NULL, - Donor_Type ENUM('Individual', 'Organization') NOT NULL, - Donation_Amount DECIMAL(15, 2), - NGO_ID INT, - FOREIGN KEY (NGO_ID) REFERENCES WorldNGOs(NGO_ID) -); - -INSERT INTO WorldNGOs (Name, Country, Founding_Year, Focus_Area, Website) -VALUES -('World Wildlife Fund', 'United States', 1961, 'Environmental Conservation', 'https://www.worldwildlife.org'), -('Doctors Without Borders', 'France', 1971, 'Medical Relief', 'https://www.msf.org'), -('Oxfam International', 'United Kingdom', 1995, 'Poverty and Inequality', 'https://www.oxfam.org'), -('Amnesty International', 'United Kingdom', 1961, 'Human Rights', 'https://www.amnesty.org'), -('Save the Children', 'United States', 1919, 'Child Welfare', 'https://www.savethechildren.org'), -('Greenpeace', 'Netherlands', 1971, 'Environmental Protection', 'https://www.greenpeace.org'), -('International Red Cross', 'Switzerland', 1863, 'Humanitarian Aid', 'https://www.icrc.org'), -('CARE International', 'Switzerland', 1945, 'Global Poverty', 'https://www.care-international.org'), -('Habitat for Humanity', 'United States', 1976, 'Affordable Housing', 'https://www.habitat.org'), -('Plan International', 'United Kingdom', 1937, 'Child Rights', 'https://plan-international.org'); - -INSERT INTO Projects (Project_Name, Focus_Area, Budget, NGO_ID, Start_Date, End_Date) -VALUES -('Save the Amazon', 'Environmental Conservation', 5000000.00, 1, '2022-01-01', '2024-12-31'), -('Emergency Medical Aid in Syria', 'Medical Relief', 3000000.00, 2, '2023-03-01', '2023-12-31'), -('Education for All', 'Poverty and Inequality', 2000000.00, 3, '2021-06-01', '2025-05-31'), -('Human Rights Advocacy in Asia', 'Human Rights', 1500000.00, 4, '2022-09-01', '2023-08-31'), -('Child Nutrition Program', 'Child Welfare', 2500000.00, 5, '2022-01-01', '2024-01-01'); - -INSERT INTO Donors (Donor_Name, Donor_Type, Donation_Amount, NGO_ID) -VALUES -('Bill & Melinda Gates Foundation', 'Organization', 10000000.00, 1), -('Elon Musk', 'Individual', 5000000.00, 2), -('Google.org', 'Organization', 2000000.00, 3), -('Open Society Foundations', 'Organization', 3000000.00, 4), -('Anonymous Philanthropist', 'Individual', 1000000.00, 5); - -CREATE TABLE model1_params ( - sequence_number INT, - beta_vals TEXT -); - -INSERT INTO model1_params (sequence_number, beta_vals) VALUES -(1, '[0.25, 0.45, 0.67]'); \ No newline at end of file diff --git a/docker-compose.yaml b/docker-compose.yml similarity index 72% rename from docker-compose.yaml rename to docker-compose.yml index 7dbddc70b9..e2d7dc7412 100644 --- a/docker-compose.yaml +++ b/docker-compose.yml @@ -1,32 +1,39 @@ -name: project-app-team-repo +name: fithub services: app: build: ./app container_name: web-app hostname: web-app - volumes: ["./app/src:/appcode"] + volumes: ["./app/src:/app"] environment: - WATCHPACK_POLLING=true ports: - 8501:8501 + depends_on: + - api + api: build: ./api container_name: web-api hostname: web-api + # mapping on folder - insert into docker like harddrive volumes: ["./api:/apicode"] environment: - WATCHPACK_POLLING=true ports: - 4000:4000 + depends_on: + - db db: env_file: - ./api/.env - image: mysql:9 + image: mysql:8.4 container_name: mysql_db hostname: db + # NO command line needed! volumes: - "./database-files:/docker-entrypoint-initdb.d/:ro" - "mysql_data:/var/lib/mysql" @@ -34,4 +41,4 @@ services: - 3200:3306 volumes: - mysql_data: + mysql_data: \ No newline at end of file diff --git a/fithub.sql b/fithub.sql new file mode 100644 index 0000000000..02d9dbbda3 --- /dev/null +++ b/fithub.sql @@ -0,0 +1,199 @@ + +DROP DATABASE IF EXISTS fithub; +CREATE DATABASE fithub; +USE fithub; + + + +CREATE TABLE User ( + UserID INT AUTO_INCREMENT PRIMARY KEY, + Name VARCHAR(100) NOT NULL, + Email VARCHAR(255) NOT NULL UNIQUE, + Phone VARCHAR(20) NOT NULL, + Address VARCHAR(255) NOT NULL, + DOB DATE NOT NULL, + Gender VARCHAR(20) NOT NULL, + IsActive BOOLEAN NOT NULL +); + + +CREATE TABLE Announcements ( + AnnouncementID INT AUTO_INCREMENT PRIMARY KEY, + UserID INT NOT NULL, + Message TEXT NOT NULL, + AnnouncedAt DATETIME NOT NULL, + FOREIGN KEY (UserID) REFERENCES User(UserID) +); + + +CREATE TABLE Items ( + ItemID INT AUTO_INCREMENT PRIMARY KEY, + Title VARCHAR(255) NOT NULL, + Category VARCHAR(100) NOT NULL, + Description TEXT NOT NULL, + Size VARCHAR(10) NOT NULL, + `Condition` VARCHAR(100) NOT NULL, + Availability VARCHAR(20) NOT NULL, + OwnerID INT NOT NULL, + ListedAt DATETIME NOT NULL, + FOREIGN KEY (OwnerID) REFERENCES User(UserID) +); + + +CREATE TABLE Reports ( + ReportID INT AUTO_INCREMENT PRIMARY KEY, + note TEXT NOT NULL, + severity INT NOT NULL, + resolved BOOLEAN NOT NULL, + ReporterID INT NOT NULL, + ItemID INT NOT NULL, + FOREIGN KEY (ReporterID) REFERENCES User(UserID), + FOREIGN KEY (ItemID) REFERENCES Items(ItemID) +); + +CREATE TABLE Images ( + ImageID INT AUTO_INCREMENT PRIMARY KEY, + ItemID INT NOT NULL, + ImageURL TEXT NOT NULL, + ImageOrderNum INT NOT NULL, + FOREIGN KEY (ItemID) REFERENCES Items(ItemID) +); + + +CREATE TABLE Tags ( + TagID INT AUTO_INCREMENT PRIMARY KEY, + Title VARCHAR(100) NOT NULL +); + + +CREATE TABLE ItemTags ( + ItemID INT NOT NULL, + TagID INT NOT NULL, + PRIMARY KEY (ItemID, TagID), + FOREIGN KEY (ItemID) REFERENCES Items(ItemID), + FOREIGN KEY (TagID) REFERENCES Tags(TagID) +); + + +CREATE TABLE Orders ( + OrderID INT AUTO_INCREMENT PRIMARY KEY, + SenderID INT NOT NULL, + ReceiverID INT NOT NULL, + ItemID INT NOT NULL, + CreatedAt DATETIME NOT NULL, + FOREIGN KEY (SenderID) REFERENCES User(UserID), + FOREIGN KEY (ReceiverID) REFERENCES User(UserID), + FOREIGN KEY (ItemID) REFERENCES Items(ItemID) +); + + +CREATE TABLE Shippings ( + ShippingID INT AUTO_INCREMENT PRIMARY KEY, + OrderID INT NOT NULL, + Carrier VARCHAR(100) NOT NULL, + TrackingNum VARCHAR(255) NOT NULL, + DateShipped DATE NOT NULL, + DateArrived DATE NOT NULL, + FOREIGN KEY (OrderID) REFERENCES Orders(OrderID) +); + + +CREATE TABLE Feedback ( + FeedbackID INT AUTO_INCREMENT PRIMARY KEY, + OrderID INT NOT NULL, + Rating INT NOT NULL, + Comment TEXT NOT NULL, + CreatedAt DATETIME NOT NULL, + FOREIGN KEY (OrderID) REFERENCES Orders(OrderID), + CHECK (Rating BETWEEN 1 AND 5) +); + + +-- Users +INSERT INTO User(Name, Email, Phone, Address, DOB, Gender, IsActive) +VALUES('Lena Park', 'lena@example.com', '5551112222','12 Willow Lane, Brooklyn, NY', '1998-06-15', 'Female', 1), +('Marcus Lee', 'marcus@example.com', '5552223333','89 Cedar St, Seattle, WA', '1995-03-02', 'Male', 1), +('Jade Alvarez', 'jade@example.com', '5553334444','301 Sunset Blvd, Los Angeles, CA', '2000-11-20', 'Female', 1); + +-- Announcements +INSERT INTO Announcements(UserID, Message, AnnouncedAt) +VALUES (1, 'Welcome to FitHub! List your pre-loved fits and swap with the community.', '2025-02-01 09:00:00'), + (2, 'Pro tip: Use aesthetic tags like Y2K, Coquette, or Streetwear so people can find your vibe.', '2025-02-02 15:30:00'), +(3, 'Weekend challenge: Swap at least one item and leave feedback for your partner.', '2025-02-03 18:45:00'); + + +INSERT INTO Items(Title, Category, Description, Size, `Condition`,Availability, OwnerID, ListedAt) +VALUES('Brandy Melville Baby Tee', 't-shirt','y2k white baby tee with tiny blue graphic, super cropped and super cute', 'S', 'Very good', 'swap', 1, '2025-02-04 11:00:00'), + ('Levi''s 501 Straight Jeans', 'jeans', 'vintage light wash levi''s 501 straight leg, perfect everyday denim','M', 'Good', 'trade', 2, '2025-02-04 13:20:00'), +('Zara Oversized Hoodie', 'hoodie','charcoal gray oversized hoodie, cozy streetwear essential, fleece inside','L', 'Excellent', 'swap', 3, '2025-02-05 10:15:00'), +('American Eagle Maxi Skirt', 'skirt','boho floral maxi skirt, soft fabric, elastic waist, very flowy', 'M', 'Good', 'claimed', 1, '2025-02-05 16:40:00'); + + +INSERT INTO Reports(note, severity, resolved, ReporterID, ItemID) +VALUES +('Small stain near hem that wasn''t mentioned, still wearable though.',1, 1, 2, 1), +('Jeans arrived slightly more faded than pictured but still cute.',2, 0, 3, 2), +('Hoodie had a loose thread on cuff, not a big deal.',1, 1, 1, 3); + + +INSERT INTO Images +(ItemID, ImageURL, ImageOrderNum) +VALUES + (1, 'https://example.com/images/brandy_baby_tee_front.jpg', 1), +(2, 'https://example.com/images/levis_501_full.jpg', 1), + (3, 'https://example.com/images/zara_hoodie_flatlay.jpg', 1), +(4, 'https://example.com/images/ae_maxi_skirt_hanger.jpg', 1); + + +INSERT INTO Tags +(Title) +VALUES +('Y2K'), + ('Vintage'), +('Clean Girl'), +('Streetwear'), +('Coquette'), +('Basic'); + + +INSERT INTO ItemTags + (ItemID, TagID) +VALUES + -- Brandy tee → Y2K, Coquette + (1, 1), + (1, 5), + + -- Levi's jeans → Vintage, Streetwear + (2, 2), + (2, 4), + + -- Zara hoodie → Streetwear, Basic + (3, 4), + (3, 6), + + -- AE maxi skirt → Y2K, Clean Girl + (4, 1), + (4, 3); + +-- Orders (swaps/trades between users) +INSERT INTO Orders(SenderID, ReceiverID, ItemID, CreatedAt) +VALUES +(2, 1, 2, '2025-02-06 12:00:00'), +(1, 3, 1, '2025-02-06 14:30:00'), +(3, 2, 3, '2025-02-07 09:45:00'); + +-- Shippings (for each order) +INSERT INTO Shippings (OrderID, Carrier, TrackingNum, DateShipped, DateArrived) +VALUES +(1, 'USPS', 'USPS9400111899223000000001', '2025-02-06', '2025-02-08'), +(2, 'UPS', '1ZSWAP000000000001', '2025-02-06', '2025-02-09'), +(3, 'FedEx','FEDEXTRADE123456789', '2025-02-07', '2025-02-09'); + +-- Feedback (post-swap reviews) +INSERT INTO Feedback + (OrderID, Rating, Comment, CreatedAt) +VALUES +(1, 5, 'Jeans fit perfectly, exactly the vintage vibe I wanted. Would swap again!', '2025-02-09 18:00:00'), +(2, 4, 'Baby tee is so cute and very Y2K. Slightly more cropped than expected but still love it.', '2025-02-10 11:20:00'), + (3, 5, 'Hoodie is insanely soft, looks just like photos. Great communication too.', + '2025-02-10 20:45:00'); diff --git a/public/FitHubLogo+Tagline.png b/public/FitHubLogo+Tagline.png new file mode 100644 index 0000000000..185cdce688 Binary files /dev/null and b/public/FitHubLogo+Tagline.png differ diff --git a/public/FitHublogo.png b/public/FitHublogo.png new file mode 100644 index 0000000000..1e235e3825 Binary files /dev/null and b/public/FitHublogo.png differ