require 'sinatra/extension' module Telemetry module Snmp module Controller module OIDs extend Sinatra::Extension get '' do oids = {} Telemetry::Snmp::Data::MOdel::OID.all.each do |oid| oids[oid.values[:id]] = oid.values end oids end get '/:id' do oid = Telemetry::Snmp::Data::Model::OID[params[:id]] status 404 if oid.nil? return { error: true, message: "#{params[:id]} not found" } if oid.nil? oid.values end post '' do body = MultiJson.load(request.body.read, symbolize_keys: true) status 400 if body[:oid].nil? { error: true, message: 'oid is a required field' } if body[:oid].nil? insert = { oid: body[:oid], name: body[:name], description: body[:description], created: Sequel::CURRENT_TIMESTAMP } { id: Telemetry::Snmp::Data::Model::OID.insert(**insert), oid: body[:oid] } end put '/:id' do oid = Telemetry::Snmp::Data::Model::OID[params[:id]] status 404 if oid.nil? return { error: true, message: "#{params[:id]} not found" } if oid.nil? status 405 { error: true, message: 'puts not supported', id: params[:id] } end patch '/:id' do oid = Telemetry::Snmp::Data::Model::OID[params[:id]] status 404 if oid.nil? return { error: true, message: "#{params[:id]} not found" } if oid.nil? body = MultiJson.load(request.body.read, symbolize_keys: true) updates = {} fields = %i[oid name description] fields.each { |field| updates[field] = body[field] if body.key? field } if updates.empty? status 400 return { error: true, message: 'no valid fields to update' } end updates[:updated] = Sequel::CURRENT_TIMESTAMP oid.update(**updates) { error: false, updated_fields: updates.keys, id: params[:id] } end delete '/:id' do oid = Telemetry::Snmp::Data::Model::OID[params[:id]] status 404 if oid.nil? return { error: true, message: "#{params[:id]} not found" } if oid.nil? { error: !oid.delete, id: params[:id] } end end end end end