couchbase 3.5.2-x86_64-darwin
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 +7 -0
- data/LICENSE.txt +202 -0
- data/README.md +154 -0
- data/ext/extconf.rb +0 -0
- data/lib/active_support/cache/couchbase_store.rb +342 -0
- data/lib/couchbase/3.1/libcouchbase.bundle +0 -0
- data/lib/couchbase/3.2/libcouchbase.bundle +0 -0
- data/lib/couchbase/3.3/libcouchbase.bundle +0 -0
- data/lib/couchbase/analytics_options.rb +109 -0
- data/lib/couchbase/authenticator.rb +66 -0
- data/lib/couchbase/binary_collection.rb +130 -0
- data/lib/couchbase/binary_collection_options.rb +26 -0
- data/lib/couchbase/bucket.rb +146 -0
- data/lib/couchbase/cluster.rb +462 -0
- data/lib/couchbase/cluster_registry.rb +49 -0
- data/lib/couchbase/collection.rb +707 -0
- data/lib/couchbase/collection_options.rb +401 -0
- data/lib/couchbase/config_profiles.rb +57 -0
- data/lib/couchbase/configuration.rb +58 -0
- data/lib/couchbase/datastructures/couchbase_list.rb +160 -0
- data/lib/couchbase/datastructures/couchbase_map.rb +194 -0
- data/lib/couchbase/datastructures/couchbase_queue.rb +134 -0
- data/lib/couchbase/datastructures/couchbase_set.rb +128 -0
- data/lib/couchbase/datastructures.rb +26 -0
- data/lib/couchbase/diagnostics.rb +183 -0
- data/lib/couchbase/errors.rb +414 -0
- data/lib/couchbase/json_transcoder.rb +41 -0
- data/lib/couchbase/key_value_scan.rb +119 -0
- data/lib/couchbase/libcouchbase.rb +6 -0
- data/lib/couchbase/logger.rb +87 -0
- data/lib/couchbase/management/analytics_index_manager.rb +1129 -0
- data/lib/couchbase/management/bucket_manager.rb +445 -0
- data/lib/couchbase/management/collection_manager.rb +472 -0
- data/lib/couchbase/management/collection_query_index_manager.rb +224 -0
- data/lib/couchbase/management/query_index_manager.rb +619 -0
- data/lib/couchbase/management/scope_search_index_manager.rb +200 -0
- data/lib/couchbase/management/search_index_manager.rb +426 -0
- data/lib/couchbase/management/user_manager.rb +470 -0
- data/lib/couchbase/management/view_index_manager.rb +239 -0
- data/lib/couchbase/management.rb +31 -0
- data/lib/couchbase/mutation_state.rb +65 -0
- data/lib/couchbase/options.rb +2846 -0
- data/lib/couchbase/protostellar/binary_collection.rb +55 -0
- data/lib/couchbase/protostellar/bucket.rb +55 -0
- data/lib/couchbase/protostellar/client.rb +99 -0
- data/lib/couchbase/protostellar/cluster.rb +171 -0
- data/lib/couchbase/protostellar/collection.rb +152 -0
- data/lib/couchbase/protostellar/connect_options.rb +63 -0
- data/lib/couchbase/protostellar/error_handling.rb +203 -0
- data/lib/couchbase/protostellar/generated/admin/bucket/v1/bucket_pb.rb +61 -0
- data/lib/couchbase/protostellar/generated/admin/bucket/v1/bucket_services_pb.rb +35 -0
- data/lib/couchbase/protostellar/generated/admin/collection/v1/collection_pb.rb +57 -0
- data/lib/couchbase/protostellar/generated/admin/collection/v1/collection_services_pb.rb +36 -0
- data/lib/couchbase/protostellar/generated/admin/query/v1/query_pb.rb +61 -0
- data/lib/couchbase/protostellar/generated/admin/query/v1/query_services_pb.rb +37 -0
- data/lib/couchbase/protostellar/generated/admin/search/v1/search_pb.rb +72 -0
- data/lib/couchbase/protostellar/generated/admin/search/v1/search_services_pb.rb +44 -0
- data/lib/couchbase/protostellar/generated/analytics/v1/analytics_pb.rb +52 -0
- data/lib/couchbase/protostellar/generated/analytics/v1/analytics_services_pb.rb +30 -0
- data/lib/couchbase/protostellar/generated/internal/hooks/v1/hooks_pb.rb +70 -0
- data/lib/couchbase/protostellar/generated/internal/hooks/v1/hooks_services_pb.rb +36 -0
- data/lib/couchbase/protostellar/generated/kv/v1/kv_pb.rb +97 -0
- data/lib/couchbase/protostellar/generated/kv/v1/kv_services_pb.rb +46 -0
- data/lib/couchbase/protostellar/generated/query/v1/query_pb.rb +57 -0
- data/lib/couchbase/protostellar/generated/query/v1/query_services_pb.rb +30 -0
- data/lib/couchbase/protostellar/generated/routing/v1/routing_pb.rb +52 -0
- data/lib/couchbase/protostellar/generated/routing/v1/routing_services_pb.rb +30 -0
- data/lib/couchbase/protostellar/generated/search/v1/search_pb.rb +99 -0
- data/lib/couchbase/protostellar/generated/search/v1/search_services_pb.rb +30 -0
- data/lib/couchbase/protostellar/generated/transactions/v1/transactions_pb.rb +57 -0
- data/lib/couchbase/protostellar/generated/transactions/v1/transactions_services_pb.rb +36 -0
- data/lib/couchbase/protostellar/generated/view/v1/view_pb.rb +51 -0
- data/lib/couchbase/protostellar/generated/view/v1/view_services_pb.rb +30 -0
- data/lib/couchbase/protostellar/generated.rb +9 -0
- data/lib/couchbase/protostellar/management/bucket_manager.rb +67 -0
- data/lib/couchbase/protostellar/management/collection_manager.rb +94 -0
- data/lib/couchbase/protostellar/management/collection_query_index_manager.rb +124 -0
- data/lib/couchbase/protostellar/management/query_index_manager.rb +112 -0
- data/lib/couchbase/protostellar/management.rb +24 -0
- data/lib/couchbase/protostellar/request.rb +78 -0
- data/lib/couchbase/protostellar/request_behaviour.rb +42 -0
- data/lib/couchbase/protostellar/request_generator/admin/bucket.rb +124 -0
- data/lib/couchbase/protostellar/request_generator/admin/collection.rb +94 -0
- data/lib/couchbase/protostellar/request_generator/admin/query.rb +130 -0
- data/lib/couchbase/protostellar/request_generator/admin.rb +24 -0
- data/lib/couchbase/protostellar/request_generator/kv.rb +474 -0
- data/lib/couchbase/protostellar/request_generator/query.rb +133 -0
- data/lib/couchbase/protostellar/request_generator/search.rb +387 -0
- data/lib/couchbase/protostellar/request_generator.rb +26 -0
- data/lib/couchbase/protostellar/response_converter/admin/bucket.rb +55 -0
- data/lib/couchbase/protostellar/response_converter/admin/collection.rb +42 -0
- data/lib/couchbase/protostellar/response_converter/admin/query.rb +59 -0
- data/lib/couchbase/protostellar/response_converter/admin.rb +24 -0
- data/lib/couchbase/protostellar/response_converter/kv.rb +151 -0
- data/lib/couchbase/protostellar/response_converter/query.rb +84 -0
- data/lib/couchbase/protostellar/response_converter/search.rb +136 -0
- data/lib/couchbase/protostellar/response_converter.rb +26 -0
- data/lib/couchbase/protostellar/retry/action.rb +38 -0
- data/lib/couchbase/protostellar/retry/orchestrator.rb +60 -0
- data/lib/couchbase/protostellar/retry/reason.rb +67 -0
- data/lib/couchbase/protostellar/retry/strategies/best_effort.rb +49 -0
- data/lib/couchbase/protostellar/retry/strategies.rb +26 -0
- data/lib/couchbase/protostellar/retry.rb +28 -0
- data/lib/couchbase/protostellar/scope.rb +57 -0
- data/lib/couchbase/protostellar/timeout_defaults.rb +30 -0
- data/lib/couchbase/protostellar/timeouts.rb +83 -0
- data/lib/couchbase/protostellar.rb +29 -0
- data/lib/couchbase/query_options.rb +122 -0
- data/lib/couchbase/railtie.rb +47 -0
- data/lib/couchbase/raw_binary_transcoder.rb +39 -0
- data/lib/couchbase/raw_json_transcoder.rb +40 -0
- data/lib/couchbase/raw_string_transcoder.rb +42 -0
- data/lib/couchbase/scope.rb +258 -0
- data/lib/couchbase/search_options.rb +1650 -0
- data/lib/couchbase/subdoc.rb +293 -0
- data/lib/couchbase/transcoder_flags.rb +64 -0
- data/lib/couchbase/utils/generic_logger_adapter.rb +40 -0
- data/lib/couchbase/utils/stdlib_logger_adapter.rb +67 -0
- data/lib/couchbase/utils/time.rb +71 -0
- data/lib/couchbase/utils.rb +23 -0
- data/lib/couchbase/version.rb +25 -0
- data/lib/couchbase/view_options.rb +67 -0
- data/lib/couchbase.rb +30 -0
- data/lib/rails/generators/couchbase/config/config_generator.rb +29 -0
- metadata +190 -0
@@ -0,0 +1,470 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright 2020-2021 Couchbase, Inc.
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
|
17
|
+
require "couchbase/errors"
|
18
|
+
|
19
|
+
require "time"
|
20
|
+
|
21
|
+
module Couchbase
|
22
|
+
module Management
|
23
|
+
class UserManager
|
24
|
+
alias inspect to_s
|
25
|
+
|
26
|
+
# @param [Couchbase::Backend] backend
|
27
|
+
def initialize(backend)
|
28
|
+
@backend = backend
|
29
|
+
end
|
30
|
+
|
31
|
+
# Get a user
|
32
|
+
#
|
33
|
+
# @param [String] username ID of the user
|
34
|
+
# @param [GetUserOptions] options
|
35
|
+
#
|
36
|
+
# @return [UserAndMetadata]
|
37
|
+
#
|
38
|
+
# @raise [ArgumentError]
|
39
|
+
# @raise [Error::UserNotFound]
|
40
|
+
def get_user(username, options = GetUserOptions.new)
|
41
|
+
resp = @backend.user_get(options.domain, username, options.timeout)
|
42
|
+
extract_user(resp)
|
43
|
+
end
|
44
|
+
|
45
|
+
# Gets all users
|
46
|
+
#
|
47
|
+
# @return [Array<UserAndMetadata>]
|
48
|
+
def get_all_users(options = GetAllUsersOptions.new)
|
49
|
+
resp = @backend.user_get_all(options.domain, options.timeout)
|
50
|
+
resp.map { |entry| extract_user(entry) }
|
51
|
+
end
|
52
|
+
|
53
|
+
# Creates or updates a user
|
54
|
+
#
|
55
|
+
# @param [User] user the new version of the user
|
56
|
+
# @param [UpsertUserOptions] options
|
57
|
+
#
|
58
|
+
# @raise [ArgumentError]
|
59
|
+
def upsert_user(user, options = UpsertUserOptions.new)
|
60
|
+
@backend.user_upsert(
|
61
|
+
options.domain,
|
62
|
+
{
|
63
|
+
username: user.username,
|
64
|
+
display_name: user.display_name,
|
65
|
+
groups: user.groups,
|
66
|
+
password: user.password,
|
67
|
+
roles: user.roles.map do |role|
|
68
|
+
{
|
69
|
+
name: role.name,
|
70
|
+
bucket: role.bucket,
|
71
|
+
scope: role.scope,
|
72
|
+
collection: role.collection,
|
73
|
+
}
|
74
|
+
end,
|
75
|
+
}, options.timeout
|
76
|
+
)
|
77
|
+
end
|
78
|
+
|
79
|
+
# Removes a user
|
80
|
+
#
|
81
|
+
# @param [String] username ID of the user
|
82
|
+
# @param [DropUserOptions] options
|
83
|
+
def drop_user(username, options = DropUserOptions.new)
|
84
|
+
@backend.user_drop(options.domain, username, options.timeout)
|
85
|
+
end
|
86
|
+
|
87
|
+
# Gets all roles supported by the server
|
88
|
+
#
|
89
|
+
# @param [GetRolesOptions] options
|
90
|
+
#
|
91
|
+
# @return [Array<RoleAndDescription>]
|
92
|
+
def get_roles(options = GetRolesOptions.new)
|
93
|
+
resp = @backend.role_get_all(options.timeout)
|
94
|
+
resp.map do |r|
|
95
|
+
RoleAndDescription.new do |role|
|
96
|
+
role.name = r[:name]
|
97
|
+
role.display_name = r[:display_name]
|
98
|
+
role.description = r[:description]
|
99
|
+
role.bucket = r[:bucket]
|
100
|
+
role.scope = r[:scope]
|
101
|
+
role.collection = r[:collection]
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
# Changes the password of the currently authenticated user
|
107
|
+
#
|
108
|
+
# @param [ChangePasswordOptions] options
|
109
|
+
#
|
110
|
+
# @raise [ArgumentError]
|
111
|
+
def change_password(new_password, options = ChangePasswordOptions.new)
|
112
|
+
@backend.change_password(new_password, options.timeout)
|
113
|
+
end
|
114
|
+
|
115
|
+
# Gets a group
|
116
|
+
#
|
117
|
+
# @param [String] group_name name of the group to get
|
118
|
+
#
|
119
|
+
# @return [Group]
|
120
|
+
#
|
121
|
+
# @raise [ArgumentError]
|
122
|
+
# @raise [Error::GroupNotFound]
|
123
|
+
def get_group(group_name, options = GetGroupOptions.new)
|
124
|
+
resp = @backend.group_get(group_name, options.timeout)
|
125
|
+
extract_group(resp)
|
126
|
+
end
|
127
|
+
|
128
|
+
# Gets all groups
|
129
|
+
#
|
130
|
+
# @param [GetAllGroupsOptions] options
|
131
|
+
#
|
132
|
+
# @return [Array<Group>]
|
133
|
+
def get_all_groups(options = GetAllGroupsOptions.new)
|
134
|
+
resp = @backend.group_get_all(options.timeout)
|
135
|
+
resp.map { |entry| extract_group(entry) }
|
136
|
+
end
|
137
|
+
|
138
|
+
# Creates or updates a group
|
139
|
+
#
|
140
|
+
# @param [Group] group the new version of the group
|
141
|
+
# @param [UpsertGroupOptions] options
|
142
|
+
#
|
143
|
+
# @raise [ArgumentError]
|
144
|
+
# @raise [Error::GroupNotFound]
|
145
|
+
def upsert_group(group, options = UpsertGroupOptions.new)
|
146
|
+
@backend.group_upsert({
|
147
|
+
name: group.name,
|
148
|
+
description: group.description,
|
149
|
+
ldap_group_reference: group.ldap_group_reference,
|
150
|
+
roles: group.roles.map do |role|
|
151
|
+
{
|
152
|
+
name: role.name,
|
153
|
+
bucket: role.bucket,
|
154
|
+
scope: role.scope,
|
155
|
+
collection: role.collection,
|
156
|
+
}
|
157
|
+
end,
|
158
|
+
}, options.timeout)
|
159
|
+
end
|
160
|
+
|
161
|
+
# Removes a group
|
162
|
+
#
|
163
|
+
# @param [String] group_name name of the group
|
164
|
+
# @param [DropGroupOptions] options
|
165
|
+
#
|
166
|
+
# @raise [Error::GroupNotFound]
|
167
|
+
def drop_group(group_name, options = DropGroupOptions.new)
|
168
|
+
@backend.group_drop(group_name, options.timeout)
|
169
|
+
end
|
170
|
+
|
171
|
+
class GetUserOptions
|
172
|
+
# @return [:local, :external] Name of the user's domain. Defaults to +:local+
|
173
|
+
attr_accessor :domain
|
174
|
+
|
175
|
+
# @return [Integer] the time in milliseconds allowed for the operation to complete
|
176
|
+
attr_accessor :timeout
|
177
|
+
|
178
|
+
# @yieldparam [GetUserOptions] self
|
179
|
+
def initialize
|
180
|
+
@domain = :local
|
181
|
+
yield self if block_given?
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
class GetAllUsersOptions
|
186
|
+
# @return [:local, :external] Name of the user's domain. Defaults to +:local+
|
187
|
+
attr_accessor :domain
|
188
|
+
|
189
|
+
# @return [Integer] the time in milliseconds allowed for the operation to complete
|
190
|
+
attr_accessor :timeout
|
191
|
+
|
192
|
+
# @yieldparam [GetAllUsersOptions] self
|
193
|
+
def initialize
|
194
|
+
@domain = :local
|
195
|
+
yield self if block_given?
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
class UpsertUserOptions
|
200
|
+
# @return [:local, :external] Name of the user's domain. Defaults to +:local+
|
201
|
+
attr_accessor :domain
|
202
|
+
|
203
|
+
# @return [Integer] the time in milliseconds allowed for the operation to complete
|
204
|
+
attr_accessor :timeout
|
205
|
+
|
206
|
+
# @yieldparam [UpsertUserOptions] self
|
207
|
+
def initialize
|
208
|
+
@domain = :local
|
209
|
+
yield self if block_given?
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
class DropUserOptions
|
214
|
+
# @return [:local, :external] Name of the user's domain. Defaults to +:local+
|
215
|
+
attr_accessor :domain
|
216
|
+
|
217
|
+
# @return [Integer] the time in milliseconds allowed for the operation to complete
|
218
|
+
attr_accessor :timeout
|
219
|
+
|
220
|
+
# @yieldparam [DropUserOptions] self
|
221
|
+
def initialize
|
222
|
+
@domain = :local
|
223
|
+
yield self if block_given?
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
class ChangePasswordOptions
|
228
|
+
# @return [Integer] the time in milliseconds allowed for the operation to complete
|
229
|
+
attr_accessor :timeout
|
230
|
+
|
231
|
+
# @yieldparam [ChangePasswordOptions] self
|
232
|
+
def initialize
|
233
|
+
yield self if block_given?
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
class GetRolesOptions
|
238
|
+
# @return [Integer] the time in milliseconds allowed for the operation to complete
|
239
|
+
attr_accessor :timeout
|
240
|
+
|
241
|
+
# @yieldparam [GetRolesOptions] self
|
242
|
+
def initialize
|
243
|
+
yield self if block_given?
|
244
|
+
end
|
245
|
+
end
|
246
|
+
|
247
|
+
class GetGroupOptions
|
248
|
+
# @return [Integer] the time in milliseconds allowed for the operation to complete
|
249
|
+
attr_accessor :timeout
|
250
|
+
|
251
|
+
# @yieldparam [GetGroupOptions] self
|
252
|
+
def initialize
|
253
|
+
yield self if block_given?
|
254
|
+
end
|
255
|
+
end
|
256
|
+
|
257
|
+
class GetAllGroupsOptions
|
258
|
+
# @return [Integer] the time in milliseconds allowed for the operation to complete
|
259
|
+
attr_accessor :timeout
|
260
|
+
|
261
|
+
# @yieldparam [GetAllGroupsOptions] self
|
262
|
+
def initialize
|
263
|
+
yield self if block_given?
|
264
|
+
end
|
265
|
+
end
|
266
|
+
|
267
|
+
class UpsertGroupOptions
|
268
|
+
# @return [Integer] the time in milliseconds allowed for the operation to complete
|
269
|
+
attr_accessor :timeout
|
270
|
+
|
271
|
+
# @yieldparam [UpsertGroupOptions] self
|
272
|
+
def initialize
|
273
|
+
yield self if block_given?
|
274
|
+
end
|
275
|
+
end
|
276
|
+
|
277
|
+
class DropGroupOptions
|
278
|
+
# @return [Integer] the time in milliseconds allowed for the operation to complete
|
279
|
+
attr_accessor :timeout
|
280
|
+
|
281
|
+
# @yieldparam [DropGroupOptions] self
|
282
|
+
def initialize
|
283
|
+
yield self if block_given?
|
284
|
+
end
|
285
|
+
end
|
286
|
+
|
287
|
+
private
|
288
|
+
|
289
|
+
def extract_group(resp)
|
290
|
+
Group.new do |group|
|
291
|
+
group.name = resp[:name]
|
292
|
+
group.description = resp[:description]
|
293
|
+
group.ldap_group_reference = resp[:ldap_group_reference]
|
294
|
+
if resp[:roles]
|
295
|
+
group.roles = resp[:roles].map do |r|
|
296
|
+
Role.new do |role|
|
297
|
+
role.name = r[:name]
|
298
|
+
role.bucket = r[:bucket]
|
299
|
+
role.scope = r[:scope]
|
300
|
+
role.collection = r[:collection]
|
301
|
+
end
|
302
|
+
end
|
303
|
+
end
|
304
|
+
end
|
305
|
+
end
|
306
|
+
|
307
|
+
def extract_user(resp)
|
308
|
+
UserAndMetadata.new do |user|
|
309
|
+
user.domain = resp[:domain]
|
310
|
+
user.username = resp[:username]
|
311
|
+
user.display_name = resp[:display_name]
|
312
|
+
user.groups = resp[:groups]
|
313
|
+
user.external_groups = resp[:external_groups]
|
314
|
+
user.password_changed = Time.parse(resp[:password_changed]) if resp[:password_changed]
|
315
|
+
if resp[:roles]
|
316
|
+
user.roles = resp[:roles].map do |r|
|
317
|
+
Role.new do |role|
|
318
|
+
role.name = r[:name]
|
319
|
+
role.bucket = r[:bucket]
|
320
|
+
role.scope = r[:scope]
|
321
|
+
role.collection = r[:collection]
|
322
|
+
end
|
323
|
+
end
|
324
|
+
end
|
325
|
+
if resp[:effective_roles]
|
326
|
+
user.effective_roles = resp[:effective_roles].map do |r|
|
327
|
+
RoleAndOrigins.new do |role|
|
328
|
+
role.name = r[:name]
|
329
|
+
role.bucket = r[:bucket]
|
330
|
+
role.scope = r[:scope]
|
331
|
+
role.collection = r[:collection]
|
332
|
+
if r[:origins]
|
333
|
+
role.origins = r[:origins].map do |o|
|
334
|
+
Origin.new do |origin|
|
335
|
+
origin.type = o[:type]
|
336
|
+
origin.name = o[:name]
|
337
|
+
end
|
338
|
+
end
|
339
|
+
end
|
340
|
+
end
|
341
|
+
end
|
342
|
+
end
|
343
|
+
end
|
344
|
+
end
|
345
|
+
end
|
346
|
+
|
347
|
+
class Role
|
348
|
+
# @return [String]
|
349
|
+
attr_accessor :name
|
350
|
+
|
351
|
+
# @return [String]
|
352
|
+
attr_accessor :bucket
|
353
|
+
|
354
|
+
# @return [String]
|
355
|
+
attr_accessor :scope
|
356
|
+
|
357
|
+
# @return [String]
|
358
|
+
attr_accessor :collection
|
359
|
+
|
360
|
+
# @yieldparam [Role] self
|
361
|
+
def initialize
|
362
|
+
yield self if block_given?
|
363
|
+
end
|
364
|
+
end
|
365
|
+
|
366
|
+
class RoleAndDescription < Role
|
367
|
+
# @return [String]
|
368
|
+
attr_accessor :display_name
|
369
|
+
|
370
|
+
# @return [String]
|
371
|
+
attr_accessor :description
|
372
|
+
|
373
|
+
# @yieldparam [RoleAndDescription] self
|
374
|
+
def initialize
|
375
|
+
super
|
376
|
+
yield self if block_given?
|
377
|
+
end
|
378
|
+
end
|
379
|
+
|
380
|
+
class Origin
|
381
|
+
# @return [String]
|
382
|
+
attr_writer :type
|
383
|
+
|
384
|
+
# @return [String]
|
385
|
+
attr_writer :name
|
386
|
+
|
387
|
+
# @yieldparam [Origin] self
|
388
|
+
def initialize
|
389
|
+
yield self if block_given?
|
390
|
+
end
|
391
|
+
end
|
392
|
+
|
393
|
+
class RoleAndOrigins < Role
|
394
|
+
# @return [Array<Origin>]
|
395
|
+
attr_writer :origins
|
396
|
+
|
397
|
+
# @yieldparam [RoleAndOrigins] self
|
398
|
+
def initialize
|
399
|
+
super
|
400
|
+
@origins = []
|
401
|
+
yield self if block_given?
|
402
|
+
end
|
403
|
+
end
|
404
|
+
|
405
|
+
class User
|
406
|
+
# @return [String]
|
407
|
+
attr_accessor :username
|
408
|
+
|
409
|
+
# @return [String]
|
410
|
+
attr_accessor :display_name
|
411
|
+
|
412
|
+
# @return [Array<String>]
|
413
|
+
attr_accessor :groups
|
414
|
+
|
415
|
+
# @return [Array<Role>]
|
416
|
+
attr_accessor :roles
|
417
|
+
|
418
|
+
# @return [String]
|
419
|
+
attr_accessor :password
|
420
|
+
|
421
|
+
# @yieldparam [User] self
|
422
|
+
def initialize
|
423
|
+
@groups = []
|
424
|
+
@roles = []
|
425
|
+
yield self if block_given?
|
426
|
+
end
|
427
|
+
end
|
428
|
+
|
429
|
+
class UserAndMetadata < User
|
430
|
+
# @return [:local, :external]
|
431
|
+
attr_accessor :domain
|
432
|
+
|
433
|
+
# @return [Array<RoleAndOrigins>]
|
434
|
+
attr_accessor :effective_roles
|
435
|
+
|
436
|
+
# @return [Time]
|
437
|
+
attr_accessor :password_changed
|
438
|
+
|
439
|
+
# @return [Array<String>]
|
440
|
+
attr_accessor :external_groups
|
441
|
+
|
442
|
+
# @yieldparam [UserAndMetadata] self
|
443
|
+
def initialize
|
444
|
+
super
|
445
|
+
@effective_roles = []
|
446
|
+
yield self if block_given?
|
447
|
+
end
|
448
|
+
end
|
449
|
+
|
450
|
+
class Group
|
451
|
+
# @return [String]
|
452
|
+
attr_accessor :name
|
453
|
+
|
454
|
+
# @return [String]
|
455
|
+
attr_accessor :description
|
456
|
+
|
457
|
+
# @return [Array<Role>]
|
458
|
+
attr_accessor :roles
|
459
|
+
|
460
|
+
# @return [String]
|
461
|
+
attr_accessor :ldap_group_reference
|
462
|
+
|
463
|
+
# @yieldparam [Group] self
|
464
|
+
def initialize
|
465
|
+
@roles = []
|
466
|
+
yield self if block_given?
|
467
|
+
end
|
468
|
+
end
|
469
|
+
end
|
470
|
+
end
|
@@ -0,0 +1,239 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright 2020-2021 Couchbase, Inc.
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
|
17
|
+
require "couchbase/errors"
|
18
|
+
|
19
|
+
module Couchbase
|
20
|
+
module Management
|
21
|
+
# The View Index Manager interface contains the means for managing design documents used for views.
|
22
|
+
#
|
23
|
+
# A design document belongs to either the "development" or "production" namespace. A development document has a name
|
24
|
+
# that starts with "dev_". This is an implementation detail we've chosen to hide from consumers of this API.
|
25
|
+
# Document names presented to the user (returned from the "get" and "get all" methods, for example) always have the
|
26
|
+
# "dev_" prefix stripped.
|
27
|
+
#
|
28
|
+
# Whenever the user passes a design document name to any method of this API, the user may refer to the document
|
29
|
+
# using the "dev_" prefix regardless of whether the user is referring to a development document or production
|
30
|
+
# document. The "dev_" prefix is always stripped from user input, and the actual document name passed to the server
|
31
|
+
# is determined by the "namespace" argument.
|
32
|
+
#
|
33
|
+
# All methods (except publish) have a required "namespace" argument indicating whether the operation targets a
|
34
|
+
# development document or a production document. The type of this argument is [Symbol] with allowed values
|
35
|
+
# +:production+ and +:development+.
|
36
|
+
class ViewIndexManager
|
37
|
+
alias inspect to_s
|
38
|
+
|
39
|
+
# @return [String] name of the bucket
|
40
|
+
attr_accessor :bucket_name
|
41
|
+
|
42
|
+
# @param [Couchbase::Backend] backend
|
43
|
+
# @param [String] bucket_name
|
44
|
+
def initialize(backend, bucket_name)
|
45
|
+
@backend = backend
|
46
|
+
@bucket_name = bucket_name
|
47
|
+
end
|
48
|
+
|
49
|
+
# Fetches a design document from the server
|
50
|
+
#
|
51
|
+
# @param [String] name the name of the design document
|
52
|
+
# @param [:production, :development] namespace the namespace
|
53
|
+
# @param [GetDesignDocumentOptions] options
|
54
|
+
#
|
55
|
+
# @return [DesignDocument]
|
56
|
+
#
|
57
|
+
# @raise [Error::DesignDocumentNotFound]
|
58
|
+
def get_design_document(name, namespace, options = GetDesignDocumentOptions.new)
|
59
|
+
resp = @backend.view_index_get(@bucket_name, name, namespace, options.timeout)
|
60
|
+
extract_design_document(resp)
|
61
|
+
end
|
62
|
+
|
63
|
+
# Fetches all design documents from the server
|
64
|
+
#
|
65
|
+
# @param [:production, :development] namespace the namespace
|
66
|
+
# @param [GetAllDesignDocumentsOptions] options
|
67
|
+
#
|
68
|
+
# @return [Array<DesignDocument>]
|
69
|
+
def get_all_design_documents(namespace, options = GetAllDesignDocumentsOptions.new)
|
70
|
+
resp = @backend.view_index_get_all(@bucket_name, namespace, options.timeout)
|
71
|
+
resp.map do |entry|
|
72
|
+
extract_design_document(entry)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
# Updates or inserts the design document
|
77
|
+
#
|
78
|
+
# @param [DesignDocument] document
|
79
|
+
# @param [:production, :development] namespace the namespace
|
80
|
+
# @param [UpsertDesignDocumentOptions] options
|
81
|
+
#
|
82
|
+
# @return [void]
|
83
|
+
def upsert_design_document(document, namespace, options = UpsertDesignDocumentOptions.new)
|
84
|
+
@backend.view_index_upsert(@bucket_name, {
|
85
|
+
name: document.name,
|
86
|
+
views: document.views.map do |name, view|
|
87
|
+
{
|
88
|
+
name: name,
|
89
|
+
map: view.map_function,
|
90
|
+
reduce: view.reduce_function,
|
91
|
+
}
|
92
|
+
end,
|
93
|
+
}, namespace, options.timeout)
|
94
|
+
end
|
95
|
+
|
96
|
+
# Removes the design document
|
97
|
+
#
|
98
|
+
# @param [String] name design document name
|
99
|
+
# @param [:production, :development] namespace the namespace
|
100
|
+
# @param [DropDesignDocumentOptions] options
|
101
|
+
#
|
102
|
+
# @return [void]
|
103
|
+
#
|
104
|
+
# @raise [Error::DesignDocumentNotFound]
|
105
|
+
def drop_design_document(name, namespace, options = DropDesignDocumentOptions.new)
|
106
|
+
@backend.view_index_drop(@bucket_name, name, namespace, options.timeout)
|
107
|
+
end
|
108
|
+
|
109
|
+
# Publishes the design document.
|
110
|
+
#
|
111
|
+
# This method is equivalent to getting a document from the development namespace and upserting
|
112
|
+
# it to the production namespace.
|
113
|
+
#
|
114
|
+
# @param [String] name design document name
|
115
|
+
# @param [PublishDesignDocumentOptions] options
|
116
|
+
#
|
117
|
+
# @return [void]
|
118
|
+
#
|
119
|
+
# @raise [ArgumentError]
|
120
|
+
# @raise [Error::DesignDocumentNotFound]
|
121
|
+
def publish_design_document(name, options = PublishDesignDocumentOptions.new)
|
122
|
+
document = get_design_document(name, :development, GetDesignDocumentOptions.new { |o| o.timeout = options.timeout })
|
123
|
+
upsert_design_document(document, :production, UpsertDesignDocumentOptions.new { |o| o.timeout = options.timeout })
|
124
|
+
end
|
125
|
+
|
126
|
+
class GetDesignDocumentOptions
|
127
|
+
# @return [Integer] the time in milliseconds allowed for the operation to complete
|
128
|
+
attr_accessor :timeout
|
129
|
+
|
130
|
+
# @yieldparam [GetDesignDocumentOptions] self
|
131
|
+
def initialize
|
132
|
+
yield self if block_given?
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
class GetAllDesignDocumentsOptions
|
137
|
+
# @return [Integer] the time in milliseconds allowed for the operation to complete
|
138
|
+
attr_accessor :timeout
|
139
|
+
|
140
|
+
# @yieldparam [GetAllDesignDocumentsOptions] self
|
141
|
+
def initialize
|
142
|
+
yield self if block_given?
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
class UpsertDesignDocumentOptions
|
147
|
+
# @return [Integer] the time in milliseconds allowed for the operation to complete
|
148
|
+
attr_accessor :timeout
|
149
|
+
|
150
|
+
# @yieldparam [UpsertDesignDocumentOptions] self
|
151
|
+
def initialize
|
152
|
+
yield self if block_given?
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
class DropDesignDocumentOptions
|
157
|
+
# @return [Integer] the time in milliseconds allowed for the operation to complete
|
158
|
+
attr_accessor :timeout
|
159
|
+
|
160
|
+
# @yieldparam [DropDesignDocumentOptions] self
|
161
|
+
def initialize
|
162
|
+
yield self if block_given?
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
class PublishDesignDocumentOptions
|
167
|
+
# @return [Integer] the time in milliseconds allowed for the operation to complete
|
168
|
+
attr_accessor :timeout
|
169
|
+
|
170
|
+
# @yieldparam [PublishDesignDocumentOptions] self
|
171
|
+
def initialize
|
172
|
+
yield self if block_given?
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
private
|
177
|
+
|
178
|
+
def extract_design_document(resp)
|
179
|
+
DesignDocument.new do |design_document|
|
180
|
+
design_document.name = resp[:name]
|
181
|
+
design_document.namespace = resp[:namespace]
|
182
|
+
resp[:views].each do |name, view_resp|
|
183
|
+
design_document.views[name] = View.new(view_resp[:map], view_resp[:reduce])
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
class View
|
190
|
+
# @return [String] name of the view
|
191
|
+
attr_accessor :view
|
192
|
+
|
193
|
+
# @return [String] map function in javascript as String
|
194
|
+
attr_accessor :map_function
|
195
|
+
alias map map_function
|
196
|
+
|
197
|
+
# @return [String] reduce function in javascript as String
|
198
|
+
attr_accessor :reduce_function
|
199
|
+
alias reduce reduce_function
|
200
|
+
|
201
|
+
# @return [Boolean] true if map function is defined
|
202
|
+
def has_map?
|
203
|
+
!@map_function.nil?
|
204
|
+
end
|
205
|
+
|
206
|
+
# @return [Boolean] true if map function is defined
|
207
|
+
def has_reduce?
|
208
|
+
!@reduce_function.nil?
|
209
|
+
end
|
210
|
+
|
211
|
+
# @param [String] map
|
212
|
+
# @param [String] reduce
|
213
|
+
#
|
214
|
+
# @yieldparam [View] self
|
215
|
+
def initialize(map = nil, reduce = nil)
|
216
|
+
@map_function = map
|
217
|
+
@reduce_function = reduce
|
218
|
+
yield self if block_given?
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
class DesignDocument
|
223
|
+
# @return [String] name
|
224
|
+
attr_accessor :name
|
225
|
+
|
226
|
+
# @return [Hash<String => View>]
|
227
|
+
attr_accessor :views
|
228
|
+
|
229
|
+
# @return [:production, :development]
|
230
|
+
attr_accessor :namespace
|
231
|
+
|
232
|
+
# @yieldparam [DesignDocument] self
|
233
|
+
def initialize
|
234
|
+
@views = {}
|
235
|
+
yield self if block_given?
|
236
|
+
end
|
237
|
+
end
|
238
|
+
end
|
239
|
+
end
|