From 3b0ec6a270cbe3f25124db2d2e351f60928498a8 Mon Sep 17 00:00:00 2001
From: mgabdev <>
Date: Tue, 21 Jul 2020 23:05:54 -0500
Subject: [PATCH] Updated groups to be public
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
• Updated:
- groups to be public
- routes for /group and /groups/id to be public
- GroupTimeline to ignore relationships for loading
- Group fetching to be a where with is_archived: false
- GroupControllers to have if current_user, else
• Added:
- Meta and og information for view
- Group fetch
- public route api for featured groups, group timelines
• Removed:
- Doorkeeper for read:groups
---
.../api/v1/groups/relationships_controller.rb | 2 +-
app/controllers/api/v1/groups_controller.rb | 15 ++++++++--
.../api/v1/timelines/group_controller.rb | 30 ++++++++++++-------
app/controllers/react_controller.rb | 14 +++++++--
app/helpers/stream_entries_helper.rb | 4 +++
.../gabsocial/features/group_timeline.js | 2 +-
app/javascript/gabsocial/features/ui/ui.js | 4 +--
app/views/groups/_meta.html.haml | 6 ++++
app/views/groups/_og.html.haml | 12 ++++++++
9 files changed, 69 insertions(+), 20 deletions(-)
create mode 100644 app/views/groups/_meta.html.haml
create mode 100644 app/views/groups/_og.html.haml
diff --git a/app/controllers/api/v1/groups/relationships_controller.rb b/app/controllers/api/v1/groups/relationships_controller.rb
index 27781dd4..884c5916 100644
--- a/app/controllers/api/v1/groups/relationships_controller.rb
+++ b/app/controllers/api/v1/groups/relationships_controller.rb
@@ -7,7 +7,7 @@ class Api::V1::Groups::RelationshipsController < Api::BaseController
respond_to :json
def index
- groups = Group.where(id: group_ids).select('id')
+ groups = Group.where(id: group_ids, is_archived: false).select('id')
# .where doesn't guarantee that our results are in the same order
# we requested them, so return the "right" order to the requestor.
@groups = groups.index_by(&:id).values_at(*group_ids).compact
diff --git a/app/controllers/api/v1/groups_controller.rb b/app/controllers/api/v1/groups_controller.rb
index 99b6546d..3b3f5868 100644
--- a/app/controllers/api/v1/groups_controller.rb
+++ b/app/controllers/api/v1/groups_controller.rb
@@ -3,10 +3,10 @@
class Api::V1::GroupsController < Api::BaseController
include Authorization
- before_action -> { doorkeeper_authorize! :read, :'read:groups' }, only: [:index, :show]
+ # before_action -> { doorkeeper_authorize! :read, :'read:groups' }, only: [:index, :show]
before_action -> { doorkeeper_authorize! :write, :'write:groups' }, except: [:index, :show]
- before_action :require_user!
+ before_action :require_user!, except: [:index, :show]
before_action :set_group, except: [:index, :create]
def index
@@ -14,10 +14,19 @@ class Api::V1::GroupsController < Api::BaseController
when 'featured'
@groups = Group.where(is_featured: true, is_archived: false).limit(100).all
when 'new'
+ if !current_user
+ render json: { error: 'This method requires an authenticated user' }, status: 422
+ end
@groups = Group.where(is_archived: false).limit(24).order('created_at DESC').all
when 'member'
+ if !current_user
+ render json: { error: 'This method requires an authenticated user' }, status: 422
+ end
@groups = Group.joins(:group_accounts).where(is_archived: false, group_accounts: { account: current_account }).order('group_accounts.id DESC').all
when 'admin'
+ if !current_user
+ render json: { error: 'This method requires an authenticated user' }, status: 422
+ end
@groups = Group.joins(:group_accounts).where(is_archived: false, group_accounts: { account: current_account, role: :admin }).all
end
@@ -75,7 +84,7 @@ class Api::V1::GroupsController < Api::BaseController
private
def set_group
- @group = Group.find(params[:id])
+ @group = Group.where(id: params[:id], is_archived: false).first
end
def group_params
diff --git a/app/controllers/api/v1/timelines/group_controller.rb b/app/controllers/api/v1/timelines/group_controller.rb
index 6ef63ef1..150ae398 100644
--- a/app/controllers/api/v1/timelines/group_controller.rb
+++ b/app/controllers/api/v1/timelines/group_controller.rb
@@ -1,23 +1,25 @@
# frozen_string_literal: true
class Api::V1::Timelines::GroupController < Api::BaseController
- before_action -> { doorkeeper_authorize! :read, :'read:groups' }
- before_action :require_user!
before_action :set_group
before_action :set_statuses
after_action :insert_pagination_headers, unless: -> { @statuses.empty? }
def show
- render json: @statuses,
- each_serializer: REST::StatusSerializer,
- relationships: StatusRelationshipsPresenter.new(@statuses, current_user.account_id)
+ if current_user
+ render json: @statuses,
+ each_serializer: REST::StatusSerializer,
+ relationships: StatusRelationshipsPresenter.new(@statuses, current_user.account_id)
+ else
+ render json: @statuses, each_serializer: REST::StatusSerializer
+ end
end
private
def set_group
- @group = Group.find(params[:id])
+ @group = Group.where(id: params[:id], is_archived: false).first
end
def set_statuses
@@ -29,10 +31,18 @@ class Api::V1::Timelines::GroupController < Api::BaseController
end
def group_statuses
- statuses = group_timeline_statuses.without_replies.paginate_by_id(
- limit_param(DEFAULT_STATUSES_LIMIT),
- params_slice(:max_id, :since_id, :min_id)
- ).reject { |status| FeedManager.instance.filter?(:home, status, current_account.id) }
+ statuses = nil
+ if current_account
+ statuses = group_timeline_statuses.without_replies.paginate_by_id(
+ limit_param(DEFAULT_STATUSES_LIMIT),
+ params_slice(:max_id, :since_id, :min_id)
+ ).reject { |status| FeedManager.instance.filter?(:home, status, current_account.id) }
+ else
+ statuses = group_timeline_statuses.without_replies.paginate_by_id(
+ limit_param(DEFAULT_STATUSES_LIMIT),
+ params_slice(:max_id, :since_id, :min_id)
+ )
+ end
if truthy_param?(:only_media)
# `SELECT DISTINCT id, updated_at` is too slow, so pluck ids at first, and then select id, updated_at with ids.
diff --git a/app/controllers/react_controller.rb b/app/controllers/react_controller.rb
index c5e0ffcb..d4642a6c 100644
--- a/app/controllers/react_controller.rb
+++ b/app/controllers/react_controller.rb
@@ -5,6 +5,7 @@ class ReactController < ApplicationController
before_action :set_referrer_policy_header, only: :react
before_action :set_initial_state_json, only: :react
before_action :set_data_for_meta, only: :react
+ before_action :set_instance_presenter
def react
#
@@ -13,9 +14,12 @@ class ReactController < ApplicationController
private
def set_data_for_meta
- return if find_route_matches
+ return if find_route_matches && current_account
- if find_public_route_matches
+ if request.path.include?("/groups/")
+ groupIdFromPath = request.path.sub("/groups", "").gsub("/", "")
+ @group = Group.where(id: groupIdFromPath, is_archived: false).first
+ elsif find_public_route_matches
return
elsif request.path.count("/") == 1 && !request.path.include?("@")
acctFromPath = request.path.sub("/", "")
@@ -40,7 +44,7 @@ class ReactController < ApplicationController
end
def find_public_route_matches
- request.path.match(/\A\/(about|search|explore)/)
+ request.path.match(/\A\/(about|search|groups|explore)/)
end
def set_initial_state_json
@@ -67,4 +71,8 @@ class ReactController < ApplicationController
def set_referrer_policy_header
response.headers['Referrer-Policy'] = 'origin'
end
+
+ def set_instance_presenter
+ @instance_presenter = InstancePresenter.new
+ end
end
diff --git a/app/helpers/stream_entries_helper.rb b/app/helpers/stream_entries_helper.rb
index f3964d9f..d1700151 100644
--- a/app/helpers/stream_entries_helper.rb
+++ b/app/helpers/stream_entries_helper.rb
@@ -68,6 +68,10 @@ module StreamEntriesHelper
return "The latest Gabs from #{display_name(account)} (@#{account.username}). #{account.note}"
end
+ def group_description(group)
+ return "#{group.title} on Gab. #{group.description}"
+ end
+
def media_summary(status)
attachments = { image: 0, video: 0 }
diff --git a/app/javascript/gabsocial/features/group_timeline.js b/app/javascript/gabsocial/features/group_timeline.js
index 4a9190ee..6458fb72 100644
--- a/app/javascript/gabsocial/features/group_timeline.js
+++ b/app/javascript/gabsocial/features/group_timeline.js
@@ -78,7 +78,7 @@ class GroupTimeline extends ImmutablePureComponent {
const { collapsed } = this.state
const { id } = this.props.params
- if (typeof group === 'undefined' || !relationships) {
+ if (typeof group === 'undefined') {
return
} else if (group === false) {
return
diff --git a/app/javascript/gabsocial/features/ui/ui.js b/app/javascript/gabsocial/features/ui/ui.js
index bf3153c9..3fbc3c69 100644
--- a/app/javascript/gabsocial/features/ui/ui.js
+++ b/app/javascript/gabsocial/features/ui/ui.js
@@ -175,7 +175,7 @@ class SwitchingArea extends PureComponent {
-
+
@@ -184,7 +184,7 @@ class SwitchingArea extends PureComponent {
{ /*
*/}
-
+
diff --git a/app/views/groups/_meta.html.haml b/app/views/groups/_meta.html.haml
new file mode 100644
index 00000000..8b5f40f5
--- /dev/null
+++ b/app/views/groups/_meta.html.haml
@@ -0,0 +1,6 @@
+- content_for :page_title do
+ = "#{group.title} / Group • #{site_hostname}"
+
+- content_for :header_tags do
+ = opengraph 'og:type', 'website'
+ = render 'groups/og', group: group, url: "https://gab.com/groups/#{group.id}"
\ No newline at end of file
diff --git a/app/views/groups/_og.html.haml b/app/views/groups/_og.html.haml
new file mode 100644
index 00000000..e0e11b0c
--- /dev/null
+++ b/app/views/groups/_og.html.haml
@@ -0,0 +1,12 @@
+- description = group_description(group)
+
+%meta{ name: 'description', content: description }/
+
+= opengraph 'og:url', url
+= opengraph 'og:site_name', site_title
+= opengraph 'og:title', "#{group.title} / Group • #{site_hostname}"
+= opengraph 'og:description', description
+= opengraph 'og:image', full_asset_url(group.cover_image.url(:original))
+= opengraph 'og:image:width', '120'
+= opengraph 'og:image:height', '120'
+= opengraph 'twitter:card', 'summary'