From 5c38629f1f6879bd802f5235cb930a64be528e08 Mon Sep 17 00:00:00 2001 From: Justin Edmund Date: Sat, 20 Dec 2025 04:13:27 -0800 Subject: [PATCH] add crew roster endpoint for checking member collections --- app/controllers/api/v1/crews_controller.rb | 55 ++++++++++++++++++++-- app/models/crew_membership.rb | 4 ++ config/routes.rb | 9 ++-- 3 files changed, 62 insertions(+), 6 deletions(-) diff --git a/app/controllers/api/v1/crews_controller.rb b/app/controllers/api/v1/crews_controller.rb index 385ef25..0509ecf 100644 --- a/app/controllers/api/v1/crews_controller.rb +++ b/app/controllers/api/v1/crews_controller.rb @@ -6,10 +6,10 @@ module Api include CrewAuthorizationConcern before_action :restrict_access - before_action :set_crew, only: %i[show update members leave transfer_captain] - before_action :require_crew!, only: %i[show update members] + before_action :set_crew, only: %i[show update members roster leave transfer_captain] + before_action :require_crew!, only: %i[show update members roster] before_action :authorize_crew_member!, only: %i[show members] - before_action :authorize_crew_officer!, only: %i[update] + before_action :authorize_crew_officer!, only: %i[update roster] before_action :authorize_crew_captain!, only: %i[transfer_captain] # GET /crew or GET /crews/:id @@ -80,6 +80,17 @@ module Api head :no_content end + # GET /crew/roster + # Returns collection ownership for crew members based on requested item IDs + # Params: character_ids[], weapon_ids[], summon_ids[] + def roster + members = @crew.active_memberships.includes(:user) + + render json: { + members: members.map { |m| build_member_roster(m) } + } + end + # POST /crews/:id/transfer_captain def transfer_captain new_captain_id = params[:user_id] @@ -112,6 +123,44 @@ module Api def require_crew! render_not_found_response('crew') unless @crew end + + def build_member_roster(membership) + user = membership.user + { + user_id: user.id, + username: user.username, + role: membership.role, + characters: find_collection_items(user, :characters), + weapons: find_collection_items(user, :weapons), + summons: find_collection_items(user, :summons) + } + end + + def find_collection_items(user, type) + ids = params["#{type.to_s.singularize}_ids"] + return [] if ids.blank? + + collection = case type + when :characters then user.collection_characters.where(character_id: ids) + when :weapons then user.collection_weapons.where(weapon_id: ids) + when :summons then user.collection_summons.where(summon_id: ids) + end + + collection.map do |item| + { + id: item_id_for(item, type), + uncap_level: item.uncap_level + } + end + end + + def item_id_for(item, type) + case type + when :characters then item.character_id + when :weapons then item.weapon_id + when :summons then item.summon_id + end + end end end end diff --git a/app/models/crew_membership.rb b/app/models/crew_membership.rb index 8233262..0ea8f2a 100644 --- a/app/models/crew_membership.rb +++ b/app/models/crew_membership.rb @@ -28,6 +28,10 @@ class CrewMembership < ApplicationRecord update!(retired: true, retired_at: Time.current, role: :member) end + def officer? + captain? || vice_captain? + end + def blueprint CrewMembershipBlueprint end diff --git a/config/routes.rb b/config/routes.rb index 536d5c3..d417622 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -101,9 +101,11 @@ Rails.application.routes.draw do get 'guidebooks', to: 'guidebooks#all' - get 'raids', to: 'raids#all' - get 'raids/groups', to: 'raids#groups' - get 'raids/:id', to: 'raids#show' + # Raids and RaidGroups + resources :raid_groups, only: %i[index show create update destroy] + resources :raids, only: %i[index show create update destroy] + get 'raids/groups', to: 'raids#groups' # Legacy endpoint + get 'weapon_keys', to: 'weapon_keys#all' resources :weapon_series, only: %i[index show create update destroy] @@ -171,6 +173,7 @@ Rails.application.routes.draw do resource :crew, only: %i[show update], controller: 'crews' do member do get :members + get :roster post :leave end end