Adding config for puma, dashboard layout, fixing some queries

This commit is contained in:
Eugen Rochko 2016-03-12 16:09:46 +01:00
parent 447cfef62d
commit aab9f57e36
25 changed files with 264 additions and 134 deletions

View file

@ -14,7 +14,7 @@ gem 'puma'
gem 'haml-rails' gem 'haml-rails'
gem 'pg' gem 'pg'
gem 'dotenv-rails' gem 'dotenv-rails'
gem 'font-awesome-sass' gem 'font-awesome-rails'
gem 'paranoia', '~> 2.0' gem 'paranoia', '~> 2.0'
gem 'paperclip', '~> 4.3' gem 'paperclip', '~> 4.3'
@ -34,7 +34,6 @@ gem 'hiredis'
gem 'redis', '~>3.2' gem 'redis', '~>3.2'
gem 'fast_blank' gem 'fast_blank'
gem 'htmlentities' gem 'htmlentities'
gem 'message_bus'
gem 'onebox' gem 'onebox'
group :development, :test do group :development, :test do
@ -52,7 +51,6 @@ end
group :development do group :development do
gem 'web-console', '~> 2.0' gem 'web-console', '~> 2.0'
gem 'spring'
gem 'rubocop', require: false gem 'rubocop', require: false
gem 'better_errors' gem 'better_errors'
gem 'binding_of_caller' gem 'binding_of_caller'

View file

@ -41,7 +41,7 @@ GEM
ast (2.2.0) ast (2.2.0)
backport_new_renderer (1.0.0) backport_new_renderer (1.0.0)
rails rails
bcrypt (3.1.10) bcrypt (3.1.11)
better_errors (2.1.1) better_errors (2.1.1)
coderay (>= 1.0.0) coderay (>= 1.0.0)
erubis (>= 2.6.6) erubis (>= 2.6.6)
@ -61,7 +61,7 @@ GEM
coffee-script-source coffee-script-source
execjs execjs
coffee-script-source (1.10.0) coffee-script-source (1.10.0)
concurrent-ruby (1.0.0) concurrent-ruby (1.0.1)
crack (0.4.3) crack (0.4.3)
safe_yaml (~> 1.0.0) safe_yaml (~> 1.0.0)
debug_inspector (0.0.2) debug_inspector (0.0.2)
@ -74,7 +74,7 @@ GEM
warden (~> 1.2.3) warden (~> 1.2.3)
diff-lcs (1.2.5) diff-lcs (1.2.5)
docile (1.1.5) docile (1.1.5)
domain_name (0.5.20160216) domain_name (0.5.20160309)
unf (>= 0.0.5, < 1.0.0) unf (>= 0.0.5, < 1.0.0)
doorkeeper (3.1.0) doorkeeper (3.1.0)
railties (>= 3.2) railties (>= 3.2)
@ -86,8 +86,8 @@ GEM
execjs (2.6.0) execjs (2.6.0)
fabrication (2.14.1) fabrication (2.14.1)
fast_blank (1.0.0) fast_blank (1.0.0)
font-awesome-sass (4.5.0) font-awesome-rails (4.5.0.1)
sass (>= 3.2) railties (>= 3.2, < 5.1)
fuubar (2.0.0) fuubar (2.0.0)
rspec (~> 3.0) rspec (~> 3.0)
ruby-progressbar (~> 1.4) ruby-progressbar (~> 1.4)
@ -126,8 +126,8 @@ GEM
jbuilder (2.4.1) jbuilder (2.4.1)
activesupport (>= 3.0.0, < 5.1) activesupport (>= 3.0.0, < 5.1)
multi_json (~> 1.2) multi_json (~> 1.2)
jquery-rails (4.1.0) jquery-rails (4.1.1)
rails-dom-testing (~> 1.0) rails-dom-testing (>= 1, < 3)
railties (>= 4.2.0) railties (>= 4.2.0)
thor (>= 0.14, < 2.0) thor (>= 0.14, < 2.0)
json (1.8.3) json (1.8.3)
@ -136,11 +136,8 @@ GEM
nokogiri (>= 1.5.9) nokogiri (>= 1.5.9)
mail (2.6.3) mail (2.6.3)
mime-types (>= 1.16, < 3) mime-types (>= 1.16, < 3)
message_bus (1.1.1)
rack (>= 1.1.3)
redis
method_source (0.8.2) method_source (0.8.2)
mime-types (2.99) mime-types (2.99.1)
mimemagic (0.3.0) mimemagic (0.3.0)
mini_portile2 (2.0.0) mini_portile2 (2.0.0)
minitest (5.8.4) minitest (5.8.4)
@ -149,7 +146,7 @@ GEM
mustache (1.0.2) mustache (1.0.2)
nokogiri (1.6.7.2) nokogiri (1.6.7.2)
mini_portile2 (~> 2.0.0.rc2) mini_portile2 (~> 2.0.0.rc2)
oj (2.14.5) oj (2.14.6)
onebox (1.5.35) onebox (1.5.35)
htmlentities (~> 4.3.4) htmlentities (~> 4.3.4)
moneta (~> 0.8) moneta (~> 0.8)
@ -179,7 +176,7 @@ GEM
slop (~> 3.4) slop (~> 3.4)
pry-rails (0.3.4) pry-rails (0.3.4)
pry (>= 0.9.10) pry (>= 0.9.10)
puma (2.16.0) puma (3.1.0)
quiet_assets (1.1.0) quiet_assets (1.1.0)
railties (>= 3.1, < 5.0) railties (>= 3.1, < 5.0)
rabl (0.12.0) rabl (0.12.0)
@ -221,7 +218,7 @@ GEM
rake (>= 0.8.7) rake (>= 0.8.7)
thor (>= 0.18.1, < 2.0) thor (>= 0.18.1, < 2.0)
rainbow (2.1.0) rainbow (2.1.0)
rake (10.5.0) rake (11.1.0)
rdoc (4.2.2) rdoc (4.2.2)
json (~> 1.4) json (~> 1.4)
redis (3.2.2) redis (3.2.2)
@ -232,7 +229,7 @@ GEM
rspec-core (~> 3.4.0) rspec-core (~> 3.4.0)
rspec-expectations (~> 3.4.0) rspec-expectations (~> 3.4.0)
rspec-mocks (~> 3.4.0) rspec-mocks (~> 3.4.0)
rspec-core (3.4.3) rspec-core (3.4.4)
rspec-support (~> 3.4.0) rspec-support (~> 3.4.0)
rspec-expectations (3.4.0) rspec-expectations (3.4.0)
diff-lcs (>= 1.2.0, < 2.0) diff-lcs (>= 1.2.0, < 2.0)
@ -249,12 +246,12 @@ GEM
rspec-mocks (~> 3.4.0) rspec-mocks (~> 3.4.0)
rspec-support (~> 3.4.0) rspec-support (~> 3.4.0)
rspec-support (3.4.1) rspec-support (3.4.1)
rubocop (0.37.2) rubocop (0.38.0)
parser (>= 2.3.0.4, < 3.0) parser (>= 2.3.0.6, < 3.0)
powerpack (~> 0.1) powerpack (~> 0.1)
rainbow (>= 1.99.1, < 3.0) rainbow (>= 1.99.1, < 3.0)
ruby-progressbar (~> 1.7) ruby-progressbar (~> 1.7)
unicode-display_width (~> 0.3) unicode-display_width (~> 1.0, >= 1.0.1)
ruby-progressbar (1.7.5) ruby-progressbar (1.7.5)
ruby_parser (3.8.1) ruby_parser (3.8.1)
sexp_processor (~> 4.1) sexp_processor (~> 4.1)
@ -276,11 +273,10 @@ GEM
simplecov-html (~> 0.10.0) simplecov-html (~> 0.10.0)
simplecov-html (0.10.0) simplecov-html (0.10.0)
slop (3.6.0) slop (3.6.0)
spring (1.6.3)
sprockets (3.5.2) sprockets (3.5.2)
concurrent-ruby (~> 1.0) concurrent-ruby (~> 1.0)
rack (> 1, < 3) rack (> 1, < 3)
sprockets-rails (3.0.1) sprockets-rails (3.0.4)
actionpack (>= 4.0) actionpack (>= 4.0)
activesupport (>= 4.0) activesupport (>= 4.0)
sprockets (>= 3.0.0) sprockets (>= 3.0.0)
@ -299,7 +295,7 @@ GEM
unf (0.1.4) unf (0.1.4)
unf_ext unf_ext
unf_ext (0.0.7.2) unf_ext (0.0.7.2)
unicode-display_width (0.3.1) unicode-display_width (1.0.2)
warden (1.2.6) warden (1.2.6)
rack (>= 1.0) rack (>= 1.0)
web-console (2.3.0) web-console (2.3.0)
@ -307,7 +303,7 @@ GEM
binding_of_caller (>= 0.7.2) binding_of_caller (>= 0.7.2)
railties (>= 4.0) railties (>= 4.0)
sprockets-rails (>= 2.0, < 4.0) sprockets-rails (>= 2.0, < 4.0)
webmock (1.24.1) webmock (1.24.2)
addressable (>= 2.3.6) addressable (>= 2.3.6)
crack (>= 0.3.2) crack (>= 0.3.2)
hashdiff hashdiff
@ -326,7 +322,7 @@ DEPENDENCIES
dotenv-rails dotenv-rails
fabrication fabrication
fast_blank fast_blank
font-awesome-sass font-awesome-rails
fuubar fuubar
goldfinger goldfinger
haml-rails haml-rails
@ -335,7 +331,6 @@ DEPENDENCIES
http http
jbuilder (~> 2.0) jbuilder (~> 2.0)
jquery-rails jquery-rails
message_bus
nokogiri nokogiri
oj oj
onebox onebox
@ -357,7 +352,6 @@ DEPENDENCIES
sass-rails (~> 5.0) sass-rails (~> 5.0)
sdoc (~> 0.4.0) sdoc (~> 0.4.0)
simplecov simplecov
spring
sqlite3 sqlite3
therubyracer therubyracer
uglifier (>= 1.3.0) uglifier (>= 1.3.0)

View file

@ -9,7 +9,6 @@ $lighter-text-color: #8b8687;
@import url(https://fonts.googleapis.com/css?family=Roboto:400,500,400italic); @import url(https://fonts.googleapis.com/css?family=Roboto:400,500,400italic);
@import url(https://fonts.googleapis.com/css?family=Roboto+Mono); @import url(https://fonts.googleapis.com/css?family=Roboto+Mono);
@import "font-awesome-sprockets";
@import "font-awesome"; @import "font-awesome";
/* http://meyerweb.com/eric/tools/css/reset/ /* http://meyerweb.com/eric/tools/css/reset/
@ -334,3 +333,4 @@ body {
@import 'home'; @import 'home';
@import 'accounts'; @import 'accounts';
@import 'stream_entries'; @import 'stream_entries';
@import 'dashboard'

View file

@ -0,0 +1,130 @@
.dashboard-wrapper {
background: #282c37;
border-radius: 4px;
margin: 20px auto;
width: 940px;
display: flex;
.dashboard__sidebar {
width: 240px;
border-radius: 4px 0 0 4px;
.dashboard__top-bar {
border-radius: 4px 0 0 0;
}
ul {
padding: 20px 0;
a {
display: block;
padding: 7px 20px;
color: #d9e1e8;
text-decoration: none;
font-size: 14px;
font-weight: 400;
.fa {
display: inline-block;
width: 18px;
text-align: center;
margin-right: 5px;
}
}
.active {
a {
background: darken(#282c37, 5%);
border-left: 2px solid #2b90d9;
padding-left: 18px;
}
}
}
}
.dashboard__current-user {
padding: 20px;
a {
text-decoration: none;
color: inherit;
}
.dashboard__current-user__avatar {
display: block;
width: 50px;
height: 50px;
border-radius: 50px;
float: left;
margin-right: 15px;
}
.dashboard__current-user__display-name {
font-weight: 500;
font-size: 13px;
color: #d9e1e8;
display: block;
margin-top: 5px;
}
.dashboard__current-user__username {
font-size: 12px;
display: block;
color: #2b90d9;
}
}
.dashboard__logo {
color: #2b90d9;
span {
font-weight: 500;
}
}
.dashboard__top-bar {
background: #fff;
padding: 20px;
box-shadow: 0 0 5px rgba(0, 0, 0, 0.1);
border-bottom: 1px solid #d9e1e8;
color: #282c37;
font-size: 16px;
overflow: hidden;
&.alternate {
background: lighten(#282c37, 10%);
border-bottom: 1px solid lighten(#282c37, 10%);
text-align: center;
}
ul {
float: right;
list-style: none;
display: block;
li {
display: inline-block;
}
}
a {
color: #9baec8;
text-decoration: none;
}
}
.dashboard__content {
flex: 1;
background: #d9e1e8;
border-radius: 0 4px 4px 0;
.dashboard__content__content {
//padding: 20px;
}
.dashboard__top-bar {
border-radius: 0 4px 0 0;
}
}
}

View file

@ -14,6 +14,14 @@
&.entry-predecessor, &.entry-successor { &.entry-predecessor, &.entry-successor {
background: #d9e1e8; background: #d9e1e8;
border-left-color: #d9e1e8; border-left-color: #d9e1e8;
.header {
.header__right {
.counter-btn {
color: darken(#d9e1e8, 15%);
}
}
}
} }
&.entry-follow, &.entry-favourite { &.entry-follow, &.entry-favourite {
@ -43,6 +51,14 @@
} }
} }
&.activity-stream-embedded {
box-shadow: none;
.entry {
border-radius: 0;
}
}
.entry__container { .entry__container {
display: flex; display: flex;
} }

View file

@ -5,7 +5,7 @@ class AccountsController < ApplicationController
before_action :set_webfinger_header before_action :set_webfinger_header
def show def show
@statuses = @account.statuses.order('id desc').includes(thread: [:account], reblog: [:account], stream_entry: []) @statuses = @account.statuses.order('id desc').with_includes.with_counters
respond_to do |format| respond_to do |format|
format.html format.html

View file

@ -15,7 +15,7 @@ class Api::AccountsController < ApiController
end end
def statuses def statuses
@statuses = @account.statuses.order('created_at desc') @statuses = @account.statuses.with_includes.with_counts.order('created_at desc')
end end
def follow def follow

View file

@ -1,8 +1,16 @@
class HomeController < ApplicationController class HomeController < ApplicationController
layout 'dashboard'
before_action :authenticate_user! before_action :authenticate_user!
def index def index
feed = Feed.new(:home, current_user.account) feed = Feed.new(:home, current_user.account)
@statuses = feed.get(20, (params[:offset] || 0).to_i) @statuses = feed.get(20, (params[:offset] || 0).to_i)
end end
def mentions
feed = Feed.new(:mentions, current_user.account)
@statuses = feed.get(20, (params[:offset] || 0).to_i)
render action: :index
end
end end

View file

@ -49,6 +49,14 @@ class Status < ActiveRecord::Base
content.truncate(80, omission: "...") content.truncate(80, omission: "...")
end end
def reblogs_count
self.attributes['reblogs_count'] || self.reblogs.count
end
def favourites_count
self.attributes['favourites_count'] || self.favourites.count
end
def mentions def mentions
m = [] m = []

View file

@ -4,8 +4,8 @@ attributes :id, :created_at, :in_reply_to_id
node(:uri) { |status| uri_for_target(status) } node(:uri) { |status| uri_for_target(status) }
node(:content) { |status| status.local? ? linkify(status) : status.content } node(:content) { |status| status.local? ? linkify(status) : status.content }
node(:url) { |status| url_for_target(status) } node(:url) { |status| url_for_target(status) }
node(:reblogs_count) { |status| status.reblogs.count } node(:reblogs_count) { |status| status.reblogs_count }
node(:favourites_count) { |status| status.favourites.count } node(:favourites_count) { |status| status.favourites_count }
node(:favourited) { |status| current_user.account.favourited?(status) } node(:favourited) { |status| current_user.account.favourited?(status) }
node(:reblogged) { |status| current_user.account.reblogged?(status) } node(:reblogged) { |status| current_user.account.reblogged?(status) }

View file

@ -1,3 +1,3 @@
.activity-stream.activity-stream-headless .activity-stream.activity-stream-embedded
- @statuses.each do |status| - @statuses.each do |status|
= render partial: 'stream_entries/status', locals: { status: status, include_threads: false, is_successor: false, is_predecessor: false } = render partial: 'stream_entries/status', locals: { status: status, include_threads: false, is_successor: false, is_predecessor: false }

View file

@ -8,5 +8,4 @@
= csrf_meta_tags = csrf_meta_tags
= yield :header_tags = yield :header_tags
%body %body
.container = content_for?(:content) ? yield(:content) : yield
= content_for?(:content) ? yield(:content) : yield

View file

@ -1,11 +1,12 @@
- content_for :content do - content_for :content do
.logo-container .container
%h1 .logo-container
= link_to root_path do %h1
= render partial: 'application/logo', locals: { dim: 200 } = link_to root_path do
%small= Rails.configuration.x.local_domain = render partial: 'application/logo', locals: { dim: 200 }
%small= Rails.configuration.x.local_domain
.form-container .form-container
= yield = yield
= render template: "layouts/application" = render template: "layouts/application"

View file

@ -0,0 +1,45 @@
- content_for :content do
.dashboard-wrapper
.dashboard__sidebar
.dashboard__top-bar.alternate
&nbsp;
.dashboard__current-user
= link_to account_path(current_user.account) do
= image_tag current_user.account.avatar.url(:medium), class: 'dashboard__current-user__avatar'
%strong.dashboard__current-user__display-name= current_user.account.display_name
%span.dashboard__current-user__username= "@#{current_user.account.username}"
%ul
%li.active
= link_to root_path do
= fa_icon 'home'
Home
%li
= link_to mentions_path do
= fa_icon 'at'
Mentions
%li
= link_to root_path do
= fa_icon 'group'
Subscriptions
%li
= link_to oauth_authorized_applications_path do
= fa_icon 'shield'
Authorized apps
%li
= link_to root_path do
= fa_icon 'user'
Edit profile
%li
= link_to edit_registration_path(current_user) do
= fa_icon 'wrench'
Change password
.dashboard__content
.dashboard__top-bar
Home
%ul
%li= link_to fa_icon('sign-out'), destroy_user_session_path, method: :delete
.dashboard__content__content= yield
.footer
.domain= Rails.configuration.x.local_domain
= render template: "layouts/application"

View file

@ -1,37 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Doorkeeper</title>
<%= stylesheet_link_tag "doorkeeper/admin/application" %>
<%= csrf_meta_tags %>
</head>
<body>
<div class="navbar navbar-inverse navbar-static-top" role="navigation">
<div class="container-fluid">
<div class="navbar-header">
<%= link_to t('doorkeeper.layouts.admin.nav.oauth2_provider'), oauth_applications_path, class: 'navbar-brand' %>
</div>
<ul class="nav navbar-nav">
<%= content_tag :li, class: "#{'active' if request.path == oauth_applications_path}" do %>
<%= link_to t('doorkeeper.layouts.admin.nav.applications'), oauth_applications_path %>
<% end %>
<%= content_tag :li do %>
<%= link_to 'Home', root_path %>
<% end %>
</ul>
</div>
</div>
<div class="container">
<%- if flash[:notice].present? %>
<div class="alert alert-info">
<%= flash[:notice] %>
</div>
<% end -%>
<%= yield %>
</div>
</body>
</html>

View file

@ -1,23 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title><%= t('doorkeeper.layouts.application.title') %></title>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<%= stylesheet_link_tag "doorkeeper/application" %>
<%= csrf_meta_tags %>
</head>
<body>
<div id="container">
<%- if flash[:notice].present? %>
<div class="alert alert-info">
<%= flash[:notice] %>
</div>
<% end -%>
<%= yield %>
</div>
</body>
</html>

View file

@ -1,5 +1,5 @@
- content_for :content do - content_for :content do
= yield .container= yield
.footer .footer
.domain= Rails.configuration.x.local_domain .domain= Rails.configuration.x.local_domain

View file

@ -24,10 +24,10 @@
.header__right .header__right
.counter-btn{ class: reblogged_by_me_class(status) } .counter-btn{ class: reblogged_by_me_class(status) }
%i.fa.fa-retweet %i.fa.fa-retweet
%span.counter-number= status.reblog? ? status.reblog.reblogs.count : status.reblogs_count %span.counter-number= status.reblog? ? status.reblog.reblogs_count : status.reblogs_count
.counter-btn{ class: favourited_by_me_class(status) } .counter-btn{ class: favourited_by_me_class(status) }
%i.fa.fa-star %i.fa.fa-star
%span.counter-number= status.reblog? ? status.reblog.favourites.count : status.favourites_count %span.counter-number= status.reblog? ? status.reblog.favourites_count : status.favourites_count
.content .content
= status.reblog? ? (status.reblog.local? ? linkify(status.reblog) : status.reblog.content.html_safe) : (status.local? ? linkify(status) : status.content.html_safe) = status.reblog? ? (status.reblog.local? ? linkify(status.reblog) : status.reblog.content.html_safe) : (status.local? ? linkify(status) : status.content.html_safe)

View file

@ -1,9 +1,4 @@
#!/usr/bin/env ruby #!/usr/bin/env ruby
begin
load File.expand_path('../spring', __FILE__)
rescue LoadError => e
raise unless e.message.include?('spring')
end
APP_PATH = File.expand_path('../../config/application', __FILE__) APP_PATH = File.expand_path('../../config/application', __FILE__)
require_relative '../config/boot' require_relative '../config/boot'
require 'rails/commands' require 'rails/commands'

View file

@ -1,9 +1,4 @@
#!/usr/bin/env ruby #!/usr/bin/env ruby
begin
load File.expand_path('../spring', __FILE__)
rescue LoadError => e
raise unless e.message.include?('spring')
end
require_relative '../config/boot' require_relative '../config/boot'
require 'rake' require 'rake'
Rake.application.run Rake.application.run

View file

@ -1,15 +0,0 @@
#!/usr/bin/env ruby
# This file loads spring without using Bundler, in order to be fast.
# It gets overwritten when you run the `spring binstub` command.
unless defined?(Spring)
require 'rubygems'
require 'bundler'
if (match = Bundler.default_lockfile.read.match(/^GEM$.*?^ (?: )*spring \((.*?)\)$.*?^$/m))
Gem.paths = { 'GEM_PATH' => [Bundler.bundle_path.to_s, *Gem.path].uniq }
gem 'spring', match[1]
require 'spring/binstub'
end
end

View file

@ -29,8 +29,9 @@ module Mastodon
config.autoload_paths += Dir[Rails.root.join('app', 'api', '*')] config.autoload_paths += Dir[Rails.root.join('app', 'api', '*')]
config.to_prepare do config.to_prepare do
Doorkeeper::AuthorizationsController.layout 'auth' Doorkeeper::ApplicationsController.layout 'dashboard'
Doorkeeper::AuthorizedApplicationsController.layout 'auth' Doorkeeper::AuthorizedApplicationsController.layout 'dashboard'
Doorkeeper::AuthorizationsController.layout 'auth'
end end
end end
end end

View file

@ -1 +1 @@
$redis = Redis.new(host: ENV['REDIS_HOST'] || 'localhost', port: ENV['REDIS_PORT'] || 6379) $redis = Redis.new(host: ENV['REDIS_HOST'] || 'localhost', port: ENV['REDIS_PORT'] || 6379, driver: :hiredis)

13
config/puma.rb Normal file
View file

@ -0,0 +1,13 @@
workers Integer(ENV['WEB_CONCURRENCY'] || 2)
threads_count = Integer(ENV['MAX_THREADS'] || 5)
threads threads_count, threads_count
preload_app!
rackup DefaultRackup
port ENV['PORT'] || 3000
environment ENV['RACK_ENV'] || 'development'
on_worker_boot do
ActiveRecord::Base.establish_connection
end

View file

@ -49,5 +49,7 @@ Rails.application.routes.draw do
end end
end end
get '/mentions', to: 'home#mentions', as: :mentions
root 'home#index' root 'home#index'
end end