diff --git a/Gemfile b/Gemfile index b1a320395a..7f798f82e6 100644 --- a/Gemfile +++ b/Gemfile @@ -11,3 +11,10 @@ end group :development, :test do gem 'rubocop', '1.20' end + +gem "sinatra", "~> 3.0" +gem "sinatra-contrib", "~> 3.0" +gem "webrick", "~> 1.8" +gem "rack-test", "~> 2.1" +gem 'bcrypt', '~> 3.1' +gem 'pg', '~> 1.2' diff --git a/Gemfile.lock b/Gemfile.lock index 66064703c7..61581e1b77 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -3,11 +3,20 @@ GEM specs: ansi (1.5.0) ast (2.4.2) + bcrypt (3.1.18) diff-lcs (1.4.4) docile (1.4.0) + multi_json (1.15.0) + mustermann (3.0.0) + ruby2_keywords (~> 0.0.1) parallel (1.20.1) parser (3.0.2.0) ast (~> 2.4.1) + rack (2.2.6.4) + rack-protection (3.0.5) + rack + rack-test (2.1.0) + rack (>= 1.3) rainbow (3.0.0) regexp_parser (2.1.1) rexml (3.2.5) @@ -36,6 +45,7 @@ GEM rubocop-ast (1.11.0) parser (>= 3.0.1.1) ruby-progressbar (1.11.0) + ruby2_keywords (0.0.5) simplecov (0.21.2) docile (~> 1.1) simplecov-html (~> 0.11) @@ -46,21 +56,39 @@ GEM terminal-table simplecov-html (0.12.3) simplecov_json_formatter (0.1.3) + sinatra (3.0.5) + mustermann (~> 3.0) + rack (~> 2.2, >= 2.2.4) + rack-protection (= 3.0.5) + tilt (~> 2.0) + sinatra-contrib (3.0.5) + multi_json + mustermann (~> 3.0) + rack-protection (= 3.0.5) + sinatra (= 3.0.5) + tilt (~> 2.0) terminal-table (3.0.1) unicode-display_width (>= 1.1.1, < 3) + tilt (2.1.0) unicode-display_width (2.0.0) + webrick (1.8.1) PLATFORMS ruby DEPENDENCIES + bcrypt (~> 3.1) + rack-test (~> 2.1) rspec rubocop (= 1.20) simplecov simplecov-console + sinatra (~> 3.0) + sinatra-contrib (~> 3.0) + webrick (~> 1.8) RUBY VERSION ruby 3.0.2p107 BUNDLED WITH - 2.2.26 + 2.4.10 diff --git a/README.md b/README.md index 465eda879b..5a44d13122 100644 --- a/README.md +++ b/README.md @@ -1,123 +1,21 @@ -Chitter Challenge -================= - -* Feel free to use Google, your notes, books, etc. but work on your own -* If you refer to the solution of another coach or student, please put a link to that in your README -* If you have a partial solution, **still check in a partial solution** -* You must submit a pull request to this repo with your code by 10am Monday morning - -Challenge: -------- - -As usual please start by forking this repo. - -We are going to write a small Twitter clone that will allow the users to post messages to a public stream. - -Features: -------- - -``` -STRAIGHT UP - -As a Maker -So that I can let people know what I am doing -I want to post a message (peep) to chitter - -As a maker -So that I can see what others are saying -I want to see all peeps in reverse chronological order - -As a Maker -So that I can better appreciate the context of a peep -I want to see the time at which it was made - -As a Maker -So that I can post messages on Chitter as me -I want to sign up for Chitter - -HARDER - -As a Maker -So that only I can post messages on Chitter as me -I want to log in to Chitter - -As a Maker -So that I can avoid others posting messages on Chitter as me -I want to log out of Chitter - -ADVANCED - -As a Maker -So that I can stay constantly tapped in to the shouty box of Chitter -I want to receive an email if I am tagged in a Peep -``` - -Technical Approach: ------ - -In the last two weeks, you integrated a database using the `pg` gem and Repository classes. You also implemented small web applications using Sinatra, RSpec, HTML and ERB views to make dynamic webpages. You can continue to use this approach when building Chitter Challenge. - -You can refer to the [guidance on Modelling and Planning a web application](https://github.com/makersacademy/web-applications/blob/main/pills/modelling_and_planning_web_application.md), to help you in planning the different web pages you will need to implement this challenge. If you'd like to deploy your app to Heroku so other people can use it, [you can follow this guidance](https://github.com/makersacademy/web-applications/blob/main/html_challenges/07_deploying.md). - -If you'd like more technical challenge now, try using an [Object Relational Mapper](https://en.wikipedia.org/wiki/Object-relational_mapping) as the database interface, instead of implementing your own Repository classes. - -Some useful resources: -**Ruby Object Mapper** -- [ROM](https://rom-rb.org/) - -**ActiveRecord** -- [ActiveRecord ORM](https://guides.rubyonrails.org/active_record_basics.html) -- [Sinatra & ActiveRecord setup](https://learn.co/lessons/sinatra-activerecord-setup) - -Notes on functionality: ------- - -* You don't have to be logged in to see the peeps. -* Makers sign up to chitter with their email, password, name and a username (e.g. samm@makersacademy.com, password123, Sam Morgan, sjmog). -* The username and email are unique. -* Peeps (posts to chitter) have the name of the maker and their user handle. -* Your README should indicate the technologies used, and give instructions on how to install and run the tests. - -Bonus: ------ - -If you have time you can implement the following: - -* In order to start a conversation as a maker I want to reply to a peep from another maker. - -And/Or: - -* Work on the CSS to make it look good. - -Good luck and let the chitter begin! - -Code Review ------------ - -In code review we'll be hoping to see: - -* All tests passing -* High [Test coverage](https://github.com/makersacademy/course/blob/main/pills/test_coverage.md) (>95% is good) -* The code is elegant: every class has a clear responsibility, methods are short etc. - -Reviewers will potentially be using this [code review rubric](docs/review.md). Referring to this rubric in advance may make the challenge somewhat easier. You should be the judge of how much challenge you want at this moment. - -Notes on test coverage ----------------------- - -Please ensure you have the following **AT THE TOP** of your spec_helper.rb in order to have test coverage stats generated -on your pull request: - -```ruby -require 'simplecov' -require 'simplecov-console' - -SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new([ - SimpleCov::Formatter::Console, - # Want a nice code coverage website? Uncomment this next line! - # SimpleCov::Formatter::HTMLFormatter -]) -SimpleCov.start -``` - -You can see your test coverage when you run your tests. If you want this in a graphical form, uncomment the `HTMLFormatter` line and see what happens! +Todo list: + +Must do +- separate CSS from erbs +- clean up code and add comments + - reminder to remove code that isn't being used + - time needs to be parsed in new peeps? +- create README with breakdown of new learnings and credits + - reminder to discuss sessions, bcrypt, and how to use them +- ensure it works on other computers if code copied +- implement advised changes from code review +- ensure rubocop and test coverage is 100% + - rubocop --auto-correct + +Optional +- make styles uniform +- try to use layout erb to extend the objects between pages + +Advanced +- ORM implementation +- reply feature diff --git a/chitter_app.rb b/chitter_app.rb new file mode 100644 index 0000000000..862b0dff69 --- /dev/null +++ b/chitter_app.rb @@ -0,0 +1,98 @@ +require 'sinatra' +require "sinatra/reloader" +require 'bcrypt' +require_relative 'lib/database_connection' +require_relative 'lib/users_repository' +require_relative 'lib/peeps_repository' + +DatabaseConnection.connect + +class ChitterApp < Sinatra::Base + enable :sessions + + helpers do + def current_user + @current_user ||= UserRepository.new.find_user_by_email(session[:email]) + end + end + + configure :development do + register Sinatra::Reloader + also_reload 'lib/users_repository' + also_reload 'lib/peeps_repository' + end + + get '/' do + peeps_repo = PeepRepository.new + @peeps = peeps_repo.all + + # Debug statement + # puts "@peeps: #{@peeps.inspect}" + + return erb(:peep) + end + + get '/signup' do + return erb(:signup) + end + + post '/signup' do + username = params['username'] + name = params['name'] + email = params['email'] + password = params['password'] + password_hash = BCrypt::Password.create(password) + + UserRepository.new.create(username: username, name: name, email: email, +password_hash: password_hash) + + redirect '/login' + end + + get '/login' do + return erb(:login) + end + + post '/login' do + email = params['email'] + password = params['password'] + + user = UserRepository.new.find_user_by_email(email) + + if user.nil? + puts "User not found." + redirect '/login' + else + puts "User: #{user.inspect}" + puts "Entered password: #{password}" + puts "Stored password hash: #{user.password_hash}" + puts "Password comparison result: #{BCrypt::Password.new(user.password_hash) == password}" + end + + if user && BCrypt::Password.new(user.password_hash) == password + session[:user_id] = user.id + session[:email] = user.email + redirect '/loggedin' + else + redirect '/login' + end + end + + get '/loggedin' do + peeps_repo = PeepRepository.new + @peeps = peeps_repo.all + return erb(:loggedin) + end + + get '/logout' do + session.clear + redirect '/' + end + + post '/peeps' do + content = params['content'] + user_id = current_user.id + PeepRepository.new.create(content: content, user_id: user_id) + redirect '/loggedin' + end +end diff --git a/chitter_diagram.png b/chitter_diagram.png new file mode 100644 index 0000000000..fea2574d00 Binary files /dev/null and b/chitter_diagram.png differ diff --git a/chitter_recipe.excalidraw b/chitter_recipe.excalidraw new file mode 100644 index 0000000000..d50982b752 --- /dev/null +++ b/chitter_recipe.excalidraw @@ -0,0 +1,7681 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://excalidraw.com", + "elements": [ + { + "id": "Erss0rPhg8d-bB1MtwgNf", + "type": "text", + "x": 306, + "y": 142, + "width": 710.1194458007812, + "height": 825, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 1085555050, + "version": 19, + "versionNonce": 2141785846, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882668, + "link": null, + "locked": false, + "text": "STRAIGHT UP\n\nAs a Maker\nSo that I can let people know what I am doing \nI want to post a message (peep) to chitter\n\nAs a maker\nSo that I can see what others are saying \nI want to see all peeps in reverse chronological order\n\nAs a Maker\nSo that I can better appreciate the context of a peep\nI want to see the time at which it was made\n\nAs a Maker\nSo that I can post messages on Chitter as me\nI want to sign up for Chitter\n\nHARDER\n\nAs a Maker\nSo that only I can post messages on Chitter as me\nI want to log in to Chitter\n\nAs a Maker\nSo that I can avoid others posting messages on Chitter as me\nI want to log out of Chitter\n\nADVANCED\n\nAs a Maker\nSo that I can stay constantly tapped in to the shouty box of Chitter\nI want to receive an email if I am tagged in a Peep", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "STRAIGHT UP\n\nAs a Maker\nSo that I can let people know what I am doing \nI want to post a message (peep) to chitter\n\nAs a maker\nSo that I can see what others are saying \nI want to see all peeps in reverse chronological order\n\nAs a Maker\nSo that I can better appreciate the context of a peep\nI want to see the time at which it was made\n\nAs a Maker\nSo that I can post messages on Chitter as me\nI want to sign up for Chitter\n\nHARDER\n\nAs a Maker\nSo that only I can post messages on Chitter as me\nI want to log in to Chitter\n\nAs a Maker\nSo that I can avoid others posting messages on Chitter as me\nI want to log out of Chitter\n\nADVANCED\n\nAs a Maker\nSo that I can stay constantly tapped in to the shouty box of Chitter\nI want to receive an email if I am tagged in a Peep", + "lineHeight": 1.25 + }, + { + "id": "RzQru0hmNKiqVeUB6XSXc", + "type": "text", + "x": 307.7353515625, + "y": 79.09765625, + "width": 300.85186767578125, + "height": 45, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 1214500022, + "version": 215, + "versionNonce": 1986790250, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882668, + "link": null, + "locked": false, + "text": "Chitter Challenge", + "fontSize": 36, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Chitter Challenge", + "lineHeight": 1.25 + }, + { + "id": "Zh2gFuqMThL68czZnd860", + "type": "line", + "x": 418.4033203125, + "y": 269.5078125, + "width": 42.2265625, + "height": 1.4501953125, + "angle": 0, + "strokeColor": "#c92a2a", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 1413808362, + "version": 49, + "versionNonce": 2027405366, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882668, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 42.2265625, + -1.4501953125 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "ddpSlyVpxdfgvZqj82jkm", + "type": "line", + "x": 589.9853515625, + "y": 272.37890625, + "width": 43.1787109375, + "height": 0.5078125, + "angle": 0, + "strokeColor": "#c92a2a", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 1523592886, + "version": 40, + "versionNonce": 1907099178, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882668, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 43.1787109375, + -0.5078125 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "mzjS0I5SzivdU2mPS9U0f", + "type": "line", + "x": 418.076171875, + "y": 370.953125, + "width": 58.6376953125, + "height": 1.07421875, + "angle": 0, + "strokeColor": "#c92a2a", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 1368952246, + "version": 79, + "versionNonce": 1402882422, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882668, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 58.6376953125, + -1.07421875 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "bJVkghEr-D3_fYPT01pr6", + "type": "line", + "x": 581.23046875, + "y": 370.7431640625, + "width": 252.59765625, + "height": 0.3466796875, + "angle": 0, + "strokeColor": "#c92a2a", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 272365034, + "version": 70, + "versionNonce": 1935519978, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882668, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 252.59765625, + -0.3466796875 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "WipMGy3zZQ__EHtLz40d2", + "type": "line", + "x": 503.623046875, + "y": 469.2099609375, + "width": 37.197265625, + "height": 0.5224609375, + "angle": 0, + "strokeColor": "#c92a2a", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 2119706666, + "version": 51, + "versionNonce": 1061268150, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882668, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 37.197265625, + -0.5224609375 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "sG9F6743WVgtekWELfaig", + "type": "line", + "x": 717.40234375, + "y": 469.0439453125, + "width": 41.8994140625, + "height": 0.48828125, + "angle": 0, + "strokeColor": "#c92a2a", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 1804450998, + "version": 56, + "versionNonce": 252445610, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882668, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 41.8994140625, + 0.48828125 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "l-WwYWVZBw8kHOCasooPJ", + "type": "line", + "x": 418.9013671875, + "y": 574.6103515625, + "width": 62.63671875, + "height": 0.2783203125, + "angle": 0, + "strokeColor": "#c92a2a", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 1899070902, + "version": 58, + "versionNonce": 979821558, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882668, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 62.63671875, + 0.2783203125 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "R4gJZMLDQTpQySaftz95R", + "type": "line", + "x": 416.728515625, + "y": 723.111328125, + "width": 45.7568359375, + "height": 1.9091796875, + "angle": 0, + "strokeColor": "#c92a2a", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 181897206, + "version": 63, + "versionNonce": 786562666, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882668, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 45.7568359375, + -1.9091796875 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "ls2-k-QJiESBpveAn_dSU", + "type": "line", + "x": 419.736328125, + "y": 823.1845703125, + "width": 56.71875, + "height": 1.3525390625, + "angle": 0, + "strokeColor": "#c92a2a", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 388627562, + "version": 68, + "versionNonce": 655553846, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882668, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 56.71875, + 1.3525390625 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "YbSOYIss5XDM7nds2B5mH", + "type": "line", + "x": 417.2314453125, + "y": 971.51953125, + "width": 146.6064453125, + "height": 2.646484375, + "angle": 0, + "strokeColor": "#c92a2a", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 636698550, + "version": 120, + "versionNonce": 1068146986, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882668, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 146.6064453125, + -2.646484375 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "7A1b_B81tnSerNaOeKr2X", + "type": "line", + "x": 665.986328125, + "y": 970.7724609375, + "width": 64.541015625, + "height": 0.6884765625, + "angle": 0, + "strokeColor": "#c92a2a", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 740896950, + "version": 50, + "versionNonce": 1588256374, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882668, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 64.541015625, + 0.6884765625 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "g0Pk0HtmAs8AFdMYbLA7a", + "type": "rectangle", + "x": 291.0107421875, + "y": 1021.802734375, + "width": 953.1884765625, + "height": 234.3359375, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 3 + }, + "seed": 406964470, + "version": 117, + "versionNonce": 2086657706, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "p0nesWMWDCHn0xjOYxm6a" + } + ], + "updated": 1681401882668, + "link": null, + "locked": false + }, + { + "id": "p0nesWMWDCHn0xjOYxm6a", + "type": "text", + "x": 296.0107421875, + "y": 1038.970703125, + "width": 940.5592041015625, + "height": 200, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 1405776950, + "version": 33, + "versionNonce": 1628584182, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882668, + "link": null, + "locked": false, + "text": "The Chitter app needs to provide the following features:\n\n- Allow users to post messages (peeps) to Chitter.\n- Display all peeps in reverse chronological order, along with the time at which they were made.\n- Allow users to sign up for Chitter to post messages as themselves.\n- Provide a login feature to ensure that only the user can post messages as themselves.\n- Provide a logout feature to prevent others from posting messages as the user.\n- Send an email notification to the user when they are tagged in a peep.", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "middle", + "containerId": "g0Pk0HtmAs8AFdMYbLA7a", + "originalText": "The Chitter app needs to provide the following features:\n\n- Allow users to post messages (peeps) to Chitter.\n- Display all peeps in reverse chronological order, along with the time at which they were made.\n- Allow users to sign up for Chitter to post messages as themselves.\n- Provide a login feature to ensure that only the user can post messages as themselves.\n- Provide a logout feature to prevent others from posting messages as the user.\n- Send an email notification to the user when they are tagged in a peep.", + "lineHeight": 1.25 + }, + { + "id": "DRnkoJocLNjZvJVM0Xtx9", + "type": "rectangle", + "x": 289.4517299107143, + "y": 1705.0916573660716, + "width": 203, + "height": 828, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 3 + }, + "seed": 1611584182, + "version": 373, + "versionNonce": 695686954, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "Nf_MTrSLa32Tmeb4-E-1E" + }, + { + "id": "catRYX0EKm2BglMj28WbD", + "type": "arrow" + }, + { + "id": "_ldgIydhnAHIk2LoQ7pVi", + "type": "arrow" + }, + { + "id": "GIoPW03qRzRrTBygGeJi9", + "type": "arrow" + } + ], + "updated": 1681401882669, + "link": null, + "locked": false + }, + { + "id": "Nf_MTrSLa32Tmeb4-E-1E", + "type": "text", + "x": 331.73178209577287, + "y": 2106.5916573660716, + "width": 118.43989562988281, + "height": 25, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 202699370, + "version": 335, + "versionNonce": 1303152758, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882669, + "link": null, + "locked": false, + "text": "Web browser", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "DRnkoJocLNjZvJVM0Xtx9", + "originalText": "Web browser", + "lineHeight": 1.25 + }, + { + "id": "RGrx7SGDLKySphbED1vSy", + "type": "rectangle", + "x": 591.0867745535713, + "y": 2185.192103794643, + "width": 275, + "height": 335, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 3 + }, + "seed": 1890014646, + "version": 460, + "versionNonce": 395764202, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "UN7eO4JfQJOu-AtdtgwyZ" + }, + { + "id": "3v6c8m7MRQ5DdRyT2upPN", + "type": "arrow" + }, + { + "id": "_ldgIydhnAHIk2LoQ7pVi", + "type": "arrow" + } + ], + "updated": 1681401882669, + "link": null, + "locked": false + }, + { + "id": "UN7eO4JfQJOu-AtdtgwyZ", + "type": "text", + "x": 597.2668892996651, + "y": 2227.692103794643, + "width": 262.6397705078125, + "height": 250, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 1349159082, + "version": 597, + "versionNonce": 2066745782, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882669, + "link": null, + "locked": false, + "text": "Render\nDeployment\n\n- clones the finished repo\n- have to insert the \nPostgreSQL DB data\n\n- runs the application \nremotely using Sinatra and\ndeploys to the internet", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "RGrx7SGDLKySphbED1vSy", + "originalText": "Render\nDeployment\n\n- clones the finished repo\n- have to insert the PostgreSQL DB data\n\n- runs the application remotely using Sinatra and deploys to the internet", + "lineHeight": 1.25 + }, + { + "id": "_PhyOH3PGEtNuxDoQ5Lbi", + "type": "rectangle", + "x": 1263.010463169643, + "y": 1715.2290736607144, + "width": 269, + "height": 841, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 3 + }, + "seed": 1900533494, + "version": 976, + "versionNonce": 385291434, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "yHWfcb5HyYFNGuhbJUbMY" + }, + { + "id": "yfxj72drLjuGVxlmwYr1-", + "type": "arrow" + }, + { + "id": "SXSmYGNRl5kqPkQKYfvKY", + "type": "arrow" + }, + { + "id": "wk8N-x3pBevlLDHRtigKr", + "type": "arrow" + }, + { + "id": "o5GjE8yiL9wPFTZbmTuKr", + "type": "arrow" + } + ], + "updated": 1681401882669, + "link": null, + "locked": false + }, + { + "id": "yHWfcb5HyYFNGuhbJUbMY", + "type": "text", + "x": 1268.8206133161273, + "y": 1960.7290736607144, + "width": 257.37969970703125, + "height": 350, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 150846314, + "version": 1378, + "versionNonce": 1194418934, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882669, + "link": null, + "locked": false, + "text": "Application\n\n- chitter_app.rb\n\n- users.rb\n- users_repository.rb\n\n- peeps.rb\n- peeps_repository.rb\n\n- notifications.rb\n- \nnotifications_repository.rb\n", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "_PhyOH3PGEtNuxDoQ5Lbi", + "originalText": "Application\n\n- chitter_app.rb\n\n- users.rb\n- users_repository.rb\n\n- peeps.rb\n- peeps_repository.rb\n\n- notifications.rb\n- notifications_repository.rb\n", + "lineHeight": 1.25 + }, + { + "id": "NLCYqAGLDu43Af0KeXdTA", + "type": "rectangle", + "x": 1698.7067522321408, + "y": 1717.7300502232144, + "width": 348, + "height": 826, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 3 + }, + "seed": 55510070, + "version": 903, + "versionNonce": 155381610, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "u6Z5lkp7W8NtlpahuYvsg" + }, + { + "id": "o5GjE8yiL9wPFTZbmTuKr", + "type": "arrow" + } + ], + "updated": 1681401882669, + "link": null, + "locked": false + }, + { + "id": "u6Z5lkp7W8NtlpahuYvsg", + "type": "text", + "x": 1736.9068559919065, + "y": 1805.7300502232144, + "width": 271.59979248046875, + "height": 650, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 1614479914, + "version": 1347, + "versionNonce": 1412797494, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882669, + "link": null, + "locked": false, + "text": "\nChitter PostgreSQL\nDB\n(chitter & chitter_test)\n\nTables:\n\nusers\n- id PRIMARY KEY\n- name VARCHAR\n- username VARCHAR\n- email VARCHAR\n- password_hash CHAR\n\npeeps\n- id PRIMARY KEY\n- content TEXT\n- created_at TIMESTAMP\n- user_id INTEGER (FK)\n\nnotifications\n- id PRIMARY KEY\n- user_id INTEGER (FK)\n- peed_id INTEGER (FK)\ncreated_at TIMESTAMP\n", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "NLCYqAGLDu43Af0KeXdTA", + "originalText": "\nChitter PostgreSQL\nDB\n(chitter & chitter_test)\n\nTables:\n\nusers\n- id PRIMARY KEY\n- name VARCHAR\n- username VARCHAR\n- email VARCHAR\n- password_hash CHAR\n\npeeps\n- id PRIMARY KEY\n- content TEXT\n- created_at TIMESTAMP\n- user_id INTEGER (FK)\n\nnotifications\n- id PRIMARY KEY\n- user_id INTEGER (FK)\n- peed_id INTEGER (FK)\ncreated_at TIMESTAMP\n", + "lineHeight": 1.25 + }, + { + "id": "9cYehTYK7Zh088eqDC6_X", + "type": "rectangle", + "x": 239.2561848958332, + "y": 3928.063848586309, + "width": 348, + "height": 255, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 3 + }, + "seed": 1124296170, + "version": 1278, + "versionNonce": 1657106986, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "YtU1d_hJRd6ne94D_n1kr" + } + ], + "updated": 1681401882669, + "link": null, + "locked": false + }, + { + "id": "YtU1d_hJRd6ne94D_n1kr", + "type": "text", + "x": 291.63630421956367, + "y": 4018.063848586309, + "width": 243.23976135253906, + "height": 75, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 1841153462, + "version": 1508, + "versionNonce": 740400502, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882669, + "link": null, + "locked": false, + "text": "Chitter PostgreSQL\nDB\n(chitter & chitter_test)", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "9cYehTYK7Zh088eqDC6_X", + "originalText": "Chitter PostgreSQL\nDB\n(chitter & chitter_test)", + "lineHeight": 1.25 + }, + { + "id": "zRa3lRHWrbZ0wuyfoZKW3", + "type": "rectangle", + "x": 590.1462053571427, + "y": 1774.0731026785718, + "width": 270, + "height": 193, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 3 + }, + "seed": 1057552682, + "version": 597, + "versionNonce": 1413119670, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "v4jOKIbAWiRzQDL-aPTHM" + }, + { + "id": "GIoPW03qRzRrTBygGeJi9", + "type": "arrow" + }, + { + "id": "fbTIByj_h25InX40X7eva", + "type": "arrow" + }, + { + "id": "SXSmYGNRl5kqPkQKYfvKY", + "type": "arrow" + } + ], + "updated": 1681401882669, + "link": null, + "locked": false + }, + { + "id": "v4jOKIbAWiRzQDL-aPTHM", + "type": "text", + "x": 688.9162325177872, + "y": 1858.0731026785718, + "width": 72.45994567871094, + "height": 25, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 1551183466, + "version": 560, + "versionNonce": 28995498, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882669, + "link": null, + "locked": false, + "text": "Sinatra", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "zRa3lRHWrbZ0wuyfoZKW3", + "originalText": "Sinatra", + "lineHeight": 1.25 + }, + { + "id": "4YSJOLkpMQS5esVTb193l", + "type": "text", + "x": 233.28329467773432, + "y": 3583.306640625, + "width": 371.91973876953125, + "height": 25, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 4738934, + "version": 302, + "versionNonce": 1999463786, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882669, + "link": null, + "locked": false, + "text": "Step 2: Create database and tables", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Step 2: Create database and tables", + "lineHeight": 1.25 + }, + { + "id": "MyrUCj5VEF8SisZqwrYzo", + "type": "arrow", + "x": 210.42805989583343, + "y": 1826.0133463541667, + "width": 1.8489583333333712, + "height": 478.65234375, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 1360186998, + "version": 145, + "versionNonce": 1758821942, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882669, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -1.8489583333333712, + 478.65234375 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "RGidyCb_d8a8wThIbiprJ", + "type": "text", + "x": 93.43590037028008, + "y": 2061.403971354167, + "width": 168.11192321777344, + "height": 35, + "angle": 4.712484019350381, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 2127124534, + "version": 265, + "versionNonce": 1475422250, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882669, + "link": null, + "locked": false, + "text": "Flow of time", + "fontSize": 28, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Flow of time", + "lineHeight": 1.25 + }, + { + "id": "GmOqEiYV8KKYyfWPxSoxE", + "type": "rectangle", + "x": 785.0234840029759, + "y": 3712.0916573660716, + "width": 574, + "height": 257, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 3 + }, + "seed": 1838602806, + "version": 564, + "versionNonce": 1487835882, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "c92qxV4Jk2CktaFjVjhvE" + }, + { + "id": "1qmO2ZbicWWDzDfMTAaum", + "type": "arrow" + }, + { + "id": "_BKR0vyWwqnpeR7ic3Ae0", + "type": "arrow" + } + ], + "updated": 1681401882669, + "link": null, + "locked": false + }, + { + "id": "c92qxV4Jk2CktaFjVjhvE", + "type": "text", + "x": 790.0234840029759, + "y": 3753.0916573660716, + "width": 456.4797668457031, + "height": 175, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 586534198, + "version": 526, + "versionNonce": 1030219958, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882669, + "link": null, + "locked": false, + "text": "CREATE TABLE users (\n id SERIAL PRIMARY KEY,\n name VARCHAR(50) NOT NULL,\n username VARCHAR(50) NOT NULL UNIQUE,\n email VARCHAR(255) NOT NULL UNIQUE,\n password_hash CHAR(60) NOT NULL\n);", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "middle", + "containerId": "GmOqEiYV8KKYyfWPxSoxE", + "originalText": "CREATE TABLE users (\n id SERIAL PRIMARY KEY,\n name VARCHAR(50) NOT NULL,\n username VARCHAR(50) NOT NULL UNIQUE,\n email VARCHAR(255) NOT NULL UNIQUE,\n password_hash CHAR(60) NOT NULL\n);", + "lineHeight": 1.25 + }, + { + "id": "CGd9o26gJ_b8Is4cR1z8i", + "type": "rectangle", + "x": 1532.704148065476, + "y": 3912.8240792410716, + "width": 591, + "height": 324, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 3 + }, + "seed": 389936822, + "version": 721, + "versionNonce": 468755882, + "isDeleted": false, + "boundElements": [ + { + "id": "1qmO2ZbicWWDzDfMTAaum", + "type": "arrow" + }, + { + "type": "text", + "id": "4qq-odHCfZgJu4PDcH7DO" + }, + { + "id": "2hogXTkt5t7cUPWJPHoIZ", + "type": "arrow" + }, + { + "id": "nPg4AlYZdsXKwDNLMuuZR", + "type": "arrow" + }, + { + "id": "x_rIkS4Q8TOpl51oalNZe", + "type": "arrow" + } + ], + "updated": 1681401882669, + "link": null, + "locked": false + }, + { + "id": "4qq-odHCfZgJu4PDcH7DO", + "type": "text", + "x": 1537.704148065476, + "y": 3974.8240792410716, + "width": 566.5197143554688, + "height": 200, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 2093643690, + "version": 657, + "versionNonce": 1427464694, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882669, + "link": null, + "locked": false, + "text": "CREATE TABLE notifications (\n id SERIAL PRIMARY KEY,\n user_id INTEGER NOT NULL,\n peep_id INTEGER NOT NULL,\n created_at TIMESTAMP NOT NULL DEFAULT NOW(),\n FOREIGN KEY (user_id) REFERENCES users (id),\n FOREIGN KEY (peep_id) REFERENCES peeps (id)\n);", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "middle", + "containerId": "CGd9o26gJ_b8Is4cR1z8i", + "originalText": "CREATE TABLE notifications (\n id SERIAL PRIMARY KEY,\n user_id INTEGER NOT NULL,\n peep_id INTEGER NOT NULL,\n created_at TIMESTAMP NOT NULL DEFAULT NOW(),\n FOREIGN KEY (user_id) REFERENCES users (id),\n FOREIGN KEY (peep_id) REFERENCES peeps (id)\n);", + "lineHeight": 1.25 + }, + { + "id": "6WG89uK9rlH3RDvolFJfc", + "type": "rectangle", + "x": 782.928059895833, + "y": 4089.216471354167, + "width": 588, + "height": 277, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 3 + }, + "seed": 499541034, + "version": 534, + "versionNonce": 987914346, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "xd4pxiL2w_bUawpFzov9f" + }, + { + "id": "v2Pl3-Mf_NuW4-JxlXmbX", + "type": "arrow" + }, + { + "id": "2hogXTkt5t7cUPWJPHoIZ", + "type": "arrow" + } + ], + "updated": 1681401882669, + "link": null, + "locked": false + }, + { + "id": "xd4pxiL2w_bUawpFzov9f", + "type": "text", + "x": 787.928059895833, + "y": 4140.216471354167, + "width": 566.5197143554688, + "height": 175, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 1398852470, + "version": 427, + "versionNonce": 591508278, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882669, + "link": null, + "locked": false, + "text": "CREATE TABLE peeps (\n id SERIAL PRIMARY KEY,\n content TEXT NOT NULL,\n created_at TIMESTAMP NOT NULL DEFAULT NOW(),\n user_id INTEGER NOT NULL,\n FOREIGN KEY (user_id) REFERENCES users (id)\n);", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "middle", + "containerId": "6WG89uK9rlH3RDvolFJfc", + "originalText": "CREATE TABLE peeps (\n id SERIAL PRIMARY KEY,\n content TEXT NOT NULL,\n created_at TIMESTAMP NOT NULL DEFAULT NOW(),\n user_id INTEGER NOT NULL,\n FOREIGN KEY (user_id) REFERENCES users (id)\n);", + "lineHeight": 1.25 + }, + { + "id": "5pW12wHcyk9NDBhf5LZ3z", + "type": "text", + "x": 1026.493908110119, + "y": 3722.1089564732147, + "width": 77.75596618652344, + "height": 35, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 1928069750, + "version": 441, + "versionNonce": 575790198, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882669, + "link": null, + "locked": false, + "text": "Users", + "fontSize": 28, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Users", + "lineHeight": 1.25 + }, + { + "id": "X84i_km5C1o_KT93NPpja", + "type": "text", + "x": 1027.2026134672617, + "y": 4102.722795758928, + "width": 78.14796447753906, + "height": 35, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 1000170870, + "version": 377, + "versionNonce": 1235275242, + "isDeleted": false, + "boundElements": [ + { + "id": "1qmO2ZbicWWDzDfMTAaum", + "type": "arrow" + }, + { + "id": "Ycqz9JvQwAOC-6bQqLMRM", + "type": "arrow" + }, + { + "id": "v2Pl3-Mf_NuW4-JxlXmbX", + "type": "arrow" + } + ], + "updated": 1681401882669, + "link": null, + "locked": false, + "text": "Peeps", + "fontSize": 28, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Peeps", + "lineHeight": 1.25 + }, + { + "id": "tQfQiqtDl8EsOpmFHRIga", + "type": "line", + "x": 589.4124348958333, + "y": 4056.422572544642, + "width": 198.359375, + "height": 219.46428571428532, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 95282486, + "version": 354, + "versionNonce": 940236214, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882670, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 198.359375, + -219.46428571428532 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "HMEiUcK0ubHvdhlbCZ5Yf", + "type": "line", + "x": 590.907970610119, + "y": 4059.4248046875, + "width": 192.60044642857133, + "height": 173.63281249999955, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 1515911926, + "version": 431, + "versionNonce": 1222869162, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882670, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 192.60044642857133, + 173.63281249999955 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "1qmO2ZbicWWDzDfMTAaum", + "type": "arrow", + "x": 1069.5128813244046, + "y": 3970.5464564732147, + "width": 2.65625, + "height": 122.36607142857156, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 140220778, + "version": 669, + "versionNonce": 448912234, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882670, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -2.65625, + 122.36607142857156 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "GmOqEiYV8KKYyfWPxSoxE", + "focus": -0.001071049916938873, + "gap": 1.454799107143117 + }, + "endBinding": { + "elementId": "X84i_km5C1o_KT93NPpja", + "focus": -0.00032441578355848366, + "gap": 9.810267857142208 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "Ycqz9JvQwAOC-6bQqLMRM", + "type": "arrow", + "x": 1069.7081938244046, + "y": 4040.8198939732147, + "width": 43.65513392857156, + "height": 46.55691964285734, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 469038698, + "version": 506, + "versionNonce": 1332439094, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882670, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 30.4296875, + 14.079241071428442 + ], + [ + 43.65513392857156, + 46.55691964285734 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": { + "elementId": "X84i_km5C1o_KT93NPpja", + "focus": 1.3086970398433826, + "gap": 15.345982142856428 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "v2Pl3-Mf_NuW4-JxlXmbX", + "type": "arrow", + "x": 1067.118908110119, + "y": 4042.387974330357, + "width": 46.53459821428555, + "height": 47.09821428571422, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 1287638966, + "version": 578, + "versionNonce": 1032248874, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882670, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -34.40290178571445, + 11.328125 + ], + [ + -46.53459821428555, + 47.09821428571422 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": { + "elementId": "X84i_km5C1o_KT93NPpja", + "focus": -1.2467848629016873, + "gap": 13.236607142857338 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "b_c_nyZgi5tHutXFk1R_k", + "type": "rectangle", + "x": 936.7292131696424, + "y": 2257.867885044643, + "width": 223, + "height": 161, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 3 + }, + "seed": 786249258, + "version": 275, + "versionNonce": 1769795958, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "bKmbkZaxVQlPfa3ZkL0dK" + } + ], + "updated": 1681401882670, + "link": null, + "locked": false + }, + { + "id": "bKmbkZaxVQlPfa3ZkL0dK", + "type": "text", + "x": 956.7093004499159, + "y": 2313.367885044643, + "width": 183.03982543945312, + "height": 50, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 2100189302, + "version": 297, + "versionNonce": 773687530, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882670, + "link": null, + "locked": false, + "text": "GitHub Repo\n(chitter_challenge)", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "b_c_nyZgi5tHutXFk1R_k", + "originalText": "GitHub Repo\n(chitter_challenge)", + "lineHeight": 1.25 + }, + { + "id": "wJcZ0q7TiiuLok5jppdXk", + "type": "text", + "x": 257.19238281250006, + "y": 4508.235878596231, + "width": 836.8793334960938, + "height": 350, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 358025654, + "version": 1318, + "versionNonce": 108347114, + "isDeleted": false, + "boundElements": null, + "updated": 1681402122284, + "link": null, + "locked": false, + "text": "Step 3: TDD process\n\n- Starting with chitter_app get /peeps\n- moving onto peeps_repository as it's required for get /peeps\n- peeps now display on web app but no users information for peep\n- now starting users_repository tdd since we need the user information pulled\n- user_repository all method working but not sure how to integrate into route\n- spoke to Pablo in the peer group catch up who had a solution where he joined \nthe tables using an SQL query in the PeepRepository which allowed for access \nto the username which I liked and it's much simpler than what I was thinking to do\n- spoke to Umut following code review and he suggested creating a flowchart for\nthe pages and how they interact so I have it clear in my head. Done below.\n- All pages in working order but needs code clean up, fail tests and CSS seperation.\n ", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Step 3: TDD process\n\n- Starting with chitter_app get /peeps\n- moving onto peeps_repository as it's required for get /peeps\n- peeps now display on web app but no users information for peep\n- now starting users_repository tdd since we need the user information pulled\n- user_repository all method working but not sure how to integrate into route\n- spoke to Pablo in the peer group catch up who had a solution where he joined \nthe tables using an SQL query in the PeepRepository which allowed for access \nto the username which I liked and it's much simpler than what I was thinking to do\n- spoke to Umut following code review and he suggested creating a flowchart for\nthe pages and how they interact so I have it clear in my head. Done below.\n- All pages in working order but needs code clean up, fail tests and CSS seperation.\n ", + "lineHeight": 1.25 + }, + { + "id": "SCJNU8MlxsOXRn_MFCkj3", + "type": "text", + "x": 236.46321614583343, + "y": 2714.4272848462315, + "width": 438.57965087890625, + "height": 25, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 1190522550, + "version": 174, + "versionNonce": 336649130, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882670, + "link": null, + "locked": false, + "text": "Step 1: Diagram how the application will work", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Step 1: Diagram how the application will work", + "lineHeight": 1.25 + }, + { + "id": "3v6c8m7MRQ5DdRyT2upPN", + "type": "arrow", + "x": 936.7561848958333, + "y": 2340.0457744295654, + "width": 69.60286458333303, + "height": 4.088541666666515, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 646377910, + "version": 208, + "versionNonce": 381389814, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882670, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -69.60286458333303, + 4.088541666666515 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": { + "elementId": "RGrx7SGDLKySphbED1vSy", + "focus": -0.0023821508780783925, + "gap": 1.0665457589288962 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "catRYX0EKm2BglMj28WbD", + "type": "arrow", + "x": 494.65820312500006, + "y": 2389.9904358878985, + "width": 96.796875, + "height": 1.77734375, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 26007926, + "version": 319, + "versionNonce": 1837880938, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882670, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 96.796875, + -1.77734375 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "DRnkoJocLNjZvJVM0Xtx9", + "focus": 0.6559913573963355, + "gap": 2.2064732142857792 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "_ldgIydhnAHIk2LoQ7pVi", + "type": "arrow", + "x": 587.7327473958333, + "y": 2462.2983785962324, + "width": 94.35546875, + "height": 0.3385416666665151, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 131864182, + "version": 311, + "versionNonce": 1653775670, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882670, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -94.35546875, + 0.3385416666665151 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "RGrx7SGDLKySphbED1vSy", + "focus": -0.6494358532062567, + "gap": 3.3540271577380736 + }, + "endBinding": { + "elementId": "DRnkoJocLNjZvJVM0Xtx9", + "focus": 0.829977057854448, + "gap": 1 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "GIoPW03qRzRrTBygGeJi9", + "type": "arrow", + "x": 495.4020182291667, + "y": 1802.4090556795657, + "width": 93.41796875, + "height": 0.60546875, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 1511138858, + "version": 318, + "versionNonce": 995719466, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882670, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 93.41796875, + 0.60546875 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "DRnkoJocLNjZvJVM0Xtx9", + "focus": -0.7653528650759224, + "gap": 2.950288318452408 + }, + "endBinding": { + "elementId": "zRa3lRHWrbZ0wuyfoZKW3", + "focus": 0.6847242790742115, + "gap": 1.3262183779759198 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "fbTIByj_h25InX40X7eva", + "type": "arrow", + "x": 585.9554036458333, + "y": 1931.6668681795657, + "width": 94.8828125, + "height": 0.20182291666651508, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 2110890154, + "version": 221, + "versionNonce": 1542817398, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882670, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -94.8828125, + 0.20182291666651508 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "zRa3lRHWrbZ0wuyfoZKW3", + "focus": -0.6281587263348019, + "gap": 4.190801711309405 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "JlhgurL65wK7vQPfP4kat", + "type": "rectangle", + "x": 298.2018229166667, + "y": 3018.9149150545654, + "width": 212, + "height": 147, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 3 + }, + "seed": 1719931894, + "version": 390, + "versionNonce": 753189866, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "k562vsX5Gu-DWntcIT8qB" + }, + { + "id": "xCZ1EecsH4rELbO-lYlUA", + "type": "arrow" + } + ], + "updated": 1681401882670, + "link": null, + "locked": false + }, + { + "id": "k562vsX5Gu-DWntcIT8qB", + "type": "text", + "x": 334.0718943277995, + "y": 3054.9149150545654, + "width": 140.25985717773438, + "height": 75, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 1148465590, + "version": 359, + "versionNonce": 329861046, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882670, + "link": null, + "locked": false, + "text": "chitter_app.rb\n\n- routes", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "JlhgurL65wK7vQPfP4kat", + "originalText": "chitter_app.rb\n\n- routes", + "lineHeight": 1.25 + }, + { + "id": "R_S5Ru6-Qgf2vIgpUxtJ9", + "type": "text", + "x": 1730.419921875, + "y": 3922.4546285962324, + "width": 173.71189880371094, + "height": 35, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 116614006, + "version": 298, + "versionNonce": 970121462, + "isDeleted": false, + "boundElements": [ + { + "id": "_BKR0vyWwqnpeR7ic3Ae0", + "type": "arrow" + }, + { + "id": "MjMUk__8w4bGI5g1Ijx8U", + "type": "arrow" + }, + { + "id": "7452q6gtjAR5KWy1tv-t0", + "type": "arrow" + } + ], + "updated": 1681401882670, + "link": null, + "locked": false, + "text": "Notifications", + "fontSize": 28, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Notifications", + "lineHeight": 1.25 + }, + { + "id": "_BKR0vyWwqnpeR7ic3Ae0", + "type": "arrow", + "x": 1359.4384765625, + "y": 3823.1040426587324, + "width": 472.1337890625, + "height": 87.28515625, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 256318198, + "version": 600, + "versionNonce": 704663914, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882670, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 413.544921875, + 8.57421875 + ], + [ + 472.1337890625, + 87.28515625 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "GmOqEiYV8KKYyfWPxSoxE", + "focus": -0.17438925390186777, + "gap": 1 + }, + "endBinding": { + "elementId": "R_S5Ru6-Qgf2vIgpUxtJ9", + "focus": 0.36346395922171004, + "gap": 12.0654296875 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "2hogXTkt5t7cUPWJPHoIZ", + "type": "arrow", + "x": 1375.3564453125, + "y": 4320.774941096232, + "width": 460.7460072920444, + "height": 81.15234375, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 798233782, + "version": 596, + "versionNonce": 838292022, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882670, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 403.9404296875, + -6.9873046875 + ], + [ + 460.7460072920444, + -81.15234375 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "6WG89uK9rlH3RDvolFJfc", + "focus": 0.6840564934406459, + "gap": 4.42838541666697 + }, + "endBinding": { + "elementId": "CGd9o26gJ_b8Is4cR1z8i", + "focus": -0.3196595517078811, + "gap": 2.798518105160838 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "nPg4AlYZdsXKwDNLMuuZR", + "type": "arrow", + "x": 1825.6982421875, + "y": 4288.245644221232, + "width": 50.73853183193614, + "height": 49.384765625, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 1923561846, + "version": 393, + "versionNonce": 159814698, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882670, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 46.11328125, + -6.62109375 + ], + [ + 50.73853183193614, + -49.384765625 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": { + "elementId": "CGd9o26gJ_b8Is4cR1z8i", + "focus": -0.21076683420457465, + "gap": 2.036799355160838 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "x_rIkS4Q8TOpl51oalNZe", + "type": "arrow", + "x": 1827.1044921875, + "y": 4289.178261408732, + "width": 42.7099609375, + "height": 49.580078125, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 1868321834, + "version": 444, + "versionNonce": 654023542, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882670, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -42.7099609375, + -7.0751953125 + ], + [ + -41.25009067379324, + -49.580078125 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": { + "elementId": "CGd9o26gJ_b8Is4cR1z8i", + "focus": 0.12186916879899626, + "gap": 2.774104042660838 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "MjMUk__8w4bGI5g1Ijx8U", + "type": "arrow", + "x": 1827.5732421875, + "y": 3864.8569723462324, + "width": 52.666015625, + "height": 46.181640625, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 767547882, + "version": 328, + "versionNonce": 213286634, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882670, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 49.2919921875, + 6.26953125 + ], + [ + 52.666015625, + 46.181640625 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": { + "elementId": "R_S5Ru6-Qgf2vIgpUxtJ9", + "focus": 0.7404493379594037, + "gap": 11.416015625 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "7452q6gtjAR5KWy1tv-t0", + "type": "arrow", + "x": 1826.5771484375, + "y": 3867.7378317212324, + "width": 48.6181640625, + "height": 46.0009765625, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 398111862, + "version": 352, + "versionNonce": 522501302, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882670, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -48.6181640625, + 5.5908203125 + ], + [ + -45.6494140625, + 46.0009765625 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": { + "elementId": "R_S5Ru6-Qgf2vIgpUxtJ9", + "focus": -0.3905327582171162, + "gap": 8.7158203125 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "2djvkCE1NAZvOttn9xjZV", + "type": "rectangle", + "x": 591.7578125, + "y": 3246.2729879712324, + "width": 524, + "height": 160, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 3 + }, + "seed": 2122081590, + "version": 672, + "versionNonce": 1612386730, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "x2urwUVCuZQEuWmQG02dZ" + } + ], + "updated": 1681401882670, + "link": null, + "locked": false + }, + { + "id": "x2urwUVCuZQEuWmQG02dZ", + "type": "text", + "x": 681.5379638671875, + "y": 3288.7729879712324, + "width": 344.439697265625, + "height": 75, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 928039606, + "version": 682, + "versionNonce": 269989366, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882670, + "link": null, + "locked": false, + "text": "users.rb\n\nid, username, email, password_hash", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "2djvkCE1NAZvOttn9xjZV", + "originalText": "users.rb\n\nid, username, email, password_hash", + "lineHeight": 1.25 + }, + { + "id": "E0nHKYIGcyUD3wA_-L2cn", + "type": "rectangle", + "x": 1145.4150390625, + "y": 3249.1479879712324, + "width": 524, + "height": 160, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 3 + }, + "seed": 2065808170, + "version": 667, + "versionNonce": 1725910122, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "3alvlmklcb4ya9LBC2wjR" + } + ], + "updated": 1681401882670, + "link": null, + "locked": false + }, + { + "id": "3alvlmklcb4ya9LBC2wjR", + "type": "text", + "x": 1244.285171508789, + "y": 3291.6479879712324, + "width": 326.2597351074219, + "height": 75, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 222979190, + "version": 736, + "versionNonce": 1926858550, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882670, + "link": null, + "locked": false, + "text": "peeps.rb\n\nid, content, created_at, user_id", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "E0nHKYIGcyUD3wA_-L2cn", + "originalText": "peeps.rb\n\nid, content, created_at, user_id", + "lineHeight": 1.25 + }, + { + "id": "xihKFBSsI1GSXVj3OkaBF", + "type": "rectangle", + "x": 1698.828125, + "y": 3247.3032614087324, + "width": 524, + "height": 160, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 3 + }, + "seed": 1878096246, + "version": 744, + "versionNonce": 1724788522, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "pj6qK2kmPp-OWQnbegG5T" + } + ], + "updated": 1681401882670, + "link": null, + "locked": false + }, + { + "id": "pj6qK2kmPp-OWQnbegG5T", + "type": "text", + "x": 1797.4282684326172, + "y": 3289.8032614087324, + "width": 326.7997131347656, + "height": 75, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 1561690346, + "version": 796, + "versionNonce": 1473196150, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882670, + "link": null, + "locked": false, + "text": "notifications.rb\n\nid, user_id, peep_id, created_at", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "xihKFBSsI1GSXVj3OkaBF", + "originalText": "notifications.rb\n\nid, user_id, peep_id, created_at", + "lineHeight": 1.25 + }, + { + "id": "Og_8ERUYySdd08H4AG-i3", + "type": "rectangle", + "x": 590.3759765625, + "y": 2815.7114645337324, + "width": 526.337890625, + "height": 423.5664062500002, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 3 + }, + "seed": 1690241910, + "version": 557, + "versionNonce": 2059252150, + "isDeleted": false, + "boundElements": [], + "updated": 1681401882670, + "link": null, + "locked": false + }, + { + "id": "2EdQsihsB-hyW7jMiQSQj", + "type": "rectangle", + "x": 1144.53125, + "y": 2816.2622457837324, + "width": 526.337890625, + "height": 423.5664062500002, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 3 + }, + "seed": 240436714, + "version": 549, + "versionNonce": 1584917674, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882670, + "link": null, + "locked": false + }, + { + "id": "6J_DxG-3NQeDULzuoyhX_", + "type": "rectangle", + "x": 1695.7861328125, + "y": 2816.0141989087324, + "width": 526.337890625, + "height": 423.5664062500002, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 3 + }, + "seed": 1236196022, + "version": 643, + "versionNonce": 1456081654, + "isDeleted": false, + "boundElements": [ + { + "id": "xCZ1EecsH4rELbO-lYlUA", + "type": "arrow" + } + ], + "updated": 1681401882670, + "link": null, + "locked": false + }, + { + "id": "17y5pO-9YiG27N3goF7ag", + "type": "text", + "x": 760.1953125, + "y": 2830.0083395337324, + "width": 189.45977783203125, + "height": 25, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 1406957930, + "version": 452, + "versionNonce": 1538278774, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882670, + "link": null, + "locked": false, + "text": "users_repository.rb", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "users_repository.rb", + "lineHeight": 1.25 + }, + { + "id": "_bAUpin9LFFH473kwLcjT", + "type": "text", + "x": 1306.708984375, + "y": 2832.4145895337324, + "width": 189.29977416992188, + "height": 25, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 1146648746, + "version": 396, + "versionNonce": 712602858, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882670, + "link": null, + "locked": false, + "text": "peeps_repository.rb", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "peeps_repository.rb", + "lineHeight": 1.25 + }, + { + "id": "8ufxDo3Rh1MiiF45eNYJZ", + "type": "text", + "x": 1831.9287109375, + "y": 2832.1714254712324, + "width": 257.37969970703125, + "height": 25, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 290050986, + "version": 536, + "versionNonce": 1806968502, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882671, + "link": null, + "locked": false, + "text": "notifications_repository.rb", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "notifications_repository.rb", + "lineHeight": 1.25 + }, + { + "id": "HPLxVloSem9QVjVN0u-fN", + "type": "text", + "x": 604.1015625, + "y": 2869.8423239087324, + "width": 472.5195617675781, + "height": 325, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 638074614, + "version": 644, + "versionNonce": 724164598, + "isDeleted": false, + "boundElements": [ + { + "id": "XOYvgbDhpMdERsUvzP1jt", + "type": "arrow" + } + ], + "updated": 1681401882671, + "link": null, + "locked": false, + "text": "create_user\n\nfind_user_by_id(id)\n\nfind_user_by_username(username)\n\nfind_user_by_email(email)\n\nverify_user_credentials(username, password)\n\nupdate_user_password(user_id, new_password)\n\ndelete_user(user_id)", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "create_user\n\nfind_user_by_id(id)\n\nfind_user_by_username(username)\n\nfind_user_by_email(email)\n\nverify_user_credentials(username, password)\n\nupdate_user_password(user_id, new_password)\n\ndelete_user(user_id)", + "lineHeight": 1.25 + }, + { + "id": "JVWEEo8FsE7KT_ZIZTU6O", + "type": "arrow", + "x": 399.9617041132052, + "y": 3232.6020895337324, + "width": 0.21561036320525773, + "height": 67.8720703125, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 1866134826, + "version": 489, + "versionNonce": 2115399990, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882671, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -0.21561036320525773, + -67.8720703125 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "eFZ3iYWDEv_W0uFmSVhP5", + "focus": -0.0038637259935844315, + "gap": 1 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "eFZ3iYWDEv_W0uFmSVhP5", + "type": "rectangle", + "x": 301.44042968749994, + "y": 3233.6020895337324, + "width": 198.7255859375, + "height": 310, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 3 + }, + "seed": 2109974582, + "version": 341, + "versionNonce": 1772938538, + "isDeleted": false, + "boundElements": [ + { + "id": "JVWEEo8FsE7KT_ZIZTU6O", + "type": "arrow" + }, + { + "type": "text", + "id": "x6oShzrgf0Dqj88fmVXbJ" + } + ], + "updated": 1681401882671, + "link": null, + "locked": false + }, + { + "id": "x6oShzrgf0Dqj88fmVXbJ", + "type": "text", + "x": 331.42329406738276, + "y": 3238.6020895337324, + "width": 138.75985717773438, + "height": 300, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 1525161206, + "version": 276, + "versionNonce": 2145311350, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882671, + "link": null, + "locked": false, + "text": "views (ERBs)\ne.g.\n- home\n- layout\n- signup\n- login\n- logout\n- peep\n- user_peeps\n- edit_peep\n- notifications\n- 404", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "eFZ3iYWDEv_W0uFmSVhP5", + "originalText": "views (ERBs)\ne.g.\n- home\n- layout\n- signup\n- login\n- logout\n- peep\n- user_peeps\n- edit_peep\n- notifications\n- 404", + "lineHeight": 1.25 + }, + { + "id": "DmlUXanc2p3jbwxeIYs9r", + "type": "text", + "x": 1757.392578125, + "y": 388.5386129712324, + "width": 124.70394897460938, + "height": 45, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 2023954346, + "version": 140, + "versionNonce": 390601654, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882671, + "link": null, + "locked": false, + "text": "Chitter", + "fontSize": 36, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Chitter", + "lineHeight": 1.25 + }, + { + "id": "V3SXCQ3vGmWR917dvSrcd", + "type": "rectangle", + "x": 2100.830078125, + "y": 348.9975973462324, + "width": 153.22265625, + "height": 69.541015625, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 3 + }, + "seed": 2044030122, + "version": 94, + "versionNonce": 175584502, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "JKdnRQ_XNIhVviXkI3vW3" + } + ], + "updated": 1681401882671, + "link": null, + "locked": false + }, + { + "id": "JKdnRQ_XNIhVviXkI3vW3", + "type": "text", + "x": 2143.8814392089844, + "y": 371.2681051587324, + "width": 67.11993408203125, + "height": 25, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 741177910, + "version": 90, + "versionNonce": 1432469482, + "isDeleted": false, + "boundElements": null, + "updated": 1681402060388, + "link": null, + "locked": false, + "text": "Sign up", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "V3SXCQ3vGmWR917dvSrcd", + "originalText": "Sign up", + "lineHeight": 1.25 + }, + { + "id": "of1wiJT8CiY-txlgpfz0H", + "type": "rectangle", + "x": 1501.005859375, + "y": 519.4321676587324, + "width": 609.990234375, + "height": 108.9404296875, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 3 + }, + "seed": 365033322, + "version": 71, + "versionNonce": 1905979254, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882671, + "link": null, + "locked": false + }, + { + "id": "iKo6HAvWgKPD_nOUthkJi", + "type": "rectangle", + "x": 1501.0693359375, + "y": 664.5298239087324, + "width": 609.990234375, + "height": 108.9404296875, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 3 + }, + "seed": 267493994, + "version": 143, + "versionNonce": 1030122218, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882671, + "link": null, + "locked": false + }, + { + "id": "2wXjuhfLWfALGiajP8A2g", + "type": "rectangle", + "x": 1500.6005859375, + "y": 807.1518942212324, + "width": 609.990234375, + "height": 108.9404296875, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 3 + }, + "seed": 1977681846, + "version": 220, + "versionNonce": 45715638, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882671, + "link": null, + "locked": false + }, + { + "id": "xl-FMIVdb52buKO9uVKTX", + "type": "text", + "x": 1543.720703125, + "y": 545.6382223462324, + "width": 325.01983642578125, + "height": 75, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 862893110, + "version": 66, + "versionNonce": 1273855402, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882671, + "link": null, + "locked": false, + "text": "Username 1 - 14:30 05/02/2023\n\nI like orange man", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Username 1 - 14:30 05/02/2023\n\nI like orange man", + "lineHeight": 1.25 + }, + { + "id": "qxIFGFqT-ju1i-34h7f9s", + "type": "text", + "x": 1544.677734375, + "y": 688.0405660962324, + "width": 334.8998107910156, + "height": 75, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 1530892598, + "version": 143, + "versionNonce": 1374816758, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882671, + "link": null, + "locked": false, + "text": "Username 2 - 14:20 04/02/2023\n\nI don't like orange man", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Username 2 - 14:20 04/02/2023\n\nI don't like orange man", + "lineHeight": 1.25 + }, + { + "id": "RLNlwmQaqz8QiUS65_KtN", + "type": "text", + "x": 1544.2138671875, + "y": 830.6626364087324, + "width": 318.5598449707031, + "height": 75, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 442300074, + "version": 236, + "versionNonce": 92551274, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882671, + "link": null, + "locked": false, + "text": "Username 3 - 00:01 01/01/2023\n\nI am orange man", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Username 3 - 00:01 01/01/2023\n\nI am orange man", + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 267, + "versionNonce": 776559414, + "isDeleted": false, + "id": "We5RY78gb-d1BbT3wD22w", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1501.318359375, + "y": 949.9668356274824, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 609.990234375, + "height": 108.9404296875, + "seed": 1901740330, + "groupIds": [], + "roundness": { + "type": 3 + }, + "boundElements": null, + "updated": 1681401882671, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 306, + "versionNonce": 972397354, + "isDeleted": false, + "id": "6KmkNUdkf7pLTG-Hwz8UF", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1544.931640625, + "y": 973.4775778149824, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 324.3998107910156, + "height": 75, + "seed": 423968374, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1681401882671, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Username 4 - 23:59 31/12/2022\n\nWhat is orange man", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Username 4 - 23:59 31/12/2022\n\nWhat is orange man", + "lineHeight": 1.25 + }, + { + "id": "50wfK-2Eyg0rqW6rmBBMS", + "type": "rectangle", + "x": 1408.2421875, + "y": 243.4360739087324, + "width": 888.4521484375, + "height": 881.611328125, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 3 + }, + "seed": 1154914410, + "version": 134, + "versionNonce": 128755178, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882671, + "link": null, + "locked": false + }, + { + "id": "a1GMF4u5TaV5SYuuxhlYC", + "type": "line", + "x": 1411.435546875, + "y": 279.1909567212324, + "width": 885.41015625, + "height": 1.3232421875, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 921013674, + "version": 148, + "versionNonce": 323519926, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882671, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 885.41015625, + -1.3232421875 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "c7ztKOgbnQrS3wXz0SSN0", + "type": "line", + "x": 1410.1416015625, + "y": 321.6196676587324, + "width": 890.37109375, + "height": 2.2900390625, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 1979938346, + "version": 81, + "versionNonce": 129259690, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882671, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 890.37109375, + 2.2900390625 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "VL6L7bRaRZoKcJLS6bbbi", + "type": "rectangle", + "x": 1514.5078125, + "y": 283.6001364087324, + "width": 772, + "height": 35, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 3 + }, + "seed": 1826505462, + "version": 309, + "versionNonce": 1054498550, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "adfs2rhF6DEJOcKPqYnfh" + } + ], + "updated": 1681401882671, + "link": null, + "locked": false + }, + { + "id": "adfs2rhF6DEJOcKPqYnfh", + "type": "text", + "x": 1519.5078125, + "y": 288.6001364087324, + "width": 49.81999206542969, + "height": 25, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 1922004394, + "version": 171, + "versionNonce": 2061688694, + "isDeleted": false, + "boundElements": null, + "updated": 1681402065647, + "link": null, + "locked": false, + "text": "URL/", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "middle", + "containerId": "VL6L7bRaRZoKcJLS6bbbi", + "originalText": "URL/", + "lineHeight": 1.25 + }, + { + "id": "cm9uiH6kUgkPmxRdg4yW8", + "type": "ellipse", + "x": 1429.150390625, + "y": 251.9565817212324, + "width": 20.9375, + "height": 18.76953125, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "#fa5252", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 75260086, + "version": 67, + "versionNonce": 1388026230, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882672, + "link": null, + "locked": false + }, + { + "id": "PAr3KIMz8o_Vj2o0FDjB8", + "type": "ellipse", + "x": 1457.8369140625, + "y": 251.3218160962324, + "width": 20.9375, + "height": 18.76953125, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "#fab005", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 1960357110, + "version": 92, + "versionNonce": 2071814378, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882672, + "link": null, + "locked": false + }, + { + "id": "zdsO4t8mbM1JPpdPXmciE", + "type": "ellipse", + "x": 1486.9921875, + "y": 251.2778707837324, + "width": 20.9375, + "height": 18.76953125, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "#82c91e", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 1678591338, + "version": 106, + "versionNonce": 238353078, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882672, + "link": null, + "locked": false + }, + { + "id": "Idtm65trL28G1qR0p_4es", + "type": "arrow", + "x": 1437.4365234375, + "y": 301.6245504712324, + "width": 24.98046875, + "height": 0.44921875, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "#82c91e", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 453803766, + "version": 42, + "versionNonce": 1471525802, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882672, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -24.98046875, + 0.44921875 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "zaENfJaoHUSjb_Jo0cYuc", + "type": "arrow", + "x": 1453.4521484375, + "y": 301.4390035962324, + "width": 25.6884765625, + "height": 1.0888671875, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "#82c91e", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 1087046710, + "version": 39, + "versionNonce": 1852847094, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882672, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 25.6884765625, + -1.0888671875 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "yfxj72drLjuGVxlmwYr1-", + "type": "arrow", + "x": 1261.9555612088584, + "y": 1921.0777679559947, + "width": 403.1567330838584, + "height": 0.9864206097620354, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "#82c91e", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 1265266742, + "version": 446, + "versionNonce": 383102570, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882672, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -403.1567330838584, + -0.9864206097620354 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "_PhyOH3PGEtNuxDoQ5Lbi", + "focus": 0.5092795258360474, + "gap": 1.0549019607844912 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "SXSmYGNRl5kqPkQKYfvKY", + "type": "arrow", + "x": 861.9493106617647, + "y": 1814.061061649585, + "width": 400.00625054709394, + "height": 0.004780854357704811, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "#82c91e", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 628328246, + "version": 446, + "versionNonce": 762463542, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882672, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 400.00625054709394, + 0.004780854357704811 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "zRa3lRHWrbZ0wuyfoZKW3", + "focus": -0.5856241573106061, + "gap": 1.8031053046220222 + }, + "endBinding": { + "elementId": "_PhyOH3PGEtNuxDoQ5Lbi", + "focus": 0.7649473991203608, + "gap": 1.0549019607842638 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "wk8N-x3pBevlLDHRtigKr", + "type": "arrow", + "x": 1536.051842064951, + "y": 1823.6724776240933, + "width": 164.63663449754904, + "height": 2.541916597139334, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "#82c91e", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 150531446, + "version": 417, + "versionNonce": 1302876458, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882672, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 164.63663449754904, + 2.541916597139334 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "_PhyOH3PGEtNuxDoQ5Lbi", + "focus": -0.7435234188265496, + "gap": 4.041378895308071 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "o5GjE8yiL9wPFTZbmTuKr", + "type": "arrow", + "x": 1698.3740234375, + "y": 1901.1020895337326, + "width": 163.701171875, + "height": 0.5322265625, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "#82c91e", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 284191210, + "version": 396, + "versionNonce": 2090872438, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882672, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -163.701171875, + -0.5322265625 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "NLCYqAGLDu43Af0KeXdTA", + "focus": 0.5538688606844125, + "gap": 1 + }, + "endBinding": { + "elementId": "_PhyOH3PGEtNuxDoQ5Lbi", + "focus": -0.5597155708341706, + "gap": 2.6623883928571104 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "6skRhFzRyBIPedcTp7c5r", + "type": "diamond", + "x": 1322.4267578125, + "y": 2418.2407614087324, + "width": 137, + "height": 95, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 706291126, + "version": 334, + "versionNonce": 1066965994, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "nGx8hGffOVs38LAa8Wd_i" + } + ], + "updated": 1681401882672, + "link": null, + "locked": false + }, + { + "id": "nGx8hGffOVs38LAa8Wd_i", + "type": "text", + "x": 1370.2007751464844, + "y": 2455.9907614087324, + "width": 41.95196533203125, + "height": 20, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "#82c91e", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 1806602410, + "version": 232, + "versionNonce": 415166390, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882672, + "link": null, + "locked": false, + "text": "ERBs", + "fontSize": 16, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "6skRhFzRyBIPedcTp7c5r", + "originalText": "ERBs", + "lineHeight": 1.25 + }, + { + "id": "VlZ9PjjC9JpZ-lSvbmmck", + "type": "text", + "x": 1176.4111328125, + "y": 2883.4009176587324, + "width": 433.7395935058594, + "height": 275, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 802576502, + "version": 346, + "versionNonce": 179408554, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882672, + "link": null, + "locked": false, + "text": "create_peep(content, user_id)\n\nfind_peep_by_id(id)\n\nfind_all_peeps - reverse chronological order\n\nupdate_peep_content(id, new_content)\n\ndelete_peep(id)\n\n", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "create_peep(content, user_id)\n\nfind_peep_by_id(id)\n\nfind_all_peeps - reverse chronological order\n\nupdate_peep_content(id, new_content)\n\ndelete_peep(id)\n\n", + "lineHeight": 1.25 + }, + { + "id": "xCZ1EecsH4rELbO-lYlUA", + "type": "arrow", + "x": 1979.4429568875184, + "y": 2813.7104879712324, + "width": 1577.1822147000184, + "height": 241.2890625, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 1695499958, + "version": 1292, + "versionNonce": 1576241398, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882672, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -1341.4009647000184, + -37.779296875 + ], + [ + -1577.1822147000184, + 203.509765625 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "6J_DxG-3NQeDULzuoyhX_", + "focus": 0.9793281285633461, + "gap": 2.3037109375 + }, + "endBinding": { + "elementId": "JlhgurL65wK7vQPfP4kat", + "focus": -0.42412749381519504, + "gap": 1.6946614583330302 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "Lr1RniU1f_kpsbbXK9DQr", + "type": "line", + "x": 1378.30078125, + "y": 2815.3208395337324, + "width": 293.515625, + "height": 44.072265625, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 153945002, + "version": 260, + "versionNonce": 1402874218, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882672, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -144.970703125, + -23.1005859375 + ], + [ + -293.515625, + -44.072265625 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "YmG7VW_ZPGje0sptKaI56", + "type": "line", + "x": 849.970703125, + "y": 2814.8423239087324, + "width": 89.82421875, + "height": 45.5029296875, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 37749558, + "version": 137, + "versionNonce": 1539504694, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882672, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -35.9033203125, + -24.9755859375 + ], + [ + -89.82421875, + -45.5029296875 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "umKdc-rLr3rJ1yRQS5kSi", + "type": "text", + "x": 1742.001953125, + "y": 2887.5132223462324, + "width": 387.599609375, + "height": 175, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 1251581482, + "version": 231, + "versionNonce": 1906928682, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882672, + "link": null, + "locked": false, + "text": "create_notification(user_id, peep_id)\n\nfind_notification_by_id(id)\n\nfind_notifications_by_user_id(user_id)\n\ndelete_notification(id)", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "create_notification(user_id, peep_id)\n\nfind_notification_by_id(id)\n\nfind_notifications_by_user_id(user_id)\n\ndelete_notification(id)", + "lineHeight": 1.25 + }, + { + "id": "SdgSA12uH9MPpc7QAznN1", + "type": "rectangle", + "x": 289.580078125, + "y": 1272.6059957837324, + "width": 1459.970703125, + "height": 271.83105468750006, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 3 + }, + "seed": 847642282, + "version": 219, + "versionNonce": 1762804598, + "isDeleted": false, + "boundElements": [], + "updated": 1681401882672, + "link": null, + "locked": false + }, + { + "id": "2IWnTBQ8zHoucZvNoroYb", + "type": "text", + "x": 313.017578125, + "y": 1295.8042379712324, + "width": 1401.4788818359375, + "height": 250, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 1071099562, + "version": 121, + "versionNonce": 258468266, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882672, + "link": null, + "locked": false, + "text": "Notes on functionality:\n\nYou don't have to be logged in to see the peeps.\nMakers sign up to chitter with their email, password, name and a username (e.g. samm@makersacademy.com, password123, Sam Morgan, sjmog).\nThe username and email are unique.\nPeeps (posts to chitter) have the name of the maker and their user handle.\nYour README should indicate the technologies used, and give instructions on how to install and run the tests.\nIn order to start a conversation as a maker I want to reply to a peep from another maker.\nCSS Styling\n", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Notes on functionality:\n\nYou don't have to be logged in to see the peeps.\nMakers sign up to chitter with their email, password, name and a username (e.g. samm@makersacademy.com, password123, Sam Morgan, sjmog).\nThe username and email are unique.\nPeeps (posts to chitter) have the name of the maker and their user handle.\nYour README should indicate the technologies used, and give instructions on how to install and run the tests.\nIn order to start a conversation as a maker I want to reply to a peep from another maker.\nCSS Styling\n", + "lineHeight": 1.25 + }, + { + "id": "YupphmXRVdEo8usUS8C4P", + "type": "rectangle", + "x": 1555.7177734375, + "y": 1831.8384176587326, + "width": 115, + "height": 64, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 3 + }, + "seed": 1975521526, + "version": 399, + "versionNonce": 1789156854, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "ve6CGAHcGF9WcS0C4iQMb" + } + ], + "updated": 1681401882672, + "link": null, + "locked": false + }, + { + "id": "ve6CGAHcGF9WcS0C4iQMb", + "type": "text", + "x": 1563.3578186035156, + "y": 1838.8384176587326, + "width": 99.71990966796875, + "height": 50, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 760763958, + "version": 389, + "versionNonce": 1188111466, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882672, + "link": null, + "locked": false, + "text": "Database\nConnection", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "YupphmXRVdEo8usUS8C4P", + "originalText": "Database Connection", + "lineHeight": 1.25 + }, + { + "id": "IfShuD7I2EfhmzbZX4NWP", + "type": "arrow", + "x": 1367.63671875, + "y": 3656.7319723462324, + "width": 268.6181640625, + "height": 142.333984375, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 1785871722, + "version": 263, + "versionNonce": 630271798, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882672, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -268.6181640625, + 142.333984375 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "utkcq16i7g3FyIP--kZV2", + "focus": 0.9445032171381034, + "gap": 11.884765625 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "utkcq16i7g3FyIP--kZV2", + "type": "text", + "x": 1379.521484375, + "y": 3641.4585348462324, + "width": 563.299560546875, + "height": 25, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 886243690, + "version": 180, + "versionNonce": 626120822, + "isDeleted": false, + "boundElements": [ + { + "id": "IfShuD7I2EfhmzbZX4NWP", + "type": "arrow" + } + ], + "updated": 1681401882672, + "link": null, + "locked": false, + "text": "VARCHAR is more flexible as the string length is variable", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "VARCHAR is more flexible as the string length is variable", + "lineHeight": 1.25 + }, + { + "id": "swEi2HO1PcBXC4l7ZQYnw", + "type": "arrow", + "x": 1192.607421875, + "y": 4011.8089217069146, + "width": 145.64453125, + "height": 112.72343373568219, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 2008078698, + "version": 480, + "versionNonce": 1940820458, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882672, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -145.64453125, + -112.72343373568219 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "7jZroEdZ47qlL7Kos0nB0", + "focus": -0.8525132844418324, + "gap": 10.6689453125 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "7jZroEdZ47qlL7Kos0nB0", + "type": "text", + "x": 1203.2763671875, + "y": 3990.9751364087324, + "width": 301.73980712890625, + "height": 50, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 1421498422, + "version": 281, + "versionNonce": 1370184118, + "isDeleted": false, + "boundElements": [ + { + "id": "swEi2HO1PcBXC4l7ZQYnw", + "type": "arrow" + } + ], + "updated": 1681401882672, + "link": null, + "locked": false, + "text": "Maximum length and CHAR for \nsecurity (https://rb.gy/4bkzc)", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Maximum length and CHAR for \nsecurity (https://rb.gy/4bkzc)", + "lineHeight": 1.25 + }, + { + "id": "jgaF-H4UgORkMJ3P_2_EV", + "type": "arrow", + "x": 1430.8154296875, + "y": 3752.8403707837324, + "width": 181.201171875, + "height": 63.1884765625, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 1730934762, + "version": 317, + "versionNonce": 1956168874, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882672, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -181.201171875, + 63.1884765625 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "zY5DLegcx-YQqIAC8U1GU", + "focus": 0.8846603802397475, + "gap": 8.7109375 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "zY5DLegcx-YQqIAC8U1GU", + "type": "text", + "x": 1439.5263671875, + "y": 3738.1821676587324, + "width": 506.13958740234375, + "height": 25, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 712136938, + "version": 192, + "versionNonce": 657366890, + "isDeleted": false, + "boundElements": [ + { + "id": "jgaF-H4UgORkMJ3P_2_EV", + "type": "arrow" + } + ], + "updated": 1681401882672, + "link": null, + "locked": false, + "text": "Doesn't allow null values and they must be unique ", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Doesn't allow null values and they must be unique ", + "lineHeight": 1.25 + }, + { + "id": "6tOiTpsA8axi3WRvDEtnR", + "type": "arrow", + "x": 2010.4931640625, + "y": 3863.5923239087324, + "width": 63.4521484375, + "height": 201.71875, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 1358678710, + "version": 401, + "versionNonce": 513731958, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882672, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -63.4521484375, + 201.71875 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "uFJ2CpWcrdvKVH9Ti6mGR", + "focus": 0.5764726540222472, + "gap": 2.2705078125 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "uFJ2CpWcrdvKVH9Ti6mGR", + "type": "text", + "x": 1954.853515625, + "y": 3811.3218160962324, + "width": 324.65972900390625, + "height": 50, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 1780321206, + "version": 194, + "versionNonce": 1361661162, + "isDeleted": false, + "boundElements": [ + { + "id": "6tOiTpsA8axi3WRvDEtnR", + "type": "arrow" + } + ], + "updated": 1681401882672, + "link": null, + "locked": false, + "text": "Timestamp at the time created \nwill be default value ", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Timestamp at the time created \nwill be default value ", + "lineHeight": 1.25 + }, + { + "id": "RjmdPlvhjzg9qxHM9TZSi", + "type": "text", + "x": 316.17675781249994, + "y": 3620.6431051587324, + "width": 248.1597900390625, + "height": 25, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 611905142, + "version": 205, + "versionNonce": 1761877930, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882673, + "link": null, + "locked": false, + "text": "Done along with seed file", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Done along with seed file", + "lineHeight": 1.25 + }, + { + "id": "SE8cQgPLRLzbXp1Bf-Mm6", + "type": "line", + "x": 319.70214843749994, + "y": 3649.8667379712324, + "width": 244.970703125, + "height": 1.9189453125, + "angle": 0, + "strokeColor": "#2b8a3e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 382750954, + "version": 142, + "versionNonce": 814647286, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882673, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 244.970703125, + -1.9189453125 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "191iHB_4_ZzHvfDnAj6Tb", + "type": "arrow", + "x": 1277.79296875, + "y": 1233.0503317212324, + "width": 246.62109375, + "height": 0.556640625, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 158678134, + "version": 273, + "versionNonce": 1266063978, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882673, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -246.62109375, + 0.556640625 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "BJH2xJ44dZrNKz1LrdBuk", + "focus": 0.11292259129094821, + "gap": 8.671875 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "BJH2xJ44dZrNKz1LrdBuk", + "type": "text", + "x": 1286.46484375, + "y": 1221.6001364087324, + "width": 341.77972412109375, + "height": 25, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 991638966, + "version": 119, + "versionNonce": 390839594, + "isDeleted": false, + "boundElements": [ + { + "id": "191iHB_4_ZzHvfDnAj6Tb", + "type": "arrow" + } + ], + "updated": 1681401882673, + "link": null, + "locked": false, + "text": "Advanced feature. Implement last.", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Advanced feature. Implement last.", + "lineHeight": 1.25 + }, + { + "id": "Rghs8GFKdC6K9e9VJ3utI", + "type": "rectangle", + "x": 1684.23828125, + "y": 2795.3452535962324, + "width": 553.2324218749999, + "height": 632.2900390625001, + "angle": 0, + "strokeColor": "#c92a2a", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 3 + }, + "seed": 391698038, + "version": 336, + "versionNonce": 574194294, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882673, + "link": null, + "locked": false + }, + { + "id": "SlxNbuCsPgveaq39NJ7wR", + "type": "rectangle", + "x": 1732.666015625, + "y": 2284.7446676587324, + "width": 286.07421875, + "height": 160.234375, + "angle": 0, + "strokeColor": "#c92a2a", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 3 + }, + "seed": 163937270, + "version": 195, + "versionNonce": 1508804586, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882673, + "link": null, + "locked": false + }, + { + "id": "Ef9tvYrcCo3uz91dN5ASL", + "type": "rectangle", + "x": 1265.15625, + "y": 2202.8745504712324, + "width": 263.427734375, + "height": 108.75, + "angle": 0, + "strokeColor": "#c92a2a", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 3 + }, + "seed": 1637924406, + "version": 189, + "versionNonce": 1745732534, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882673, + "link": null, + "locked": false + }, + { + "id": "vxf1jvw2Ci3MM_rnkpvhI", + "type": "rectangle", + "x": 1283.330078125, + "y": 1217.7671285962324, + "width": 348.154296875, + "height": 41.2353515625, + "angle": 0, + "strokeColor": "#c92a2a", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 3 + }, + "seed": 1922163818, + "version": 91, + "versionNonce": 996801194, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882673, + "link": null, + "locked": false + }, + { + "id": "xeHfqmG9IPp6JZSRJ14RB", + "type": "rectangle", + "x": 301.6748046875, + "y": 1469.3296285962324, + "width": 963.3544921875, + "height": 56.2646484375, + "angle": 0, + "strokeColor": "#c92a2a", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 3 + }, + "seed": 648371894, + "version": 114, + "versionNonce": 71818486, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882673, + "link": null, + "locked": false + }, + { + "id": "Ql4lgNIJGiyzFt2RSRu6j", + "type": "rectangle", + "x": 1505.5615234375, + "y": 3786.9272848462324, + "width": 780.60546875, + "height": 572.34375, + "angle": 0, + "strokeColor": "#c92a2a", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 3 + }, + "seed": 934041206, + "version": 112, + "versionNonce": 1421755114, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882673, + "link": null, + "locked": false + }, + { + "id": "W2_FMv_MOlLrhjDxh1CZk", + "type": "rectangle", + "x": 418.2060546875, + "y": 5131.491737971232, + "width": 243, + "height": 209, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 3 + }, + "seed": 591737142, + "version": 361, + "versionNonce": 258685110, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "8ydpjuqlPM8a8hW4i6XQN" + }, + { + "id": "0N2AkwfOn5057-oVQH39k", + "type": "arrow" + } + ], + "updated": 1681401882673, + "link": null, + "locked": false + }, + { + "id": "8ydpjuqlPM8a8hW4i6XQN", + "type": "text", + "x": 426.6661376953125, + "y": 5160.991737971232, + "width": 226.079833984375, + "height": 150, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 1026739050, + "version": 317, + "versionNonce": 1519015338, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882673, + "link": null, + "locked": false, + "text": "Homepage\n- lists all peeps \n- no need to log in to \nview only\n- has login button\n- has signup button ", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "W2_FMv_MOlLrhjDxh1CZk", + "originalText": "Homepage\n- lists all peeps \n- no need to log in to view only\n- has login button\n- has signup button ", + "lineHeight": 1.25 + }, + { + "id": "hVj_DXibd47NWRwdSi-Pp", + "type": "text", + "x": 517.3828125, + "y": 5136.351112971232, + "width": 65.33998107910156, + "height": 25, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 762474230, + "version": 159, + "versionNonce": 1522929770, + "isDeleted": false, + "boundElements": [ + { + "id": "Pj6ViNLxpYZfmdml5Lht1", + "type": "arrow" + } + ], + "updated": 1681401882673, + "link": null, + "locked": false, + "text": "GET /", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "GET /", + "lineHeight": 1.25 + }, + { + "id": "qUL3XdnUX-kcoFL0U9_jV", + "type": "rectangle", + "x": 1106.529296875, + "y": 5067.224159846232, + "width": 236, + "height": 169, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 3 + }, + "seed": 108417962, + "version": 125, + "versionNonce": 682689334, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "mSvHui5lpfboKjLK-36z_" + }, + { + "id": "Pj5HouWrpgTtoSsa-Q8Vo", + "type": "arrow" + } + ], + "updated": 1681401882673, + "link": null, + "locked": false + }, + { + "id": "mSvHui5lpfboKjLK-36z_", + "type": "text", + "x": 1139.4393615722656, + "y": 5101.724159846232, + "width": 170.17987060546875, + "height": 100, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 1030820842, + "version": 158, + "versionNonce": 960262954, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882673, + "link": null, + "locked": false, + "text": "Log In\n- form that has \nusername and \npassword fields", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "qUL3XdnUX-kcoFL0U9_jV", + "originalText": "Log In\n- form that has username and password fields", + "lineHeight": 1.25 + }, + { + "id": "M7c767A8DtAtW7pGd_wTJ", + "type": "rectangle", + "x": 1551.5537109375, + "y": 5111.042519221232, + "width": 244, + "height": 364, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 3 + }, + "seed": 1395160938, + "version": 256, + "versionNonce": 1565994102, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "soYrCK5o-1F3fS6il0p5I" + }, + { + "id": "Pj6ViNLxpYZfmdml5Lht1", + "type": "arrow" + } + ], + "updated": 1681401882673, + "link": null, + "locked": false + }, + { + "id": "soYrCK5o-1F3fS6il0p5I", + "type": "text", + "x": 1557.783805847168, + "y": 5180.542519221232, + "width": 231.53981018066406, + "height": 225, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 726436918, + "version": 522, + "versionNonce": 676888042, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882673, + "link": null, + "locked": false, + "text": "Logged In\n- lists all peeps \n- has create peep box \nwhere you can submit a\npeep\n- has logout button\nwhich redirects you \nback to homepage when\nlogged out ", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "M7c767A8DtAtW7pGd_wTJ", + "originalText": "Logged In\n- lists all peeps \n- has create peep box where you can submit a peep\n- has logout button\nwhich redirects you back to homepage when logged out ", + "lineHeight": 1.25 + }, + { + "id": "HKIOfzuRZvCr1u1PdBuHw", + "type": "text", + "x": 1173.6376953125, + "y": 5071.590370783732, + "width": 105.41993713378906, + "height": 25, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 1457530550, + "version": 128, + "versionNonce": 1428500650, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882673, + "link": null, + "locked": false, + "text": "GET /login", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "GET /login", + "lineHeight": 1.25 + }, + { + "id": "mOoTlSy4cKXemSfCG3vWl", + "type": "text", + "x": 1619.111328125, + "y": 5115.408730158732, + "width": 137.75990295410156, + "height": 25, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 1723464234, + "version": 162, + "versionNonce": 1602422518, + "isDeleted": false, + "boundElements": [ + { + "id": "Pj6ViNLxpYZfmdml5Lht1", + "type": "arrow" + } + ], + "updated": 1681401882673, + "link": null, + "locked": false, + "text": "GET /loggedin", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "GET /loggedin", + "lineHeight": 1.25 + }, + { + "id": "LEy_0mhQD5WDU8KmIqEas", + "type": "rectangle", + "x": 867.2890625, + "y": 5385.194862971232, + "width": 209, + "height": 366, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 3 + }, + "seed": 1055521526, + "version": 210, + "versionNonce": 323849066, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "JrWNS4L3FeIM4j4hR2reX" + } + ], + "updated": 1681401882673, + "link": null, + "locked": false + }, + { + "id": "JrWNS4L3FeIM4j4hR2reX", + "type": "text", + "x": 872.3891372680664, + "y": 5418.194862971232, + "width": 198.7998504638672, + "height": 300, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 1989929002, + "version": 353, + "versionNonce": 984791094, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882673, + "link": null, + "locked": false, + "text": "Signup\n- form that has \nusername, name, \nemail and password \nfields to submit\n- takes you to \n/login if successful\n- homepage button \nin case you want \nto go back without \nsignup\n", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "LEy_0mhQD5WDU8KmIqEas", + "originalText": "Signup\n- form that has username, name, email and password fields to submit\n- takes you to /login if successful\n- homepage button in case you want to go back without signup\n", + "lineHeight": 1.25 + }, + { + "id": "ONYwtE-ZYPmBX62IUcBEW", + "type": "text", + "x": 917.03125, + "y": 5389.827675471232, + "width": 121.159912109375, + "height": 25, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 111250102, + "version": 135, + "versionNonce": 152866346, + "isDeleted": false, + "boundElements": [ + { + "id": "MTS8uF67Y-RJ026edeJym", + "type": "arrow" + } + ], + "updated": 1681401882673, + "link": null, + "locked": false, + "text": "GET /signup", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "GET /signup", + "lineHeight": 1.25 + }, + { + "id": "0N2AkwfOn5057-oVQH39k", + "type": "arrow", + "x": 661.2255859375, + "y": 5237.8208395337315, + "width": 207.6220703125, + "height": 289.9951171875, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 891632566, + "version": 206, + "versionNonce": 257573238, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882673, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 207.6220703125, + 289.9951171875 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "W2_FMv_MOlLrhjDxh1CZk", + "focus": -0.6123265368952386, + "gap": 1 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "AjZhnV_P8QSBakZiOxur0", + "type": "arrow", + "x": 660.634765625, + "y": 5220.5454489087315, + "width": 448.310546875, + "height": 83.9501953125, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 922602294, + "version": 115, + "versionNonce": 1534933226, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882673, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 448.310546875, + -83.9501953125 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "Pj5HouWrpgTtoSsa-Q8Vo", + "type": "arrow", + "x": 1343.623046875, + "y": 5154.5102926587315, + "width": 208.9697265625, + "height": 42.431640625, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 1664507190, + "version": 157, + "versionNonce": 280928950, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882673, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 208.9697265625, + 42.431640625 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "qUL3XdnUX-kcoFL0U9_jV", + "focus": -0.19727113837446938, + "gap": 1.09375 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "MTS8uF67Y-RJ026edeJym", + "type": "arrow", + "x": 967.6025390625, + "y": 5386.2827535962315, + "width": 139.208984375, + "height": 213.134765625, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 1856081590, + "version": 152, + "versionNonce": 1509591978, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882673, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 139.208984375, + -213.134765625 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "ONYwtE-ZYPmBX62IUcBEW", + "focus": -0.29803778880511184, + "gap": 3.5449218750009095 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "xyfwTgCBMFSg44G4nDUQi", + "type": "line", + "x": 604.794921875, + "y": 2897.9819723462315, + "width": 126.4501953125, + "height": 2.0751953125, + "angle": 0, + "strokeColor": "#087f5b", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 980773610, + "version": 49, + "versionNonce": 717194858, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882673, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 126.4501953125, + -2.0751953125 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "type": "line", + "version": 224, + "versionNonce": 129101110, + "isDeleted": false, + "id": "B4cEJ_BMpH9l_9XkOUdhU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 603.8369117967784, + "y": 3102.504964627191, + "strokeColor": "#087f5b", + "backgroundColor": "transparent", + "width": 448.7158203125, + "height": 4.3603515625, + "seed": 1995361974, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": null, + "updated": 1681401882673, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 448.7158203125, + -4.3603515625 + ] + ] + }, + { + "type": "line", + "version": 350, + "versionNonce": 1989617962, + "isDeleted": false, + "id": "vu3hlRRAgdTmYaDWVvNHf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1171.9379757530987, + "y": 2916.028501701574, + "strokeColor": "#087f5b", + "backgroundColor": "transparent", + "width": 320.458984375, + "height": 4.16015625, + "seed": 2041949290, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": null, + "updated": 1681401882673, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 320.458984375, + -4.16015625 + ] + ] + }, + { + "type": "line", + "version": 555, + "versionNonce": 1084937846, + "isDeleted": false, + "id": "vuFfUfWPiIzoZhtmRCqtS", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1169.7249473801116, + "y": 3017.292060738904, + "strokeColor": "#087f5b", + "backgroundColor": "transparent", + "width": 439.4775390625, + "height": 3.779296875, + "seed": 728121130, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": null, + "updated": 1681401882673, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 439.4775390625, + -3.779296875 + ] + ] + }, + { + "id": "XOYvgbDhpMdERsUvzP1jt", + "type": "arrow", + "x": 362.1533203125, + "y": 2834.9741598462315, + "width": 232.8564453125, + "height": 62.44140625, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 1326187242, + "version": 171, + "versionNonce": 351040490, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882673, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 232.8564453125, + 62.44140625 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "kPeD8ga1ukVhl6I3_vPFT", + "focus": 0.5193662723584513, + "gap": 1.0791015625 + }, + "endBinding": { + "elementId": "HPLxVloSem9QVjVN0u-fN", + "focus": 0.30610360353955457, + "gap": 9.091796875 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "kPeD8ga1ukVhl6I3_vPFT", + "type": "text", + "x": 260.8056640625, + "y": 2783.8950582837315, + "width": 218.5198211669922, + "height": 50, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 696654902, + "version": 129, + "versionNonce": 1429510070, + "isDeleted": false, + "boundElements": [ + { + "id": "XOYvgbDhpMdERsUvzP1jt", + "type": "arrow" + } + ], + "updated": 1681401882673, + "link": null, + "locked": false, + "text": "green underline means \nnecessary feature", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "green underline means \nnecessary feature", + "lineHeight": 1.25 + }, + { + "id": "16cyMGiL_3PMbLyO5SuG_", + "type": "text", + "x": 1327.2119140625, + "y": 5568.3530660962315, + "width": 533.4595336914062, + "height": 225, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 1534746102, + "version": 465, + "versionNonce": 277638198, + "isDeleted": false, + "boundElements": null, + "updated": 1681402293792, + "link": null, + "locked": false, + "text": "ERBs\n- signup - working but needs CSS separated\n- login - working but needs CSS separated\n- loggedin - working but needs CSS separated\n- peep - used for homepage, needs CSS separated \nand uniform with other pages\n- notifications (advanced - leave for now)\n- 404 - custom error page (optional)\n- layout - \"base\" that other erb files can share from", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ERBs\n- signup - working but needs CSS separated\n- login - working but needs CSS separated\n- loggedin - working but needs CSS separated\n- peep - used for homepage, needs CSS separated \nand uniform with other pages\n- notifications (advanced - leave for now)\n- 404 - custom error page (optional)\n- layout - \"base\" that other erb files can share from", + "lineHeight": 1.25 + }, + { + "id": "Pj6ViNLxpYZfmdml5Lht1", + "type": "arrow", + "x": 1681.3044152918253, + "y": 5107.9312392674765, + "width": 1146.9587121668253, + "height": 120.7861328125, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 680512234, + "version": 938, + "versionNonce": 543966250, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882674, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -525.8796106043253, + -101.951220046245 + ], + [ + -1146.9587121668253, + 18.834912766255 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "mOoTlSy4cKXemSfCG3vWl", + "focus": 0.7225728507187561, + "gap": 7.477490891255911 + }, + "endBinding": { + "elementId": "hVj_DXibd47NWRwdSi-Pp", + "focus": -1.3334141879110288, + "gap": 9.58496093750091 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "q9SvevT9Ni1nekq7zOsdU", + "type": "line", + "x": 606.9091796875, + "y": 2997.2886129712315, + "width": 357.080078125, + "height": 1.1376953125, + "angle": 0, + "strokeColor": "#087f5b", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 852636470, + "version": 52, + "versionNonce": 512289654, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882674, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 357.080078125, + -1.1376953125 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "2wfHxjni29UZM7n4P7fGT", + "type": "freedraw", + "x": 1063.2373046875, + "y": 5485.7895895337315, + "width": 23.65234375, + "height": 18.8525390625, + "angle": 0, + "strokeColor": "#2b8a3e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 1681010666, + "version": 31, + "versionNonce": 459681514, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882674, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.4443359375, + 0.44921875 + ], + [ + 0.4443359375, + 0.8984375 + ], + [ + 0.888671875, + 1.34765625 + ], + [ + 1.3330078125, + 1.796875 + ], + [ + 1.3330078125, + 2.24609375 + ], + [ + 1.77734375, + 2.24609375 + ], + [ + 1.77734375, + 2.6953125 + ], + [ + 2.2216796875, + 2.6953125 + ], + [ + 2.666015625, + 3.59375 + ], + [ + 2.666015625, + 4.04296875 + ], + [ + 2.666015625, + 3.5986328125 + ], + [ + 3.1103515625, + 3.154296875 + ], + [ + 3.5546875, + 2.7099609375 + ], + [ + 5.33203125, + 0.9326171875 + ], + [ + 7.2900390625, + -0.37109375 + ], + [ + 10.400390625, + -3.4814453125 + ], + [ + 18.583984375, + -10.3955078125 + ], + [ + 20.5419921875, + -11.69921875 + ], + [ + 22.3193359375, + -13.4765625 + ], + [ + 23.2080078125, + -13.9208984375 + ], + [ + 23.65234375, + -14.365234375 + ], + [ + 23.65234375, + -14.8095703125 + ], + [ + 23.65234375, + -14.8095703125 + ] + ], + "pressures": [], + "simulatePressure": true, + "lastCommittedPoint": [ + 23.65234375, + -14.8095703125 + ] + }, + { + "id": "1NrGOJlgOtKQjiXfpczu9", + "type": "freedraw", + "x": 1067.109375, + "y": 5578.4653707837315, + "width": 31.1328125, + "height": 23.0712890625, + "angle": 0, + "strokeColor": "#2b8a3e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 1565361718, + "version": 26, + "versionNonce": 1902312554, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882674, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.4443359375, + 0.44921875 + ], + [ + 0.888671875, + 0.8984375 + ], + [ + 1.3330078125, + 1.34765625 + ], + [ + 1.3330078125, + 1.796875 + ], + [ + 2.2216796875, + 2.24609375 + ], + [ + 2.666015625, + 3.1396484375 + ], + [ + 3.5546875, + 4.0380859375 + ], + [ + 3.9990234375, + 4.4873046875 + ], + [ + 3.9990234375, + 5.3857421875 + ], + [ + 4.443359375, + 5.3857421875 + ], + [ + 4.8876953125, + 5.3857421875 + ], + [ + 5.33203125, + 4.94140625 + ], + [ + 7.2900390625, + 3.6376953125 + ], + [ + 14.55078125, + -1.5478515625 + ], + [ + 18.3544921875, + -6.62109375 + ], + [ + 26.5380859375, + -13.53515625 + ], + [ + 27.841796875, + -15.4931640625 + ], + [ + 30.244140625, + -17.2412109375 + ], + [ + 30.6884765625, + -17.685546875 + ], + [ + 31.1328125, + -17.685546875 + ], + [ + 31.1328125, + -17.685546875 + ] + ], + "pressures": [], + "simulatePressure": true, + "lastCommittedPoint": [ + 31.1328125, + -17.685546875 + ] + }, + { + "id": "Oz3h0O1DoPaiZ465ZUmct", + "type": "freedraw", + "x": 628.408203125, + "y": 5201.8833395337315, + "width": 56.9677734375, + "height": 25.6396484375, + "angle": 0, + "strokeColor": "#2b8a3e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 775114346, + "version": 27, + "versionNonce": 128505654, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882674, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.4443359375, + 0 + ], + [ + 0.4443359375, + 0.44921875 + ], + [ + 1.3330078125, + 0.8984375 + ], + [ + 2.2216796875, + 1.34765625 + ], + [ + 3.1103515625, + 1.796875 + ], + [ + 3.5546875, + 2.24609375 + ], + [ + 4.443359375, + 3.14453125 + ], + [ + 4.8876953125, + 3.14453125 + ], + [ + 5.33203125, + 2.7001953125 + ], + [ + 5.7763671875, + 2.255859375 + ], + [ + 10.37109375, + 0.1806640625 + ], + [ + 14.521484375, + -1.89453125 + ], + [ + 29.3896484375, + -8.69140625 + ], + [ + 40.1123046875, + -13.2861328125 + ], + [ + 52.7880859375, + -19.6240234375 + ], + [ + 53.232421875, + -20.068359375 + ], + [ + 55.1904296875, + -20.7177734375 + ], + [ + 56.0791015625, + -21.6064453125 + ], + [ + 56.0791015625, + -22.05078125 + ], + [ + 56.9677734375, + -22.05078125 + ], + [ + 56.9677734375, + -22.4951171875 + ], + [ + 56.9677734375, + -22.4951171875 + ] + ], + "pressures": [], + "simulatePressure": true, + "lastCommittedPoint": [ + 56.9677734375, + -22.4951171875 + ] + }, + { + "id": "4jhQZjouKZQg0EnhczVmG", + "type": "freedraw", + "x": 633.603515625, + "y": 5243.8755270337315, + "width": 61.7431640625, + "height": 21.5087890625, + "angle": 0, + "strokeColor": "#2b8a3e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 857489258, + "version": 28, + "versionNonce": 1163648810, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882674, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 0.44921875 + ], + [ + 0.4443359375, + 0.8984375 + ], + [ + 0.4443359375, + 2.2412109375 + ], + [ + 0.888671875, + 2.6904296875 + ], + [ + 1.3330078125, + 4.033203125 + ], + [ + 1.77734375, + 4.482421875 + ], + [ + 1.77734375, + 5.380859375 + ], + [ + 1.77734375, + 5.830078125 + ], + [ + 2.2216796875, + 5.830078125 + ], + [ + 2.666015625, + 5.830078125 + ], + [ + 3.1103515625, + 5.830078125 + ], + [ + 8.1494140625, + 4.3505859375 + ], + [ + 10.107421875, + 3.701171875 + ], + [ + 22.783203125, + -0.09765625 + ], + [ + 29.12109375, + -2.6318359375 + ], + [ + 48.3740234375, + -11.416015625 + ], + [ + 52.5244140625, + -12.451171875 + ], + [ + 58.6328125, + -14.7900390625 + ], + [ + 59.521484375, + -14.7900390625 + ], + [ + 60.41015625, + -15.234375 + ], + [ + 61.298828125, + -15.6787109375 + ], + [ + 61.7431640625, + -15.6787109375 + ], + [ + 61.7431640625, + -15.6787109375 + ] + ], + "pressures": [], + "simulatePressure": true, + "lastCommittedPoint": [ + 61.7431640625, + -15.6787109375 + ] + }, + { + "id": "0Ek8m4Qgr5vwW2qAOKThA", + "type": "freedraw", + "x": 639.931640625, + "y": 5301.6929098462315, + "width": 44.765625, + "height": 20.712890625, + "angle": 0, + "strokeColor": "#2b8a3e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 1217073258, + "version": 28, + "versionNonce": 1437231594, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882674, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 0.44921875 + ], + [ + 0.4443359375, + 0.44921875 + ], + [ + 0.888671875, + 1.34765625 + ], + [ + 0.888671875, + 1.796875 + ], + [ + 1.3330078125, + 2.6953125 + ], + [ + 1.77734375, + 2.6953125 + ], + [ + 2.2216796875, + 3.5888671875 + ], + [ + 2.2216796875, + 4.0380859375 + ], + [ + 2.666015625, + 4.4873046875 + ], + [ + 3.1103515625, + 4.9365234375 + ], + [ + 3.1103515625, + 5.3857421875 + ], + [ + 3.5546875, + 5.3857421875 + ], + [ + 3.5546875, + 5.8349609375 + ], + [ + 3.5546875, + 5.390625 + ], + [ + 3.9990234375, + 5.390625 + ], + [ + 4.8876953125, + 4.9462890625 + ], + [ + 10.849609375, + 0.6982421875 + ], + [ + 17.1875, + -0.56640625 + ], + [ + 26.6064453125, + -5.2734375 + ], + [ + 35.13671875, + -9.5361328125 + ], + [ + 43.4326171875, + -13.9892578125 + ], + [ + 44.3212890625, + -14.43359375 + ], + [ + 44.765625, + -14.8779296875 + ], + [ + 44.765625, + -14.8779296875 + ] + ], + "pressures": [], + "simulatePressure": true, + "lastCommittedPoint": [ + 44.765625, + -14.8779296875 + ] + }, + { + "id": "hoJaVSoZ7baXZfoyb9W1h", + "type": "freedraw", + "x": 1315.6640625, + "y": 5167.4985739087315, + "width": 40.21484375, + "height": 27.2900390625, + "angle": 0, + "strokeColor": "#2b8a3e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 504448042, + "version": 25, + "versionNonce": 2147025334, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882674, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.4443359375, + 0 + ], + [ + 0.4443359375, + 0.44921875 + ], + [ + 1.3330078125, + 0.8984375 + ], + [ + 1.77734375, + 1.34765625 + ], + [ + 2.2216796875, + 2.24609375 + ], + [ + 2.666015625, + 2.6953125 + ], + [ + 3.5546875, + 3.14453125 + ], + [ + 3.9990234375, + 3.14453125 + ], + [ + 4.443359375, + 3.14453125 + ], + [ + 4.443359375, + 3.59375 + ], + [ + 5.33203125, + 2.705078125 + ], + [ + 5.7763671875, + 2.705078125 + ], + [ + 6.220703125, + 2.2607421875 + ], + [ + 9.3310546875, + -0.849609375 + ], + [ + 21.513671875, + -10.341796875 + ], + [ + 27.8515625, + -14.1455078125 + ], + [ + 34.8828125, + -19.2529296875 + ], + [ + 37.9931640625, + -22.36328125 + ], + [ + 39.7705078125, + -23.6962890625 + ], + [ + 40.21484375, + -23.6962890625 + ], + [ + 40.21484375, + -23.6962890625 + ] + ], + "pressures": [], + "simulatePressure": true, + "lastCommittedPoint": [ + 40.21484375, + -23.6962890625 + ] + }, + { + "id": "3TalBARihWS_AdF82k5Id", + "type": "freedraw", + "x": 1068.232421875, + "y": 5646.4097067212315, + "width": 31.46484375, + "height": 17.5048828125, + "angle": 0, + "strokeColor": "#2b8a3e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 1520098230, + "version": 62, + "versionNonce": 1143339562, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882674, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 0.44921875 + ], + [ + 0, + 0.8984375 + ], + [ + 0.4443359375, + 1.796875 + ], + [ + 0.4443359375, + 2.24609375 + ], + [ + 1.3330078125, + 2.6953125 + ], + [ + 1.77734375, + 3.14453125 + ], + [ + 1.77734375, + 4.04296875 + ], + [ + 2.2216796875, + 4.04296875 + ], + [ + 2.2216796875, + 4.4921875 + ], + [ + 2.666015625, + 4.4921875 + ], + [ + 2.666015625, + 4.0478515625 + ], + [ + 3.1103515625, + 4.0478515625 + ], + [ + 3.9990234375, + 3.603515625 + ], + [ + 4.8876953125, + 2.71484375 + ], + [ + 8.8037109375, + 0.76171875 + ], + [ + 9.6923828125, + 0.3173828125 + ], + [ + 11.025390625, + -0.5712890625 + ], + [ + 11.4697265625, + -1.015625 + ], + [ + 11.9140625, + -1.4599609375 + ], + [ + 12.3583984375, + -1.904296875 + ], + [ + 12.802734375, + -2.3486328125 + ], + [ + 13.69140625, + -2.79296875 + ], + [ + 14.1357421875, + -3.2373046875 + ], + [ + 15.0244140625, + -3.681640625 + ], + [ + 15.0244140625, + -4.1259765625 + ], + [ + 15.46875, + -4.1259765625 + ], + [ + 15.9130859375, + -4.5703125 + ], + [ + 16.357421875, + -5.0146484375 + ], + [ + 16.8017578125, + -5.0146484375 + ], + [ + 17.6904296875, + -5.9033203125 + ], + [ + 18.5791015625, + -6.34765625 + ], + [ + 19.4677734375, + -6.7919921875 + ], + [ + 19.912109375, + -6.7919921875 + ], + [ + 20.3564453125, + -7.236328125 + ], + [ + 20.80078125, + -7.236328125 + ], + [ + 20.80078125, + -7.6806640625 + ], + [ + 21.2451171875, + -7.6806640625 + ], + [ + 21.689453125, + -7.6806640625 + ], + [ + 22.578125, + -8.125 + ], + [ + 23.0224609375, + -8.5693359375 + ], + [ + 23.466796875, + -9.013671875 + ], + [ + 23.9111328125, + -9.013671875 + ], + [ + 24.35546875, + -9.013671875 + ], + [ + 24.35546875, + -9.4580078125 + ], + [ + 24.7998046875, + -9.4580078125 + ], + [ + 25.244140625, + -9.90234375 + ], + [ + 25.6884765625, + -9.90234375 + ], + [ + 26.5771484375, + -10.3466796875 + ], + [ + 27.4658203125, + -10.791015625 + ], + [ + 27.91015625, + -11.2353515625 + ], + [ + 28.3544921875, + -11.6796875 + ], + [ + 28.798828125, + -11.6796875 + ], + [ + 29.6875, + -12.1240234375 + ], + [ + 30.1318359375, + -12.568359375 + ], + [ + 31.0205078125, + -12.568359375 + ], + [ + 31.0205078125, + -13.0126953125 + ], + [ + 31.46484375, + -13.0126953125 + ], + [ + 31.46484375, + -13.0126953125 + ] + ], + "pressures": [], + "simulatePressure": true, + "lastCommittedPoint": [ + 31.46484375, + -13.0126953125 + ] + }, + { + "id": "lDXPv_ygLTYK-usqnfrF0", + "type": "freedraw", + "x": 1787.28515625, + "y": 5282.9233785962315, + "width": 31.8896484375, + "height": 23.720703125, + "angle": 0, + "strokeColor": "#2b8a3e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 2134632438, + "version": 26, + "versionNonce": 1249453290, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882674, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.4443359375, + 0 + ], + [ + 0.888671875, + 0.44921875 + ], + [ + 1.77734375, + 1.34765625 + ], + [ + 2.2216796875, + 1.796875 + ], + [ + 3.5546875, + 2.6953125 + ], + [ + 3.9990234375, + 3.14453125 + ], + [ + 4.443359375, + 3.59375 + ], + [ + 5.33203125, + 4.04296875 + ], + [ + 5.7763671875, + 4.4921875 + ], + [ + 6.220703125, + 4.94140625 + ], + [ + 6.6650390625, + 4.94140625 + ], + [ + 6.6650390625, + 4.4970703125 + ], + [ + 7.5537109375, + 4.052734375 + ], + [ + 8.4423828125, + 3.1640625 + ], + [ + 14.6630859375, + -3.056640625 + ], + [ + 22.8466796875, + -11.240234375 + ], + [ + 27.919921875, + -15.0439453125 + ], + [ + 29.2236328125, + -17.001953125 + ], + [ + 31.0009765625, + -18.3349609375 + ], + [ + 31.4453125, + -18.3349609375 + ], + [ + 31.4453125, + -18.779296875 + ], + [ + 31.8896484375, + -18.779296875 + ], + [ + 31.8896484375, + -18.779296875 + ] + ], + "pressures": [], + "simulatePressure": true, + "lastCommittedPoint": [ + 31.8896484375, + -18.779296875 + ] + }, + { + "id": "rp4XtMgd3sBPyV9TZGh-n", + "type": "freedraw", + "x": 1785.21484375, + "y": 5372.0835348462315, + "width": 36.97265625, + "height": 20.7275390625, + "angle": 0, + "strokeColor": "#2b8a3e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 213265258, + "version": 31, + "versionNonce": 281507510, + "isDeleted": false, + "boundElements": null, + "updated": 1681401882674, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.4443359375, + 0.44921875 + ], + [ + 0.888671875, + 0.8984375 + ], + [ + 1.77734375, + 2.2412109375 + ], + [ + 2.2216796875, + 2.2412109375 + ], + [ + 3.1103515625, + 3.1396484375 + ], + [ + 3.5546875, + 3.5888671875 + ], + [ + 3.5546875, + 4.0380859375 + ], + [ + 3.9990234375, + 4.0380859375 + ], + [ + 3.9990234375, + 4.4873046875 + ], + [ + 4.443359375, + 4.4873046875 + ], + [ + 4.443359375, + 4.9365234375 + ], + [ + 4.8876953125, + 4.9365234375 + ], + [ + 4.8876953125, + 5.3857421875 + ], + [ + 5.33203125, + 5.3857421875 + ], + [ + 5.7763671875, + 4.94140625 + ], + [ + 7.109375, + 3.6083984375 + ], + [ + 7.998046875, + 2.7197265625 + ], + [ + 9.9560546875, + 1.416015625 + ], + [ + 16.9873046875, + -3.69140625 + ], + [ + 22.060546875, + -7.4951171875 + ], + [ + 24.9072265625, + -9.2431640625 + ], + [ + 25.7958984375, + -9.6875 + ], + [ + 31.904296875, + -12.0263671875 + ], + [ + 32.3486328125, + -12.470703125 + ], + [ + 35.1953125, + -14.0087890625 + ], + [ + 35.6396484375, + -14.453125 + ], + [ + 36.97265625, + -15.341796875 + ], + [ + 36.97265625, + -15.341796875 + ] + ], + "pressures": [], + "simulatePressure": true, + "lastCommittedPoint": [ + 36.97265625, + -15.341796875 + ] + }, + { + "id": "HLKu1ERvbUZ70oVy-jY5k", + "type": "freedraw", + "x": 1762.119140625, + "y": 5218.0991598462315, + "width": 34.1748046875, + "height": 19.00390625, + "angle": 0, + "strokeColor": "#2b8a3e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 1901277174, + "version": 34, + "versionNonce": 692674154, + "isDeleted": false, + "boundElements": null, + "updated": 1681401885185, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.4443359375, + 0 + ], + [ + 0.888671875, + 0 + ], + [ + 1.3330078125, + 0 + ], + [ + 1.3330078125, + 0.44921875 + ], + [ + 2.2216796875, + 1.34765625 + ], + [ + 2.666015625, + 1.796875 + ], + [ + 3.5546875, + 3.1396484375 + ], + [ + 3.9990234375, + 3.1396484375 + ], + [ + 3.9990234375, + 3.5888671875 + ], + [ + 4.443359375, + 3.14453125 + ], + [ + 4.8876953125, + 2.7001953125 + ], + [ + 5.7763671875, + 2.255859375 + ], + [ + 6.6650390625, + 1.3671875 + ], + [ + 12.7734375, + -2.01171875 + ], + [ + 16.923828125, + -4.0869140625 + ], + [ + 23.955078125, + -9.1943359375 + ], + [ + 24.84375, + -9.638671875 + ], + [ + 25.732421875, + -10.52734375 + ], + [ + 26.1767578125, + -10.9716796875 + ], + [ + 26.62109375, + -10.9716796875 + ], + [ + 27.0654296875, + -10.9716796875 + ], + [ + 27.509765625, + -10.9716796875 + ], + [ + 27.9541015625, + -11.416015625 + ], + [ + 28.8427734375, + -11.8603515625 + ], + [ + 29.287109375, + -12.3046875 + ], + [ + 29.7314453125, + -12.7490234375 + ], + [ + 30.17578125, + -12.7490234375 + ], + [ + 31.064453125, + -13.193359375 + ], + [ + 31.953125, + -13.6376953125 + ], + [ + 33.73046875, + -14.970703125 + ], + [ + 34.1748046875, + -15.4150390625 + ], + [ + 34.1748046875, + -15.4150390625 + ] + ], + "pressures": [], + "simulatePressure": true, + "lastCommittedPoint": [ + 34.1748046875, + -15.4150390625 + ] + }, + { + "id": "cASLKNtd0OUho_BCvISTR", + "type": "text", + "x": 300.8984375, + "y": 5968.7583395337315, + "width": 615.8594970703125, + "height": 475, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 1899240054, + "version": 587, + "versionNonce": 1064923958, + "isDeleted": false, + "boundElements": null, + "updated": 1681402626350, + "link": null, + "locked": false, + "text": "Beta stage todo list:\n\nMust do\n- separate CSS from erbs\n- clean up code and add comments\n - reminder to remove code that isn't being used\n- create README\n- ensure it works on other computers if code copied\n- implement advised changes from code review\n- ensure rubocop and test coverage is 100%\n\nOptional\n- make styles uniform\n- try to use layout erb to extend the objects between pages\n\nAdvanced\n- ORM implementation\n- reply feature\n", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Beta stage todo list:\n\nMust do\n- separate CSS from erbs\n- clean up code and add comments\n - reminder to remove code that isn't being used\n- create README\n- ensure it works on other computers if code copied\n- implement advised changes from code review\n- ensure rubocop and test coverage is 100%\n\nOptional\n- make styles uniform\n- try to use layout erb to extend the objects between pages\n\nAdvanced\n- ORM implementation\n- reply feature\n", + "lineHeight": 1.25 + }, + { + "id": "s8__3qcdSqZtW3i9qercN", + "type": "text", + "x": 1330.7275390625, + "y": 5961.3364645337315, + "width": 587.4595336914062, + "height": 225, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 1231231786, + "version": 412, + "versionNonce": 1025970858, + "isDeleted": false, + "boundElements": null, + "updated": 1681402679957, + "link": null, + "locked": false, + "text": "Thoughts on process:\n\n- TDD is slow but necessary to prevent bugs\n- Even though I did TDD, clearly I didn't make my tests \nrobust as there were some bugs that tests didn't cover\n- bad decisions like add CSS to the erb itself makes more \nwork for later\n- the web page chart helped greatly \n", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Thoughts on process:\n\n- TDD is slow but necessary to prevent bugs\n- Even though I did TDD, clearly I didn't make my tests \nrobust as there were some bugs that tests didn't cover\n- bad decisions like add CSS to the erb itself makes more \nwork for later\n- the web page chart helped greatly \n", + "lineHeight": 1.25 + }, + { + "id": "EV_1uG7mtLf62DFy3v8tR", + "type": "line", + "x": 259.6484375, + "y": 5901.9272848462315, + "width": 1680.546875, + "height": 10.7568359375, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": { + "type": 2 + }, + "seed": 353445162, + "version": 93, + "versionNonce": 1945029546, + "isDeleted": false, + "boundElements": null, + "updated": 1681402674034, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 1680.546875, + -10.7568359375 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + } + ], + "appState": { + "gridSize": null, + "viewBackgroundColor": "#ffffff" + }, + "files": {} +} \ No newline at end of file diff --git a/config.ru b/config.ru new file mode 100644 index 0000000000..a857df6508 --- /dev/null +++ b/config.ru @@ -0,0 +1,3 @@ +# file: config.ru +require './chitter_app' +run ChitterApp diff --git a/lib/database_connection.rb b/lib/database_connection.rb new file mode 100644 index 0000000000..f11c8eb495 --- /dev/null +++ b/lib/database_connection.rb @@ -0,0 +1,42 @@ +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 + + def self.connect + # If the environment variable (set by Render) + # is present, use this to open the connection. + # if ENV['DATABASE_URL'] != nil + # @connection = PG.connect(ENV['DATABASE_URL']) + # return + # end + + if ENV['ENV'] == 'test' + database_name = 'chitter_test' + else + database_name = 'chitter' + end + @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 diff --git a/lib/peeps.rb b/lib/peeps.rb new file mode 100644 index 0000000000..f3346c8e2d --- /dev/null +++ b/lib/peeps.rb @@ -0,0 +1,11 @@ +class Peep + attr_accessor :id, :content, :created_at, :username, :user_id + + def initialize(id:, content:, created_at:, username:, user_id:) + @id = id + @content = content + @created_at = created_at + @username = username + @user_id = user_id + end +end diff --git a/lib/peeps_repository.rb b/lib/peeps_repository.rb new file mode 100644 index 0000000000..ec912bb851 --- /dev/null +++ b/lib/peeps_repository.rb @@ -0,0 +1,31 @@ +require_relative 'peeps' + +class PeepRepository + def all + sql = 'SELECT users.name, users.username, peeps.content, peeps.created_at, peeps.user_id + FROM users + JOIN peeps + ON peeps.user_id = users.id + ORDER BY peeps.created_at DESC;' + result = DatabaseConnection.exec_params(sql, []) + + result.map do |peep| + new_peep = Peep.new( + id: peep['id'].to_i, + content: peep['content'], + user_id: peep['user_id'].to_i, + created_at: peep['created_at'], + username: peep['username'] + ) + + # Debug statement + # puts "Peep created_at: #{new_peep.created_at.inspect}" + + end + end + + def create(content:, user_id:) + sql = 'INSERT INTO peeps (content, user_id) VALUES ($1, $2);' + DatabaseConnection.exec_params(sql, [content, user_id]) + end +end diff --git a/lib/users.rb b/lib/users.rb new file mode 100644 index 0000000000..b4b78a30ba --- /dev/null +++ b/lib/users.rb @@ -0,0 +1,11 @@ +class User + attr_accessor :id, :name, :username, :email, :password_hash + + def initialize(id:, name:, username:, email:, password_hash:) + @id = id + @name = name + @username = username + @email = email + @password_hash = password_hash + end +end diff --git a/lib/users_repository.rb b/lib/users_repository.rb new file mode 100644 index 0000000000..5c19326eca --- /dev/null +++ b/lib/users_repository.rb @@ -0,0 +1,47 @@ +require_relative 'users' +require 'bcrypt' + +class UserRepository + def all + sql = 'SELECT * FROM users;' + result = DatabaseConnection.exec_params(sql, []) + + result.map do |user| + new_user = User.new( + id: user['id'].to_i, + username: user['username'], + name: user['name'], + password_hash: user['password_hash'], + email: user['email'] + ) + end + end + + def create(username:, name:, password_hash:, email:) + sql = 'INSERT INTO users (username, name, password_hash, email) VALUES ($1, $2, $3, $4) RETURNING *;' + result = DatabaseConnection.exec_params(sql, [username, name, password_hash, email]) + + User.new( + id: result[0]['id'].to_i, + username: result[0]['username'], + name: result[0]['name'], + password_hash: result[0]['password_hash'], + email: result[0]['email'] + ) + end + + def find_user_by_email(email) + sql = 'SELECT * FROM users WHERE email = $1;' + result = DatabaseConnection.exec_params(sql, [email]) + + return nil if result.ntuples.zero? + + User.new( + id: result[0]['id'].to_i, + username: result[0]['username'], + name: result[0]['name'], + password_hash: result[0]['password_hash'], + email: result[0]['email'] + ) + end +end diff --git a/spec/integration/chitter_app_spec.rb b/spec/integration/chitter_app_spec.rb new file mode 100644 index 0000000000..28d92da323 --- /dev/null +++ b/spec/integration/chitter_app_spec.rb @@ -0,0 +1,132 @@ +require "spec_helper" +require "rack/test" +require_relative '../../chitter_app' + +describe ChitterApp do + include Rack::Test::Methods + + let(:app) { ChitterApp.new } + + def reset_tables + seed_sql = File.read('spec/seeds/chitter_seed.sql') + connection = PG.connect({ host: '127.0.0.1', dbname: 'chitter_test' }) + connection.exec(seed_sql) + end + + before(:each) do + reset_tables + end + + describe "GET /" do + it "displays a list of peeps in reverse chronological order" do + response = get "/" + expect(response.status).to eq 200 + + expected_peeps = [ + "Going to the beach tomorrow", + "Can't wait for the weekend", + "Just finished a long day at work", + "I love Chitter!", + "This is a test peep", + "Hello, world!" + ] + + # Extracts all peep content from the HTML response body using + # regex and stores it in a flattened array called actual_peeps. + actual_peeps = response.body.scan(/

(.+)<\/p>/).flatten + expect(actual_peeps).to eq(expected_peeps) + end + + it "displays the username of peeper" do + response = get "/" + expect(response.status).to eq 200 + + expected_username = "by ringofpower" + actual_username = response.body.scan(/

(.+)<\/p>/).flatten.first + expect(actual_username).to eq(expected_username) + end + + it "displays the time of peep" do + response = get "/" + expect(response.status).to eq 200 + + expected_time = "2022-04-10 11:00:00" + actual_time = response.body.scan(/

(.+)<\/p>/).flatten.first + expect(actual_time).to eq(expected_time) + end + end + + describe "GET /signup" do + it "displays a form to sign up" do + response = get "/signup" + expect(response.status).to eq 200 + expect(response.body).to include("

Sign Up

") + expect(response.body).to include("Username") + expect(response.body).to include("Email") + expect(response.body).to include("Password") + end + end + + describe "POST /signup" do + it "creates a new user" do + response = post "/signup", { username: "testuser", name: "Test User", password: "password123", email: "test@example.com" } + + # 302 is the status code for a redirect + expect(response.status).to eq 302 + expect(UserRepository.new.all.length).to eq 4 + expect(UserRepository.new.all.last.username).to eq "testuser" + end + end + + describe "GET /login" do + it "displays a form to log in" do + response = get "/login" + expect(response.status).to eq 200 + expect(response.body).to include("Chitter - Login") + expect(response.body).to include("Email") + expect(response.body).to include("Password") + end + end + + describe "POST /login" do + it "logs in a user" do + response = post "/login", { email: "donald@example.com", password: "abc123" } + + expect(response.status).to eq 302 + follow_redirect! + + expect(last_response.status).to eq 200 + expect(last_response.body).to include("Welcome") + expect(last_response.body).to include("Orangeman") + end + end + + describe "GET /logout" do + it "logs out a user" do + response = post "/login", { email: "donald@example.com", password: "abc123" } + + expect(response.status).to eq 302 + follow_redirect! + + response = get "/" + expect(response.status).to eq 200 + expect(last_response.body).to include(">Sign up") + end + end + + describe "POST /peeps" do + it "creates a new peep" do + response = post "/login", { email: "donald@example.com", password: "abc123" } + + expect(response.status).to eq 302 + follow_redirect! + + response = post "/peeps", { content: "This is a test peep" } + expect(response.status).to eq 302 + follow_redirect! + + expect(last_response.status).to eq 200 + expect(last_response.body).to include("This is a test peep") + end + end +end diff --git a/spec/peeps_repository_spec.rb b/spec/peeps_repository_spec.rb new file mode 100644 index 0000000000..c5d8d7033b --- /dev/null +++ b/spec/peeps_repository_spec.rb @@ -0,0 +1,37 @@ +require 'peeps' +require 'peeps_repository' + +def reset_tables + seed_sql = File.read('spec/seeds/chitter_seed.sql') + connection = PG.connect({ host: '127.0.0.1', dbname: 'chitter_test' }) + connection.exec(seed_sql) +end + +describe PeepRepository do + before(:each) do + reset_tables + end + + it 'returns all peeps in reverse chronological order' do + repo = PeepRepository.new + + peeps = repo.all + expect(peeps.length).to eq(6) + expect(peeps.last.content).to eq('Hello, world!') + expect(peeps.last.user_id).to eq(1) + expect(peeps.last.created_at).to eq('2022-04-09 10:00:00') + expect(peeps.last.username).to eq('orangeman') + end + + it 'creates a new peep' do + repo = PeepRepository.new + + repo.create(content: 'New test peep', user_id: 1) + + peeps = repo.all + expect(peeps.length).to eq(7) + expect(peeps.first.content).to eq('New test peep') + expect(peeps.last.user_id).to eq(1) + expect(peeps.last.username).to eq('orangeman') + end +end diff --git a/spec/seeds/chitter_seed.sql b/spec/seeds/chitter_seed.sql new file mode 100644 index 0000000000..e314c306f1 --- /dev/null +++ b/spec/seeds/chitter_seed.sql @@ -0,0 +1,28 @@ +TRUNCATE TABLE users, peeps, notifications RESTART IDENTITY; + +INSERT INTO users (name, username, email, password_hash) +VALUES + ('Donald', 'orangeman', 'donald@example.com', '$2a$12$DZagv8/ATHdJDawRjWGs8O2GO5AG/CgvbwgddzVakqQhXcM8Cw512'), + ('Elon', 'manchild', 'elon@example.com', '$2a$12$9kXkcQYCUa9m3MObwyb9Eey0GE2T8tEzJnzDo2BD.tb/Ojoq3ft2S'), + ('Gandalf', 'ringofpower', 'gandalf@example.com', '$2a$12$VACYIR4w6GnPOeYQk3W6au7lkssN2mGOSCsql899i3KjKN6qhs1Ba'); + +INSERT INTO peeps (content, created_at, user_id) +VALUES + ('Hello, world!', '2022-04-09 10:00:00', 1), + ('This is a test peep', '2022-04-09 11:00:00', 2), + ('I love Chitter!', '2022-04-09 12:00:00', 3), + ('Just finished a long day at work', '2022-04-10 09:00:00', 1), + ('Can''t wait for the weekend', '2022-04-10 10:00:00', 2), + ('Going to the beach tomorrow', '2022-04-10 11:00:00', 3); + +INSERT INTO notifications (user_id, peep_id, created_at) +VALUES + (1, 2, '2022-04-09 11:30:00'), + (2, 3, '2022-04-09 12:30:00'), + (3, 1, '2022-04-09 13:30:00'), + (1, 5, '2022-04-10 10:30:00'), + (2, 6, '2022-04-10 11:30:00'); + + -- donald abc123 + -- elon xyz789 + -- gandalf 123456 \ No newline at end of file diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 252747d899..69d9d7c341 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,5 +1,10 @@ require 'simplecov' require 'simplecov-console' +require 'database_connection' + +ENV['ENV'] = 'test' + +DatabaseConnection.connect SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new([ SimpleCov::Formatter::Console, diff --git a/spec/users_repository_spec.rb b/spec/users_repository_spec.rb new file mode 100644 index 0000000000..c36408172d --- /dev/null +++ b/spec/users_repository_spec.rb @@ -0,0 +1,60 @@ +require 'users' +require 'users_repository' + +def reset_tables + seed_sql = File.read('spec/seeds/chitter_seed.sql') + connection = PG.connect({ host: '127.0.0.1', dbname: 'chitter_test' }) + connection.exec(seed_sql) +end + +describe UserRepository do + before(:each) do + reset_tables + end + + describe '#all' do + it 'lists all users' do + repo = UserRepository.new + users = repo.all + + expect(users.length).to eq(3) + expect(users.first.id).to eq(1) + expect(users.first.username).to eq('orangeman') + expect(users.first.email).to eq('donald@example.com') + expect(users.last.id).to eq(3) + end + end + + describe '#create' do + it 'creates a new user' do + repo = UserRepository.new + user = repo.create( + username: 'test user', + name: 'test name', + password_hash: '123456', + email: 'test@example.com' + ) + + users = repo.all + expect(user.id).to eq(4) + expect(user.username).to eq('test user') + expect(user.name).to eq('test name') + expect(user.email).to eq('test@example.com') + + + expect(user.password_hash).to eq('123456 ') + end + end + + describe '#find' do + it 'finds a user by email' do + repo = UserRepository.new + user = repo.find_user_by_email('donald@example.com') + + expect(user.id).to eq(1) + expect(user.username).to eq('orangeman') + expect(user.name).to eq('Donald') + expect(user.email).to eq('donald@example.com') + end + end +end diff --git a/views/loggedin.erb b/views/loggedin.erb new file mode 100644 index 0000000000..5800407252 --- /dev/null +++ b/views/loggedin.erb @@ -0,0 +1,144 @@ + + + + + Chitter + + + +
+ +
+ Welcome, <%= current_user.username.capitalize %> +
+ Logout +
+ +
+
+

Create a new peep

+
+ + +
+
+ +
+

Peeps

+
    + <% @peeps.each do |peep| %> +
  • +

    <%= peep.content %>

    +

    by <%= peep.username %>

    +

    <%= peep.created_at %>

    +
  • + <% end %> +
+ +
+

Chitter © 2023

+
+ + \ No newline at end of file diff --git a/views/login.erb b/views/login.erb new file mode 100644 index 0000000000..7352ad4899 --- /dev/null +++ b/views/login.erb @@ -0,0 +1,90 @@ + + + + + Chitter - Login + + + +
+ + Sign up + Login +
+ + +
+ + +
+
+ + +
+
+ +
+ + + diff --git a/views/peep.erb b/views/peep.erb new file mode 100644 index 0000000000..d89bc8eb54 --- /dev/null +++ b/views/peep.erb @@ -0,0 +1,92 @@ + + + + + Chitter + + + +
+ +
+ Sign up + Log in +
+
+ +
+

Peeps

+
    + <% @peeps.each do |peep| %> +
  • +

    <%= peep.content %>

    +

    by <%= peep.username %>

    +

    <%= peep.created_at %>

    +
  • + <% end %> +
+
+ +
+

Chitter © 2023

+
+ + diff --git a/views/signup.erb b/views/signup.erb new file mode 100644 index 0000000000..2c50ee7377 --- /dev/null +++ b/views/signup.erb @@ -0,0 +1,128 @@ + + + + + Chitter - Sign Up + + + +
+ +
+ Home + Log In +
+
+ +
+

Sign Up

+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+ + +