Skip to content

Commit

Permalink
Close #1979: Create API for upcoming and previous events on the organ…
Browse files Browse the repository at this point in the history
…izer profile screen (#1980)
  • Loading branch information
Sreyleak-Deth authored Dec 3, 2024
1 parent 15cfed1 commit 366b66d
Show file tree
Hide file tree
Showing 10 changed files with 125 additions and 2 deletions.
30 changes: 30 additions & 0 deletions app/controllers/spree/api/v2/storefront/events_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
module Spree
module Api
module V2
module Storefront
class EventsController < Spree::Api::V2::ResourceController
def collection
events_query.events
.includes(:vendor)
.page(params.fetch(:page, 1))
.per(params.fetch(:per_page, 20))
end

def collection_serializer
Spree::V2::Storefront::TaxonSerializer
end

private

def events_query
SpreeCmCommissioner::OrganizerProfileEventQuery.new(
vendor_id: params[:vendor_id],
section: params.fetch(:section, 'upcoming'),
start_from_date: params[:start_from_date] || nil
)
end
end
end
end
end
end
2 changes: 2 additions & 0 deletions app/models/spree_cm_commissioner/taxon_decorator.rb
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@ def self.prepended(base)
base.has_many :visible_classifications, -> { where(visible: true).order(:position) }, class_name: 'Spree::Classification'
base.has_many :visible_products, through: :visible_classifications, class_name: 'Spree::Product', source: :product

base.belongs_to :vendor, class_name: 'Spree::Vendor'

base.validates_associated :category_icon
base.before_save :set_kind
base.before_save :set_slug
Expand Down
13 changes: 13 additions & 0 deletions app/overrides/spree/admin/taxons/_form/vendor.html.erb.deface
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<!-- insert_before "erb[loud]:contains('field_container :permalink')" -->

<% if @taxon.depth == 1 %>
<div>
<%= f.field_container :vendor_id do %>
<%= label_tag :vendor_id, Spree.t(:vendors) %>
<%= f.select :vendor_id, Spree::Vendor.order(:name).pluck(:name, :id),
{ include_blank: true }, { class: 'select2-clear js-filterable' } %>
<%= f.error_message_on :vendor_id, class: 'error-message' %>
<% end %>
</div>
<% end %>

27 changes: 27 additions & 0 deletions app/queries/spree_cm_commissioner/organizer_profile_event_query.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
module SpreeCmCommissioner
class OrganizerProfileEventQuery
attr_reader :vendor_id, :section, :start_from_date

# user_id: user ID, vendor_id: vendor ID, section: 'upcoming', 'previous' or 'all'
def initialize(vendor_id:, section:, start_from_date: nil)
@vendor_id = vendor_id
@section = section
@start_from_date = start_from_date || Time.zone.now
end

def events
taxons = Spree::Taxon.includes(:vendor).where(vendor_id: vendor_id)

case section
when 'upcoming'
taxons.where('to_date >= ?', start_from_date)
.order(from_date: :asc)
when 'previous'
taxons.where('to_date < ?', start_from_date)
.order(to_date: :desc)
else
taxons.order(from_date: :asc)
end
end
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ def self.prepended(base)

base.attributes :custom_redirect_url, :kind, :subtitle, :from_date, :to_date,
:background_color, :foreground_color, :show_badge_status,
:purchasable_on
:purchasable_on, :vendor_id

base.attribute :purchasable_on_app do |taxon|
taxon.purchasable_on == 'app' || taxon.purchasable_on == 'both'
Expand Down
1 change: 1 addition & 0 deletions config/initializers/spree_permitted_attributes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ module PermittedAttributes
preferred_foreground_color
show_badge_status
purchasable_on
vendor_id
]

@@store_attributes += [
Expand Down
1 change: 1 addition & 0 deletions config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -445,6 +445,7 @@
resources :vendors do
resources :nearby_places, only: %i[index]
resources :vendor_photos
resources :events
end
resource :homepage_data, only: [:show]
resources :homepage_sections, only: [:index]
Expand Down
5 changes: 5 additions & 0 deletions db/migrate/20240926044328_add_vendor_to_spree_taxon.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
class AddVendorToSpreeTaxon < ActiveRecord::Migration[7.0]
def change
add_reference :spree_taxons, :vendor, index: true, foreign_key: { to_table: :spree_vendors }, if_not_exists: true
end
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
require 'spec_helper'

RSpec.describe SpreeCmCommissioner::OrganizerProfileEventQuery do
let(:vendor) { create(:vendor) }
let(:start_from_date) { Time.zone.now }
let!(:upcoming_taxon) { create(:taxon, vendor_id: vendor.id, from_date: 1.day.from_now, to_date: 5.days.from_now) }
let!(:previous_taxon) { create(:taxon, vendor_id: vendor.id, from_date: 10.days.ago, to_date: 1.day.ago) }

describe '#events' do
context 'when section is upcoming' do
it 'returns only upcoming events for the vendor' do
query = described_class.new(vendor_id: vendor.id, section: 'upcoming', start_from_date: start_from_date)
expect(query.events).to contain_exactly(upcoming_taxon)
end
end

context 'when section is previous' do
it 'returns only previous events for the vendor' do
query = described_class.new(vendor_id: vendor.id, section: 'previous', start_from_date: start_from_date)

expect(query.events).to contain_exactly(previous_taxon)
end
end

context 'when start_from_date is not provided' do
it 'defaults to the current time' do
travel_to(Time.zone.now) do
query = described_class.new(vendor_id: vendor.id, section: 'upcoming')

expect(query.start_from_date.to_i).to be_within(1).of(Time.zone.now.to_i)
end
end
end

context 'when section is all' do
it 'returns all events for the vendor, both upcoming and previous' do
query = described_class.new(vendor_id: vendor.id, section: 'all', start_from_date: start_from_date)

expect(query.events).to match_array([upcoming_taxon, previous_taxon])
end
end
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,8 @@
:show_badge_status,
:purchasable_on,
:purchasable_on_app,
:purchasable_on_web
:purchasable_on_web,
:vendor_id
)
end

Expand Down

0 comments on commit 366b66d

Please sign in to comment.