class Users::CarteController < UsersController before_action only: [:show] do authorized_routes? self.class end def show @dossier = current_user_dossier rescue ActiveRecord::RecordNotFound flash.alert = t('errors.messages.dossier_not_found') redirect_to url_for(root_path) end def save geo_json = clean_json_latlngs(params[:selection]) dossier = current_user_dossier dossier.quartier_prioritaires.each(&:destroy) dossier.cadastres.each(&:destroy) if geo_json.present? ModuleApiCartoService.save_qp!(dossier, geo_json) ModuleApiCartoService.save_cadastre!(dossier, geo_json) end dossier.update!(json_latlngs: geo_json) redirect_to brouillon_dossier_path(dossier) end def zones @dossier = current_user_dossier @data = {} geo_json = JSON.parse(params.fetch(:selection, '[]')) if geo_json.first == ["error", "TooManyPolygons"] @error = true else if @dossier.procedure.module_api_carto.quartiers_prioritaires? quartiers_prioritaires = ModuleApiCartoService.generate_qp(geo_json) @dossier.quartier_prioritaires.build(quartiers_prioritaires) @data[:quartiersPrioritaires] = quartiers_prioritaires end if @dossier.procedure.module_api_carto.cadastre? cadastres = ModuleApiCartoService.generate_cadastre(geo_json) @dossier.cadastres.build(cadastres) @data[:cadastres] = cadastres end end end def self.route_authorization { states: [Dossier.states.fetch(:brouillon), Dossier.states.fetch(:en_construction)], api_carto: true } end private def clean_json_latlngs(json_latlngs) # a polygon must contain at least 4 points # https://tools.ietf.org/html/rfc7946#section-3.1.6 if json_latlngs.present? multipolygone = JSON.parse(json_latlngs) if multipolygone.first == ["error", "TooManyPolygons"] [].to_json else multipolygone.reject! { |polygone| polygone.count < 4 } if multipolygone.present? multipolygone.to_json end end end end end