Files
growstuff/app/services/recent_activity.rb
T
Brenda Wallace 3b06325e62 Add friends and neighbours feature with member dismissal functionality
- Implement RecentActivity service to track recent planting, harvesting, and trading events.
- Enhance TimelineService to include garden layouts in event queries.
- Update navigation menu to include a link to friends and neighbours.
- Create member card partial for displaying gardener information.
- Add follow button partial for managing follow actions.
- Refactor members index view to use the new member card partial.
- Introduce neighbours feed view with daily updates and entries.
- Implement entry partial for displaying individual neighbour activities.
- Create layout partial for visualizing garden layouts.
- Add posts section to neighbours view for displaying recent posts.
- Implement reach section to show nearby gardeners.
- Add suggestions section for recommending gardeners to follow.
- Create routes for neighbours functionality and member dismissals.
- Add migrations for member dismissals and garden layout timestamps.
- Write feature and request specs for neighbours functionality.
- Include support for creating located members in tests.
2026-10-13 17:08:18 +13:00

24 lines
1.2 KiB
Ruby

# frozen_string_literal: true
# What members have lately planted, harvested and put up for trade, newest
# first, as one list of events.
class RecentActivity
Event = Struct.new(:member, :verb, :subject, :at, :following, keyword_init: true)
def self.events(member_ids, following: false)
return [] if member_ids.empty?
events = Planting.where(owner_id: member_ids).includes(:owner, :crop).order(planted_at: :desc).limit(10).map do |planting|
Event.new(member: planting.owner, verb: 'planted', subject: planting.crop, at: planting.planted_at, following:)
end
events += Harvest.where(owner_id: member_ids).includes(:owner, :crop).order(harvested_at: :desc).limit(10).map do |harvest|
Event.new(member: harvest.owner, verb: 'harvested', subject: harvest.crop, at: harvest.harvested_at, following:)
end
seeds = Seed.current.tradable.where(owner_id: member_ids).includes(:owner, :crop).order(created_at: :desc).limit(5)
events += seeds.map do |seed|
Event.new(member: seed.owner, verb: 'has seeds to trade:', subject: seed.crop, at: seed.created_at, following:)
end
events.compact.sort_by { |event| event.at || Time.zone.at(0) }.reverse
end
end