From 4bf37dbedf700757c4df3f0a683db23fc6591f06 Mon Sep 17 00:00:00 2001 From: Felix Gateru Date: Mon, 27 Jan 2025 16:29:27 +0300 Subject: [PATCH] feat: add version prefix Signed-off-by: Felix Gateru --- .github/workflows/api-tests.yml | 20 +- apidocs/openapi/README.md | 2 +- apidocs/openapi/auth.yml | 4 +- apidocs/openapi/certs.yml | 4 +- apidocs/openapi/channels.yml | 22 +- apidocs/openapi/clients.yml | 12 +- apidocs/openapi/domains.yml | 10 +- apidocs/openapi/groups.yml | 12 +- apidocs/openapi/invitations.yml | 5 +- apidocs/openapi/journal.yml | 4 +- apidocs/openapi/users.yml | 8 +- auth/api/http/keys/endpoint_test.go | 6 +- auth/api/http/keys/transport.go | 7 +- auth/api/http/pats/transport.go | 9 +- auth/api/http/transport.go | 6 +- certs/api/endpoint_test.go | 26 ++- certs/api/transport.go | 21 +- channels/api/http/endpoint_test.go | 30 +-- channels/api/http/transport.go | 8 +- clients/api/http/clients.go | 4 +- clients/api/http/endpoints_test.go | 118 +++++----- clients/api/http/transport.go | 4 +- domains/api/http/endpoint_test.go | 27 +-- domains/api/http/transport.go | 8 +- groups/api/http/endpoint_test.go | 39 ++-- groups/api/http/transport.go | 8 +- http/api/transport.go | 8 +- invitations/api/endpoint_test.go | 22 +- invitations/api/transport.go | 17 +- journal/api/endpoint_test.go | 11 +- journal/api/transport.go | 47 ++-- pkg/sdk/certs.go | 8 +- pkg/sdk/channels.go | 28 +-- pkg/sdk/clients.go | 50 ++-- pkg/sdk/domains.go | 38 +-- pkg/sdk/groups.go | 54 ++--- pkg/sdk/health.go | 6 +- pkg/sdk/invitations.go | 12 +- pkg/sdk/journal.go | 2 +- pkg/sdk/message_test.go | 1 + pkg/sdk/sdk.go | 2 + pkg/sdk/tokens.go | 4 +- pkg/sdk/users.go | 40 ++-- users/api/endpoint_test.go | 70 +++--- users/api/transport.go | 4 +- users/api/users.go | 348 ++++++++++++++-------------- 46 files changed, 623 insertions(+), 573 deletions(-) diff --git a/.github/workflows/api-tests.yml b/.github/workflows/api-tests.yml index 4885dc7268..33ea5751f3 100644 --- a/.github/workflows/api-tests.yml +++ b/.github/workflows/api-tests.yml @@ -23,20 +23,20 @@ on: env: TOKENS_URL: http://localhost:9002/users/tokens/issue - CREATE_DOMAINS_URL: http://localhost:9003/domains + CREATE_DOMAINS_URL: http://localhost:9003/v1/domains USER_IDENTITY: admin@example.com USER_SECRET: 12345678 DOMAIN_NAME: demo-test - USERS_URL: http://localhost:9002 - DOMAIN_URL: http://localhost:9003 - CLIENTS_URL: http://localhost:9006 - CHANNELS_URL: http://localhost:9005 - GROUPS_URL: http://localhost:9004 + USERS_URL: http://localhost:9002/v1 + DOMAIN_URL: http://localhost:9003/v1 + CLIENTS_URL: http://localhost:9006/v1 + CHANNELS_URL: http://localhost:9005/v1 + GROUPS_URL: http://localhost:9004/v1 HTTP_ADAPTER_URL: http://localhost:8008 - INVITATIONS_URL: http://localhost:9020 - AUTH_URL: http://localhost:9001 - CERTS_URL: http://localhost:9019 - JOURNAL_URL: http://localhost:9021 + INVITATIONS_URL: http://localhost:9020/v1 + AUTH_URL: http://localhost:9001/v1 + CERTS_URL: http://localhost:9019/v1 + JOURNAL_URL: http://localhost:9021/v1 jobs: api-test: diff --git a/apidocs/openapi/README.md b/apidocs/openapi/README.md index b2aa8eb6f9..cd6d02c72b 100644 --- a/apidocs/openapi/README.md +++ b/apidocs/openapi/README.md @@ -2,4 +2,4 @@ This folder contains an OpenAPI specifications for SuperMQ API. -View specification in Swagger UI at [docs.api.magistrala.abstractmachines.fr](https://docs.api.supermq.abstractmachines.fr) \ No newline at end of file +View specification in Swagger UI at [docs.api.supermq.abstractmachines.fr](https://docs.api.supermq.abstractmachines.fr) diff --git a/apidocs/openapi/auth.yml b/apidocs/openapi/auth.yml index d3b2a12e82..3ac7389204 100644 --- a/apidocs/openapi/auth.yml +++ b/apidocs/openapi/auth.yml @@ -16,8 +16,8 @@ info: version: 0.15.1 servers: - - url: http://localhost:9001 - - url: https://localhost:9001 + - url: http://localhost:9001/v1 + - url: https://localhost:9001/v1 tags: - name: Keys diff --git a/apidocs/openapi/certs.yml b/apidocs/openapi/certs.yml index 4d726b3c83..fd2eb471df 100644 --- a/apidocs/openapi/certs.yml +++ b/apidocs/openapi/certs.yml @@ -16,8 +16,8 @@ info: version: 0.15.1 servers: - - url: http://localhost:9019 - - url: https://localhost:9019 + - url: http://localhost:9019/v1 + - url: https://localhost:9019/v1 tags: - name: certs diff --git a/apidocs/openapi/channels.yml b/apidocs/openapi/channels.yml index d2e904b386..f18c4eb018 100644 --- a/apidocs/openapi/channels.yml +++ b/apidocs/openapi/channels.yml @@ -16,8 +16,8 @@ info: version: 0.15.1 servers: - - url: http://localhost:9005 - - url: https://localhost:9005 + - url: http://localhost:9005/v1 + - url: https://localhost:9005/v1 tags: - name: Channels @@ -454,7 +454,7 @@ paths: description: Database can't process request. "500": $ref: "#/components/responses/ServiceError" - + /{domainID}/channels/{chanID}/connect: post: operationId: connectClientsToChannel @@ -557,7 +557,7 @@ components: ParentGroupReqObj: type: object properties: - parent_group_id: + parent_group_id: type: string format: uuid example: bb7edb32-2eac-4aad-aebe-ed96fe073879 @@ -667,7 +667,7 @@ components: - name - metadata - description - + ChannelUpdateTags: type: object properties: @@ -817,7 +817,7 @@ components: format: uuid required: false example: bb7edb32-2eac-4aad-aebe-ed96fe073879 - + Metadata: name: metadata description: Metadata filter. Filtering is performed matching the parameter with metadata on top level. Parameter is json. @@ -867,7 +867,7 @@ components: application/json: schema: $ref: "#/components/schemas/ChannelReqObj" - + ChannelsCreateReq: description: JSON-formatted document describing the new channels to be registered required: true @@ -885,7 +885,7 @@ components: application/json: schema: $ref: "#/components/schemas/ChannelUpdate" - + ChannelUpdateTagsReq: description: JSON-formated document describing the tags of channel to be updated. required: true @@ -893,7 +893,7 @@ components: application/json: schema: $ref: "#/components/schemas/ChannelUpdate" - + ChannelParentGroupReq: description: JSON-formated document describing the parent group to be set to or removed from a channel. required: true @@ -909,7 +909,7 @@ components: application/json: schema: $ref: "#/components/schemas/ConnectionReqSchema" - + ChannelConnReq: description: JSON-formatted document describing the new connection. required: true @@ -976,7 +976,7 @@ components: operationId: unassignGroupsFromChannel parameters: chanID: $response.body#/id - + ChannelsCreateRes: description: Registered new channels. headers: diff --git a/apidocs/openapi/clients.yml b/apidocs/openapi/clients.yml index ffb666bda3..db95ba710e 100644 --- a/apidocs/openapi/clients.yml +++ b/apidocs/openapi/clients.yml @@ -16,8 +16,8 @@ info: version: 0.15.1 servers: - - url: http://localhost:9006 - - url: https://localhost:9006 + - url: http://localhost:9006/v1 + - url: https://localhost:9006/v1 tags: - name: Clients @@ -28,8 +28,8 @@ tags: - name: Roles description: All operations involving roles for clients externalDocs: - description: Find out more about roles - url: https://docs.supermq.abstractmachines.fr/ + description: Find out more about roles + url: https://docs.supermq.abstractmachines.fr/ - name: Health description: Health check operations externalDocs: @@ -472,7 +472,7 @@ paths: - bearerAuth: [] responses: "201": - $ref: "./schemas/roles.yml#/components/responses/CreateRoleRes" + $ref: "./schemas/roles.yml#/components/responses/CreateRoleRes" "400": description: Failed due to malformed client's ID. "401": @@ -952,7 +952,7 @@ components: ParentGroupReqObj: type: object properties: - parent_group_id: + parent_group_id: type: string format: uuid example: bb7edb32-2eac-4aad-aebe-ed96fe073879 diff --git a/apidocs/openapi/domains.yml b/apidocs/openapi/domains.yml index a683e9b824..b807d147a3 100644 --- a/apidocs/openapi/domains.yml +++ b/apidocs/openapi/domains.yml @@ -16,8 +16,8 @@ info: version: 0.15.1 servers: - - url: http://localhost:9003 - - url: https://localhost:9003 + - url: http://localhost:9003/v1 + - url: https://localhost:9003/v1 tags: - name: Domains @@ -28,8 +28,8 @@ tags: - name: Roles description: All operations involving roles for clients externalDocs: - description: Find out more about roles - url: https://docs.supermq.abstractmachines.fr/ + description: Find out more about roles + url: https://docs.supermq.abstractmachines.fr/ - name: Health description: Service health check endpoint. externalDocs: @@ -242,7 +242,7 @@ paths: - bearerAuth: [] responses: "201": - $ref: "./schemas/roles.yml#/components/responses/CreateRoleRes" + $ref: "./schemas/roles.yml#/components/responses/CreateRoleRes" "400": description: Failed due to malformed domain's ID. "401": diff --git a/apidocs/openapi/groups.yml b/apidocs/openapi/groups.yml index b460047d5b..aa0e1041b7 100644 --- a/apidocs/openapi/groups.yml +++ b/apidocs/openapi/groups.yml @@ -16,8 +16,8 @@ info: version: 0.15.1 servers: - - url: http://localhost:9004 - - url: https://localhost:9004 + - url: http://localhost:9004/v1 + - url: https://localhost:9004/v1 tags: - name: Groups @@ -28,8 +28,8 @@ tags: - name: Roles description: All operations involving roles for groups externalDocs: - description: Find out more about roles - url: https://docs.supermq.abstractmachines.fr/ + description: Find out more about roles + url: https://docs.supermq.abstractmachines.fr/ - name: Health description: Health check operations externalDocs: @@ -516,7 +516,7 @@ paths: - bearerAuth: [] responses: "201": - $ref: "./schemas/roles.yml#/components/responses/CreateRoleRes" + $ref: "./schemas/roles.yml#/components/responses/CreateRoleRes" "400": description: Failed due to malformed group's ID. "401": @@ -1192,7 +1192,7 @@ components: ParentGroupReqObj: type: object properties: - group_id: + group_id: type: string format: uuid example: bb7edb32-2eac-4aad-aebe-ed96fe073879 diff --git a/apidocs/openapi/invitations.yml b/apidocs/openapi/invitations.yml index 10cc2adc35..7775ed2a0a 100644 --- a/apidocs/openapi/invitations.yml +++ b/apidocs/openapi/invitations.yml @@ -16,8 +16,8 @@ info: version: 0.15.1 servers: - - url: http://localhost:9020 - - url: https://localhost:9020 + - url: http://localhost:9020/v1 + - url: https://localhost:9020/v1 tags: - name: Invitations @@ -201,7 +201,6 @@ paths: /health: get: summary: Retrieves service health check info. - tags: - health security: [] responses: diff --git a/apidocs/openapi/journal.yml b/apidocs/openapi/journal.yml index 2d0c35edb4..cba7c62db2 100644 --- a/apidocs/openapi/journal.yml +++ b/apidocs/openapi/journal.yml @@ -16,8 +16,8 @@ info: version: 0.15.1 servers: - - url: http://localhost:9021 - - url: https://localhost:9021 + - url: http://localhost:9021/v1 + - url: https://localhost:9021/v1 tags: - name: journal-log diff --git a/apidocs/openapi/users.yml b/apidocs/openapi/users.yml index e246b96565..8d25a6fbdf 100644 --- a/apidocs/openapi/users.yml +++ b/apidocs/openapi/users.yml @@ -16,8 +16,8 @@ info: version: 0.15.1 servers: - - url: http://localhost:9002 - - url: https://localhost:9002 + - url: http://localhost:9002/v1 + - url: https://localhost:9002/v1 tags: - name: Users @@ -666,7 +666,7 @@ paths: description: Database can't process request. "500": $ref: "#/components/responses/ServiceError" - + /{domainID}/users: get: summary: List users assigned to domain @@ -1310,7 +1310,7 @@ components: pattern: "^[a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}$" required: true example: bb7edb32-2eac-4aad-aebe-ed96fe073879 - + ClientID: name: clientID description: Unique client identifier. diff --git a/auth/api/http/keys/endpoint_test.go b/auth/api/http/keys/endpoint_test.go index 5b2693f751..43fd1f797f 100644 --- a/auth/api/http/keys/endpoint_test.go +++ b/auth/api/http/keys/endpoint_test.go @@ -188,7 +188,7 @@ func TestIssue(t *testing.T) { req := testRequest{ client: client, method: http.MethodPost, - url: fmt.Sprintf("%s/keys", ts.URL), + url: fmt.Sprintf("%s/v1/keys", ts.URL), contentType: tc.ct, token: tc.token, body: strings.NewReader(tc.req), @@ -264,7 +264,7 @@ func TestRetrieve(t *testing.T) { req := testRequest{ client: client, method: http.MethodGet, - url: fmt.Sprintf("%s/keys/%s", ts.URL, tc.id), + url: fmt.Sprintf("%s/v1/keys/%s", ts.URL, tc.id), token: tc.token, } repocall := krepo.On("Retrieve", mock.Anything, mock.Anything, mock.Anything).Return(tc.key, tc.err) @@ -326,7 +326,7 @@ func TestRevoke(t *testing.T) { req := testRequest{ client: client, method: http.MethodDelete, - url: fmt.Sprintf("%s/keys/%s", ts.URL, tc.id), + url: fmt.Sprintf("%s/v1/keys/%s", ts.URL, tc.id), token: tc.token, } repocall := krepo.On("Remove", mock.Anything, mock.Anything, mock.Anything).Return(nil) diff --git a/auth/api/http/keys/transport.go b/auth/api/http/keys/transport.go index 30e3e11dee..4d23ef3bae 100644 --- a/auth/api/http/keys/transport.go +++ b/auth/api/http/keys/transport.go @@ -18,14 +18,17 @@ import ( kithttp "github.com/go-kit/kit/transport/http" ) -const contentType = "application/json" +const ( + contentType = "application/json" + versionPrefix = "/v1" +) // MakeHandler returns a HTTP handler for API endpoints. func MakeHandler(svc auth.Service, mux *chi.Mux, logger *slog.Logger) *chi.Mux { opts := []kithttp.ServerOption{ kithttp.ServerErrorEncoder(apiutil.LoggingErrorEncoder(logger, api.EncodeError)), } - mux.Route("/keys", func(r chi.Router) { + mux.Route(versionPrefix+"/keys", func(r chi.Router) { r.Post("/", kithttp.NewServer( issueEndpoint(svc), decodeIssue, diff --git a/auth/api/http/pats/transport.go b/auth/api/http/pats/transport.go index 910bf323be..68f17e4b4a 100644 --- a/auth/api/http/pats/transport.go +++ b/auth/api/http/pats/transport.go @@ -19,9 +19,10 @@ import ( ) const ( - contentType = "application/json" - defInterval = "30d" - patPrefix = "pat_" + contentType = "application/json" + defInterval = "30d" + patPrefix = "pat_" + versionPrefix = "/v1" ) // MakeHandler returns a HTTP handler for API endpoints. @@ -29,7 +30,7 @@ func MakeHandler(svc auth.Service, mux *chi.Mux, logger *slog.Logger) *chi.Mux { opts := []kithttp.ServerOption{ kithttp.ServerErrorEncoder(apiutil.LoggingErrorEncoder(logger, api.EncodeError)), } - mux.Route("/pats", func(r chi.Router) { + mux.Route(versionPrefix+"/pats", func(r chi.Router) { r.Post("/", kithttp.NewServer( createPATEndpoint(svc), decodeCreatePATRequest, diff --git a/auth/api/http/transport.go b/auth/api/http/transport.go index c3a8d723c0..3ae9d7b63e 100644 --- a/auth/api/http/transport.go +++ b/auth/api/http/transport.go @@ -14,6 +14,8 @@ import ( "github.com/prometheus/client_golang/prometheus/promhttp" ) +const versionPrefix = "/v1" + // MakeHandler returns a HTTP handler for API endpoints. func MakeHandler(svc auth.Service, logger *slog.Logger, instanceID string) http.Handler { mux := chi.NewRouter() @@ -21,8 +23,8 @@ func MakeHandler(svc auth.Service, logger *slog.Logger, instanceID string) http. mux = keys.MakeHandler(svc, mux, logger) mux = pats.MakeHandler(svc, mux, logger) - mux.Get("/health", supermq.Health("auth", instanceID)) - mux.Handle("/metrics", promhttp.Handler()) + mux.Get(versionPrefix+"/health", supermq.Health("auth", instanceID)) + mux.Handle(versionPrefix+"/metrics", promhttp.Handler()) return mux } diff --git a/certs/api/endpoint_test.go b/certs/api/endpoint_test.go index 66be87e00d..ef80b253f3 100644 --- a/certs/api/endpoint_test.go +++ b/certs/api/endpoint_test.go @@ -27,14 +27,18 @@ import ( "github.com/stretchr/testify/mock" ) +const ( + versionPrefix = "/v1" + contentType = "application/json" + valid = "valid" + invalid = "invalid" + ttl = "1h" +) + var ( - contentType = "application/json" - valid = "valid" - invalid = "invalid" - clientID = testsutil.GenerateUUID(&testing.T{}) - serial = testsutil.GenerateUUID(&testing.T{}) - ttl = "1h" - cert = certs.Cert{ + clientID = testsutil.GenerateUUID(&testing.T{}) + serial = testsutil.GenerateUUID(&testing.T{}) + cert = certs.Cert{ ClientID: clientID, SerialNumber: serial, ExpiryTime: time.Now().Add(time.Hour), @@ -218,7 +222,7 @@ func TestIssueCert(t *testing.T) { req := testRequest{ client: cs.Client(), method: http.MethodPost, - url: fmt.Sprintf("%s/%s/certs", cs.URL, tc.domainID), + url: fmt.Sprintf("%s/%s/certs", cs.URL+versionPrefix, tc.domainID), contentType: tc.contentType, token: tc.token, body: strings.NewReader(tc.request), @@ -306,7 +310,7 @@ func TestViewCert(t *testing.T) { req := testRequest{ client: cs.Client(), method: http.MethodGet, - url: fmt.Sprintf("%s/%s/certs/%s", cs.URL, tc.domainID, tc.serialID), + url: fmt.Sprintf("%s/%s/certs/%s", cs.URL+versionPrefix, tc.domainID, tc.serialID), token: tc.token, } if tc.token == valid { @@ -399,7 +403,7 @@ func TestRevokeCert(t *testing.T) { req := testRequest{ client: cs.Client(), method: http.MethodDelete, - url: fmt.Sprintf("%s/%s/certs/%s", cs.URL, tc.domainID, tc.serialID), + url: fmt.Sprintf("%s/%s/certs/%s", cs.URL+versionPrefix, tc.domainID, tc.serialID), token: tc.token, } if tc.token == valid { @@ -642,7 +646,7 @@ func TestListSerials(t *testing.T) { req := testRequest{ client: cs.Client(), method: http.MethodGet, - url: fmt.Sprintf("%s/%s/serials/%s", cs.URL, tc.domainID, tc.clientID) + tc.query, + url: fmt.Sprintf("%s/%s/serials/%s", cs.URL+versionPrefix, tc.domainID, tc.clientID) + tc.query, token: tc.token, } if tc.token == valid { diff --git a/certs/api/transport.go b/certs/api/transport.go index 726e537937..291cc1f178 100644 --- a/certs/api/transport.go +++ b/certs/api/transport.go @@ -22,13 +22,14 @@ import ( ) const ( - contentType = "application/json" - offsetKey = "offset" - limitKey = "limit" - revokeKey = "revoked" - defRevoke = "false" - defOffset = 0 - defLimit = 10 + contentType = "application/json" + offsetKey = "offset" + limitKey = "limit" + revokeKey = "revoked" + defRevoke = "false" + defOffset = 0 + defLimit = 10 + versionPrefix = "/v1" ) // MakeHandler returns a HTTP handler for API endpoints. @@ -41,7 +42,7 @@ func MakeHandler(svc certs.Service, authn smqauthn.Authentication, logger *slog. r.Group(func(r chi.Router) { r.Use(api.AuthenticateMiddleware(authn, true)) - r.Route("/{domainID}", func(r chi.Router) { + r.Route(versionPrefix+"/{domainID}", func(r chi.Router) { r.Route("/certs", func(r chi.Router) { r.Post("/", otelhttp.NewHandler(kithttp.NewServer( issueCert(svc), @@ -70,8 +71,8 @@ func MakeHandler(svc certs.Service, authn smqauthn.Authentication, logger *slog. ), "list_serials").ServeHTTP) }) }) - r.Handle("/metrics", promhttp.Handler()) - r.Get("/health", supermq.Health("certs", instanceID)) + r.Handle(versionPrefix+"/metrics", promhttp.Handler()) + r.Get(versionPrefix+"/health", supermq.Health("certs", instanceID)) return r } diff --git a/channels/api/http/endpoint_test.go b/channels/api/http/endpoint_test.go index d5c4243781..cbb16bc9dd 100644 --- a/channels/api/http/endpoint_test.go +++ b/channels/api/http/endpoint_test.go @@ -168,7 +168,7 @@ func TestCreateChannelEndpoint(t *testing.T) { req := testRequest{ client: gs.Client(), method: http.MethodPost, - url: fmt.Sprintf("%s/%s/channels/", gs.URL, tc.domainID), + url: fmt.Sprintf("%s/%s/channels/", gs.URL+versionPrefix, tc.domainID), contentType: tc.contentType, token: tc.token, body: strings.NewReader(data), @@ -304,7 +304,7 @@ func TestCreateChannelsEndpoint(t *testing.T) { req := testRequest{ client: gs.Client(), method: http.MethodPost, - url: fmt.Sprintf("%s/%s/channels/bulk", gs.URL, tc.domainID), + url: fmt.Sprintf("%s/%s/channels/bulk", gs.URL+versionPrefix, tc.domainID), contentType: tc.contentType, token: tc.token, body: strings.NewReader(data), @@ -403,7 +403,7 @@ func TestViewChannelEndpoint(t *testing.T) { req := testRequest{ client: gs.Client(), method: http.MethodGet, - url: fmt.Sprintf("%s/%s/channels/%s", gs.URL, tc.domainID, tc.id), + url: fmt.Sprintf("%s/%s/channels/%s", gs.URL+versionPrefix, tc.domainID, tc.id), token: tc.token, } if tc.token == validToken { @@ -709,7 +709,7 @@ func TestListChannels(t *testing.T) { req := testRequest{ client: gs.Client(), method: http.MethodGet, - url: gs.URL + "/" + tc.domainID + "/channels?" + tc.query, + url: gs.URL + versionPrefix + "/" + tc.domainID + "/channels?" + tc.query, contentType: contentType, token: tc.token, } @@ -851,7 +851,7 @@ func TestUpdateChannelEndpoint(t *testing.T) { req := testRequest{ client: gs.Client(), method: http.MethodPatch, - url: fmt.Sprintf("%s/%s/channels/%s", gs.URL, tc.domainID, tc.id), + url: fmt.Sprintf("%s/%s/channels/%s", gs.URL+versionPrefix, tc.domainID, tc.id), contentType: tc.contentType, token: tc.token, body: strings.NewReader(data), @@ -991,7 +991,7 @@ func TestUpdateChannelTagsEndpoint(t *testing.T) { req := testRequest{ client: gs.Client(), method: http.MethodPatch, - url: fmt.Sprintf("%s/%s/channels/%s/tags", gs.URL, tc.domainID, tc.id), + url: fmt.Sprintf("%s/%s/channels/%s/tags", gs.URL+versionPrefix, tc.domainID, tc.id), contentType: tc.contentType, token: tc.token, body: strings.NewReader(tc.data), @@ -1133,7 +1133,7 @@ func TestSetChannelParentGroupEndpoint(t *testing.T) { req := testRequest{ client: gs.Client(), method: http.MethodPost, - url: fmt.Sprintf("%s/%s/channels/%s/parent", gs.URL, tc.domainID, tc.id), + url: fmt.Sprintf("%s/%s/channels/%s/parent", gs.URL+versionPrefix, tc.domainID, tc.id), contentType: tc.contentType, token: tc.token, body: strings.NewReader(tc.data), @@ -1223,7 +1223,7 @@ func TestRemoveChannelParentGroupEndpoint(t *testing.T) { req := testRequest{ client: gs.Client(), method: http.MethodDelete, - url: fmt.Sprintf("%s/%s/channels/%s/parent", gs.URL, tc.domainID, tc.id), + url: fmt.Sprintf("%s/%s/channels/%s/parent", gs.URL+versionPrefix, tc.domainID, tc.id), token: tc.token, } if tc.token == validToken { @@ -1319,7 +1319,7 @@ func TestEnableChannelEndpoint(t *testing.T) { req := testRequest{ client: gs.Client(), method: http.MethodPost, - url: fmt.Sprintf("%s/%s/channels/%s/enable", gs.URL, tc.domainID, tc.id), + url: fmt.Sprintf("%s/%s/channels/%s/enable", gs.URL+versionPrefix, tc.domainID, tc.id), token: tc.token, } if tc.token == validToken { @@ -1422,7 +1422,7 @@ func TestDisableChannelEndpoint(t *testing.T) { req := testRequest{ client: gs.Client(), method: http.MethodPost, - url: fmt.Sprintf("%s/%s/channels/%s/disable", gs.URL, tc.domainID, tc.id), + url: fmt.Sprintf("%s/%s/channels/%s/disable", gs.URL+versionPrefix, tc.domainID, tc.id), token: tc.token, } if tc.token == validToken { @@ -1529,7 +1529,7 @@ func TestConnectChannelClientEndpoint(t *testing.T) { req := testRequest{ client: gs.Client(), method: http.MethodPost, - url: fmt.Sprintf("%s/%s/channels/%s/connect", gs.URL, tc.domainID, tc.id), + url: fmt.Sprintf("%s/%s/channels/%s/connect", gs.URL+versionPrefix, tc.domainID, tc.id), token: tc.token, contentType: tc.contentType, body: strings.NewReader(tc.data), @@ -1631,7 +1631,7 @@ func TestDisconnectChannelClientEndpoint(t *testing.T) { req := testRequest{ client: gs.Client(), method: http.MethodPost, - url: fmt.Sprintf("%s/%s/channels/%s/disconnect", gs.URL, tc.domainID, tc.id), + url: fmt.Sprintf("%s/%s/channels/%s/disconnect", gs.URL+versionPrefix, tc.domainID, tc.id), token: tc.token, contentType: tc.contentType, body: strings.NewReader(tc.data), @@ -1757,7 +1757,7 @@ func TestConnectEndpoint(t *testing.T) { req := testRequest{ client: gs.Client(), method: http.MethodPost, - url: fmt.Sprintf("%s/%s/channels/connect", gs.URL, tc.domainID), + url: fmt.Sprintf("%s/%s/channels/connect", gs.URL+versionPrefix, tc.domainID), token: tc.token, contentType: contentType, body: strings.NewReader(toJSON(map[string]interface{}{ @@ -1887,7 +1887,7 @@ func TestDisconnectEndpoint(t *testing.T) { req := testRequest{ client: gs.Client(), method: http.MethodPost, - url: fmt.Sprintf("%s/%s/channels/disconnect", gs.URL, tc.domainID), + url: fmt.Sprintf("%s/%s/channels/disconnect", gs.URL+versionPrefix, tc.domainID), token: tc.token, contentType: contentType, body: strings.NewReader(toJSON(map[string]interface{}{ @@ -1976,7 +1976,7 @@ func TestDeleteChannelEndpoint(t *testing.T) { req := testRequest{ client: gs.Client(), method: http.MethodDelete, - url: fmt.Sprintf("%s/%s/channels/%s", gs.URL, tc.domainID, tc.id), + url: fmt.Sprintf("%s/%s/channels/%s", gs.URL+versionPrefix, tc.domainID, tc.id), token: tc.token, } if tc.token == validToken { diff --git a/channels/api/http/transport.go b/channels/api/http/transport.go index 8f9439e214..7af55f5738 100644 --- a/channels/api/http/transport.go +++ b/channels/api/http/transport.go @@ -18,6 +18,8 @@ import ( "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" ) +const versionPrefix = "/v1" + // MakeHandler returns a HTTP handler for Channels API endpoints. func MakeHandler(svc channels.Service, authn smqauthn.Authentication, mux *chi.Mux, logger *slog.Logger, instanceID string) *chi.Mux { opts := []kithttp.ServerOption{ @@ -26,7 +28,7 @@ func MakeHandler(svc channels.Service, authn smqauthn.Authentication, mux *chi.M d := roleManagerHttp.NewDecoder("channelID") - mux.Route("/{domainID}/channels", func(r chi.Router) { + mux.Route(versionPrefix+"/{domainID}/channels", func(r chi.Router) { r.Use(api.AuthenticateMiddleware(authn, true)) r.Post("/", otelhttp.NewHandler(kithttp.NewServer( @@ -141,8 +143,8 @@ func MakeHandler(svc channels.Service, authn smqauthn.Authentication, mux *chi.M }) }) - mux.Get("/health", supermq.Health("channels", instanceID)) - mux.Handle("/metrics", promhttp.Handler()) + mux.Get(versionPrefix+"/health", supermq.Health("channels", instanceID)) + mux.Handle(versionPrefix+"/metrics", promhttp.Handler()) return mux } diff --git a/clients/api/http/clients.go b/clients/api/http/clients.go index abecf0ba85..0d9e75d5da 100644 --- a/clients/api/http/clients.go +++ b/clients/api/http/clients.go @@ -16,6 +16,8 @@ import ( "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" ) +const versionPrefix = "/v1" + func clientsHandler(svc clients.Service, authn smqauthn.Authentication, r *chi.Mux, logger *slog.Logger) *chi.Mux { opts := []kithttp.ServerOption{ kithttp.ServerErrorEncoder(apiutil.LoggingErrorEncoder(logger, api.EncodeError)), @@ -25,7 +27,7 @@ func clientsHandler(svc clients.Service, authn smqauthn.Authentication, r *chi.M r.Group(func(r chi.Router) { r.Use(api.AuthenticateMiddleware(authn, true)) - r.Route("/{domainID}/clients", func(r chi.Router) { + r.Route(versionPrefix+"/{domainID}/clients", func(r chi.Router) { r.Post("/", otelhttp.NewHandler(kithttp.NewServer( createClientEndpoint(svc), decodeCreateClientReq, diff --git a/clients/api/http/endpoints_test.go b/clients/api/http/endpoints_test.go index 8104737cc3..6d9a9b3e31 100644 --- a/clients/api/http/endpoints_test.go +++ b/clients/api/http/endpoints_test.go @@ -30,8 +30,16 @@ import ( "github.com/stretchr/testify/mock" ) +const ( + contentType = "application/json" + validToken = "token" + inValidToken = "invalid" + inValid = "invalid" + secret = "strongsecret" + versionPrefix = "/v1" +) + var ( - secret = "strongsecret" validCMetadata = clients.Metadata{"role": "client"} ID = testsutil.GenerateUUID(&testing.T{}) client = clients.Client{ @@ -42,15 +50,11 @@ var ( Metadata: validCMetadata, Status: clients.EnabledStatus, } - validToken = "token" - inValidToken = "invalid" - inValid = "invalid" - validID = testsutil.GenerateUUID(&testing.T{}) - domainID = testsutil.GenerateUUID(&testing.T{}) - namesgen = namegenerator.NewGenerator() -) -const contentType = "application/json" + validID = testsutil.GenerateUUID(&testing.T{}) + domainID = testsutil.GenerateUUID(&testing.T{}) + namesgen = namegenerator.NewGenerator() +) type testRequest struct { client *http.Client @@ -100,8 +104,8 @@ func newClientsServer() (*httptest.Server, *mocks.Service, *authnmocks.Authentic } func TestCreateClient(t *testing.T) { - ts, svc, authn := newClientsServer() - defer ts.Close() + cs, svc, authn := newClientsServer() + defer cs.Close() cases := []struct { desc string @@ -217,9 +221,9 @@ func TestCreateClient(t *testing.T) { t.Run(tc.desc, func(t *testing.T) { data := toJSON(tc.client) req := testRequest{ - client: ts.Client(), + client: cs.Client(), method: http.MethodPost, - url: fmt.Sprintf("%s/%s/clients/", ts.URL, tc.domainID), + url: fmt.Sprintf("%s/%s/clients/", cs.URL+versionPrefix, tc.domainID), contentType: tc.contentType, token: tc.token, body: strings.NewReader(data), @@ -244,8 +248,8 @@ func TestCreateClient(t *testing.T) { } func TestCreateClients(t *testing.T) { - ts, svc, authn := newClientsServer() - defer ts.Close() + cs, svc, authn := newClientsServer() + defer cs.Close() num := 3 var items []clients.Client @@ -387,9 +391,9 @@ func TestCreateClients(t *testing.T) { t.Run(tc.desc, func(t *testing.T) { data := toJSON(tc.client) req := testRequest{ - client: ts.Client(), + client: cs.Client(), method: http.MethodPost, - url: fmt.Sprintf("%s/%s/clients/bulk", ts.URL, domainID), + url: fmt.Sprintf("%s/%s/clients/bulk", cs.URL+versionPrefix, domainID), contentType: tc.contentType, token: tc.token, body: strings.NewReader(data), @@ -416,8 +420,8 @@ func TestCreateClients(t *testing.T) { } func TestListClients(t *testing.T) { - ts, svc, authn := newClientsServer() - defer ts.Close() + cs, svc, authn := newClientsServer() + defer cs.Close() cases := []struct { desc string @@ -735,9 +739,9 @@ func TestListClients(t *testing.T) { for _, tc := range cases { t.Run(tc.desc, func(t *testing.T) { req := testRequest{ - client: ts.Client(), + client: cs.Client(), method: http.MethodGet, - url: ts.URL + "/" + tc.domainID + "/clients?" + tc.query, + url: cs.URL + versionPrefix + "/" + tc.domainID + "/clients?" + tc.query, contentType: contentType, token: tc.token, } @@ -762,8 +766,8 @@ func TestListClients(t *testing.T) { } func TestViewClient(t *testing.T) { - ts, svc, authn := newClientsServer() - defer ts.Close() + cs, svc, authn := newClientsServer() + defer cs.Close() cases := []struct { desc string @@ -817,9 +821,9 @@ func TestViewClient(t *testing.T) { for _, tc := range cases { t.Run(tc.desc, func(t *testing.T) { req := testRequest{ - client: ts.Client(), + client: cs.Client(), method: http.MethodGet, - url: fmt.Sprintf("%s/%s/clients/%s", ts.URL, tc.domainID, tc.id), + url: fmt.Sprintf("%s/%s/clients/%s", cs.URL+versionPrefix, tc.domainID, tc.id), token: tc.token, } @@ -842,8 +846,8 @@ func TestViewClient(t *testing.T) { } func TestUpdateClient(t *testing.T) { - ts, svc, authn := newClientsServer() - defer ts.Close() + cs, svc, authn := newClientsServer() + defer cs.Close() newName := "newname" newTag := "newtag" @@ -954,9 +958,9 @@ func TestUpdateClient(t *testing.T) { for _, tc := range cases { t.Run(tc.desc, func(t *testing.T) { req := testRequest{ - client: ts.Client(), + client: cs.Client(), method: http.MethodPatch, - url: fmt.Sprintf("%s/%s/clients/%s", ts.URL, tc.domainID, tc.id), + url: fmt.Sprintf("%s/%s/clients/%s", cs.URL+versionPrefix, tc.domainID, tc.id), contentType: tc.contentType, token: tc.token, body: strings.NewReader(tc.data), @@ -986,8 +990,8 @@ func TestUpdateClient(t *testing.T) { } func TestUpdateClientsTags(t *testing.T) { - ts, svc, authn := newClientsServer() - defer ts.Close() + cs, svc, authn := newClientsServer() + defer cs.Close() newTag := "newtag" @@ -1093,9 +1097,9 @@ func TestUpdateClientsTags(t *testing.T) { for _, tc := range cases { t.Run(tc.desc, func(t *testing.T) { req := testRequest{ - client: ts.Client(), + client: cs.Client(), method: http.MethodPatch, - url: fmt.Sprintf("%s/%s/clients/%s/tags", ts.URL, tc.domainID, tc.id), + url: fmt.Sprintf("%s/%s/clients/%s/tags", cs.URL+versionPrefix, tc.domainID, tc.id), contentType: tc.contentType, token: tc.token, body: strings.NewReader(tc.data), @@ -1120,8 +1124,8 @@ func TestUpdateClientsTags(t *testing.T) { } func TestUpdateClientSecret(t *testing.T) { - ts, svc, authn := newClientsServer() - defer ts.Close() + cs, svc, authn := newClientsServer() + defer cs.Close() cases := []struct { desc string @@ -1261,9 +1265,9 @@ func TestUpdateClientSecret(t *testing.T) { for _, tc := range cases { t.Run(tc.desc, func(t *testing.T) { req := testRequest{ - client: ts.Client(), + client: cs.Client(), method: http.MethodPatch, - url: fmt.Sprintf("%s/%s/clients/%s/secret", ts.URL, tc.domainID, tc.client.ID), + url: fmt.Sprintf("%s/%s/clients/%s/secret", cs.URL+versionPrefix, tc.domainID, tc.client.ID), contentType: tc.contentType, token: tc.token, body: strings.NewReader(tc.data), @@ -1288,8 +1292,8 @@ func TestUpdateClientSecret(t *testing.T) { } func TestEnableClient(t *testing.T) { - ts, svc, authn := newClientsServer() - defer ts.Close() + cs, svc, authn := newClientsServer() + defer cs.Close() cases := []struct { desc string @@ -1343,9 +1347,9 @@ func TestEnableClient(t *testing.T) { t.Run(tc.desc, func(t *testing.T) { data := toJSON(tc.client) req := testRequest{ - client: ts.Client(), + client: cs.Client(), method: http.MethodPost, - url: fmt.Sprintf("%s/%s/clients/%s/enable", ts.URL, tc.domainID, tc.client.ID), + url: fmt.Sprintf("%s/%s/clients/%s/enable", cs.URL+versionPrefix, tc.domainID, tc.client.ID), contentType: contentType, token: tc.token, body: strings.NewReader(data), @@ -1373,8 +1377,8 @@ func TestEnableClient(t *testing.T) { } func TestDisableClient(t *testing.T) { - ts, svc, authn := newClientsServer() - defer ts.Close() + cs, svc, authn := newClientsServer() + defer cs.Close() cases := []struct { desc string @@ -1428,9 +1432,9 @@ func TestDisableClient(t *testing.T) { t.Run(tc.desc, func(t *testing.T) { data := toJSON(tc.client) req := testRequest{ - client: ts.Client(), + client: cs.Client(), method: http.MethodPost, - url: fmt.Sprintf("%s/%s/clients/%s/disable", ts.URL, tc.domainID, tc.client.ID), + url: fmt.Sprintf("%s/%s/clients/%s/disable", cs.URL+versionPrefix, tc.domainID, tc.client.ID), contentType: contentType, token: tc.token, body: strings.NewReader(data), @@ -1458,8 +1462,8 @@ func TestDisableClient(t *testing.T) { } func TestDeleteClient(t *testing.T) { - ts, svc, authn := newClientsServer() - defer ts.Close() + cs, svc, authn := newClientsServer() + defer cs.Close() cases := []struct { desc string @@ -1514,9 +1518,9 @@ func TestDeleteClient(t *testing.T) { for _, tc := range cases { t.Run(tc.desc, func(t *testing.T) { req := testRequest{ - client: ts.Client(), + client: cs.Client(), method: http.MethodDelete, - url: fmt.Sprintf("%s/%s/clients/%s", ts.URL, tc.domainID, tc.id), + url: fmt.Sprintf("%s/%s/clients/%s", cs.URL+versionPrefix, tc.domainID, tc.id), token: tc.token, } @@ -1532,8 +1536,8 @@ func TestDeleteClient(t *testing.T) { } func TestSetClientParentGroupEndpoint(t *testing.T) { - gs, svc, authn := newClientsServer() - defer gs.Close() + cs, svc, authn := newClientsServer() + defer cs.Close() cases := []struct { desc string @@ -1645,9 +1649,9 @@ func TestSetClientParentGroupEndpoint(t *testing.T) { for _, tc := range cases { t.Run(tc.desc, func(t *testing.T) { req := testRequest{ - client: gs.Client(), + client: cs.Client(), method: http.MethodPost, - url: fmt.Sprintf("%s/%s/clients/%s/parent", gs.URL, tc.domainID, tc.id), + url: fmt.Sprintf("%s/%s/clients/%s/parent", cs.URL+versionPrefix, tc.domainID, tc.id), contentType: tc.contentType, token: tc.token, body: strings.NewReader(tc.data), @@ -1667,8 +1671,8 @@ func TestSetClientParentGroupEndpoint(t *testing.T) { } func TestRemoveClientParentGroupEndpoint(t *testing.T) { - gs, svc, authn := newClientsServer() - defer gs.Close() + cs, svc, authn := newClientsServer() + defer cs.Close() cases := []struct { desc string @@ -1735,9 +1739,9 @@ func TestRemoveClientParentGroupEndpoint(t *testing.T) { for _, tc := range cases { t.Run(tc.desc, func(t *testing.T) { req := testRequest{ - client: gs.Client(), + client: cs.Client(), method: http.MethodDelete, - url: fmt.Sprintf("%s/%s/clients/%s/parent", gs.URL, tc.domainID, tc.id), + url: fmt.Sprintf("%s/%s/clients/%s/parent", cs.URL+versionPrefix, tc.domainID, tc.id), token: tc.token, } if tc.token == validToken { diff --git a/clients/api/http/transport.go b/clients/api/http/transport.go index cd162e2769..ada56744ce 100644 --- a/clients/api/http/transport.go +++ b/clients/api/http/transport.go @@ -18,8 +18,8 @@ import ( func MakeHandler(tsvc clients.Service, authn smqauthn.Authentication, mux *chi.Mux, logger *slog.Logger, instanceID string) http.Handler { mux = clientsHandler(tsvc, authn, mux, logger) - mux.Get("/health", supermq.Health("clients", instanceID)) - mux.Handle("/metrics", promhttp.Handler()) + mux.Get(versionPrefix+"/health", supermq.Health("clients", instanceID)) + mux.Handle(versionPrefix+"/metrics", promhttp.Handler()) return mux } diff --git a/domains/api/http/endpoint_test.go b/domains/api/http/endpoint_test.go index 51a9b31adb..2085084f6a 100644 --- a/domains/api/http/endpoint_test.go +++ b/domains/api/http/endpoint_test.go @@ -30,6 +30,13 @@ import ( "github.com/stretchr/testify/mock" ) +const ( + contentType = "application/json" + refreshDuration = 24 * time.Hour + invalidDuration = 7 * 24 * time.Hour + versionPrefix = "/v1" +) + var ( validMetadata = domains.Metadata{"role": "client"} ID = testsutil.GenerateUUID(&testing.T{}) @@ -47,12 +54,6 @@ var ( userID = testsutil.GenerateUUID(&testing.T{}) ) -const ( - contentType = "application/json" - refreshDuration = 24 * time.Hour - invalidDuration = 7 * 24 * time.Hour -) - type testRequest struct { client *http.Client method string @@ -229,7 +230,7 @@ func TestCreateDomain(t *testing.T) { req := testRequest{ client: ds.Client(), method: http.MethodPost, - url: fmt.Sprintf("%s/domains", ds.URL), + url: fmt.Sprintf("%s/domains", ds.URL+versionPrefix), contentType: tc.contentType, token: tc.token, body: strings.NewReader(data), @@ -591,7 +592,7 @@ func TestListDomains(t *testing.T) { req := testRequest{ client: ds.Client(), method: http.MethodGet, - url: fmt.Sprintf("%s/domains?", ds.URL) + tc.query, + url: fmt.Sprintf("%s/domains?", ds.URL+versionPrefix) + tc.query, token: tc.token, } if tc.token == validToken { @@ -660,7 +661,7 @@ func TestViewDomain(t *testing.T) { req := testRequest{ client: ds.Client(), method: http.MethodGet, - url: fmt.Sprintf("%s/domains/%s", ds.URL, tc.domainID), + url: fmt.Sprintf("%s/domains/%s", ds.URL+versionPrefix, tc.domainID), token: tc.token, } if tc.token == validToken { @@ -811,7 +812,7 @@ func TestUpdateDomain(t *testing.T) { req := testRequest{ client: ds.Client(), method: http.MethodPatch, - url: fmt.Sprintf("%s/domains/%s", ds.URL, tc.domainID), + url: fmt.Sprintf("%s/domains/%s", ds.URL+versionPrefix, tc.domainID), body: strings.NewReader(data), contentType: tc.contentType, token: tc.token, @@ -898,7 +899,7 @@ func TestEnableDomain(t *testing.T) { req := testRequest{ client: ds.Client(), method: http.MethodPost, - url: fmt.Sprintf("%s/domains/%s/enable", ds.URL, tc.domainID), + url: fmt.Sprintf("%s/domains/%s/enable", ds.URL+versionPrefix, tc.domainID), contentType: contentType, token: tc.token, } @@ -976,7 +977,7 @@ func TestDisableDomain(t *testing.T) { req := testRequest{ client: ds.Client(), method: http.MethodPost, - url: fmt.Sprintf("%s/domains/%s/disable", ds.URL, tc.domainID), + url: fmt.Sprintf("%s/domains/%s/disable", ds.URL+versionPrefix, tc.domainID), contentType: contentType, token: tc.token, } @@ -1054,7 +1055,7 @@ func TestFreezeDomain(t *testing.T) { req := testRequest{ client: ds.Client(), method: http.MethodPost, - url: fmt.Sprintf("%s/domains/%s/freeze", ds.URL, tc.domainID), + url: fmt.Sprintf("%s/domains/%s/freeze", ds.URL+versionPrefix, tc.domainID), contentType: contentType, token: tc.token, } diff --git a/domains/api/http/transport.go b/domains/api/http/transport.go index fa68fe2f34..0ea88020fc 100644 --- a/domains/api/http/transport.go +++ b/domains/api/http/transport.go @@ -18,13 +18,15 @@ import ( "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" ) +const versionPrefix = "/v1" + func MakeHandler(svc domains.Service, authn authn.Authentication, mux *chi.Mux, logger *slog.Logger, instanceID string) *chi.Mux { opts := []kithttp.ServerOption{ kithttp.ServerErrorEncoder(apiutil.LoggingErrorEncoder(logger, api.EncodeError)), } d := roleManagerHttp.NewDecoder("domainID") - mux.Route("/domains", func(r chi.Router) { + mux.Route(versionPrefix+"/domains", func(r chi.Router) { r.Group(func(r chi.Router) { r.Use(api.AuthenticateMiddleware(authn, false)) r.Post("/", otelhttp.NewHandler(kithttp.NewServer( @@ -84,8 +86,8 @@ func MakeHandler(svc domains.Service, authn authn.Authentication, mux *chi.Mux, }) }) - mux.Get("/health", supermq.Health("auth", instanceID)) - mux.Handle("/metrics", promhttp.Handler()) + mux.Get(versionPrefix+"/health", supermq.Health("auth", instanceID)) + mux.Handle(versionPrefix+"/metrics", promhttp.Handler()) return mux } diff --git a/groups/api/http/endpoint_test.go b/groups/api/http/endpoint_test.go index c8d762e46d..2296098610 100644 --- a/groups/api/http/endpoint_test.go +++ b/groups/api/http/endpoint_test.go @@ -29,6 +29,12 @@ import ( "github.com/stretchr/testify/mock" ) +const ( + validToken = "validToken" + invalidToken = "invalidToken" + contentType = "application/json" +) + var ( validGroupResp = groups.Group{ ID: testsutil.GenerateUUID(&testing.T{}), @@ -45,10 +51,7 @@ var ( UpdatedBy: testsutil.GenerateUUID(&testing.T{}), Status: groups.EnabledStatus, } - validID = testsutil.GenerateUUID(&testing.T{}) - validToken = "validToken" - invalidToken = "invalidToken" - contentType = "application/json" + validID = testsutil.GenerateUUID(&testing.T{}) ) func newGroupsServer() (*httptest.Server, *mocks.Service, *authnmocks.Authentication) { @@ -199,7 +202,7 @@ func TestCreateGroupEndpoint(t *testing.T) { req := testRequest{ client: gs.Client(), method: http.MethodPost, - url: fmt.Sprintf("%s/%s/groups/", gs.URL, tc.domainID), + url: fmt.Sprintf("%s/%s/groups/", gs.URL+versionPrefix, tc.domainID), contentType: tc.contentType, token: tc.token, body: strings.NewReader(data), @@ -298,7 +301,7 @@ func TestViewGroupEndpoint(t *testing.T) { req := testRequest{ client: gs.Client(), method: http.MethodGet, - url: fmt.Sprintf("%s/%s/groups/%s", gs.URL, tc.domainID, tc.id), + url: fmt.Sprintf("%s/%s/groups/%s", gs.URL+versionPrefix, tc.domainID, tc.id), token: tc.token, } if tc.token == validToken { @@ -441,7 +444,7 @@ func TestUpdateGroupEndpoint(t *testing.T) { req := testRequest{ client: gs.Client(), method: http.MethodPut, - url: fmt.Sprintf("%s/%s/groups/%s", gs.URL, tc.domainID, tc.id), + url: fmt.Sprintf("%s/%s/groups/%s", gs.URL+versionPrefix, tc.domainID, tc.id), contentType: tc.contentType, token: tc.token, body: strings.NewReader(data), @@ -546,7 +549,7 @@ func TestEnableGroupEndpoint(t *testing.T) { req := testRequest{ client: gs.Client(), method: http.MethodPost, - url: fmt.Sprintf("%s/%s/groups/%s/enable", gs.URL, tc.domainID, tc.id), + url: fmt.Sprintf("%s/%s/groups/%s/enable", gs.URL+versionPrefix, tc.domainID, tc.id), token: tc.token, } if tc.token == validToken { @@ -649,7 +652,7 @@ func TestDisableGroupEndpoint(t *testing.T) { req := testRequest{ client: gs.Client(), method: http.MethodPost, - url: fmt.Sprintf("%s/%s/groups/%s/disable", gs.URL, tc.domainID, tc.id), + url: fmt.Sprintf("%s/%s/groups/%s/disable", gs.URL+versionPrefix, tc.domainID, tc.id), token: tc.token, } if tc.token == validToken { @@ -955,7 +958,7 @@ func TestListGroups(t *testing.T) { req := testRequest{ client: gs.Client(), method: http.MethodGet, - url: gs.URL + "/" + tc.domainID + "/groups?" + tc.query, + url: gs.URL + versionPrefix + "/" + tc.domainID + "/groups?" + tc.query, contentType: contentType, token: tc.token, } @@ -1046,7 +1049,7 @@ func TestDeleteGroupEndpoint(t *testing.T) { req := testRequest{ client: gs.Client(), method: http.MethodDelete, - url: fmt.Sprintf("%s/%s/groups/%s", gs.URL, tc.domainID, tc.id), + url: fmt.Sprintf("%s/%s/groups/%s", gs.URL+versionPrefix, tc.domainID, tc.id), token: tc.token, } if tc.token == validToken { @@ -1215,7 +1218,7 @@ func TestRetrieveGroupHierarchyEndpoint(t *testing.T) { req := testRequest{ client: gs.Client(), method: http.MethodGet, - url: fmt.Sprintf("%s/%s/groups/%s/hierarchy?%s", gs.URL, tc.domainID, tc.groupID, tc.query), + url: fmt.Sprintf("%s/%s/groups/%s/hierarchy?%s", gs.URL+versionPrefix, tc.domainID, tc.groupID, tc.query), token: tc.token, } if tc.token == validToken { @@ -1362,7 +1365,7 @@ func TestAddParentGroupEndpoint(t *testing.T) { req := testRequest{ client: gs.Client(), method: http.MethodPost, - url: fmt.Sprintf("%s/%s/groups/%s/parent", gs.URL, tc.domainID, tc.id), + url: fmt.Sprintf("%s/%s/groups/%s/parent", gs.URL+versionPrefix, tc.domainID, tc.id), token: tc.token, contentType: tc.contentType, body: strings.NewReader(data), @@ -1455,7 +1458,7 @@ func TestRemoveParentGroupEndpoint(t *testing.T) { req := testRequest{ client: gs.Client(), method: http.MethodDelete, - url: fmt.Sprintf("%s/%s/groups/%s/parent", gs.URL, tc.domainID, tc.id), + url: fmt.Sprintf("%s/%s/groups/%s/parent", gs.URL+versionPrefix, tc.domainID, tc.id), token: tc.token, } if tc.token == validToken { @@ -1605,7 +1608,7 @@ func TestAddChildrenGroupsEndpoint(t *testing.T) { req := testRequest{ client: gs.Client(), method: http.MethodPost, - url: fmt.Sprintf("%s/%s/groups/%s/children", gs.URL, tc.domainID, tc.id), + url: fmt.Sprintf("%s/%s/groups/%s/children", gs.URL+versionPrefix, tc.domainID, tc.id), token: tc.token, contentType: tc.contentType, body: strings.NewReader(data), @@ -1747,7 +1750,7 @@ func TestRemoveChildrenGroupsEndpoint(t *testing.T) { req := testRequest{ client: gs.Client(), method: http.MethodDelete, - url: fmt.Sprintf("%s/%s/groups/%s/children", gs.URL, tc.domainID, tc.id), + url: fmt.Sprintf("%s/%s/groups/%s/children", gs.URL+versionPrefix, tc.domainID, tc.id), token: tc.token, contentType: tc.contentType, body: strings.NewReader(data), @@ -1840,7 +1843,7 @@ func TestRemoveAllChildrenGroupsEndpoint(t *testing.T) { req := testRequest{ client: gs.Client(), method: http.MethodDelete, - url: fmt.Sprintf("%s/%s/groups/%s/children/all", gs.URL, tc.domainID, tc.id), + url: fmt.Sprintf("%s/%s/groups/%s/children/all", gs.URL+versionPrefix, tc.domainID, tc.id), token: tc.token, } if tc.token == validToken { @@ -1984,7 +1987,7 @@ func TestListChildrenGroupsEndpoint(t *testing.T) { req := testRequest{ client: gs.Client(), method: http.MethodGet, - url: fmt.Sprintf("%s/%s/groups/%s/children?%s", gs.URL, tc.domainID, tc.id, tc.query), + url: fmt.Sprintf("%s/%s/groups/%s/children?%s", gs.URL+versionPrefix, tc.domainID, tc.id, tc.query), token: tc.token, } if tc.token == validToken { diff --git a/groups/api/http/transport.go b/groups/api/http/transport.go index 36a0f462a7..71cec666b7 100644 --- a/groups/api/http/transport.go +++ b/groups/api/http/transport.go @@ -18,6 +18,8 @@ import ( "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" ) +const versionPrefix = "/v1" + // MakeHandler returns a HTTP handler for Groups API endpoints. func MakeHandler(svc groups.Service, authn authn.Authentication, mux *chi.Mux, logger *slog.Logger, instanceID string) *chi.Mux { opts := []kithttp.ServerOption{ @@ -25,7 +27,7 @@ func MakeHandler(svc groups.Service, authn authn.Authentication, mux *chi.Mux, l } d := roleManagerHttp.NewDecoder("groupID") - mux.Route("/{domainID}/groups", func(r chi.Router) { + mux.Route(versionPrefix+"/{domainID}/groups", func(r chi.Router) { r.Use(api.AuthenticateMiddleware(authn, true)) r.Post("/", otelhttp.NewHandler(kithttp.NewServer( CreateGroupEndpoint(svc), @@ -135,8 +137,8 @@ func MakeHandler(svc groups.Service, authn authn.Authentication, mux *chi.Mux, l }) }) - mux.Get("/health", supermq.Health("groups", instanceID)) - mux.Handle("/metrics", promhttp.Handler()) + mux.Get(versionPrefix+"/health", supermq.Health("groups", instanceID)) + mux.Handle(versionPrefix+"/metrics", promhttp.Handler()) return mux } diff --git a/http/api/transport.go b/http/api/transport.go index 56fee979fe..b1b11c1e58 100644 --- a/http/api/transport.go +++ b/http/api/transport.go @@ -21,9 +21,10 @@ import ( ) const ( - ctSenmlJSON = "application/senml+json" - ctSenmlCBOR = "application/senml+cbor" - contentType = "application/json" + ctSenmlJSON = "application/senml+json" + ctSenmlCBOR = "application/senml+cbor" + contentType = "application/json" + versionPrefix = "/v1" ) // MakeHandler returns a HTTP handler for API endpoints. @@ -46,6 +47,7 @@ func MakeHandler(logger *slog.Logger, instanceID string) http.Handler { api.EncodeResponse, opts..., ), "publish").ServeHTTP) + r.Get("/health", supermq.Health("http", instanceID)) r.Handle("/metrics", promhttp.Handler()) diff --git a/invitations/api/endpoint_test.go b/invitations/api/endpoint_test.go index 540c169661..84a6cdc7e5 100644 --- a/invitations/api/endpoint_test.go +++ b/invitations/api/endpoint_test.go @@ -24,11 +24,15 @@ import ( "github.com/stretchr/testify/mock" ) -var ( +const ( validToken = "valid" validContenType = "application/json" - validID = testsutil.GenerateUUID(&testing.T{}) - domainID = testsutil.GenerateUUID(&testing.T{}) + versionPrefix = "/v1" +) + +var ( + validID = testsutil.GenerateUUID(&testing.T{}) + domainID = testsutil.GenerateUUID(&testing.T{}) ) type testRequest struct { @@ -139,7 +143,7 @@ func TestSendInvitation(t *testing.T) { req := testRequest{ client: is.Client(), method: http.MethodPost, - url: is.URL + "/invitations", + url: is.URL + versionPrefix + "/invitations", token: tc.token, contentType: tc.contentType, body: strings.NewReader(tc.data), @@ -312,7 +316,7 @@ func TestListInvitation(t *testing.T) { req := testRequest{ client: is.Client(), method: http.MethodGet, - url: is.URL + "/invitations?" + tc.query, + url: is.URL + versionPrefix + "/invitations?" + tc.query, token: tc.token, contentType: tc.contentType, } @@ -404,7 +408,7 @@ func TestViewInvitation(t *testing.T) { req := testRequest{ client: is.Client(), method: http.MethodGet, - url: is.URL + "/invitations/" + tc.userID + "/" + tc.domainID, + url: is.URL + versionPrefix + "/invitations/" + tc.userID + "/" + tc.domainID, token: tc.token, contentType: tc.contentType, } @@ -498,7 +502,7 @@ func TestDeleteInvitation(t *testing.T) { req := testRequest{ client: is.Client(), method: http.MethodDelete, - url: is.URL + "/invitations/" + tc.userID + "/" + tc.domainID, + url: is.URL + versionPrefix + "/invitations/" + tc.userID + "/" + tc.domainID, token: tc.token, contentType: tc.contentType, } @@ -576,7 +580,7 @@ func TestAcceptInvitation(t *testing.T) { req := testRequest{ client: is.Client(), method: http.MethodPost, - url: is.URL + "/invitations/accept", + url: is.URL + versionPrefix + "/invitations/accept", token: tc.token, contentType: tc.contentType, body: strings.NewReader(tc.data), @@ -656,7 +660,7 @@ func TestRejectInvitation(t *testing.T) { req := testRequest{ client: is.Client(), method: http.MethodPost, - url: is.URL + "/invitations/reject", + url: is.URL + versionPrefix + "/invitations/reject", token: tc.token, contentType: tc.contentType, body: strings.NewReader(tc.data), diff --git a/invitations/api/transport.go b/invitations/api/transport.go index 06eae21779..015eefed16 100644 --- a/invitations/api/transport.go +++ b/invitations/api/transport.go @@ -23,11 +23,12 @@ import ( ) const ( - userIDKey = "user_id" - domainIDKey = "domain_id" - invitedByKey = "invited_by" - relationKey = "relation" - stateKey = "state" + userIDKey = "user_id" + domainIDKey = "domain_id" + invitedByKey = "invited_by" + relationKey = "relation" + stateKey = "state" + versionPrefix = "/v1" ) func MakeHandler(svc invitations.Service, logger *slog.Logger, authn smqauthn.Authentication, instanceID string) http.Handler { @@ -40,7 +41,7 @@ func MakeHandler(svc invitations.Service, logger *slog.Logger, authn smqauthn.Au mux.Group(func(r chi.Router) { r.Use(api.AuthenticateMiddleware(authn, false)) - r.Route("/invitations", func(r chi.Router) { + r.Route(versionPrefix+"/invitations", func(r chi.Router) { r.Post("/", otelhttp.NewHandler(kithttp.NewServer( sendInvitationEndpoint(svc), decodeSendInvitationReq, @@ -82,8 +83,8 @@ func MakeHandler(svc invitations.Service, logger *slog.Logger, authn smqauthn.Au }) }) - mux.Get("/health", supermq.Health("invitations", instanceID)) - mux.Handle("/metrics", promhttp.Handler()) + mux.Get(versionPrefix+"/health", supermq.Health("invitations", instanceID)) + mux.Handle(versionPrefix+"/metrics", promhttp.Handler()) return mux } diff --git a/journal/api/endpoint_test.go b/journal/api/endpoint_test.go index 38e944f9a4..47f10cfd11 100644 --- a/journal/api/endpoint_test.go +++ b/journal/api/endpoint_test.go @@ -25,7 +25,10 @@ import ( "github.com/stretchr/testify/mock" ) -var validToken = "valid" +const ( + validToken = "valid" + versionPrefix = "/v1" +) type testRequest struct { client *http.Client @@ -265,7 +268,7 @@ func TestListUserJournalsEndpoint(t *testing.T) { req := testRequest{ client: es.Client(), method: http.MethodGet, - url: es.URL + "/journal" + c.url, + url: es.URL + versionPrefix + "/journal" + c.url, token: c.token, } @@ -390,7 +393,7 @@ func TestListEntityJournalsEndpoint(t *testing.T) { req := testRequest{ client: es.Client(), method: http.MethodGet, - url: fmt.Sprintf("%s/%s/journal%s", es.URL, c.domainID, c.url), + url: fmt.Sprintf("%s/%s/journal%s", es.URL+versionPrefix, c.domainID, c.url), token: c.token, } resp, err := req.make() @@ -473,7 +476,7 @@ func TestRetrieveClientTelemetryEndpoint(t *testing.T) { req := testRequest{ client: es.Client(), method: http.MethodGet, - url: fmt.Sprintf("%s/%s/journal%s", es.URL, c.domainID, c.url), + url: fmt.Sprintf("%s/%s/journal%s", es.URL+versionPrefix, c.domainID, c.url), token: c.token, } resp, err := req.make() diff --git a/journal/api/transport.go b/journal/api/transport.go index f3c856c928..93d1f919f4 100644 --- a/journal/api/transport.go +++ b/journal/api/transport.go @@ -31,6 +31,7 @@ const ( metadataKey = "with_metadata" entityIDKey = "id" entityTypeKey = "entity_type" + versionPrefix = "/v1" ) // MakeHandler returns a HTTP API handler with health check and metrics. @@ -41,33 +42,35 @@ func MakeHandler(svc journal.Service, authn smqauthn.Authentication, logger *slo mux := chi.NewRouter() - mux.With(api.AuthenticateMiddleware(authn, false)).Get("/journal/user/{userID}", otelhttp.NewHandler(kithttp.NewServer( - retrieveJournalsEndpoint(svc), - decodeRetrieveUserJournalReq, - api.EncodeResponse, - opts..., - ), "list_user_journals").ServeHTTP) - - mux.Route("/{domainID}/journal", func(r chi.Router) { - r.Use(api.AuthenticateMiddleware(authn, true)) - - r.Get("/{entityType}/{entityID}", otelhttp.NewHandler(kithttp.NewServer( + mux.Route(versionPrefix, func(r chi.Router) { + r.With(api.AuthenticateMiddleware(authn, false)).Get("/journal/user/{userID}", otelhttp.NewHandler(kithttp.NewServer( retrieveJournalsEndpoint(svc), - decodeRetrieveEntityJournalReq, - api.EncodeResponse, - opts..., - ), "list__entity_journals").ServeHTTP) - - r.Get("/client/{clientID}/telemetry", otelhttp.NewHandler(kithttp.NewServer( - retrieveClientTelemetryEndpoint(svc), - decodeRetrieveClientTelemetryReq, + decodeRetrieveUserJournalReq, api.EncodeResponse, opts..., - ), "view_client_telemetry").ServeHTTP) + ), "list_user_journals").ServeHTTP) + + r.Route("/{domainID}/journal", func(r chi.Router) { + r.Use(api.AuthenticateMiddleware(authn, true)) + + r.Get("/{entityType}/{entityID}", otelhttp.NewHandler(kithttp.NewServer( + retrieveJournalsEndpoint(svc), + decodeRetrieveEntityJournalReq, + api.EncodeResponse, + opts..., + ), "list__entity_journals").ServeHTTP) + + r.Get("/client/{clientID}/telemetry", otelhttp.NewHandler(kithttp.NewServer( + retrieveClientTelemetryEndpoint(svc), + decodeRetrieveClientTelemetryReq, + api.EncodeResponse, + opts..., + ), "view_client_telemetry").ServeHTTP) + }) }) - mux.Get("/health", supermq.Health(svcName, instanceID)) - mux.Handle("/metrics", promhttp.Handler()) + mux.Get(versionPrefix+"/health", supermq.Health(svcName, instanceID)) + mux.Handle(versionPrefix+"/metrics", promhttp.Handler()) return mux } diff --git a/pkg/sdk/certs.go b/pkg/sdk/certs.go index c724eda670..096f66f177 100644 --- a/pkg/sdk/certs.go +++ b/pkg/sdk/certs.go @@ -38,7 +38,7 @@ func (sdk mgSDK) IssueCert(clientID, validity, domainID, token string) (Cert, er return Cert{}, errors.NewSDKError(err) } - url := fmt.Sprintf("%s/%s/%s", sdk.certsURL, domainID, certsEndpoint) + url := fmt.Sprintf("%s/%s/%s", sdk.certsURL+versionPrefix, domainID, certsEndpoint) _, body, sdkerr := sdk.processRequest(http.MethodPost, url, token, d, nil, http.StatusCreated) if sdkerr != nil { @@ -53,7 +53,7 @@ func (sdk mgSDK) IssueCert(clientID, validity, domainID, token string) (Cert, er } func (sdk mgSDK) ViewCert(id, domainID, token string) (Cert, errors.SDKError) { - url := fmt.Sprintf("%s/%s/%s/%s", sdk.certsURL, domainID, certsEndpoint, id) + url := fmt.Sprintf("%s/%s/%s/%s", sdk.certsURL+versionPrefix, domainID, certsEndpoint, id) _, body, err := sdk.processRequest(http.MethodGet, url, token, nil, nil, http.StatusOK) if err != nil { @@ -72,7 +72,7 @@ func (sdk mgSDK) ViewCertByClient(clientID, domainID, token string) (CertSerials if clientID == "" { return CertSerials{}, errors.NewSDKError(apiutil.ErrMissingID) } - url := fmt.Sprintf("%s/%s/%s/%s", sdk.certsURL, domainID, serialsEndpoint, clientID) + url := fmt.Sprintf("%s/%s/%s/%s", sdk.certsURL+versionPrefix, domainID, serialsEndpoint, clientID) _, body, err := sdk.processRequest(http.MethodGet, url, token, nil, nil, http.StatusOK) if err != nil { @@ -87,7 +87,7 @@ func (sdk mgSDK) ViewCertByClient(clientID, domainID, token string) (CertSerials } func (sdk mgSDK) RevokeCert(id, domainID, token string) (time.Time, errors.SDKError) { - url := fmt.Sprintf("%s/%s/%s/%s", sdk.certsURL, domainID, certsEndpoint, id) + url := fmt.Sprintf("%s/%s/%s/%s", sdk.certsURL+versionPrefix, domainID, certsEndpoint, id) _, body, err := sdk.processRequest(http.MethodDelete, url, token, nil, nil, http.StatusOK) if err != nil { diff --git a/pkg/sdk/channels.go b/pkg/sdk/channels.go index d8ae98ab42..c2f3d9bad4 100644 --- a/pkg/sdk/channels.go +++ b/pkg/sdk/channels.go @@ -38,7 +38,7 @@ func (sdk mgSDK) CreateChannel(c Channel, domainID, token string) (Channel, erro if err != nil { return Channel{}, errors.NewSDKError(err) } - url := fmt.Sprintf("%s/%s/%s", sdk.channelsURL, domainID, channelsEndpoint) + url := fmt.Sprintf("%s/%s/%s", sdk.channelsURL+versionPrefix, domainID, channelsEndpoint) _, body, sdkerr := sdk.processRequest(http.MethodPost, url, token, data, nil, http.StatusCreated) if sdkerr != nil { @@ -59,7 +59,7 @@ func (sdk mgSDK) CreateChannels(channels []Channel, domainID, token string) ([]C return []Channel{}, errors.NewSDKError(err) } - url := fmt.Sprintf("%s/%s/%s/%s", sdk.channelsURL, domainID, channelsEndpoint, "bulk") + url := fmt.Sprintf("%s/%s/%s/%s", sdk.channelsURL+versionPrefix, domainID, channelsEndpoint, "bulk") _, body, sdkerr := sdk.processRequest(http.MethodPost, url, token, data, nil, http.StatusOK) if sdkerr != nil { @@ -76,7 +76,7 @@ func (sdk mgSDK) CreateChannels(channels []Channel, domainID, token string) ([]C func (sdk mgSDK) Channels(pm PageMetadata, domainID, token string) (ChannelsPage, errors.SDKError) { endpoint := fmt.Sprintf("%s/%s", domainID, channelsEndpoint) - url, err := sdk.withQueryParams(sdk.channelsURL, endpoint, pm) + url, err := sdk.withQueryParams(sdk.channelsURL+versionPrefix, endpoint, pm) if err != nil { return ChannelsPage{}, errors.NewSDKError(err) } @@ -98,7 +98,7 @@ func (sdk mgSDK) Channel(id, domainID, token string) (Channel, errors.SDKError) if id == "" { return Channel{}, errors.NewSDKError(apiutil.ErrMissingID) } - url := fmt.Sprintf("%s/%s/%s/%s", sdk.channelsURL, domainID, channelsEndpoint, id) + url := fmt.Sprintf("%s/%s/%s/%s", sdk.channelsURL+versionPrefix, domainID, channelsEndpoint, id) _, body, err := sdk.processRequest(http.MethodGet, url, token, nil, nil, http.StatusOK) if err != nil { @@ -117,7 +117,7 @@ func (sdk mgSDK) UpdateChannel(c Channel, domainID, token string) (Channel, erro if c.ID == "" { return Channel{}, errors.NewSDKError(apiutil.ErrMissingID) } - url := fmt.Sprintf("%s/%s/%s/%s", sdk.channelsURL, domainID, channelsEndpoint, c.ID) + url := fmt.Sprintf("%s/%s/%s/%s", sdk.channelsURL+versionPrefix, domainID, channelsEndpoint, c.ID) data, err := json.Marshal(c) if err != nil { @@ -141,7 +141,7 @@ func (sdk mgSDK) UpdateChannelTags(c Channel, domainID, token string) (Channel, if c.ID == "" { return Channel{}, errors.NewSDKError(apiutil.ErrMissingID) } - url := fmt.Sprintf("%s/%s/%s/%s/tags", sdk.channelsURL, domainID, channelsEndpoint, c.ID) + url := fmt.Sprintf("%s/%s/%s/%s/tags", sdk.channelsURL+versionPrefix, domainID, channelsEndpoint, c.ID) data, err := json.Marshal(c) if err != nil { @@ -167,7 +167,7 @@ func (sdk mgSDK) Connect(conn Connection, domainID, token string) errors.SDKErro return errors.NewSDKError(err) } - url := fmt.Sprintf("%s/%s/%s/%s", sdk.channelsURL, domainID, channelsEndpoint, connectEndpoint) + url := fmt.Sprintf("%s/%s/%s/%s", sdk.channelsURL+versionPrefix, domainID, channelsEndpoint, connectEndpoint) _, _, sdkerr := sdk.processRequest(http.MethodPost, url, token, data, nil, http.StatusCreated) @@ -180,7 +180,7 @@ func (sdk mgSDK) Disconnect(conn Connection, domainID, token string) errors.SDKE return errors.NewSDKError(err) } - url := fmt.Sprintf("%s/%s/%s/%s", sdk.channelsURL, domainID, channelsEndpoint, disconnectEndpoint) + url := fmt.Sprintf("%s/%s/%s/%s", sdk.channelsURL+versionPrefix, domainID, channelsEndpoint, disconnectEndpoint) _, _, sdkerr := sdk.processRequest(http.MethodPost, url, token, data, nil, http.StatusNoContent) @@ -196,7 +196,7 @@ func (sdk mgSDK) ConnectClients(channelID string, clientIDs, connTypes []string, if err != nil { return errors.NewSDKError(err) } - url := fmt.Sprintf("%s/%s/%s/%s/%s", sdk.channelsURL, domainID, channelsEndpoint, channelID, connectEndpoint) + url := fmt.Sprintf("%s/%s/%s/%s/%s", sdk.channelsURL+versionPrefix, domainID, channelsEndpoint, channelID, connectEndpoint) _, _, sdkerr := sdk.processRequest(http.MethodPost, url, token, data, nil, http.StatusCreated) @@ -212,7 +212,7 @@ func (sdk mgSDK) DisconnectClients(channelID string, clientIDs, connTypes []stri if err != nil { return errors.NewSDKError(err) } - url := fmt.Sprintf("%s/%s/%s/%s/%s", sdk.channelsURL, domainID, channelsEndpoint, channelID, disconnectEndpoint) + url := fmt.Sprintf("%s/%s/%s/%s/%s", sdk.channelsURL+versionPrefix, domainID, channelsEndpoint, channelID, disconnectEndpoint) _, _, sdkerr := sdk.processRequest(http.MethodPost, url, token, data, nil, http.StatusNoContent) @@ -231,13 +231,13 @@ func (sdk mgSDK) DeleteChannel(id, domainID, token string) errors.SDKError { if id == "" { return errors.NewSDKError(apiutil.ErrMissingID) } - url := fmt.Sprintf("%s/%s/%s/%s", sdk.channelsURL, domainID, channelsEndpoint, id) + url := fmt.Sprintf("%s/%s/%s/%s", sdk.channelsURL+versionPrefix, domainID, channelsEndpoint, id) _, _, sdkerr := sdk.processRequest(http.MethodDelete, url, token, nil, nil, http.StatusNoContent) return sdkerr } func (sdk mgSDK) changeChannelStatus(id, status, domainID, token string) (Channel, errors.SDKError) { - url := fmt.Sprintf("%s/%s/%s/%s/%s", sdk.channelsURL, domainID, channelsEndpoint, id, status) + url := fmt.Sprintf("%s/%s/%s/%s/%s", sdk.channelsURL+versionPrefix, domainID, channelsEndpoint, id, status) _, body, err := sdk.processRequest(http.MethodPost, url, token, nil, nil, http.StatusOK) if err != nil { @@ -258,7 +258,7 @@ func (sdk mgSDK) SetChannelParent(id, domainID, groupID, token string) errors.SD return errors.NewSDKError(err) } - url := fmt.Sprintf("%s/%s/%s/%s/%s", sdk.channelsURL, domainID, channelsEndpoint, id, parentEndpoint) + url := fmt.Sprintf("%s/%s/%s/%s/%s", sdk.channelsURL+versionPrefix, domainID, channelsEndpoint, id, parentEndpoint) _, _, sdkerr := sdk.processRequest(http.MethodPost, url, token, data, nil, http.StatusOK) return sdkerr @@ -271,7 +271,7 @@ func (sdk mgSDK) RemoveChannelParent(id, domainID, groupID, token string) errors return errors.NewSDKError(err) } - url := fmt.Sprintf("%s/%s/%s/%s/%s", sdk.channelsURL, domainID, channelsEndpoint, id, parentEndpoint) + url := fmt.Sprintf("%s/%s/%s/%s/%s", sdk.channelsURL+versionPrefix, domainID, channelsEndpoint, id, parentEndpoint) _, _, sdkerr := sdk.processRequest(http.MethodDelete, url, token, data, nil, http.StatusNoContent) return sdkerr diff --git a/pkg/sdk/clients.go b/pkg/sdk/clients.go index c3f4c971a8..4b9304b238 100644 --- a/pkg/sdk/clients.go +++ b/pkg/sdk/clients.go @@ -50,7 +50,7 @@ func (sdk mgSDK) CreateClient(client Client, domainID, token string) (Client, er return Client{}, errors.NewSDKError(err) } - url := fmt.Sprintf("%s/%s/%s", sdk.clientsURL, domainID, clientsEndpoint) + url := fmt.Sprintf("%s/%s/%s", sdk.clientsURL+versionPrefix, domainID, clientsEndpoint) _, body, sdkerr := sdk.processRequest(http.MethodPost, url, token, data, nil, http.StatusCreated) if sdkerr != nil { @@ -71,7 +71,7 @@ func (sdk mgSDK) CreateClients(clients []Client, domainID, token string) ([]Clie return []Client{}, errors.NewSDKError(err) } - url := fmt.Sprintf("%s/%s/%s/%s", sdk.clientsURL, domainID, clientsEndpoint, "bulk") + url := fmt.Sprintf("%s/%s/%s/%s", sdk.clientsURL+versionPrefix, domainID, clientsEndpoint, "bulk") _, body, sdkerr := sdk.processRequest(http.MethodPost, url, token, data, nil, http.StatusOK) if sdkerr != nil { @@ -88,7 +88,7 @@ func (sdk mgSDK) CreateClients(clients []Client, domainID, token string) ([]Clie func (sdk mgSDK) Clients(pm PageMetadata, domainID, token string) (ClientsPage, errors.SDKError) { endpoint := fmt.Sprintf("%s/%s", domainID, clientsEndpoint) - url, err := sdk.withQueryParams(sdk.clientsURL, endpoint, pm) + url, err := sdk.withQueryParams(sdk.clientsURL+versionPrefix, endpoint, pm) if err != nil { return ClientsPage{}, errors.NewSDKError(err) } @@ -110,7 +110,7 @@ func (sdk mgSDK) Client(id, domainID, token string) (Client, errors.SDKError) { if id == "" { return Client{}, errors.NewSDKError(apiutil.ErrMissingID) } - url := fmt.Sprintf("%s/%s/%s/%s", sdk.clientsURL, domainID, clientsEndpoint, id) + url := fmt.Sprintf("%s/%s/%s/%s", sdk.clientsURL+versionPrefix, domainID, clientsEndpoint, id) _, body, sdkerr := sdk.processRequest(http.MethodGet, url, token, nil, nil, http.StatusOK) if sdkerr != nil { @@ -129,7 +129,7 @@ func (sdk mgSDK) UpdateClient(t Client, domainID, token string) (Client, errors. if t.ID == "" { return Client{}, errors.NewSDKError(apiutil.ErrMissingID) } - url := fmt.Sprintf("%s/%s/%s/%s", sdk.clientsURL, domainID, clientsEndpoint, t.ID) + url := fmt.Sprintf("%s/%s/%s/%s", sdk.clientsURL+versionPrefix, domainID, clientsEndpoint, t.ID) data, err := json.Marshal(t) if err != nil { @@ -155,7 +155,7 @@ func (sdk mgSDK) UpdateClientTags(t Client, domainID, token string) (Client, err return Client{}, errors.NewSDKError(err) } - url := fmt.Sprintf("%s/%s/%s/%s/tags", sdk.clientsURL, domainID, clientsEndpoint, t.ID) + url := fmt.Sprintf("%s/%s/%s/%s/tags", sdk.clientsURL+versionPrefix, domainID, clientsEndpoint, t.ID) _, body, sdkerr := sdk.processRequest(http.MethodPatch, url, token, data, nil, http.StatusOK) if sdkerr != nil { @@ -178,7 +178,7 @@ func (sdk mgSDK) UpdateClientSecret(id, secret, domainID, token string) (Client, return Client{}, errors.NewSDKError(err) } - url := fmt.Sprintf("%s/%s/%s/%s/secret", sdk.clientsURL, domainID, clientsEndpoint, id) + url := fmt.Sprintf("%s/%s/%s/%s/secret", sdk.clientsURL+versionPrefix, domainID, clientsEndpoint, id) _, body, sdkerr := sdk.processRequest(http.MethodPatch, url, token, data, nil, http.StatusOK) if sdkerr != nil { @@ -202,7 +202,7 @@ func (sdk mgSDK) DisableClient(id, domainID, token string) (Client, errors.SDKEr } func (sdk mgSDK) changeClientStatus(id, status, domainID, token string) (Client, errors.SDKError) { - url := fmt.Sprintf("%s/%s/%s/%s/%s", sdk.clientsURL, domainID, clientsEndpoint, id, status) + url := fmt.Sprintf("%s/%s/%s/%s/%s", sdk.clientsURL+versionPrefix, domainID, clientsEndpoint, id, status) _, body, sdkerr := sdk.processRequest(http.MethodPost, url, token, nil, nil, http.StatusOK) if sdkerr != nil { @@ -224,7 +224,7 @@ func (sdk mgSDK) SetClientParent(id, domainID, groupID, token string) errors.SDK return errors.NewSDKError(err) } - url := fmt.Sprintf("%s/%s/%s/%s/%s", sdk.clientsURL, domainID, clientsEndpoint, id, parentEndpoint) + url := fmt.Sprintf("%s/%s/%s/%s/%s", sdk.clientsURL+versionPrefix, domainID, clientsEndpoint, id, parentEndpoint) _, _, sdkerr := sdk.processRequest(http.MethodPost, url, token, data, nil, http.StatusOK) return sdkerr @@ -237,7 +237,7 @@ func (sdk mgSDK) RemoveClientParent(id, domainID, groupID, token string) errors. return errors.NewSDKError(err) } - url := fmt.Sprintf("%s/%s/%s/%s/%s", sdk.clientsURL, domainID, clientsEndpoint, id, parentEndpoint) + url := fmt.Sprintf("%s/%s/%s/%s/%s", sdk.clientsURL+versionPrefix, domainID, clientsEndpoint, id, parentEndpoint) _, _, sdkerr := sdk.processRequest(http.MethodDelete, url, token, data, nil, http.StatusNoContent) return sdkerr @@ -247,63 +247,63 @@ func (sdk mgSDK) DeleteClient(id, domainID, token string) errors.SDKError { if id == "" { return errors.NewSDKError(apiutil.ErrMissingID) } - url := fmt.Sprintf("%s/%s/%s/%s", sdk.clientsURL, domainID, clientsEndpoint, id) + url := fmt.Sprintf("%s/%s/%s/%s", sdk.clientsURL+versionPrefix, domainID, clientsEndpoint, id) _, _, sdkerr := sdk.processRequest(http.MethodDelete, url, token, nil, nil, http.StatusNoContent) return sdkerr } func (sdk mgSDK) CreateClientRole(id, domainID string, rq RoleReq, token string) (Role, errors.SDKError) { - return sdk.createRole(sdk.clientsURL, clientsEndpoint, id, domainID, rq, token) + return sdk.createRole(sdk.clientsURL+versionPrefix, clientsEndpoint, id, domainID, rq, token) } func (sdk mgSDK) ClientRoles(id, domainID string, pm PageMetadata, token string) (RolesPage, errors.SDKError) { - return sdk.listRoles(sdk.clientsURL, clientsEndpoint, id, domainID, pm, token) + return sdk.listRoles(sdk.clientsURL+versionPrefix, clientsEndpoint, id, domainID, pm, token) } func (sdk mgSDK) ClientRole(id, roleID, domainID, token string) (Role, errors.SDKError) { - return sdk.viewRole(sdk.clientsURL, clientsEndpoint, id, roleID, domainID, token) + return sdk.viewRole(sdk.clientsURL+versionPrefix, clientsEndpoint, id, roleID, domainID, token) } func (sdk mgSDK) UpdateClientRole(id, roleID, newName, domainID string, token string) (Role, errors.SDKError) { - return sdk.updateRole(sdk.clientsURL, clientsEndpoint, id, roleID, newName, domainID, token) + return sdk.updateRole(sdk.clientsURL+versionPrefix, clientsEndpoint, id, roleID, newName, domainID, token) } func (sdk mgSDK) DeleteClientRole(id, roleID, domainID, token string) errors.SDKError { - return sdk.deleteRole(sdk.clientsURL, clientsEndpoint, id, roleID, domainID, token) + return sdk.deleteRole(sdk.clientsURL+versionPrefix, clientsEndpoint, id, roleID, domainID, token) } func (sdk mgSDK) AddClientRoleActions(id, roleID, domainID string, actions []string, token string) ([]string, errors.SDKError) { - return sdk.addRoleActions(sdk.clientsURL, clientsEndpoint, id, roleID, domainID, actions, token) + return sdk.addRoleActions(sdk.clientsURL+versionPrefix, clientsEndpoint, id, roleID, domainID, actions, token) } func (sdk mgSDK) ClientRoleActions(id, roleID, domainID string, token string) ([]string, errors.SDKError) { - return sdk.listRoleActions(sdk.clientsURL, clientsEndpoint, id, roleID, domainID, token) + return sdk.listRoleActions(sdk.clientsURL+versionPrefix, clientsEndpoint, id, roleID, domainID, token) } func (sdk mgSDK) RemoveClientRoleActions(id, roleID, domainID string, actions []string, token string) errors.SDKError { - return sdk.removeRoleActions(sdk.clientsURL, clientsEndpoint, id, roleID, domainID, actions, token) + return sdk.removeRoleActions(sdk.clientsURL+versionPrefix, clientsEndpoint, id, roleID, domainID, actions, token) } func (sdk mgSDK) RemoveAllClientRoleActions(id, roleID, domainID, token string) errors.SDKError { - return sdk.removeAllRoleActions(sdk.clientsURL, clientsEndpoint, id, roleID, domainID, token) + return sdk.removeAllRoleActions(sdk.clientsURL+versionPrefix, clientsEndpoint, id, roleID, domainID, token) } func (sdk mgSDK) AddClientRoleMembers(id, roleID, domainID string, members []string, token string) ([]string, errors.SDKError) { - return sdk.addRoleMembers(sdk.clientsURL, clientsEndpoint, id, roleID, domainID, members, token) + return sdk.addRoleMembers(sdk.clientsURL+versionPrefix, clientsEndpoint, id, roleID, domainID, members, token) } func (sdk mgSDK) ClientRoleMembers(id, roleID, domainID string, pm PageMetadata, token string) (RoleMembersPage, errors.SDKError) { - return sdk.listRoleMembers(sdk.clientsURL, clientsEndpoint, id, roleID, domainID, pm, token) + return sdk.listRoleMembers(sdk.clientsURL+versionPrefix, clientsEndpoint, id, roleID, domainID, pm, token) } func (sdk mgSDK) RemoveClientRoleMembers(id, roleID, domainID string, members []string, token string) errors.SDKError { - return sdk.removeRoleMembers(sdk.clientsURL, clientsEndpoint, id, roleID, domainID, members, token) + return sdk.removeRoleMembers(sdk.clientsURL+versionPrefix, clientsEndpoint, id, roleID, domainID, members, token) } func (sdk mgSDK) RemoveAllClientRoleMembers(id, roleID, domainID, token string) errors.SDKError { - return sdk.removeAllRoleMembers(sdk.clientsURL, clientsEndpoint, id, roleID, domainID, token) + return sdk.removeAllRoleMembers(sdk.clientsURL+versionPrefix, clientsEndpoint, id, roleID, domainID, token) } func (sdk mgSDK) AvailableClientRoleActions(domainID, token string) ([]string, errors.SDKError) { - return sdk.listAvailableRoleActions(sdk.clientsURL, clientsEndpoint, domainID, token) + return sdk.listAvailableRoleActions(sdk.clientsURL+versionPrefix, clientsEndpoint, domainID, token) } diff --git a/pkg/sdk/domains.go b/pkg/sdk/domains.go index 0e1e965a0e..36d654a957 100644 --- a/pkg/sdk/domains.go +++ b/pkg/sdk/domains.go @@ -40,7 +40,7 @@ func (sdk mgSDK) CreateDomain(domain Domain, token string) (Domain, errors.SDKEr return Domain{}, errors.NewSDKError(err) } - url := fmt.Sprintf("%s/%s", sdk.domainsURL, domainsEndpoint) + url := fmt.Sprintf("%s/%s", sdk.domainsURL+versionPrefix, domainsEndpoint) _, body, sdkerr := sdk.processRequest(http.MethodPost, url, token, data, nil, http.StatusCreated) if sdkerr != nil { @@ -55,7 +55,7 @@ func (sdk mgSDK) CreateDomain(domain Domain, token string) (Domain, errors.SDKEr } func (sdk mgSDK) Domains(pm PageMetadata, token string) (DomainsPage, errors.SDKError) { - url, err := sdk.withQueryParams(sdk.domainsURL, domainsEndpoint, pm) + url, err := sdk.withQueryParams(sdk.domainsURL+versionPrefix, domainsEndpoint, pm) if err != nil { return DomainsPage{}, errors.NewSDKError(err) } @@ -77,7 +77,7 @@ func (sdk mgSDK) Domain(domainID, token string) (Domain, errors.SDKError) { if domainID == "" { return Domain{}, errors.NewSDKError(apiutil.ErrMissingID) } - url := fmt.Sprintf("%s/%s/%s", sdk.domainsURL, domainsEndpoint, domainID) + url := fmt.Sprintf("%s/%s/%s", sdk.domainsURL+versionPrefix, domainsEndpoint, domainID) _, body, sdkerr := sdk.processRequest(http.MethodGet, url, token, nil, nil, http.StatusOK) if sdkerr != nil { @@ -96,7 +96,7 @@ func (sdk mgSDK) UpdateDomain(domain Domain, token string) (Domain, errors.SDKEr if domain.ID == "" { return Domain{}, errors.NewSDKError(apiutil.ErrMissingID) } - url := fmt.Sprintf("%s/%s/%s", sdk.domainsURL, domainsEndpoint, domain.ID) + url := fmt.Sprintf("%s/%s/%s", sdk.domainsURL+versionPrefix, domainsEndpoint, domain.ID) data, err := json.Marshal(domain) if err != nil { @@ -128,63 +128,63 @@ func (sdk mgSDK) FreezeDomain(domainID, token string) errors.SDKError { } func (sdk mgSDK) changeDomainStatus(token, id, status string) errors.SDKError { - url := fmt.Sprintf("%s/%s/%s/%s", sdk.domainsURL, domainsEndpoint, id, status) + url := fmt.Sprintf("%s/%s/%s/%s", sdk.domainsURL+versionPrefix, domainsEndpoint, id, status) _, _, sdkerr := sdk.processRequest(http.MethodPost, url, token, nil, nil, http.StatusOK) return sdkerr } func (sdk mgSDK) CreateDomainRole(id string, rq RoleReq, token string) (Role, errors.SDKError) { - return sdk.createRole(sdk.domainsURL, domainsEndpoint, id, "", rq, token) + return sdk.createRole(sdk.domainsURL+versionPrefix, domainsEndpoint, id, "", rq, token) } func (sdk mgSDK) DomainRoles(id string, pm PageMetadata, token string) (RolesPage, errors.SDKError) { - return sdk.listRoles(sdk.domainsURL, domainsEndpoint, id, "", pm, token) + return sdk.listRoles(sdk.domainsURL+versionPrefix, domainsEndpoint, id, "", pm, token) } func (sdk mgSDK) DomainRole(id, roleID, token string) (Role, errors.SDKError) { - return sdk.viewRole(sdk.domainsURL, domainsEndpoint, id, roleID, "", token) + return sdk.viewRole(sdk.domainsURL+versionPrefix, domainsEndpoint, id, roleID, "", token) } func (sdk mgSDK) UpdateDomainRole(id, roleID, newName string, token string) (Role, errors.SDKError) { - return sdk.updateRole(sdk.domainsURL, domainsEndpoint, id, roleID, newName, "", token) + return sdk.updateRole(sdk.domainsURL+versionPrefix, domainsEndpoint, id, roleID, newName, "", token) } func (sdk mgSDK) DeleteDomainRole(id, roleID, token string) errors.SDKError { - return sdk.deleteRole(sdk.domainsURL, domainsEndpoint, id, roleID, "", token) + return sdk.deleteRole(sdk.domainsURL+versionPrefix, domainsEndpoint, id, roleID, "", token) } func (sdk mgSDK) AddDomainRoleActions(id, roleID string, actions []string, token string) ([]string, errors.SDKError) { - return sdk.addRoleActions(sdk.domainsURL, domainsEndpoint, id, roleID, "", actions, token) + return sdk.addRoleActions(sdk.domainsURL+versionPrefix, domainsEndpoint, id, roleID, "", actions, token) } func (sdk mgSDK) DomainRoleActions(id, roleID string, token string) ([]string, errors.SDKError) { - return sdk.listRoleActions(sdk.domainsURL, domainsEndpoint, id, roleID, "", token) + return sdk.listRoleActions(sdk.domainsURL+versionPrefix, domainsEndpoint, id, roleID, "", token) } func (sdk mgSDK) RemoveDomainRoleActions(id, roleID string, actions []string, token string) errors.SDKError { - return sdk.removeRoleActions(sdk.domainsURL, domainsEndpoint, id, roleID, "", actions, token) + return sdk.removeRoleActions(sdk.domainsURL+versionPrefix, domainsEndpoint, id, roleID, "", actions, token) } func (sdk mgSDK) RemoveAllDomainRoleActions(id, roleID, token string) errors.SDKError { - return sdk.removeAllRoleActions(sdk.domainsURL, domainsEndpoint, id, roleID, "", token) + return sdk.removeAllRoleActions(sdk.domainsURL+versionPrefix, domainsEndpoint, id, roleID, "", token) } func (sdk mgSDK) AddDomainRoleMembers(id, roleID string, members []string, token string) ([]string, errors.SDKError) { - return sdk.addRoleMembers(sdk.domainsURL, domainsEndpoint, id, roleID, "", members, token) + return sdk.addRoleMembers(sdk.domainsURL+versionPrefix, domainsEndpoint, id, roleID, "", members, token) } func (sdk mgSDK) DomainRoleMembers(id, roleID string, pm PageMetadata, token string) (RoleMembersPage, errors.SDKError) { - return sdk.listRoleMembers(sdk.domainsURL, domainsEndpoint, id, roleID, "", pm, token) + return sdk.listRoleMembers(sdk.domainsURL+versionPrefix, domainsEndpoint, id, roleID, "", pm, token) } func (sdk mgSDK) RemoveDomainRoleMembers(id, roleID string, members []string, token string) errors.SDKError { - return sdk.removeRoleMembers(sdk.domainsURL, domainsEndpoint, id, roleID, "", members, token) + return sdk.removeRoleMembers(sdk.domainsURL+versionPrefix, domainsEndpoint, id, roleID, "", members, token) } func (sdk mgSDK) RemoveAllDomainRoleMembers(id, roleID, token string) errors.SDKError { - return sdk.removeAllRoleMembers(sdk.domainsURL, domainsEndpoint, id, roleID, "", token) + return sdk.removeAllRoleMembers(sdk.domainsURL+versionPrefix, domainsEndpoint, id, roleID, "", token) } func (sdk mgSDK) AvailableDomainRoleActions(token string) ([]string, errors.SDKError) { - return sdk.listAvailableRoleActions(sdk.domainsURL, domainsEndpoint, "", token) + return sdk.listAvailableRoleActions(sdk.domainsURL+versionPrefix, domainsEndpoint, "", token) } diff --git a/pkg/sdk/groups.go b/pkg/sdk/groups.go index 7dc9d30269..29066868bd 100644 --- a/pkg/sdk/groups.go +++ b/pkg/sdk/groups.go @@ -53,7 +53,7 @@ func (sdk mgSDK) CreateGroup(g Group, domainID, token string) (Group, errors.SDK if err != nil { return Group{}, errors.NewSDKError(err) } - url := fmt.Sprintf("%s/%s/%s", sdk.groupsURL, domainID, groupsEndpoint) + url := fmt.Sprintf("%s/%s/%s", sdk.groupsURL+versionPrefix, domainID, groupsEndpoint) _, body, sdkerr := sdk.processRequest(http.MethodPost, url, token, data, nil, http.StatusCreated) if sdkerr != nil { @@ -70,7 +70,7 @@ func (sdk mgSDK) CreateGroup(g Group, domainID, token string) (Group, errors.SDK func (sdk mgSDK) Groups(pm PageMetadata, domainID, token string) (GroupsPage, errors.SDKError) { endpoint := fmt.Sprintf("%s/%s", domainID, groupsEndpoint) - url, err := sdk.withQueryParams(sdk.groupsURL, endpoint, pm) + url, err := sdk.withQueryParams(sdk.groupsURL+versionPrefix, endpoint, pm) if err != nil { return GroupsPage{}, errors.NewSDKError(err) } @@ -93,7 +93,7 @@ func (sdk mgSDK) Group(id, domainID, token string) (Group, errors.SDKError) { return Group{}, errors.NewSDKError(apiutil.ErrMissingID) } - url := fmt.Sprintf("%s/%s/%s/%s", sdk.groupsURL, domainID, groupsEndpoint, id) + url := fmt.Sprintf("%s/%s/%s/%s", sdk.groupsURL+versionPrefix, domainID, groupsEndpoint, id) _, body, sdkerr := sdk.processRequest(http.MethodGet, url, token, nil, nil, http.StatusOK) if sdkerr != nil { @@ -117,7 +117,7 @@ func (sdk mgSDK) UpdateGroup(g Group, domainID, token string) (Group, errors.SDK if g.ID == "" { return Group{}, errors.NewSDKError(apiutil.ErrMissingID) } - url := fmt.Sprintf("%s/%s/%s/%s", sdk.groupsURL, domainID, groupsEndpoint, g.ID) + url := fmt.Sprintf("%s/%s/%s/%s", sdk.groupsURL+versionPrefix, domainID, groupsEndpoint, g.ID) _, body, sdkerr := sdk.processRequest(http.MethodPut, url, token, data, nil, http.StatusOK) if sdkerr != nil { @@ -139,7 +139,7 @@ func (sdk mgSDK) SetGroupParent(id, domainID, groupID, token string) errors.SDKE return errors.NewSDKError(err) } - url := fmt.Sprintf("%s/%s/%s/%s/%s", sdk.groupsURL, domainID, groupsEndpoint, id, parentEndpoint) + url := fmt.Sprintf("%s/%s/%s/%s/%s", sdk.groupsURL+versionPrefix, domainID, groupsEndpoint, id, parentEndpoint) _, _, sdkerr := sdk.processRequest(http.MethodPost, url, token, data, nil, http.StatusOK) return sdkerr @@ -152,7 +152,7 @@ func (sdk mgSDK) RemoveGroupParent(id, domainID, groupID, token string) errors.S return errors.NewSDKError(err) } - url := fmt.Sprintf("%s/%s/%s/%s/%s", sdk.groupsURL, domainID, groupsEndpoint, id, parentEndpoint) + url := fmt.Sprintf("%s/%s/%s/%s/%s", sdk.groupsURL+versionPrefix, domainID, groupsEndpoint, id, parentEndpoint) _, _, sdkerr := sdk.processRequest(http.MethodDelete, url, token, data, nil, http.StatusNoContent) return sdkerr @@ -165,7 +165,7 @@ func (sdk mgSDK) AddChildren(id, domainID string, groupIDs []string, token strin return errors.NewSDKError(err) } - url := fmt.Sprintf("%s/%s/%s/%s/%s", sdk.groupsURL, domainID, groupsEndpoint, id, childrenEndpoint) + url := fmt.Sprintf("%s/%s/%s/%s/%s", sdk.groupsURL+versionPrefix, domainID, groupsEndpoint, id, childrenEndpoint) _, _, sdkerr := sdk.processRequest(http.MethodPost, url, token, data, nil, http.StatusOK) return sdkerr @@ -178,14 +178,14 @@ func (sdk mgSDK) RemoveChildren(id, domainID string, groupIDs []string, token st return errors.NewSDKError(err) } - url := fmt.Sprintf("%s/%s/%s/%s/%s", sdk.groupsURL, domainID, groupsEndpoint, id, childrenEndpoint) + url := fmt.Sprintf("%s/%s/%s/%s/%s", sdk.groupsURL+versionPrefix, domainID, groupsEndpoint, id, childrenEndpoint) _, _, sdkerr := sdk.processRequest(http.MethodDelete, url, token, data, nil, http.StatusNoContent) return sdkerr } func (sdk mgSDK) RemoveAllChildren(id, domainID, token string) errors.SDKError { - url := fmt.Sprintf("%s/%s/%s/%s/%s/%s", sdk.groupsURL, domainID, groupsEndpoint, id, childrenEndpoint, "all") + url := fmt.Sprintf("%s/%s/%s/%s/%s/%s", sdk.groupsURL+versionPrefix, domainID, groupsEndpoint, id, childrenEndpoint, "all") _, _, sdkerr := sdk.processRequest(http.MethodDelete, url, token, nil, nil, http.StatusNoContent) return sdkerr @@ -193,7 +193,7 @@ func (sdk mgSDK) RemoveAllChildren(id, domainID, token string) errors.SDKError { func (sdk mgSDK) Children(id, domainID string, pm PageMetadata, token string) (GroupsPage, errors.SDKError) { endpoint := fmt.Sprintf("%s/%s/%s/%s", domainID, groupsEndpoint, id, childrenEndpoint) - url, err := sdk.withQueryParams(sdk.groupsURL, endpoint, pm) + url, err := sdk.withQueryParams(sdk.groupsURL+versionPrefix, endpoint, pm) if err != nil { return GroupsPage{}, errors.NewSDKError(err) } @@ -220,7 +220,7 @@ func (sdk mgSDK) DisableGroup(id, domainID, token string) (Group, errors.SDKErro } func (sdk mgSDK) changeGroupStatus(id, status, domainID, token string) (Group, errors.SDKError) { - url := fmt.Sprintf("%s/%s/%s/%s/%s", sdk.groupsURL, domainID, groupsEndpoint, id, status) + url := fmt.Sprintf("%s/%s/%s/%s/%s", sdk.groupsURL+versionPrefix, domainID, groupsEndpoint, id, status) _, body, sdkerr := sdk.processRequest(http.MethodPost, url, token, nil, nil, http.StatusOK) if sdkerr != nil { @@ -238,14 +238,14 @@ func (sdk mgSDK) DeleteGroup(id, domainID, token string) errors.SDKError { if id == "" { return errors.NewSDKError(apiutil.ErrMissingID) } - url := fmt.Sprintf("%s/%s/%s/%s", sdk.groupsURL, domainID, groupsEndpoint, id) + url := fmt.Sprintf("%s/%s/%s/%s", sdk.groupsURL+versionPrefix, domainID, groupsEndpoint, id) _, _, sdkerr := sdk.processRequest(http.MethodDelete, url, token, nil, nil, http.StatusNoContent) return sdkerr } func (sdk mgSDK) Hierarchy(id, domainID string, pm PageMetadata, token string) (GroupsHierarchyPage, errors.SDKError) { endpoint := fmt.Sprintf("%s/%s/%s/hierarchy", domainID, groupsEndpoint, id) - url, err := sdk.withQueryParams(sdk.groupsURL, endpoint, pm) + url, err := sdk.withQueryParams(sdk.groupsURL+versionPrefix, endpoint, pm) if err != nil { return GroupsHierarchyPage{}, errors.NewSDKError(err) } @@ -264,57 +264,57 @@ func (sdk mgSDK) Hierarchy(id, domainID string, pm PageMetadata, token string) ( } func (sdk mgSDK) CreateGroupRole(id, domainID string, rq RoleReq, token string) (Role, errors.SDKError) { - return sdk.createRole(sdk.groupsURL, groupsEndpoint, id, domainID, rq, token) + return sdk.createRole(sdk.groupsURL+versionPrefix, groupsEndpoint, id, domainID, rq, token) } func (sdk mgSDK) GroupRoles(id, domainID string, pm PageMetadata, token string) (RolesPage, errors.SDKError) { - return sdk.listRoles(sdk.groupsURL, groupsEndpoint, id, domainID, pm, token) + return sdk.listRoles(sdk.groupsURL+versionPrefix, groupsEndpoint, id, domainID, pm, token) } func (sdk mgSDK) GroupRole(id, roleID, domainID, token string) (Role, errors.SDKError) { - return sdk.viewRole(sdk.groupsURL, groupsEndpoint, id, roleID, domainID, token) + return sdk.viewRole(sdk.groupsURL+versionPrefix, groupsEndpoint, id, roleID, domainID, token) } func (sdk mgSDK) UpdateGroupRole(id, roleID, newName, domainID string, token string) (Role, errors.SDKError) { - return sdk.updateRole(sdk.groupsURL, groupsEndpoint, id, roleID, newName, domainID, token) + return sdk.updateRole(sdk.groupsURL+versionPrefix, groupsEndpoint, id, roleID, newName, domainID, token) } func (sdk mgSDK) DeleteGroupRole(id, roleID, domainID, token string) errors.SDKError { - return sdk.deleteRole(sdk.groupsURL, groupsEndpoint, id, roleID, domainID, token) + return sdk.deleteRole(sdk.groupsURL+versionPrefix, groupsEndpoint, id, roleID, domainID, token) } func (sdk mgSDK) AddGroupRoleActions(id, roleID, domainID string, actions []string, token string) ([]string, errors.SDKError) { - return sdk.addRoleActions(sdk.groupsURL, groupsEndpoint, id, roleID, domainID, actions, token) + return sdk.addRoleActions(sdk.groupsURL+versionPrefix, groupsEndpoint, id, roleID, domainID, actions, token) } func (sdk mgSDK) GroupRoleActions(id, roleID, domainID string, token string) ([]string, errors.SDKError) { - return sdk.listRoleActions(sdk.groupsURL, groupsEndpoint, id, roleID, domainID, token) + return sdk.listRoleActions(sdk.groupsURL+versionPrefix, groupsEndpoint, id, roleID, domainID, token) } func (sdk mgSDK) RemoveGroupRoleActions(id, roleID, domainID string, actions []string, token string) errors.SDKError { - return sdk.removeRoleActions(sdk.groupsURL, groupsEndpoint, id, roleID, domainID, actions, token) + return sdk.removeRoleActions(sdk.groupsURL+versionPrefix, groupsEndpoint, id, roleID, domainID, actions, token) } func (sdk mgSDK) RemoveAllGroupRoleActions(id, roleID, domainID, token string) errors.SDKError { - return sdk.removeAllRoleActions(sdk.groupsURL, groupsEndpoint, id, roleID, domainID, token) + return sdk.removeAllRoleActions(sdk.groupsURL+versionPrefix, groupsEndpoint, id, roleID, domainID, token) } func (sdk mgSDK) AddGroupRoleMembers(id, roleID, domainID string, members []string, token string) ([]string, errors.SDKError) { - return sdk.addRoleMembers(sdk.groupsURL, groupsEndpoint, id, roleID, domainID, members, token) + return sdk.addRoleMembers(sdk.groupsURL+versionPrefix, groupsEndpoint, id, roleID, domainID, members, token) } func (sdk mgSDK) GroupRoleMembers(id, roleID, domainID string, pm PageMetadata, token string) (RoleMembersPage, errors.SDKError) { - return sdk.listRoleMembers(sdk.groupsURL, groupsEndpoint, id, roleID, domainID, pm, token) + return sdk.listRoleMembers(sdk.groupsURL+versionPrefix, groupsEndpoint, id, roleID, domainID, pm, token) } func (sdk mgSDK) RemoveGroupRoleMembers(id, roleID, domainID string, members []string, token string) errors.SDKError { - return sdk.removeRoleMembers(sdk.groupsURL, groupsEndpoint, id, roleID, domainID, members, token) + return sdk.removeRoleMembers(sdk.groupsURL+versionPrefix, groupsEndpoint, id, roleID, domainID, members, token) } func (sdk mgSDK) RemoveAllGroupRoleMembers(id, roleID, domainID, token string) errors.SDKError { - return sdk.removeAllRoleMembers(sdk.groupsURL, groupsEndpoint, id, roleID, domainID, token) + return sdk.removeAllRoleMembers(sdk.groupsURL+versionPrefix, groupsEndpoint, id, roleID, domainID, token) } func (sdk mgSDK) AvailableGroupRoleActions(domainID, token string) ([]string, errors.SDKError) { - return sdk.listAvailableRoleActions(sdk.groupsURL, groupsEndpoint, domainID, token) + return sdk.listAvailableRoleActions(sdk.groupsURL+versionPrefix, groupsEndpoint, domainID, token) } diff --git a/pkg/sdk/health.go b/pkg/sdk/health.go index 291f9c4fcb..6b4fd71d18 100644 --- a/pkg/sdk/health.go +++ b/pkg/sdk/health.go @@ -33,11 +33,11 @@ func (sdk mgSDK) Health(service string) (HealthInfo, errors.SDKError) { var url string switch service { case "clients": - url = fmt.Sprintf("%s/health", sdk.clientsURL) + url = fmt.Sprintf("%s/health", sdk.clientsURL+versionPrefix) case "users": - url = fmt.Sprintf("%s/health", sdk.usersURL) + url = fmt.Sprintf("%s/health", sdk.usersURL+versionPrefix) case "certs": - url = fmt.Sprintf("%s/health", sdk.certsURL) + url = fmt.Sprintf("%s/health", sdk.certsURL+versionPrefix) case "http-adapter": url = fmt.Sprintf("%s/health", sdk.httpAdapterURL) } diff --git a/pkg/sdk/invitations.go b/pkg/sdk/invitations.go index efedf17fa7..4bfbff243b 100644 --- a/pkg/sdk/invitations.go +++ b/pkg/sdk/invitations.go @@ -43,7 +43,7 @@ func (sdk mgSDK) SendInvitation(invitation Invitation, token string) (err error) return errors.NewSDKError(err) } - url := sdk.invitationsURL + "/" + invitationsEndpoint + url := sdk.invitationsURL + versionPrefix + "/" + invitationsEndpoint _, _, sdkerr := sdk.processRequest(http.MethodPost, url, token, data, nil, http.StatusCreated) @@ -51,7 +51,7 @@ func (sdk mgSDK) SendInvitation(invitation Invitation, token string) (err error) } func (sdk mgSDK) Invitation(userID, domainID, token string) (invitation Invitation, err error) { - url := sdk.invitationsURL + "/" + invitationsEndpoint + "/" + userID + "/" + domainID + url := sdk.invitationsURL + versionPrefix + "/" + invitationsEndpoint + "/" + userID + "/" + domainID _, body, sdkerr := sdk.processRequest(http.MethodGet, url, token, nil, nil, http.StatusOK) if sdkerr != nil { @@ -66,7 +66,7 @@ func (sdk mgSDK) Invitation(userID, domainID, token string) (invitation Invitati } func (sdk mgSDK) Invitations(pm PageMetadata, token string) (invitations InvitationPage, err error) { - url, err := sdk.withQueryParams(sdk.invitationsURL, invitationsEndpoint, pm) + url, err := sdk.withQueryParams(sdk.invitationsURL+versionPrefix, invitationsEndpoint, pm) if err != nil { return InvitationPage{}, errors.NewSDKError(err) } @@ -95,7 +95,7 @@ func (sdk mgSDK) AcceptInvitation(domainID, token string) (err error) { return errors.NewSDKError(err) } - url := sdk.invitationsURL + "/" + invitationsEndpoint + "/" + acceptEndpoint + url := sdk.invitationsURL + versionPrefix + "/" + invitationsEndpoint + "/" + acceptEndpoint _, _, sdkerr := sdk.processRequest(http.MethodPost, url, token, data, nil, http.StatusNoContent) @@ -113,7 +113,7 @@ func (sdk mgSDK) RejectInvitation(domainID, token string) (err error) { return errors.NewSDKError(err) } - url := sdk.invitationsURL + "/" + invitationsEndpoint + "/" + rejectEndpoint + url := sdk.invitationsURL + versionPrefix + "/" + invitationsEndpoint + "/" + rejectEndpoint _, _, sdkerr := sdk.processRequest(http.MethodPost, url, token, data, nil, http.StatusNoContent) @@ -121,7 +121,7 @@ func (sdk mgSDK) RejectInvitation(domainID, token string) (err error) { } func (sdk mgSDK) DeleteInvitation(userID, domainID, token string) (err error) { - url := sdk.invitationsURL + "/" + invitationsEndpoint + "/" + userID + "/" + domainID + url := sdk.invitationsURL + versionPrefix + "/" + invitationsEndpoint + "/" + userID + "/" + domainID _, _, sdkerr := sdk.processRequest(http.MethodDelete, url, token, nil, nil, http.StatusNoContent) diff --git a/pkg/sdk/journal.go b/pkg/sdk/journal.go index 420db09d02..41180b9096 100644 --- a/pkg/sdk/journal.go +++ b/pkg/sdk/journal.go @@ -43,7 +43,7 @@ func (sdk mgSDK) Journal(entityType, entityID, domainID string, pm PageMetadata, reqUrl = fmt.Sprintf("%s/%s/%s", journalEndpoint, entityType, entityID) } - url, err := sdk.withQueryParams(sdk.journalURL, reqUrl, pm) + url, err := sdk.withQueryParams(sdk.journalURL+versionPrefix, reqUrl, pm) if err != nil { return JournalsPage{}, errors.NewSDKError(err) } diff --git a/pkg/sdk/message_test.go b/pkg/sdk/message_test.go index 867affebdf..5ca2bdac4c 100644 --- a/pkg/sdk/message_test.go +++ b/pkg/sdk/message_test.go @@ -149,6 +149,7 @@ func TestSendMessage(t *testing.T) { svcCall := pub.On("Publish", mock.Anything, channelID, mock.Anything).Return(tc.svcErr) err := mgsdk.SendMessage(tc.chanName, tc.msg, tc.clientKey) assert.Equal(t, tc.err, err) + fmt.Println(err) if tc.err == nil { ok := svcCall.Parent.AssertCalled(t, "Publish", mock.Anything, channelID, mock.Anything) assert.True(t, ok) diff --git a/pkg/sdk/sdk.go b/pkg/sdk/sdk.go index f16dd92385..6b3f34b82c 100644 --- a/pkg/sdk/sdk.go +++ b/pkg/sdk/sdk.go @@ -39,6 +39,8 @@ const ( BearerPrefix = "Bearer " ClientPrefix = "Client " + + versionPrefix = "/v1" ) // ContentType represents all possible content types. diff --git a/pkg/sdk/tokens.go b/pkg/sdk/tokens.go index ab129bc284..ec762a8ca0 100644 --- a/pkg/sdk/tokens.go +++ b/pkg/sdk/tokens.go @@ -30,7 +30,7 @@ func (sdk mgSDK) CreateToken(lt Login) (Token, errors.SDKError) { return Token{}, errors.NewSDKError(err) } - url := fmt.Sprintf("%s/%s/%s", sdk.usersURL, usersEndpoint, issueTokenEndpoint) + url := fmt.Sprintf("%s/%s/%s", sdk.usersURL+versionPrefix, usersEndpoint, issueTokenEndpoint) _, body, sdkerr := sdk.processRequest(http.MethodPost, url, "", data, nil, http.StatusCreated) if sdkerr != nil { @@ -45,7 +45,7 @@ func (sdk mgSDK) CreateToken(lt Login) (Token, errors.SDKError) { } func (sdk mgSDK) RefreshToken(token string) (Token, errors.SDKError) { - url := fmt.Sprintf("%s/%s/%s", sdk.usersURL, usersEndpoint, refreshTokenEndpoint) + url := fmt.Sprintf("%s/%s/%s", sdk.usersURL+versionPrefix, usersEndpoint, refreshTokenEndpoint) _, body, sdkerr := sdk.processRequest(http.MethodPost, url, token, nil, nil, http.StatusCreated) if sdkerr != nil { diff --git a/pkg/sdk/users.go b/pkg/sdk/users.go index d5b6f6f133..7450a6f959 100644 --- a/pkg/sdk/users.go +++ b/pkg/sdk/users.go @@ -47,7 +47,7 @@ func (sdk mgSDK) CreateUser(user User, token string) (User, errors.SDKError) { return User{}, errors.NewSDKError(err) } - url := fmt.Sprintf("%s/%s", sdk.usersURL, usersEndpoint) + url := fmt.Sprintf("%s/%s", sdk.usersURL+versionPrefix, usersEndpoint) _, body, sdkerr := sdk.processRequest(http.MethodPost, url, token, data, nil, http.StatusCreated) if sdkerr != nil { @@ -63,7 +63,7 @@ func (sdk mgSDK) CreateUser(user User, token string) (User, errors.SDKError) { } func (sdk mgSDK) Users(pm PageMetadata, token string) (UsersPage, errors.SDKError) { - url, err := sdk.withQueryParams(sdk.usersURL, usersEndpoint, pm) + url, err := sdk.withQueryParams(sdk.usersURL+versionPrefix, usersEndpoint, pm) if err != nil { return UsersPage{}, errors.NewSDKError(err) } @@ -82,7 +82,7 @@ func (sdk mgSDK) Users(pm PageMetadata, token string) (UsersPage, errors.SDKErro } func (sdk mgSDK) Members(groupID, domainID string, pm PageMetadata, token string) (UsersPage, errors.SDKError) { - url, err := sdk.withQueryParams(sdk.usersURL, fmt.Sprintf("%s/%s/%s/%s", domainID, groupsEndpoint, groupID, usersEndpoint), pm) + url, err := sdk.withQueryParams(sdk.usersURL+versionPrefix, fmt.Sprintf("%s/%s/%s/%s", domainID, groupsEndpoint, groupID, usersEndpoint), pm) if err != nil { return UsersPage{}, errors.NewSDKError(err) } @@ -104,7 +104,7 @@ func (sdk mgSDK) User(id, token string) (User, errors.SDKError) { if id == "" { return User{}, errors.NewSDKError(apiutil.ErrMissingID) } - url := fmt.Sprintf("%s/%s/%s", sdk.usersURL, usersEndpoint, id) + url := fmt.Sprintf("%s/%s/%s", sdk.usersURL+versionPrefix, usersEndpoint, id) _, body, sdkerr := sdk.processRequest(http.MethodGet, url, token, nil, nil, http.StatusOK) if sdkerr != nil { @@ -120,7 +120,7 @@ func (sdk mgSDK) User(id, token string) (User, errors.SDKError) { } func (sdk mgSDK) UserProfile(token string) (User, errors.SDKError) { - url := fmt.Sprintf("%s/%s/profile", sdk.usersURL, usersEndpoint) + url := fmt.Sprintf("%s/%s/profile", sdk.usersURL+versionPrefix, usersEndpoint) _, body, sdkerr := sdk.processRequest(http.MethodGet, url, token, nil, nil, http.StatusOK) if sdkerr != nil { @@ -139,7 +139,7 @@ func (sdk mgSDK) UpdateUser(user User, token string) (User, errors.SDKError) { if user.ID == "" { return User{}, errors.NewSDKError(apiutil.ErrMissingID) } - url := fmt.Sprintf("%s/%s/%s", sdk.usersURL, usersEndpoint, user.ID) + url := fmt.Sprintf("%s/%s/%s", sdk.usersURL+versionPrefix, usersEndpoint, user.ID) data, err := json.Marshal(user) if err != nil { @@ -165,7 +165,7 @@ func (sdk mgSDK) UpdateUserTags(user User, token string) (User, errors.SDKError) return User{}, errors.NewSDKError(err) } - url := fmt.Sprintf("%s/%s/%s/tags", sdk.usersURL, usersEndpoint, user.ID) + url := fmt.Sprintf("%s/%s/%s/tags", sdk.usersURL+versionPrefix, usersEndpoint, user.ID) _, body, sdkerr := sdk.processRequest(http.MethodPatch, url, token, data, nil, http.StatusOK) if sdkerr != nil { @@ -188,7 +188,7 @@ func (sdk mgSDK) UpdateUserEmail(user User, token string) (User, errors.SDKError return User{}, errors.NewSDKError(err) } - url := fmt.Sprintf("%s/%s/%s/email", sdk.usersURL, usersEndpoint, user.ID) + url := fmt.Sprintf("%s/%s/%s/email", sdk.usersURL+versionPrefix, usersEndpoint, user.ID) _, body, sdkerr := sdk.processRequest(http.MethodPatch, url, token, data, nil, http.StatusOK) if sdkerr != nil { @@ -210,7 +210,7 @@ func (sdk mgSDK) ResetPasswordRequest(email string) errors.SDKError { if err != nil { return errors.NewSDKError(err) } - url := fmt.Sprintf("%s/%s/reset-request", sdk.usersURL, PasswordResetEndpoint) + url := fmt.Sprintf("%s/%s/reset-request", sdk.usersURL+versionPrefix, PasswordResetEndpoint) header := make(map[string]string) header["Referer"] = sdk.HostURL @@ -227,7 +227,7 @@ func (sdk mgSDK) ResetPassword(password, confPass, token string) errors.SDKError if err != nil { return errors.NewSDKError(err) } - url := fmt.Sprintf("%s/%s/reset", sdk.usersURL, PasswordResetEndpoint) + url := fmt.Sprintf("%s/%s/reset", sdk.usersURL+versionPrefix, PasswordResetEndpoint) _, _, sdkerr := sdk.processRequest(http.MethodPut, url, token, data, nil, http.StatusCreated) @@ -242,7 +242,7 @@ func (sdk mgSDK) UpdatePassword(oldPass, newPass, token string) (User, errors.SD return User{}, errors.NewSDKError(err) } - url := fmt.Sprintf("%s/%s/secret", sdk.usersURL, usersEndpoint) + url := fmt.Sprintf("%s/%s/secret", sdk.usersURL+versionPrefix, usersEndpoint) _, body, sdkerr := sdk.processRequest(http.MethodPatch, url, token, data, nil, http.StatusOK) if sdkerr != nil { @@ -263,7 +263,7 @@ func (sdk mgSDK) UpdateUserRole(user User, token string) (User, errors.SDKError) return User{}, errors.NewSDKError(err) } - url := fmt.Sprintf("%s/%s/%s/role", sdk.usersURL, usersEndpoint, user.ID) + url := fmt.Sprintf("%s/%s/%s/role", sdk.usersURL+versionPrefix, usersEndpoint, user.ID) _, body, sdkerr := sdk.processRequest(http.MethodPatch, url, token, data, nil, http.StatusOK) if sdkerr != nil { @@ -285,7 +285,7 @@ func (sdk mgSDK) UpdateUsername(user User, token string) (User, errors.SDKError) return User{}, errors.NewSDKError(err) } - url := fmt.Sprintf("%s/%s/%s/username", sdk.usersURL, usersEndpoint, user.ID) + url := fmt.Sprintf("%s/%s/%s/username", sdk.usersURL+versionPrefix, usersEndpoint, user.ID) _, body, sdkerr := sdk.processRequest(http.MethodPatch, url, token, data, nil, http.StatusOK) if sdkerr != nil { @@ -306,7 +306,7 @@ func (sdk mgSDK) UpdateProfilePicture(user User, token string) (User, errors.SDK return User{}, errors.NewSDKError(err) } - url := fmt.Sprintf("%s/%s/%s/picture", sdk.usersURL, usersEndpoint, user.ID) + url := fmt.Sprintf("%s/%s/%s/picture", sdk.usersURL+versionPrefix, usersEndpoint, user.ID) _, body, sdkerr := sdk.processRequest(http.MethodPatch, url, token, data, nil, http.StatusOK) if sdkerr != nil { @@ -322,7 +322,7 @@ func (sdk mgSDK) UpdateProfilePicture(user User, token string) (User, errors.SDK } func (sdk mgSDK) SearchUsers(pm PageMetadata, token string) (UsersPage, errors.SDKError) { - url, err := sdk.withQueryParams(sdk.usersURL, fmt.Sprintf("%s/search", usersEndpoint), pm) + url, err := sdk.withQueryParams(sdk.usersURL+versionPrefix, fmt.Sprintf("%s/search", usersEndpoint), pm) if err != nil { return UsersPage{}, errors.NewSDKError(err) } @@ -349,7 +349,7 @@ func (sdk mgSDK) DisableUser(id, token string) (User, errors.SDKError) { } func (sdk mgSDK) changeUserStatus(token, id, status string) (User, errors.SDKError) { - url := fmt.Sprintf("%s/%s/%s/%s", sdk.usersURL, usersEndpoint, id, status) + url := fmt.Sprintf("%s/%s/%s/%s", sdk.usersURL+versionPrefix, usersEndpoint, id, status) _, body, sdkerr := sdk.processRequest(http.MethodPost, url, token, nil, nil, http.StatusOK) if sdkerr != nil { @@ -368,13 +368,13 @@ func (sdk mgSDK) DeleteUser(id, token string) errors.SDKError { if id == "" { return errors.NewSDKError(apiutil.ErrMissingID) } - url := fmt.Sprintf("%s/%s/%s", sdk.usersURL, usersEndpoint, id) + url := fmt.Sprintf("%s/%s/%s", sdk.usersURL+versionPrefix, usersEndpoint, id) _, _, sdkerr := sdk.processRequest(http.MethodDelete, url, token, nil, nil, http.StatusNoContent) return sdkerr } func (sdk mgSDK) ListClientUsers(clientID, domainID string, pm PageMetadata, token string) (UsersPage, errors.SDKError) { - url, err := sdk.withQueryParams(sdk.usersURL, fmt.Sprintf("%s/%s/%s/%s", domainID, clientsEndpoint, clientID, usersEndpoint), pm) + url, err := sdk.withQueryParams(sdk.usersURL+versionPrefix, fmt.Sprintf("%s/%s/%s/%s", domainID, clientsEndpoint, clientID, usersEndpoint), pm) if err != nil { return UsersPage{}, errors.NewSDKError(err) } @@ -392,7 +392,7 @@ func (sdk mgSDK) ListClientUsers(clientID, domainID string, pm PageMetadata, tok } func (sdk mgSDK) ListDomainUsers(domainID string, pm PageMetadata, token string) (UsersPage, errors.SDKError) { - url, err := sdk.withQueryParams(sdk.usersURL, fmt.Sprintf("%s/%s", domainID, usersEndpoint), pm) + url, err := sdk.withQueryParams(sdk.usersURL+versionPrefix, fmt.Sprintf("%s/%s", domainID, usersEndpoint), pm) if err != nil { return UsersPage{}, errors.NewSDKError(err) } @@ -409,7 +409,7 @@ func (sdk mgSDK) ListDomainUsers(domainID string, pm PageMetadata, token string) } func (sdk mgSDK) ListChannelUsers(channelID, domainID string, pm PageMetadata, token string) (UsersPage, errors.SDKError) { - url, err := sdk.withQueryParams(sdk.usersURL, fmt.Sprintf("%s/%s/%s/%s", domainID, channelsEndpoint, channelID, usersEndpoint), pm) + url, err := sdk.withQueryParams(sdk.usersURL+versionPrefix, fmt.Sprintf("%s/%s/%s/%s", domainID, channelsEndpoint, channelID, usersEndpoint), pm) if err != nil { return UsersPage{}, errors.NewSDKError(err) } diff --git a/users/api/endpoint_test.go b/users/api/endpoint_test.go index fc7a48b517..120d282a00 100644 --- a/users/api/endpoint_test.go +++ b/users/api/endpoint_test.go @@ -32,8 +32,17 @@ import ( "github.com/stretchr/testify/mock" ) +const ( + contentType = "application/json" + secret = "strongsecret" + validToken = "valid" + inValidToken = "invalid" + inValid = "invalid" + validID = "d4ebb847-5d0e-4e46-bdd9-b6aceaaa3a22" + versionPrefix = "/v1" +) + var ( - secret = "strongsecret" validCMetadata = users.Metadata{"role": "user"} user = users.User{ ID: testsutil.GenerateUUID(&testing.T{}), @@ -45,16 +54,11 @@ var ( Metadata: validCMetadata, Status: users.EnabledStatus, } - validToken = "valid" - inValidToken = "invalid" - inValid = "invalid" - validID = "d4ebb847-5d0e-4e46-bdd9-b6aceaaa3a22" - passRegex = regexp.MustCompile("^.{8,}$") - testReferer = "http://localhost" - domainID = testsutil.GenerateUUID(&testing.T{}) -) -const contentType = "application/json" + passRegex = regexp.MustCompile("^.{8,}$") + testReferer = "http://localhost" + domainID = testsutil.GenerateUUID(&testing.T{}) +) type testRequest struct { user *http.Client @@ -228,7 +232,7 @@ func TestRegister(t *testing.T) { req := testRequest{ user: us.Client(), method: http.MethodPost, - url: fmt.Sprintf("%s/users/", us.URL), + url: fmt.Sprintf("%s/users/", us.URL+versionPrefix), contentType: tc.contentType, token: tc.token, body: strings.NewReader(data), @@ -314,7 +318,7 @@ func TestView(t *testing.T) { req := testRequest{ user: us.Client(), method: http.MethodGet, - url: fmt.Sprintf("%s/users/%s", us.URL, tc.id), + url: fmt.Sprintf("%s/users/%s", us.URL+versionPrefix, tc.id), token: tc.token, } @@ -392,7 +396,7 @@ func TestViewProfile(t *testing.T) { req := testRequest{ user: us.Client(), method: http.MethodGet, - url: fmt.Sprintf("%s/users/profile", us.URL), + url: fmt.Sprintf("%s/users/profile", us.URL+versionPrefix), token: tc.token, } @@ -760,7 +764,7 @@ func TestListUsers(t *testing.T) { req := testRequest{ user: us.Client(), method: http.MethodGet, - url: us.URL + "/users?" + tc.query, + url: us.URL + versionPrefix + "/users?" + tc.query, contentType: contentType, token: tc.token, } @@ -898,7 +902,7 @@ func TestSearchUsers(t *testing.T) { req := testRequest{ user: us.Client(), method: http.MethodGet, - url: fmt.Sprintf("%s/users/search?", us.URL) + tc.query, + url: fmt.Sprintf("%s/users/search?", us.URL+versionPrefix) + tc.query, token: tc.token, } @@ -1034,7 +1038,7 @@ func TestUpdate(t *testing.T) { req := testRequest{ user: us.Client(), method: http.MethodPatch, - url: fmt.Sprintf("%s/users/%s", us.URL, tc.id), + url: fmt.Sprintf("%s/users/%s", us.URL+versionPrefix, tc.id), contentType: tc.contentType, token: tc.token, body: strings.NewReader(tc.data), @@ -1171,7 +1175,7 @@ func TestUpdateTags(t *testing.T) { req := testRequest{ user: us.Client(), method: http.MethodPatch, - url: fmt.Sprintf("%s/users/%s/tags", us.URL, tc.id), + url: fmt.Sprintf("%s/users/%s/tags", us.URL+versionPrefix, tc.id), contentType: tc.contentType, token: tc.token, body: strings.NewReader(tc.data), @@ -1346,7 +1350,7 @@ func TestUpdateEmail(t *testing.T) { req := testRequest{ user: us.Client(), method: http.MethodPatch, - url: fmt.Sprintf("%s/users/%s/email", us.URL, tc.user.ID), + url: fmt.Sprintf("%s/users/%s/email", us.URL+versionPrefix, tc.user.ID), contentType: tc.contentType, token: tc.token, body: strings.NewReader(tc.data), @@ -1494,7 +1498,7 @@ func TestUpdateUsername(t *testing.T) { req := testRequest{ user: us.Client(), method: http.MethodPatch, - url: fmt.Sprintf("%s/users/%s/username", us.URL, tc.user.ID), + url: fmt.Sprintf("%s/users/%s/username", us.URL+versionPrefix, tc.user.ID), contentType: tc.contentType, token: tc.token, body: strings.NewReader(tc.data), @@ -1620,7 +1624,7 @@ func TestUpdateProfilePicture(t *testing.T) { req := testRequest{ user: us.Client(), method: http.MethodPatch, - url: fmt.Sprintf("%s/users/%s/picture", us.URL, tc.user.ID), + url: fmt.Sprintf("%s/users/%s/picture", us.URL+versionPrefix, tc.user.ID), contentType: tc.contentType, token: tc.token, body: strings.NewReader(tc.data), @@ -1725,7 +1729,7 @@ func TestPasswordResetRequest(t *testing.T) { req := testRequest{ user: us.Client(), method: http.MethodPost, - url: fmt.Sprintf("%s/password/reset-request", us.URL), + url: fmt.Sprintf("%s/password/reset-request", us.URL+versionPrefix), contentType: tc.contentType, referer: tc.referer, body: strings.NewReader(tc.data), @@ -1830,7 +1834,7 @@ func TestPasswordReset(t *testing.T) { req := testRequest{ user: us.Client(), method: http.MethodPut, - url: fmt.Sprintf("%s/password/reset", us.URL), + url: fmt.Sprintf("%s/password/reset", us.URL+versionPrefix), contentType: tc.contentType, referer: testReferer, token: tc.token, @@ -1951,7 +1955,7 @@ func TestUpdateRole(t *testing.T) { req := testRequest{ user: us.Client(), method: http.MethodPatch, - url: fmt.Sprintf("%s/users/%s/role", us.URL, tc.userID), + url: fmt.Sprintf("%s/users/%s/role", us.URL+versionPrefix, tc.userID), contentType: tc.contentType, token: tc.token, body: strings.NewReader(tc.data), @@ -2090,7 +2094,7 @@ func TestUpdateSecret(t *testing.T) { req := testRequest{ user: us.Client(), method: http.MethodPatch, - url: fmt.Sprintf("%s/users/secret", us.URL), + url: fmt.Sprintf("%s/users/secret", us.URL+versionPrefix), contentType: tc.contentType, token: tc.token, body: strings.NewReader(tc.data), @@ -2177,7 +2181,7 @@ func TestIssueToken(t *testing.T) { req := testRequest{ user: us.Client(), method: http.MethodPost, - url: fmt.Sprintf("%s/users/tokens/issue", us.URL), + url: fmt.Sprintf("%s/users/tokens/issue", us.URL+versionPrefix), contentType: tc.contentType, body: strings.NewReader(tc.data), } @@ -2274,7 +2278,7 @@ func TestRefreshToken(t *testing.T) { req := testRequest{ user: us.Client(), method: http.MethodPost, - url: fmt.Sprintf("%s/users/tokens/refresh", us.URL), + url: fmt.Sprintf("%s/users/tokens/refresh", us.URL+versionPrefix), contentType: tc.contentType, body: strings.NewReader(tc.data), token: tc.token, @@ -2371,7 +2375,7 @@ func TestEnable(t *testing.T) { req := testRequest{ user: us.Client(), method: http.MethodPost, - url: fmt.Sprintf("%s/users/%s/enable", us.URL, tc.user.ID), + url: fmt.Sprintf("%s/users/%s/enable", us.URL+versionPrefix, tc.user.ID), contentType: contentType, token: tc.token, body: strings.NewReader(data), @@ -2471,7 +2475,7 @@ func TestDisable(t *testing.T) { req := testRequest{ user: us.Client(), method: http.MethodPost, - url: fmt.Sprintf("%s/users/%s/disable", us.URL, tc.user.ID), + url: fmt.Sprintf("%s/users/%s/disable", us.URL+versionPrefix, tc.user.ID), contentType: contentType, token: tc.token, body: strings.NewReader(data), @@ -2549,7 +2553,7 @@ func TestDelete(t *testing.T) { req := testRequest{ user: us.Client(), method: http.MethodDelete, - url: fmt.Sprintf("%s/users/%s", us.URL, tc.user.ID), + url: fmt.Sprintf("%s/users/%s", us.URL+versionPrefix, tc.user.ID), contentType: contentType, token: tc.token, body: strings.NewReader(data), @@ -2873,7 +2877,7 @@ func TestListUsersByUserGroupId(t *testing.T) { req := testRequest{ user: us.Client(), method: http.MethodGet, - url: fmt.Sprintf("%s/%s/groups/%s/users?", us.URL, validID, tc.groupID) + tc.query, + url: fmt.Sprintf("%s/%s/groups/%s/users?", us.URL+versionPrefix, validID, tc.groupID) + tc.query, token: tc.token, } authnCall := authn.On("Authenticate", mock.Anything, tc.token).Return(tc.authnRes, tc.authnErr) @@ -3210,7 +3214,7 @@ func TestListUsersByChannelID(t *testing.T) { req := testRequest{ user: us.Client(), method: http.MethodGet, - url: fmt.Sprintf("%s/%s/channels/%s/users?", us.URL, validID, validID) + tc.query, + url: fmt.Sprintf("%s/%s/channels/%s/users?", us.URL+versionPrefix, validID, validID) + tc.query, token: tc.token, } @@ -3554,7 +3558,7 @@ func TestListUsersByDomainID(t *testing.T) { req := testRequest{ user: us.Client(), method: http.MethodGet, - url: fmt.Sprintf("%s/%s/users?", us.URL, validID) + tc.query, + url: fmt.Sprintf("%s/%s/users?", us.URL+versionPrefix, validID) + tc.query, token: tc.token, } @@ -3868,7 +3872,7 @@ func TestListUsersByClientID(t *testing.T) { req := testRequest{ user: us.Client(), method: http.MethodGet, - url: fmt.Sprintf("%s/%s/clients/%s/users?", us.URL, validID, validID) + tc.query, + url: fmt.Sprintf("%s/%s/clients/%s/users?", us.URL+versionPrefix, validID, validID) + tc.query, token: tc.token, } diff --git a/users/api/transport.go b/users/api/transport.go index 1ec6d228bd..982c0f2939 100644 --- a/users/api/transport.go +++ b/users/api/transport.go @@ -21,8 +21,8 @@ import ( func MakeHandler(cls users.Service, authn smqauthn.Authentication, tokensvc grpcTokenV1.TokenServiceClient, selfRegister bool, mux *chi.Mux, logger *slog.Logger, instanceID string, pr *regexp.Regexp, providers ...oauth2.Provider) http.Handler { mux = usersHandler(cls, authn, tokensvc, selfRegister, mux, logger, pr, providers...) - mux.Get("/health", supermq.Health("users", instanceID)) - mux.Handle("/metrics", promhttp.Handler()) + mux.Get(versionPrefix+"/health", supermq.Health("users", instanceID)) + mux.Handle(versionPrefix+"/metrics", promhttp.Handler()) return mux } diff --git a/users/api/users.go b/users/api/users.go index 1e107d2b28..f80ce4d5e5 100644 --- a/users/api/users.go +++ b/users/api/users.go @@ -25,6 +25,8 @@ import ( "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" ) +const versionPrefix = "/v1" + var passRegex = regexp.MustCompile("^.{8,}$") // usersHandler returns a HTTP handler for API endpoints. @@ -35,204 +37,206 @@ func usersHandler(svc users.Service, authn smqauthn.Authentication, tokenClient kithttp.ServerErrorEncoder(apiutil.LoggingErrorEncoder(logger, api.EncodeError)), } - r.Route("/users", func(r chi.Router) { - switch selfRegister { - case true: - r.Post("/", otelhttp.NewHandler(kithttp.NewServer( - registrationEndpoint(svc, selfRegister), - decodeCreateUserReq, - api.EncodeResponse, - opts..., - ), "register_user").ServeHTTP) - default: - r.With(api.AuthenticateMiddleware(authn, false)).Post("/", otelhttp.NewHandler(kithttp.NewServer( - registrationEndpoint(svc, selfRegister), - decodeCreateUserReq, - api.EncodeResponse, - opts..., - ), "register_user").ServeHTTP) - } + r.Route(versionPrefix, func(r chi.Router) { + r.Route("/users", func(r chi.Router) { + switch selfRegister { + case true: + r.Post("/", otelhttp.NewHandler(kithttp.NewServer( + registrationEndpoint(svc, selfRegister), + decodeCreateUserReq, + api.EncodeResponse, + opts..., + ), "register_user").ServeHTTP) + default: + r.With(api.AuthenticateMiddleware(authn, false)).Post("/", otelhttp.NewHandler(kithttp.NewServer( + registrationEndpoint(svc, selfRegister), + decodeCreateUserReq, + api.EncodeResponse, + opts..., + ), "register_user").ServeHTTP) + } + + r.Group(func(r chi.Router) { + r.Use(api.AuthenticateMiddleware(authn, false)) + + r.Get("/profile", otelhttp.NewHandler(kithttp.NewServer( + viewProfileEndpoint(svc), + decodeViewProfile, + api.EncodeResponse, + opts..., + ), "view_profile").ServeHTTP) + + r.Get("/{id}", otelhttp.NewHandler(kithttp.NewServer( + viewEndpoint(svc), + decodeViewUser, + api.EncodeResponse, + opts..., + ), "view_user").ServeHTTP) + + r.Get("/", otelhttp.NewHandler(kithttp.NewServer( + listUsersEndpoint(svc), + decodeListUsers, + api.EncodeResponse, + opts..., + ), "list_users").ServeHTTP) + + r.Get("/search", otelhttp.NewHandler(kithttp.NewServer( + searchUsersEndpoint(svc), + decodeSearchUsers, + api.EncodeResponse, + opts..., + ), "search_users").ServeHTTP) + + r.Patch("/secret", otelhttp.NewHandler(kithttp.NewServer( + updateSecretEndpoint(svc), + decodeUpdateUserSecret, + api.EncodeResponse, + opts..., + ), "update_user_secret").ServeHTTP) + + r.Patch("/{id}", otelhttp.NewHandler(kithttp.NewServer( + updateEndpoint(svc), + decodeUpdateUser, + api.EncodeResponse, + opts..., + ), "update_user").ServeHTTP) + + r.Patch("/{id}/username", otelhttp.NewHandler(kithttp.NewServer( + updateUsernameEndpoint(svc), + decodeUpdateUsername, + api.EncodeResponse, + opts..., + ), "update_username").ServeHTTP) + + r.Patch("/{id}/picture", otelhttp.NewHandler(kithttp.NewServer( + updateProfilePictureEndpoint(svc), + decodeUpdateUserProfilePicture, + api.EncodeResponse, + opts..., + ), "update_profile_picture").ServeHTTP) + + r.Patch("/{id}/tags", otelhttp.NewHandler(kithttp.NewServer( + updateTagsEndpoint(svc), + decodeUpdateUserTags, + api.EncodeResponse, + opts..., + ), "update_user_tags").ServeHTTP) + + r.Patch("/{id}/email", otelhttp.NewHandler(kithttp.NewServer( + updateEmailEndpoint(svc), + decodeUpdateUserEmail, + api.EncodeResponse, + opts..., + ), "update_user_email").ServeHTTP) + + r.Patch("/{id}/role", otelhttp.NewHandler(kithttp.NewServer( + updateRoleEndpoint(svc), + decodeUpdateUserRole, + api.EncodeResponse, + opts..., + ), "update_user_role").ServeHTTP) + + r.Post("/{id}/enable", otelhttp.NewHandler(kithttp.NewServer( + enableEndpoint(svc), + decodeChangeUserStatus, + api.EncodeResponse, + opts..., + ), "enable_user").ServeHTTP) + + r.Post("/{id}/disable", otelhttp.NewHandler(kithttp.NewServer( + disableEndpoint(svc), + decodeChangeUserStatus, + api.EncodeResponse, + opts..., + ), "disable_user").ServeHTTP) + + r.Delete("/{id}", otelhttp.NewHandler(kithttp.NewServer( + deleteEndpoint(svc), + decodeChangeUserStatus, + api.EncodeResponse, + opts..., + ), "delete_user").ServeHTTP) + + r.Post("/tokens/refresh", otelhttp.NewHandler(kithttp.NewServer( + refreshTokenEndpoint(svc), + decodeRefreshToken, + api.EncodeResponse, + opts..., + ), "refresh_token").ServeHTTP) + }) + }) r.Group(func(r chi.Router) { r.Use(api.AuthenticateMiddleware(authn, false)) - - r.Get("/profile", otelhttp.NewHandler(kithttp.NewServer( - viewProfileEndpoint(svc), - decodeViewProfile, - api.EncodeResponse, - opts..., - ), "view_profile").ServeHTTP) - - r.Get("/{id}", otelhttp.NewHandler(kithttp.NewServer( - viewEndpoint(svc), - decodeViewUser, - api.EncodeResponse, - opts..., - ), "view_user").ServeHTTP) - - r.Get("/", otelhttp.NewHandler(kithttp.NewServer( - listUsersEndpoint(svc), - decodeListUsers, - api.EncodeResponse, - opts..., - ), "list_users").ServeHTTP) - - r.Get("/search", otelhttp.NewHandler(kithttp.NewServer( - searchUsersEndpoint(svc), - decodeSearchUsers, - api.EncodeResponse, - opts..., - ), "search_users").ServeHTTP) - - r.Patch("/secret", otelhttp.NewHandler(kithttp.NewServer( - updateSecretEndpoint(svc), - decodeUpdateUserSecret, - api.EncodeResponse, - opts..., - ), "update_user_secret").ServeHTTP) - - r.Patch("/{id}", otelhttp.NewHandler(kithttp.NewServer( - updateEndpoint(svc), - decodeUpdateUser, - api.EncodeResponse, - opts..., - ), "update_user").ServeHTTP) - - r.Patch("/{id}/username", otelhttp.NewHandler(kithttp.NewServer( - updateUsernameEndpoint(svc), - decodeUpdateUsername, + r.Put("/password/reset", otelhttp.NewHandler(kithttp.NewServer( + passwordResetEndpoint(svc), + decodePasswordReset, api.EncodeResponse, opts..., - ), "update_username").ServeHTTP) - - r.Patch("/{id}/picture", otelhttp.NewHandler(kithttp.NewServer( - updateProfilePictureEndpoint(svc), - decodeUpdateUserProfilePicture, - api.EncodeResponse, - opts..., - ), "update_profile_picture").ServeHTTP) - - r.Patch("/{id}/tags", otelhttp.NewHandler(kithttp.NewServer( - updateTagsEndpoint(svc), - decodeUpdateUserTags, - api.EncodeResponse, - opts..., - ), "update_user_tags").ServeHTTP) - - r.Patch("/{id}/email", otelhttp.NewHandler(kithttp.NewServer( - updateEmailEndpoint(svc), - decodeUpdateUserEmail, - api.EncodeResponse, - opts..., - ), "update_user_email").ServeHTTP) - - r.Patch("/{id}/role", otelhttp.NewHandler(kithttp.NewServer( - updateRoleEndpoint(svc), - decodeUpdateUserRole, - api.EncodeResponse, - opts..., - ), "update_user_role").ServeHTTP) + ), "password_reset").ServeHTTP) + }) - r.Post("/{id}/enable", otelhttp.NewHandler(kithttp.NewServer( - enableEndpoint(svc), - decodeChangeUserStatus, + r.Group(func(r chi.Router) { + r.Use(api.AuthenticateMiddleware(authn, true)) + + // Ideal location: users service, groups endpoint. + // Reason for placing here : + // SpiceDB provides list of user ids in given user_group_id + // and users service can access spiceDB and get the user list with user_group_id. + // Request to get list of users present in the user_group_id {groupID} + r.Get("/{domainID}/groups/{groupID}/users", otelhttp.NewHandler(kithttp.NewServer( + listMembersByGroupEndpoint(svc), + decodeListMembersByGroup, api.EncodeResponse, opts..., - ), "enable_user").ServeHTTP) - - r.Post("/{id}/disable", otelhttp.NewHandler(kithttp.NewServer( - disableEndpoint(svc), - decodeChangeUserStatus, + ), "list_users_by_user_group_id").ServeHTTP) + + // Ideal location: clients service, channels endpoint. + // Reason for placing here : + // SpiceDB provides list of user ids in given channel_id + // and users service can access spiceDB and get the user list with channel_id. + // Request to get list of users present in the user_group_id {channelID} + r.Get("/{domainID}/channels/{channelID}/users", otelhttp.NewHandler(kithttp.NewServer( + listMembersByChannelEndpoint(svc), + decodeListMembersByChannel, api.EncodeResponse, opts..., - ), "disable_user").ServeHTTP) + ), "list_users_by_channel_id").ServeHTTP) - r.Delete("/{id}", otelhttp.NewHandler(kithttp.NewServer( - deleteEndpoint(svc), - decodeChangeUserStatus, + r.Get("/{domainID}/clients/{clientID}/users", otelhttp.NewHandler(kithttp.NewServer( + listMembersByClientEndpoint(svc), + decodeListMembersByClient, api.EncodeResponse, opts..., - ), "delete_user").ServeHTTP) + ), "list_users_by_client_id").ServeHTTP) - r.Post("/tokens/refresh", otelhttp.NewHandler(kithttp.NewServer( - refreshTokenEndpoint(svc), - decodeRefreshToken, + r.Get("/{domainID}/users", otelhttp.NewHandler(kithttp.NewServer( + listMembersByDomainEndpoint(svc), + decodeListMembersByDomain, api.EncodeResponse, opts..., - ), "refresh_token").ServeHTTP) + ), "list_users_by_domain_id").ServeHTTP) }) - }) - r.Group(func(r chi.Router) { - r.Use(api.AuthenticateMiddleware(authn, false)) - r.Put("/password/reset", otelhttp.NewHandler(kithttp.NewServer( - passwordResetEndpoint(svc), - decodePasswordReset, - api.EncodeResponse, - opts..., - ), "password_reset").ServeHTTP) - }) - - r.Group(func(r chi.Router) { - r.Use(api.AuthenticateMiddleware(authn, true)) - - // Ideal location: users service, groups endpoint. - // Reason for placing here : - // SpiceDB provides list of user ids in given user_group_id - // and users service can access spiceDB and get the user list with user_group_id. - // Request to get list of users present in the user_group_id {groupID} - r.Get("/{domainID}/groups/{groupID}/users", otelhttp.NewHandler(kithttp.NewServer( - listMembersByGroupEndpoint(svc), - decodeListMembersByGroup, - api.EncodeResponse, - opts..., - ), "list_users_by_user_group_id").ServeHTTP) - - // Ideal location: clients service, channels endpoint. - // Reason for placing here : - // SpiceDB provides list of user ids in given channel_id - // and users service can access spiceDB and get the user list with channel_id. - // Request to get list of users present in the user_group_id {channelID} - r.Get("/{domainID}/channels/{channelID}/users", otelhttp.NewHandler(kithttp.NewServer( - listMembersByChannelEndpoint(svc), - decodeListMembersByChannel, + r.Post("/users/tokens/issue", otelhttp.NewHandler(kithttp.NewServer( + issueTokenEndpoint(svc), + decodeCredentials, api.EncodeResponse, opts..., - ), "list_users_by_channel_id").ServeHTTP) + ), "issue_token").ServeHTTP) - r.Get("/{domainID}/clients/{clientID}/users", otelhttp.NewHandler(kithttp.NewServer( - listMembersByClientEndpoint(svc), - decodeListMembersByClient, + r.Post("/password/reset-request", otelhttp.NewHandler(kithttp.NewServer( + passwordResetRequestEndpoint(svc), + decodePasswordResetRequest, api.EncodeResponse, opts..., - ), "list_users_by_client_id").ServeHTTP) + ), "password_reset_req").ServeHTTP) - r.Get("/{domainID}/users", otelhttp.NewHandler(kithttp.NewServer( - listMembersByDomainEndpoint(svc), - decodeListMembersByDomain, - api.EncodeResponse, - opts..., - ), "list_users_by_domain_id").ServeHTTP) + for _, provider := range providers { + r.HandleFunc("/oauth/callback/"+provider.Name(), oauth2CallbackHandler(provider, svc, tokenClient)) + } }) - r.Post("/users/tokens/issue", otelhttp.NewHandler(kithttp.NewServer( - issueTokenEndpoint(svc), - decodeCredentials, - api.EncodeResponse, - opts..., - ), "issue_token").ServeHTTP) - - r.Post("/password/reset-request", otelhttp.NewHandler(kithttp.NewServer( - passwordResetRequestEndpoint(svc), - decodePasswordResetRequest, - api.EncodeResponse, - opts..., - ), "password_reset_req").ServeHTTP) - - for _, provider := range providers { - r.HandleFunc("/oauth/callback/"+provider.Name(), oauth2CallbackHandler(provider, svc, tokenClient)) - } - return r }