From e999470b72b40c362885d0bff2b840291554ca85 Mon Sep 17 00:00:00 2001 From: "Jesse C. Fisher" Date: Wed, 15 Nov 2023 12:30:47 +0000 Subject: [PATCH] Add microposts --- Gemfile | 1 + Gemfile.lock | 2 + app/assets/javascripts/microposts.coffee | 3 + app/assets/stylesheets/application.css.sass | 1 + app/assets/stylesheets/microposts.scss | 3 + app/controllers/microposts_controller.rb | 21 +++++++ app/controllers/users_controller.rb | 14 ++++- app/helpers/microposts_helper.rb | 2 + app/models/micropost.rb | 6 ++ app/models/user.rb | 2 +- app/policies/micropost_policy.rb | 55 +++++++++++++++++++ app/policies/user_policy.rb | 4 ++ app/views/layouts/_footer.html.haml | 3 +- app/views/layouts/_navigation_links.html.erb | 8 +-- app/views/microposts/_micropost.html.haml | 4 ++ app/views/shared/_micropost_form.html.haml | 6 ++ app/views/users/show.html.erb | 7 --- app/views/users/show.html.haml | 14 +++++ config/routes.rb | 15 ++++- .../20231114160910_create_microposts.rb | 11 ++++ db/schema.rb | 12 +++- db/seeds.rb | 7 +++ spec/factories/microposts.rb | 6 ++ spec/helpers/microposts_helper_spec.rb | 15 +++++ spec/models/micropost_spec.rb | 5 ++ spec/requests/microposts_spec.rb | 7 +++ 26 files changed, 218 insertions(+), 16 deletions(-) create mode 100644 app/assets/javascripts/microposts.coffee create mode 100644 app/assets/stylesheets/microposts.scss create mode 100644 app/controllers/microposts_controller.rb create mode 100644 app/helpers/microposts_helper.rb create mode 100644 app/models/micropost.rb create mode 100644 app/policies/micropost_policy.rb create mode 100644 app/views/microposts/_micropost.html.haml create mode 100644 app/views/shared/_micropost_form.html.haml delete mode 100644 app/views/users/show.html.erb create mode 100644 app/views/users/show.html.haml create mode 100644 db/migrate/20231114160910_create_microposts.rb create mode 100644 spec/factories/microposts.rb create mode 100644 spec/helpers/microposts_helper_spec.rb create mode 100644 spec/models/micropost_spec.rb create mode 100644 spec/requests/microposts_spec.rb diff --git a/Gemfile b/Gemfile index 950e3895..f5ec0667 100644 --- a/Gemfile +++ b/Gemfile @@ -82,3 +82,4 @@ gem 'inline_svg' gem 'importmap-rails' gem 'turbo-rails' gem 'stimulus-rails' +gem 'will_paginate' diff --git a/Gemfile.lock b/Gemfile.lock index d500a093..352421c1 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -481,6 +481,7 @@ GEM websocket-driver (0.7.6) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) + will_paginate (4.0.0) xpath (3.2.0) nokogiri (~> 1.8) zeitwerk (2.6.12) @@ -559,6 +560,7 @@ DEPENDENCIES turbo-rails uglifier webdrivers + will_paginate RUBY VERSION ruby 2.7.7p221 diff --git a/app/assets/javascripts/microposts.coffee b/app/assets/javascripts/microposts.coffee new file mode 100644 index 00000000..24f83d18 --- /dev/null +++ b/app/assets/javascripts/microposts.coffee @@ -0,0 +1,3 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://coffeescript.org/ diff --git a/app/assets/stylesheets/application.css.sass b/app/assets/stylesheets/application.css.sass index 54af7f06..b53b4ea3 100644 --- a/app/assets/stylesheets/application.css.sass +++ b/app/assets/stylesheets/application.css.sass @@ -176,6 +176,7 @@ footer background: #e1b02733 box-shadow: 0px 0px 8px #00000042 border-radius: 12em + display: inline-block #skyspaces width: 100% diff --git a/app/assets/stylesheets/microposts.scss b/app/assets/stylesheets/microposts.scss new file mode 100644 index 00000000..eebf0a4b --- /dev/null +++ b/app/assets/stylesheets/microposts.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the Microposts controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: https://sass-lang.com/ diff --git a/app/controllers/microposts_controller.rb b/app/controllers/microposts_controller.rb new file mode 100644 index 00000000..29ff2fda --- /dev/null +++ b/app/controllers/microposts_controller.rb @@ -0,0 +1,21 @@ +class MicropostsController < ApplicationController + def create + @micropost = current_user.microposts.build(micropost_params) + authorize @micropost + if @micropost.save + flash[:success] = "Micropost created!" + redirect_to root_url + else + render 'users/show' + end + end + + def destroy + end + + private + + def micropost_params + params.require(:micropost).permit(:content) + end +end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 909b9481..c2344924 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -8,10 +8,22 @@ class UsersController < ApplicationController end def show - @user = User.find(params[:id]) + @user ||= User.find(params[:id]) + @micropost = current_user.microposts.build if current_user.signed_in? + @microposts = @user.microposts.paginate(page: params[:page]) authorize @user end + def home + authorize current_user + # @user = current_user + # @micropost = current_user.microposts.build if current_user.signed_in? + # @microposts = @user.microposts.paginate(page: params[:page]) + # authorize @user + redirect_to current_user + end + + def update @user = User.find(params[:id]) authorize @user diff --git a/app/helpers/microposts_helper.rb b/app/helpers/microposts_helper.rb new file mode 100644 index 00000000..f08aad24 --- /dev/null +++ b/app/helpers/microposts_helper.rb @@ -0,0 +1,2 @@ +module MicropostsHelper +end diff --git a/app/models/micropost.rb b/app/models/micropost.rb new file mode 100644 index 00000000..ad4b4197 --- /dev/null +++ b/app/models/micropost.rb @@ -0,0 +1,6 @@ +class Micropost < ActiveRecord::Base + belongs_to :user + default_scope -> { order(created_at: :desc) } + validates :user_id, presence: true + validates :content, presence: true, length: { maximum: 140 } +end diff --git a/app/models/user.rb b/app/models/user.rb index ad8f5709..7dbcd249 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -11,7 +11,7 @@ class User < ActiveRecord::Base foreign_key: "follower_id", dependent: :destroy has_many :following, through: :active_relationships, source: :followed - + has_many :microposts, dependent: :destroy def icid stp = SoftTokenPrincipal.where(soft_token: self.soft_token).first_or_initialize diff --git a/app/policies/micropost_policy.rb b/app/policies/micropost_policy.rb new file mode 100644 index 00000000..34e9239a --- /dev/null +++ b/app/policies/micropost_policy.rb @@ -0,0 +1,55 @@ +class MicropostPolicy + attr_reader :user, :model + + def initialize(user, model) + @user = user || User.new + @micropost = model + end + + class Scope + def initialize(user, scope) + @user = user + @scope = scope + end + + def resolve + if user.admin? + scope.all + else + scope.all + end + end + + private + + attr_reader :user, :scope + end + + def index? + @user.admin? || true + end + + def show? + @user.admin? || true + end + + def new? + @user.signed_in? + end + + def create? + @user.signed_in? + end + + def edit? + update? + end + + def update? + @user.admin? || @user == @micropost.user + end + + def destroy? + @user.admin? || @user == @micropost.user + end +end diff --git a/app/policies/user_policy.rb b/app/policies/user_policy.rb index e308b0bd..50a9c0ad 100644 --- a/app/policies/user_policy.rb +++ b/app/policies/user_policy.rb @@ -33,6 +33,10 @@ class UserPolicy @current_user.admin? || @current_user == @user end + def home? + @current_user.admin? || @current_user == @user + end + def update? @current_user.admin? end diff --git a/app/views/layouts/_footer.html.haml b/app/views/layouts/_footer.html.haml index 55ce3bbe..4b5b6f14 100644 --- a/app/views/layouts/_footer.html.haml +++ b/app/views/layouts/_footer.html.haml @@ -1,5 +1,6 @@ -# = link_to (image_tag "telegram-logo.png", height: 32, width: 32), "https://t.me/+IEp-tAetjYozYWM5" -# - @tokens = Token.all -.footer-tokens +-# .footer-tokens + %h3 Tokens - @footer_tokens.each do |token| = link_to token.name, token diff --git a/app/views/layouts/_navigation_links.html.erb b/app/views/layouts/_navigation_links.html.erb index cc1dcabf..b9cb498f 100644 --- a/app/views/layouts/_navigation_links.html.erb +++ b/app/views/layouts/_navigation_links.html.erb @@ -1,9 +1,9 @@