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 @@ +

New Post

+ +
+
+ + +
+
+ +
+
\ No newline at end of file diff --git a/app/views/finstagram_posts/show.erb b/app/views/finstagram_posts/show.erb new file mode 100644 index 000000000..83ab75d79 --- /dev/null +++ b/app/views/finstagram_posts/show.erb @@ -0,0 +1,39 @@ +
+

Finstagram

+
+ <% if current_user %> + <%= current_user.username %> + Logout + <% else %> + Login + Signup + <% end %> +
+
+
+
+ + + finstagram post from <%= @finstagram_post.user.username %> + +
+ <%= @finstagram_post.like_count %> likes + <%= @finstagram_post.comment_count %> comments +
+ <%= erb(:"shared/finstagram_post", { locals: { finstagram_post: @finstagram_post, allow_new_comment: true }}) %> + +
+
\ No newline at end of file diff --git a/app/views/index.erb b/app/views/index.erb new file mode 100644 index 000000000..3b1185cab --- /dev/null +++ b/app/views/index.erb @@ -0,0 +1,22 @@ +<% if current_user %> +
+ New Post +
+<% end %> +
+

Finstagram

+
+ <% if current_user %> + <%= current_user.username %> + Logout + <% else %> + Login + Signup + <% end %> +
+
+
+ <% @finstagram_posts.each do |finstagram_post| %> + <%= erb(:"shared/finstagram_post", { locals: { finstagram_post: finstagram_post, allow_new_comment: false }}) %> +<% end %> +
\ No newline at end of file diff --git a/app/views/index.html b/app/views/index.html deleted file mode 100644 index e69de29bb..000000000 diff --git a/app/views/layout.erb b/app/views/layout.erb new file mode 100644 index 000000000..d7cc47e0a --- /dev/null +++ b/app/views/layout.erb @@ -0,0 +1,28 @@ + + + + + + + Finstagram + + +
+

+ Finstagram +

+
+ <% if current_user %> + <%= current_user.username %> + Logout + <% else %> + Login + Signup + <% end %> +
+
+
+ <%= yield %> +
+ + \ No newline at end of file diff --git a/app/views/login.erb b/app/views/login.erb new file mode 100644 index 000000000..6b120f75d --- /dev/null +++ b/app/views/login.erb @@ -0,0 +1,14 @@ +

Login to Finstagram

+
+
+ + +
+
+ + +
+
+ +
+
\ No newline at end of file diff --git a/app/views/shared/finstagram_post.erb b/app/views/shared/finstagram_post.erb new file mode 100644 index 000000000..cb4424fcd --- /dev/null +++ b/app/views/shared/finstagram_post.erb @@ -0,0 +1,31 @@ +
+
+ <%= finstagram_post.user.username %> +

<%= finstagram_post.user.username %>

+

<%= finstagram_post.humanized_time_ago %>

+
+ + + + +
+ <%= erb(:"shared/likes", { locals: { finstagram_post: finstagram_post }}) %> + <%= finstagram_post.comment_count %> comments +
+ +
+<% if current_user && allow_new_comment %> + <%= erb(:"shared/new_comment", { locals: { finstagram_post: finstagram_post }}) %> +<% end %> +
    + <% finstagram_post.comments.each do |comment| %> +
  • +

    + <%= comment.user.username %>: <%= comment.text %> +

    +
  • + <% end %> +
+
+ +
\ No newline at end of file diff --git a/app/views/shared/likes.erb b/app/views/shared/likes.erb new file mode 100644 index 000000000..05a997c05 --- /dev/null +++ b/app/views/shared/likes.erb @@ -0,0 +1,29 @@ + +<% if current_user %> + + + <% if like = current_user.likes.find_by({ finstagram_post_id: finstagram_post.id }) %> + + +
+ + +
+ + <% else %> + + +
+ + +
+ <% end %> +<% else %> + + + <%= finstagram_post.like_count %> likes +<% end %> \ No newline at end of file diff --git a/app/views/shared/new_comment.erb b/app/views/shared/new_comment.erb new file mode 100644 index 000000000..2ebf6238a --- /dev/null +++ b/app/views/shared/new_comment.erb @@ -0,0 +1,9 @@ +
+
+ +
+ +
+ +
+
\ No newline at end of file diff --git a/app/views/signup.erb b/app/views/signup.erb new file mode 100644 index 000000000..a717acbf1 --- /dev/null +++ b/app/views/signup.erb @@ -0,0 +1,22 @@ +

Join Finstagram!

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
\ No newline at end of file diff --git a/db/db.sqlite3 b/db/db.sqlite3 new file mode 100644 index 000000000..b5dfa0345 Binary files /dev/null and b/db/db.sqlite3 differ diff --git a/db/schema.rb b/db/schema.rb new file mode 100644 index 000000000..c2f2d7cd9 --- /dev/null +++ b/db/schema.rb @@ -0,0 +1,47 @@ +# encoding: UTF-8 +# This file is auto-generated from the current state of the database. Instead +# of editing this file, please use the migrations feature of Active Record to +# incrementally modify your database, and then regenerate this schema definition. +# +# Note that this schema.rb definition is the authoritative source for your +# database schema. If you need to create the application database on another +# system, you should be using db:schema:load, not running all the migrations +# from scratch. The latter is a flawed and unsustainable approach (the more migrations +# you'll amass, the slower it'll run and the greater likelihood for issues). +# +# It's strongly recommended that you check this file into your version control system. + +ActiveRecord::Schema.define(version: 0) do + + create_table "comments", force: :cascade do |t| + t.integer "user_id" + t.integer "finstagram_post_id" + t.text "text" + t.datetime "created_at" + t.datetime "updated_at" + end + + create_table "finstagram_posts", force: :cascade do |t| + t.integer "user_id" + t.string "photo_url" + t.datetime "created_at" + t.datetime "updated_at" + end + + create_table "likes", force: :cascade do |t| + t.integer "user_id" + t.integer "finstagram_post_id" + t.datetime "created_at" + t.datetime "updated_at" + end + + create_table "users", force: :cascade do |t| + t.string "username" + t.string "avatar_url" + t.string "email" + t.string "password" + t.datetime "created_at" + t.datetime "updated_at" + end + +end diff --git a/public/stylesheets/app.css b/public/stylesheets/app.css index e69de29bb..53151cc1d 100755 --- a/public/stylesheets/app.css +++ b/public/stylesheets/app.css @@ -0,0 +1,36 @@ +header { + background-color: #244751; + color: #E8FDFF; +} + +body { + background-color: whitesmoke; +} +main { + background-color: white; + padding: 16px; +} + + +.my-class-name finstagram-post { + margin-bottom: 48px; +} +#tanya { color: violet } + +.finstagram-post .user-info img { + border-radius: 100%; +} +body { + font-family: 'Pacifico', cursive; +} + +h3 {color: brown} +h2 {color: black} +a.photo:hover{ + padding: 10px; transition: padding 0.5s; } +a.photo{ + transition: padding 0.5s; + } + a.photo:hover{ + padding: 10px; + } \ No newline at end of file