diff --git a/.gitignore b/.gitignore index 0e9472f6a..0a476d020 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ -db/db.sqlite3 \ No newline at end of file +class FinstagramPost < ActiveRecord::Base + +end \ No newline at end of file diff --git a/.gitpod.yml b/.gitpod.yml new file mode 100644 index 000000000..befe419f2 --- /dev/null +++ b/.gitpod.yml @@ -0,0 +1,4 @@ +vscode: + extensions: + - CraigMaslowski.erb@0.0.1:5znDha/nn0PphUrpB9a5Nw== + - rebornix.ruby@0.26.0:RN+gv0dPjYfMqlcEEralhg== \ No newline at end of file diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 000000000..237081948 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,93 @@ +GEM + remote: https://rubygems.org/ + specs: + activemodel (4.2.11.1) + activesupport (= 4.2.11.1) + builder (~> 3.1) + activerecord (4.2.11.1) + activemodel (= 4.2.11.1) + activesupport (= 4.2.11.1) + arel (~> 6.0) + activesupport (4.2.11.1) + i18n (~> 0.7) + minitest (~> 5.1) + thread_safe (~> 0.3, >= 0.3.4) + tzinfo (~> 1.1) + arel (6.0.4) + backports (3.15.0) + bond (0.5.1) + builder (3.2.3) + coderay (1.1.2) + concurrent-ruby (1.1.5) + i18n (0.9.5) + concurrent-ruby (~> 1.0) + method_source (0.9.2) + minitest (5.13.0) + multi_json (1.14.1) + mustermann (1.0.3) + nio4r (2.5.2) + pry (0.12.2) + coderay (~> 1.1.0) + method_source (~> 0.9.0) + puma (4.3.0) + nio4r (~> 2.0) + rack (2.0.7) + rack-protection (2.0.7) + rack + rack-test (0.6.3) + rack (>= 1.0) + rake (13.0.0) + ripl (0.7.1) + bond (~> 0.5.1) + ripl-multi_line (0.3.1) + ripl (>= 0.3.6) + ripl-rack (0.2.1) + rack (>= 1.0) + rack-test (~> 0.6.2) + ripl (>= 0.7.0) + shotgun (0.9.2) + rack (>= 1.0) + sinatra (2.0.7) + mustermann (~> 1.0) + rack (~> 2.0) + rack-protection (= 2.0.7) + tilt (~> 2.0) + sinatra-activerecord (2.0.14) + activerecord (>= 3.2) + sinatra (>= 1.0) + sinatra-contrib (2.0.7) + backports (>= 2.8.2) + multi_json + mustermann (~> 1.0) + rack-protection (= 2.0.7) + sinatra (= 2.0.7) + tilt (~> 2.0) + sqlite3 (1.3.13) + thread_safe (0.3.6) + tilt (2.0.10) + tux (0.3.0) + ripl (>= 0.3.5) + ripl-multi_line (>= 0.2.4) + ripl-rack (>= 0.2.0) + sinatra (>= 1.2.1) + tzinfo (1.2.5) + thread_safe (~> 0.1) + +PLATFORMS + ruby + +DEPENDENCIES + activerecord (~> 4.2.0) + activesupport + pry + puma + rake + shotgun + sinatra + sinatra-activerecord + sinatra-contrib + sqlite3 (~> 1.3.6) + tux + +BUNDLED WITH + 2.0.2 diff --git a/README.md b/README.md index 2577b6932..9b346aeda 100644 --- a/README.md +++ b/README.md @@ -26,3 +26,7 @@ We suggest our students use [GitPod](https://www.gitpod.io/) to work on this pro 4. You'll see _Open Preview_ and _Open Browser_, either of which will allow you to open your project in a new window or tab or preview pane. Go ahead and click on your preference (or try both at first to see which one you prefer). You're now set up and ready to work on this project! + + +### Database create +bundle exec rake db:migrate \ No newline at end of file diff --git a/app/actions.rb b/app/actions.rb index e69de29bb..f0b6b1594 100755 --- a/app/actions.rb +++ b/app/actions.rb @@ -0,0 +1,107 @@ +get '/' do + @finstagram_posts = FinstagramPost.order(created_at: :desc) + erb(:index) +end + +helpers do + def current_user + return User.find_by(id: session[:user_id]) + end +end + +post '/login' do + username = params[:username] + password = params[:password] + + @user = User.find_by(username: username) + + if @user && @user.password == password + session[:user_id] = @user.id + "Success! User with id #{session[:user_id]} is logged in!" + else + @error_message = "Login failed." + erb(:login) + end +end + +get '/login' do # when a GET request comes into /login + erb(:login) # render app/views/login.erb +end + +get '/logout' do + session[:user_id] = nil + "Logout successful!" +end + +post '/signup' do + + # grab user input values from params + email = params[:email] + avatar_url = params[:avatar_url] + username = params[:username] + password = params[:password] + + # instantiate and save a User + user = User.new({ email: email, avatar_url: avatar_url, username: username, password: password }) + user.save + + # return readable representation of User object + escape_html user.inspect +end + +get '/signup' do # if a user navigates to the path "/signup", + @user = User.new # setup empty @user object + erb(:signup) # render "app/views/signup.erb" +end + +get '/finstagram_posts/new' do + @finstagram_post = FinstagramPost.new + erb(:"finstagram_posts/new") +end + +post '/finstagram_posts' do + photo_url = params[:photo_url] + + @finstagram_post = FinstagramPost.new({ photo_url: photo_url, user_id: current_user.id }) + + if @finstagram_post.save + redirect(to('/')) + else + erb(:"finstagram_posts/new") + end +end + +get '/finstagram_posts/:id' do + @finstagram_post = FinstagramPost.find(params[:id]) # find the finstagram post with the ID from the URL + erb(:"finstagram_posts/show") # render app/views/finstagram_posts/show.erb +end + +post '/comments' do + # point values from params to variables + text = params[:text] + finstagram_post_id = params[:finstagram_post_id] + + # instantiate a comment with those values & assign the comment to the `current_user` + comment = Comment.new({ text: text, finstagram_post_id: finstagram_post_id, user_id: current_user.id }) + + # save the comment + comment.save + + # `redirect` back to wherever we came from + redirect(back) +end + +post '/likes' do + finstagram_post_id = params[:finstagram_post_id] + + like = Like.new({ finstagram_post_id: finstagram_post_id, user_id: current_user.id }) + like.save + + redirect(back) +end + +delete '/likes/:id' do + like = Like.find(params[:id]) + like.destroy + redirect(back) +end \ No newline at end of file diff --git a/app/models/comment.rb b/app/models/comment.rb new file mode 100644 index 000000000..a6dd513a5 --- /dev/null +++ b/app/models/comment.rb @@ -0,0 +1,10 @@ +class Comment < ActiveRecord::Base + + # Associations from a previous exercise + belongs_to :user + belongs_to :finstagram_post + + # New validation code + validates_presence_of :text, :user, :finstagram_post + +end \ No newline at end of file diff --git a/app/models/finstagram_post.rb b/app/models/finstagram_post.rb new file mode 100644 index 000000000..cfbb407b1 --- /dev/null +++ b/app/models/finstagram_post.rb @@ -0,0 +1,38 @@ +class FinstagramPost < ActiveRecord::Base + + # (this is where your associations are, e.g. has_many :finstagram_posts, etc.)... + + # validations in between association definitions and methods! + validates :photo_url, :user, presence: true + + # (this is where your def humanized_time_ago method is, along with the rest of your methods in this file)... + + + + belongs_to :user + has_many :comments + has_many :likes + + + + def humanized_time_ago + time_ago_in_seconds = Time.now - self.created_at + time_ago_in_minutes = time_ago_in_seconds / 60 + + if time_ago_in_minutes >= 60 + "#{(time_ago_in_minutes / 60).to_i} hours ago" + else + "#{time_ago_in_minutes.to_i} minutes ago" + end + + end + # New Stuff Start + def like_count + self.likes.size + end + + def comment_count + self.comments.size + end + # New Stuff End +end \ No newline at end of file diff --git a/app/models/like.rb b/app/models/like.rb new file mode 100644 index 000000000..72c5bd3cd --- /dev/null +++ b/app/models/like.rb @@ -0,0 +1,7 @@ +class Like < ActiveRecord::Base + + belongs_to :user + belongs_to :finstagram_post + validates_presence_of :user, :finstagram_post + +end \ No newline at end of file diff --git a/app/models/user.rb b/app/models/user.rb new file mode 100644 index 000000000..3b12f1f11 --- /dev/null +++ b/app/models/user.rb @@ -0,0 +1,7 @@ +class User < ActiveRecord::Base + + has_many :finstagram_posts + has_many :comments + has_many :likes + +end \ No newline at end of file diff --git a/app/views/finstagram_posts/new.erb b/app/views/finstagram_posts/new.erb new file mode 100644 index 000000000..a22b6f2c3 --- /dev/null +++ b/app/views/finstagram_posts/new.erb @@ -0,0 +1,15 @@ +
+ <%= comment.user.username %>: <%= comment.text %> +
+
+ <%= comment.user.username %>: <%= comment.text %> +
+