diff --git a/:w b/:w new file mode 100644 index 0000000000..190fd90255 --- /dev/null +++ b/:w @@ -0,0 +1,45 @@ +class User < ApplicationRecord + # Include default devise modules. Others available are: + # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable + devise :database_authenticatable, :registerable, + :recoverable, :rememberable, :validatable + + validates :name, presence: true, length: { maximum: 20 } + + has_many :friendships + has_many :friends, through: :friendships + has_many :inverse_friendships, class_name: "Friendship", foreign_key: "friend_id" + has_many :posts + has_many :comments, dependent: :destroy + has_many :likes, dependent: :destroy + + def pending + self.status = 'p' + end + + def friends + friends_array = friendships.map{ |friendship| friendship.friend if friendship.status == 'a' } + friends_array.compact + end + + def confirm_friend(user) + friendship = inverse_friendships.find{ |friendship| friendship.user == user } + friendship.status = 'a' + friendship.save + end + + def friend?(user) + friends.include?(user) + end + + def pending_friends + friends_array = friendships.map{ |friendship| friendship.friend if !friendship.status = 'p' } + friends_array.compact + end + + def reject_friend(user) + friendship = inverse_friendships.find{ |friendship| friendship.user == user } + friendship.status = 'r' + friendship.save + end +end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 8b67bdac87..6ff4ab1283 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -3,12 +3,21 @@ class UsersController < ApplicationController before_action :authenticate_user! def index - @users = User.all + @users = User.find_by_sql(["SELECT * FROM users WHERE id != ? ", current_user.id]) end def show @user = User.find(params[:id]) @posts = @user.posts.ordered_by_most_recent end - + + def follow_user + user_id = params[:user_id] + if Friendship.create(user_id: current_user.id, friend_id: user_id) + flash[:success] = "Request Sent" + else + flash[:danger] = "Failure to send request" + end + redirect_to users_path + end end diff --git a/app/models/friendship.rb b/app/models/friendship.rb index fa783ddd12..8caba44c1d 100644 --- a/app/models/friendship.rb +++ b/app/models/friendship.rb @@ -1,4 +1,6 @@ class Friendship < ApplicationRecord belongs_to :user belongs_to :friend, class_name: "User" + + validates_uniqueness_of :user_id, scope: :friend_id end diff --git a/app/models/user.rb b/app/models/user.rb index 2597b56d8b..190fd90255 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -13,6 +13,10 @@ class User < ApplicationRecord has_many :comments, dependent: :destroy has_many :likes, dependent: :destroy + def pending + self.status = 'p' + end + def friends friends_array = friendships.map{ |friendship| friendship.friend if friendship.status == 'a' } friends_array.compact diff --git a/app/views/users/index.html.erb b/app/views/users/index.html.erb index 60fd136be6..da4de36c06 100644 --- a/app/views/users/index.html.erb +++ b/app/views/users/index.html.erb @@ -7,6 +7,10 @@ <%= link_to 'See Profile', user_path(user), class: 'profile-link' %> <%= send_button(user.id) %> + <%= form_tag follow_user_path, method: :post do %> + <%= hidden_field_tag :user_id, user.id %> + <%= submit_tag "Request", class: 'btn btn-primary btn-sm' %> + <% end %> <% end %> diff --git a/config/routes.rb b/config/routes.rb index 03b36da121..97cf5d264d 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -9,7 +9,7 @@ resources :comments, only: [:create] resources :likes, only: [:create, :destroy] end - + post "follow/user" => "users#follow_user", as: :follow_user post 'send_invitation' => 'users#send_invitation' # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html end