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
93 changes: 93 additions & 0 deletions app.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
require_relative 'lib/order_repository'
require_relative 'lib/item_repository'
require_relative 'lib/database_connection'


class Application
def initialize(database_name, io, item_repository, order_repository)
DatabaseConnection.connect(database_name)
@io = io
@item_repository = item_repository
@order_repository = order_repository
end

def run
print_menu
user_input = @io.gets.chomp.to_i

case user_input
when 1
list_all_items
when 2
create_new_item
when 3
list_all_orders
when 4
create_new_order
end

end

private

def print_menu
@io.puts (
"Welcome to the shop management program!

What do you want to do?
1 = list all shop items
2 = create a new item
3 = list all orders
4 = create a new order"
)
end

def list_all_items
@item_repository.all.each do |record|
@io.puts("##{record.id} #{record.name} - Unit price: #{record.unit_price} - Quantity: #{record.quantity}")
end
end

def create_new_item
new_item = Item.new

@io.puts "Please enter the new item's name:"
new_item.name = @io.gets.chomp
@io.puts "Please enter the new item's unit price:"
new_item.unit_price = @io.gets.chomp.to_f
@io.puts "Please enter the new item's quantity:"
new_item.quantity = @io.gets.chomp.to_i

@item_repository.create(new_item)
end

def list_all_orders
@order_repository.all.each do |record|
@io.puts("Date: #{record.date} - Order ID #{record.id} - Customer Name: #{record.customer_name} - item_id: #{record.item_id}")
end
end

def create_new_order
new_order = Order.new

@io.puts "Please enter the date (YYYY-MM-DD):"
new_order.date = @io.gets.chomp
@io.puts "Please enter the customer's name:"
new_order.customer_name = @io.gets.chomp
@io.puts "Please enter the item ID:"
new_order.item_id = @io.gets.chomp.to_i

@order_repository.create(new_order)
end

end

if __FILE__ == $0
app = Application.new(
'shop_manager',
Kernel,
ItemRepository.new,
OrderRepository.new
)
app.run
end
28 changes: 28 additions & 0 deletions lib/database_connection.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# file: lib/database_connection.rb

require 'pg'

# This class is a thin "wrapper" around the
# PG library. We'll use it in our project to interact
# with the database using SQL.

class DatabaseConnection
# This method connects to PostgreSQL using the
# PG gem. We connect to 127.0.0.1, and select
# the database name given in argument.
def self.connect(database_name)
@connection = PG.connect({ host: '127.0.0.1', dbname: database_name })
end

# This method executes an SQL query
# on the database, providing some optional parameters
# (you will learn a bit later about when to provide these parameters).
def self.exec_params(query, params)
if @connection.nil?
raise 'DatabaseConnection.exec_params: Cannot run a SQL query as the connection to'\
'the database was never opened. Did you make sure to call first the method '\
'`DatabaseConnection.connect` in your app.rb file (or in your tests spec_helper.rb)?'
end
@connection.exec_params(query, params)
end
end
3 changes: 3 additions & 0 deletions lib/item.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
class Item
attr_accessor :id, :name, :unit_price, :quantity
end
61 changes: 61 additions & 0 deletions lib/item_repository.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
require_relative 'database_connection'
require_relative 'item'

class ItemRepository

# Selecting all records
# No arguments
def all
# Executes the SQL query:
# SELECT id, name, unit_price, quantity FROM items;
sql = 'SELECT id, name, unit_price, quantity FROM items;'
sql_params = []

result_set = DatabaseConnection.exec_params(sql,sql_params)

items = []

result_set.each do |record|
items << get_item(record)
end

return items
end

# Gets a single record by its ID
# One argument: the id (number)
def find(id)
# Executes the SQL query:
# SELECT id, name, unit_cost, quantity FROM items WHERE id = $1;
sql = 'SELECT id, name, unit_price, quantity FROM items WHERE id = $1;'
sql_params = [id]

result = DatabaseConnection.exec_params(sql,sql_params)

return get_item(result[0])
end

def create(item)
# Executes the SQL query:
# INSERT INTO items (name, unit_cost, quantity) VALUES ($1, $2, $3);
sql = 'INSERT INTO items (name, unit_price, quantity) VALUES ($1, $2, $3);'
sql_params = [item.name, item.unit_price, item.quantity]

result = DatabaseConnection.exec_params(sql,sql_params)

return nil
end

private

def get_item(record)
item = Item.new
item.id = record['id'].to_i
item.name = record['name']
item.unit_price = record['unit_price'].to_f
item.quantity = record['quantity'].to_i

return item
end

end
3 changes: 3 additions & 0 deletions lib/order.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
class Order
attr_accessor :id, :customer_name, :date, :item_id
end
64 changes: 64 additions & 0 deletions lib/order_repository.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
require_relative 'database_connection'
require_relative 'order'

class OrderRepository

# Selecting all records
# No arguments
def all
# Executes the SQL query:
# SELECT id, customer_name, date, item_id FROM orders;

sql = 'SELECT id, customer_name, date, item_id FROM orders;'
sql_params = []

result_set = DatabaseConnection.exec_params(sql,sql_params)

orders = []

result_set.each do |record|
orders << get_order(record)
end

return orders

end

# Gets a single record by its ID
# One argument: the id (number)
def find(id)
# Executes the SQL query:
# SELECT id, customer_name, date, item_id FROM orders WHERE id = $1;
sql = 'SELECT id, customer_name, date, item_id FROM orders WHERE id = $1;'
sql_params = [id]

result = DatabaseConnection.exec_params(sql,sql_params)

return get_order(result[0])

end

def create(order)
# Executes the SQL query:
# INSERT INTO orders (customer_name, date, item_id) VALUES ($1, $2, $3);
sql = 'INSERT INTO orders (customer_name, date, item_id) VALUES ($1, $2, $3);'
sql_params = [order.customer_name, order.date, order.item_id]

result = DatabaseConnection.exec_params(sql,sql_params)

return nil

end

private

def get_order(record)
order = Order.new
order.id = record['id'].to_i
order.customer_name = record['customer_name']
order.date = record['date']
order.item_id = record['item_id'].to_i

return order
end
end
Loading