Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
78 changes: 78 additions & 0 deletions lesson_25/createdb/add_users.py
Original file line number Diff line number Diff line change
@@ -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': '[email protected]',
'first_name': 'John',
'last_name': 'Doe',
'password': 'password123'
},
{
'id': str(uuid.uuid4()),
'email': '[email protected]',
'first_name': 'Jane',
'last_name': 'Smith',
'password': 'securepass456'
},
{
'id': str(uuid.uuid4()),
'email': '[email protected]',
'first_name': 'Mike',
'last_name': 'Johnson',
'password': 'mypassword789'
},
{
'id': str(uuid.uuid4()),
'email': '[email protected]',
'first_name': 'Sarah',
'last_name': 'Wilson',
'password': 'libraryuser2024'
},
{
'id': str(uuid.uuid4()),
'email': '[email protected]',
'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']})")
60 changes: 60 additions & 0 deletions lesson_25/createdb/test_queries.py
Original file line number Diff line number Diff line change
@@ -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()
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -17,6 +9,7 @@ public class LibraryDataModel {

public List<MediaItemModel> mediaItems;
public List<LibraryGuestModel> guests;
public List<LibraryUserModel> users;

public List<MediaItem> getMediaItems() {
List<MediaItem> results = new ArrayList<>();
Expand Down
21 changes: 21 additions & 0 deletions lesson_25/db/db_app/src/main/resources/queries/thomasboyle.sql
Original file line number Diff line number Diff line change
@@ -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;
Binary file modified lesson_25/db/db_app/src/main/resources/sqlite/data.db
Binary file not shown.
Loading