diff --git a/app/controllers/api/v1/collection_artifacts_controller.rb b/app/controllers/api/v1/collection_artifacts_controller.rb index 50fd188..14030b0 100644 --- a/app/controllers/api/v1/collection_artifacts_controller.rb +++ b/app/controllers/api/v1/collection_artifacts_controller.rb @@ -9,7 +9,7 @@ module Api before_action :set_collection_artifact_for_read, only: %i[show] # Write actions: require auth, use current_user - before_action :restrict_access, only: %i[create update destroy batch import] + before_action :restrict_access, only: %i[create update destroy batch batch_destroy import] before_action :set_collection_artifact_for_write, only: %i[update destroy] def index @@ -19,6 +19,12 @@ module Api @collection_artifacts = @collection_artifacts.where(element: params[:element]) if params[:element] @collection_artifacts = @collection_artifacts.joins(:artifact).where(artifacts: { rarity: params[:rarity] }) if params[:rarity] + # Skill filters - each slot uses OR logic, slots combined with AND logic + @collection_artifacts = @collection_artifacts.with_skill_in_slot(1, params[:skill1]) if params[:skill1].present? + @collection_artifacts = @collection_artifacts.with_skill_in_slot(2, params[:skill2]) if params[:skill2].present? + @collection_artifacts = @collection_artifacts.with_skill_in_slot(3, params[:skill3]) if params[:skill3].present? + @collection_artifacts = @collection_artifacts.with_skill_in_slot(4, params[:skill4]) if params[:skill4].present? + @collection_artifacts = @collection_artifacts.paginate(page: params[:page], per_page: params[:limit] || 50) render json: Api::V1::CollectionArtifactBlueprint.render( @@ -127,6 +133,17 @@ module Api }, status: status end + # DELETE /collection/artifacts/batch_destroy + # Deletes multiple collection artifacts in a single request + def batch_destroy + ids = batch_destroy_params[:ids] || [] + deleted_count = current_user.collection_artifacts.where(id: ids).destroy_all.count + + render json: { + meta: { deleted: deleted_count } + }, status: :ok + end + private def set_target_user @@ -181,6 +198,10 @@ module Api data: params[:data]&.to_unsafe_h } end + + def batch_destroy_params + params.permit(ids: []) + end end end end diff --git a/app/models/collection_artifact.rb b/app/models/collection_artifact.rb index 35f43fb..96f6300 100644 --- a/app/models/collection_artifact.rb +++ b/app/models/collection_artifact.rb @@ -48,6 +48,19 @@ class CollectionArtifact < ApplicationRecord scope :standard_only, -> { joins(:artifact).where(artifacts: { rarity: :standard }) } scope :quirk_only, -> { joins(:artifact).where(artifacts: { rarity: :quirk }) } + # Filter by skill modifier in a specific slot (1-4) + # Uses OR logic when multiple modifiers are provided + scope :with_skill_in_slot, ->(slot, modifiers) { + return all if modifiers.blank? + + modifiers = Array(modifiers).map(&:to_s) + column = "skill#{slot}" + + # Build OR conditions for multiple modifiers + conditions = modifiers.map { |_| "#{column}->>'modifier' = ?" }.join(' OR ') + where(conditions, *modifiers) + } + # Returns the effective proficiency - from instance for quirk, from artifact for standard def effective_proficiency quirk_artifact? ? proficiency : artifact&.proficiency