mirror of
https://github.com/Growstuff/growstuff.git
synced 2026-04-13 11:30:54 -04:00
Timeline
This commit is contained in:
@@ -19,16 +19,7 @@ class MembersController < ApplicationController
|
||||
@facebook_auth = @member.auth('facebook')
|
||||
@posts = @member.posts
|
||||
|
||||
# TODO: Consider shifting all of these onto a member activity model?
|
||||
@activity = plantings_for_show
|
||||
.union_all(harvests_for_show)
|
||||
.union_all(posts_for_show)
|
||||
.union_all(comments_for_show)
|
||||
.union_all(photos_for_show)
|
||||
.union_all(seeds_for_show)
|
||||
.where(owner_id: @member.id)
|
||||
.order(event_at: :desc)
|
||||
.limit(30)
|
||||
@activity = TimelineService.member_query(@member).limit(30)
|
||||
|
||||
# The garden form partial is called from the "New Garden" tab;
|
||||
# it requires a garden to be passed in @garden.
|
||||
@@ -100,71 +91,4 @@ class MembersController < ApplicationController
|
||||
Member.order(:login_name)
|
||||
end.confirmed.paginate(page: params[:page])
|
||||
end
|
||||
|
||||
# Queries for the show view/action
|
||||
def plantings_for_show
|
||||
Planting.select(
|
||||
:id,
|
||||
"'planting' as event_type",
|
||||
'planted_at as event_at',
|
||||
:owner_id,
|
||||
:crop_id,
|
||||
:slug
|
||||
)
|
||||
end
|
||||
|
||||
def harvests_for_show
|
||||
Harvest.select(
|
||||
:id,
|
||||
"'harvest' as event_type",
|
||||
'harvested_at as event_at',
|
||||
:owner_id,
|
||||
:crop_id,
|
||||
:slug
|
||||
)
|
||||
end
|
||||
|
||||
def posts_for_show
|
||||
Post.select(
|
||||
:id,
|
||||
"'post' as event_type",
|
||||
'posts.created_at as event_at',
|
||||
'author_id as owner_id',
|
||||
'null as crop_id',
|
||||
:slug
|
||||
)
|
||||
end
|
||||
|
||||
def comments_for_show
|
||||
Comment.select(
|
||||
:id,
|
||||
"'comment' as event_type",
|
||||
'comments.created_at as event_at',
|
||||
'author_id as owner_id',
|
||||
'null as crop_id',
|
||||
'null as slug'
|
||||
)
|
||||
end
|
||||
|
||||
def photos_for_show
|
||||
Photo.select(
|
||||
:id,
|
||||
"'photo' as event_type",
|
||||
"photos.created_at as event_at",
|
||||
'photos.owner_id',
|
||||
'null as crop_id',
|
||||
'null as slug'
|
||||
)
|
||||
end
|
||||
|
||||
def seeds_for_show
|
||||
Seed.select(
|
||||
:id,
|
||||
"'seed' as event_type",
|
||||
"seeds.created_at as event_at",
|
||||
'seeds.owner_id',
|
||||
'crop_id',
|
||||
'slug'
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
11
app/controllers/timeline_controller.rb
Normal file
11
app/controllers/timeline_controller.rb
Normal file
@@ -0,0 +1,11 @@
|
||||
class TimelineController < ApplicationController
|
||||
def index
|
||||
if current_member
|
||||
@timeline = TimelineService.followed_query(current_member).paginate(page: params[:page])
|
||||
@members = current_member.followed
|
||||
else
|
||||
@timeline = TimelineService.query.paginate(page: params[:page])
|
||||
@members = Member.interesting.limit 10
|
||||
end
|
||||
end
|
||||
end
|
||||
104
app/services/timeline_service.rb
Normal file
104
app/services/timeline_service.rb
Normal file
@@ -0,0 +1,104 @@
|
||||
class TimelineService
|
||||
def self.member_query(member)
|
||||
self.query.where(owner_id: member.id)
|
||||
end
|
||||
|
||||
# A timeline of events by people the member follows
|
||||
def self.followed_query(member)
|
||||
self.query.where(owner_id: [member.followed.pluck(:id)])
|
||||
end
|
||||
|
||||
def self.query
|
||||
plantings_query
|
||||
.union_all(harvests_query)
|
||||
.union_all(posts_query)
|
||||
.union_all(comments_query)
|
||||
.union_all(photos_query)
|
||||
.union_all(seeds_query)
|
||||
.where.not(event_at: nil)
|
||||
.order(event_at: :desc)
|
||||
end
|
||||
|
||||
def self.resolve_model(event)
|
||||
if event.event_type == 'planting'
|
||||
Planting.find(event.id)
|
||||
elsif event.event_type == 'seed'
|
||||
Seed.find(event.id)
|
||||
elsif event.event_type == 'harvest'
|
||||
Harvest.find(event.id)
|
||||
elsif event.event_type == 'comment'
|
||||
Comment.find(event.id)
|
||||
elsif event.event_type == 'post'
|
||||
Post.find(event.id)
|
||||
elsif event.event_type == 'photo'
|
||||
Photo.find(event.id)
|
||||
end
|
||||
end
|
||||
|
||||
def self.plantings_query
|
||||
Planting.select(
|
||||
:id,
|
||||
"'planting' as event_type",
|
||||
'planted_at as event_at',
|
||||
:owner_id,
|
||||
:crop_id,
|
||||
:slug
|
||||
)
|
||||
end
|
||||
|
||||
def self.harvests_query
|
||||
Harvest.select(
|
||||
:id,
|
||||
"'harvest' as event_type",
|
||||
'harvested_at as event_at',
|
||||
:owner_id,
|
||||
:crop_id,
|
||||
:slug
|
||||
)
|
||||
end
|
||||
|
||||
def self.posts_query
|
||||
Post.select(
|
||||
:id,
|
||||
"'post' as event_type",
|
||||
'posts.created_at as event_at',
|
||||
'author_id as owner_id',
|
||||
'null as crop_id',
|
||||
:slug
|
||||
)
|
||||
end
|
||||
|
||||
def self.comments_query
|
||||
Comment.select(
|
||||
:id,
|
||||
"'comment' as event_type",
|
||||
'comments.created_at as event_at',
|
||||
'author_id as owner_id',
|
||||
'null as crop_id',
|
||||
'null as slug'
|
||||
)
|
||||
end
|
||||
|
||||
def self.photos_query
|
||||
Photo.select(
|
||||
:id,
|
||||
"'photo' as event_type",
|
||||
"photos.created_at as event_at",
|
||||
'photos.owner_id',
|
||||
'null as crop_id',
|
||||
'null as slug'
|
||||
)
|
||||
end
|
||||
|
||||
def self.seeds_query
|
||||
Seed.select(
|
||||
:id,
|
||||
"'seed' as event_type",
|
||||
"seeds.created_at as event_at",
|
||||
'seeds.owner_id',
|
||||
'crop_id',
|
||||
'slug'
|
||||
)
|
||||
end
|
||||
|
||||
end
|
||||
@@ -94,7 +94,7 @@
|
||||
- photo = Photo.find(event.id)
|
||||
= photo_icon
|
||||
took a photo
|
||||
= link_to photo, photo.title
|
||||
= link_to photo.title, photo
|
||||
.media
|
||||
= link_to(image_tag(photo.fullsize_url, width: 150, class: 'rounded'), photo)
|
||||
.media-body
|
||||
|
||||
55
app/views/timeline/index.html.haml
Normal file
55
app/views/timeline/index.html.haml
Normal file
@@ -0,0 +1,55 @@
|
||||
%h1 Timeline
|
||||
|
||||
.row
|
||||
.col-md-9
|
||||
|
||||
.pagination
|
||||
= page_entries_info @seeds
|
||||
= will_paginate @seeds
|
||||
|
||||
.list-group-item.list-group-item-action.flex-column.align-items-start.active{:href => "#!"}
|
||||
- @timeline.each do |event|
|
||||
- event_model = TimelineService.resolve_model(event)
|
||||
- owner = Member.find(event.owner_id)
|
||||
.d-flex.justify-content-between
|
||||
%h5
|
||||
= render 'members/tiny', member: owner
|
||||
- if event.event_type == 'planting'
|
||||
= planting_icon
|
||||
= link_to owner, owner
|
||||
planted #{link_to event_model.crop, event_model}
|
||||
- elsif event.event_type == 'seed'
|
||||
= seed_icon
|
||||
= link_to owner, owner
|
||||
saved #{link_to event_model.crop, event_model} seeds
|
||||
- elsif event.event_type == 'harvest'
|
||||
= harvest_icon
|
||||
= link_to owner, owner
|
||||
harvested #{link_to event_model, event_model}
|
||||
- elsif event.event_type == 'comment'
|
||||
= comment_icon
|
||||
= link_to owner, owner
|
||||
#{link_to 'commented', event_model} on #{link_to event_model.post, event_model.post}
|
||||
- elsif event.event_type == 'post'
|
||||
= blog_icon
|
||||
= link_to owner, owner
|
||||
wrote a post about #{link_to event_model, event_model}
|
||||
- elsif event.event_type == 'photo'
|
||||
= photo_icon
|
||||
= link_to owner, owner
|
||||
took a photo #{link_to event_model.title, event_model}
|
||||
%small= time_ago_in_words event.event_at
|
||||
- if event.crop_id.present?
|
||||
= render 'crops/thumbnail', crop: event_model.crop
|
||||
.pagination
|
||||
= page_entries_info @seeds
|
||||
= will_paginate @seeds
|
||||
.col-md-3
|
||||
.card
|
||||
.card-header
|
||||
%h3 Following
|
||||
- @members.each do |member|
|
||||
= link_to member do
|
||||
%p
|
||||
= render 'members/tiny', member: member
|
||||
= member
|
||||
@@ -84,6 +84,7 @@ Rails.application.routes.draw do
|
||||
|
||||
resources :follows, only: %i(create destroy)
|
||||
resources :likes, only: %i(create destroy)
|
||||
resources :timeline
|
||||
|
||||
resources :members, param: :slug do
|
||||
resources :gardens
|
||||
|
||||
16
spec/services/timeline_service_spec.rb
Normal file
16
spec/services/timeline_service_spec.rb
Normal file
@@ -0,0 +1,16 @@
|
||||
require 'rails_helper'
|
||||
|
||||
describe 'timeline' do
|
||||
let(:member) { FactoryBot.create :member }
|
||||
let(:friend) { FactoryBot.create :member }
|
||||
describe 'followed_by(member)' do
|
||||
let!(:planting) { FactoryBot.create :planting, owner: friend, planted_at: 1.day.ago }
|
||||
let!(:harvest) { FactoryBot.create :harvest, owner: friend, harvested_at: 2.days.ago }
|
||||
before {friend.followers << member }
|
||||
subject { TimelineService.followed_query(member) }
|
||||
it { expect(subject.first).to eq planting }
|
||||
it { expect(TimelineService.resolve_model(subject.second)).to eq harvest }
|
||||
end
|
||||
|
||||
describe
|
||||
end
|
||||
Reference in New Issue
Block a user