tim-vandecasteele/grape-swagger

View on GitHub
example/api/endpoints.rb

Summary

Maintainability
A
0 mins
Test Coverage
require 'grape-entity'
require './api/entities'

module Api
  class Spline
    attr_accessor :id, :x, :y, :reticulated
  end

  module Endpoints
    class Root < Grape::API
      desc 'API Root'
      get do
        {
          splines_url: '/splines',
          file_url: '/file'
        }
      end
    end

    class Splines < Grape::API
      @@splines = []

      namespace :splines do
        #
        desc 'Get all splines',
          is_array: true,
          http_codes: [
            { code: 200, message: 'get Splines', model: Api::Entities::Splines },
            { code: 422, message: 'SplinesOutError' }
          ]
        get do
          present :items, @@splines, with: Entities::Splines
        end

        #
        desc 'Return a spline.',
          http_codes: [
            { code: 200, message: 'get Splines' },
            { code: 422, message: 'SplinesOutError' }
          ]
        params do
          requires :id, type: Integer, desc: 'Spline id.'
        end
        get ':id' do
          error!(code: 422, message: 'SplinesOutError') unless @@splines[params[:id] - 1]

          present @@splines[params[:id] - 1], with: Entities::Splines
        end

        #
        desc 'Create a spline.',
          http_codes: [
            { code: 201, message: 'Spline created', model: Api::Entities::Splines }
          ]
        params do
          requires :spline, type: Hash do
            requires :x, type: Numeric
            requires :y, type: Numeric
          end
          optional :reticulated, type: Boolean, default: true, desc: 'True if the spline is reticulated.'
        end
        post do
          spline = Spline.new
          spline.id = @@splines.size + 1
          spline.x =  (params[:spline][:x] / params[:spline][:y] || 0.0)
          spline.y =  (params[:spline][:y] / params[:spline][:x] || 0.0)
          spline.reticulated =  params[:reticulated]

          @@splines << spline

          present spline, with: Entities::Splines
        end

        #
        desc 'Update a spline.',
          http_codes: [
            { code: 200, message: 'update Splines', model: Api::Entities::Splines },
            { code: 422, message: 'SplinesOutError' }
          ]
        params do
          requires :id, type: Integer, desc: 'Spline id.'
          optional :spline, type: Hash do
            optional :x, type: Numeric
            optional :y, type: Numeric
          end
          optional :reticulated, type: Boolean, default: true, desc: 'True if the spline is reticulated.'
        end
        put ':id' do
          error!(code: 422, message: 'SplinesOutError') unless @@splines[params[:id] - 1]

          update_data = params[:spline]
          spline      = @@splines[params[:id] - 1]

          spline.reticulated = !!update_data[:reticulated]
          spline.x           = update_data[:x] / update_data[:y] || 0.0
          spline.y           = update_data[:y] / update_data[:x] || 0.0

          present spline, with: Entities::Splines
        end

        #
        desc 'Delete a spline.'
        params do
          requires :id, type: Integer, desc: 'Spline id.'
        end
        delete ':id' do
          error!(code: 422, message: 'SplinesOutError') unless @@splines[params[:id] - 1]

          @@splines.delete_at(params[:id] - 1)
          { 'deleted' => params[:id] }
        end
      end
    end

    class FileAccessor < Grape::API
      namespace :file do
        desc 'Update image',
             details: "# TEST api for testing uploading\n
                       # curl --form file=@splines.png http://localhost:9292/file/upload",
             content_type: 'application/octet-stream'
        post 'upload' do
          filename = params[:file][:filename]
          content_type 'binary', 'application/octet-stream'
          # env['api.format'] = :binary # there's no formatter for :binary, data will be returned "as is"
          header 'Content-Disposition', "attachment; filename*=UTF-8''#{URI.escape(filename)}"
          params[:file][:tempfile].read
        end
      end
    end
  end
end