Skip to content

Commit 8e32f7d

Browse files
author
YingRui Lu
committed
support jsonapi rails
1 parent 1150c75 commit 8e32f7d

7 files changed

Lines changed: 101 additions & 7 deletions

File tree

lib/generators/jsonapi/swagger/swagger_generator.rb

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,15 +86,15 @@ def model_klass
8686
end
8787

8888
def resource_klass
89-
"#{model_class_name}Resource".safe_constantize
89+
@resource_klass ||= Jsonapi::Swagger::Resource.with(model_class_name)
9090
end
9191

9292
def attributes
93-
resource_klass._attributes.except(:id)
93+
resource_klass.attributes.except(:id)
9494
end
9595

9696
def relationships
97-
resource_klass._relationships
97+
resource_klass.relationships
9898
end
9999

100100
def sortable_fields
@@ -113,6 +113,10 @@ def filters
113113
resource_klass.filters
114114
end
115115

116+
def mutable?
117+
resource_klass.mutable?
118+
end
119+
116120
def columns_with_comment(need_encoding: true)
117121
@columns_with_comment ||= {}.tap do |clos|
118122
model_klass.columns.each do |col|

lib/generators/jsonapi/swagger/templates/swagger.json.erb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@
128128
},
129129
description: tt(:related_ids, model: relation_name_camelize)
130130
}
131-
if relation.belongs_to?
131+
if relation.try(:belongs_to?)
132132
relat_props[relation_name][:properties][:data] = {
133133
type: :object,
134134
properties: {
@@ -277,7 +277,7 @@
277277
}
278278
}
279279

280-
if resource_klass.mutable?
280+
if mutable?
281281
doc['paths']["/#{route_resouces}"].merge!({
282282
post: {
283283
summary: "#{route_resouces} #{tt(:create)}",

lib/generators/jsonapi/swagger/templates/swagger.rb.erb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ RSpec.describe '<%= resouces_name %>', type: :request do
173173
end
174174
end
175175

176-
<% if resource_klass.mutable? -%>
176+
<% if mutable? -%>
177177
path '/<%= route_resouces %>' do
178178
post '<%= route_resouces %> <%= t(:create) %>' do
179179
tags '<%= route_resouces %>'
@@ -204,7 +204,7 @@ RSpec.describe '<%= resouces_name %>', type: :request do
204204
<%= relation_name %>: {
205205
type: :object,
206206
properties: {
207-
<% if relation.belongs_to? -%>
207+
<% if relation.try(:belongs_to?) -%>
208208
data: {
209209
type: :object,
210210
properties: {

lib/jsonapi/swagger.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
require 'jsonapi/swagger/version'
44
require 'jsonapi/swagger/railtie' if defined?(Rails)
55
require 'jsonapi/swagger/json'
6+
require 'jsonapi/swagger/resource'
67

78
module Jsonapi
89
module Swagger

lib/jsonapi/swagger/resource.rb

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
require 'forwardable'
2+
module Jsonapi
3+
module Swagger
4+
class Resource
5+
def self.with(model_class_name)
6+
if Object.const_defined?("#{model_class_name}Resource")
7+
@resource_class = "#{model_class_name}Resource".safe_constantize
8+
unless @resource_class < JSONAPI::Resource
9+
raise Jsonapi::Swagger::Error, "#{@resource_class.class} is not Subclass of JSONAPI::Resource!"
10+
end
11+
require 'jsonapi/swagger/resources/jsonapi_resource'
12+
return Jsonapi::Swagger::JsonapiResource.new(@resource_class)
13+
elsif Object.const_defined?("Serializable#{model_class_name}")
14+
@resource_class = "Serializable#{model_class_name}".safe_constantize
15+
unless @resource_class < JSONAPI::Serializable::Resource
16+
raise Jsonapi::Swagger::Error, "#{@resource_class.class} is not Subclass of JSONAPI::Serializable::Resource!"
17+
end
18+
require 'jsonapi/swagger/resources/serializable_resource'
19+
return Jsonapi::Swagger::SerializableResource.new(@resource_class)
20+
else
21+
raise Jsonapi::Swagger::Error, "#{model_class_name} not support!"
22+
end
23+
end
24+
end
25+
end
26+
end
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
require 'forwardable'
2+
module Jsonapi
3+
module Swagger
4+
class JsonapiResource
5+
extend Forwardable
6+
7+
def_delegators :@jr, :_attributes, :_relationships, :sortable_fields,
8+
:creatable_fields, :updatable_fields, :filters, :mutable?
9+
10+
def initialize(jr)
11+
@jr = jr
12+
end
13+
14+
alias attributes _attributes
15+
alias relationships _relationships
16+
end
17+
end
18+
end
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
require 'forwardable'
2+
module Jsonapi
3+
module Swagger
4+
class SerializableResource
5+
extend Forwardable
6+
7+
def_delegators :@sr, :type_val, :attribute_blocks, :relationship_blocks, :link_blocks
8+
9+
def initialize(sr)
10+
@sr = sr
11+
end
12+
13+
alias attributes attribute_blocks
14+
15+
def relationships
16+
{}.tap do |relations|
17+
relationship_blocks.each do |rel, block|
18+
relations[rel] = OpenStruct.new(class_name: rel.to_s)
19+
end
20+
end
21+
end
22+
23+
# TODO: from jsonapi serializable resource
24+
def sortable_fields
25+
[]
26+
end
27+
28+
def creatable_fields
29+
[]
30+
end
31+
32+
def updatable_fields
33+
[]
34+
end
35+
36+
def filters
37+
[]
38+
end
39+
40+
def mutable?
41+
false
42+
end
43+
end
44+
end
45+
end

0 commit comments

Comments
 (0)