bullet_train-api 1.1.10 → 1.1.11

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 40bc7b779d26dad0888ccb49f7f28a07a0ea038b3f1b22225029a032563af937
4
- data.tar.gz: 402a6f89d5537cd1815fd0e22fed93e0dda462c97be190f4fcdc7df529eafb58
3
+ metadata.gz: 807f6397b8ca4d3ed29c7181d9aa72456630ad6262baeab928637f11858d83f1
4
+ data.tar.gz: d3db30ae44aa54f4504554a10eadd3570c061a558068b9dba844580bb8fb1b7d
5
5
  SHA512:
6
- metadata.gz: f1f25622d149fb10bcb5a5ffdb8e36ec868a9f43884708de02508db66e265c4961d62a0c28a7308ffb4087eaae99c0f308c91a98a0511f7297d3ea206142d224
7
- data.tar.gz: ca923f4efc9d4b475f2b20e64f00448c4b91d38709073b71fda5cd33de9dbb6565d01cf6a6ddab4a4e4317bfef8135f31f230d9dbc079f8e2dee2cef0c7ffa49
6
+ metadata.gz: e748b8c2207bc0a43e8cbacfb69e48108fff664298404194299fafa5271d5b330222830bedce8351916096430ef42d83ea9b4af96c647abc9f4996e9e73194f8
7
+ data.tar.gz: 702abad5b373fe2600f460c26c363a2063082e9cd9fb832b9991d7bf079ba40175e0eba8ef25f2f4a3bf0f9e4b46026e83b1383144cafb0c20789a8c0c7574e2
@@ -17,6 +17,30 @@ module Api::Controllers::Base
17
17
 
18
18
  before_action :set_default_response_format
19
19
  before_action :doorkeeper_authorize!
20
+ after_action :set_pagination_headers
21
+
22
+ def modify_url_params(url, new_params)
23
+ uri = URI.parse(url)
24
+ query = Rack::Utils.parse_query(uri.query)
25
+ new_params.each do |key, value|
26
+ query[key] = value
27
+ end
28
+ uri.query = Rack::Utils.build_query(query)
29
+ uri.to_s
30
+ end
31
+
32
+ def set_pagination_headers
33
+ return unless @pagy
34
+
35
+ if @pagy.has_more?
36
+ if (collection = instance_variable_get(collection_variable))
37
+ next_cursor = collection.last.id
38
+ # TODO Probably not great that we're clobbering any `Link` header that might be set.
39
+ response.headers["Link"] = "<#{modify_url_params(request.url, after: next_cursor)}>; rel=next"
40
+ response.headers["Pagination-Next"] = next_cursor
41
+ end
42
+ end
43
+ end
20
44
 
21
45
  rescue_from CanCan::AccessDenied, ActiveRecord::RecordNotFound do |exception|
22
46
  render json: {error: "Not found"}, status: :not_found
@@ -42,7 +66,13 @@ module Api::Controllers::Base
42
66
 
43
67
  def current_user
44
68
  raise NotAuthenticatedError unless doorkeeper_token.present?
45
- doorkeeper_token.update(last_used_at: Time.zone.now)
69
+ # TODO Remove this rescue once workspace clusters can write to this column on the identity server.
70
+ # TODO Make this logic configurable so that downstream developers can write different methods for this column getting updated.
71
+ begin
72
+ doorkeeper_token.update(last_used_at: Time.zone.now)
73
+ rescue
74
+ ActiveRecord::StatementInvalid
75
+ end
46
76
  @current_user ||= User.find_by(id: doorkeeper_token[:resource_owner_id])
47
77
  end
48
78
 
@@ -51,10 +81,13 @@ module Api::Controllers::Base
51
81
  current_user&.teams&.first
52
82
  end
53
83
 
84
+ def collection_variable
85
+ @collection_variable ||= "@#{self.class.name.split("::").last.gsub("Controller", "").underscore}"
86
+ end
87
+
54
88
  def apply_pagination
55
- collection_variable = "@#{self.class.name.split("::").last.gsub("Controller", "").underscore}"
56
89
  collection = instance_variable_get collection_variable
57
- @pagy, collection = pagy_cursor collection
90
+ @pagy, collection = pagy_cursor collection, after: params[:after]
58
91
  instance_variable_set collection_variable, collection
59
92
  end
60
93
 
@@ -1,5 +1 @@
1
- json.data do
2
- json.array! @access_tokens, partial: "api/v1/platform/access_tokens/access_token", as: :access_token
3
- end
4
-
5
- render_pagination(json)
1
+ json.array! @access_tokens, partial: "api/v1/platform/access_tokens/access_token", as: :access_token
@@ -1,5 +1 @@
1
- json.data do
2
- json.array! @teams, partial: "api/v1/teams/team", as: :team
3
- end
4
-
5
- render_pagination(json)
1
+ json.array! @teams, partial: "api/v1/teams/team", as: :team
@@ -1,5 +1 @@
1
- json.data do
2
- json.array! @users, partial: "api/v1/users/user", as: :user
3
- end
4
-
5
- render_pagination(json)
1
+ json.array! @users, partial: "api/v1/users/user", as: :user
@@ -0,0 +1,108 @@
1
+ <% except ||= [] %>
2
+ <% unless except.include?(:index) && except.include?(:create) %>
3
+ /scaffolding/absolutely_abstract/creative_concepts/{absolutely_abstract_creative_concept_id}/completely_concrete/tangible_things:
4
+ <% unless except.include?(:index) %>
5
+ get:
6
+ tags:
7
+ - "Scaffolding/Completely Concrete/Tangible Things"
8
+ summary: "List Tangible Things"
9
+ operationId: listScaffoldingCompletelyConcreteTangibleThings
10
+ parameters:
11
+ - name: absolutely_abstract_creative_concept_id
12
+ in: path
13
+ required: true
14
+ schema:
15
+ type: string
16
+ responses:
17
+ "404":
18
+ description: "Not Found"
19
+ "200":
20
+ description: "OK"
21
+ content:
22
+ application/json:
23
+ schema:
24
+ type: object
25
+ properties:
26
+ data:
27
+ type: array
28
+ items:
29
+ $ref: "#/components/schemas/ScaffoldingCompletelyConcreteTangibleThingAttributes"
30
+ has_more:
31
+ type: boolean
32
+ <% end %>
33
+ <% unless except.include?(:create) %>
34
+ post:
35
+ tags:
36
+ - "Scaffolding/Completely Concrete/Tangible Things"
37
+ summary: "Create Tangible Thing"
38
+ operationId: createScaffoldingCompletelyConcreteTangibleThings
39
+ parameters:
40
+ - name: absolutely_abstract_creative_concept_id
41
+ in: path
42
+ required: true
43
+ schema:
44
+ type: string
45
+ responses:
46
+ "404":
47
+ description: "Not Found"
48
+ "201":
49
+ description: "Created"
50
+ content:
51
+ application/json:
52
+ schema:
53
+ $ref: "#/components/schemas/ScaffoldingCompletelyConcreteTangibleThingParameters"
54
+ <% end %>
55
+ <% end %>
56
+ <% unless except.include?(:show) && except.include?(:update) && except.include?(:destroy) %>
57
+ /scaffolding/completely_concrete/tangible_things/{id}:
58
+ <% unless except.include?(:show) %>
59
+ get:
60
+ tags:
61
+ - "Scaffolding/Completely Concrete/Tangible Things"
62
+ summary: "Fetch Tangible Thing"
63
+ operationId: getScaffoldingCompletelyConcreteTangibleThings
64
+ parameters:
65
+ - $ref: "#/components/parameters/id"
66
+ responses:
67
+ "404":
68
+ description: "Not Found"
69
+ "200":
70
+ description: "OK"
71
+ content:
72
+ application/json:
73
+ schema:
74
+ $ref: "#/components/schemas/ScaffoldingCompletelyConcreteTangibleThingAttributes"
75
+ <% end %>
76
+ <% unless except.include?(:update) %>
77
+ put:
78
+ tags:
79
+ - "Scaffolding/Completely Concrete/Tangible Things"
80
+ summary: "Update Tangible Thing"
81
+ operationId: updateScaffoldingCompletelyConcreteTangibleThings
82
+ parameters:
83
+ - $ref: "#/components/parameters/id"
84
+ responses:
85
+ "404":
86
+ description: "Not Found"
87
+ "200":
88
+ description: "OK"
89
+ content:
90
+ application/json:
91
+ schema:
92
+ $ref: "#/components/schemas/ScaffoldingCompletelyConcreteTangibleThingParameters"
93
+ <% end %>
94
+ <% unless except.include?(:destroy) %>
95
+ delete:
96
+ tags:
97
+ - "Scaffolding/Completely Concrete/Tangible Things"
98
+ summary: "Remove Tangible Thing"
99
+ operationId: removeScaffoldingCompletelyConcreteTangibleThings
100
+ parameters:
101
+ - $ref: "#/components/parameters/id"
102
+ responses:
103
+ "404":
104
+ description: "Not Found"
105
+ "200":
106
+ description: "OK"
107
+ <% end %>
108
+ <% end %>
@@ -0,0 +1,55 @@
1
+ /teams:
2
+ get:
3
+ tags:
4
+ - Teams
5
+ summary: "List Teams"
6
+ operationId: listTeams
7
+ responses:
8
+ "404":
9
+ description: "Not Found"
10
+ "200":
11
+ description: "OK"
12
+ content:
13
+ application/json:
14
+ schema:
15
+ type: object
16
+ properties:
17
+ data:
18
+ type: array
19
+ items:
20
+ $ref: "#/components/schemas/TeamAttributes"
21
+ has_more:
22
+ type: boolean
23
+ /teams/{id}:
24
+ get:
25
+ tags:
26
+ - Teams
27
+ summary: "Fetch Team"
28
+ operationId: fetchTeam
29
+ parameters:
30
+ - $ref: "#/components/parameters/id"
31
+ responses:
32
+ "404":
33
+ description: "Not Found"
34
+ "200":
35
+ description: "OK"
36
+ content:
37
+ application/json:
38
+ schema:
39
+ $ref: "#/components/schemas/TeamAttributes"
40
+ put:
41
+ tags:
42
+ - Teams
43
+ summary: "Update Team"
44
+ operationId: updateTeam
45
+ parameters:
46
+ - $ref: "#/components/parameters/id"
47
+ responses:
48
+ "404":
49
+ description: "Not Found"
50
+ "200":
51
+ description: "OK"
52
+ content:
53
+ application/json:
54
+ schema:
55
+ $ref: "#/components/schemas/TeamParameters"
@@ -0,0 +1,55 @@
1
+ /users:
2
+ get:
3
+ tags:
4
+ - Users
5
+ summary: "List Users"
6
+ operationId: listUsers
7
+ responses:
8
+ "404":
9
+ description: "Not Found"
10
+ "200":
11
+ description: "OK"
12
+ content:
13
+ application/json:
14
+ schema:
15
+ type: object
16
+ properties:
17
+ data:
18
+ type: array
19
+ items:
20
+ $ref: "#/components/schemas/UserAttributes"
21
+ has_more:
22
+ type: boolean
23
+ /users/{id}:
24
+ get:
25
+ tags:
26
+ - Users
27
+ summary: "Fetch User"
28
+ operationId: fetchUser
29
+ parameters:
30
+ - $ref: "#/components/parameters/id"
31
+ responses:
32
+ "404":
33
+ description: "Not Found"
34
+ "200":
35
+ description: "OK"
36
+ content:
37
+ application/json:
38
+ schema:
39
+ $ref: "#/components/schemas/UserAttributes"
40
+ put:
41
+ tags:
42
+ - Users
43
+ summary: "Update User"
44
+ operationId: updateUser
45
+ parameters:
46
+ - $ref: "#/components/parameters/id"
47
+ responses:
48
+ "404":
49
+ description: "Not Found"
50
+ "200":
51
+ description: "OK"
52
+ content:
53
+ application/json:
54
+ schema:
55
+ $ref: "#/components/schemas/UserParameters"
@@ -0,0 +1,10 @@
1
+ json.extract! access_token,
2
+ :id,
3
+ :application_id,
4
+ :token,
5
+ :expires_in,
6
+ :scopes,
7
+ :last_used_at,
8
+ :description,
9
+ # 🚅 super scaffolding will insert new fields above this line.
10
+ :created_at
@@ -0,0 +1 @@
1
+ json.array! @access_tokens, partial: "api/v2/platform/access_tokens/access_token", as: :access_token
@@ -0,0 +1 @@
1
+ json.partial! "api/v2/platform/access_tokens/access_token", access_token: @access_token
@@ -0,0 +1 @@
1
+ json.array! @teams, partial: "api/v2/teams/team", as: :team
@@ -0,0 +1 @@
1
+ json.partial! "api/v2/teams/team", team: @team
@@ -0,0 +1 @@
1
+ json.array! @users, partial: "api/v2/users/user", as: :user
@@ -0,0 +1 @@
1
+ json.partial! "api/v2/users/user", user: @user
data/config/routes.rb CHANGED
@@ -20,15 +20,17 @@ Rails.application.routes.draw do
20
20
  namespace :api do
21
21
  match "*version/openapi.yaml" => "open_api#index", :via => :get
22
22
 
23
- namespace :v1 do
24
- shallow do
25
- resources :users
26
- resources :teams do
27
- resources :invitations
28
- resources :memberships
29
- namespace :platform do
30
- resources :applications do
31
- resources :access_tokens
23
+ BulletTrain::Api.all_versions.each do |version|
24
+ namespace version do
25
+ shallow do
26
+ resources :users
27
+ resources :teams do
28
+ resources :invitations
29
+ resources :memberships
30
+ namespace :platform do
31
+ resources :applications do
32
+ resources :access_tokens
33
+ end
32
34
  end
33
35
  end
34
36
  end
@@ -1,5 +1,5 @@
1
1
  module BulletTrain
2
2
  module Api
3
- VERSION = "1.1.10"
3
+ VERSION = "1.1.11"
4
4
  end
5
5
  end
@@ -16,5 +16,18 @@ module BulletTrain
16
16
  module Api
17
17
  mattr_accessor :endpoints, default: []
18
18
  mattr_accessor :current_version, default: "v1"
19
+ mattr_accessor :initial_version, default: "v1"
20
+
21
+ def self.current_version_numeric
22
+ current_version.split("v").last.to_i
23
+ end
24
+
25
+ def self.initial_version_numeric
26
+ initial_version.split("v").last.to_i
27
+ end
28
+
29
+ def self.all_versions
30
+ (initial_version_numeric..current_version_numeric).map { |version| "v#{version}".to_sym }
31
+ end
19
32
  end
20
33
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bullet_train-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.10
4
+ version: 1.1.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Culver
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-10-14 00:00:00.000000000 Z
11
+ date: 2022-11-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: standard
@@ -172,6 +172,16 @@ files:
172
172
  - app/views/api/v1/teams/show.json.jbuilder
173
173
  - app/views/api/v1/users/index.json.jbuilder
174
174
  - app/views/api/v1/users/show.json.jbuilder
175
+ - app/views/api/v2/open_api/shared/_paths.yaml.erb
176
+ - app/views/api/v2/open_api/teams/_paths.yaml.erb
177
+ - app/views/api/v2/open_api/users/_paths.yaml.erb
178
+ - app/views/api/v2/platform/access_tokens/_access_token.json.jbuilder
179
+ - app/views/api/v2/platform/access_tokens/index.json.jbuilder
180
+ - app/views/api/v2/platform/access_tokens/show.json.jbuilder
181
+ - app/views/api/v2/teams/index.json.jbuilder
182
+ - app/views/api/v2/teams/show.json.jbuilder
183
+ - app/views/api/v2/users/index.json.jbuilder
184
+ - app/views/api/v2/users/show.json.jbuilder
175
185
  - config/locales/en/api.en.yml
176
186
  - config/locales/en/me.en.yml
177
187
  - config/locales/en/platform/access_tokens.en.yml