encoded_id-rails 0.4.0 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of encoded_id-rails might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +27 -1
- data/README.md +44 -19
- data/Steepfile +1 -1
- data/lib/encoded_id/rails/encoder_methods.rb +40 -0
- data/lib/encoded_id/rails/finder_methods.rb +27 -0
- data/lib/encoded_id/rails/model.rb +36 -0
- data/lib/encoded_id/rails/path_param.rb +14 -0
- data/lib/encoded_id/rails/query_methods.rb +13 -0
- data/lib/encoded_id/rails/slugged_path_param.rb +14 -0
- data/lib/encoded_id/rails/version.rb +1 -1
- data/lib/encoded_id/rails.rb +9 -2
- data/sig/encoded_id/rails.rbs +63 -51
- metadata +8 -3
- data/lib/encoded_id/rails/with_encoded_id.rb +0 -100
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 599b4c236c59881b00eefbe0feaf4fa6f1a04015573ba5d807f041ba2932e602
|
4
|
+
data.tar.gz: ff6ee760d956606accfb98a75be00cf04a545695e0dcce56e9eb271b1d824fee
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9f176effb4bc926a4aa61dcbb7d0ca0e88b972186438ffe03a96b68d5e78e1eb0b6a485efcad924aff2070097356b8ced016fb1da0253b38f1d9e80eef21e18e
|
7
|
+
data.tar.gz: 2f318e0a04cbd5a45fc3edca02c1a8e053590b70963f4b851f8aac150ea465018aea6f21d3f5951bf4c8f7e31bd650a05a8a46328c2ce0812e8e26d2d4e92099
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,31 @@
|
|
1
1
|
## [Unreleased]
|
2
2
|
|
3
|
-
## [0.
|
3
|
+
## [0.6.0] - 2022-12-21
|
4
|
+
|
5
|
+
- Rename mixin to `Model`
|
6
|
+
- Introduce optional mixins for overriding `#to_param`
|
7
|
+
|
8
|
+
## [0.5.0] - 2022-12-21
|
9
|
+
|
10
|
+
- `name_for_encoded_id_slug` no longer uses the return value from name but rather just uses the `class` `name`.
|
11
|
+
- If you want to change the name used in the slug, override `name_for_encoded_id_slug`
|
12
|
+
|
13
|
+
## [0.4.0] - 2022-12-18
|
14
|
+
|
15
|
+
- Refactor internals, remove any methods not actually related to creating `encoded_id`, (eg `slugged_id` was removed).
|
16
|
+
|
17
|
+
## [0.3.1] - 2022-12-15
|
18
|
+
|
19
|
+
- Fix default config
|
20
|
+
|
21
|
+
## [0.3.0] - 2022-12-15
|
22
|
+
|
23
|
+
- Updates gem `encoded_id` dependency and fixes configuration
|
24
|
+
|
25
|
+
## [0.2.0] - 2022-12-14
|
26
|
+
|
27
|
+
- No notes...
|
28
|
+
|
29
|
+
## [0.1.0] - 2022-11-17
|
4
30
|
|
5
31
|
- Initial release
|
data/README.md
CHANGED
@@ -6,16 +6,16 @@ EncodedID lets you turn numeric or hex IDs into reversible and human friendly ob
|
|
6
6
|
|
7
7
|
```ruby
|
8
8
|
class User < ApplicationRecord
|
9
|
-
include EncodedId::
|
10
|
-
|
9
|
+
include EncodedId::Model
|
10
|
+
|
11
11
|
def name_for_encoded_id_slug
|
12
|
-
full_name
|
12
|
+
full_name
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
|
-
user = User.find_by_encoded_id("p5w9-z27j")
|
17
|
-
user.encoded_id
|
18
|
-
user.slugged_encoded_id
|
16
|
+
user = User.find_by_encoded_id("p5w9-z27j") # => #<User id: 78>
|
17
|
+
user.encoded_id # => "p5w9-z27j"
|
18
|
+
user.slugged_encoded_id # => "bob-smith--p5w9-z27j"
|
19
19
|
```
|
20
20
|
|
21
21
|
# Features
|
@@ -85,21 +85,45 @@ You can configure:
|
|
85
85
|
|
86
86
|
### ActiveRecord model setup
|
87
87
|
|
88
|
-
Include `EncodedId::
|
88
|
+
Include `EncodedId::Model` in your model and optionally specify a encoded id salt (or not if using a global one):
|
89
89
|
|
90
90
|
```ruby
|
91
91
|
class User < ApplicationRecord
|
92
|
-
include EncodedId::
|
93
|
-
|
92
|
+
include EncodedId::Model
|
93
|
+
|
94
94
|
# and optionally the model's salt
|
95
95
|
def encoded_id_salt
|
96
96
|
"my-user-model-salt"
|
97
97
|
end
|
98
|
-
|
98
|
+
|
99
99
|
# ...
|
100
100
|
end
|
101
101
|
```
|
102
102
|
|
103
|
+
### Optional mixins
|
104
|
+
|
105
|
+
You can optionally include one of the following mixins to add default overrides to `#to_param`.
|
106
|
+
|
107
|
+
- `EncodedId::PathParam`
|
108
|
+
- `EncodedId::SluggedPathParam`
|
109
|
+
|
110
|
+
This is so that an instance of the model can be used in path helpers and
|
111
|
+
return the encoded ID string instead of the record ID by default.
|
112
|
+
|
113
|
+
```ruby
|
114
|
+
class User < ApplicationRecord
|
115
|
+
include EncodedId::Model
|
116
|
+
include EncodedId::SluggedPathParam
|
117
|
+
|
118
|
+
def name_for_encoded_id_slug
|
119
|
+
full_name
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
user = User.create(full_name: "Bob Smith")
|
124
|
+
Rails.application.routes.url_helpers.user_path(user) # => "/users/bob-smith--p5w9-z27j"
|
125
|
+
```
|
126
|
+
|
103
127
|
## Documentation
|
104
128
|
|
105
129
|
### `.find_by_encoded_id`
|
@@ -164,12 +188,13 @@ Otherwise override this method to return a salt specific to the model.
|
|
164
188
|
|
165
189
|
```ruby
|
166
190
|
class User < ApplicationRecord
|
167
|
-
include EncodedId::
|
168
|
-
|
191
|
+
include EncodedId::Model
|
192
|
+
|
169
193
|
def encoded_id_salt
|
170
194
|
"my-user-model-salt"
|
171
195
|
end
|
172
196
|
end
|
197
|
+
|
173
198
|
User.encoded_id_salt # => "my-user-model-salt"
|
174
199
|
```
|
175
200
|
|
@@ -201,8 +226,8 @@ By default it calls `#name` on the instance, or if the instance does not respond
|
|
201
226
|
|
202
227
|
```ruby
|
203
228
|
class User < ApplicationRecord
|
204
|
-
include EncodedId::
|
205
|
-
|
229
|
+
include EncodedId::Model
|
230
|
+
|
206
231
|
# If User has an attribute `name`, that will be used for the slug,
|
207
232
|
# otherwise `user` will be used as determined by the class name.
|
208
233
|
end
|
@@ -217,8 +242,8 @@ You can optionally override this method to define your own slug:
|
|
217
242
|
|
218
243
|
```ruby
|
219
244
|
class User < ApplicationRecord
|
220
|
-
include EncodedId::
|
221
|
-
|
245
|
+
include EncodedId::Model
|
246
|
+
|
222
247
|
def name_for_encoded_id_slug
|
223
248
|
superhero_name
|
224
249
|
end
|
@@ -232,11 +257,11 @@ user.slugged_encoded_id # => "super-dev--37nw-8nh7"
|
|
232
257
|
|
233
258
|
Simply add the mixin to your `ApplicationRecord`:
|
234
259
|
|
235
|
-
```ruby
|
260
|
+
```ruby
|
236
261
|
class ApplicationRecord < ActiveRecord::Base
|
237
262
|
self.abstract_class = true
|
238
|
-
include EncodedId::
|
239
|
-
|
263
|
+
include EncodedId::Model
|
264
|
+
|
240
265
|
...
|
241
266
|
end
|
242
267
|
```
|
data/Steepfile
CHANGED
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module EncodedId
|
4
|
+
module Rails
|
5
|
+
module EncoderMethods
|
6
|
+
def encode_encoded_id(ids, options = {})
|
7
|
+
raise StandardError, "You must pass an ID or array of IDs" if ids.blank?
|
8
|
+
encoded_id_coder(options).encode(ids)
|
9
|
+
end
|
10
|
+
|
11
|
+
def decode_encoded_id(slugged_encoded_id, options = {})
|
12
|
+
return if slugged_encoded_id.blank?
|
13
|
+
encoded_id = encoded_id_parser(slugged_encoded_id).id
|
14
|
+
return if !encoded_id || encoded_id.blank?
|
15
|
+
encoded_id_coder(options).decode(encoded_id)
|
16
|
+
end
|
17
|
+
|
18
|
+
# This can be overridden in the model to provide a custom salt
|
19
|
+
def encoded_id_salt
|
20
|
+
# @type self: Class
|
21
|
+
EncodedId::Rails::Salt.new(self, EncodedId::Rails.configuration.salt).generate!
|
22
|
+
end
|
23
|
+
|
24
|
+
def encoded_id_parser(slugged_encoded_id)
|
25
|
+
SluggedIdParser.new(slugged_encoded_id, separator: EncodedId::Rails.configuration.slugged_id_separator)
|
26
|
+
end
|
27
|
+
|
28
|
+
def encoded_id_coder(options = {})
|
29
|
+
config = EncodedId::Rails.configuration
|
30
|
+
EncodedId::Rails::Coder.new(
|
31
|
+
salt: options[:salt] || encoded_id_salt,
|
32
|
+
id_length: options[:id_length] || config.id_length,
|
33
|
+
character_group_size: options[:character_group_size] || config.character_group_size,
|
34
|
+
alphabet: options[:alphabet] || config.alphabet,
|
35
|
+
separator: options[:separator] || config.group_separator
|
36
|
+
)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module EncodedId
|
4
|
+
module Rails
|
5
|
+
module FinderMethods
|
6
|
+
# Find by encoded ID and optionally ensure record ID is the same as constraint (can be slugged)
|
7
|
+
def find_by_encoded_id(slugged_encoded_id, with_id: nil)
|
8
|
+
decoded_id = decode_encoded_id(slugged_encoded_id)
|
9
|
+
return if decoded_id.blank?
|
10
|
+
record = find_by(id: decoded_id)
|
11
|
+
return unless record
|
12
|
+
return if with_id && with_id != record.send(:id)
|
13
|
+
record
|
14
|
+
end
|
15
|
+
|
16
|
+
def find_by_encoded_id!(slugged_encoded_id, with_id: nil)
|
17
|
+
decoded_id = decode_encoded_id(slugged_encoded_id)
|
18
|
+
raise ActiveRecord::RecordNotFound if decoded_id.blank?
|
19
|
+
record = find_by(id: decoded_id)
|
20
|
+
if !record || (with_id && with_id != record.send(:id))
|
21
|
+
raise ActiveRecord::RecordNotFound
|
22
|
+
end
|
23
|
+
record
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "active_record"
|
4
|
+
require "encoded_id"
|
5
|
+
|
6
|
+
module EncodedId
|
7
|
+
module Rails
|
8
|
+
module Model
|
9
|
+
def self.included(base)
|
10
|
+
base.extend(EncoderMethods)
|
11
|
+
base.extend(FinderMethods)
|
12
|
+
base.extend(QueryMethods)
|
13
|
+
end
|
14
|
+
|
15
|
+
def encoded_id
|
16
|
+
@encoded_id ||= self.class.encode_encoded_id(id)
|
17
|
+
end
|
18
|
+
|
19
|
+
def slugged_encoded_id(with: :name_for_encoded_id_slug)
|
20
|
+
@slugged_encoded_id ||= EncodedId::Rails::SluggedId.new(
|
21
|
+
self,
|
22
|
+
slug_method: with,
|
23
|
+
id_method: :encoded_id,
|
24
|
+
separator: EncodedId::Rails.configuration.slugged_id_separator
|
25
|
+
).slugged_id
|
26
|
+
end
|
27
|
+
|
28
|
+
# By default slug created from class name, but can be overridden
|
29
|
+
def name_for_encoded_id_slug
|
30
|
+
class_name = self.class.name
|
31
|
+
raise StandardError, "Class must have a `name`, cannot create a slug" if !class_name || class_name.blank?
|
32
|
+
class_name.underscore
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module EncodedId
|
4
|
+
module Rails
|
5
|
+
module QueryMethods
|
6
|
+
def where_encoded_id(slugged_encoded_id)
|
7
|
+
decoded_id = decode_encoded_id(slugged_encoded_id)
|
8
|
+
raise ActiveRecord::RecordNotFound if decoded_id.nil?
|
9
|
+
where(id: decoded_id)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
data/lib/encoded_id/rails.rb
CHANGED
@@ -6,7 +6,12 @@ require_relative "rails/coder"
|
|
6
6
|
require_relative "rails/slugged_id"
|
7
7
|
require_relative "rails/slugged_id_parser"
|
8
8
|
require_relative "rails/salt"
|
9
|
-
require_relative "rails/
|
9
|
+
require_relative "rails/encoder_methods"
|
10
|
+
require_relative "rails/query_methods"
|
11
|
+
require_relative "rails/finder_methods"
|
12
|
+
require_relative "rails/path_param"
|
13
|
+
require_relative "rails/slugged_path_param"
|
14
|
+
require_relative "rails/model"
|
10
15
|
|
11
16
|
module EncodedId
|
12
17
|
module Rails
|
@@ -24,5 +29,7 @@ module EncodedId
|
|
24
29
|
end
|
25
30
|
|
26
31
|
# Expose directly on EncodedId
|
27
|
-
|
32
|
+
Model = Rails::Model
|
33
|
+
PathParam = Rails::PathParam
|
34
|
+
SluggedPathParam = Rails::SluggedPathParam
|
28
35
|
end
|
data/sig/encoded_id/rails.rbs
CHANGED
@@ -2,10 +2,25 @@ module EncodedId
|
|
2
2
|
module Rails
|
3
3
|
VERSION: ::String
|
4
4
|
|
5
|
+
class Configuration
|
6
|
+
attr_accessor salt: ::String
|
7
|
+
attr_accessor group_separator: ::String
|
8
|
+
attr_accessor character_group_size: ::Integer
|
9
|
+
attr_accessor alphabet: ::EncodedId::Alphabet
|
10
|
+
attr_accessor id_length: ::Integer
|
11
|
+
attr_accessor slugged_id_separator: ::String
|
12
|
+
|
13
|
+
def initialize: () -> void
|
14
|
+
end
|
15
|
+
|
16
|
+
attr_reader self.configuration: Configuration
|
17
|
+
|
18
|
+
def self.configure: () { (Configuration config) -> void } -> void
|
19
|
+
|
5
20
|
class Coder
|
6
21
|
def initialize: (salt: ::String, id_length: ::Integer, character_group_size: ::Integer, separator: ::String, alphabet: ::EncodedId::Alphabet) -> void
|
7
22
|
def encode: (::Integer | ::Array[::Integer]) -> String
|
8
|
-
def decode: (::String) ->
|
23
|
+
def decode: (::String) -> ::Array[::Integer]?
|
9
24
|
|
10
25
|
@salt: ::String
|
11
26
|
@id_length: ::Integer
|
@@ -18,21 +33,10 @@ module EncodedId
|
|
18
33
|
def coder: -> ::EncodedId::ReversibleId
|
19
34
|
end
|
20
35
|
|
21
|
-
class Configuration
|
22
|
-
attr_accessor salt: ::String
|
23
|
-
attr_accessor group_separator: ::String
|
24
|
-
attr_accessor character_group_size: ::Integer
|
25
|
-
attr_accessor alphabet: ::EncodedId::Alphabet
|
26
|
-
attr_accessor id_length: ::Integer
|
27
|
-
attr_accessor slugged_id_separator: ::String
|
28
|
-
|
29
|
-
def initialize: () -> void
|
30
|
-
end
|
31
|
-
|
32
36
|
class Salt
|
33
|
-
def initialize: (
|
37
|
+
def initialize: (Class klass, ::String salt) -> void
|
34
38
|
|
35
|
-
@klass:
|
39
|
+
@klass: Class
|
36
40
|
@salt: ::String
|
37
41
|
|
38
42
|
def generate!: -> ::String
|
@@ -52,43 +56,42 @@ module EncodedId
|
|
52
56
|
class SluggedIdParser
|
53
57
|
def initialize: (::String slugged_id, ?separator: ::String) -> void
|
54
58
|
|
55
|
-
attr_reader slug:
|
56
|
-
attr_reader id:
|
59
|
+
attr_reader slug: ::String?
|
60
|
+
attr_reader id: ::String?
|
57
61
|
end
|
58
62
|
|
59
|
-
|
63
|
+
module EncoderMethods
|
64
|
+
def encode_encoded_id: (untyped id, ?::Hash[::Symbol, untyped] options) -> ::String
|
65
|
+
def decode_encoded_id: (::String slugged_encoded_id, ?::Hash[::Symbol, untyped] options) -> ::Array[::Integer]?
|
66
|
+
def encoded_id_salt: () -> ::String
|
67
|
+
def encoded_id_parser: (::String slugged_encoded_id) -> ::EncodedId::Rails::SluggedIdParser
|
68
|
+
def encoded_id_coder: (?::Hash[::Symbol, untyped] options) -> ::EncodedId::Rails::Coder
|
69
|
+
end
|
60
70
|
|
61
|
-
|
71
|
+
interface _ActiveRecordFinderMethod
|
72
|
+
def find_by: (*untyped) -> (nil | untyped)
|
73
|
+
end
|
62
74
|
|
63
|
-
module
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
# the duplication here
|
84
|
-
def self.find_by_encoded_id: (::String slugged_encoded_id, ?with_id: ::Symbol?) -> (nil | untyped)
|
85
|
-
def self.find_by_encoded_id!: (::String slugged_encoded_id, ?with_id: ::Symbol?) -> untyped
|
86
|
-
def self.where_encoded_id: (::String slugged_encoded_id) -> untyped
|
87
|
-
def self.encode_encoded_id: (untyped id, ?::Hash[::Symbol, untyped] options) -> ::String
|
88
|
-
def self.decode_encoded_id: (::String slugged_encoded_id, ?::Hash[::Symbol, untyped] options) -> (nil | ::Array[::Integer])
|
89
|
-
def self.encoded_id_salt: () -> ::String
|
90
|
-
def self.encoded_id_parser: (::String slugged_encoded_id) -> ::EncodedId::Rails::SluggedIdParser
|
91
|
-
def self.encoded_id_coder: (?::Hash[::Symbol, untyped] options) -> ::EncodedId::Rails::Coder
|
75
|
+
module FinderMethods : EncoderMethods, _ActiveRecordFinderMethod
|
76
|
+
def find_by_encoded_id: (::String slugged_encoded_id, ?with_id: ::Symbol?) -> untyped?
|
77
|
+
def find_by_encoded_id!: (::String slugged_encoded_id, ?with_id: ::Symbol?) -> untyped
|
78
|
+
end
|
79
|
+
|
80
|
+
interface _ActiveRecordQueryMethod
|
81
|
+
def where: (*untyped) -> untyped
|
82
|
+
end
|
83
|
+
|
84
|
+
module QueryMethods : EncoderMethods, _ActiveRecordQueryMethod
|
85
|
+
def where_encoded_id: (::String slugged_encoded_id) -> untyped
|
86
|
+
end
|
87
|
+
|
88
|
+
module Model : ActiveRecord::Base
|
89
|
+
extend ActiveRecord::FinderMethods
|
90
|
+
extend ActiveRecord::QueryMethods
|
91
|
+
|
92
|
+
extend EncoderMethods
|
93
|
+
extend FinderMethods
|
94
|
+
extend QueryMethods
|
92
95
|
|
93
96
|
@encoded_id: ::String
|
94
97
|
@slugged_encoded_id: ::String
|
@@ -96,11 +99,20 @@ module EncodedId
|
|
96
99
|
def encoded_id: () -> ::String
|
97
100
|
def slugged_encoded_id: (?with: ::Symbol) -> ::String
|
98
101
|
def name_for_encoded_id_slug: () -> ::String
|
102
|
+
end
|
99
103
|
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
+
interface _ActiveRecordToParam
|
105
|
+
def to_param: () -> ::String
|
106
|
+
end
|
107
|
+
|
108
|
+
module PathParam : Model, _ActiveRecordToParam
|
109
|
+
end
|
110
|
+
|
111
|
+
module SluggedPathParam : Model, _ActiveRecordToParam
|
104
112
|
end
|
105
113
|
end
|
114
|
+
|
115
|
+
Model: singleton(Rails::Model)
|
116
|
+
PathParam: singleton(Rails::PathParam)
|
117
|
+
SluggedPathParam: singleton(Rails::SluggedPathParam)
|
106
118
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: encoded_id-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stephen Ierodiaconou
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-12-
|
11
|
+
date: 2022-12-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -84,11 +84,16 @@ files:
|
|
84
84
|
- lib/encoded_id/rails.rb
|
85
85
|
- lib/encoded_id/rails/coder.rb
|
86
86
|
- lib/encoded_id/rails/configuration.rb
|
87
|
+
- lib/encoded_id/rails/encoder_methods.rb
|
88
|
+
- lib/encoded_id/rails/finder_methods.rb
|
89
|
+
- lib/encoded_id/rails/model.rb
|
90
|
+
- lib/encoded_id/rails/path_param.rb
|
91
|
+
- lib/encoded_id/rails/query_methods.rb
|
87
92
|
- lib/encoded_id/rails/salt.rb
|
88
93
|
- lib/encoded_id/rails/slugged_id.rb
|
89
94
|
- lib/encoded_id/rails/slugged_id_parser.rb
|
95
|
+
- lib/encoded_id/rails/slugged_path_param.rb
|
90
96
|
- lib/encoded_id/rails/version.rb
|
91
|
-
- lib/encoded_id/rails/with_encoded_id.rb
|
92
97
|
- lib/generators/encoded_id/rails/USAGE
|
93
98
|
- lib/generators/encoded_id/rails/install_generator.rb
|
94
99
|
- lib/generators/encoded_id/rails/templates/encoded_id.rb
|
@@ -1,100 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "active_record"
|
4
|
-
require "encoded_id"
|
5
|
-
|
6
|
-
module EncodedId
|
7
|
-
module Rails
|
8
|
-
module WithEncodedId
|
9
|
-
def self.included(base)
|
10
|
-
base.extend(ClassMethods)
|
11
|
-
end
|
12
|
-
|
13
|
-
module ClassMethods
|
14
|
-
# Find by encoded ID and optionally ensure record ID is the same as constraint (can be slugged)
|
15
|
-
def find_by_encoded_id(slugged_encoded_id, with_id: nil)
|
16
|
-
decoded_id = decode_encoded_id(slugged_encoded_id)
|
17
|
-
return if decoded_id.blank?
|
18
|
-
record = find_by(id: decoded_id)
|
19
|
-
return unless record
|
20
|
-
return if with_id && with_id != record.send(:id)
|
21
|
-
record
|
22
|
-
end
|
23
|
-
|
24
|
-
def find_by_encoded_id!(slugged_encoded_id, with_id: nil)
|
25
|
-
decoded_id = decode_encoded_id(slugged_encoded_id)
|
26
|
-
raise ActiveRecord::RecordNotFound if decoded_id.blank?
|
27
|
-
record = find_by(id: decoded_id)
|
28
|
-
if !record || (with_id && with_id != record.send(:id))
|
29
|
-
raise ActiveRecord::RecordNotFound
|
30
|
-
end
|
31
|
-
record
|
32
|
-
end
|
33
|
-
|
34
|
-
def where_encoded_id(slugged_encoded_id)
|
35
|
-
decoded_id = decode_encoded_id(slugged_encoded_id)
|
36
|
-
raise ActiveRecord::RecordNotFound if decoded_id.nil?
|
37
|
-
where(id: decoded_id)
|
38
|
-
end
|
39
|
-
|
40
|
-
def encode_encoded_id(ids, options = {})
|
41
|
-
raise StandardError, "You must pass an ID or array of IDs" if ids.blank?
|
42
|
-
encoded_id_coder(options).encode(ids)
|
43
|
-
end
|
44
|
-
|
45
|
-
def decode_encoded_id(slugged_encoded_id, options = {})
|
46
|
-
return if slugged_encoded_id.blank?
|
47
|
-
encoded_id = encoded_id_parser(slugged_encoded_id).id
|
48
|
-
return if !encoded_id || encoded_id.blank?
|
49
|
-
encoded_id_coder(options).decode(encoded_id)
|
50
|
-
end
|
51
|
-
|
52
|
-
# This can be overridden in the model to provide a custom salt
|
53
|
-
def encoded_id_salt
|
54
|
-
EncodedId::Rails::Salt.new(self, EncodedId::Rails.configuration.salt).generate!
|
55
|
-
end
|
56
|
-
|
57
|
-
def encoded_id_parser(slugged_encoded_id)
|
58
|
-
SluggedIdParser.new(slugged_encoded_id, separator: EncodedId::Rails.configuration.slugged_id_separator)
|
59
|
-
end
|
60
|
-
|
61
|
-
def encoded_id_coder(options = {})
|
62
|
-
config = EncodedId::Rails.configuration
|
63
|
-
EncodedId::Rails::Coder.new(
|
64
|
-
salt: options[:salt] || encoded_id_salt,
|
65
|
-
id_length: options[:id_length] || config.id_length,
|
66
|
-
character_group_size: options[:character_group_size] || config.character_group_size,
|
67
|
-
alphabet: options[:alphabet] || config.alphabet,
|
68
|
-
separator: options[:separator] || config.group_separator
|
69
|
-
)
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
# Instance methods
|
74
|
-
|
75
|
-
def encoded_id
|
76
|
-
@encoded_id ||= self.class.encode_encoded_id(id)
|
77
|
-
end
|
78
|
-
|
79
|
-
def slugged_encoded_id(with: :name_for_encoded_id_slug)
|
80
|
-
@slugged_encoded_id ||= EncodedId::Rails::SluggedId.new(
|
81
|
-
self,
|
82
|
-
slug_method: with,
|
83
|
-
id_method: :encoded_id,
|
84
|
-
separator: EncodedId::Rails.configuration.slugged_id_separator
|
85
|
-
).slugged_id
|
86
|
-
end
|
87
|
-
|
88
|
-
# By default slug calls `name` if it exists or returns class name
|
89
|
-
def name_for_encoded_id_slug
|
90
|
-
if respond_to? :name
|
91
|
-
given_name = name
|
92
|
-
return given_name if given_name.present?
|
93
|
-
end
|
94
|
-
class_name = self.class.name
|
95
|
-
raise StandardError, "No name or class name found, cannot create a slug" if !class_name || class_name.blank?
|
96
|
-
class_name.underscore
|
97
|
-
end
|
98
|
-
end
|
99
|
-
end
|
100
|
-
end
|