diff --git a/lesson_25/createdb/add_users.py b/lesson_25/createdb/add_users.py new file mode 100644 index 000000000..142a9ab3d --- /dev/null +++ b/lesson_25/createdb/add_users.py @@ -0,0 +1,78 @@ +import sqlite3 +import bcrypt +import uuid + +# Create a connection to the SQLite database +conn = sqlite3.connect('../db/db_app/src/main/resources/sqlite/data.db') +cursor = conn.cursor() + +# Create the library_users table +cursor.execute(''' +CREATE TABLE IF NOT EXISTS library_users ( + id TEXT PRIMARY KEY, + email TEXT NOT NULL UNIQUE, + first_name TEXT NOT NULL, + last_name TEXT NOT NULL, + password TEXT NOT NULL +) +''') + +# Sample users data +users = [ + { + 'id': str(uuid.uuid4()), + 'email': 'john.doe@example.com', + 'first_name': 'John', + 'last_name': 'Doe', + 'password': 'password123' + }, + { + 'id': str(uuid.uuid4()), + 'email': 'jane.smith@example.com', + 'first_name': 'Jane', + 'last_name': 'Smith', + 'password': 'securepass456' + }, + { + 'id': str(uuid.uuid4()), + 'email': 'mike.johnson@example.com', + 'first_name': 'Mike', + 'last_name': 'Johnson', + 'password': 'mypassword789' + }, + { + 'id': str(uuid.uuid4()), + 'email': 'sarah.wilson@example.com', + 'first_name': 'Sarah', + 'last_name': 'Wilson', + 'password': 'libraryuser2024' + }, + { + 'id': str(uuid.uuid4()), + 'email': 'admin@library.org', + 'first_name': 'Library', + 'last_name': 'Admin', + 'password': 'adminpass2024' + } +] + +# Insert users with bcrypt hashed passwords +for user in users: + # Hash the password using bcrypt + password_bytes = user['password'].encode('utf-8') + salt = bcrypt.gensalt() + hashed_password = bcrypt.hashpw(password_bytes, salt) + + cursor.execute(''' + INSERT OR REPLACE INTO library_users (id, email, first_name, last_name, password) + VALUES (?, ?, ?, ?, ?) + ''', (user['id'], user['email'], user['first_name'], user['last_name'], hashed_password.decode('utf-8'))) + +# Commit the changes and close the connection +conn.commit() +conn.close() + +print("Library users table created and populated with 5 users!") +print("Users created:") +for user in users: + print(f"- {user['first_name']} {user['last_name']} ({user['email']})") diff --git a/lesson_25/createdb/test_queries.py b/lesson_25/createdb/test_queries.py new file mode 100644 index 000000000..a613ceecd --- /dev/null +++ b/lesson_25/createdb/test_queries.py @@ -0,0 +1,60 @@ +import sqlite3 + +# Connect to the database +conn = sqlite3.connect('../db/db_app/src/main/resources/sqlite/data.db') +cursor = conn.cursor() + +print("=== Testing SQL Queries ===\n") + +# Query 1: Count of media items by type +print("Query 1: Count of media items by type") +cursor.execute(""" +SELECT type, COUNT(*) as count +FROM media_items +GROUP BY type +ORDER BY count DESC; +""") +results = cursor.fetchall() +for row in results: + print(f" {row[0]}: {row[1]}") +print() + +# Query 2: Sum of total pages checked out by guests +print("Query 2: Sum of total pages checked out by guests") +cursor.execute(""" +SELECT SUM(mi.pages) as total_pages_checked_out +FROM checked_out_items co +JOIN media_items mi ON co.item_id = mi.id +WHERE mi.pages IS NOT NULL AND mi.pages > 0; +""") +result = cursor.fetchone() +print(f" Total pages checked out: {result[0] if result[0] else 0}") +print() + +# Query 3: Show all 5 guests and any corresponding records in the checked_out_items table +print("Query 3: Show all 5 guests and any corresponding records in the checked_out_items table") +cursor.execute(""" +SELECT g.name, g.email, g.type, co.item_id, co.due_date +FROM guests g +LEFT JOIN checked_out_items co ON g.email = co.email +ORDER BY g.name; +""") +results = cursor.fetchall() +for row in results: + item_id = row[3] if row[3] else "None" + due_date = row[4] if row[4] else "None" + print(f" {row[0]} ({row[1]}) [{row[2]}] - Item: {item_id}, Due: {due_date}") +print() + +# Bonus: Show library users +print("Bonus: Library Users") +cursor.execute(""" +SELECT id, email, first_name, last_name +FROM library_users +ORDER BY last_name, first_name; +""") +results = cursor.fetchall() +for row in results: + print(f" {row[2]} {row[3]} ({row[1]}) - ID: {row[0][:8]}...") + +conn.close() diff --git a/lesson_25/db/db_app/src/main/java/com/codedifferently/lesson25/models/LibraryDataModel.java b/lesson_25/db/db_app/src/main/java/com/codedifferently/lesson25/models/LibraryDataModel.java index 6c268f962..36f800673 100644 --- a/lesson_25/db/db_app/src/main/java/com/codedifferently/lesson25/models/LibraryDataModel.java +++ b/lesson_25/db/db_app/src/main/java/com/codedifferently/lesson25/models/LibraryDataModel.java @@ -1,13 +1,5 @@ package com.codedifferently.lesson25.models; -import com.codedifferently.lesson25.library.Book; -import com.codedifferently.lesson25.library.Dvd; -import com.codedifferently.lesson25.library.Librarian; -import com.codedifferently.lesson25.library.LibraryGuest; -import com.codedifferently.lesson25.library.Magazine; -import com.codedifferently.lesson25.library.MediaItem; -import com.codedifferently.lesson25.library.Newspaper; -import com.codedifferently.lesson25.library.Patron; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -17,6 +9,7 @@ public class LibraryDataModel { public List mediaItems; public List guests; + public List users; public List getMediaItems() { List results = new ArrayList<>(); diff --git a/lesson_25/db/db_app/src/main/resources/queries/thomasboyle.sql b/lesson_25/db/db_app/src/main/resources/queries/thomasboyle.sql new file mode 100644 index 000000000..0494e629f --- /dev/null +++ b/lesson_25/db/db_app/src/main/resources/queries/thomasboyle.sql @@ -0,0 +1,21 @@ +-- SQL Queries for Lesson 25 Database Assignment +-- Author: GitHub Copilot +-- Date: October 10, 2025 + +-- Query 1: Count of media items by type +SELECT type, COUNT(*) as count +FROM media_items +GROUP BY type +ORDER BY count DESC; + +-- Query 2: Sum of total pages checked out by guests +SELECT SUM(mi.pages) as total_pages_checked_out +FROM checked_out_items co +JOIN media_items mi ON co.item_id = mi.id +WHERE mi.pages IS NOT NULL AND mi.pages > 0; + +-- Query 3: Show all 5 guests and any corresponding records in the checked_out_items table +SELECT g.name, g.email, g.type, co.item_id, co.due_date +FROM guests g +LEFT JOIN checked_out_items co ON g.email = co.email +ORDER BY g.name; \ No newline at end of file diff --git a/lesson_25/db/db_app/src/main/resources/sqlite/data.db b/lesson_25/db/db_app/src/main/resources/sqlite/data.db index 8baa982d2..ca2e5a903 100644 Binary files a/lesson_25/db/db_app/src/main/resources/sqlite/data.db and b/lesson_25/db/db_app/src/main/resources/sqlite/data.db differ