diff --git a/app.rb b/app.rb index 1925896..2097c1e 100644 --- a/app.rb +++ b/app.rb @@ -1,9 +1,9 @@ -require 'sinatra/base' -require 'sinatra/reloader' -require_relative './lib/user_repository' -require_relative './lib/dm_repository' -require 'sinatra/flash' -require_relative './lib/database_connection' +require "sinatra/base" +require "sinatra/reloader" +require_relative "./lib/user_repository" +require_relative "./lib/dm_repository" +require "sinatra/flash" +require_relative "./lib/database_connection" DatabaseConnection.connect @@ -14,35 +14,73 @@ class Application < Sinatra::Base register Sinatra::Reloader register Sinatra::Flash enable :sessions - also_reload './lib/user_repository' + also_reload "./lib/user_repository" + also_reload "./lib/dm_repository" end - def check_handle_exists(handle) - user_repo = UserRepository.new - return user_repo.list_handles.include?(handle) - end - - post '/login' do + post "/login" do handle = params[:handle] if check_handle_exists(handle) session[:handle] = handle - redirect '/' + redirect "/" else flash[:invalid_handle] = "Handle Does Not Exist" - redirect '/' + redirect "/" end end - get '/logout' do + get "/logout" do session[:handle] = nil - redirect '/' + redirect "/" end - get '/' do + get "/" do @dm_repo = DMRepository.new - if session[:handle] - @inbox = @dm_repo.find_inbox(session[:handle]) - end + @inbox = @dm_repo.find_inbox(session[:handle]) if session[:handle] return erb(:index) end + + get "/send_message" do + return erb(:send_message) + end + + post "/send_message" do + if !check_handle_exists(params[:recipient_handle]) + flash[:invalid_handle] = "Handle Does Not Exist" + redirect "/send_message" + elsif blocked?(session[:handle], params[:recipient_handle]) + flash[:blocked] = "You are blocked by this user, message can't be sent" + redirect "/send_message" + else + new_dm = DM.new + new_dm.recipient_handle = params[:recipient_handle] + new_dm.contents = params[:contents] + new_dm.sender_handle = session[:handle] + + @dm_repo = DMRepository.new + @dm_repo.add(new_dm) + flash[:message_sent] = "Message sent" + redirect "/send_message" + end + end + + helpers do + def check_handle_exists(handle) + user_repo = UserRepository.new + return user_repo.list_handles.include?(handle) + end + + def blocked?(sender_handle, recipient_handle) + user_repo = UserRepository.new + recipient_id = user_repo.find_id(recipient_handle) + blocked_users = user_repo.find_blocked(recipient_id) + + blocked = false + blocked_users.each do |user| + user.handle == sender_handle ? blocked = true : next + end + + return blocked + end + end end diff --git a/coverage/.last_run.json b/coverage/.last_run.json index a6eee7c..7c979d6 100644 --- a/coverage/.last_run.json +++ b/coverage/.last_run.json @@ -1,5 +1,5 @@ { "result": { - "line": 89.23 + "line": 99.31 } } diff --git a/coverage/.resultset.json b/coverage/.resultset.json index 94e3d26..681fdf4 100644 --- a/coverage/.resultset.json +++ b/coverage/.resultset.json @@ -7,19 +7,30 @@ 1, null, 1, + 2, + 2, + 2, + null, + null, 1, + 3, + null, 1, 1, null, + 1, + 1, null, 1, 1, + null, + 1, 1, null, null, 1, 1, - null, + 1, 1, 1, null, @@ -27,7 +38,6 @@ 1, null, 1, - 1, null, null ] @@ -38,28 +48,38 @@ null, 1, 1, - 3, + 7, null, - 3, - 3, + 7, + 7, null, - 3, + 7, null, - 3, - 4, + 7, + 9, null, null, - 3, + 7, null, null, 1, - 4, - 4, - 4, - 4, - 4, - 4, - 4, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + null, + null, + 1, + 2, + null, + null, + 2, + null, + 2, + null, null, null, null @@ -81,16 +101,58 @@ 1, 1, null, - 4, + 8, null, 1, - 3, - 3, - 3, + 7, + 7, + 7, null, null, + 8, + null, 1, - 3, + 1, + 1, + 1, + 1, + null, + 1, + 1, + null, + 1, + 1, + 1, + null, + null, + 1, + 1, + 1, + 1, + null, + 1, + 1, + null, + 1, + 1, + 1, + null, + null, + 1, + 1, + null, + 1, + 1, + null, + null, + null, + 1, + 1, + 1, + null, + 1, + 1, + null, null, null, 1, @@ -106,9 +168,23 @@ 1, 1, null, + 1, + 1, + null, + 1, + 1, + 1, + null, + null, + 1, + 1, + 1, + 1, null, 1, 1, + null, + 1, 1, 1, null, @@ -122,10 +198,23 @@ null, 1, 1, + 1, + 1, null, 1, 1, null, + 1, + 1, + 1, + null, + 1, + 1, + null, + 1, + 1, + 1, + null, null, null ] @@ -149,35 +238,73 @@ 1, 1, 1, + 1, null, null, 1, - 2, - 2, + 5, + 5, + 4, + 4, + null, + 1, + 1, + null, null, null, 1, - 2, + 0, + 0, + null, + null, + 1, + 11, + 11, + 11, + null, + null, + 1, + 4, + null, + null, + 1, + 3, + 1, + 1, 2, 1, 1, null, 1, 1, + 1, + 1, + null, + 1, + 1, + 1, + 1, null, null, null, 1, - 0, - 0, + 1, + 8, + 8, null, null, 1, - 5, - 5, - 1, + 2, + 2, + 2, + null, + 2, + 2, + 2, + null, + null, + 2, null, - 5, null, null ] @@ -198,12 +325,12 @@ null, null, 1, - 2, - 2, + 8, + 8, null, - 2, - 16, - 2, + 8, + 64, + 8, null, null, null, @@ -213,25 +340,34 @@ null, null, 1, - 6, - 6, - 6, - 6, - 6, - 6, + 3, + 3, + 3, + 3, + 3, + 3, null, null, 1, - 4, + 8, + 8, + 8, + 8, + 8, + 8, null, null, - 4, - 4, + 1, + 6, null, - 4, null, - 8, - 4, + 6, + 6, + null, + 6, + null, + 12, + 6, null, null, 1, @@ -264,18 +400,25 @@ ] }, "/Users/natashabuckham/Projects/Chitter-DMs/lib/user.rb": { + "lines": [ + 1, + 1, + null + ] + }, + "/Users/natashabuckham/Projects/Chitter-DMs/spec/user_repository_spec.rb": { "lines": [ 1, null, 1, - 6, - 6, - 6, + 7, + 7, + 7, null, null, 1, 1, - 6, + 7, null, null, 1, @@ -311,6 +454,15 @@ 1, null, 1, + null, + null, + null, + 1, + 1, + 1, + 1, + null, + 1, 1, null, null, @@ -347,6 +499,6 @@ ] } }, - "timestamp": 1681473835 + "timestamp": 1681571505 } } diff --git a/lib/dm_repository.rb b/lib/dm_repository.rb index cc3d774..4471eed 100644 --- a/lib/dm_repository.rb +++ b/lib/dm_repository.rb @@ -26,4 +26,14 @@ def result_set_to_dm(result_set) return dm end -end \ No newline at end of file + def add(dm) + sql = "INSERT INTO dms + (contents, time, sender_handle, recipient_handle) + VALUES($1, $2, $3, $4);" + params = [dm.contents, dm.time, dm.sender_handle, dm.recipient_handle] + + result_set = DatabaseConnection.exec_params(sql, params) + + end + +end diff --git a/lib/user_repository.rb b/lib/user_repository.rb index 4964b5b..0e2f527 100644 --- a/lib/user_repository.rb +++ b/lib/user_repository.rb @@ -4,9 +4,9 @@ class UserRepository def all sql = 'SELECT * FROM users;' results = DatabaseConnection.exec_params(sql, []) - + users = [] - + results.each{ |record| users << user_builder(record)} return users end @@ -19,29 +19,38 @@ def list_handles results.each{ |record| handles << record['handle'] } return handles end - + # def updated_verified(user) # sql = 'UPDATE users SET verified = $1 WHERE id = $2;' # sql_params = [user.verified, user.id] - # DatabaseConnection.exec_params(sql, sql_params) + # DatabaseConnection.exec_params(sql, sql_params) # end + def find_id(handle) + sql = 'SELECT id FROM users WHERE handle = $1;' + params = [handle] + results = DatabaseConnection.exec_params(sql, params) + user = User.new + user.id = results[0]['id'].to_i + return user.id + end + def find_handle(id) sql = 'SELECT handle FROM users WHERE id = $1;' params = [id] results = DatabaseConnection.exec_params(sql, params) user = User.new - user.handle = results[0]['handle'] + user.handle = results[0]['handle'] return user end - + def find_blocked(id) sql = 'SELECT blocked.blocked_id FROM users JOIN blocked ON users.id = blocked.blocker_id WHERE blocked.blocker_id = $1;' params = [id] results = DatabaseConnection.exec_params(sql, params) - + block_list = [] results.each { |record| block_list << find_handle(record['blocked_id']) } @@ -55,7 +64,7 @@ def remove_from_blocked_list(blocker_id, blocked_id) DatabaseConnection.exec_params(sql, sql_params) return nil end - + def add_to_blocked_list(blocker_id, blocked_id) sql = 'INSERT INTO blocked (blocker_id, blocked_id) VALUES ($1, $2);' @@ -64,7 +73,7 @@ def add_to_blocked_list(blocker_id, blocked_id) return nil end - private + private def user_builder(record) user = User.new @@ -73,5 +82,5 @@ def user_builder(record) user.verified = record['verified'].eql?('t') ? true : false return user end - -end \ No newline at end of file + +end diff --git a/spec/dm_repository_spec.rb b/spec/dm_repository_spec.rb index 6ed6dc0..97ff67b 100644 --- a/spec/dm_repository_spec.rb +++ b/spec/dm_repository_spec.rb @@ -1,27 +1,37 @@ -require 'dm_repository' -require 'dm' +require "dm_repository" +require "dm" def reset_tables - sql = File.read('spec/seeds.sql') - connection = PG.connect({ host: '127.0.0.1', dbname: 'chitter-dms-test' }) + sql = File.read("spec/seeds.sql") + connection = PG.connect({ host: "127.0.0.1", dbname: "chitter-dms-test" }) connection.exec(sql) end RSpec.describe DMRepository do - before(:each) do - reset_tables - end + before(:each) { reset_tables } - it 'returns the inbox for a user' do + it "returns the inbox for a user" do repo = DMRepository.new - dms_bob = repo.find_inbox('Bob') - dms_george = repo.find_inbox('George') + dms_bob = repo.find_inbox("Bob") + dms_george = repo.find_inbox("George") expect(dms_bob.length).to eq 1 - expect(dms_bob.first.contents).to eq 'Hello Bob' + expect(dms_bob.first.contents).to eq "Hello Bob" expect(dms_george.length).to eq 2 - expect(dms_george.first.contents).to eq 'How are you?' + expect(dms_george.first.contents).to eq "How are you?" + end + + it "adds a new DM to the database" do + dm = DM.new + dm.contents = "I am a new DM" + dm.sender_handle = "Bob" + dm.recipient_handle = "Sam" + + repo = DMRepository.new + repo.add(dm) + + expect(repo.find_inbox("Sam").last.contents).to eq "I am a new DM" end end diff --git a/spec/integration/app_spec.rb b/spec/integration/app_spec.rb index bfa46f5..5f6a9c7 100644 --- a/spec/integration/app_spec.rb +++ b/spec/integration/app_spec.rb @@ -1,6 +1,6 @@ -require 'spec_helper' -require 'rack/test' -require_relative '../../app' +require "spec_helper" +require "rack/test" +require_relative "../../app" describe Application do include Rack::Test::Methods @@ -8,47 +8,116 @@ let(:app) { Application.new } def reset_tables - seed_sql = File.read('spec/seeds.sql') - connection = PG.connect({ host: '127.0.0.1', dbname: 'chitter-dms-test' }) + seed_sql = File.read("spec/seeds.sql") + connection = PG.connect({ host: "127.0.0.1", dbname: "chitter-dms-test" }) connection.exec(seed_sql) end - before(:each) do - reset_tables - end + before(:each) { reset_tables } context "GET /" do it "returns the homepage with list of DMs if user is logged in with valid handle" do response = get("/") expect(response.status).to eq 200 - expect(response.body).to include '