strapi 0.0.3 → 0.1.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.
- checksums.yaml +4 -4
- data/Gemfile.lock +5 -7
- data/README.md +17 -5
- data/lib/strapi/connection.rb +10 -19
- data/lib/strapi/content_type.rb +21 -19
- data/lib/strapi/media.rb +7 -1
- data/lib/strapi/request.rb +25 -2
- data/lib/strapi/response.rb +1 -1
- data/lib/strapi/version.rb +1 -1
- data/lib/strapi.rb +1 -1
- metadata +3 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d53922d37bd74ca71fe212f659e11eae7ad4e234ff13d97086dfb726a5a1cf04
|
4
|
+
data.tar.gz: d5364ee3614d54b78b594111add3095672372a152b3ecdccfd8a5c2294dc05bc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cde55210154b089606d519332a6b67dc8d9e06c9b2b656e582ebe60c19bf0d7694c4d7a8fc1b22ffb935af26bf6f8f9ca120f7a9a04f5a226efd1a61eefccba8
|
7
|
+
data.tar.gz: 816131f378cb4b7ea3855e6c51b78d62c84e7c597281449f23b66594781d6e1c02792dc23ddd63d87a5d7aad47aab7bf99d0295f21e81f0fed3d3ccab6401e06
|
data/Gemfile.lock
CHANGED
@@ -1,16 +1,15 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
strapi (0.0.
|
4
|
+
strapi (0.0.4)
|
5
5
|
activesupport
|
6
6
|
faraday (~> 2.0)
|
7
7
|
faraday-net_http (~> 2.0)
|
8
|
-
oj (~> 3.0)
|
9
8
|
|
10
9
|
GEM
|
11
10
|
remote: https://rubygems.org/
|
12
11
|
specs:
|
13
|
-
activesupport (7.0.
|
12
|
+
activesupport (7.0.1)
|
14
13
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
15
14
|
i18n (>= 1.6, < 2)
|
16
15
|
minitest (>= 5.1)
|
@@ -24,10 +23,10 @@ GEM
|
|
24
23
|
debug (1.4.0)
|
25
24
|
irb (>= 1.3.6)
|
26
25
|
reline (>= 0.2.7)
|
27
|
-
faraday (2.0.
|
26
|
+
faraday (2.0.1)
|
27
|
+
faraday-net_http (~> 2.0)
|
28
28
|
ruby2_keywords (>= 0.0.4)
|
29
|
-
faraday-net_http (2.0.
|
30
|
-
faraday (~> 2.0)
|
29
|
+
faraday-net_http (2.0.1)
|
31
30
|
hashdiff (1.0.1)
|
32
31
|
i18n (1.8.11)
|
33
32
|
concurrent-ruby (~> 1.0)
|
@@ -35,7 +34,6 @@ GEM
|
|
35
34
|
irb (1.4.1)
|
36
35
|
reline (>= 0.3.0)
|
37
36
|
minitest (5.15.0)
|
38
|
-
oj (3.13.10)
|
39
37
|
parallel (1.21.0)
|
40
38
|
parser (3.0.3.2)
|
41
39
|
ast (~> 2.4.1)
|
data/README.md
CHANGED
@@ -27,22 +27,30 @@ And then execute:
|
|
27
27
|
|
28
28
|
## Usage
|
29
29
|
|
30
|
-
|
30
|
+
Note: this gem has only been tested with Strapi v4. It may work with previous versions of Strapi, but they
|
31
31
|
remain untested at this time.
|
32
32
|
|
33
33
|
### Configuration
|
34
34
|
|
35
|
-
You will first need to set an `ENV` variable for `STRAPI_HOST_URL
|
36
|
-
|
37
|
-
|
35
|
+
You will first need to set an `ENV` variable for `STRAPI_HOST_URL`, `STRAPI_IDENTIFIER` and
|
36
|
+
`STRAPI_PASSWORD`. This can be done with [`dotenv`](https://github.com/bkeepers/dotenv/), in an
|
37
|
+
initializer, or some other mechanism.
|
38
38
|
|
39
39
|
If using `dotev`, your `.env` file would contain:
|
40
40
|
|
41
41
|
```
|
42
42
|
STRAPI_HOST_URL=http://localhost:1337
|
43
|
-
|
43
|
+
STRAPI_IDENTIFIER=admin@example.com
|
44
|
+
STRAPI_PASSWORD=password
|
44
45
|
```
|
45
46
|
|
47
|
+
The `STRAPI_IDENTIFIER` and `STRAPI_PASSWORD` should be the login information for a user with a role
|
48
|
+
that grants access to your authenticated content. [Strapi Authenticated request
|
49
|
+
documentation](https://docs.strapi.io/developer-docs/latest/guides/auth-request.html)
|
50
|
+
|
51
|
+
Upon running the first method that interacts with the Strapi API, a JWT token will be fetched and
|
52
|
+
cached.
|
53
|
+
|
46
54
|
### Defining Content Type Classes
|
47
55
|
|
48
56
|
In Ruby, define some content type classes, i.e.:
|
@@ -122,6 +130,10 @@ farm.cows.first.name # => "Hershey"
|
|
122
130
|
The class method `.where` also exists, which is the same implementation as `.all`, except a hash of
|
123
131
|
API parameters is required.
|
124
132
|
|
133
|
+
``` ruby
|
134
|
+
cows = Cow.where(filters: { name: { '$eq': 'Hershey' } })
|
135
|
+
```
|
136
|
+
|
125
137
|
### Creating, Updating, Deleting
|
126
138
|
|
127
139
|
You can create and update entries by calling `.save` on them:
|
data/lib/strapi/connection.rb
CHANGED
@@ -5,28 +5,19 @@ module Strapi
|
|
5
5
|
class Connection
|
6
6
|
class << self
|
7
7
|
def instance
|
8
|
-
@instance ||=
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
def build_instance
|
14
|
-
unless Faraday.default_adapter
|
15
|
-
require 'faraday/net_http'
|
16
|
-
Faraday.default_adapter = :net_http
|
8
|
+
@instance ||= Faraday::Connection.new("#{ENV['STRAPI_HOST_URL']}/api") do |f|
|
9
|
+
f.request :json
|
10
|
+
f.response :json
|
11
|
+
f.adapter :net_http
|
17
12
|
end
|
18
|
-
|
19
|
-
Faraday::Connection.new("#{ENV['STRAPI_HOST_URL']}/api", options)
|
20
13
|
end
|
21
14
|
|
22
|
-
def
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
}
|
29
|
-
}
|
15
|
+
def jwt_token
|
16
|
+
@jwt_token ||= instance.post(
|
17
|
+
'auth/local',
|
18
|
+
identifier: ENV['STRAPI_IDENTIFIER'],
|
19
|
+
password: ENV['STRAPI_PASSWORD']
|
20
|
+
).body['jwt']
|
30
21
|
end
|
31
22
|
end
|
32
23
|
end
|
data/lib/strapi/content_type.rb
CHANGED
@@ -19,10 +19,10 @@ module Strapi
|
|
19
19
|
other.is_a?(self.class) && id == other.id
|
20
20
|
end
|
21
21
|
|
22
|
-
def save(
|
22
|
+
def save(params = {})
|
23
23
|
return if deleted
|
24
24
|
|
25
|
-
response = id ? update_request(
|
25
|
+
response = id ? update_request(params) : create_request(params)
|
26
26
|
entry = self.class.send(:new_from_response, response)
|
27
27
|
tap do
|
28
28
|
@attributes = attributes.deep_merge entry.attributes
|
@@ -30,8 +30,8 @@ module Strapi
|
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
|
-
def delete(
|
34
|
-
Request.delete("#{self.class.send(:_plural_id)}/#{id}
|
33
|
+
def delete(params = {})
|
34
|
+
Request.delete("#{self.class.send(:_plural_id)}/#{id}", params)
|
35
35
|
@attributes = {}
|
36
36
|
@id = nil
|
37
37
|
@deleted = true
|
@@ -40,16 +40,16 @@ module Strapi
|
|
40
40
|
|
41
41
|
private
|
42
42
|
|
43
|
-
def create_request(
|
43
|
+
def create_request(params)
|
44
44
|
Request.post(
|
45
|
-
"#{self.class.send(:_plural_id)}?#{
|
45
|
+
"#{self.class.send(:_plural_id)}?#{params.to_query}",
|
46
46
|
data: attributes.slice(*self.class.fields)
|
47
47
|
).data
|
48
48
|
end
|
49
49
|
|
50
|
-
def update_request(
|
50
|
+
def update_request(params)
|
51
51
|
Request.put(
|
52
|
-
"#{self.class.send(:_plural_id)}/#{id}?#{
|
52
|
+
"#{self.class.send(:_plural_id)}/#{id}?#{params.to_query}",
|
53
53
|
data: attributes.slice(*self.class.fields)
|
54
54
|
).data
|
55
55
|
end
|
@@ -61,7 +61,7 @@ module Strapi
|
|
61
61
|
end
|
62
62
|
|
63
63
|
def strapi_attr_value(attr, options)
|
64
|
-
value = @attributes[attr]
|
64
|
+
return unless (value = @attributes[attr])
|
65
65
|
return value unless (content_type = options[:content_type])
|
66
66
|
|
67
67
|
content_type_class = content_type.is_a?(String) ? content_type.constantize : content_type
|
@@ -94,32 +94,34 @@ module Strapi
|
|
94
94
|
end
|
95
95
|
end
|
96
96
|
|
97
|
-
def find(id,
|
98
|
-
new_from_response Request.get("#{_plural_id}/#{id}
|
97
|
+
def find(id, params = {})
|
98
|
+
new_from_response Request.get("#{_plural_id}/#{id}", params).data
|
99
99
|
end
|
100
100
|
|
101
|
-
def all(
|
102
|
-
get_list(
|
101
|
+
def all(params = {})
|
102
|
+
get_list(params)
|
103
103
|
end
|
104
104
|
|
105
|
-
def where(
|
106
|
-
get_list(
|
105
|
+
def where(params)
|
106
|
+
get_list(params)
|
107
107
|
end
|
108
108
|
|
109
|
-
def create(attributes,
|
110
|
-
new(attributes).save(
|
109
|
+
def create(attributes, params = {})
|
110
|
+
new(attributes).save(params)
|
111
111
|
end
|
112
112
|
|
113
113
|
private
|
114
114
|
|
115
115
|
def new_from_response(response)
|
116
|
+
return unless response
|
117
|
+
|
116
118
|
new(response['attributes'].transform_keys(&:underscore)).tap do |entry|
|
117
119
|
entry.instance_variable_set('@id', response['id'])
|
118
120
|
end
|
119
121
|
end
|
120
122
|
|
121
|
-
def get_list(
|
122
|
-
Request.get(
|
123
|
+
def get_list(params)
|
124
|
+
Request.get(_plural_id, params).data.map do |result|
|
123
125
|
new_from_response result
|
124
126
|
end
|
125
127
|
end
|
data/lib/strapi/media.rb
CHANGED
@@ -19,7 +19,13 @@ module Strapi
|
|
19
19
|
field :provider_metadata
|
20
20
|
|
21
21
|
def url
|
22
|
-
|
22
|
+
return unless (url_string = @attributes[:url].presence)
|
23
|
+
|
24
|
+
if url_string.include?('//')
|
25
|
+
url_string
|
26
|
+
else
|
27
|
+
ENV['STRAPI_HOST_URL'] + url_string
|
28
|
+
end
|
23
29
|
end
|
24
30
|
end
|
25
31
|
end
|
data/lib/strapi/request.rb
CHANGED
@@ -3,12 +3,35 @@
|
|
3
3
|
module Strapi
|
4
4
|
# A convenience wrapper around Faraday to make a request to the Strapi API
|
5
5
|
class Request
|
6
|
+
ALLOWED_PARAM_KEYS = %i[sort filters populate fields pagination publicationState locale].freeze
|
7
|
+
REQUEST_VERBS_WITHOUT_BODIES = %i[get head delete trace].freeze
|
8
|
+
|
6
9
|
class << self
|
7
10
|
%i[get head delete trace post put patch].each do |method|
|
8
|
-
define_method(method) do
|
9
|
-
|
11
|
+
define_method(method) do |path, args = {}|
|
12
|
+
validate_query_params(args) if REQUEST_VERBS_WITHOUT_BODIES.include?(method)
|
13
|
+
|
14
|
+
Response.new(
|
15
|
+
Connection.instance.send(method, path, args) do |f|
|
16
|
+
f.headers = {
|
17
|
+
'Authorization' => "bearer #{Connection.jwt_token}"
|
18
|
+
}
|
19
|
+
end
|
20
|
+
)
|
10
21
|
end
|
11
22
|
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def validate_query_params(params)
|
27
|
+
unallowed_query_params = params.keys - ALLOWED_PARAM_KEYS
|
28
|
+
return unless unallowed_query_params.size.positive?
|
29
|
+
|
30
|
+
raise(
|
31
|
+
Error,
|
32
|
+
'message' => "Unallowed query params - #{unallowed_query_params.join(', ')}"
|
33
|
+
)
|
34
|
+
end
|
12
35
|
end
|
13
36
|
end
|
14
37
|
end
|
data/lib/strapi/response.rb
CHANGED
data/lib/strapi/version.rb
CHANGED
data/lib/strapi.rb
CHANGED
@@ -5,7 +5,7 @@ require 'active_support/core_ext/string/inflections'
|
|
5
5
|
require 'active_support/core_ext/object/to_query'
|
6
6
|
require 'active_support/core_ext/hash/keys'
|
7
7
|
require 'faraday'
|
8
|
-
require '
|
8
|
+
require 'faraday/net_http'
|
9
9
|
|
10
10
|
require_relative 'strapi/connection'
|
11
11
|
require_relative 'strapi/content_type'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: strapi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- justin talbott
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-02-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -52,20 +52,6 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '2.0'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: oj
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - "~>"
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '3.0'
|
62
|
-
type: :runtime
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - "~>"
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '3.0'
|
69
55
|
description:
|
70
56
|
email:
|
71
57
|
- gmail@justintalbott.com
|
@@ -111,7 +97,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
111
97
|
- !ruby/object:Gem::Version
|
112
98
|
version: '0'
|
113
99
|
requirements: []
|
114
|
-
rubygems_version: 3.
|
100
|
+
rubygems_version: 3.3.3
|
115
101
|
signing_key:
|
116
102
|
specification_version: 4
|
117
103
|
summary: Simple Ruby classes for Strapi content types
|