jason-rails 0.3.0

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.
Files changed (52) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +14 -0
  3. data/.rspec +3 -0
  4. data/.travis.yml +6 -0
  5. data/CODE_OF_CONDUCT.md +74 -0
  6. data/Gemfile +7 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.md +52 -0
  9. data/Rakefile +6 -0
  10. data/bin/console +14 -0
  11. data/bin/setup +8 -0
  12. data/client/lib/JasonContext.d.ts +2 -0
  13. data/client/lib/JasonContext.js +5 -0
  14. data/client/lib/JasonProvider.d.ts +7 -0
  15. data/client/lib/JasonProvider.js +109 -0
  16. data/client/lib/actionFactory.d.ts +5 -0
  17. data/client/lib/actionFactory.js +33 -0
  18. data/client/lib/createActions.d.ts +2 -0
  19. data/client/lib/createActions.js +46 -0
  20. data/client/lib/createJasonReducers.d.ts +1 -0
  21. data/client/lib/createJasonReducers.js +36 -0
  22. data/client/lib/createPayloadHandler.d.ts +1 -0
  23. data/client/lib/createPayloadHandler.js +87 -0
  24. data/client/lib/index.d.ts +10 -0
  25. data/client/lib/index.js +12 -0
  26. data/client/lib/makeEager.d.ts +1 -0
  27. data/client/lib/makeEager.js +51 -0
  28. data/client/lib/useAct.d.ts +1 -0
  29. data/client/lib/useAct.js +12 -0
  30. data/client/lib/useSub.d.ts +1 -0
  31. data/client/lib/useSub.js +14 -0
  32. data/client/package.json +27 -0
  33. data/client/src/JasonContext.ts +5 -0
  34. data/client/src/JasonProvider.tsx +108 -0
  35. data/client/src/actionFactory.ts +34 -0
  36. data/client/src/createActions.ts +50 -0
  37. data/client/src/createJasonReducers.ts +34 -0
  38. data/client/src/createPayloadHandler.ts +95 -0
  39. data/client/src/index.ts +7 -0
  40. data/client/src/makeEager.ts +46 -0
  41. data/client/src/useAct.ts +9 -0
  42. data/client/src/useSub.ts +10 -0
  43. data/client/tsconfig.json +15 -0
  44. data/client/yarn.lock +140 -0
  45. data/jason-rails.gemspec +25 -0
  46. data/lib/jason.rb +10 -0
  47. data/lib/jason/api_model.rb +47 -0
  48. data/lib/jason/channel.rb +37 -0
  49. data/lib/jason/publisher.rb +79 -0
  50. data/lib/jason/subscription.rb +172 -0
  51. data/lib/jason/version.rb +3 -0
  52. metadata +96 -0
@@ -0,0 +1,34 @@
1
+ import { createEntityAdapter, createSlice } from '@reduxjs/toolkit'
2
+ import pluralize from 'pluralize'
3
+ import _ from 'lodash'
4
+
5
+ function generateSlices(schema) {
6
+ const sliceNames = schema.map(k => pluralize(k))
7
+ const adapter = createEntityAdapter()
8
+
9
+ return _.fromPairs(_.map(sliceNames, name => {
10
+ return [name, createSlice({
11
+ name,
12
+ initialState: adapter.getInitialState(),
13
+ reducers: {
14
+ upsert: adapter.upsertOne,
15
+ upsertMany: adapter.upsertMany,
16
+ add: adapter.addOne,
17
+ setAll: adapter.setAll,
18
+ remove: adapter.removeOne,
19
+ movePriority: (s, { payload: { id, priority, parentFilter } }) => {
20
+ // Get IDs and insert our item at the new index
21
+ var affectedIds = _.orderBy(_.filter(_.values(s.entities), parentFilter).filter(e => e.id !== id), 'priority').map(e => e.id)
22
+ affectedIds.splice(priority, 0, id)
23
+
24
+ // Apply update
25
+ affectedIds.forEach((id, i) => (s.entities[id] as any).priority = i)
26
+ }
27
+ }
28
+ }).reducer]
29
+ }))
30
+ }
31
+
32
+ export default function createJasonReducers(schema) {
33
+ return generateSlices(_.keys(schema))
34
+ }
@@ -0,0 +1,95 @@
1
+ import { apply_patch } from 'jsonpatch'
2
+ import { camelizeKeys } from 'humps'
3
+ import pluralize from 'pluralize'
4
+ import _ from 'lodash'
5
+
6
+ function diffSeconds(dt2, dt1) {
7
+ var diff =(dt2.getTime() - dt1.getTime()) / 1000
8
+ return Math.abs(Math.round(diff))
9
+ }
10
+
11
+ export default function createPayloadHandler(dispatch, subscription, model, config) {
12
+ console.log({ model, config })
13
+ let payload = {}
14
+ let idx = 0
15
+ let patchQueue = {}
16
+
17
+ let lastCheckAt = new Date()
18
+ let updateDeadline = null as Date | null
19
+ let checkInterval
20
+
21
+ function getPayload() {
22
+ console.log({ getPayload: model, subscription })
23
+ subscription.send({ getPayload: { model, config } })
24
+ }
25
+
26
+ const tGetPayload = _.throttle(getPayload, 10000)
27
+
28
+ function dispatchPayload() {
29
+ const includeModels = (config.includeModels || []).map(m => _.camelCase(m))
30
+
31
+ console.log("Dispatching", { payload, includeModels })
32
+
33
+ includeModels.forEach(m => {
34
+ const subPayload = _.flatten(_.compact(camelizeKeys(payload).map(instance => instance[m])))
35
+ console.log({ type: `${pluralize(m)}/upsertMany`, payload: subPayload })
36
+ dispatch({ type: `${pluralize(m)}/upsertMany`, payload: subPayload })
37
+ })
38
+
39
+ dispatch({ type: `${pluralize(model)}/upsertMany`, payload: camelizeKeys(payload) })
40
+ }
41
+
42
+ function processQueue() {
43
+ console.log({ idx, patchQueue })
44
+ lastCheckAt = new Date()
45
+ if (patchQueue[idx]) {
46
+ payload = apply_patch(payload, patchQueue[idx])
47
+ if (patchQueue[idx]) {
48
+ dispatchPayload()
49
+ }
50
+ delete patchQueue[idx]
51
+ idx++
52
+ updateDeadline = null
53
+ processQueue()
54
+ // If there are updates in the queue that are ahead of the index, some have arrived out of order
55
+ // Set a deadline for new updates before it declares the update missing and refetches.
56
+ } else if (_.keys(patchQueue).length > 0 && !updateDeadline) {
57
+ var t = new Date()
58
+ t.setSeconds(t.getSeconds() + 3)
59
+ updateDeadline = t
60
+ setTimeout(processQueue, 3100)
61
+ // If more than 10 updates in queue, or deadline has passed, restart
62
+ } else if (_.keys(patchQueue).length > 10 || (updateDeadline && diffSeconds(updateDeadline, new Date()) < 0)) {
63
+ tGetPayload()
64
+ updateDeadline = null
65
+ }
66
+ }
67
+
68
+ function handlePayload(data) {
69
+ const { value, idx: newIdx, diff, latency, type } = data
70
+ console.log({ data })
71
+
72
+ if (type === 'payload') {
73
+ if (!value) return null;
74
+
75
+ payload = value
76
+ dispatchPayload()
77
+ idx = newIdx + 1
78
+ // Clear any old changes left in the queue
79
+ patchQueue= _.pick(patchQueue, _.keys(patchQueue).filter(k => k > newIdx + 1))
80
+ return
81
+ }
82
+
83
+ patchQueue[newIdx] = diff
84
+
85
+ processQueue()
86
+
87
+ if (diffSeconds((new Date()), lastCheckAt) >= 3) {
88
+ lastCheckAt = new Date()
89
+ console.log('Interval lost. Pulling from server')
90
+ tGetPayload()
91
+ }
92
+ }
93
+
94
+ return handlePayload
95
+ }
@@ -0,0 +1,7 @@
1
+ import _JasonProvider from './JasonProvider'
2
+ import _useAct from './useAct'
3
+ import _useSub from './useSub'
4
+
5
+ export const JasonProvider = _JasonProvider
6
+ export const useAct = _useAct
7
+ export const useSub = _useSub
@@ -0,0 +1,46 @@
1
+ import pluralize from 'pluralize'
2
+ import _ from 'lodash'
3
+ import { useSelector } from 'react-redux'
4
+
5
+ export default function (schema) {
6
+ function addRelations(s, objects, objectType, relations) {
7
+ // first find out relation name
8
+ if (_.isArray(relations)) {
9
+ relations.forEach(relation => {
10
+ objects = addRelations(s, objects, objectType, relation)
11
+ })
12
+ } else if (typeof(relations) === 'object') {
13
+ const relation = Object.keys(relations)[0]
14
+ const subRelations = relations[relation]
15
+
16
+ objects = addRelations(s, objects, objectType, relation)
17
+ objects[relation] = addRelations(s, objects[relation], pluralize(relation), subRelations)
18
+ // #
19
+ } else if (typeof(relations) === 'string') {
20
+ const relation = relations
21
+ if (_.isArray(objects)) {
22
+ objects = objects.map(obj => addRelations(s, obj, objectType, relation))
23
+ } else {
24
+ const relatedObjects = _.values(s[pluralize(relation)].entities)
25
+
26
+ if(pluralize.isSingular(relation)) {
27
+ objects = { ...objects, [relation]: _.find(relatedObjects, { id: objects[relation + 'Id'] }) }
28
+ } else {
29
+ objects = { ...objects, [relation]: relatedObjects.filter(e => e[pluralize.singular(objectType) + 'Id'] === objects.id) }
30
+ }
31
+ }
32
+ }
33
+
34
+ return objects
35
+ }
36
+
37
+ function useEager(entity, id = null, relations = []) {
38
+ if (id) {
39
+ return useSelector(s => addRelations(s, { ...s[entity].entities[String(id)] }, entity, relations))
40
+ } else {
41
+ return useSelector(s => addRelations(s, _.values(s[entity].entities), entity, relations))
42
+ }
43
+ }
44
+
45
+ return useEager
46
+ }
@@ -0,0 +1,9 @@
1
+ import JasonContext from './JasonContext'
2
+ import { useContext } from 'react'
3
+
4
+ export default function useAct() {
5
+ const { actions } = useContext(JasonContext)
6
+
7
+ return actions
8
+ }
9
+
@@ -0,0 +1,10 @@
1
+ import JasonContext from './JasonContext'
2
+ import { useContext, useEffect } from 'react'
3
+
4
+ export default function useSub(config) {
5
+ const subscribe = useContext(JasonContext).subscribe
6
+
7
+ useEffect(() => {
8
+ return subscribe(config)
9
+ }, [])
10
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "es2015",
4
+ "module": "es2015",
5
+ "module": "commonjs",
6
+ "declaration": true,
7
+ "outDir": "./lib",
8
+ "strict": true,
9
+ "noImplicitAny": false,
10
+ "jsx": "react",
11
+ "esModuleInterop": true
12
+ },
13
+ "include": ["src"],
14
+ "exclude": ["node_modules", "**/__tests__/*"]
15
+ }
@@ -0,0 +1,140 @@
1
+ # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2
+ # yarn lockfile v1
3
+
4
+
5
+ "@rails/actioncable@^6.0.3-4":
6
+ version "6.0.3-4"
7
+ resolved "https://registry.yarnpkg.com/@rails/actioncable/-/actioncable-6.0.3-4.tgz#f17c0ef2235d1624d6052b749005608260bd55ef"
8
+ integrity sha512-uie5McTpl69vHnXCVzKj7iYpVKFfLuE7aqul/I7MX5zVd+yVyyC/g75T1Q10GofyqHYNYWgPiIxgQIoYPyyeKw==
9
+
10
+ axios-case-converter@^0.6.0:
11
+ version "0.6.0"
12
+ resolved "https://registry.yarnpkg.com/axios-case-converter/-/axios-case-converter-0.6.0.tgz#7a99120138046ad6faaf1fc2b638fea0fe63f26f"
13
+ integrity sha512-mlpaFFTBlv+o+NL2YPSWfC8BQv3qUesxTYD0N11/8dgrg0aDbxUaAglromCBI+0NUcfenM42xMGEUhzTtWZqKg==
14
+ dependencies:
15
+ camel-case "^4.1.1"
16
+ header-case "^2.0.3"
17
+ snake-case "^3.0.3"
18
+
19
+ axios@^0.21.0:
20
+ version "0.21.0"
21
+ resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.0.tgz#26df088803a2350dff2c27f96fef99fe49442aca"
22
+ integrity sha512-fmkJBknJKoZwem3/IKSSLpkdNXZeBu5Q7GA/aRsr2btgrptmSCxi2oFjZHqGdK9DoTil9PIHlPIZw2EcRJXRvw==
23
+ dependencies:
24
+ follow-redirects "^1.10.0"
25
+
26
+ blueimp-md5@^2.18.0:
27
+ version "2.18.0"
28
+ resolved "https://registry.yarnpkg.com/blueimp-md5/-/blueimp-md5-2.18.0.tgz#1152be1335f0c6b3911ed9e36db54f3e6ac52935"
29
+ integrity sha512-vE52okJvzsVWhcgUHOv+69OG3Mdg151xyn41aVQN/5W5S+S43qZhxECtYLAEHMSFWX6Mv5IZrzj3T5+JqXfj5Q==
30
+
31
+ camel-case@^4.1.1:
32
+ version "4.1.2"
33
+ resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a"
34
+ integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==
35
+ dependencies:
36
+ pascal-case "^3.1.2"
37
+ tslib "^2.0.3"
38
+
39
+ capital-case@^1.0.4:
40
+ version "1.0.4"
41
+ resolved "https://registry.yarnpkg.com/capital-case/-/capital-case-1.0.4.tgz#9d130292353c9249f6b00fa5852bee38a717e669"
42
+ integrity sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==
43
+ dependencies:
44
+ no-case "^3.0.4"
45
+ tslib "^2.0.3"
46
+ upper-case-first "^2.0.2"
47
+
48
+ dot-case@^3.0.4:
49
+ version "3.0.4"
50
+ resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751"
51
+ integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==
52
+ dependencies:
53
+ no-case "^3.0.4"
54
+ tslib "^2.0.3"
55
+
56
+ follow-redirects@^1.10.0:
57
+ version "1.13.0"
58
+ resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.0.tgz#b42e8d93a2a7eea5ed88633676d6597bc8e384db"
59
+ integrity sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==
60
+
61
+ header-case@^2.0.3:
62
+ version "2.0.4"
63
+ resolved "https://registry.yarnpkg.com/header-case/-/header-case-2.0.4.tgz#5a42e63b55177349cf405beb8d775acabb92c063"
64
+ integrity sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==
65
+ dependencies:
66
+ capital-case "^1.0.4"
67
+ tslib "^2.0.3"
68
+
69
+ humps@^2.0.1:
70
+ version "2.0.1"
71
+ resolved "https://registry.yarnpkg.com/humps/-/humps-2.0.1.tgz#dd02ea6081bd0568dc5d073184463957ba9ef9aa"
72
+ integrity sha1-3QLqYIG9BWjcXQcxhEY5V7qe+ao=
73
+
74
+ jsonpatch@^3.0.1:
75
+ version "3.0.1"
76
+ resolved "https://registry.yarnpkg.com/jsonpatch/-/jsonpatch-3.0.1.tgz#97225367c1c3c5bf1641be59b2f73be19759f06f"
77
+ integrity sha1-lyJTZ8HDxb8WQb5Zsvc74ZdZ8G8=
78
+
79
+ lodash@^4.17.20:
80
+ version "4.17.20"
81
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52"
82
+ integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==
83
+
84
+ lower-case@^2.0.2:
85
+ version "2.0.2"
86
+ resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28"
87
+ integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==
88
+ dependencies:
89
+ tslib "^2.0.3"
90
+
91
+ no-case@^3.0.4:
92
+ version "3.0.4"
93
+ resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d"
94
+ integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==
95
+ dependencies:
96
+ lower-case "^2.0.2"
97
+ tslib "^2.0.3"
98
+
99
+ pascal-case@^3.1.2:
100
+ version "3.1.2"
101
+ resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb"
102
+ integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==
103
+ dependencies:
104
+ no-case "^3.0.4"
105
+ tslib "^2.0.3"
106
+
107
+ pluralize@^8.0.0:
108
+ version "8.0.0"
109
+ resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1"
110
+ integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==
111
+
112
+ snake-case@^3.0.3:
113
+ version "3.0.4"
114
+ resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c"
115
+ integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==
116
+ dependencies:
117
+ dot-case "^3.0.4"
118
+ tslib "^2.0.3"
119
+
120
+ tslib@^2.0.3:
121
+ version "2.0.3"
122
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.3.tgz#8e0741ac45fc0c226e58a17bfc3e64b9bc6ca61c"
123
+ integrity sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==
124
+
125
+ typescript@^4.1.2:
126
+ version "4.1.2"
127
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.2.tgz#6369ef22516fe5e10304aae5a5c4862db55380e9"
128
+ integrity sha512-thGloWsGH3SOxv1SoY7QojKi0tc+8FnOmiarEGMbd/lar7QOEd3hvlx3Fp5y6FlDUGl9L+pd4n2e+oToGMmhRQ==
129
+
130
+ upper-case-first@^2.0.2:
131
+ version "2.0.2"
132
+ resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-2.0.2.tgz#992c3273f882abd19d1e02894cc147117f844324"
133
+ integrity sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==
134
+ dependencies:
135
+ tslib "^2.0.3"
136
+
137
+ uuid@^8.3.1:
138
+ version "8.3.1"
139
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.1.tgz#2ba2e6ca000da60fce5a196954ab241131e05a31"
140
+ integrity sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==
@@ -0,0 +1,25 @@
1
+ require_relative 'lib/jason/version'
2
+
3
+ Gem::Specification.new do |spec|
4
+ spec.name = "jason-rails"
5
+ spec.version = Jason::VERSION
6
+ spec.authors = ["James Rees"]
7
+ spec.email = ["jarees@gmail.com"]
8
+
9
+ spec.summary = "Reactive user interfaces with minimal boilerplate, using Rails + Redux"
10
+ spec.homepage = "https://github.com/jamesr2323/jason"
11
+ spec.license = "MIT"
12
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
13
+
14
+ spec.metadata["homepage_uri"] = spec.homepage
15
+ spec.metadata["source_code_uri"] = "https://github.com/jamesr2323/jason"
16
+ spec.metadata["changelog_uri"] = "https://github.com/jamesr2323/jason"
17
+
18
+ # Specify which files should be added to the gem when it is released.
19
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
20
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
21
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
22
+ end
23
+ spec.executables = []
24
+ spec.require_paths = ["lib"]
25
+ end
@@ -0,0 +1,10 @@
1
+ require "jason/version"
2
+ require 'jason/api_model'
3
+ require 'jason/channel'
4
+ require 'jason/publisher'
5
+ require 'jason/subscription'
6
+
7
+ module Jason
8
+ class Error < StandardError; end
9
+ # Your code goes here...
10
+ end
@@ -0,0 +1,47 @@
1
+ class Jason::ApiModel
2
+ cattr_accessor :models
3
+ attr_accessor :model, :name
4
+
5
+ def self.configure(models)
6
+ @@models = models
7
+ end
8
+
9
+ def initialize(name)
10
+ @name = name
11
+ @model = OpenStruct.new(JASON_API_MODEL[name.to_sym])
12
+ end
13
+
14
+ def allowed_params
15
+ model.allowed_params || []
16
+ end
17
+
18
+ def include_models
19
+ model.include_models || []
20
+ end
21
+
22
+ def include_methods
23
+ model.include_methods || []
24
+ end
25
+
26
+ def priority_scope
27
+ model.priority_scope || []
28
+ end
29
+
30
+ def subscribed_fields
31
+ model.subscribed_fields || []
32
+ end
33
+
34
+ def scope
35
+ model.scope
36
+ end
37
+
38
+ def as_json_config
39
+ include_configs = include_models.map do |assoc|
40
+ reflection = name.classify.constantize.reflect_on_association(assoc.to_sym)
41
+ api_model = Jason::ApiModel.new(reflection.klass.name.underscore)
42
+ { assoc => { only: api_model.subscribed_fields, methods: api_model.include_methods } }
43
+ end
44
+
45
+ { only: subscribed_fields, include: include_configs, methods: include_methods }
46
+ end
47
+ end