Skip to content

Commit 1d5a118

Browse files
authored
Merge pull request #73 from appbaseio/feat/query-translate
feat: Implement RS API
2 parents 6b19571 + d61bca3 commit 1d5a118

18 files changed

Lines changed: 236 additions & 100 deletions

File tree

main.go

Lines changed: 34 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -172,24 +172,30 @@ func main() {
172172
// ES v7 and v6 clients
173173
util.NewClient()
174174
// map of specific plugins
175-
sequencedPlugins := []string{"rules.so", "functions.so", "querytranslate.so", "analytics.so"}
175+
sequencedPlugins := []string{"rules.so", "functions.so", "analytics.so"}
176176
sequencedPluginsByPath := make(map[string]string)
177177

178-
var elasticSearchPath string
178+
var elasticSearchPath, reactiveSearchPath string
179179
elasticSearchMiddleware := make([]middleware.Middleware, 0)
180+
reactiveSearchMiddleware := make([]middleware.Middleware, 0)
180181
err := filepath.Walk(pluginDir, func(path string, info os.FileInfo, err error) error {
181182
if err != nil {
182183
return err
183184
}
184185
if !info.IsDir() && filepath.Ext(info.Name()) == ".so" && info.Name() != "elasticsearch.so" {
185-
if util.IsExists(info.Name(), sequencedPlugins) {
186-
sequencedPluginsByPath[info.Name()] = path
187-
} else {
188-
mw, err1 := LoadPluginFromFile(router, path)
189-
if err1 != nil {
190-
return err1
186+
if info.Name() != "querytranslate.so" {
187+
if util.IsExists(info.Name(), sequencedPlugins) {
188+
sequencedPluginsByPath[info.Name()] = path
189+
} else {
190+
plugin, err1 := LoadPluginFromFile(router, path)
191+
if err1 != nil {
192+
return err1
193+
}
194+
reactiveSearchMiddleware = append(reactiveSearchMiddleware, plugin.RSMiddleware()...)
195+
elasticSearchMiddleware = append(elasticSearchMiddleware, plugin.ESMiddleware()...)
191196
}
192-
elasticSearchMiddleware = append(elasticSearchMiddleware, mw...)
197+
} else {
198+
reactiveSearchPath = path
193199
}
194200
} else if info.Name() == "elasticsearch.so" {
195201
elasticSearchPath = path
@@ -200,13 +206,18 @@ func main() {
200206
for _, pluginName := range sequencedPlugins {
201207
path, _ := sequencedPluginsByPath[pluginName]
202208
if path != "" {
203-
mw, err := LoadPluginFromFile(router, path)
209+
plugin, err := LoadPluginFromFile(router, path)
204210
if err != nil {
205211
log.Fatal("error loading plugins: ", err)
206212
}
207-
elasticSearchMiddleware = append(elasticSearchMiddleware, mw...)
213+
elasticSearchMiddleware = append(elasticSearchMiddleware, plugin.ESMiddleware()...)
214+
reactiveSearchMiddleware = append(reactiveSearchMiddleware, plugin.RSMiddleware()...)
208215
}
209216
}
217+
// Load ReactiveSearch plugin
218+
if reactiveSearchPath != "" {
219+
LoadRSPluginFromFile(router, reactiveSearchPath, reactiveSearchMiddleware)
220+
}
210221
LoadESPluginFromFile(router, elasticSearchPath, elasticSearchMiddleware)
211222
if err != nil {
212223
log.Fatal("error loading plugins: ", err)
@@ -242,7 +253,7 @@ func LoadPIFromFile(path string) (plugin.Symbol, error) {
242253
}
243254

244255
// LoadPluginFromFile loads a plugin at the given location
245-
func LoadPluginFromFile(router *mux.Router, path string) ([]middleware.Middleware, error) {
256+
func LoadPluginFromFile(router *mux.Router, path string) (plugins.Plugin, error) {
246257
pi, err2 := LoadPIFromFile(path)
247258
if err2 != nil {
248259
return nil, err2
@@ -253,7 +264,7 @@ func LoadPluginFromFile(router *mux.Router, path string) ([]middleware.Middlewar
253264
if err3 != nil {
254265
return nil, err3
255266
}
256-
return p.ESMiddleware(), nil
267+
return p, nil
257268
}
258269

259270
func LoadESPluginFromFile(router *mux.Router, path string, mw []middleware.Middleware) error {
@@ -266,6 +277,16 @@ func LoadESPluginFromFile(router *mux.Router, path string, mw []middleware.Middl
266277
return plugins.LoadESPlugin(router, p, mw)
267278
}
268279

280+
func LoadRSPluginFromFile(router *mux.Router, path string, mw []middleware.Middleware) error {
281+
pi, err2 := LoadPIFromFile(path)
282+
if err2 != nil {
283+
return err2
284+
}
285+
var p plugins.RSPlugin
286+
p = *pi.(*plugins.RSPlugin)
287+
return plugins.LoadRSPlugin(router, p, mw)
288+
}
289+
269290
// LoadEnvFromFile loads env vars from envFile. Envs in the file
270291
// should be in KEY=VALUE format.
271292
func LoadEnvFromFile(envFile string) error {

model/category/category.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ const (
3434
Suggestions
3535
Auth
3636
Functions
37+
ReactiveSearch
3738
)
3839

3940
// String is an implementation of Stringer interface that returns the string representation of category.Categories.
@@ -54,6 +55,7 @@ func (c Category) String() string {
5455
"suggestions",
5556
"auth",
5657
"functions",
58+
"reactivesearch",
5759
}[c]
5860
}
5961

@@ -95,6 +97,8 @@ func (c *Category) UnmarshalJSON(bytes []byte) error {
9597
*c = Auth
9698
case Functions.String():
9799
*c = Functions
100+
case ReactiveSearch.String():
101+
*c = ReactiveSearch
98102
default:
99103
return fmt.Errorf("invalid category encountered: %v", category)
100104
}
@@ -135,6 +139,8 @@ func (c Category) MarshalJSON() ([]byte, error) {
135139
category = Auth.String()
136140
case Functions:
137141
category = Functions.String()
142+
case ReactiveSearch:
143+
category = ReactiveSearch.String()
138144
default:
139145
return nil, fmt.Errorf("invalid category encountered: %v" + c.String())
140146
}
@@ -152,6 +158,11 @@ func (c Category) IsFromES() bool {
152158
c == Misc
153159
}
154160

161+
// IsFromRS checks whether the category is of the reactivesearch category.
162+
func (c Category) IsFromRS() bool {
163+
return c == ReactiveSearch
164+
}
165+
155166
// HasACL checks whether the given acl is a value in the category categories.
156167
func (c Category) HasACL(a acl.ACL) bool {
157168
return acl.Contains(c.ACLs(), a)

model/permission/defaults.go

Lines changed: 35 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ var (
2828
category.Suggestions,
2929
category.Auth,
3030
category.Functions,
31+
category.ReactiveSearch,
3132
}
3233

3334
defaultOps = []op.Operation{
@@ -41,40 +42,42 @@ var (
4142
}
4243

4344
defaultLimits = Limits{
44-
IPLimit: 7200,
45-
DocsLimit: 10,
46-
SearchLimit: 10,
47-
IndicesLimit: 10,
48-
CatLimit: 10,
49-
ClustersLimit: 10,
50-
MiscLimit: 10,
51-
UserLimit: 10,
52-
PermissionLimit: 10,
53-
AnalyticsLimit: 10,
54-
RulesLimit: 10,
55-
TemplatesLimit: 10,
56-
SuggestionsLimit: 10,
57-
StreamsLimit: 10,
58-
AuthLimit: 10,
59-
FunctionsLimit: 10,
45+
IPLimit: 7200,
46+
DocsLimit: 10,
47+
SearchLimit: 10,
48+
IndicesLimit: 10,
49+
CatLimit: 10,
50+
ClustersLimit: 10,
51+
MiscLimit: 10,
52+
UserLimit: 10,
53+
PermissionLimit: 10,
54+
AnalyticsLimit: 10,
55+
RulesLimit: 10,
56+
TemplatesLimit: 10,
57+
SuggestionsLimit: 10,
58+
StreamsLimit: 10,
59+
AuthLimit: 10,
60+
FunctionsLimit: 10,
61+
ReactiveSearchLimit: 10,
6062
}
6163

6264
defaultAdminLimits = Limits{
63-
IPLimit: 7200,
64-
DocsLimit: 30,
65-
SearchLimit: 30,
66-
IndicesLimit: 30,
67-
CatLimit: 30,
68-
ClustersLimit: 30,
69-
MiscLimit: 30,
70-
UserLimit: 30,
71-
PermissionLimit: 30,
72-
AnalyticsLimit: 30,
73-
RulesLimit: 30,
74-
TemplatesLimit: 30,
75-
SuggestionsLimit: 30,
76-
StreamsLimit: 30,
77-
AuthLimit: 30,
78-
FunctionsLimit: 30,
65+
IPLimit: 7200,
66+
DocsLimit: 30,
67+
SearchLimit: 30,
68+
IndicesLimit: 30,
69+
CatLimit: 30,
70+
ClustersLimit: 30,
71+
MiscLimit: 30,
72+
UserLimit: 30,
73+
PermissionLimit: 30,
74+
AnalyticsLimit: 30,
75+
RulesLimit: 30,
76+
TemplatesLimit: 30,
77+
SuggestionsLimit: 30,
78+
StreamsLimit: 30,
79+
AuthLimit: 30,
80+
FunctionsLimit: 30,
81+
ReactiveSearchLimit: 30,
7982
}
8083
)

model/permission/permission.go

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -54,22 +54,23 @@ type Permission struct {
5454

5555
// Limits defines the rate limits for each category.
5656
type Limits struct {
57-
IPLimit int64 `json:"ip_limit"`
58-
DocsLimit int64 `json:"docs_limit"`
59-
SearchLimit int64 `json:"search_limit"`
60-
IndicesLimit int64 `json:"indices_limit"`
61-
CatLimit int64 `json:"cat_limit"`
62-
ClustersLimit int64 `json:"clusters_limit"`
63-
MiscLimit int64 `json:"misc_limit"`
64-
UserLimit int64 `json:"user_limit"`
65-
PermissionLimit int64 `json:"permission_limit"`
66-
AnalyticsLimit int64 `json:"analytics_limit"`
67-
RulesLimit int64 `json:"rules_limit"`
68-
TemplatesLimit int64 `json:"templates_limit"`
69-
SuggestionsLimit int64 `json:"suggestions_limit"`
70-
StreamsLimit int64 `json:"streams_limit"`
71-
AuthLimit int64 `json:"auth_limit"`
72-
FunctionsLimit int64 `json:"functions_limit"`
57+
IPLimit int64 `json:"ip_limit"`
58+
DocsLimit int64 `json:"docs_limit"`
59+
SearchLimit int64 `json:"search_limit"`
60+
IndicesLimit int64 `json:"indices_limit"`
61+
CatLimit int64 `json:"cat_limit"`
62+
ClustersLimit int64 `json:"clusters_limit"`
63+
MiscLimit int64 `json:"misc_limit"`
64+
UserLimit int64 `json:"user_limit"`
65+
PermissionLimit int64 `json:"permission_limit"`
66+
AnalyticsLimit int64 `json:"analytics_limit"`
67+
RulesLimit int64 `json:"rules_limit"`
68+
TemplatesLimit int64 `json:"templates_limit"`
69+
SuggestionsLimit int64 `json:"suggestions_limit"`
70+
StreamsLimit int64 `json:"streams_limit"`
71+
AuthLimit int64 `json:"auth_limit"`
72+
FunctionsLimit int64 `json:"functions_limit"`
73+
ReactiveSearchLimit int64 `json:"reactivesearch_limit"`
7374
}
7475

7576
// Options is a function type used to define a permission's properties.
@@ -468,6 +469,8 @@ func (p *Permission) GetLimitFor(c category.Category) (int64, error) {
468469
return p.Limits.StreamsLimit, nil
469470
case category.Functions:
470471
return p.Limits.FunctionsLimit, nil
472+
case category.ReactiveSearch:
473+
return p.Limits.ReactiveSearchLimit, nil
471474
default:
472475
return -1, fmt.Errorf(`we do not rate limit "%s" category`, c)
473476
}
@@ -584,6 +587,10 @@ func (p *Permission) GetPatch(rolePatched bool) (map[string]interface{}, error)
584587
limits["functions_limit"] = p.Limits.FunctionsLimit
585588
}
586589

590+
if p.Limits.ReactiveSearchLimit != 0 {
591+
limits["reactivesearch_limit"] = p.Limits.ReactiveSearchLimit
592+
}
593+
587594
patch["limits"] = limits
588595
}
589596
if p.Description != "" {

model/queryid/queryid.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package queryid
2+
3+
import (
4+
"context"
5+
6+
"github.com/appbaseio/arc/errors"
7+
)
8+
9+
type contextKey string
10+
11+
// ctxKey is a key against which a slice of queryids are stored in the context.
12+
const ctxKey = contextKey("queryid")
13+
14+
// NewContext returns a new context with the given queryids.
15+
func NewContext(ctx context.Context, queryids []string) context.Context {
16+
return context.WithValue(ctx, ctxKey, queryids)
17+
}
18+
19+
// FromContext retrieves the slice of queryids stored against the queryid.CtxKey from the context.
20+
func FromContext(ctx context.Context) ([]string, error) {
21+
ctxQueryIds := ctx.Value(ctxKey)
22+
if ctxQueryIds == nil {
23+
return nil, errors.NewNotFoundInContextError("queryid")
24+
}
25+
reqQueryIds, ok := ctxQueryIds.([]string)
26+
if !ok {
27+
return nil, errors.NewInvalidCastError("ctxQueryIds", "[]string")
28+
}
29+
return reqQueryIds, nil
30+
}

model/user/defaults.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ var (
2727
category.Templates,
2828
category.Suggestions,
2929
category.Functions,
30+
category.ReactiveSearch,
3031
category.Auth,
3132
}
3233

plugins/auth/auth.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,3 +135,8 @@ func (a *Auth) Routes() []plugins.Route {
135135
func (a *Auth) ESMiddleware() []middleware.Middleware {
136136
return make([]middleware.Middleware, 0)
137137
}
138+
139+
// Default empty middleware array function
140+
func (a *Auth) RSMiddleware() []middleware.Middleware {
141+
return make([]middleware.Middleware, 0)
142+
}

plugins/auth/e2e_test.go

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ var adminCategories = []category.Category{
2727
category.Suggestions,
2828
category.Auth,
2929
category.Functions,
30+
category.ReactiveSearch,
3031
}
3132

3233
var adminOps = []op.Operation{
@@ -36,22 +37,23 @@ var adminOps = []op.Operation{
3637
}
3738

3839
var defaultAdminLimits = permission.Limits{
39-
IPLimit: 7200,
40-
DocsLimit: 30,
41-
SearchLimit: 30,
42-
IndicesLimit: 30,
43-
CatLimit: 30,
44-
ClustersLimit: 30,
45-
MiscLimit: 30,
46-
UserLimit: 30,
47-
PermissionLimit: 30,
48-
AnalyticsLimit: 30,
49-
RulesLimit: 30,
50-
TemplatesLimit: 30,
51-
SuggestionsLimit: 30,
52-
StreamsLimit: 30,
53-
AuthLimit: 30,
54-
FunctionsLimit: 30,
40+
IPLimit: 7200,
41+
DocsLimit: 30,
42+
SearchLimit: 30,
43+
IndicesLimit: 30,
44+
CatLimit: 30,
45+
ClustersLimit: 30,
46+
MiscLimit: 30,
47+
UserLimit: 30,
48+
PermissionLimit: 30,
49+
AnalyticsLimit: 30,
50+
RulesLimit: 30,
51+
TemplatesLimit: 30,
52+
SuggestionsLimit: 30,
53+
StreamsLimit: 30,
54+
AuthLimit: 30,
55+
FunctionsLimit: 30,
56+
ReactiveSearchLimit: 30,
5557
}
5658

5759
var createPermissionResponse = map[string]interface{}{

plugins/auth/main/auth.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package main
22

3-
import "github.com/appbaseio/arc/plugins/auth"
4-
import "github.com/appbaseio/arc/plugins"
3+
import (
4+
"github.com/appbaseio/arc/plugins"
5+
"github.com/appbaseio/arc/plugins/auth"
6+
)
57

68
var PluginInstance plugins.Plugin = auth.Instance()

0 commit comments

Comments
 (0)