class Champs::CarteController < ApplicationController before_action :authenticate_logged_user! EMPTY_GEO_JSON = '[]' ERROR_GEO_JSON = '' def show @selector = ".carte-#{params[:position]}" if params[:dossier].key?(:champs_attributes) coordinates = params[:dossier][:champs_attributes][params[:position]][:value] else coordinates = params[:dossier][:champs_private_attributes][params[:position]][:value] end @champ = if params[:champ_id].present? policy_scope(Champ).find(params[:champ_id]) else policy_scope(TypeDeChamp).find(params[:type_de_champ_id]).champ.build end geo_areas = [] if coordinates == EMPTY_GEO_JSON @champ.value = nil @champ.geo_areas = [] elsif coordinates == ERROR_GEO_JSON @error = true @champ.value = nil @champ.geo_areas = [] else coordinates = JSON.parse(coordinates) if @champ.cadastres? cadastres = ApiCartoService.generate_cadastre(coordinates) geo_areas += cadastres.map do |cadastre| cadastre[:source] = GeoArea.sources.fetch(:cadastre) cadastre end end if @champ.quartiers_prioritaires? quartiers_prioritaires = ApiCartoService.generate_qp(coordinates) geo_areas += quartiers_prioritaires.map do |qp| qp[:source] = GeoArea.sources.fetch(:quartier_prioritaire) qp end end selection_utilisateur = ApiCartoService.generate_selection_utilisateur(coordinates) selection_utilisateur[:source] = GeoArea.sources.fetch(:selection_utilisateur) geo_areas << selection_utilisateur @champ.geo_areas = geo_areas.map do |geo_area| GeoArea.new(geo_area) end @champ.value = coordinates.to_json end if @champ.persisted? @champ.save end rescue ApiCarto::API::ResourceNotFound flash.alert = 'Les données cartographiques sont temporairement indisponibles. Réessayez dans un instant.' response.status = 503 end end