From 29a84ae4f652d83f3c7efb7f59048d5b37605075 Mon Sep 17 00:00:00 2001 From: Petyo Stoyanov Date: Thu, 11 Apr 2024 09:12:14 +0300 Subject: [PATCH 1/2] [ID-70] Improve Get Legacy Events API (#71) * Update CHANGELOG.md * Pass nil context * Update mongo driver * Find with context * Bigger timeout * Again - timeout --------- Co-authored-by: Petyo Stoyanov --- CHANGELOG.md | 2 ++ driven/storage/adapter.go | 10 ++++++---- driven/storage/adapter_locations.go | 3 ++- driven/storage/adapter_unitcalendar.go | 2 +- driven/storage/collection.go | 19 ++++++++++++++++--- go.mod | 8 ++++---- go.sum | 23 ++++++++--------------- 7 files changed, 39 insertions(+), 28 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8aea2744..acb34507 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +### Fixed +- Improve Get Legacy Events API [#70](https://github.com/rokwire/gateway-building-block/issues/70) [2.4.3] - 2024-04-08 ### Fixed diff --git a/driven/storage/adapter.go b/driven/storage/adapter.go index 721cfaff..d74d3424 100644 --- a/driven/storage/adapter.go +++ b/driven/storage/adapter.go @@ -187,7 +187,7 @@ func (a *Adapter) loadConfigs() ([]model.Config, error) { filter := bson.M{} var configs []model.Config - err := a.db.configs.Find(a.context, filter, &configs, nil) + err := a.db.configs.FindWithContext(a.context, filter, &configs, nil) if err != nil { return nil, errors.WrapErrorAction(logutils.ActionFind, model.TypeConfig, nil, err) } @@ -283,7 +283,8 @@ func (a *Adapter) DeleteConfig(id string) error { func (a *Adapter) FindLegacyEventItems(context TransactionContext) ([]model.LegacyEventItem, error) { filter := bson.M{} var data []model.LegacyEventItem - err := a.db.legacyEvents.Find(context, filter, &data, nil) + timeout := 15 * time.Second //15 seconds timeout + err := a.db.legacyEvents.FindWithParams(context, filter, &data, nil, &timeout) if err != nil { return nil, errors.WrapErrorAction(logutils.ActionFind, model.TypeExample, filterArgs(nil), err) } @@ -353,7 +354,8 @@ func (a *Adapter) DeleteLegacyEventsByIDsAndCreator(context TransactionContext, func (a *Adapter) FindAllLegacyEvents() ([]model.LegacyEvent, error) { filter := bson.M{} var list []model.LegacyEventItem - err := a.db.legacyEvents.Find(a.context, filter, &list, nil) + timeout := 15 * time.Second //15 seconds timeout + err := a.db.legacyEvents.FindWithParams(nil, filter, &list, nil, &timeout) if err != nil { return nil, err } @@ -441,7 +443,7 @@ func (a *Adapter) RemoveWebtoolsBlacklistData(dataSourceIDs []string, dataCalend func (a *Adapter) FindWebtoolsBlacklistData() ([]model.WebToolsItem, error) { filterSource := bson.M{} var dataSource []model.WebToolsItem - err := a.db.webtoolsBlacklistItems.Find(a.context, filterSource, &dataSource, nil) + err := a.db.webtoolsBlacklistItems.FindWithContext(a.context, filterSource, &dataSource, nil) if err != nil { return nil, err } diff --git a/driven/storage/adapter_locations.go b/driven/storage/adapter_locations.go index e4a36939..febf9968 100644 --- a/driven/storage/adapter_locations.go +++ b/driven/storage/adapter_locations.go @@ -2,6 +2,7 @@ package storage import ( "application/core/model" + "github.com/rokwire/logging-library-go/v2/errors" "github.com/rokwire/logging-library-go/v2/logutils" "go.mongodb.org/mongo-driver/bson" @@ -37,7 +38,7 @@ func (a *Adapter) InitializeLegacyLocations() error { func (a *Adapter) FindLegacyLocations() (model.LegacyLocationsListType, error) { var list model.LegacyLocationsListType - err := a.db.legacyEvents.Find(a.context, bson.D{}, &list, options.Find().SetSort(bson.D{{Key: "name", Value: 1}})) + err := a.db.legacyEvents.FindWithContext(a.context, bson.D{}, &list, options.Find().SetSort(bson.D{{Key: "name", Value: 1}})) if err != nil { return nil, errors.WrapErrorAction(logutils.ActionFind, model.TypeEventLocations, nil, err) } diff --git a/driven/storage/adapter_unitcalendar.go b/driven/storage/adapter_unitcalendar.go index 57019e4e..2623c043 100644 --- a/driven/storage/adapter_unitcalendar.go +++ b/driven/storage/adapter_unitcalendar.go @@ -31,7 +31,7 @@ func (a *Adapter) FindCalendars(id string) (*[]model.UnitCalendar, error) { //filter := bson.M{} var data []model.UnitCalendar - err := a.db.unitcalendars.Find(a.context, filter, &data, nil) + err := a.db.unitcalendars.FindWithContext(a.context, filter, &data, nil) if err != nil { return nil, errors.WrapErrorAction(logutils.ActionFind, model.TypeExample, filterArgs(nil), err) } diff --git a/driven/storage/collection.go b/driven/storage/collection.go index af698902..a5d59fc6 100644 --- a/driven/storage/collection.go +++ b/driven/storage/collection.go @@ -31,13 +31,26 @@ type collectionWrapper struct { coll *mongo.Collection } -func (collWrapper *collectionWrapper) Find(ctx context.Context, filter interface{}, result interface{}, - findOptions *options.FindOptions) error { +func (collWrapper *collectionWrapper) Find(filter interface{}, result interface{}, findOptions *options.FindOptions) error { + return collWrapper.FindWithParams(context.Background(), filter, result, findOptions, nil) +} + +func (collWrapper *collectionWrapper) FindWithContext(ctx context.Context, filter interface{}, result interface{}, findOptions *options.FindOptions) error { + return collWrapper.FindWithParams(ctx, filter, result, findOptions, nil) +} + +func (collWrapper *collectionWrapper) FindWithParams(ctx context.Context, filter interface{}, result interface{}, + findOptions *options.FindOptions, timeout *time.Duration) error { if ctx == nil { ctx = context.Background() } - ctx, cancel := context.WithTimeout(ctx, collWrapper.database.mongoTimeout) + //set timeout + if timeout == nil { + timeout = &collWrapper.database.mongoTimeout + } + + ctx, cancel := context.WithTimeout(ctx, *timeout) defer cancel() if filter == nil { diff --git a/go.mod b/go.mod index 4e52c81e..243f68c9 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,7 @@ require ( github.com/rokwire/logging-library-go/v2 v2.2.0 github.com/swaggo/http-swagger v1.3.4 github.com/swaggo/swag v1.16.1 - go.mongodb.org/mongo-driver v1.12.0 + go.mongodb.org/mongo-driver v1.14.0 golang.org/x/sync v0.3.0 gopkg.in/yaml.v2 v2.4.0 ) @@ -39,10 +39,10 @@ require ( github.com/xdg-go/scram v1.1.2 // indirect github.com/xdg-go/stringprep v1.0.4 // indirect github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a // indirect - golang.org/x/crypto v0.12.0 // indirect + golang.org/x/crypto v0.17.0 // indirect golang.org/x/net v0.14.0 // indirect - golang.org/x/sys v0.11.0 // indirect - golang.org/x/text v0.12.0 // indirect + golang.org/x/sys v0.15.0 // indirect + golang.org/x/text v0.14.0 // indirect golang.org/x/tools v0.11.0 // indirect gopkg.in/go-playground/validator.v9 v9.31.0 // indirect ) diff --git a/go.sum b/go.sum index 37d68209..36819b86 100644 --- a/go.sum +++ b/go.sum @@ -41,10 +41,8 @@ github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keL github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang/mock v1.4.4 h1:l75CXGRSwbaYNpl/Z2X1XIIAMSCquvXgpVZDhwEIJsc= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4 h1:L8R9j+yAqZuZjsqh/z+F1NCffTKKLShY6zXTItVIZ8M= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= @@ -58,7 +56,6 @@ github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfC github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE= -github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= @@ -76,7 +73,6 @@ github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE= github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= @@ -119,18 +115,16 @@ github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= -github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a h1:fZHgsYlfvtyqToslyjUt3VOPF4J7aK/3MPcK7xp3PDk= github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a/go.mod h1:ul22v+Nro/R083muKhosV54bj5niojjWZvU8xrevuH4= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.mongodb.org/mongo-driver v1.12.0 h1:aPx33jmn/rQuJXPQLZQ8NtfPQG8CaqgLThFtqRb0PiE= -go.mongodb.org/mongo-driver v1.12.0/go.mod h1:AZkxhPnFJUoH7kZlFkVKucV20K387miPfm7oimrSmK0= +go.mongodb.org/mongo-driver v1.14.0 h1:P98w8egYRjYe3XDjxhYJagTokP/H6HzlsnojRgZRd80= +go.mongodb.org/mongo-driver v1.14.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= -golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= @@ -140,7 +134,6 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= @@ -164,8 +157,8 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -179,8 +172,8 @@ golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= From 67e2fa077f432035cacca9990da4af15eb7f42d9 Mon Sep 17 00:00:00 2001 From: Stefan Vitanov Date: Thu, 11 Apr 2024 09:27:50 +0300 Subject: [PATCH 2/2] update version to 2.4.4 --- CHANGELOG.md | 1 + SECURITY.md | 4 ++-- driver/web/docs/gen/def.yaml | 2 +- driver/web/docs/gen/gen_types.go | 2 +- driver/web/docs/index.yaml | 2 +- 5 files changed, 6 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index acb34507..d696f9ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +[2.4.4] - 2024-04-11 ### Fixed - Improve Get Legacy Events API [#70](https://github.com/rokwire/gateway-building-block/issues/70) diff --git a/SECURITY.md b/SECURITY.md index c70e7c33..a01c8622 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -4,8 +4,8 @@ Patches for **Gateway Building Block** in this repository will only be applied to the following versions: | Version | Supported | | ------- | ------------------ | -| 2.4.3 | :white_check_mark: | -| < 2.4.3 | :x: | +| 2.4.4 | :white_check_mark: | +| < 2.4.4 | :x: | ## Reporting a Bug or Vulnerability diff --git a/driver/web/docs/gen/def.yaml b/driver/web/docs/gen/def.yaml index e1e3ad8f..410df830 100644 --- a/driver/web/docs/gen/def.yaml +++ b/driver/web/docs/gen/def.yaml @@ -2,7 +2,7 @@ openapi: 3.0.3 info: title: Rokwire Gateway Building Block API description: Gateway Building Block API Documentation - version: 2.4.3 + version: 2.4.4 servers: - url: 'https://api.rokwire.illinois.edu/gateway' description: Production server diff --git a/driver/web/docs/gen/gen_types.go b/driver/web/docs/gen/gen_types.go index 99e1c599..16d905ce 100644 --- a/driver/web/docs/gen/gen_types.go +++ b/driver/web/docs/gen/gen_types.go @@ -1,6 +1,6 @@ // Package Def provides primitives to interact with the openapi HTTP API. // -// Code generated by github.com/deepmap/oapi-codegen version v1.16.2 DO NOT EDIT. +// Code generated by github.com/deepmap/oapi-codegen/v2 version v2.0.0 DO NOT EDIT. package Def import ( diff --git a/driver/web/docs/index.yaml b/driver/web/docs/index.yaml index fd6bf96d..50993371 100644 --- a/driver/web/docs/index.yaml +++ b/driver/web/docs/index.yaml @@ -2,7 +2,7 @@ openapi: 3.0.3 info: title: Rokwire Gateway Building Block API description: Gateway Building Block API Documentation - version: 2.4.3 + version: 2.4.4 servers: - url: 'https://api.rokwire.illinois.edu/gateway' description: Production server