reqcord 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +8 -0
- data/CHANGELOG.md +77 -0
- data/Gemfile +5 -0
- data/Gemfile.lock +171 -0
- data/LICENSE.txt +21 -0
- data/README.md +239 -95
- data/Rakefile +13 -0
- data/docs/configuration.md +319 -0
- data/examples/complex-spec-app/.rspec +1 -0
- data/examples/complex-spec-app/README.md +21 -0
- data/examples/complex-spec-app/app.rb +363 -0
- data/examples/complex-spec-app/docs/api/README.md +104 -0
- data/examples/complex-spec-app/docs/api/api/v1/admin/products/create.md +117 -0
- data/examples/complex-spec-app/docs/api/api/v1/admin/products/destroy.md +51 -0
- data/examples/complex-spec-app/docs/api/api/v1/admin/products/index.md +11 -0
- data/examples/complex-spec-app/docs/api/api/v1/admin/products/list.md +106 -0
- data/examples/complex-spec-app/docs/api/api/v1/auth/index.md +9 -0
- data/examples/complex-spec-app/docs/api/api/v1/auth/login.md +76 -0
- data/examples/complex-spec-app/docs/api/api/v1/cart-items/create.md +91 -0
- data/examples/complex-spec-app/docs/api/api/v1/cart-items/destroy.md +51 -0
- data/examples/complex-spec-app/docs/api/api/v1/cart-items/index.md +10 -0
- data/examples/complex-spec-app/docs/api/api/v1/carts/checkout.md +102 -0
- data/examples/complex-spec-app/docs/api/api/v1/carts/index.md +10 -0
- data/examples/complex-spec-app/docs/api/api/v1/carts/show.md +73 -0
- data/examples/complex-spec-app/docs/api/api/v1/home/index.md +9 -0
- data/examples/complex-spec-app/docs/api/api/v1/home/list.md +47 -0
- data/examples/complex-spec-app/docs/api/api/v1/notes/create.md +94 -0
- data/examples/complex-spec-app/docs/api/api/v1/notes/index.md +10 -0
- data/examples/complex-spec-app/docs/api/api/v1/notes/list.md +61 -0
- data/examples/complex-spec-app/docs/api/api/v1/orders/cancel.md +69 -0
- data/examples/complex-spec-app/docs/api/api/v1/orders/create.md +150 -0
- data/examples/complex-spec-app/docs/api/api/v1/orders/destroy.md +37 -0
- data/examples/complex-spec-app/docs/api/api/v1/orders/index.md +13 -0
- data/examples/complex-spec-app/docs/api/api/v1/orders/list.md +78 -0
- data/examples/complex-spec-app/docs/api/api/v1/orders/show.md +83 -0
- data/examples/complex-spec-app/docs/api/api/v1/products/index.md +11 -0
- data/examples/complex-spec-app/docs/api/api/v1/products/list.md +83 -0
- data/examples/complex-spec-app/docs/api/api/v1/products/search.md +88 -0
- data/examples/complex-spec-app/docs/api/api/v1/products/show.md +71 -0
- data/examples/complex-spec-app/docs/api/api/v1/profiles/index.md +10 -0
- data/examples/complex-spec-app/docs/api/api/v1/profiles/show.md +61 -0
- data/examples/complex-spec-app/docs/api/api/v1/profiles/update.md +91 -0
- data/examples/complex-spec-app/docs/api/api/v2/products/index.md +9 -0
- data/examples/complex-spec-app/docs/api/api/v2/products/list.md +77 -0
- data/examples/complex-spec-app/docs/api/curl/api/v1/admin/products/create.sh +18 -0
- data/examples/complex-spec-app/docs/api/curl/api/v1/admin/products/destroy.sh +9 -0
- data/examples/complex-spec-app/docs/api/curl/api/v1/admin/products/list.sh +9 -0
- data/examples/complex-spec-app/docs/api/curl/api/v1/auth/login.sh +9 -0
- data/examples/complex-spec-app/docs/api/curl/api/v1/cart-items/create.sh +16 -0
- data/examples/complex-spec-app/docs/api/curl/api/v1/cart-items/destroy.sh +9 -0
- data/examples/complex-spec-app/docs/api/curl/api/v1/carts/checkout.sh +13 -0
- data/examples/complex-spec-app/docs/api/curl/api/v1/carts/show.sh +9 -0
- data/examples/complex-spec-app/docs/api/curl/api/v1/home/list.sh +8 -0
- data/examples/complex-spec-app/docs/api/curl/api/v1/notes/create.sh +15 -0
- data/examples/complex-spec-app/docs/api/curl/api/v1/notes/list.sh +9 -0
- data/examples/complex-spec-app/docs/api/curl/api/v1/orders/cancel.sh +9 -0
- data/examples/complex-spec-app/docs/api/curl/api/v1/orders/create.sh +29 -0
- data/examples/complex-spec-app/docs/api/curl/api/v1/orders/destroy.sh +9 -0
- data/examples/complex-spec-app/docs/api/curl/api/v1/orders/list.sh +9 -0
- data/examples/complex-spec-app/docs/api/curl/api/v1/orders/show.sh +9 -0
- data/examples/complex-spec-app/docs/api/curl/api/v1/products/list.sh +8 -0
- data/examples/complex-spec-app/docs/api/curl/api/v1/products/search.sh +8 -0
- data/examples/complex-spec-app/docs/api/curl/api/v1/products/show.sh +8 -0
- data/examples/complex-spec-app/docs/api/curl/api/v1/profiles/show.sh +9 -0
- data/examples/complex-spec-app/docs/api/curl/api/v1/profiles/update.sh +16 -0
- data/examples/complex-spec-app/docs/api/curl/api/v2/products/list.sh +8 -0
- data/examples/complex-spec-app/docs/api/dataset.json +5116 -0
- data/examples/complex-spec-app/docs/api/postman/collection.json +2519 -0
- data/examples/complex-spec-app/generate.rb +14 -0
- data/examples/complex-spec-app/reqcord.yml +28 -0
- data/examples/complex-spec-app/spec/requests/admin_spec.rb +67 -0
- data/examples/complex-spec-app/spec/requests/cart_spec.rb +61 -0
- data/examples/complex-spec-app/spec/requests/home_and_auth_spec.rb +49 -0
- data/examples/complex-spec-app/spec/requests/orders_spec.rb +124 -0
- data/examples/complex-spec-app/spec/requests/products_spec.rb +65 -0
- data/examples/complex-spec-app/spec/spec_helper.rb +17 -0
- data/examples/complex-test-app/README.md +40 -0
- data/examples/complex-test-app/app.rb +384 -0
- data/examples/complex-test-app/docs/api/README.md +104 -0
- data/examples/complex-test-app/docs/api/api/v1/admin/products/create.md +117 -0
- data/examples/complex-test-app/docs/api/api/v1/admin/products/destroy.md +51 -0
- data/examples/complex-test-app/docs/api/api/v1/admin/products/index.md +11 -0
- data/examples/complex-test-app/docs/api/api/v1/admin/products/list.md +106 -0
- data/examples/complex-test-app/docs/api/api/v1/auth/index.md +9 -0
- data/examples/complex-test-app/docs/api/api/v1/auth/login.md +76 -0
- data/examples/complex-test-app/docs/api/api/v1/cart-items/create.md +91 -0
- data/examples/complex-test-app/docs/api/api/v1/cart-items/destroy.md +51 -0
- data/examples/complex-test-app/docs/api/api/v1/cart-items/index.md +10 -0
- data/examples/complex-test-app/docs/api/api/v1/carts/checkout.md +102 -0
- data/examples/complex-test-app/docs/api/api/v1/carts/index.md +10 -0
- data/examples/complex-test-app/docs/api/api/v1/carts/show.md +73 -0
- data/examples/complex-test-app/docs/api/api/v1/home/index.md +9 -0
- data/examples/complex-test-app/docs/api/api/v1/home/list.md +47 -0
- data/examples/complex-test-app/docs/api/api/v1/notes/create.md +94 -0
- data/examples/complex-test-app/docs/api/api/v1/notes/index.md +10 -0
- data/examples/complex-test-app/docs/api/api/v1/notes/list.md +61 -0
- data/examples/complex-test-app/docs/api/api/v1/orders/cancel.md +69 -0
- data/examples/complex-test-app/docs/api/api/v1/orders/create.md +150 -0
- data/examples/complex-test-app/docs/api/api/v1/orders/destroy.md +37 -0
- data/examples/complex-test-app/docs/api/api/v1/orders/index.md +13 -0
- data/examples/complex-test-app/docs/api/api/v1/orders/list.md +71 -0
- data/examples/complex-test-app/docs/api/api/v1/orders/show.md +83 -0
- data/examples/complex-test-app/docs/api/api/v1/products/index.md +11 -0
- data/examples/complex-test-app/docs/api/api/v1/products/list.md +83 -0
- data/examples/complex-test-app/docs/api/api/v1/products/search.md +88 -0
- data/examples/complex-test-app/docs/api/api/v1/products/show.md +71 -0
- data/examples/complex-test-app/docs/api/api/v1/profiles/index.md +10 -0
- data/examples/complex-test-app/docs/api/api/v1/profiles/show.md +61 -0
- data/examples/complex-test-app/docs/api/api/v1/profiles/update.md +91 -0
- data/examples/complex-test-app/docs/api/api/v2/products/index.md +9 -0
- data/examples/complex-test-app/docs/api/api/v2/products/list.md +77 -0
- data/examples/complex-test-app/docs/api/curl/api/v1/admin/products/create.sh +18 -0
- data/examples/complex-test-app/docs/api/curl/api/v1/admin/products/destroy.sh +9 -0
- data/examples/complex-test-app/docs/api/curl/api/v1/admin/products/list.sh +9 -0
- data/examples/complex-test-app/docs/api/curl/api/v1/auth/login.sh +9 -0
- data/examples/complex-test-app/docs/api/curl/api/v1/cart-items/create.sh +16 -0
- data/examples/complex-test-app/docs/api/curl/api/v1/cart-items/destroy.sh +9 -0
- data/examples/complex-test-app/docs/api/curl/api/v1/carts/checkout.sh +13 -0
- data/examples/complex-test-app/docs/api/curl/api/v1/carts/show.sh +9 -0
- data/examples/complex-test-app/docs/api/curl/api/v1/home/list.sh +8 -0
- data/examples/complex-test-app/docs/api/curl/api/v1/notes/create.sh +15 -0
- data/examples/complex-test-app/docs/api/curl/api/v1/notes/list.sh +9 -0
- data/examples/complex-test-app/docs/api/curl/api/v1/orders/cancel.sh +9 -0
- data/examples/complex-test-app/docs/api/curl/api/v1/orders/create.sh +29 -0
- data/examples/complex-test-app/docs/api/curl/api/v1/orders/destroy.sh +9 -0
- data/examples/complex-test-app/docs/api/curl/api/v1/orders/list.sh +9 -0
- data/examples/complex-test-app/docs/api/curl/api/v1/orders/show.sh +9 -0
- data/examples/complex-test-app/docs/api/curl/api/v1/products/list.sh +8 -0
- data/examples/complex-test-app/docs/api/curl/api/v1/products/search.sh +8 -0
- data/examples/complex-test-app/docs/api/curl/api/v1/products/show.sh +8 -0
- data/examples/complex-test-app/docs/api/curl/api/v1/profiles/show.sh +9 -0
- data/examples/complex-test-app/docs/api/curl/api/v1/profiles/update.sh +16 -0
- data/examples/complex-test-app/docs/api/curl/api/v2/products/list.sh +8 -0
- data/examples/complex-test-app/docs/api/dataset.json +5109 -0
- data/examples/complex-test-app/docs/api/postman/collection.json +2568 -0
- data/examples/complex-test-app/generate.rb +14 -0
- data/examples/complex-test-app/reqcord.yml +28 -0
- data/examples/complex-test-app/test/integration/admin_test.rb +70 -0
- data/examples/complex-test-app/test/integration/cart_test.rb +64 -0
- data/examples/complex-test-app/test/integration/home_and_auth_test.rb +53 -0
- data/examples/complex-test-app/test/integration/orders_test.rb +127 -0
- data/examples/complex-test-app/test/integration/products_test.rb +66 -0
- data/examples/reqcord.yml +58 -0
- data/examples/spec-app/.rspec +1 -0
- data/examples/spec-app/README.md +36 -0
- data/examples/spec-app/app.rb +209 -0
- data/examples/spec-app/docs/api/README.md +45 -0
- data/examples/spec-app/docs/api/api/v1/customers/create.md +95 -0
- data/examples/spec-app/docs/api/api/v1/customers/index.md +11 -0
- data/examples/spec-app/docs/api/api/v1/customers/list.md +67 -0
- data/examples/spec-app/docs/api/api/v1/customers/show.md +65 -0
- data/examples/spec-app/docs/api/api/v1/tasks/complete.md +51 -0
- data/examples/spec-app/docs/api/api/v1/tasks/create.md +90 -0
- data/examples/spec-app/docs/api/api/v1/tasks/destroy.md +35 -0
- data/examples/spec-app/docs/api/api/v1/tasks/index.md +14 -0
- data/examples/spec-app/docs/api/api/v1/tasks/list.md +65 -0
- data/examples/spec-app/docs/api/api/v1/tasks/show.md +65 -0
- data/examples/spec-app/docs/api/api/v1/tasks/update.md +74 -0
- data/examples/spec-app/docs/api/api/v1/users/create.md +95 -0
- data/examples/spec-app/docs/api/api/v1/users/index.md +11 -0
- data/examples/spec-app/docs/api/api/v1/users/list.md +67 -0
- data/examples/spec-app/docs/api/api/v1/users/show.md +65 -0
- data/examples/spec-app/docs/api/curl/api/v1/customers/create.sh +17 -0
- data/examples/spec-app/docs/api/curl/api/v1/customers/list.sh +9 -0
- data/examples/spec-app/docs/api/curl/api/v1/customers/show.sh +9 -0
- data/examples/spec-app/docs/api/curl/api/v1/tasks/complete.sh +8 -0
- data/examples/spec-app/docs/api/curl/api/v1/tasks/create.sh +15 -0
- data/examples/spec-app/docs/api/curl/api/v1/tasks/destroy.sh +8 -0
- data/examples/spec-app/docs/api/curl/api/v1/tasks/list.sh +8 -0
- data/examples/spec-app/docs/api/curl/api/v1/tasks/show.sh +8 -0
- data/examples/spec-app/docs/api/curl/api/v1/tasks/update.sh +14 -0
- data/examples/spec-app/docs/api/curl/api/v1/users/create.sh +17 -0
- data/examples/spec-app/docs/api/curl/api/v1/users/list.sh +9 -0
- data/examples/spec-app/docs/api/curl/api/v1/users/show.sh +9 -0
- data/examples/spec-app/docs/api/dataset.json +2402 -0
- data/examples/spec-app/docs/api/postman/collection.json +1290 -0
- data/examples/spec-app/generate.rb +14 -0
- data/examples/spec-app/reqcord.yml +27 -0
- data/examples/spec-app/spec/requests/customers_spec.rb +71 -0
- data/examples/spec-app/spec/requests/tasks_spec.rb +78 -0
- data/examples/spec-app/spec/requests/users_spec.rb +68 -0
- data/examples/spec-app/spec/spec_helper.rb +17 -0
- data/examples/test-app/README.md +57 -0
- data/examples/test-app/app.rb +212 -0
- data/examples/test-app/docs/api/README.md +45 -0
- data/examples/test-app/docs/api/api/v1/customers/create.md +95 -0
- data/examples/test-app/docs/api/api/v1/customers/index.md +11 -0
- data/examples/test-app/docs/api/api/v1/customers/list.md +67 -0
- data/examples/test-app/docs/api/api/v1/customers/show.md +65 -0
- data/examples/test-app/docs/api/api/v1/tasks/complete.md +51 -0
- data/examples/test-app/docs/api/api/v1/tasks/create.md +90 -0
- data/examples/test-app/docs/api/api/v1/tasks/destroy.md +35 -0
- data/examples/test-app/docs/api/api/v1/tasks/index.md +14 -0
- data/examples/test-app/docs/api/api/v1/tasks/list.md +65 -0
- data/examples/test-app/docs/api/api/v1/tasks/show.md +65 -0
- data/examples/test-app/docs/api/api/v1/tasks/update.md +74 -0
- data/examples/test-app/docs/api/api/v1/users/create.md +95 -0
- data/examples/test-app/docs/api/api/v1/users/index.md +11 -0
- data/examples/test-app/docs/api/api/v1/users/list.md +67 -0
- data/examples/test-app/docs/api/api/v1/users/show.md +65 -0
- data/examples/test-app/docs/api/curl/api/v1/customers/create.sh +17 -0
- data/examples/test-app/docs/api/curl/api/v1/customers/list.sh +9 -0
- data/examples/test-app/docs/api/curl/api/v1/customers/show.sh +9 -0
- data/examples/test-app/docs/api/curl/api/v1/tasks/complete.sh +8 -0
- data/examples/test-app/docs/api/curl/api/v1/tasks/create.sh +15 -0
- data/examples/test-app/docs/api/curl/api/v1/tasks/destroy.sh +8 -0
- data/examples/test-app/docs/api/curl/api/v1/tasks/list.sh +8 -0
- data/examples/test-app/docs/api/curl/api/v1/tasks/show.sh +8 -0
- data/examples/test-app/docs/api/curl/api/v1/tasks/update.sh +14 -0
- data/examples/test-app/docs/api/curl/api/v1/users/create.sh +17 -0
- data/examples/test-app/docs/api/curl/api/v1/users/list.sh +9 -0
- data/examples/test-app/docs/api/curl/api/v1/users/show.sh +9 -0
- data/examples/test-app/docs/api/dataset.json +2402 -0
- data/examples/test-app/docs/api/postman/collection.json +1290 -0
- data/examples/test-app/generate.rb +14 -0
- data/examples/test-app/reqcord.yml +28 -0
- data/examples/test-app/test/integration/customers_test.rb +72 -0
- data/examples/test-app/test/integration/tasks_test.rb +80 -0
- data/examples/test-app/test/integration/users_test.rb +72 -0
- data/lib/reqcord/capture/collector.rb +31 -0
- data/lib/reqcord/capture/integration_patch.rb +209 -0
- data/lib/reqcord/capture/minitest_context.rb +34 -0
- data/lib/reqcord/capture/rspec_context.rb +42 -0
- data/lib/reqcord/capture/test_context.rb +25 -0
- data/lib/reqcord/capture.rb +19 -0
- data/lib/reqcord/configuration.rb +198 -0
- data/lib/reqcord/dataset.rb +176 -0
- data/lib/reqcord/endpoint.rb +263 -0
- data/lib/reqcord/errors.rb +9 -0
- data/lib/reqcord/exporters/curl.rb +68 -0
- data/lib/reqcord/exporters/markdown.rb +295 -0
- data/lib/reqcord/exporters/postman.rb +206 -0
- data/lib/reqcord/exporters.rb +32 -0
- data/lib/reqcord/generator.rb +364 -0
- data/lib/reqcord/railtie.rb +51 -0
- data/lib/reqcord/renderers/curl.rb +56 -0
- data/lib/reqcord/renderers/payload.rb +69 -0
- data/lib/reqcord/request_example.rb +104 -0
- data/lib/reqcord/response_example.rb +72 -0
- data/lib/reqcord/route_collector.rb +242 -0
- data/lib/reqcord/sanitizers/sanitizer.rb +140 -0
- data/lib/reqcord/schema.rb +187 -0
- data/lib/reqcord/support.rb +58 -0
- data/lib/reqcord/version.rb +5 -0
- data/lib/reqcord.rb +78 -0
- data/lib/tasks/reqcord.rake +99 -0
- data/reqcord.gemspec +46 -0
- metadata +317 -3
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# A tiny Rails API, in one file, so the example stays readable. In a real
|
|
4
|
+
# application this is just your app; Reqcord does not care how it is built.
|
|
5
|
+
#
|
|
6
|
+
# The same three resources as test-app — customers, users, tasks — so the two
|
|
7
|
+
# examples can be compared endpoint for endpoint.
|
|
8
|
+
ENV["RAILS_ENV"] ||= "test"
|
|
9
|
+
|
|
10
|
+
# Only needed because this example lives inside the Reqcord repository.
|
|
11
|
+
# In your own application, `gem "reqcord"` in the Gemfile is enough.
|
|
12
|
+
$LOAD_PATH.unshift File.expand_path("../../lib", __dir__)
|
|
13
|
+
|
|
14
|
+
require "rails"
|
|
15
|
+
require "action_controller/railtie"
|
|
16
|
+
require "reqcord"
|
|
17
|
+
|
|
18
|
+
class ExampleApp < Rails::Application
|
|
19
|
+
config.root = __dir__
|
|
20
|
+
config.eager_load = false
|
|
21
|
+
config.logger = Logger.new(IO::NULL)
|
|
22
|
+
config.secret_key_base = "a" * 64
|
|
23
|
+
config.hosts.clear
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
Rails.application.initialize!
|
|
27
|
+
|
|
28
|
+
module Api
|
|
29
|
+
module V1
|
|
30
|
+
class CustomersController < ActionController::API
|
|
31
|
+
CUSTOMERS = [
|
|
32
|
+
{ id: 1, name: "John Doe", email: "john@example.com" },
|
|
33
|
+
{ id: 2, name: "Jane Roe", email: "jane@example.com" }
|
|
34
|
+
].freeze
|
|
35
|
+
|
|
36
|
+
before_action :authenticate!
|
|
37
|
+
|
|
38
|
+
def index
|
|
39
|
+
render json: CUSTOMERS.first(params.fetch(:per_page, 25).to_i)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def show
|
|
43
|
+
customer = CUSTOMERS.find { |record| record[:id] == params[:id].to_i }
|
|
44
|
+
|
|
45
|
+
return render(json: { error: "Not Found" }, status: :not_found) unless customer
|
|
46
|
+
|
|
47
|
+
render json: customer
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
STATUSES = %w[active passive].freeze
|
|
51
|
+
|
|
52
|
+
def create
|
|
53
|
+
if params.dig(:customer, :email).to_s.empty?
|
|
54
|
+
return render(
|
|
55
|
+
json: { errors: { email: ["can't be blank"] } },
|
|
56
|
+
status: :unprocessable_entity
|
|
57
|
+
)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
unless STATUSES.include?(params.dig(:customer, :status).to_s)
|
|
61
|
+
return render(
|
|
62
|
+
json: { errors: { status: ["is not included in the list"] } },
|
|
63
|
+
status: :unprocessable_entity
|
|
64
|
+
)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
render json: { id: 3, **customer_params }, status: :created
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
private
|
|
71
|
+
|
|
72
|
+
def authenticate!
|
|
73
|
+
return if request.headers["Authorization"].present?
|
|
74
|
+
|
|
75
|
+
render json: { error: "Unauthorized" }, status: :unauthorized
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def customer_params
|
|
79
|
+
params.require(:customer).permit(:name, :email, :status).to_h.symbolize_keys
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
class UsersController < ActionController::API
|
|
84
|
+
USERS = [
|
|
85
|
+
{ id: 1, name: "John Doe", email: "john@example.com" },
|
|
86
|
+
{ id: 2, name: "Jane Roe", email: "jane@example.com" }
|
|
87
|
+
].freeze
|
|
88
|
+
|
|
89
|
+
before_action :authenticate!
|
|
90
|
+
|
|
91
|
+
def index
|
|
92
|
+
render json: USERS.first(params.fetch(:per_page, 25).to_i)
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def show
|
|
96
|
+
user = USERS.find { |record| record[:id] == params[:id].to_i }
|
|
97
|
+
|
|
98
|
+
return render(json: { error: "Not Found" }, status: :not_found) unless user
|
|
99
|
+
|
|
100
|
+
render json: user
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
STATUSES = %w[active inactive].freeze
|
|
104
|
+
|
|
105
|
+
def create
|
|
106
|
+
if params.dig(:user, :email).to_s.empty?
|
|
107
|
+
return render(
|
|
108
|
+
json: { errors: { email: ["can't be blank"] } },
|
|
109
|
+
status: :unprocessable_entity
|
|
110
|
+
)
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
unless STATUSES.include?(params.dig(:user, :status).to_s)
|
|
114
|
+
return render(
|
|
115
|
+
json: { errors: { status: ["is not included in the list"] } },
|
|
116
|
+
status: :unprocessable_entity
|
|
117
|
+
)
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
render json: { id: 3, **user_params }, status: :created
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
private
|
|
124
|
+
|
|
125
|
+
def authenticate!
|
|
126
|
+
return if request.headers["Authorization"].present?
|
|
127
|
+
|
|
128
|
+
render json: { error: "Unauthorized" }, status: :unauthorized
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def user_params
|
|
132
|
+
params.require(:user).permit(:name, :email, :status).to_h.symbolize_keys
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
class TasksController < ActionController::API
|
|
137
|
+
TASKS = [
|
|
138
|
+
{ id: 1, title: "Write the docs", status: "open", priority: "high" },
|
|
139
|
+
{ id: 2, title: "Ship 0.1.1", status: "done", priority: "high" },
|
|
140
|
+
{ id: 3, title: "Tidy the backlog", status: "open", priority: "low" }
|
|
141
|
+
].freeze
|
|
142
|
+
|
|
143
|
+
STATUSES = %w[open done].freeze
|
|
144
|
+
PRIORITIES = %w[low high].freeze
|
|
145
|
+
|
|
146
|
+
def index
|
|
147
|
+
tasks = TASKS
|
|
148
|
+
tasks = tasks.select { |task| task[:status] == params[:status] } if params[:status].present?
|
|
149
|
+
|
|
150
|
+
render json: tasks
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
before_action :find_task, only: %i[show update complete destroy]
|
|
154
|
+
|
|
155
|
+
def show
|
|
156
|
+
render json: @task
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
def create
|
|
160
|
+
if params.dig(:task, :title).to_s.empty?
|
|
161
|
+
return render(json: { errors: { title: ["can't be blank"] } }, status: :unprocessable_entity)
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
unless PRIORITIES.include?(params.dig(:task, :priority).to_s)
|
|
165
|
+
return render(json: { errors: { priority: ["is not included in the list"] } }, status: :unprocessable_entity)
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
render json: { id: 4, status: "open", **task_params }, status: :created
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
def update
|
|
172
|
+
render json: @task.merge(task_params)
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
def complete
|
|
176
|
+
render json: @task.merge(status: "done")
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
def destroy
|
|
180
|
+
head :no_content
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
private
|
|
184
|
+
|
|
185
|
+
# Rendering in a before_action halts the chain, so the action never runs.
|
|
186
|
+
def find_task
|
|
187
|
+
@task = TASKS.find { |task| task[:id] == params[:id].to_i }
|
|
188
|
+
|
|
189
|
+
render(json: { error: "Not Found" }, status: :not_found) unless @task
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
def task_params
|
|
193
|
+
params.require(:task).permit(:title, :priority, :status).to_h.symbolize_keys
|
|
194
|
+
end
|
|
195
|
+
end
|
|
196
|
+
end
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
Rails.application.routes.draw do
|
|
200
|
+
namespace :api do
|
|
201
|
+
namespace :v1 do
|
|
202
|
+
resources :customers, only: %i[index show create]
|
|
203
|
+
resources :users, only: %i[index show create]
|
|
204
|
+
resources :tasks, except: %i[new edit] do
|
|
205
|
+
post :complete, on: :member
|
|
206
|
+
end
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# API Documentation
|
|
2
|
+
|
|
3
|
+
Generated by Reqcord from the application's integration tests.
|
|
4
|
+
|
|
5
|
+
Base URL: `http://localhost:3000`
|
|
6
|
+
|
|
7
|
+
## Placeholders
|
|
8
|
+
|
|
9
|
+
| Header | Replace with |
|
|
10
|
+
| --- | --- |
|
|
11
|
+
| Authorization | `Bearer {{token}}` |
|
|
12
|
+
| X-Api-Key | `{{api_key}}` |
|
|
13
|
+
|
|
14
|
+
## Customers
|
|
15
|
+
|
|
16
|
+
Namespace: `api/v1`
|
|
17
|
+
|
|
18
|
+
| Method | Path | Description |
|
|
19
|
+
| --- | --- | --- |
|
|
20
|
+
| `GET` | [`/api/v1/customers`](api/v1/customers/list.md) | List Customers |
|
|
21
|
+
| `POST` | [`/api/v1/customers`](api/v1/customers/create.md) | Create Customer |
|
|
22
|
+
| `GET` | [`/api/v1/customers/:id`](api/v1/customers/show.md) | Get Customer |
|
|
23
|
+
|
|
24
|
+
## Tasks
|
|
25
|
+
|
|
26
|
+
Namespace: `api/v1`
|
|
27
|
+
|
|
28
|
+
| Method | Path | Description |
|
|
29
|
+
| --- | --- | --- |
|
|
30
|
+
| `GET` | [`/api/v1/tasks`](api/v1/tasks/list.md) | List Tasks |
|
|
31
|
+
| `POST` | [`/api/v1/tasks`](api/v1/tasks/create.md) | Create Task |
|
|
32
|
+
| `DELETE` | [`/api/v1/tasks/:id`](api/v1/tasks/destroy.md) | Delete Task |
|
|
33
|
+
| `GET` | [`/api/v1/tasks/:id`](api/v1/tasks/show.md) | Get Task |
|
|
34
|
+
| `PATCH` | [`/api/v1/tasks/:id`](api/v1/tasks/update.md) | Update Task |
|
|
35
|
+
| `POST` | [`/api/v1/tasks/:id/complete`](api/v1/tasks/complete.md) | Complete Task |
|
|
36
|
+
|
|
37
|
+
## Users
|
|
38
|
+
|
|
39
|
+
Namespace: `api/v1`
|
|
40
|
+
|
|
41
|
+
| Method | Path | Description |
|
|
42
|
+
| --- | --- | --- |
|
|
43
|
+
| `GET` | [`/api/v1/users`](api/v1/users/list.md) | List Users |
|
|
44
|
+
| `POST` | [`/api/v1/users`](api/v1/users/create.md) | Create User |
|
|
45
|
+
| `GET` | [`/api/v1/users/:id`](api/v1/users/show.md) | Get User |
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# Create Customer
|
|
2
|
+
|
|
3
|
+
`POST /api/v1/customers`
|
|
4
|
+
|
|
5
|
+
Namespace: `api/v1`
|
|
6
|
+
|
|
7
|
+
## Headers
|
|
8
|
+
|
|
9
|
+
| Header | Value |
|
|
10
|
+
| --- | --- |
|
|
11
|
+
| Authorization | `Bearer {{token}}` |
|
|
12
|
+
| Content-Type | `application/json` |
|
|
13
|
+
| Accept | `application/json` |
|
|
14
|
+
|
|
15
|
+
## Body Parameters
|
|
16
|
+
|
|
17
|
+
| Field | Type | Required | Values |
|
|
18
|
+
| --- | --- | --- | --- |
|
|
19
|
+
| `customer.name` | string | yes | `"Ada Lovelace"` |
|
|
20
|
+
| `customer.email` | string | yes | `"ada@example.com"` |
|
|
21
|
+
| `customer.status` | string | yes | `"active"` \| `"passive"` |
|
|
22
|
+
|
|
23
|
+
## Example Request
|
|
24
|
+
|
|
25
|
+
```json
|
|
26
|
+
{
|
|
27
|
+
"customer": {
|
|
28
|
+
"name": "Ada Lovelace",
|
|
29
|
+
"email": "ada@example.com",
|
|
30
|
+
"status": "active"
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## cURL
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
curl --request POST \
|
|
39
|
+
--url "http://localhost:3000/api/v1/customers" \
|
|
40
|
+
--header "Authorization: Bearer {{token}}" \
|
|
41
|
+
--header "Content-Type: application/json" \
|
|
42
|
+
--header "Accept: application/json" \
|
|
43
|
+
--data '{
|
|
44
|
+
"customer": {
|
|
45
|
+
"name": "Ada Lovelace",
|
|
46
|
+
"email": "ada@example.com",
|
|
47
|
+
"status": "active"
|
|
48
|
+
}
|
|
49
|
+
}'
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Responses
|
|
53
|
+
|
|
54
|
+
### 201 Created
|
|
55
|
+
|
|
56
|
+
#### Fields
|
|
57
|
+
|
|
58
|
+
| Field | Type | Required | Values |
|
|
59
|
+
| --- | --- | --- | --- |
|
|
60
|
+
| `id` | integer | yes | `3` |
|
|
61
|
+
| `name` | string | yes | `"Ada Lovelace"` |
|
|
62
|
+
| `email` | string | yes | `"ada@example.com"` |
|
|
63
|
+
| `status` | string | yes | `"active"` \| `"passive"` |
|
|
64
|
+
|
|
65
|
+
```json
|
|
66
|
+
{
|
|
67
|
+
"id": 3,
|
|
68
|
+
"name": "Ada Lovelace",
|
|
69
|
+
"email": "ada@example.com",
|
|
70
|
+
"status": "active"
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### 422 Unprocessable Content
|
|
75
|
+
|
|
76
|
+
#### Fields
|
|
77
|
+
|
|
78
|
+
| Field | Type | Required | Values |
|
|
79
|
+
| --- | --- | --- | --- |
|
|
80
|
+
| `errors.status[]` | string | no | `"is not included in the list"` |
|
|
81
|
+
| `errors.email[]` | string | no | `"can't be blank"` |
|
|
82
|
+
|
|
83
|
+
```json
|
|
84
|
+
{
|
|
85
|
+
"errors": {
|
|
86
|
+
"status": [
|
|
87
|
+
"is not included in the list"
|
|
88
|
+
]
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
Resource: [Customers](index.md)
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Customers
|
|
2
|
+
|
|
3
|
+
Namespace: `api/v1`
|
|
4
|
+
|
|
5
|
+
API version: `v1`
|
|
6
|
+
|
|
7
|
+
| Method | Path | Description |
|
|
8
|
+
| --- | --- | --- |
|
|
9
|
+
| `GET` | [`/api/v1/customers`](list.md) | List Customers |
|
|
10
|
+
| `POST` | [`/api/v1/customers`](create.md) | Create Customer |
|
|
11
|
+
| `GET` | [`/api/v1/customers/:id`](show.md) | Get Customer |
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# List Customers
|
|
2
|
+
|
|
3
|
+
`GET /api/v1/customers`
|
|
4
|
+
|
|
5
|
+
Namespace: `api/v1`
|
|
6
|
+
|
|
7
|
+
## Headers
|
|
8
|
+
|
|
9
|
+
| Header | Value |
|
|
10
|
+
| --- | --- |
|
|
11
|
+
| Authorization | `Bearer {{token}}` |
|
|
12
|
+
| Accept | `application/json` |
|
|
13
|
+
|
|
14
|
+
## Query Parameters
|
|
15
|
+
|
|
16
|
+
| Field | Type | Required | Values |
|
|
17
|
+
| --- | --- | --- | --- |
|
|
18
|
+
| `per_page` | integer | yes | `1` |
|
|
19
|
+
|
|
20
|
+
## cURL
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
curl --request GET \
|
|
24
|
+
--url "http://localhost:3000/api/v1/customers?per_page=1" \
|
|
25
|
+
--header "Authorization: Bearer {{token}}" \
|
|
26
|
+
--header "Accept: application/json"
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Responses
|
|
30
|
+
|
|
31
|
+
### 200 OK
|
|
32
|
+
|
|
33
|
+
#### Fields
|
|
34
|
+
|
|
35
|
+
| Field | Type | Required | Values |
|
|
36
|
+
| --- | --- | --- | --- |
|
|
37
|
+
| `[].id` | integer | yes | `1` |
|
|
38
|
+
| `[].name` | string | yes | `"John Doe"` |
|
|
39
|
+
| `[].email` | string | yes | `"john@example.com"` |
|
|
40
|
+
|
|
41
|
+
```json
|
|
42
|
+
[
|
|
43
|
+
{
|
|
44
|
+
"id": 1,
|
|
45
|
+
"name": "John Doe",
|
|
46
|
+
"email": "john@example.com"
|
|
47
|
+
}
|
|
48
|
+
]
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### 401 Unauthorized
|
|
52
|
+
|
|
53
|
+
#### Fields
|
|
54
|
+
|
|
55
|
+
| Field | Type | Required | Values |
|
|
56
|
+
| --- | --- | --- | --- |
|
|
57
|
+
| `error` | string | yes | `"Unauthorized"` |
|
|
58
|
+
|
|
59
|
+
```json
|
|
60
|
+
{
|
|
61
|
+
"error": "Unauthorized"
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
Resource: [Customers](index.md)
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# Get Customer
|
|
2
|
+
|
|
3
|
+
`GET /api/v1/customers/:id`
|
|
4
|
+
|
|
5
|
+
Namespace: `api/v1`
|
|
6
|
+
|
|
7
|
+
## Headers
|
|
8
|
+
|
|
9
|
+
| Header | Value |
|
|
10
|
+
| --- | --- |
|
|
11
|
+
| Authorization | `Bearer {{token}}` |
|
|
12
|
+
| Accept | `application/json` |
|
|
13
|
+
|
|
14
|
+
## Path Parameters
|
|
15
|
+
|
|
16
|
+
| Field | Type | Required | Values |
|
|
17
|
+
| --- | --- | --- | --- |
|
|
18
|
+
| `id` | string | yes | `"1"` |
|
|
19
|
+
|
|
20
|
+
## cURL
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
curl --request GET \
|
|
24
|
+
--url "http://localhost:3000/api/v1/customers/1" \
|
|
25
|
+
--header "Authorization: Bearer {{token}}" \
|
|
26
|
+
--header "Accept: application/json"
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Responses
|
|
30
|
+
|
|
31
|
+
### 200 OK
|
|
32
|
+
|
|
33
|
+
#### Fields
|
|
34
|
+
|
|
35
|
+
| Field | Type | Required | Values |
|
|
36
|
+
| --- | --- | --- | --- |
|
|
37
|
+
| `id` | integer | yes | `1` |
|
|
38
|
+
| `name` | string | yes | `"John Doe"` |
|
|
39
|
+
| `email` | string | yes | `"john@example.com"` |
|
|
40
|
+
|
|
41
|
+
```json
|
|
42
|
+
{
|
|
43
|
+
"id": 1,
|
|
44
|
+
"name": "John Doe",
|
|
45
|
+
"email": "john@example.com"
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### 404 Not Found
|
|
50
|
+
|
|
51
|
+
#### Fields
|
|
52
|
+
|
|
53
|
+
| Field | Type | Required | Values |
|
|
54
|
+
| --- | --- | --- | --- |
|
|
55
|
+
| `error` | string | yes | `"Not Found"` |
|
|
56
|
+
|
|
57
|
+
```json
|
|
58
|
+
{
|
|
59
|
+
"error": "Not Found"
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
Resource: [Customers](index.md)
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# Complete Task
|
|
2
|
+
|
|
3
|
+
`POST /api/v1/tasks/:id/complete`
|
|
4
|
+
|
|
5
|
+
Namespace: `api/v1`
|
|
6
|
+
|
|
7
|
+
## Headers
|
|
8
|
+
|
|
9
|
+
| Header | Value |
|
|
10
|
+
| --- | --- |
|
|
11
|
+
| Accept | `application/json` |
|
|
12
|
+
|
|
13
|
+
## Path Parameters
|
|
14
|
+
|
|
15
|
+
| Field | Type | Required | Values |
|
|
16
|
+
| --- | --- | --- | --- |
|
|
17
|
+
| `id` | string | yes | `"1"` |
|
|
18
|
+
|
|
19
|
+
## cURL
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
curl --request POST \
|
|
23
|
+
--url "http://localhost:3000/api/v1/tasks/1/complete" \
|
|
24
|
+
--header "Accept: application/json"
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Responses
|
|
28
|
+
|
|
29
|
+
### 200 OK
|
|
30
|
+
|
|
31
|
+
#### Fields
|
|
32
|
+
|
|
33
|
+
| Field | Type | Required | Values |
|
|
34
|
+
| --- | --- | --- | --- |
|
|
35
|
+
| `id` | integer | yes | `1` |
|
|
36
|
+
| `title` | string | yes | `"Write the docs"` |
|
|
37
|
+
| `status` | string | yes | `"done"` |
|
|
38
|
+
| `priority` | string | yes | `"high"` |
|
|
39
|
+
|
|
40
|
+
```json
|
|
41
|
+
{
|
|
42
|
+
"id": 1,
|
|
43
|
+
"title": "Write the docs",
|
|
44
|
+
"status": "done",
|
|
45
|
+
"priority": "high"
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
Resource: [Tasks](index.md)
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# Create Task
|
|
2
|
+
|
|
3
|
+
`POST /api/v1/tasks`
|
|
4
|
+
|
|
5
|
+
Namespace: `api/v1`
|
|
6
|
+
|
|
7
|
+
## Headers
|
|
8
|
+
|
|
9
|
+
| Header | Value |
|
|
10
|
+
| --- | --- |
|
|
11
|
+
| Content-Type | `application/json` |
|
|
12
|
+
| Accept | `application/json` |
|
|
13
|
+
|
|
14
|
+
## Body Parameters
|
|
15
|
+
|
|
16
|
+
| Field | Type | Required | Values |
|
|
17
|
+
| --- | --- | --- | --- |
|
|
18
|
+
| `task.title` | string | yes | `"Review the release"` |
|
|
19
|
+
| `task.priority` | string | yes | `"high"` \| `"low"` |
|
|
20
|
+
|
|
21
|
+
## Example Request
|
|
22
|
+
|
|
23
|
+
```json
|
|
24
|
+
{
|
|
25
|
+
"task": {
|
|
26
|
+
"title": "Review the release",
|
|
27
|
+
"priority": "high"
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## cURL
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
curl --request POST \
|
|
36
|
+
--url "http://localhost:3000/api/v1/tasks" \
|
|
37
|
+
--header "Content-Type: application/json" \
|
|
38
|
+
--header "Accept: application/json" \
|
|
39
|
+
--data '{
|
|
40
|
+
"task": {
|
|
41
|
+
"title": "Review the release",
|
|
42
|
+
"priority": "high"
|
|
43
|
+
}
|
|
44
|
+
}'
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Responses
|
|
48
|
+
|
|
49
|
+
### 201 Created
|
|
50
|
+
|
|
51
|
+
#### Fields
|
|
52
|
+
|
|
53
|
+
| Field | Type | Required | Values |
|
|
54
|
+
| --- | --- | --- | --- |
|
|
55
|
+
| `id` | integer | yes | `4` |
|
|
56
|
+
| `status` | string | yes | `"open"` |
|
|
57
|
+
| `title` | string | yes | `"Review the release"` |
|
|
58
|
+
| `priority` | string | yes | `"high"` \| `"low"` |
|
|
59
|
+
|
|
60
|
+
```json
|
|
61
|
+
{
|
|
62
|
+
"id": 4,
|
|
63
|
+
"status": "open",
|
|
64
|
+
"title": "Review the release",
|
|
65
|
+
"priority": "high"
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### 422 Unprocessable Content
|
|
70
|
+
|
|
71
|
+
#### Fields
|
|
72
|
+
|
|
73
|
+
| Field | Type | Required | Values |
|
|
74
|
+
| --- | --- | --- | --- |
|
|
75
|
+
| `errors.title[]` | string | no | `"can't be blank"` |
|
|
76
|
+
| `errors.priority[]` | string | no | `"is not included in the list"` |
|
|
77
|
+
|
|
78
|
+
```json
|
|
79
|
+
{
|
|
80
|
+
"errors": {
|
|
81
|
+
"title": [
|
|
82
|
+
"can't be blank"
|
|
83
|
+
]
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
Resource: [Tasks](index.md)
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Delete Task
|
|
2
|
+
|
|
3
|
+
`DELETE /api/v1/tasks/:id`
|
|
4
|
+
|
|
5
|
+
Namespace: `api/v1`
|
|
6
|
+
|
|
7
|
+
## Headers
|
|
8
|
+
|
|
9
|
+
| Header | Value |
|
|
10
|
+
| --- | --- |
|
|
11
|
+
| Accept | `application/json` |
|
|
12
|
+
|
|
13
|
+
## Path Parameters
|
|
14
|
+
|
|
15
|
+
| Field | Type | Required | Values |
|
|
16
|
+
| --- | --- | --- | --- |
|
|
17
|
+
| `id` | string | yes | `"3"` |
|
|
18
|
+
|
|
19
|
+
## cURL
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
curl --request DELETE \
|
|
23
|
+
--url "http://localhost:3000/api/v1/tasks/3" \
|
|
24
|
+
--header "Accept: application/json"
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Responses
|
|
28
|
+
|
|
29
|
+
### 204 No Content
|
|
30
|
+
|
|
31
|
+
_No response body._
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
Resource: [Tasks](index.md)
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Tasks
|
|
2
|
+
|
|
3
|
+
Namespace: `api/v1`
|
|
4
|
+
|
|
5
|
+
API version: `v1`
|
|
6
|
+
|
|
7
|
+
| Method | Path | Description |
|
|
8
|
+
| --- | --- | --- |
|
|
9
|
+
| `GET` | [`/api/v1/tasks`](list.md) | List Tasks |
|
|
10
|
+
| `POST` | [`/api/v1/tasks`](create.md) | Create Task |
|
|
11
|
+
| `DELETE` | [`/api/v1/tasks/:id`](destroy.md) | Delete Task |
|
|
12
|
+
| `GET` | [`/api/v1/tasks/:id`](show.md) | Get Task |
|
|
13
|
+
| `PATCH` | [`/api/v1/tasks/:id`](update.md) | Update Task |
|
|
14
|
+
| `POST` | [`/api/v1/tasks/:id/complete`](complete.md) | Complete Task |
|