WIP 1
This commit is contained in:
parent
362ed3596b
commit
5a9f9ee10c
11 changed files with 65 additions and 13 deletions
|
|
@ -3,7 +3,8 @@ class PriceReportsController < ApplicationController
|
||||||
|
|
||||||
# GET /price_reports
|
# GET /price_reports
|
||||||
def index
|
def index
|
||||||
@price_reports = PriceReport.all
|
@product = Product.find(params[:product_id])
|
||||||
|
@price_reports = @product.price_reports
|
||||||
|
|
||||||
render json: @price_reports
|
render json: @price_reports
|
||||||
end
|
end
|
||||||
|
|
@ -33,6 +34,10 @@ class PriceReportsController < ApplicationController
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def upvote
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
# DELETE /price_reports/1
|
# DELETE /price_reports/1
|
||||||
def destroy
|
def destroy
|
||||||
@price_report.destroy!
|
@price_report.destroy!
|
||||||
|
|
@ -46,6 +51,6 @@ class PriceReportsController < ApplicationController
|
||||||
|
|
||||||
# Only allow a list of trusted parameters through.
|
# Only allow a list of trusted parameters through.
|
||||||
def price_report_params
|
def price_report_params
|
||||||
params.expect(price_report: [ :price, :discount_price, :upvotes, :downvotes, :reported_at, :product_id, :store_id, :guest_id ])
|
params.require(:price_report).permit(:price, :discount_price, :store_id)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -31,4 +31,6 @@ class PriceReport < ApplicationRecord
|
||||||
belongs_to :store
|
belongs_to :store
|
||||||
belongs_to :user
|
belongs_to :user
|
||||||
has_many :moderation_logs, as: :moderatable, dependent: :destroy
|
has_many :moderation_logs, as: :moderatable, dependent: :destroy
|
||||||
|
has_many :votes, as: :votable, dependent: :destroy
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
|
||||||
8
app/models/vote.rb
Normal file
8
app/models/vote.rb
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
class Vote < ApplicationRecord
|
||||||
|
belongs_to :user
|
||||||
|
belongs_to :votable, polymorphic: true
|
||||||
|
|
||||||
|
enum :direction, {upvote: 0, downvote: 1}
|
||||||
|
|
||||||
|
validates :user_id, uniqueness: { scope: [:votable_type, :votable_id], message: "has already voted on this item" }
|
||||||
|
end
|
||||||
|
|
@ -3,7 +3,9 @@ Rails.application.routes.draw do
|
||||||
resources :users
|
resources :users
|
||||||
resources :stores
|
resources :stores
|
||||||
resources :chains
|
resources :chains
|
||||||
resources :products
|
resources :products do
|
||||||
|
resources :price_reports, only: [:index, :create]
|
||||||
|
end
|
||||||
# Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html
|
# Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html
|
||||||
|
|
||||||
# Reveal health status on /up that returns 200 if the app boots with no exceptions, otherwise 500.
|
# Reveal health status on /up that returns 200 if the app boots with no exceptions, otherwise 500.
|
||||||
|
|
|
||||||
11
db/migrate/20260530152329_create_votes.rb
Normal file
11
db/migrate/20260530152329_create_votes.rb
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
class CreateVotes < ActiveRecord::Migration[8.0]
|
||||||
|
def change
|
||||||
|
create_table :votes do |t|
|
||||||
|
t.references :user, null: false, foreign_key: true
|
||||||
|
t.string :votable=references{polymorphic}
|
||||||
|
t.integer :direction
|
||||||
|
|
||||||
|
t.timestamps
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
6
db/migrate/20260530161118_change_voting_mechanism.rb
Normal file
6
db/migrate/20260530161118_change_voting_mechanism.rb
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
class ChangeVotingMechanism < ActiveRecord::Migration[8.0]
|
||||||
|
def change
|
||||||
|
remove_column :price_reports, :upvotes
|
||||||
|
remove_column :price_reports, :downvotes
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -12,7 +12,7 @@ class PriceReportsControllerTest < ActionDispatch::IntegrationTest
|
||||||
|
|
||||||
test "should create price_report" do
|
test "should create price_report" do
|
||||||
assert_difference("PriceReport.count") do
|
assert_difference("PriceReport.count") do
|
||||||
post price_reports_url, params: { price_report: { discount_price: @price_report.discount_price, downvotes: @price_report.downvotes, guest_id: @price_report.guest_id, price: @price_report.price, product_id: @price_report.product_id, reported_at: @price_report.reported_at, store_id: @price_report.store_id, upvotes: @price_report.upvotes } }, as: :json
|
post price_reports_url, params: { price_report: { discount_price: @price_report.discount_price, downvotes: @price_report.downvotes, user_id: @price_report.user_id, price: @price_report.price, product_id: @price_report.product_id, reported_at: @price_report.reported_at, store_id: @price_report.store_id, upvotes: @price_report.upvotes } }, as: :json
|
||||||
end
|
end
|
||||||
|
|
||||||
assert_response :created
|
assert_response :created
|
||||||
|
|
@ -24,7 +24,7 @@ class PriceReportsControllerTest < ActionDispatch::IntegrationTest
|
||||||
end
|
end
|
||||||
|
|
||||||
test "should update price_report" do
|
test "should update price_report" do
|
||||||
patch price_report_url(@price_report), params: { price_report: { discount_price: @price_report.discount_price, downvotes: @price_report.downvotes, guest_id: @price_report.guest_id, price: @price_report.price, product_id: @price_report.product_id, reported_at: @price_report.reported_at, store_id: @price_report.store_id, upvotes: @price_report.upvotes } }, as: :json
|
patch price_report_url(@price_report), params: { price_report: { discount_price: @price_report.discount_price, downvotes: @price_report.downvotes, user_id: @price_report.user_id, price: @price_report.price, product_id: @price_report.product_id, reported_at: @price_report.reported_at, store_id: @price_report.store_id, upvotes: @price_report.upvotes } }, as: :json
|
||||||
assert_response :success
|
assert_response :success
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
||||||
10
test/fixtures/price_reports.yml
vendored
10
test/fixtures/price_reports.yml
vendored
|
|
@ -12,21 +12,21 @@
|
||||||
# upvotes :integer
|
# upvotes :integer
|
||||||
# created_at :datetime not null
|
# created_at :datetime not null
|
||||||
# updated_at :datetime not null
|
# updated_at :datetime not null
|
||||||
# guest_id :integer not null
|
|
||||||
# product_id :integer not null
|
# product_id :integer not null
|
||||||
# store_id :integer not null
|
# store_id :integer not null
|
||||||
|
# user_id :bigint not null
|
||||||
#
|
#
|
||||||
# Indexes
|
# Indexes
|
||||||
#
|
#
|
||||||
# index_price_reports_on_guest_id (guest_id)
|
|
||||||
# index_price_reports_on_product_id (product_id)
|
# index_price_reports_on_product_id (product_id)
|
||||||
# index_price_reports_on_store_id (store_id)
|
# index_price_reports_on_store_id (store_id)
|
||||||
|
# index_price_reports_on_user_id (user_id)
|
||||||
#
|
#
|
||||||
# Foreign Keys
|
# Foreign Keys
|
||||||
#
|
#
|
||||||
# fk_rails_... (guest_id => guests.id)
|
|
||||||
# fk_rails_... (product_id => products.id)
|
# fk_rails_... (product_id => products.id)
|
||||||
# fk_rails_... (store_id => stores.id)
|
# fk_rails_... (store_id => stores.id)
|
||||||
|
# fk_rails_... (user_id => users.id)
|
||||||
#
|
#
|
||||||
one:
|
one:
|
||||||
price: 9.99
|
price: 9.99
|
||||||
|
|
@ -36,7 +36,7 @@ one:
|
||||||
reported_at: 2026-05-17 14:11:07
|
reported_at: 2026-05-17 14:11:07
|
||||||
product: one
|
product: one
|
||||||
store: one
|
store: one
|
||||||
guest: one
|
user: one
|
||||||
|
|
||||||
two:
|
two:
|
||||||
price: 9.99
|
price: 9.99
|
||||||
|
|
@ -46,4 +46,4 @@ two:
|
||||||
reported_at: 2026-05-17 14:11:07
|
reported_at: 2026-05-17 14:11:07
|
||||||
product: two
|
product: two
|
||||||
store: two
|
store: two
|
||||||
guest: two
|
user: two
|
||||||
|
|
|
||||||
11
test/fixtures/votes.yml
vendored
Normal file
11
test/fixtures/votes.yml
vendored
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
# Read about fixtures at https://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
|
||||||
|
|
||||||
|
one:
|
||||||
|
user: one
|
||||||
|
votable=references{polymorphic}: MyString
|
||||||
|
direction: 1
|
||||||
|
|
||||||
|
two:
|
||||||
|
user: two
|
||||||
|
votable=references{polymorphic}: MyString
|
||||||
|
direction: 1
|
||||||
|
|
@ -10,21 +10,21 @@
|
||||||
# upvotes :integer
|
# upvotes :integer
|
||||||
# created_at :datetime not null
|
# created_at :datetime not null
|
||||||
# updated_at :datetime not null
|
# updated_at :datetime not null
|
||||||
# guest_id :integer not null
|
|
||||||
# product_id :integer not null
|
# product_id :integer not null
|
||||||
# store_id :integer not null
|
# store_id :integer not null
|
||||||
|
# user_id :bigint not null
|
||||||
#
|
#
|
||||||
# Indexes
|
# Indexes
|
||||||
#
|
#
|
||||||
# index_price_reports_on_guest_id (guest_id)
|
|
||||||
# index_price_reports_on_product_id (product_id)
|
# index_price_reports_on_product_id (product_id)
|
||||||
# index_price_reports_on_store_id (store_id)
|
# index_price_reports_on_store_id (store_id)
|
||||||
|
# index_price_reports_on_user_id (user_id)
|
||||||
#
|
#
|
||||||
# Foreign Keys
|
# Foreign Keys
|
||||||
#
|
#
|
||||||
# fk_rails_... (guest_id => guests.id)
|
|
||||||
# fk_rails_... (product_id => products.id)
|
# fk_rails_... (product_id => products.id)
|
||||||
# fk_rails_... (store_id => stores.id)
|
# fk_rails_... (store_id => stores.id)
|
||||||
|
# fk_rails_... (user_id => users.id)
|
||||||
#
|
#
|
||||||
require "test_helper"
|
require "test_helper"
|
||||||
|
|
||||||
|
|
|
||||||
7
test/models/vote_test.rb
Normal file
7
test/models/vote_test.rb
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
require "test_helper"
|
||||||
|
|
||||||
|
class VoteTest < ActiveSupport::TestCase
|
||||||
|
# test "the truth" do
|
||||||
|
# assert true
|
||||||
|
# end
|
||||||
|
end
|
||||||
Loading…
Reference in a new issue