class ResourcesController < ApplicationController before_action :set_resource, only: [:new, :show, :edit, :update, :delete, :destroy] # GET /resources def index @resources = Resource.order(:uuid).page params[:page] end # GET /resources/new def new end # POST /resources def create # Check list: # 1. UUID is not set, or not known # 2. Agent is correct # 3. Name, Description, Phone, Email, etc. do not yield results # 4. Background job to validate fields and save # 5. Or Background job to list similar items # 6. Return to user with new record or list of mergeable ones end # GET /resources/:id def show end # GET /resources/:id/edit def edit end # PATCH /resources/:id def update # Check list: # 1. Compare records for changes # 2. Validate each change # 3. Moderate queue or save updated_properties = @resource.feature['properties'] updated_geometry = @resource.feature['geometry'] updated = false flash.now[:notice] = updated_geometry.inspect if @resource.uuid.present? && params[:resource][:uuid].present? && params[:resource][:uuid] != @resource.uuid flash.now[:error] = "UUID cannot be changed." render :edit, status: :unprocessable_entity and return end params[:resource].each do |prop| next if %w(longitude latitude).include?(prop.first.to_s) if prop.last.present? && prop.last != @resource.send("#{prop.first.to_s}") updated = true updated_properties[prop.first.to_s] = prop.last end end lon, lat = updated_geometry['coordinates'] flash.now.notice = "lon #{lon} => #{params[:resource][:longitude]}, lat #{lat} =>#{params[:resource][:latitude]}" if params[:resource][:longitude].present? && params[:resource][:longitude] != lon updated = true updated_geometry['coordinates'][0] = params[:resource][:longitude] Rails.logger.info "UPDATED LON TO #{params[:resource][:longitude]} /// #{updated_geometry.inspect}" end if params[:resource][:latitude].present? && params[:resource][:latitude] != lat updated = true updated_geometry['coordinates'][1] = params[:resource][:latitude] end if updated == true Rails.logger.info "Got a Resource update..." @resource.feature['properties'] = updated_properties @resource.feature['geometry'] = updated_geometry if @resource.save flash.notice = "Good! It worked! #{@resource.feature['geometry']}" redirect_to resource_url(@resource) and return else flash.now[:notice] = @resource.errors.inspect end end flash.now[:alert] = "Update failed!" render :edit end # GET /resources/:id/delete def delete end # DELETE /resources/:id def destroy # Check list # 1. User belongs to Agent and is :maintainer? end private def resource_params params.require(:resource).permit(:uuid, :name, :summary, :description, :email, :city, :postal_code, :phone_number, :website, :entry_number, :categories, :latitude, :longitude) end def set_resource @resource = Resource.find_by(uuid: params[:id]) || Resource.new end end