All checks were successful
		
		
	
	Check usage of free licenses / check-licenses (pull_request) Successful in 1m38s
				
			Add copyright notice / copyright_notice (pull_request) Successful in 3m16s
				
			Run unit tests / unit_tests (pull_request) Successful in 5m31s
				
			Build Nginx-based docker image / build-static-assets (pull_request) Successful in 41m31s
				
			
		
			
				
	
	
		
			73 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| # Copyright (C) 2024-2025 LibreWeddingPlanner contributors
 | |
| 
 | |
| # frozen_string_literal: true
 | |
| 
 | |
| class AffinitiesController < ApplicationController
 | |
|   before_action :set_group, except: :reset
 | |
| 
 | |
|   def index
 | |
|     overridden = @group.affinities.each_with_object({}) do |affinity, acc|
 | |
|       acc[affinity.another_group(@group).id] = affinity.discomfort
 | |
|     end
 | |
| 
 | |
|     for_each_group do |group_id|
 | |
|       overridden[group_id] || GroupAffinity::NEUTRAL
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def bulk_update
 | |
|     affinities = params.expect(affinities: [%i[group_id affinity]]).map(&:to_h).map do |affinity|
 | |
|       {
 | |
|         group_a_id: @group.id,
 | |
|         group_b_id: affinity[:group_id],
 | |
|         discomfort: GroupAffinity::MAX_DISCOMFORT - affinity[:affinity]
 | |
|       }
 | |
|     end
 | |
| 
 | |
|     GroupAffinity.upsert_all(affinities, unique_by: :uindex_group_pair)
 | |
| 
 | |
|     render json: {}, status: :ok
 | |
|   rescue ActiveRecord::InvalidForeignKey
 | |
|     render json: { error: 'At least one of the group IDs provided does not exist.' }, status: :bad_request
 | |
|   rescue ActiveRecord::StatementInvalid
 | |
|     render json: { error: 'Invalid group ID or discomfort provided.' }, status: :bad_request
 | |
|   end
 | |
| 
 | |
|   def default
 | |
|     hierarchy = AffinityGroupsHierarchy.new
 | |
| 
 | |
|     for_each_group do |group_id|
 | |
|       hierarchy.default_discomfort(@group.id, group_id).to_f
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def reset
 | |
|     hierarchy = AffinityGroupsHierarchy.new
 | |
| 
 | |
|     affinities = Group.pluck(:id).combination(2).map do |(group_a_id, group_b_id)|
 | |
|       {
 | |
|         group_a_id:,
 | |
|         group_b_id:,
 | |
|         discomfort: hierarchy.default_discomfort(group_a_id, group_b_id).to_f
 | |
|       }
 | |
|     end
 | |
| 
 | |
|     GroupAffinity.upsert_all(affinities, unique_by: :uindex_group_pair)
 | |
| 
 | |
|     render json: {}, status: :ok
 | |
|   end
 | |
| 
 | |
|   private
 | |
| 
 | |
|   def for_each_group
 | |
|     Group.where.not(id: @group.id)
 | |
|          .pluck(:id)
 | |
|          .index_with { |group_id| GroupAffinity::MAX_DISCOMFORT - yield(group_id) }
 | |
|          .then { |affinities| render json: affinities }
 | |
|   end
 | |
| 
 | |
|   def set_group
 | |
|     @group = Group.find(params[:group_id])
 | |
|   end
 | |
| end
 |