mirror of
https://github.com/absmach/supermq.git
synced 2026-06-23 06:40:19 +00:00
MG-2441 - Add domain ID to API (#2442)
Signed-off-by: nyagamunene <stevenyaga2014@gmail.com>
This commit is contained in:
@@ -27,7 +27,7 @@ tags:
|
||||
url: https://docs.magistrala.abstractmachines.fr/
|
||||
|
||||
paths:
|
||||
/things/configs:
|
||||
/{domainID}/things/configs:
|
||||
post:
|
||||
operationId: createConfig
|
||||
summary: Adds new config
|
||||
@@ -36,6 +36,8 @@ paths:
|
||||
the provided access token.
|
||||
tags:
|
||||
- configs
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
requestBody:
|
||||
$ref: "#/components/requestBodies/ConfigCreateReq"
|
||||
responses:
|
||||
@@ -70,6 +72,7 @@ paths:
|
||||
tags:
|
||||
- configs
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
- $ref: "#/components/parameters/Limit"
|
||||
- $ref: "#/components/parameters/Offset"
|
||||
- $ref: "#/components/parameters/State"
|
||||
@@ -85,13 +88,14 @@ paths:
|
||||
description: Database can't process request.
|
||||
"500":
|
||||
$ref: "#/components/responses/ServiceError"
|
||||
/things/configs/{configId}:
|
||||
/{domainID}/things/configs/{configId}:
|
||||
get:
|
||||
operationId: getConfig
|
||||
summary: Retrieves config info (with channels).
|
||||
tags:
|
||||
- configs
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
- $ref: "#/components/parameters/ConfigId"
|
||||
responses:
|
||||
"200":
|
||||
@@ -118,6 +122,7 @@ paths:
|
||||
tags:
|
||||
- configs
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
- $ref: "#/components/parameters/ConfigId"
|
||||
requestBody:
|
||||
$ref: "#/components/requestBodies/ConfigUpdateReq"
|
||||
@@ -147,6 +152,7 @@ paths:
|
||||
tags:
|
||||
- configs
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
- $ref: "#/components/parameters/ConfigId"
|
||||
responses:
|
||||
"204":
|
||||
@@ -161,7 +167,7 @@ paths:
|
||||
description: Database can't process request.
|
||||
"500":
|
||||
$ref: "#/components/responses/ServiceError"
|
||||
/things/configs/certs/{configId}:
|
||||
/{domainID}/things/configs/certs/{configId}:
|
||||
patch:
|
||||
operationId: updateConfigCerts
|
||||
summary: Updates certs
|
||||
@@ -171,6 +177,7 @@ paths:
|
||||
tags:
|
||||
- configs
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
- $ref: "#/components/parameters/ConfigId"
|
||||
requestBody:
|
||||
$ref: "#/components/requestBodies/ConfigCertUpdateReq"
|
||||
@@ -192,7 +199,7 @@ paths:
|
||||
description: Database can't process request.
|
||||
"500":
|
||||
$ref: "#/components/responses/ServiceError"
|
||||
/things/configs/connections/{configId}:
|
||||
/{domainID}/things/configs/connections/{configId}:
|
||||
put:
|
||||
operationId: updateConfigConnections
|
||||
summary: Updates channels the thing is connected to
|
||||
@@ -202,6 +209,7 @@ paths:
|
||||
tags:
|
||||
- configs
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
- $ref: "#/components/parameters/ConfigId"
|
||||
requestBody:
|
||||
$ref: "#/components/requestBodies/ConfigConnUpdateReq"
|
||||
@@ -273,7 +281,7 @@ paths:
|
||||
description: Database can't process request.
|
||||
"500":
|
||||
$ref: "#/components/responses/ServiceError"
|
||||
/things/state/{configId}:
|
||||
/{domainID}/things/state/{configId}:
|
||||
put:
|
||||
operationId: updateConfigState
|
||||
summary: Updates Config state.
|
||||
@@ -283,6 +291,7 @@ paths:
|
||||
tags:
|
||||
- configs
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
- $ref: "#/components/parameters/ConfigId"
|
||||
requestBody:
|
||||
$ref: "#/components/requestBodies/ConfigStateUpdateReq"
|
||||
|
||||
+10
-3
@@ -27,13 +27,15 @@ tags:
|
||||
url: https://docs.magistrala.abstractmachines.fr/
|
||||
|
||||
paths:
|
||||
/certs:
|
||||
/{domainID}/certs:
|
||||
post:
|
||||
operationId: createCert
|
||||
summary: Creates a certificate for thing
|
||||
description: Creates a certificate for thing
|
||||
tags:
|
||||
- certs
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
requestBody:
|
||||
$ref: "#/components/requestBodies/CertReq"
|
||||
responses:
|
||||
@@ -51,7 +53,7 @@ paths:
|
||||
description: Database can't process request.
|
||||
"500":
|
||||
$ref: "#/components/responses/ServiceError"
|
||||
/certs/{certID}:
|
||||
/{domainID}/certs/{certID}:
|
||||
get:
|
||||
operationId: getCert
|
||||
summary: Retrieves a certificate
|
||||
@@ -60,6 +62,7 @@ paths:
|
||||
tags:
|
||||
- certs
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
- $ref: "#/components/parameters/CertID"
|
||||
responses:
|
||||
"200":
|
||||
@@ -85,10 +88,13 @@ paths:
|
||||
tags:
|
||||
- certs
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
- $ref: "#/components/parameters/CertID"
|
||||
responses:
|
||||
"200":
|
||||
$ref: "#/components/responses/RevokeRes"
|
||||
"400":
|
||||
description: Failed due to malformed query parameters.
|
||||
"401":
|
||||
description: Missing or invalid access token provided.
|
||||
"403":
|
||||
@@ -100,7 +106,7 @@ paths:
|
||||
description: Database can't process request.
|
||||
"500":
|
||||
$ref: "#/components/responses/ServiceError"
|
||||
/serials/{thingID}:
|
||||
/{domainID}/serials/{thingID}:
|
||||
get:
|
||||
operationId: getSerials
|
||||
summary: Retrieves certificates' serial IDs
|
||||
@@ -109,6 +115,7 @@ paths:
|
||||
tags:
|
||||
- certs
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
- $ref: "#/components/parameters/ThingID"
|
||||
responses:
|
||||
"200":
|
||||
|
||||
+21
-54
@@ -27,7 +27,7 @@ tags:
|
||||
url: https://docs.magistrala.abstractmachines.fr/
|
||||
|
||||
paths:
|
||||
/invitations:
|
||||
/{domainID}/invitations:
|
||||
post:
|
||||
operationId: sendInvitation
|
||||
tags:
|
||||
@@ -35,6 +35,8 @@ paths:
|
||||
summary: Send invitation
|
||||
description: |
|
||||
Send invitation to user to join domain.
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
requestBody:
|
||||
$ref: "#/components/requestBodies/SendInvitationReq"
|
||||
security:
|
||||
@@ -70,7 +72,7 @@ paths:
|
||||
- $ref: "#/components/parameters/Offset"
|
||||
- $ref: "#/components/parameters/UserID"
|
||||
- $ref: "#/components/parameters/InvitedBy"
|
||||
- $ref: "#/components/parameters/DomainID"
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
- $ref: "#/components/parameters/Relation"
|
||||
- $ref: "#/components/parameters/State"
|
||||
security:
|
||||
@@ -91,7 +93,7 @@ paths:
|
||||
"500":
|
||||
$ref: "#/components/responses/ServiceError"
|
||||
|
||||
/invitations/accept:
|
||||
/{domainID}/invitations/accept:
|
||||
post:
|
||||
operationId: acceptInvitation
|
||||
summary: Accept invitation
|
||||
@@ -101,8 +103,8 @@ paths:
|
||||
- Invitations
|
||||
security:
|
||||
- bearerAuth: []
|
||||
requestBody:
|
||||
$ref: "#/components/requestBodies/AcceptInvitationReq"
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
responses:
|
||||
"204":
|
||||
description: Invitation accepted.
|
||||
@@ -112,10 +114,12 @@ paths:
|
||||
description: Missing or invalid access token provided.
|
||||
"404":
|
||||
description: A non-existent entity request.
|
||||
"415":
|
||||
description: Missing or invalid content type.
|
||||
"500":
|
||||
$ref: "#/components/responses/ServiceError"
|
||||
|
||||
/invitations/reject:
|
||||
/{domainID}/invitations/reject:
|
||||
post:
|
||||
operationId: rejectInvitation
|
||||
summary: Reject invitation
|
||||
@@ -125,8 +129,8 @@ paths:
|
||||
- Invitations
|
||||
security:
|
||||
- bearerAuth: []
|
||||
requestBody:
|
||||
$ref: "#/components/requestBodies/AcceptInvitationReq"
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
responses:
|
||||
"204":
|
||||
description: Invitation rejected.
|
||||
@@ -136,10 +140,12 @@ paths:
|
||||
description: Missing or invalid access token provided.
|
||||
"404":
|
||||
description: A non-existent entity request.
|
||||
"415":
|
||||
description: Missing or invalid content type.
|
||||
"500":
|
||||
$ref: "#/components/responses/ServiceError"
|
||||
|
||||
/invitations/{user_id}/{domain_id}:
|
||||
/{domainID}/invitations/users/{user_id}:
|
||||
get:
|
||||
operationId: getInvitation
|
||||
summary: Retrieves a specific invitation
|
||||
@@ -149,7 +155,7 @@ paths:
|
||||
- Invitations
|
||||
parameters:
|
||||
- $ref: "#/components/parameters/user_id"
|
||||
- $ref: "#/components/parameters/domain_id"
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
security:
|
||||
- bearerAuth: []
|
||||
responses:
|
||||
@@ -161,6 +167,8 @@ paths:
|
||||
description: Missing or invalid access token provided.
|
||||
"404":
|
||||
description: A non-existent entity request.
|
||||
"415":
|
||||
description: Missing or invalid content type.
|
||||
"422":
|
||||
description: Database can't process request.
|
||||
"500":
|
||||
@@ -175,7 +183,7 @@ paths:
|
||||
- Invitations
|
||||
parameters:
|
||||
- $ref: "#/components/parameters/user_id"
|
||||
- $ref: "#/components/parameters/domain_id"
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
security:
|
||||
- bearerAuth: []
|
||||
responses:
|
||||
@@ -187,6 +195,8 @@ paths:
|
||||
description: Failed due to non existing user.
|
||||
"401":
|
||||
description: Missing or invalid access token provided.
|
||||
"415":
|
||||
description: Missing or invalid content type.
|
||||
"500":
|
||||
$ref: "#/components/responses/ServiceError"
|
||||
|
||||
@@ -212,11 +222,6 @@ components:
|
||||
format: uuid
|
||||
example: bb7edb32-2eac-4aad-aebe-ed96fe073879
|
||||
description: User unique identifier.
|
||||
domain_id:
|
||||
type: string
|
||||
format: uuid
|
||||
example: bb7edb32-2eac-4aad-aebe-ed96fe073879
|
||||
description: Domain unique identifier.
|
||||
relation:
|
||||
type: string
|
||||
enum:
|
||||
@@ -238,7 +243,6 @@ components:
|
||||
description: Resend invitation.
|
||||
required:
|
||||
- user_id
|
||||
- domain_id
|
||||
- relation
|
||||
|
||||
Invitation:
|
||||
@@ -394,26 +398,6 @@ components:
|
||||
required: true
|
||||
example: bb7edb32-2eac-4aad-aebe-ed96fe073879
|
||||
|
||||
DomainID:
|
||||
name: domain_id
|
||||
description: Unique identifier for a domain.
|
||||
in: query
|
||||
schema:
|
||||
type: string
|
||||
format: uuid
|
||||
required: false
|
||||
example: bb7edb32-2eac-4aad-aebe-ed96fe073879
|
||||
|
||||
domain_id:
|
||||
name: domain_id
|
||||
description: Unique identifier for a domain.
|
||||
in: path
|
||||
schema:
|
||||
type: string
|
||||
format: uuid
|
||||
required: true
|
||||
example: bb7edb32-2eac-4aad-aebe-ed96fe073879
|
||||
|
||||
InvitedBy:
|
||||
name: invited_by
|
||||
description: Unique identifier for a user that invited the user.
|
||||
@@ -466,22 +450,6 @@ components:
|
||||
schema:
|
||||
$ref: "#/components/schemas/SendInvitationReqObj"
|
||||
|
||||
AcceptInvitationReq:
|
||||
description: JSON-formatted document describing request for accepting invitation
|
||||
required: true
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: object
|
||||
properties:
|
||||
domain_id:
|
||||
type: string
|
||||
format: uuid
|
||||
example: bb7edb32-2eac-4aad-aebe-ed96fe073879
|
||||
description: Domain unique identifier.
|
||||
required:
|
||||
- domain_id
|
||||
|
||||
responses:
|
||||
InvitationRes:
|
||||
description: Data retrieved.
|
||||
@@ -494,7 +462,6 @@ components:
|
||||
operationId: deleteInvitation
|
||||
parameters:
|
||||
user_id: $response.body#/user_id
|
||||
domain_id: $response.body#/domain_id
|
||||
|
||||
InvitationPageRes:
|
||||
description: Data retrieved.
|
||||
|
||||
@@ -27,12 +27,14 @@ tags:
|
||||
url: https://docs.magistrala.abstractmachines.fr/
|
||||
|
||||
paths:
|
||||
/mapping:
|
||||
/{domainID}/mapping:
|
||||
post:
|
||||
summary: Adds new device to proxy
|
||||
description: Adds new device to proxy
|
||||
tags:
|
||||
- provision
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
requestBody:
|
||||
$ref: "#/components/requestBodies/ProvisionReq"
|
||||
responses:
|
||||
@@ -55,6 +57,8 @@ paths:
|
||||
configuration created with provision service.
|
||||
tags:
|
||||
- provision
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
responses:
|
||||
"200":
|
||||
$ref: "#/components/responses/ProvisionRes"
|
||||
|
||||
+69
-26
@@ -37,7 +37,7 @@ tags:
|
||||
url: https://docs.magistrala.abstractmachines.fr/
|
||||
|
||||
paths:
|
||||
/things:
|
||||
/{domainID}/things:
|
||||
post:
|
||||
operationId: createThing
|
||||
tags:
|
||||
@@ -46,6 +46,8 @@ paths:
|
||||
description: |
|
||||
Adds new thing to the list of things owned by user identified using
|
||||
the provided access token.
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
requestBody:
|
||||
$ref: "#/components/requestBodies/ThingCreateReq"
|
||||
responses:
|
||||
@@ -79,6 +81,7 @@ paths:
|
||||
dataset is consumed either by making subsequent requests, or by
|
||||
increasing the subset size of the initial request.
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
- $ref: "#/components/parameters/Limit"
|
||||
- $ref: "#/components/parameters/Offset"
|
||||
- $ref: "#/components/parameters/Metadata"
|
||||
@@ -104,13 +107,15 @@ paths:
|
||||
"500":
|
||||
$ref: "#/components/responses/ServiceError"
|
||||
|
||||
/things/bulk:
|
||||
/{domainID}/things/bulk:
|
||||
post:
|
||||
operationId: bulkCreateThings
|
||||
summary: Bulk provisions new things
|
||||
description: |
|
||||
Adds new things to the list of things owned by user identified using
|
||||
the provided access token.
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
tags:
|
||||
- Things
|
||||
requestBody:
|
||||
@@ -133,7 +138,7 @@ paths:
|
||||
"500":
|
||||
$ref: "#/components/responses/ServiceError"
|
||||
|
||||
/things/{thingID}:
|
||||
/{domainID}/things/{thingID}:
|
||||
get:
|
||||
operationId: getThing
|
||||
summary: Retrieves thing info
|
||||
@@ -142,12 +147,15 @@ paths:
|
||||
tags:
|
||||
- Things
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
- $ref: "#/components/parameters/ThingID"
|
||||
security:
|
||||
- bearerAuth: []
|
||||
responses:
|
||||
"200":
|
||||
$ref: "#/components/responses/ThingRes"
|
||||
"400":
|
||||
description: Failed due to malformed domain ID.
|
||||
"401":
|
||||
description: Missing or invalid access token provided.
|
||||
"403":
|
||||
@@ -169,6 +177,7 @@ paths:
|
||||
tags:
|
||||
- Things
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
- $ref: "#/components/parameters/ThingID"
|
||||
requestBody:
|
||||
$ref: "#/components/requestBodies/ThingUpdateReq"
|
||||
@@ -201,12 +210,15 @@ paths:
|
||||
tags:
|
||||
- Things
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
- $ref: "#/components/parameters/ThingID"
|
||||
security:
|
||||
- bearerAuth: []
|
||||
responses:
|
||||
"204":
|
||||
description: Thing deleted.
|
||||
"400":
|
||||
description: Failed due to malformed domain ID.
|
||||
"401":
|
||||
description: Missing or invalid access token provided.
|
||||
"403":
|
||||
@@ -215,7 +227,8 @@ paths:
|
||||
description: Missing thing.
|
||||
"500":
|
||||
$ref: "#/components/responses/ServiceError"
|
||||
/things/{thingID}/tags:
|
||||
|
||||
/{domainID}/things/{thingID}/tags:
|
||||
patch:
|
||||
operationId: updateThingTags
|
||||
summary: Updates tags the thing.
|
||||
@@ -225,6 +238,7 @@ paths:
|
||||
tags:
|
||||
- Things
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
- $ref: "#/components/parameters/ThingID"
|
||||
requestBody:
|
||||
$ref: "#/components/requestBodies/ThingUpdateTagsReq"
|
||||
@@ -246,7 +260,7 @@ paths:
|
||||
"500":
|
||||
$ref: "#/components/responses/ServiceError"
|
||||
|
||||
/things/{thingID}/secret:
|
||||
/{domainID}/things/{thingID}/secret:
|
||||
patch:
|
||||
operationId: updateThingSecret
|
||||
summary: Updates Secret of the identified thing.
|
||||
@@ -256,6 +270,7 @@ paths:
|
||||
tags:
|
||||
- Things
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
- $ref: "#/components/parameters/ThingID"
|
||||
requestBody:
|
||||
$ref: "#/components/requestBodies/ThingUpdateSecretReq"
|
||||
@@ -281,7 +296,7 @@ paths:
|
||||
"500":
|
||||
$ref: "#/components/responses/ServiceError"
|
||||
|
||||
/things/{thingID}/disable:
|
||||
/{domainID}/things/{thingID}/disable:
|
||||
post:
|
||||
operationId: disableThing
|
||||
summary: Disables a thing
|
||||
@@ -290,6 +305,7 @@ paths:
|
||||
tags:
|
||||
- Things
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
- $ref: "#/components/parameters/ThingID"
|
||||
security:
|
||||
- bearerAuth: []
|
||||
@@ -311,7 +327,7 @@ paths:
|
||||
"500":
|
||||
$ref: "#/components/responses/ServiceError"
|
||||
|
||||
/things/{thingID}/enable:
|
||||
/{domainID}/things/{thingID}/enable:
|
||||
post:
|
||||
operationId: enableThing
|
||||
summary: Enables a thing
|
||||
@@ -320,6 +336,7 @@ paths:
|
||||
tags:
|
||||
- Things
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
- $ref: "#/components/parameters/ThingID"
|
||||
security:
|
||||
- bearerAuth: []
|
||||
@@ -341,7 +358,7 @@ paths:
|
||||
"500":
|
||||
$ref: "#/components/responses/ServiceError"
|
||||
|
||||
/things/{thingID}/share:
|
||||
/{domainID}/things/{thingID}/share:
|
||||
post:
|
||||
operationId: shareThing
|
||||
summary: Shares a thing
|
||||
@@ -350,6 +367,7 @@ paths:
|
||||
tags:
|
||||
- Things
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
- $ref: "#/components/parameters/ThingID"
|
||||
requestBody:
|
||||
$ref: "#/components/requestBodies/ShareThingReq"
|
||||
@@ -371,7 +389,7 @@ paths:
|
||||
"500":
|
||||
$ref: "#/components/responses/ServiceError"
|
||||
|
||||
/things/{thingID}/unshare:
|
||||
/{domainID}/things/{thingID}/unshare:
|
||||
post:
|
||||
operationId: unshareThing
|
||||
summary: Unshares a thing
|
||||
@@ -380,6 +398,7 @@ paths:
|
||||
tags:
|
||||
- Things
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
- $ref: "#/components/parameters/ThingID"
|
||||
requestBody:
|
||||
$ref: "#/components/requestBodies/ShareThingReq"
|
||||
@@ -401,7 +420,7 @@ paths:
|
||||
"500":
|
||||
$ref: "#/components/responses/ServiceError"
|
||||
|
||||
/channels/{chanID}/things:
|
||||
/{domainID}/channels/{chanID}/things:
|
||||
get:
|
||||
operationId: listThingsInaChannel
|
||||
summary: List of things connected to specified channel
|
||||
@@ -411,6 +430,7 @@ paths:
|
||||
tags:
|
||||
- Things
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
- $ref: "#/components/parameters/chanID"
|
||||
- $ref: "#/components/parameters/Offset"
|
||||
- $ref: "#/components/parameters/Limit"
|
||||
@@ -431,7 +451,7 @@ paths:
|
||||
"500":
|
||||
$ref: "#/components/responses/ServiceError"
|
||||
|
||||
/channels:
|
||||
/{domainID}/channels:
|
||||
post:
|
||||
operationId: createChannel
|
||||
tags:
|
||||
@@ -443,6 +463,8 @@ paths:
|
||||
$ref: "#/components/requestBodies/ChannelCreateReq"
|
||||
security:
|
||||
- bearerAuth: []
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
responses:
|
||||
"201":
|
||||
$ref: "#/components/responses/ChannelCreateRes"
|
||||
@@ -476,6 +498,7 @@ paths:
|
||||
security:
|
||||
- bearerAuth: []
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
- $ref: "#/components/parameters/Limit"
|
||||
- $ref: "#/components/parameters/Offset"
|
||||
- $ref: "#/components/parameters/Metadata"
|
||||
@@ -496,7 +519,7 @@ paths:
|
||||
"500":
|
||||
$ref: "#/components/responses/ServiceError"
|
||||
|
||||
/channels/{chanID}:
|
||||
/{domainID}/channels/{chanID}:
|
||||
get:
|
||||
operationId: getChannel
|
||||
summary: Retrieves channel info.
|
||||
@@ -505,6 +528,7 @@ paths:
|
||||
tags:
|
||||
- Channels
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
- $ref: "#/components/parameters/chanID"
|
||||
security:
|
||||
- bearerAuth: []
|
||||
@@ -512,7 +536,7 @@ paths:
|
||||
"200":
|
||||
$ref: "#/components/responses/ChannelRes"
|
||||
"400":
|
||||
description: Failed due to malformed channel's ID.
|
||||
description: Failed due to malformed channel's or domain ID.
|
||||
"401":
|
||||
description: Missing or invalid access token provided.
|
||||
"403":
|
||||
@@ -534,6 +558,7 @@ paths:
|
||||
tags:
|
||||
- Channels
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
- $ref: "#/components/parameters/chanID"
|
||||
security:
|
||||
- bearerAuth: []
|
||||
@@ -566,12 +591,15 @@ paths:
|
||||
tags:
|
||||
- Channels
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
- $ref: "#/components/parameters/chanID"
|
||||
security:
|
||||
- bearerAuth: []
|
||||
responses:
|
||||
"204":
|
||||
description: Channel deleted.
|
||||
"400":
|
||||
description: Failed due to malformed domain ID.
|
||||
"401":
|
||||
description: Missing or invalid access token provided.
|
||||
"403":
|
||||
@@ -581,7 +609,7 @@ paths:
|
||||
"500":
|
||||
$ref: "#/components/responses/ServiceError"
|
||||
|
||||
/channels/{chanID}/enable:
|
||||
/{domainID}/channels/{chanID}/enable:
|
||||
post:
|
||||
operationId: enableChannel
|
||||
summary: Enables a channel
|
||||
@@ -590,6 +618,7 @@ paths:
|
||||
tags:
|
||||
- Channels
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
- $ref: "#/components/parameters/chanID"
|
||||
security:
|
||||
- bearerAuth: []
|
||||
@@ -611,7 +640,7 @@ paths:
|
||||
"500":
|
||||
$ref: "#/components/responses/ServiceError"
|
||||
|
||||
/channels/{chanID}/disable:
|
||||
/{domainID}/channels/{chanID}/disable:
|
||||
post:
|
||||
operationId: disableChannel
|
||||
summary: Disables a channel
|
||||
@@ -620,6 +649,7 @@ paths:
|
||||
tags:
|
||||
- Channels
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
- $ref: "#/components/parameters/chanID"
|
||||
security:
|
||||
- bearerAuth: []
|
||||
@@ -641,7 +671,7 @@ paths:
|
||||
"500":
|
||||
$ref: "#/components/responses/ServiceError"
|
||||
|
||||
/channels/{chanID}/users/assign:
|
||||
/{domainID}/channels/{chanID}/users/assign:
|
||||
post:
|
||||
operationId: assignUsersToChannel
|
||||
summary: Assigns a member to a channel
|
||||
@@ -650,6 +680,7 @@ paths:
|
||||
tags:
|
||||
- Channels
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
- $ref: "#/components/parameters/chanID"
|
||||
requestBody:
|
||||
$ref: "#/components/requestBodies/AssignUserReq"
|
||||
@@ -671,7 +702,7 @@ paths:
|
||||
"500":
|
||||
$ref: "#/components/responses/ServiceError"
|
||||
|
||||
/channels/{chanID}/users/unassign:
|
||||
/{domainID}/channels/{chanID}/users/unassign:
|
||||
post:
|
||||
operationId: unassignUsersFromChannel
|
||||
summary: Unassigns a member from a channel
|
||||
@@ -680,6 +711,7 @@ paths:
|
||||
tags:
|
||||
- Channels
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
- $ref: "#/components/parameters/chanID"
|
||||
requestBody:
|
||||
$ref: "#/components/requestBodies/AssignUserReq"
|
||||
@@ -701,7 +733,7 @@ paths:
|
||||
"500":
|
||||
$ref: "#/components/responses/ServiceError"
|
||||
|
||||
/channels/{chanID}/groups/assign:
|
||||
/{domainID}/channels/{chanID}/groups/assign:
|
||||
post:
|
||||
operationId: assignGroupsToChannel
|
||||
summary: Assigns a member to a channel
|
||||
@@ -710,6 +742,7 @@ paths:
|
||||
tags:
|
||||
- Channels
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
- $ref: "#/components/parameters/chanID"
|
||||
requestBody:
|
||||
$ref: "#/components/requestBodies/AssignUsersReq"
|
||||
@@ -731,7 +764,7 @@ paths:
|
||||
"500":
|
||||
$ref: "#/components/responses/ServiceError"
|
||||
|
||||
/channels/{chanID}/groups/unassign:
|
||||
/{domainID}/channels/{chanID}/groups/unassign:
|
||||
post:
|
||||
operationId: unassignGroupsFromChannel
|
||||
summary: Unassigns a member from a channel
|
||||
@@ -740,6 +773,7 @@ paths:
|
||||
tags:
|
||||
- Channels
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
- $ref: "#/components/parameters/chanID"
|
||||
requestBody:
|
||||
$ref: "#/components/requestBodies/AssignUsersReq"
|
||||
@@ -761,7 +795,7 @@ paths:
|
||||
"500":
|
||||
$ref: "#/components/responses/ServiceError"
|
||||
|
||||
/things/{thingID}/channels:
|
||||
/{domainID}/things/{thingID}/channels:
|
||||
get:
|
||||
operationId: listChannelsConnectedToThing
|
||||
summary: List of channels connected to specified thing
|
||||
@@ -771,6 +805,7 @@ paths:
|
||||
tags:
|
||||
- Channels
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
- $ref: "#/components/parameters/ThingID"
|
||||
- $ref: "#/components/parameters/Offset"
|
||||
- $ref: "#/components/parameters/Limit"
|
||||
@@ -790,7 +825,7 @@ paths:
|
||||
"500":
|
||||
$ref: "#/components/responses/ServiceError"
|
||||
|
||||
/users/{memberID}/channels:
|
||||
/{domainID}/users/{memberID}/channels:
|
||||
get:
|
||||
operationId: listChannelsConnectedToUser
|
||||
summary: List of channels connected to specified user
|
||||
@@ -800,6 +835,7 @@ paths:
|
||||
tags:
|
||||
- Channels
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
- $ref: "#/components/parameters/MemberID"
|
||||
- $ref: "#/components/parameters/Offset"
|
||||
- $ref: "#/components/parameters/Limit"
|
||||
@@ -819,7 +855,7 @@ paths:
|
||||
"500":
|
||||
$ref: "#/components/responses/ServiceError"
|
||||
|
||||
/groups/{memberID}/channels:
|
||||
/{domainID}/groups/{memberID}/channels:
|
||||
get:
|
||||
operationId: listChannelsConnectedToGroup
|
||||
summary: List of channels connected to specified group
|
||||
@@ -829,6 +865,7 @@ paths:
|
||||
tags:
|
||||
- Channels
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
- $ref: "#/components/parameters/MemberID"
|
||||
- $ref: "#/components/parameters/Offset"
|
||||
- $ref: "#/components/parameters/Limit"
|
||||
@@ -848,13 +885,15 @@ paths:
|
||||
"500":
|
||||
$ref: "#/components/responses/ServiceError"
|
||||
|
||||
/connect:
|
||||
/{domainID}/connect:
|
||||
post:
|
||||
operationId: connectThingsAndChannels
|
||||
summary: Connects thing and channel.
|
||||
description: |
|
||||
Connect things specified by IDs to channels specified by IDs.
|
||||
Channel and thing are owned by user identified using the provided access token.
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
tags:
|
||||
- Policies
|
||||
requestBody:
|
||||
@@ -879,13 +918,15 @@ paths:
|
||||
"500":
|
||||
$ref: "#/components/responses/ServiceError"
|
||||
|
||||
/disconnect:
|
||||
/{domainID}/disconnect:
|
||||
post:
|
||||
operationId: disconnectThingsAndChannels
|
||||
summary: Disconnect things and channels using lists of IDs.
|
||||
description: |
|
||||
Disconnect things from channels specified by lists of IDs.
|
||||
Channels and things are owned by user identified using the provided access token.
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
tags:
|
||||
- Policies
|
||||
requestBody:
|
||||
@@ -908,7 +949,7 @@ paths:
|
||||
"500":
|
||||
$ref: "#/components/responses/ServiceError"
|
||||
|
||||
/channels/{chanID}/things/{thingID}/connect:
|
||||
/{domainID}/channels/{chanID}/things/{thingID}/connect:
|
||||
post:
|
||||
operationId: connectThingToChannel
|
||||
summary: Connects a thing to a channel
|
||||
@@ -917,6 +958,7 @@ paths:
|
||||
tags:
|
||||
- Policies
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
- $ref: "#/components/parameters/chanID"
|
||||
- $ref: "#/components/parameters/ThingID"
|
||||
responses:
|
||||
@@ -935,7 +977,7 @@ paths:
|
||||
"500":
|
||||
$ref: "#/components/responses/ServiceError"
|
||||
|
||||
/channels/{chanID}/things/{thingID}/disconnect:
|
||||
/{domainID}/channels/{chanID}/things/{thingID}/disconnect:
|
||||
post:
|
||||
operationId: disconnectThingFromChannel
|
||||
summary: Disconnects a thing to a channel
|
||||
@@ -944,6 +986,7 @@ paths:
|
||||
tags:
|
||||
- Policies
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
- $ref: "#/components/parameters/chanID"
|
||||
- $ref: "#/components/parameters/ThingID"
|
||||
responses:
|
||||
|
||||
+27
-11
@@ -606,7 +606,7 @@ paths:
|
||||
"500":
|
||||
$ref: "#/components/responses/ServiceError"
|
||||
|
||||
/groups:
|
||||
/{domainID}/groups:
|
||||
post:
|
||||
operationId: createGroup
|
||||
tags:
|
||||
@@ -615,6 +615,8 @@ paths:
|
||||
description: |
|
||||
Creates new group that can be used for grouping entities. New account will
|
||||
be uniquely identified by its identity.
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
requestBody:
|
||||
$ref: "#/components/requestBodies/GroupCreateReq"
|
||||
security:
|
||||
@@ -652,6 +654,7 @@ paths:
|
||||
security:
|
||||
- bearerAuth: []
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
- $ref: "#/components/parameters/Limit"
|
||||
- $ref: "#/components/parameters/Offset"
|
||||
- $ref: "#/components/parameters/Level"
|
||||
@@ -675,7 +678,7 @@ paths:
|
||||
"500":
|
||||
$ref: "#/components/responses/ServiceError"
|
||||
|
||||
/groups/{groupID}:
|
||||
/{domainID}/groups/{groupID}:
|
||||
get:
|
||||
operationId: getGroup
|
||||
summary: Gets group info.
|
||||
@@ -684,6 +687,7 @@ paths:
|
||||
tags:
|
||||
- Groups
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
- $ref: "#/components/parameters/GroupID"
|
||||
security:
|
||||
- bearerAuth: []
|
||||
@@ -711,6 +715,7 @@ paths:
|
||||
tags:
|
||||
- Groups
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
- $ref: "#/components/parameters/GroupID"
|
||||
security:
|
||||
- bearerAuth: []
|
||||
@@ -743,12 +748,15 @@ paths:
|
||||
tags:
|
||||
- Groups
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
- $ref: "#/components/parameters/GroupID"
|
||||
security:
|
||||
- bearerAuth: []
|
||||
responses:
|
||||
"204":
|
||||
description: Group deleted.
|
||||
"400":
|
||||
description: Failed due to malformed query parameters.
|
||||
"401":
|
||||
description: Missing or invalid access token provided.
|
||||
"403":
|
||||
@@ -758,7 +766,7 @@ paths:
|
||||
"500":
|
||||
$ref: "#/components/responses/ServiceError"
|
||||
|
||||
/groups/{groupID}/children:
|
||||
/{domainID}/groups/{groupID}/children:
|
||||
get:
|
||||
operationId: listChildren
|
||||
summary: List children of a certain group
|
||||
@@ -772,6 +780,7 @@ paths:
|
||||
security:
|
||||
- bearerAuth: []
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
- $ref: "#/components/parameters/GroupID"
|
||||
- $ref: "#/components/parameters/Limit"
|
||||
- $ref: "#/components/parameters/Offset"
|
||||
@@ -796,7 +805,7 @@ paths:
|
||||
"500":
|
||||
$ref: "#/components/responses/ServiceError"
|
||||
|
||||
/groups/{groupID}/parents:
|
||||
/{domainID}/groups/{groupID}/parents:
|
||||
get:
|
||||
operationId: listParents
|
||||
summary: List parents of a certain group
|
||||
@@ -810,6 +819,7 @@ paths:
|
||||
security:
|
||||
- bearerAuth: []
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
- $ref: "#/components/parameters/GroupID"
|
||||
- $ref: "#/components/parameters/Limit"
|
||||
- $ref: "#/components/parameters/Offset"
|
||||
@@ -834,7 +844,7 @@ paths:
|
||||
"500":
|
||||
$ref: "#/components/responses/ServiceError"
|
||||
|
||||
/groups/{groupID}/enable:
|
||||
/{domainID}/groups/{groupID}/enable:
|
||||
post:
|
||||
operationId: enableGroup
|
||||
summary: Enables a group
|
||||
@@ -843,6 +853,7 @@ paths:
|
||||
tags:
|
||||
- Groups
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
- $ref: "#/components/parameters/GroupID"
|
||||
security:
|
||||
- bearerAuth: []
|
||||
@@ -866,7 +877,7 @@ paths:
|
||||
"500":
|
||||
$ref: "#/components/responses/ServiceError"
|
||||
|
||||
/groups/{groupID}/disable:
|
||||
/{domainID}/groups/{groupID}/disable:
|
||||
post:
|
||||
operationId: disableGroup
|
||||
summary: Disables a group
|
||||
@@ -875,6 +886,7 @@ paths:
|
||||
tags:
|
||||
- Groups
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
- $ref: "#/components/parameters/GroupID"
|
||||
security:
|
||||
- bearerAuth: []
|
||||
@@ -898,7 +910,7 @@ paths:
|
||||
"500":
|
||||
$ref: "#/components/responses/ServiceError"
|
||||
|
||||
/groups/{groupID}/users/assign:
|
||||
/{domainID}/groups/{groupID}/users/assign:
|
||||
post:
|
||||
operationId: assignUser
|
||||
summary: Assigns a user to a group
|
||||
@@ -907,6 +919,7 @@ paths:
|
||||
tags:
|
||||
- Groups
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
- $ref: "#/components/parameters/GroupID"
|
||||
requestBody:
|
||||
$ref: "#/components/requestBodies/AssignUserReq"
|
||||
@@ -930,7 +943,7 @@ paths:
|
||||
"500":
|
||||
$ref: "#/components/responses/ServiceError"
|
||||
|
||||
/groups/{groupID}/users/unassign:
|
||||
/{domainID}/groups/{groupID}/users/unassign:
|
||||
post:
|
||||
operationId: unassignUser
|
||||
summary: Unassigns a user to a group
|
||||
@@ -939,6 +952,7 @@ paths:
|
||||
tags:
|
||||
- Groups
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
- $ref: "#/components/parameters/GroupID"
|
||||
requestBody:
|
||||
$ref: "#/components/requestBodies/AssignUserReq"
|
||||
@@ -962,7 +976,7 @@ paths:
|
||||
"500":
|
||||
$ref: "#/components/responses/ServiceError"
|
||||
|
||||
/channels/{memberID}/groups:
|
||||
/{domainID}/channels/{memberID}/groups:
|
||||
get:
|
||||
operationId: listGroupsInChannel
|
||||
summary: Get group associated with the member
|
||||
@@ -971,6 +985,7 @@ paths:
|
||||
tags:
|
||||
- Groups
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
- $ref: "#/components/parameters/MemberID"
|
||||
- $ref: "#/components/parameters/Limit"
|
||||
- $ref: "#/components/parameters/Offset"
|
||||
@@ -995,7 +1010,7 @@ paths:
|
||||
"500":
|
||||
$ref: "#/components/responses/ServiceError"
|
||||
|
||||
/users/{memberID}/groups:
|
||||
/{domainID}/users/{memberID}/groups:
|
||||
get:
|
||||
operationId: listGroupsByUser
|
||||
summary: Get group associated with the member
|
||||
@@ -1004,6 +1019,7 @@ paths:
|
||||
tags:
|
||||
- Groups
|
||||
parameters:
|
||||
- $ref: "auth.yml#/components/parameters/DomainID"
|
||||
- $ref: "#/components/parameters/MemberID"
|
||||
- $ref: "#/components/parameters/Limit"
|
||||
- $ref: "#/components/parameters/Offset"
|
||||
@@ -1027,7 +1043,7 @@ paths:
|
||||
description: Database can't process request.
|
||||
"500":
|
||||
$ref: "#/components/responses/ServiceError"
|
||||
/domains/{domainID}/users:
|
||||
/{domainID}/users:
|
||||
get:
|
||||
summary: List users assigned to domain
|
||||
description: |
|
||||
|
||||
+208
-169
@@ -34,6 +34,7 @@ import (
|
||||
|
||||
const (
|
||||
validToken = "validToken"
|
||||
domainID = "b4d7d79e-fd99-4c2b-ac09-524e43df6888"
|
||||
invalidToken = "invalid"
|
||||
email = "test@example.com"
|
||||
unknown = "unknown"
|
||||
@@ -209,6 +210,7 @@ func TestAdd(t *testing.T) {
|
||||
cases := []struct {
|
||||
desc string
|
||||
req string
|
||||
domainID string
|
||||
token string
|
||||
session mgauthn.Session
|
||||
contentType string
|
||||
@@ -220,6 +222,7 @@ func TestAdd(t *testing.T) {
|
||||
{
|
||||
desc: "add a config with invalid token",
|
||||
req: data,
|
||||
domainID: domainID,
|
||||
token: invalidToken,
|
||||
contentType: contentType,
|
||||
status: http.StatusUnauthorized,
|
||||
@@ -230,6 +233,7 @@ func TestAdd(t *testing.T) {
|
||||
{
|
||||
desc: "add a valid config",
|
||||
req: data,
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
contentType: contentType,
|
||||
status: http.StatusCreated,
|
||||
@@ -239,6 +243,7 @@ func TestAdd(t *testing.T) {
|
||||
{
|
||||
desc: "add a config with wrong content type",
|
||||
req: data,
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
contentType: "",
|
||||
status: http.StatusUnsupportedMediaType,
|
||||
@@ -248,6 +253,7 @@ func TestAdd(t *testing.T) {
|
||||
{
|
||||
desc: "add an existing config",
|
||||
req: data,
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
contentType: contentType,
|
||||
status: http.StatusConflict,
|
||||
@@ -257,6 +263,7 @@ func TestAdd(t *testing.T) {
|
||||
{
|
||||
desc: "add a config with non-existent ID",
|
||||
req: neData,
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
contentType: contentType,
|
||||
status: http.StatusConflict,
|
||||
@@ -266,6 +273,7 @@ func TestAdd(t *testing.T) {
|
||||
{
|
||||
desc: "add a config with invalid channels",
|
||||
req: wrongData,
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
contentType: contentType,
|
||||
status: http.StatusConflict,
|
||||
@@ -275,6 +283,7 @@ func TestAdd(t *testing.T) {
|
||||
{
|
||||
desc: "add a config with wrong JSON",
|
||||
req: "{\"external_id\": 5}",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
contentType: contentType,
|
||||
status: http.StatusBadRequest,
|
||||
@@ -283,6 +292,7 @@ func TestAdd(t *testing.T) {
|
||||
{
|
||||
desc: "add a config with invalid request format",
|
||||
req: "}",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
contentType: contentType,
|
||||
status: http.StatusBadRequest,
|
||||
@@ -292,6 +302,7 @@ func TestAdd(t *testing.T) {
|
||||
{
|
||||
desc: "add a config with empty JSON",
|
||||
req: "{}",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
contentType: contentType,
|
||||
status: http.StatusBadRequest,
|
||||
@@ -301,6 +312,7 @@ func TestAdd(t *testing.T) {
|
||||
{
|
||||
desc: "add a config with an empty request",
|
||||
req: "",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
contentType: contentType,
|
||||
status: http.StatusBadRequest,
|
||||
@@ -310,26 +322,29 @@ func TestAdd(t *testing.T) {
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
if tc.token == validToken {
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: validID}
|
||||
}
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(tc.session, tc.authenticateErr)
|
||||
svcCall := svc.On("Add", mock.Anything, tc.session, tc.token, mock.Anything).Return(c, tc.err)
|
||||
req := testRequest{
|
||||
client: bs.Client(),
|
||||
method: http.MethodPost,
|
||||
url: fmt.Sprintf("%s/things/configs", bs.URL),
|
||||
contentType: tc.contentType,
|
||||
token: tc.token,
|
||||
body: strings.NewReader(tc.req),
|
||||
}
|
||||
res, err := req.make()
|
||||
assert.Nil(t, err, fmt.Sprintf("%s: unexpected error %s", tc.desc, err))
|
||||
location := res.Header.Get("Location")
|
||||
assert.Equal(t, tc.status, res.StatusCode, fmt.Sprintf("%s: expected status code %d got %d", tc.desc, tc.status, res.StatusCode))
|
||||
assert.Equal(t, tc.location, location, fmt.Sprintf("%s: expected location '%s' got '%s'", tc.desc, tc.location, location))
|
||||
svcCall.Unset()
|
||||
authCall.Unset()
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
if tc.token == validToken {
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: validID}
|
||||
}
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(tc.session, tc.authenticateErr)
|
||||
|
||||
svcCall := svc.On("Add", mock.Anything, tc.session, tc.token, mock.Anything).Return(c, tc.err)
|
||||
req := testRequest{
|
||||
client: bs.Client(),
|
||||
method: http.MethodPost,
|
||||
url: fmt.Sprintf("%s/%s/things/configs", bs.URL, tc.domainID),
|
||||
contentType: tc.contentType,
|
||||
token: tc.token,
|
||||
body: strings.NewReader(tc.req),
|
||||
}
|
||||
res, err := req.make()
|
||||
assert.Nil(t, err, fmt.Sprintf("%s: unexpected error %s", tc.desc, err))
|
||||
location := res.Header.Get("Location")
|
||||
assert.Equal(t, tc.status, res.StatusCode, fmt.Sprintf("%s: expected status code %d got %d", tc.desc, tc.status, res.StatusCode))
|
||||
assert.Equal(t, tc.location, location, fmt.Sprintf("%s: expected location '%s' got '%s'", tc.desc, tc.location, location))
|
||||
svcCall.Unset()
|
||||
authCall.Unset()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -408,33 +423,35 @@ func TestView(t *testing.T) {
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
if tc.token == validToken {
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: validID}
|
||||
}
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(tc.session, tc.authenticateErr)
|
||||
svcCall := svc.On("View", mock.Anything, tc.session, tc.id).Return(c, tc.err)
|
||||
req := testRequest{
|
||||
client: bs.Client(),
|
||||
method: http.MethodGet,
|
||||
url: fmt.Sprintf("%s/things/configs/%s", bs.URL, tc.id),
|
||||
token: tc.token,
|
||||
}
|
||||
res, err := req.make()
|
||||
assert.Nil(t, err, fmt.Sprintf("%s: unexpected error %s", tc.desc, err))
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
if tc.token == validToken {
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: validID}
|
||||
}
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(tc.session, tc.authenticateErr)
|
||||
svcCall := svc.On("View", mock.Anything, tc.session, tc.id).Return(c, tc.err)
|
||||
req := testRequest{
|
||||
client: bs.Client(),
|
||||
method: http.MethodGet,
|
||||
url: fmt.Sprintf("%s/%s/things/configs/%s", bs.URL, domainID, tc.id),
|
||||
token: tc.token,
|
||||
}
|
||||
res, err := req.make()
|
||||
assert.Nil(t, err, fmt.Sprintf("%s: unexpected error %s", tc.desc, err))
|
||||
|
||||
assert.Equal(t, tc.status, res.StatusCode, fmt.Sprintf("%s: expected status code %d got %d", tc.desc, tc.status, res.StatusCode))
|
||||
var view config
|
||||
if err := json.NewDecoder(res.Body).Decode(&view); err != io.EOF {
|
||||
assert.Nil(t, err, fmt.Sprintf("Decoding expected to succeed %s: %s", tc.desc, err))
|
||||
}
|
||||
assert.Equal(t, tc.status, res.StatusCode, fmt.Sprintf("%s: expected status code %d got %d", tc.desc, tc.status, res.StatusCode))
|
||||
var view config
|
||||
if err := json.NewDecoder(res.Body).Decode(&view); err != io.EOF {
|
||||
assert.Nil(t, err, fmt.Sprintf("Decoding expected to succeed %s: %s", tc.desc, err))
|
||||
}
|
||||
|
||||
assert.ElementsMatch(t, tc.res.Channels, view.Channels, fmt.Sprintf("%s: expected response '%s' got '%s'", tc.desc, tc.res.Channels, view.Channels))
|
||||
// Empty channels to prevent order mismatch.
|
||||
tc.res.Channels = []channel{}
|
||||
view.Channels = []channel{}
|
||||
assert.Equal(t, tc.res, view, fmt.Sprintf("%s: expected response '%s' got '%s'", tc.desc, tc.res, view))
|
||||
svcCall.Unset()
|
||||
authCall.Unset()
|
||||
assert.ElementsMatch(t, tc.res.Channels, view.Channels, fmt.Sprintf("%s: expected response '%s' got '%s'", tc.desc, tc.res.Channels, view.Channels))
|
||||
// Empty channels to prevent order mismatch.
|
||||
tc.res.Channels = []channel{}
|
||||
view.Channels = []channel{}
|
||||
assert.Equal(t, tc.res, view, fmt.Sprintf("%s: expected response '%s' got '%s'", tc.desc, tc.res, view))
|
||||
svcCall.Unset()
|
||||
authCall.Unset()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -523,24 +540,26 @@ func TestUpdate(t *testing.T) {
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
if tc.token == validToken {
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: validID}
|
||||
}
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(tc.session, tc.authenticateErr)
|
||||
svcCall := svc.On("Update", mock.Anything, tc.session, mock.Anything).Return(tc.err)
|
||||
req := testRequest{
|
||||
client: bs.Client(),
|
||||
method: http.MethodPut,
|
||||
url: fmt.Sprintf("%s/things/configs/%s", bs.URL, tc.id),
|
||||
contentType: tc.contentType,
|
||||
token: tc.token,
|
||||
body: strings.NewReader(tc.req),
|
||||
}
|
||||
res, err := req.make()
|
||||
assert.Nil(t, err, fmt.Sprintf("%s: unexpected error %s", tc.desc, err))
|
||||
assert.Equal(t, tc.status, res.StatusCode, fmt.Sprintf("%s: expected status code %d got %d", tc.desc, tc.status, res.StatusCode))
|
||||
svcCall.Unset()
|
||||
authCall.Unset()
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
if tc.token == validToken {
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: validID}
|
||||
}
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(tc.session, tc.authenticateErr)
|
||||
svcCall := svc.On("Update", mock.Anything, tc.session, mock.Anything).Return(tc.err)
|
||||
req := testRequest{
|
||||
client: bs.Client(),
|
||||
method: http.MethodPut,
|
||||
url: fmt.Sprintf("%s/%s/things/configs/%s", bs.URL, domainID, tc.id),
|
||||
contentType: tc.contentType,
|
||||
token: tc.token,
|
||||
body: strings.NewReader(tc.req),
|
||||
}
|
||||
res, err := req.make()
|
||||
assert.Nil(t, err, fmt.Sprintf("%s: unexpected error %s", tc.desc, err))
|
||||
assert.Equal(t, tc.status, res.StatusCode, fmt.Sprintf("%s: expected status code %d got %d", tc.desc, tc.status, res.StatusCode))
|
||||
svcCall.Unset()
|
||||
authCall.Unset()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -629,24 +648,26 @@ func TestUpdateCert(t *testing.T) {
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
if tc.token == validToken {
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: validID}
|
||||
}
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(tc.session, tc.authenticateErr)
|
||||
svcCall := svc.On("UpdateCert", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(c, tc.err)
|
||||
req := testRequest{
|
||||
client: bs.Client(),
|
||||
method: http.MethodPatch,
|
||||
url: fmt.Sprintf("%s/things/configs/certs/%s", bs.URL, tc.id),
|
||||
contentType: tc.contentType,
|
||||
token: tc.token,
|
||||
body: strings.NewReader(tc.req),
|
||||
}
|
||||
res, err := req.make()
|
||||
assert.Nil(t, err, fmt.Sprintf("%s: unexpected error %s", tc.desc, err))
|
||||
assert.Equal(t, tc.status, res.StatusCode, fmt.Sprintf("%s: expected status code %d got %d", tc.desc, tc.status, res.StatusCode))
|
||||
svcCall.Unset()
|
||||
authCall.Unset()
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
if tc.token == validToken {
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: validID}
|
||||
}
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(tc.session, tc.authenticateErr)
|
||||
svcCall := svc.On("UpdateCert", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(c, tc.err)
|
||||
req := testRequest{
|
||||
client: bs.Client(),
|
||||
method: http.MethodPatch,
|
||||
url: fmt.Sprintf("%s/%s/things/configs/certs/%s", bs.URL, domainID, tc.id),
|
||||
contentType: tc.contentType,
|
||||
token: tc.token,
|
||||
body: strings.NewReader(tc.req),
|
||||
}
|
||||
res, err := req.make()
|
||||
assert.Nil(t, err, fmt.Sprintf("%s: unexpected error %s", tc.desc, err))
|
||||
assert.Equal(t, tc.status, res.StatusCode, fmt.Sprintf("%s: expected status code %d got %d", tc.desc, tc.status, res.StatusCode))
|
||||
svcCall.Unset()
|
||||
authCall.Unset()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -748,24 +769,26 @@ func TestUpdateConnections(t *testing.T) {
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
if tc.token == validToken {
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: validID}
|
||||
}
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(tc.session, tc.authenticateErr)
|
||||
repoCall := svc.On("UpdateConnections", mock.Anything, tc.session, tc.token, mock.Anything, mock.Anything).Return(tc.err)
|
||||
req := testRequest{
|
||||
client: bs.Client(),
|
||||
method: http.MethodPut,
|
||||
url: fmt.Sprintf("%s/things/configs/connections/%s", bs.URL, tc.id),
|
||||
contentType: tc.contentType,
|
||||
token: tc.token,
|
||||
body: strings.NewReader(tc.req),
|
||||
}
|
||||
res, err := req.make()
|
||||
assert.Nil(t, err, fmt.Sprintf("%s: unexpected error %s", tc.desc, err))
|
||||
assert.Equal(t, tc.status, res.StatusCode, fmt.Sprintf("%s: expected status code %d got %d", tc.desc, tc.status, res.StatusCode))
|
||||
repoCall.Unset()
|
||||
authCall.Unset()
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
if tc.token == validToken {
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: validID}
|
||||
}
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(tc.session, tc.authenticateErr)
|
||||
repoCall := svc.On("UpdateConnections", mock.Anything, tc.session, tc.token, mock.Anything, mock.Anything).Return(tc.err)
|
||||
req := testRequest{
|
||||
client: bs.Client(),
|
||||
method: http.MethodPut,
|
||||
url: fmt.Sprintf("%s/%s/things/configs/connections/%s", bs.URL, domainID, tc.id),
|
||||
contentType: tc.contentType,
|
||||
token: tc.token,
|
||||
body: strings.NewReader(tc.req),
|
||||
}
|
||||
res, err := req.make()
|
||||
assert.Nil(t, err, fmt.Sprintf("%s: unexpected error %s", tc.desc, err))
|
||||
assert.Equal(t, tc.status, res.StatusCode, fmt.Sprintf("%s: expected status code %d got %d", tc.desc, tc.status, res.StatusCode))
|
||||
repoCall.Unset()
|
||||
authCall.Unset()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -777,7 +800,7 @@ func TestList(t *testing.T) {
|
||||
|
||||
bs, svc, auth := newBootstrapServer()
|
||||
defer bs.Close()
|
||||
path := fmt.Sprintf("%s/%s", bs.URL, "things/configs")
|
||||
path := fmt.Sprintf("%s/%s/%s", bs.URL, domainID, "things/configs")
|
||||
|
||||
c := newConfig()
|
||||
|
||||
@@ -1015,23 +1038,33 @@ func TestList(t *testing.T) {
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
if tc.token == validToken {
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: validID}
|
||||
}
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(tc.session, tc.authenticateErr)
|
||||
svcCall := svc.On("List", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(bootstrap.ConfigsPage{Total: tc.res.Total, Offset: tc.res.Offset, Limit: tc.res.Limit}, tc.err)
|
||||
req := testRequest{
|
||||
client: bs.Client(),
|
||||
method: http.MethodGet,
|
||||
url: tc.url,
|
||||
token: tc.token,
|
||||
}
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
if tc.token == validToken {
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: validID}
|
||||
}
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(tc.session, tc.authenticateErr)
|
||||
svcCall := svc.On("List", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(bootstrap.ConfigsPage{Total: tc.res.Total, Offset: tc.res.Offset, Limit: tc.res.Limit}, tc.err)
|
||||
req := testRequest{
|
||||
client: bs.Client(),
|
||||
method: http.MethodGet,
|
||||
url: tc.url,
|
||||
token: tc.token,
|
||||
}
|
||||
|
||||
res, err := req.make()
|
||||
assert.Nil(t, err, fmt.Sprintf("%s: unexpected error %s", tc.desc, err))
|
||||
assert.Equal(t, tc.status, res.StatusCode, fmt.Sprintf("%s: expected status code %d got %d", tc.desc, tc.status, res.StatusCode))
|
||||
svcCall.Unset()
|
||||
authCall.Unset()
|
||||
res, err := req.make()
|
||||
assert.Nil(t, err, fmt.Sprintf("%s: unexpected error %s", tc.desc, err))
|
||||
|
||||
assert.Equal(t, tc.status, res.StatusCode, fmt.Sprintf("%s: expected status code %d got %d", tc.desc, tc.status, res.StatusCode))
|
||||
var body configPage
|
||||
|
||||
err = json.NewDecoder(res.Body).Decode(&body)
|
||||
assert.Nil(t, err, fmt.Sprintf("%s: unexpected error while decoding response body: %s", tc.desc, err))
|
||||
assert.Nil(t, err, fmt.Sprintf("%s: unexpected error %s", tc.desc, err))
|
||||
|
||||
assert.Equal(t, tc.res.Total, body.Total, fmt.Sprintf("%s: expected response total '%d' got '%d'", tc.desc, tc.res.Total, body.Total))
|
||||
svcCall.Unset()
|
||||
authCall.Unset()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1088,22 +1121,24 @@ func TestRemove(t *testing.T) {
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
if tc.token == validToken {
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: validID}
|
||||
}
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(tc.session, tc.authenticateErr)
|
||||
svcCall := svc.On("Remove", mock.Anything, mock.Anything, mock.Anything).Return(tc.err)
|
||||
req := testRequest{
|
||||
client: bs.Client(),
|
||||
method: http.MethodDelete,
|
||||
url: fmt.Sprintf("%s/things/configs/%s", bs.URL, tc.id),
|
||||
token: tc.token,
|
||||
}
|
||||
res, err := req.make()
|
||||
assert.Nil(t, err, fmt.Sprintf("%s: unexpected error %s", tc.desc, err))
|
||||
assert.Equal(t, tc.status, res.StatusCode, fmt.Sprintf("%s: expected status code %d got %d", tc.desc, tc.status, res.StatusCode))
|
||||
svcCall.Unset()
|
||||
authCall.Unset()
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
if tc.token == validToken {
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: validID}
|
||||
}
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(tc.session, tc.authenticateErr)
|
||||
svcCall := svc.On("Remove", mock.Anything, mock.Anything, mock.Anything).Return(tc.err)
|
||||
req := testRequest{
|
||||
client: bs.Client(),
|
||||
method: http.MethodDelete,
|
||||
url: fmt.Sprintf("%s/%s/things/configs/%s", bs.URL, domainID, tc.id),
|
||||
token: tc.token,
|
||||
}
|
||||
res, err := req.make()
|
||||
assert.Nil(t, err, fmt.Sprintf("%s: unexpected error %s", tc.desc, err))
|
||||
assert.Equal(t, tc.status, res.StatusCode, fmt.Sprintf("%s: expected status code %d got %d", tc.desc, tc.status, res.StatusCode))
|
||||
svcCall.Unset()
|
||||
authCall.Unset()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1215,26 +1250,28 @@ func TestBootstrap(t *testing.T) {
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
svcCall := svc.On("Bootstrap", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(c, tc.err)
|
||||
req := testRequest{
|
||||
client: bs.Client(),
|
||||
method: http.MethodGet,
|
||||
url: fmt.Sprintf("%s/things/bootstrap/%s", bs.URL, tc.externalID),
|
||||
key: tc.externalKey,
|
||||
}
|
||||
res, err := req.make()
|
||||
assert.Nil(t, err, fmt.Sprintf("%s: unexpected error %s", tc.desc, err))
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
svcCall := svc.On("Bootstrap", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(c, tc.err)
|
||||
req := testRequest{
|
||||
client: bs.Client(),
|
||||
method: http.MethodGet,
|
||||
url: fmt.Sprintf("%s/things/bootstrap/%s", bs.URL, tc.externalID),
|
||||
key: tc.externalKey,
|
||||
}
|
||||
res, err := req.make()
|
||||
assert.Nil(t, err, fmt.Sprintf("%s: unexpected error %s", tc.desc, err))
|
||||
|
||||
assert.Equal(t, tc.status, res.StatusCode, fmt.Sprintf("%s: expected status code %d got %d", tc.desc, tc.status, res.StatusCode))
|
||||
body, err := io.ReadAll(res.Body)
|
||||
assert.Nil(t, err, fmt.Sprintf("%s: unexpected error %s", tc.desc, err))
|
||||
if tc.secure && tc.status == http.StatusOK {
|
||||
body, err = dec(body)
|
||||
assert.Nil(t, err, fmt.Sprintf("%s: unexpected error while decoding body: %s", tc.desc, err))
|
||||
}
|
||||
data := strings.Trim(string(body), "\n")
|
||||
assert.Equal(t, tc.res, data, fmt.Sprintf("%s: expected response '%s' got '%s'", tc.desc, tc.res, data))
|
||||
svcCall.Unset()
|
||||
assert.Equal(t, tc.status, res.StatusCode, fmt.Sprintf("%s: expected status code %d got %d", tc.desc, tc.status, res.StatusCode))
|
||||
body, err := io.ReadAll(res.Body)
|
||||
assert.Nil(t, err, fmt.Sprintf("%s: unexpected error %s", tc.desc, err))
|
||||
if tc.secure && tc.status == http.StatusOK {
|
||||
body, err = dec(body)
|
||||
assert.Nil(t, err, fmt.Sprintf("%s: unexpected error while decoding body: %s", tc.desc, err))
|
||||
}
|
||||
data := strings.Trim(string(body), "\n")
|
||||
assert.Equal(t, tc.res, data, fmt.Sprintf("%s: expected response '%s' got '%s'", tc.desc, tc.res, data))
|
||||
svcCall.Unset()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1333,24 +1370,26 @@ func TestChangeState(t *testing.T) {
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
if tc.token == validToken {
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: validID}
|
||||
}
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(tc.session, tc.authenticateErr)
|
||||
svcCall := svc.On("ChangeState", mock.Anything, tc.session, tc.token, mock.Anything, mock.Anything).Return(tc.err)
|
||||
req := testRequest{
|
||||
client: bs.Client(),
|
||||
method: http.MethodPut,
|
||||
url: fmt.Sprintf("%s/things/state/%s", bs.URL, tc.id),
|
||||
token: tc.token,
|
||||
contentType: tc.contentType,
|
||||
body: strings.NewReader(tc.state),
|
||||
}
|
||||
res, err := req.make()
|
||||
assert.Nil(t, err, fmt.Sprintf("%s: unexpected error %s", tc.desc, err))
|
||||
assert.Equal(t, tc.status, res.StatusCode, fmt.Sprintf("%s: expected status code %d got %d", tc.desc, tc.status, res.StatusCode))
|
||||
svcCall.Unset()
|
||||
authCall.Unset()
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
if tc.token == validToken {
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: validID}
|
||||
}
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(tc.session, tc.authenticateErr)
|
||||
svcCall := svc.On("ChangeState", mock.Anything, tc.session, tc.token, mock.Anything, mock.Anything).Return(tc.err)
|
||||
req := testRequest{
|
||||
client: bs.Client(),
|
||||
method: http.MethodPut,
|
||||
url: fmt.Sprintf("%s/%s/things/state/%s", bs.URL, domainID, tc.id),
|
||||
token: tc.token,
|
||||
contentType: tc.contentType,
|
||||
body: strings.NewReader(tc.state),
|
||||
}
|
||||
res, err := req.make()
|
||||
assert.Nil(t, err, fmt.Sprintf("%s: unexpected error %s", tc.desc, err))
|
||||
assert.Equal(t, tc.status, res.StatusCode, fmt.Sprintf("%s: expected status code %d got %d", tc.desc, tc.status, res.StatusCode))
|
||||
svcCall.Unset()
|
||||
authCall.Unset()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -112,7 +112,10 @@ func TestEntityReqValidation(t *testing.T) {
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
req := entityReq{}
|
||||
req := entityReq{
|
||||
id: tc.id,
|
||||
}
|
||||
|
||||
err := req.validate()
|
||||
assert.Equal(t, tc.err, err, fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err))
|
||||
}
|
||||
@@ -120,10 +123,9 @@ func TestEntityReqValidation(t *testing.T) {
|
||||
|
||||
func TestUpdateReqValidation(t *testing.T) {
|
||||
cases := []struct {
|
||||
desc string
|
||||
token string
|
||||
id string
|
||||
err error
|
||||
desc string
|
||||
id string
|
||||
err error
|
||||
}{
|
||||
{
|
||||
desc: "valid request",
|
||||
@@ -175,7 +177,8 @@ func TestUpdateConnReqValidation(t *testing.T) {
|
||||
desc string
|
||||
id string
|
||||
token string
|
||||
err error
|
||||
|
||||
err error
|
||||
}{
|
||||
{
|
||||
desc: "empty token",
|
||||
|
||||
+23
-20
@@ -47,7 +47,7 @@ func MakeHandler(svc bootstrap.Service, authn mgauthn.Authentication, reader boo
|
||||
|
||||
r := chi.NewRouter()
|
||||
|
||||
r.Route("/things", func(r chi.Router) {
|
||||
r.Route("/{domainID}/things", func(r chi.Router) {
|
||||
r.Group(func(r chi.Router) {
|
||||
r.Use(api.AuthenticateMiddleware(authn))
|
||||
|
||||
@@ -96,30 +96,31 @@ func MakeHandler(svc bootstrap.Service, authn mgauthn.Authentication, reader boo
|
||||
})
|
||||
})
|
||||
|
||||
r.Route("/bootstrap", func(r chi.Router) {
|
||||
r.Get("/", otelhttp.NewHandler(kithttp.NewServer(
|
||||
bootstrapEndpoint(svc, reader, false),
|
||||
decodeBootstrapRequest,
|
||||
api.EncodeResponse,
|
||||
opts...), "bootstrap").ServeHTTP)
|
||||
r.Get("/{externalID}", otelhttp.NewHandler(kithttp.NewServer(
|
||||
bootstrapEndpoint(svc, reader, false),
|
||||
decodeBootstrapRequest,
|
||||
api.EncodeResponse,
|
||||
opts...), "bootstrap").ServeHTTP)
|
||||
r.Get("/secure/{externalID}", otelhttp.NewHandler(kithttp.NewServer(
|
||||
bootstrapEndpoint(svc, reader, true),
|
||||
decodeBootstrapRequest,
|
||||
encodeSecureRes,
|
||||
opts...), "bootstrap_secure").ServeHTTP)
|
||||
})
|
||||
|
||||
r.With(api.AuthenticateMiddleware(authn)).Put("/state/{thingID}", otelhttp.NewHandler(kithttp.NewServer(
|
||||
stateEndpoint(svc),
|
||||
decodeStateRequest,
|
||||
api.EncodeResponse,
|
||||
opts...), "update_state").ServeHTTP)
|
||||
})
|
||||
|
||||
r.Route("/things/bootstrap", func(r chi.Router) {
|
||||
r.Get("/", otelhttp.NewHandler(kithttp.NewServer(
|
||||
bootstrapEndpoint(svc, reader, false),
|
||||
decodeBootstrapRequest,
|
||||
api.EncodeResponse,
|
||||
opts...), "bootstrap").ServeHTTP)
|
||||
r.Get("/{externalID}", otelhttp.NewHandler(kithttp.NewServer(
|
||||
bootstrapEndpoint(svc, reader, false),
|
||||
decodeBootstrapRequest,
|
||||
api.EncodeResponse,
|
||||
opts...), "bootstrap").ServeHTTP)
|
||||
r.Get("/secure/{externalID}", otelhttp.NewHandler(kithttp.NewServer(
|
||||
bootstrapEndpoint(svc, reader, true),
|
||||
decodeBootstrapRequest,
|
||||
encodeSecureRes,
|
||||
opts...), "bootstrap_secure").ServeHTTP)
|
||||
})
|
||||
|
||||
r.Get("/health", magistrala.Health("bootstrap", instanceID))
|
||||
r.Handle("/metrics", promhttp.Handler())
|
||||
|
||||
@@ -131,7 +132,9 @@ func decodeAddRequest(_ context.Context, r *http.Request) (interface{}, error) {
|
||||
return nil, errors.Wrap(apiutil.ErrValidation, apiutil.ErrUnsupportedContentType)
|
||||
}
|
||||
|
||||
req := addReq{token: apiutil.ExtractBearerToken(r)}
|
||||
req := addReq{
|
||||
token: apiutil.ExtractBearerToken(r),
|
||||
}
|
||||
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
|
||||
return nil, errors.Wrap(apiutil.ErrValidation, errors.Wrap(err, errors.ErrMalformedEntity))
|
||||
}
|
||||
|
||||
@@ -192,7 +192,7 @@ func TestAdd(t *testing.T) {
|
||||
lastID := "0"
|
||||
for _, tc := range cases {
|
||||
tc.session = mgauthn.Session{UserID: validID, DomainID: tc.domainID, DomainUserID: validID}
|
||||
sdkCall := tv.sdk.On("Thing", tc.config.ThingID, tc.token).Return(mgsdk.Thing{ID: tc.config.ThingID, Credentials: mgsdk.Credentials{Secret: tc.config.ThingKey}}, errors.NewSDKError(tc.thingErr))
|
||||
sdkCall := tv.sdk.On("Thing", tc.config.ThingID, tc.domainID, tc.token).Return(mgsdk.Thing{ID: tc.config.ThingID, Credentials: mgsdk.Credentials{Secret: tc.config.ThingKey}}, errors.NewSDKError(tc.thingErr))
|
||||
repoCall := tv.boot.On("ListExisting", context.Background(), domainID, mock.Anything).Return(tc.config.Channels, tc.listErr)
|
||||
repoCall1 := tv.boot.On("Save", context.Background(), mock.Anything, mock.Anything).Return(mock.Anything, tc.saveErr)
|
||||
|
||||
@@ -475,7 +475,7 @@ func TestUpdateConnections(t *testing.T) {
|
||||
lastID := "0"
|
||||
for _, tc := range cases {
|
||||
tc.session = mgauthn.Session{UserID: validID, DomainID: tc.domainID, DomainUserID: validID}
|
||||
sdkCall := tv.sdk.On("Channel", mock.Anything, tc.token).Return(mgsdk.Channel{}, tc.channelErr)
|
||||
sdkCall := tv.sdk.On("Channel", mock.Anything, tc.domainID, tc.token).Return(mgsdk.Channel{}, tc.channelErr)
|
||||
repoCall := tv.boot.On("RetrieveByID", context.Background(), tc.domainID, tc.configID).Return(config, tc.retrieveErr)
|
||||
repoCall1 := tv.boot.On("ListExisting", context.Background(), domainID, mock.Anything, mock.Anything).Return(config.Channels, tc.listErr)
|
||||
repoCall2 := tv.boot.On("UpdateConnections", context.Background(), tc.domainID, tc.configID, mock.Anything, tc.connections).Return(tc.updateErr)
|
||||
@@ -1054,7 +1054,7 @@ func TestChangeState(t *testing.T) {
|
||||
for _, tc := range cases {
|
||||
tc.session = mgauthn.Session{UserID: validID, DomainID: tc.domainID, DomainUserID: validID}
|
||||
repoCall := tv.boot.On("RetrieveByID", context.Background(), tc.domainID, tc.id).Return(config, tc.retrieveErr)
|
||||
sdkCall1 := tv.sdk.On("Connect", mock.Anything, mock.Anything).Return(errors.NewSDKError(tc.connectErr))
|
||||
sdkCall1 := tv.sdk.On("Connect", mock.Anything, mock.Anything, mock.Anything).Return(errors.NewSDKError(tc.connectErr))
|
||||
repoCall1 := tv.boot.On("ChangeState", context.Background(), mock.Anything, mock.Anything, mock.Anything).Return(tc.stateErr)
|
||||
err := tv.svc.ChangeState(context.Background(), tc.session, tc.token, tc.id, tc.state)
|
||||
assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err))
|
||||
|
||||
+13
-13
@@ -146,13 +146,13 @@ func (bs bootstrapService) Add(ctx context.Context, session mgauthn.Session, tok
|
||||
return Config{}, errors.Wrap(errCheckChannels, err)
|
||||
}
|
||||
|
||||
cfg.Channels, err = bs.connectionChannels(toConnect, bs.toIDList(existing), token)
|
||||
cfg.Channels, err = bs.connectionChannels(toConnect, bs.toIDList(existing), session.DomainID, token)
|
||||
if err != nil {
|
||||
return Config{}, errors.Wrap(errConnectionChannels, err)
|
||||
}
|
||||
|
||||
id := cfg.ThingID
|
||||
mgThing, err := bs.thing(id, token)
|
||||
mgThing, err := bs.thing(session.DomainID, id, token)
|
||||
if err != nil {
|
||||
return Config{}, errors.Wrap(errThingNotFound, err)
|
||||
}
|
||||
@@ -173,7 +173,7 @@ func (bs bootstrapService) Add(ctx context.Context, session mgauthn.Session, tok
|
||||
// If id is empty, then a new thing has been created function - bs.thing(id, token)
|
||||
// So, on bootstrap config save error , delete the newly created thing.
|
||||
if id == "" {
|
||||
if errT := bs.sdk.DeleteThing(cfg.ThingID, token); errT != nil {
|
||||
if errT := bs.sdk.DeleteThing(cfg.ThingID, cfg.DomainID, token); errT != nil {
|
||||
err = errors.Wrap(err, errT)
|
||||
}
|
||||
}
|
||||
@@ -224,7 +224,7 @@ func (bs bootstrapService) UpdateConnections(ctx context.Context, session mgauth
|
||||
return errors.Wrap(errUpdateConnections, err)
|
||||
}
|
||||
|
||||
channels, err := bs.connectionChannels(connections, bs.toIDList(existing), token)
|
||||
channels, err := bs.connectionChannels(connections, bs.toIDList(existing), session.DomainID, token)
|
||||
if err != nil {
|
||||
return errors.Wrap(errUpdateConnections, err)
|
||||
}
|
||||
@@ -238,7 +238,7 @@ func (bs bootstrapService) UpdateConnections(ctx context.Context, session mgauth
|
||||
}
|
||||
|
||||
for _, c := range disconnect {
|
||||
if err := bs.sdk.DisconnectThing(id, c, token); err != nil {
|
||||
if err := bs.sdk.DisconnectThing(id, c, session.DomainID, token); err != nil {
|
||||
if errors.Contains(err, repoerr.ErrNotFound) {
|
||||
continue
|
||||
}
|
||||
@@ -251,7 +251,7 @@ func (bs bootstrapService) UpdateConnections(ctx context.Context, session mgauth
|
||||
ChannelID: c,
|
||||
ThingID: id,
|
||||
}
|
||||
if err := bs.sdk.Connect(conIDs, token); err != nil {
|
||||
if err := bs.sdk.Connect(conIDs, session.DomainID, token); err != nil {
|
||||
return ErrThings
|
||||
}
|
||||
}
|
||||
@@ -340,7 +340,7 @@ func (bs bootstrapService) ChangeState(ctx context.Context, session mgauthn.Sess
|
||||
ChannelID: c.ID,
|
||||
ThingID: cfg.ThingID,
|
||||
}
|
||||
if err := bs.sdk.Connect(conIDs, token); err != nil {
|
||||
if err := bs.sdk.Connect(conIDs, session.DomainID, token); err != nil {
|
||||
// Ignore conflict errors as they indicate the connection already exists.
|
||||
if errors.Contains(err, svcerr.ErrConflict) {
|
||||
continue
|
||||
@@ -350,7 +350,7 @@ func (bs bootstrapService) ChangeState(ctx context.Context, session mgauthn.Sess
|
||||
}
|
||||
case Inactive:
|
||||
for _, c := range cfg.Channels {
|
||||
if err := bs.sdk.DisconnectThing(cfg.ThingID, c.ID, token); err != nil {
|
||||
if err := bs.sdk.DisconnectThing(cfg.ThingID, c.ID, session.DomainID, token); err != nil {
|
||||
if errors.Contains(err, repoerr.ErrNotFound) {
|
||||
continue
|
||||
}
|
||||
@@ -400,14 +400,14 @@ func (bs bootstrapService) DisconnectThingHandler(ctx context.Context, channelID
|
||||
}
|
||||
|
||||
// Method thing retrieves Magistrala Thing creating one if an empty ID is passed.
|
||||
func (bs bootstrapService) thing(id, token string) (mgsdk.Thing, error) {
|
||||
func (bs bootstrapService) thing(domainID, id, token string) (mgsdk.Thing, error) {
|
||||
// If Thing ID is not provided, then create new thing.
|
||||
if id == "" {
|
||||
id, err := bs.idProvider.ID()
|
||||
if err != nil {
|
||||
return mgsdk.Thing{}, errors.Wrap(errCreateThing, err)
|
||||
}
|
||||
thing, sdkErr := bs.sdk.CreateThing(mgsdk.Thing{ID: id, Name: "Bootstrapped Thing " + id}, token)
|
||||
thing, sdkErr := bs.sdk.CreateThing(mgsdk.Thing{ID: id, Name: "Bootstrapped Thing " + id}, domainID, token)
|
||||
if sdkErr != nil {
|
||||
return mgsdk.Thing{}, errors.Wrap(errCreateThing, sdkErr)
|
||||
}
|
||||
@@ -415,14 +415,14 @@ func (bs bootstrapService) thing(id, token string) (mgsdk.Thing, error) {
|
||||
}
|
||||
|
||||
// If Thing ID is provided, then retrieve thing
|
||||
thing, sdkErr := bs.sdk.Thing(id, token)
|
||||
thing, sdkErr := bs.sdk.Thing(id, domainID, token)
|
||||
if sdkErr != nil {
|
||||
return mgsdk.Thing{}, errors.Wrap(ErrThings, sdkErr)
|
||||
}
|
||||
return thing, nil
|
||||
}
|
||||
|
||||
func (bs bootstrapService) connectionChannels(channels, existing []string, token string) ([]Channel, error) {
|
||||
func (bs bootstrapService) connectionChannels(channels, existing []string, domainID, token string) ([]Channel, error) {
|
||||
add := make(map[string]bool, len(channels))
|
||||
for _, ch := range channels {
|
||||
add[ch] = true
|
||||
@@ -436,7 +436,7 @@ func (bs bootstrapService) connectionChannels(channels, existing []string, token
|
||||
|
||||
var ret []Channel
|
||||
for id := range add {
|
||||
ch, err := bs.sdk.Channel(id, token)
|
||||
ch, err := bs.sdk.Channel(id, domainID, token)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(errors.ErrMalformedEntity, err)
|
||||
}
|
||||
|
||||
+125
-97
@@ -150,19 +150,21 @@ func TestAdd(t *testing.T) {
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
tc.session = mgauthn.Session{UserID: tc.userID, DomainID: tc.domainID, DomainUserID: validID}
|
||||
repoCall := sdk.On("Thing", tc.config.ThingID, tc.token).Return(mgsdk.Thing{ID: tc.config.ThingID, Credentials: mgsdk.Credentials{Secret: tc.config.ThingKey}}, tc.thingErr)
|
||||
repoCall1 := sdk.On("CreateThing", mock.Anything, tc.token).Return(mgsdk.Thing{}, tc.createThingErr)
|
||||
repoCall2 := sdk.On("DeleteThing", tc.config.ThingID, tc.token).Return(tc.deleteThingErr)
|
||||
repoCall3 := boot.On("ListExisting", context.Background(), tc.domainID, mock.Anything).Return(tc.config.Channels, tc.listExistingErr)
|
||||
repoCall4 := boot.On("Save", context.Background(), mock.Anything, mock.Anything).Return(mock.Anything, tc.saveErr)
|
||||
_, err := svc.Add(context.Background(), tc.session, tc.token, tc.config)
|
||||
assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err))
|
||||
repoCall.Unset()
|
||||
repoCall1.Unset()
|
||||
repoCall2.Unset()
|
||||
repoCall3.Unset()
|
||||
repoCall4.Unset()
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
tc.session = mgauthn.Session{UserID: tc.userID, DomainID: tc.domainID, DomainUserID: validID}
|
||||
repoCall := sdk.On("Thing", tc.config.ThingID, mock.Anything, tc.token).Return(mgsdk.Thing{ID: tc.config.ThingID, Credentials: mgsdk.Credentials{Secret: tc.config.ThingKey}}, tc.thingErr)
|
||||
repoCall1 := sdk.On("CreateThing", mock.Anything, tc.domainID, tc.token).Return(mgsdk.Thing{}, tc.createThingErr)
|
||||
repoCall2 := sdk.On("DeleteThing", tc.config.ThingID, tc.domainID, tc.token).Return(tc.deleteThingErr)
|
||||
repoCall3 := boot.On("ListExisting", context.Background(), tc.domainID, mock.Anything).Return(tc.config.Channels, tc.listExistingErr)
|
||||
repoCall4 := boot.On("Save", context.Background(), mock.Anything, mock.Anything).Return(mock.Anything, tc.saveErr)
|
||||
_, err := svc.Add(context.Background(), tc.session, tc.token, tc.config)
|
||||
assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err))
|
||||
repoCall.Unset()
|
||||
repoCall1.Unset()
|
||||
repoCall2.Unset()
|
||||
repoCall3.Unset()
|
||||
repoCall4.Unset()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -214,11 +216,13 @@ func TestView(t *testing.T) {
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
tc.session = mgauthn.Session{UserID: tc.userID, DomainID: tc.domain, DomainUserID: validID}
|
||||
repoCall := boot.On("RetrieveByID", context.Background(), tc.thingDomain, tc.configID).Return(config, tc.retrieveErr)
|
||||
_, err := svc.View(context.Background(), tc.session, tc.configID)
|
||||
assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err))
|
||||
repoCall.Unset()
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
tc.session = mgauthn.Session{UserID: tc.userID, DomainID: tc.domain, DomainUserID: validID}
|
||||
repoCall := boot.On("RetrieveByID", context.Background(), tc.thingDomain, tc.configID).Return(config, tc.retrieveErr)
|
||||
_, err := svc.View(context.Background(), tc.session, tc.configID)
|
||||
assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err))
|
||||
repoCall.Unset()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -276,11 +280,13 @@ func TestUpdate(t *testing.T) {
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
tc.session = mgauthn.Session{UserID: tc.userID, DomainID: tc.domainID, DomainUserID: validID}
|
||||
repoCall := boot.On("Update", context.Background(), mock.Anything).Return(tc.updateErr)
|
||||
err := svc.Update(context.Background(), tc.session, tc.config)
|
||||
assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err))
|
||||
repoCall.Unset()
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
tc.session = mgauthn.Session{UserID: tc.userID, DomainID: tc.domainID, DomainUserID: validID}
|
||||
repoCall := boot.On("Update", context.Background(), mock.Anything).Return(tc.updateErr)
|
||||
err := svc.Update(context.Background(), tc.session, tc.config)
|
||||
assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err))
|
||||
repoCall.Unset()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -349,18 +355,20 @@ func TestUpdateCert(t *testing.T) {
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
tc.session = mgauthn.Session{UserID: tc.userID, DomainID: tc.domainID, DomainUserID: validID}
|
||||
repoCall := boot.On("UpdateCert", context.Background(), mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(tc.expectedConfig, tc.updateErr)
|
||||
cfg, err := svc.UpdateCert(context.Background(), tc.session, tc.thingID, tc.clientCert, tc.clientKey, tc.caCert)
|
||||
assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err))
|
||||
sort.Slice(cfg.Channels, func(i, j int) bool {
|
||||
return cfg.Channels[i].ID < cfg.Channels[j].ID
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
tc.session = mgauthn.Session{UserID: tc.userID, DomainID: tc.domainID, DomainUserID: validID}
|
||||
repoCall := boot.On("UpdateCert", context.Background(), mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(tc.expectedConfig, tc.updateErr)
|
||||
cfg, err := svc.UpdateCert(context.Background(), tc.session, tc.thingID, tc.clientCert, tc.clientKey, tc.caCert)
|
||||
assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err))
|
||||
sort.Slice(cfg.Channels, func(i, j int) bool {
|
||||
return cfg.Channels[i].ID < cfg.Channels[j].ID
|
||||
})
|
||||
sort.Slice(tc.expectedConfig.Channels, func(i, j int) bool {
|
||||
return tc.expectedConfig.Channels[i].ID < tc.expectedConfig.Channels[j].ID
|
||||
})
|
||||
assert.Equal(t, tc.expectedConfig, cfg, fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.expectedConfig, cfg))
|
||||
repoCall.Unset()
|
||||
})
|
||||
sort.Slice(tc.expectedConfig.Channels, func(i, j int) bool {
|
||||
return tc.expectedConfig.Channels[i].ID < tc.expectedConfig.Channels[j].ID
|
||||
})
|
||||
assert.Equal(t, tc.expectedConfig, cfg, fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.expectedConfig, cfg))
|
||||
repoCall.Unset()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -424,17 +432,19 @@ func TestUpdateConnections(t *testing.T) {
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
tc.session = mgauthn.Session{UserID: tc.userID, DomainID: tc.domainID, DomainUserID: validID}
|
||||
sdkCall := sdk.On("Channel", mock.Anything, tc.token).Return(mgsdk.Channel{}, tc.channelErr)
|
||||
repoCall := boot.On("RetrieveByID", context.Background(), tc.domainID, tc.id).Return(c, tc.retrieveErr)
|
||||
repoCall1 := boot.On("ListExisting", context.Background(), mock.Anything, mock.Anything, mock.Anything).Return(c.Channels, tc.listErr)
|
||||
repoCall2 := boot.On("UpdateConnections", context.Background(), mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(tc.updateErr)
|
||||
err := svc.UpdateConnections(context.Background(), tc.session, tc.token, tc.id, tc.connections)
|
||||
assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err))
|
||||
sdkCall.Unset()
|
||||
repoCall.Unset()
|
||||
repoCall1.Unset()
|
||||
repoCall2.Unset()
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
tc.session = mgauthn.Session{UserID: tc.userID, DomainID: tc.domainID, DomainUserID: validID}
|
||||
sdkCall := sdk.On("Channel", mock.Anything, tc.domainID, tc.token).Return(mgsdk.Channel{}, tc.channelErr)
|
||||
repoCall := boot.On("RetrieveByID", context.Background(), tc.domainID, tc.id).Return(c, tc.retrieveErr)
|
||||
repoCall1 := boot.On("ListExisting", context.Background(), mock.Anything, mock.Anything, mock.Anything).Return(c.Channels, tc.listErr)
|
||||
repoCall2 := boot.On("UpdateConnections", context.Background(), mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(tc.updateErr)
|
||||
err := svc.UpdateConnections(context.Background(), tc.session, tc.token, tc.id, tc.connections)
|
||||
assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err))
|
||||
sdkCall.Unset()
|
||||
repoCall.Unset()
|
||||
repoCall1.Unset()
|
||||
repoCall2.Unset()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -707,20 +717,22 @@ func TestList(t *testing.T) {
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
policyCall := policies.On("ListAllObjects", mock.Anything, policysvc.Policy{
|
||||
SubjectType: policysvc.UserType,
|
||||
Subject: tc.userID,
|
||||
Permission: policysvc.ViewPermission,
|
||||
ObjectType: policysvc.ThingType,
|
||||
}).Return(tc.listObjectsResponse, tc.listObjectsErr)
|
||||
repoCall := boot.On("RetrieveAll", context.Background(), mock.Anything, mock.Anything, tc.filter, tc.offset, tc.limit).Return(tc.config, tc.retrieveErr)
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
policyCall := policies.On("ListAllObjects", mock.Anything, policysvc.Policy{
|
||||
SubjectType: policysvc.UserType,
|
||||
Subject: tc.userID,
|
||||
Permission: policysvc.ViewPermission,
|
||||
ObjectType: policysvc.ThingType,
|
||||
}).Return(tc.listObjectsResponse, tc.listObjectsErr)
|
||||
repoCall := boot.On("RetrieveAll", context.Background(), mock.Anything, mock.Anything, tc.filter, tc.offset, tc.limit).Return(tc.config, tc.retrieveErr)
|
||||
|
||||
result, err := svc.List(context.Background(), tc.session, tc.filter, tc.offset, tc.limit)
|
||||
assert.ElementsMatch(t, tc.config.Configs, result.Configs, fmt.Sprintf("%s: expected %v got %v", tc.desc, tc.config.Configs, result.Configs))
|
||||
assert.Equal(t, tc.config.Total, result.Total, fmt.Sprintf("%s: expected %v got %v", tc.desc, tc.config.Total, result.Total))
|
||||
assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err))
|
||||
policyCall.Unset()
|
||||
repoCall.Unset()
|
||||
result, err := svc.List(context.Background(), tc.session, tc.filter, tc.offset, tc.limit)
|
||||
assert.ElementsMatch(t, tc.config.Configs, result.Configs, fmt.Sprintf("%s: expected %v got %v", tc.desc, tc.config.Configs, result.Configs))
|
||||
assert.Equal(t, tc.config.Total, result.Total, fmt.Sprintf("%s: expected %v got %v", tc.desc, tc.config.Total, result.Total))
|
||||
assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err))
|
||||
policyCall.Unset()
|
||||
repoCall.Unset()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -766,11 +778,13 @@ func TestRemove(t *testing.T) {
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
tc.session = mgauthn.Session{UserID: tc.userID, DomainID: tc.domainID, DomainUserID: validID}
|
||||
repoCall := boot.On("Remove", context.Background(), mock.Anything, mock.Anything).Return(tc.removeErr)
|
||||
err := svc.Remove(context.Background(), tc.session, tc.id)
|
||||
assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err))
|
||||
repoCall.Unset()
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
tc.session = mgauthn.Session{UserID: tc.userID, DomainID: tc.domainID, DomainUserID: validID}
|
||||
repoCall := boot.On("Remove", context.Background(), mock.Anything, mock.Anything).Return(tc.removeErr)
|
||||
err := svc.Remove(context.Background(), tc.session, tc.id)
|
||||
assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err))
|
||||
repoCall.Unset()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -834,11 +848,13 @@ func TestBootstrap(t *testing.T) {
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
repoCall := boot.On("RetrieveByExternalID", context.Background(), mock.Anything).Return(tc.config, tc.err)
|
||||
config, err := svc.Bootstrap(context.Background(), tc.externalKey, tc.externalID, tc.encrypted)
|
||||
assert.Equal(t, tc.config, config, fmt.Sprintf("%s: expected %v got %v\n", tc.desc, tc.config, config))
|
||||
assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err))
|
||||
repoCall.Unset()
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
repoCall := boot.On("RetrieveByExternalID", context.Background(), mock.Anything).Return(tc.config, tc.err)
|
||||
config, err := svc.Bootstrap(context.Background(), tc.externalKey, tc.externalID, tc.encrypted)
|
||||
assert.Equal(t, tc.config, config, fmt.Sprintf("%s: expected %v got %v\n", tc.desc, tc.config, config))
|
||||
assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err))
|
||||
repoCall.Unset()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -920,15 +936,17 @@ func TestChangeState(t *testing.T) {
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
tc.session = mgauthn.Session{UserID: tc.userID, DomainID: tc.domainID, DomainUserID: validID}
|
||||
repoCall := boot.On("RetrieveByID", context.Background(), tc.domainID, tc.id).Return(c, tc.retrieveErr)
|
||||
sdkCall := sdk.On("Connect", mock.Anything, mock.Anything).Return(tc.connectErr)
|
||||
repoCall1 := boot.On("ChangeState", context.Background(), mock.Anything, mock.Anything, mock.Anything).Return(tc.stateErr)
|
||||
err := svc.ChangeState(context.Background(), tc.session, tc.token, tc.id, tc.state)
|
||||
assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err))
|
||||
sdkCall.Unset()
|
||||
repoCall.Unset()
|
||||
repoCall1.Unset()
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
tc.session = mgauthn.Session{UserID: tc.userID, DomainID: tc.domainID, DomainUserID: validID}
|
||||
repoCall := boot.On("RetrieveByID", context.Background(), tc.domainID, tc.id).Return(c, tc.retrieveErr)
|
||||
sdkCall := sdk.On("Connect", mock.Anything, mock.Anything, mock.Anything).Return(tc.connectErr)
|
||||
repoCall1 := boot.On("ChangeState", context.Background(), mock.Anything, mock.Anything, mock.Anything).Return(tc.stateErr)
|
||||
err := svc.ChangeState(context.Background(), tc.session, tc.token, tc.id, tc.state)
|
||||
assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err))
|
||||
sdkCall.Unset()
|
||||
repoCall.Unset()
|
||||
repoCall1.Unset()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -959,10 +977,12 @@ func TestUpdateChannelHandler(t *testing.T) {
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
repoCall := boot.On("UpdateChannel", context.Background(), mock.Anything).Return(tc.err)
|
||||
err := svc.UpdateChannelHandler(context.Background(), tc.channel)
|
||||
assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err))
|
||||
repoCall.Unset()
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
repoCall := boot.On("UpdateChannel", context.Background(), mock.Anything).Return(tc.err)
|
||||
err := svc.UpdateChannelHandler(context.Background(), tc.channel)
|
||||
assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err))
|
||||
repoCall.Unset()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -987,10 +1007,12 @@ func TestRemoveChannelHandler(t *testing.T) {
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
repoCall := boot.On("RemoveChannel", context.Background(), mock.Anything).Return(tc.err)
|
||||
err := svc.RemoveChannelHandler(context.Background(), tc.id)
|
||||
assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err))
|
||||
repoCall.Unset()
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
repoCall := boot.On("RemoveChannel", context.Background(), mock.Anything).Return(tc.err)
|
||||
err := svc.RemoveChannelHandler(context.Background(), tc.id)
|
||||
assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err))
|
||||
repoCall.Unset()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1015,10 +1037,12 @@ func TestRemoveConfigHandler(t *testing.T) {
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
repoCall := boot.On("RemoveThing", context.Background(), mock.Anything).Return(tc.err)
|
||||
err := svc.RemoveConfigHandler(context.Background(), tc.id)
|
||||
assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err))
|
||||
repoCall.Unset()
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
repoCall := boot.On("RemoveThing", context.Background(), mock.Anything).Return(tc.err)
|
||||
err := svc.RemoveConfigHandler(context.Background(), tc.id)
|
||||
assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err))
|
||||
repoCall.Unset()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1046,10 +1070,12 @@ func TestConnectThingsHandler(t *testing.T) {
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
repoCall := boot.On("ConnectThing", context.Background(), mock.Anything, mock.Anything).Return(tc.err)
|
||||
err := svc.ConnectThingHandler(context.Background(), tc.channelID, tc.thingID)
|
||||
assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err))
|
||||
repoCall.Unset()
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
repoCall := boot.On("ConnectThing", context.Background(), mock.Anything, mock.Anything).Return(tc.err)
|
||||
err := svc.ConnectThingHandler(context.Background(), tc.channelID, tc.thingID)
|
||||
assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err))
|
||||
repoCall.Unset()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1077,9 +1103,11 @@ func TestDisconnectThingsHandler(t *testing.T) {
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
repoCall := boot.On("DisconnectThing", context.Background(), mock.Anything, mock.Anything).Return(tc.err)
|
||||
err := svc.DisconnectThingHandler(context.Background(), tc.channelID, tc.thingID)
|
||||
assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err))
|
||||
repoCall.Unset()
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
repoCall := boot.On("DisconnectThing", context.Background(), mock.Anything, mock.Anything).Return(tc.err)
|
||||
err := svc.DisconnectThingHandler(context.Background(), tc.channelID, tc.thingID)
|
||||
assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err))
|
||||
repoCall.Unset()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@ func issueCert(svc certs.Service) endpoint.Endpoint {
|
||||
if err := req.validate(); err != nil {
|
||||
return nil, errors.Wrap(apiutil.ErrValidation, err)
|
||||
}
|
||||
res, err := svc.IssueCert(ctx, req.token, req.ThingID, req.TTL)
|
||||
res, err := svc.IssueCert(ctx, req.domainID, req.token, req.ThingID, req.TTL)
|
||||
if err != nil {
|
||||
return certsRes{}, errors.Wrap(apiutil.ErrValidation, err)
|
||||
}
|
||||
@@ -97,7 +97,7 @@ func revokeCert(svc certs.Service) endpoint.Endpoint {
|
||||
if err := req.validate(); err != nil {
|
||||
return nil, errors.Wrap(apiutil.ErrValidation, err)
|
||||
}
|
||||
res, err := svc.RevokeCert(ctx, req.token, req.certID)
|
||||
res, err := svc.RevokeCert(ctx, req.domainID, req.token, req.certID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
+261
-192
@@ -84,6 +84,7 @@ func TestIssueCert(t *testing.T) {
|
||||
|
||||
cases := []struct {
|
||||
desc string
|
||||
domainID string
|
||||
token string
|
||||
session mgauthn.Session
|
||||
contentType string
|
||||
@@ -99,6 +100,7 @@ func TestIssueCert(t *testing.T) {
|
||||
{
|
||||
desc: "issue cert successfully",
|
||||
token: valid,
|
||||
domainID: valid,
|
||||
contentType: contentType,
|
||||
thingID: thingID,
|
||||
ttl: ttl,
|
||||
@@ -108,6 +110,19 @@ func TestIssueCert(t *testing.T) {
|
||||
svcErr: nil,
|
||||
err: nil,
|
||||
},
|
||||
{
|
||||
desc: "issue cert with failed service",
|
||||
token: valid,
|
||||
domainID: valid,
|
||||
contentType: contentType,
|
||||
thingID: thingID,
|
||||
ttl: ttl,
|
||||
request: fmt.Sprintf(validReqString, thingID, ttl),
|
||||
status: http.StatusUnprocessableEntity,
|
||||
svcRes: certs.Cert{},
|
||||
svcErr: svcerr.ErrCreateEntity,
|
||||
err: svcerr.ErrCreateEntity,
|
||||
},
|
||||
{
|
||||
desc: "issue with invalid token",
|
||||
token: invalid,
|
||||
@@ -122,7 +137,7 @@ func TestIssueCert(t *testing.T) {
|
||||
},
|
||||
{
|
||||
desc: "issue with empty token",
|
||||
token: "",
|
||||
domainID: valid,
|
||||
contentType: contentType,
|
||||
request: fmt.Sprintf(validReqString, thingID, ttl),
|
||||
status: http.StatusUnauthorized,
|
||||
@@ -130,9 +145,21 @@ func TestIssueCert(t *testing.T) {
|
||||
svcErr: nil,
|
||||
err: apiutil.ErrBearerToken,
|
||||
},
|
||||
{
|
||||
desc: "issue with empty domain id",
|
||||
token: valid,
|
||||
domainID: "",
|
||||
contentType: contentType,
|
||||
request: fmt.Sprintf(validReqString, thingID, ttl),
|
||||
status: http.StatusBadRequest,
|
||||
svcRes: certs.Cert{},
|
||||
svcErr: nil,
|
||||
err: apiutil.ErrMissingDomainID,
|
||||
},
|
||||
{
|
||||
desc: "issue with empty thing id",
|
||||
token: valid,
|
||||
domainID: valid,
|
||||
contentType: contentType,
|
||||
request: fmt.Sprintf(validReqString, "", ttl),
|
||||
status: http.StatusBadRequest,
|
||||
@@ -143,6 +170,7 @@ func TestIssueCert(t *testing.T) {
|
||||
{
|
||||
desc: "issue with empty ttl",
|
||||
token: valid,
|
||||
domainID: valid,
|
||||
contentType: contentType,
|
||||
request: fmt.Sprintf(validReqString, thingID, ""),
|
||||
status: http.StatusBadRequest,
|
||||
@@ -153,6 +181,7 @@ func TestIssueCert(t *testing.T) {
|
||||
{
|
||||
desc: "issue with invalid ttl",
|
||||
token: valid,
|
||||
domainID: valid,
|
||||
contentType: contentType,
|
||||
request: fmt.Sprintf(validReqString, thingID, invalid),
|
||||
status: http.StatusBadRequest,
|
||||
@@ -163,6 +192,7 @@ func TestIssueCert(t *testing.T) {
|
||||
{
|
||||
desc: "issue with invalid content type",
|
||||
token: valid,
|
||||
domainID: valid,
|
||||
contentType: "application/xml",
|
||||
request: fmt.Sprintf(validReqString, thingID, ttl),
|
||||
status: http.StatusUnsupportedMediaType,
|
||||
@@ -173,6 +203,7 @@ func TestIssueCert(t *testing.T) {
|
||||
{
|
||||
desc: "issue with invalid request body",
|
||||
token: valid,
|
||||
domainID: valid,
|
||||
contentType: contentType,
|
||||
request: fmt.Sprintf(invalidReqString, thingID, ttl),
|
||||
status: http.StatusInternalServerError,
|
||||
@@ -183,31 +214,33 @@ func TestIssueCert(t *testing.T) {
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
req := testRequest{
|
||||
client: cs.Client(),
|
||||
method: http.MethodPost,
|
||||
url: fmt.Sprintf("%s/certs", cs.URL),
|
||||
contentType: tc.contentType,
|
||||
token: tc.token,
|
||||
body: strings.NewReader(tc.request),
|
||||
}
|
||||
if tc.token == valid {
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: validID}
|
||||
}
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(tc.session, tc.authenticateErr)
|
||||
svcCall := svc.On("IssueCert", mock.Anything, tc.token, tc.thingID, tc.ttl).Return(tc.svcRes, tc.svcErr)
|
||||
res, err := req.make()
|
||||
assert.Nil(t, err, fmt.Sprintf("%s: unexpected error %s", tc.desc, err))
|
||||
var errRes respBody
|
||||
err = json.NewDecoder(res.Body).Decode(&errRes)
|
||||
assert.Nil(t, err, fmt.Sprintf("%s: unexpected error while decoding response body: %s", tc.desc, err))
|
||||
if errRes.Err != "" || errRes.Message != "" {
|
||||
err = errors.Wrap(errors.New(errRes.Err), errors.New(errRes.Message))
|
||||
}
|
||||
assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err))
|
||||
assert.Equal(t, tc.status, res.StatusCode, fmt.Sprintf("%s: expected status code %d got %d", tc.desc, tc.status, res.StatusCode))
|
||||
svcCall.Unset()
|
||||
authCall.Unset()
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
req := testRequest{
|
||||
client: cs.Client(),
|
||||
method: http.MethodPost,
|
||||
url: fmt.Sprintf("%s/%s/certs", cs.URL, tc.domainID),
|
||||
contentType: tc.contentType,
|
||||
token: tc.token,
|
||||
body: strings.NewReader(tc.request),
|
||||
}
|
||||
if tc.token == valid {
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: validID}
|
||||
}
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(tc.session, tc.authenticateErr)
|
||||
svcCall := svc.On("IssueCert", mock.Anything, tc.domainID, tc.token, tc.thingID, tc.ttl).Return(tc.svcRes, tc.svcErr)
|
||||
res, err := req.make()
|
||||
assert.Nil(t, err, fmt.Sprintf("%s: unexpected error %s", tc.desc, err))
|
||||
var errRes respBody
|
||||
err = json.NewDecoder(res.Body).Decode(&errRes)
|
||||
assert.Nil(t, err, fmt.Sprintf("%s: unexpected error while decoding response body: %s", tc.desc, err))
|
||||
if errRes.Err != "" || errRes.Message != "" {
|
||||
err = errors.Wrap(errors.New(errRes.Err), errors.New(errRes.Message))
|
||||
}
|
||||
assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err))
|
||||
assert.Equal(t, tc.status, res.StatusCode, fmt.Sprintf("%s: expected status code %d got %d", tc.desc, tc.status, res.StatusCode))
|
||||
svcCall.Unset()
|
||||
authCall.Unset()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -217,6 +250,7 @@ func TestViewCert(t *testing.T) {
|
||||
|
||||
cases := []struct {
|
||||
desc string
|
||||
domainID string
|
||||
token string
|
||||
session mgauthn.Session
|
||||
serialID string
|
||||
@@ -230,6 +264,7 @@ func TestViewCert(t *testing.T) {
|
||||
{
|
||||
desc: "view cert successfully",
|
||||
token: valid,
|
||||
domainID: valid,
|
||||
serialID: serial,
|
||||
status: http.StatusOK,
|
||||
svcRes: certs.Cert{SerialNumber: serial},
|
||||
@@ -248,6 +283,7 @@ func TestViewCert(t *testing.T) {
|
||||
{
|
||||
desc: "view with empty token",
|
||||
token: "",
|
||||
domainID: valid,
|
||||
serialID: serial,
|
||||
status: http.StatusUnauthorized,
|
||||
svcRes: certs.Cert{},
|
||||
@@ -257,6 +293,7 @@ func TestViewCert(t *testing.T) {
|
||||
{
|
||||
desc: "view non-existing cert",
|
||||
token: valid,
|
||||
domainID: valid,
|
||||
serialID: invalid,
|
||||
status: http.StatusNotFound,
|
||||
svcRes: certs.Cert{},
|
||||
@@ -265,29 +302,31 @@ func TestViewCert(t *testing.T) {
|
||||
},
|
||||
}
|
||||
for _, tc := range cases {
|
||||
req := testRequest{
|
||||
client: cs.Client(),
|
||||
method: http.MethodGet,
|
||||
url: fmt.Sprintf("%s/certs/%s", cs.URL, tc.serialID),
|
||||
token: tc.token,
|
||||
}
|
||||
if tc.token == valid {
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: validID}
|
||||
}
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(tc.session, tc.authenticateErr)
|
||||
svcCall := svc.On("ViewCert", mock.Anything, tc.serialID).Return(tc.svcRes, tc.svcErr)
|
||||
res, err := req.make()
|
||||
assert.Nil(t, err, fmt.Sprintf("%s: unexpected error %s", tc.desc, err))
|
||||
var errRes respBody
|
||||
err = json.NewDecoder(res.Body).Decode(&errRes)
|
||||
assert.Nil(t, err, fmt.Sprintf("%s: unexpected error while decoding response body: %s", tc.desc, err))
|
||||
if errRes.Err != "" || errRes.Message != "" {
|
||||
err = errors.Wrap(errors.New(errRes.Err), errors.New(errRes.Message))
|
||||
}
|
||||
assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err))
|
||||
assert.Equal(t, tc.status, res.StatusCode, fmt.Sprintf("%s: expected status code %d got %d", tc.desc, tc.status, res.StatusCode))
|
||||
svcCall.Unset()
|
||||
authCall.Unset()
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
req := testRequest{
|
||||
client: cs.Client(),
|
||||
method: http.MethodGet,
|
||||
url: fmt.Sprintf("%s/%s/certs/%s", cs.URL, tc.domainID, tc.serialID),
|
||||
token: tc.token,
|
||||
}
|
||||
if tc.token == valid {
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: validID}
|
||||
}
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(tc.session, tc.authenticateErr)
|
||||
svcCall := svc.On("ViewCert", mock.Anything, tc.serialID).Return(tc.svcRes, tc.svcErr)
|
||||
res, err := req.make()
|
||||
assert.Nil(t, err, fmt.Sprintf("%s: unexpected error %s", tc.desc, err))
|
||||
var errRes respBody
|
||||
err = json.NewDecoder(res.Body).Decode(&errRes)
|
||||
assert.Nil(t, err, fmt.Sprintf("%s: unexpected error while decoding response body: %s", tc.desc, err))
|
||||
if errRes.Err != "" || errRes.Message != "" {
|
||||
err = errors.Wrap(errors.New(errRes.Err), errors.New(errRes.Message))
|
||||
}
|
||||
assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err))
|
||||
assert.Equal(t, tc.status, res.StatusCode, fmt.Sprintf("%s: expected status code %d got %d", tc.desc, tc.status, res.StatusCode))
|
||||
svcCall.Unset()
|
||||
authCall.Unset()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -297,6 +336,7 @@ func TestRevokeCert(t *testing.T) {
|
||||
|
||||
cases := []struct {
|
||||
desc string
|
||||
domainID string
|
||||
token string
|
||||
session mgauthn.Session
|
||||
serialID string
|
||||
@@ -309,6 +349,7 @@ func TestRevokeCert(t *testing.T) {
|
||||
{
|
||||
desc: "revoke cert successfully",
|
||||
token: valid,
|
||||
domainID: valid,
|
||||
serialID: serial,
|
||||
status: http.StatusOK,
|
||||
svcRes: certs.Revoke{RevocationTime: time.Now()},
|
||||
@@ -324,9 +365,19 @@ func TestRevokeCert(t *testing.T) {
|
||||
authenticateErr: svcerr.ErrAuthentication,
|
||||
err: svcerr.ErrAuthentication,
|
||||
},
|
||||
{
|
||||
desc: "revoke with empty domain id",
|
||||
token: valid,
|
||||
domainID: "",
|
||||
serialID: serial,
|
||||
status: http.StatusBadRequest,
|
||||
svcErr: nil,
|
||||
err: apiutil.ErrMissingDomainID,
|
||||
},
|
||||
{
|
||||
desc: "revoke with empty token",
|
||||
token: "",
|
||||
domainID: valid,
|
||||
serialID: serial,
|
||||
status: http.StatusUnauthorized,
|
||||
svcErr: nil,
|
||||
@@ -335,6 +386,7 @@ func TestRevokeCert(t *testing.T) {
|
||||
{
|
||||
desc: "revoke non-existing cert",
|
||||
token: valid,
|
||||
domainID: valid,
|
||||
serialID: invalid,
|
||||
status: http.StatusNotFound,
|
||||
svcRes: certs.Revoke{},
|
||||
@@ -343,29 +395,31 @@ func TestRevokeCert(t *testing.T) {
|
||||
},
|
||||
}
|
||||
for _, tc := range cases {
|
||||
req := testRequest{
|
||||
client: cs.Client(),
|
||||
method: http.MethodDelete,
|
||||
url: fmt.Sprintf("%s/certs/%s", cs.URL, tc.serialID),
|
||||
token: tc.token,
|
||||
}
|
||||
if tc.token == valid {
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: validID}
|
||||
}
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(tc.session, tc.authenticateErr)
|
||||
svcCall := svc.On("RevokeCert", mock.Anything, tc.token, tc.serialID).Return(tc.svcRes, tc.svcErr)
|
||||
res, err := req.make()
|
||||
assert.Nil(t, err, fmt.Sprintf("%s: unexpected error %s", tc.desc, err))
|
||||
var errRes respBody
|
||||
err = json.NewDecoder(res.Body).Decode(&errRes)
|
||||
assert.Nil(t, err, fmt.Sprintf("%s: unexpected error while decoding response body: %s", tc.desc, err))
|
||||
if errRes.Err != "" || errRes.Message != "" {
|
||||
err = errors.Wrap(errors.New(errRes.Err), errors.New(errRes.Message))
|
||||
}
|
||||
assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n ", tc.desc, tc.err, err))
|
||||
assert.Equal(t, tc.status, res.StatusCode, fmt.Sprintf("%s: expected status code %d got %d", tc.desc, tc.status, res.StatusCode))
|
||||
svcCall.Unset()
|
||||
authCall.Unset()
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
req := testRequest{
|
||||
client: cs.Client(),
|
||||
method: http.MethodDelete,
|
||||
url: fmt.Sprintf("%s/%s/certs/%s", cs.URL, tc.domainID, tc.serialID),
|
||||
token: tc.token,
|
||||
}
|
||||
if tc.token == valid {
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: validID}
|
||||
}
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(tc.session, tc.authenticateErr)
|
||||
svcCall := svc.On("RevokeCert", mock.Anything, tc.domainID, tc.token, tc.serialID).Return(tc.svcRes, tc.svcErr)
|
||||
res, err := req.make()
|
||||
assert.Nil(t, err, fmt.Sprintf("%s: unexpected error %s", tc.desc, err))
|
||||
var errRes respBody
|
||||
err = json.NewDecoder(res.Body).Decode(&errRes)
|
||||
assert.Nil(t, err, fmt.Sprintf("%s: unexpected error while decoding response body: %s", tc.desc, err))
|
||||
if errRes.Err != "" || errRes.Message != "" {
|
||||
err = errors.Wrap(errors.New(errRes.Err), errors.New(errRes.Message))
|
||||
}
|
||||
assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n ", tc.desc, tc.err, err))
|
||||
assert.Equal(t, tc.status, res.StatusCode, fmt.Sprintf("%s: expected status code %d got %d", tc.desc, tc.status, res.StatusCode))
|
||||
svcCall.Unset()
|
||||
authCall.Unset()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -377,6 +431,7 @@ func TestListSerials(t *testing.T) {
|
||||
cases := []struct {
|
||||
desc string
|
||||
token string
|
||||
domainID string
|
||||
session mgauthn.Session
|
||||
thingID string
|
||||
revoked string
|
||||
@@ -390,14 +445,15 @@ func TestListSerials(t *testing.T) {
|
||||
err error
|
||||
}{
|
||||
{
|
||||
desc: "list certs successfully with default limit",
|
||||
token: valid,
|
||||
thingID: thingID,
|
||||
revoked: revoked,
|
||||
offset: 0,
|
||||
limit: 10,
|
||||
query: "",
|
||||
status: http.StatusOK,
|
||||
desc: "list certs successfully with default limit",
|
||||
domainID: valid,
|
||||
token: valid,
|
||||
thingID: thingID,
|
||||
revoked: revoked,
|
||||
offset: 0,
|
||||
limit: 10,
|
||||
query: "",
|
||||
status: http.StatusOK,
|
||||
svcRes: certs.CertPage{
|
||||
Total: 1,
|
||||
Offset: 0,
|
||||
@@ -408,14 +464,15 @@ func TestListSerials(t *testing.T) {
|
||||
err: nil,
|
||||
},
|
||||
{
|
||||
desc: "list certs successfully with default revoke",
|
||||
token: valid,
|
||||
thingID: thingID,
|
||||
revoked: revoked,
|
||||
offset: 0,
|
||||
limit: 10,
|
||||
query: "",
|
||||
status: http.StatusOK,
|
||||
desc: "list certs successfully with default revoke",
|
||||
domainID: valid,
|
||||
token: valid,
|
||||
thingID: thingID,
|
||||
revoked: revoked,
|
||||
offset: 0,
|
||||
limit: 10,
|
||||
query: "",
|
||||
status: http.StatusOK,
|
||||
svcRes: certs.CertPage{
|
||||
Total: 1,
|
||||
Offset: 0,
|
||||
@@ -426,14 +483,15 @@ func TestListSerials(t *testing.T) {
|
||||
err: nil,
|
||||
},
|
||||
{
|
||||
desc: "list certs successfully with all certs",
|
||||
token: valid,
|
||||
thingID: thingID,
|
||||
revoked: "all",
|
||||
offset: 0,
|
||||
limit: 10,
|
||||
query: "?revoked=all",
|
||||
status: http.StatusOK,
|
||||
desc: "list certs successfully with all certs",
|
||||
domainID: valid,
|
||||
token: valid,
|
||||
thingID: thingID,
|
||||
revoked: "all",
|
||||
offset: 0,
|
||||
limit: 10,
|
||||
query: "?revoked=all",
|
||||
status: http.StatusOK,
|
||||
svcRes: certs.CertPage{
|
||||
Total: 1,
|
||||
Offset: 0,
|
||||
@@ -444,14 +502,15 @@ func TestListSerials(t *testing.T) {
|
||||
err: nil,
|
||||
},
|
||||
{
|
||||
desc: "list certs successfully with limit",
|
||||
token: valid,
|
||||
thingID: thingID,
|
||||
revoked: revoked,
|
||||
offset: 0,
|
||||
limit: 5,
|
||||
query: "?limit=5",
|
||||
status: http.StatusOK,
|
||||
desc: "list certs successfully with limit",
|
||||
domainID: valid,
|
||||
token: valid,
|
||||
thingID: thingID,
|
||||
revoked: revoked,
|
||||
offset: 0,
|
||||
limit: 5,
|
||||
query: "?limit=5",
|
||||
status: http.StatusOK,
|
||||
svcRes: certs.CertPage{
|
||||
Total: 1,
|
||||
Offset: 0,
|
||||
@@ -462,14 +521,15 @@ func TestListSerials(t *testing.T) {
|
||||
err: nil,
|
||||
},
|
||||
{
|
||||
desc: "list certs successfully with offset",
|
||||
token: valid,
|
||||
thingID: thingID,
|
||||
revoked: revoked,
|
||||
offset: 1,
|
||||
limit: 10,
|
||||
query: "?offset=1",
|
||||
status: http.StatusOK,
|
||||
desc: "list certs successfully with offset",
|
||||
domainID: valid,
|
||||
token: valid,
|
||||
thingID: thingID,
|
||||
revoked: revoked,
|
||||
offset: 1,
|
||||
limit: 10,
|
||||
query: "?offset=1",
|
||||
status: http.StatusOK,
|
||||
svcRes: certs.CertPage{
|
||||
Total: 1,
|
||||
Offset: 1,
|
||||
@@ -480,14 +540,15 @@ func TestListSerials(t *testing.T) {
|
||||
err: nil,
|
||||
},
|
||||
{
|
||||
desc: "list certs successfully with offset and limit",
|
||||
token: valid,
|
||||
thingID: thingID,
|
||||
revoked: revoked,
|
||||
offset: 1,
|
||||
limit: 5,
|
||||
query: "?offset=1&limit=5",
|
||||
status: http.StatusOK,
|
||||
desc: "list certs successfully with offset and limit",
|
||||
domainID: valid,
|
||||
token: valid,
|
||||
thingID: thingID,
|
||||
revoked: revoked,
|
||||
offset: 1,
|
||||
limit: 5,
|
||||
query: "?offset=1&limit=5",
|
||||
status: http.StatusOK,
|
||||
svcRes: certs.CertPage{
|
||||
Total: 1,
|
||||
Offset: 1,
|
||||
@@ -499,6 +560,7 @@ func TestListSerials(t *testing.T) {
|
||||
},
|
||||
{
|
||||
desc: "list with invalid token",
|
||||
domainID: valid,
|
||||
token: invalid,
|
||||
thingID: thingID,
|
||||
revoked: revoked,
|
||||
@@ -511,89 +573,96 @@ func TestListSerials(t *testing.T) {
|
||||
err: svcerr.ErrAuthentication,
|
||||
},
|
||||
{
|
||||
desc: "list with empty token",
|
||||
token: "",
|
||||
thingID: thingID,
|
||||
revoked: revoked,
|
||||
offset: 0,
|
||||
limit: 10,
|
||||
query: "",
|
||||
status: http.StatusUnauthorized,
|
||||
svcRes: certs.CertPage{},
|
||||
svcErr: nil,
|
||||
err: apiutil.ErrBearerToken,
|
||||
desc: "list with empty token",
|
||||
domainID: valid,
|
||||
token: "",
|
||||
thingID: thingID,
|
||||
revoked: revoked,
|
||||
offset: 0,
|
||||
limit: 10,
|
||||
query: "",
|
||||
status: http.StatusUnauthorized,
|
||||
svcRes: certs.CertPage{},
|
||||
svcErr: nil,
|
||||
err: apiutil.ErrBearerToken,
|
||||
},
|
||||
{
|
||||
desc: "list with limit exceeding max limit",
|
||||
token: valid,
|
||||
thingID: thingID,
|
||||
revoked: revoked,
|
||||
query: "?limit=1000",
|
||||
status: http.StatusBadRequest,
|
||||
svcRes: certs.CertPage{},
|
||||
svcErr: nil,
|
||||
err: apiutil.ErrLimitSize,
|
||||
desc: "list with limit exceeding max limit",
|
||||
domainID: valid,
|
||||
token: valid,
|
||||
thingID: thingID,
|
||||
revoked: revoked,
|
||||
query: "?limit=1000",
|
||||
status: http.StatusBadRequest,
|
||||
svcRes: certs.CertPage{},
|
||||
svcErr: nil,
|
||||
err: apiutil.ErrLimitSize,
|
||||
},
|
||||
{
|
||||
desc: "list with invalid offset",
|
||||
token: valid,
|
||||
thingID: thingID,
|
||||
revoked: revoked,
|
||||
query: "?offset=invalid",
|
||||
status: http.StatusBadRequest,
|
||||
svcRes: certs.CertPage{},
|
||||
svcErr: nil,
|
||||
err: apiutil.ErrValidation,
|
||||
desc: "list with invalid offset",
|
||||
domainID: valid,
|
||||
token: valid,
|
||||
thingID: thingID,
|
||||
revoked: revoked,
|
||||
query: "?offset=invalid",
|
||||
status: http.StatusBadRequest,
|
||||
svcRes: certs.CertPage{},
|
||||
svcErr: nil,
|
||||
err: apiutil.ErrValidation,
|
||||
},
|
||||
{
|
||||
desc: "list with invalid limit",
|
||||
token: valid,
|
||||
thingID: thingID,
|
||||
revoked: revoked,
|
||||
query: "?limit=invalid",
|
||||
status: http.StatusBadRequest,
|
||||
svcRes: certs.CertPage{},
|
||||
svcErr: nil,
|
||||
err: apiutil.ErrValidation,
|
||||
desc: "list with invalid limit",
|
||||
domainID: valid,
|
||||
token: valid,
|
||||
thingID: thingID,
|
||||
revoked: revoked,
|
||||
query: "?limit=invalid",
|
||||
status: http.StatusBadRequest,
|
||||
svcRes: certs.CertPage{},
|
||||
svcErr: nil,
|
||||
err: apiutil.ErrValidation,
|
||||
},
|
||||
{
|
||||
desc: "list with invalid thing id",
|
||||
token: valid,
|
||||
thingID: invalid,
|
||||
revoked: revoked,
|
||||
offset: 0,
|
||||
limit: 10,
|
||||
query: "",
|
||||
status: http.StatusNotFound,
|
||||
svcRes: certs.CertPage{},
|
||||
svcErr: svcerr.ErrNotFound,
|
||||
err: svcerr.ErrNotFound,
|
||||
desc: "list with invalid thing id",
|
||||
domainID: valid,
|
||||
token: valid,
|
||||
thingID: invalid,
|
||||
revoked: revoked,
|
||||
offset: 0,
|
||||
limit: 10,
|
||||
query: "",
|
||||
status: http.StatusNotFound,
|
||||
svcRes: certs.CertPage{},
|
||||
svcErr: svcerr.ErrNotFound,
|
||||
err: svcerr.ErrNotFound,
|
||||
},
|
||||
}
|
||||
for _, tc := range cases {
|
||||
req := testRequest{
|
||||
client: cs.Client(),
|
||||
method: http.MethodGet,
|
||||
url: fmt.Sprintf("%s/serials/%s", cs.URL, tc.thingID) + tc.query,
|
||||
token: tc.token,
|
||||
}
|
||||
if tc.token == valid {
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: validID}
|
||||
}
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(tc.session, tc.authenticateErr)
|
||||
svcCall := svc.On("ListSerials", mock.Anything, tc.thingID, certs.PageMetadata{Revoked: tc.revoked, Offset: tc.offset, Limit: tc.limit}).Return(tc.svcRes, tc.svcErr)
|
||||
res, err := req.make()
|
||||
assert.Nil(t, err, fmt.Sprintf("%s: unexpected error %s", tc.desc, err))
|
||||
var errRes respBody
|
||||
err = json.NewDecoder(res.Body).Decode(&errRes)
|
||||
assert.Nil(t, err, fmt.Sprintf("%s: unexpected error while decoding response body: %s", tc.desc, err))
|
||||
if errRes.Err != "" || errRes.Message != "" {
|
||||
err = errors.Wrap(errors.New(errRes.Err), errors.New(errRes.Message))
|
||||
}
|
||||
assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n ", tc.desc, tc.err, err))
|
||||
assert.Equal(t, tc.status, res.StatusCode, fmt.Sprintf("%s: expected status code %d got %d", tc.desc, tc.status, res.StatusCode))
|
||||
svcCall.Unset()
|
||||
authCall.Unset()
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
req := testRequest{
|
||||
client: cs.Client(),
|
||||
method: http.MethodGet,
|
||||
url: fmt.Sprintf("%s/%s/serials/%s", cs.URL, tc.domainID, tc.thingID) + tc.query,
|
||||
token: tc.token,
|
||||
}
|
||||
if tc.token == valid {
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: validID}
|
||||
}
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(tc.session, tc.authenticateErr)
|
||||
svcCall := svc.On("ListSerials", mock.Anything, tc.thingID, certs.PageMetadata{Revoked: tc.revoked, Offset: tc.offset, Limit: tc.limit}).Return(tc.svcRes, tc.svcErr)
|
||||
res, err := req.make()
|
||||
assert.Nil(t, err, fmt.Sprintf("%s: unexpected error %s", tc.desc, err))
|
||||
var errRes respBody
|
||||
err = json.NewDecoder(res.Body).Decode(&errRes)
|
||||
assert.Nil(t, err, fmt.Sprintf("%s: unexpected error while decoding response body: %s", tc.desc, err))
|
||||
if errRes.Err != "" || errRes.Message != "" {
|
||||
err = errors.Wrap(errors.New(errRes.Err), errors.New(errRes.Message))
|
||||
}
|
||||
assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n ", tc.desc, tc.err, err))
|
||||
assert.Equal(t, tc.status, res.StatusCode, fmt.Sprintf("%s: expected status code %d got %d", tc.desc, tc.status, res.StatusCode))
|
||||
svcCall.Unset()
|
||||
authCall.Unset()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@ func LoggingMiddleware(svc certs.Service, logger *slog.Logger) certs.Service {
|
||||
|
||||
// IssueCert logs the issue_cert request. It logs the ttl, thing ID and the time it took to complete the request.
|
||||
// If the request fails, it logs the error.
|
||||
func (lm *loggingMiddleware) IssueCert(ctx context.Context, token, thingID, ttl string) (c certs.Cert, err error) {
|
||||
func (lm *loggingMiddleware) IssueCert(ctx context.Context, domainID, token, thingID, ttl string) (c certs.Cert, err error) {
|
||||
defer func(begin time.Time) {
|
||||
args := []any{
|
||||
slog.String("duration", time.Since(begin).String()),
|
||||
@@ -42,7 +42,7 @@ func (lm *loggingMiddleware) IssueCert(ctx context.Context, token, thingID, ttl
|
||||
lm.logger.Info("Issue certificate completed successfully", args...)
|
||||
}(time.Now())
|
||||
|
||||
return lm.svc.IssueCert(ctx, token, thingID, ttl)
|
||||
return lm.svc.IssueCert(ctx, domainID, token, thingID, ttl)
|
||||
}
|
||||
|
||||
// ListCerts logs the list_certs request. It logs the thing ID and the time it took to complete the request.
|
||||
@@ -114,7 +114,7 @@ func (lm *loggingMiddleware) ViewCert(ctx context.Context, serialID string) (c c
|
||||
|
||||
// RevokeCert logs the revoke_cert request. It logs the thing ID and the time it took to complete the request.
|
||||
// If the request fails, it logs the error.
|
||||
func (lm *loggingMiddleware) RevokeCert(ctx context.Context, token, thingID string) (c certs.Revoke, err error) {
|
||||
func (lm *loggingMiddleware) RevokeCert(ctx context.Context, domainID, token, thingID string) (c certs.Revoke, err error) {
|
||||
defer func(begin time.Time) {
|
||||
args := []any{
|
||||
slog.String("duration", time.Since(begin).String()),
|
||||
@@ -128,5 +128,5 @@ func (lm *loggingMiddleware) RevokeCert(ctx context.Context, token, thingID stri
|
||||
lm.logger.Info("Revoke certificate completed successfully", args...)
|
||||
}(time.Now())
|
||||
|
||||
return lm.svc.RevokeCert(ctx, token, thingID)
|
||||
return lm.svc.RevokeCert(ctx, domainID, token, thingID)
|
||||
}
|
||||
|
||||
@@ -31,13 +31,13 @@ func MetricsMiddleware(svc certs.Service, counter metrics.Counter, latency metri
|
||||
}
|
||||
|
||||
// IssueCert instruments IssueCert method with metrics.
|
||||
func (ms *metricsMiddleware) IssueCert(ctx context.Context, token, thingID, ttl string) (certs.Cert, error) {
|
||||
func (ms *metricsMiddleware) IssueCert(ctx context.Context, domainID, token, thingID, ttl string) (certs.Cert, error) {
|
||||
defer func(begin time.Time) {
|
||||
ms.counter.With("method", "issue_cert").Add(1)
|
||||
ms.latency.With("method", "issue_cert").Observe(time.Since(begin).Seconds())
|
||||
}(time.Now())
|
||||
|
||||
return ms.svc.IssueCert(ctx, token, thingID, ttl)
|
||||
return ms.svc.IssueCert(ctx, domainID, token, thingID, ttl)
|
||||
}
|
||||
|
||||
// ListCerts instruments ListCerts method with metrics.
|
||||
@@ -71,11 +71,11 @@ func (ms *metricsMiddleware) ViewCert(ctx context.Context, serialID string) (cer
|
||||
}
|
||||
|
||||
// RevokeCert instruments RevokeCert method with metrics.
|
||||
func (ms *metricsMiddleware) RevokeCert(ctx context.Context, token, thingID string) (certs.Revoke, error) {
|
||||
func (ms *metricsMiddleware) RevokeCert(ctx context.Context, domainID, token, thingID string) (certs.Revoke, error) {
|
||||
defer func(begin time.Time) {
|
||||
ms.counter.With("method", "revoke_cert").Add(1)
|
||||
ms.latency.With("method", "revoke_cert").Observe(time.Since(begin).Seconds())
|
||||
}(time.Now())
|
||||
|
||||
return ms.svc.RevokeCert(ctx, token, thingID)
|
||||
return ms.svc.RevokeCert(ctx, domainID, token, thingID)
|
||||
}
|
||||
|
||||
+16
-5
@@ -13,9 +13,10 @@ import (
|
||||
const maxLimitSize = 100
|
||||
|
||||
type addCertsReq struct {
|
||||
token string
|
||||
ThingID string `json:"thing_id"`
|
||||
TTL string `json:"ttl"`
|
||||
token string
|
||||
domainID string
|
||||
ThingID string `json:"thing_id"`
|
||||
TTL string `json:"ttl"`
|
||||
}
|
||||
|
||||
func (req addCertsReq) validate() error {
|
||||
@@ -23,6 +24,10 @@ func (req addCertsReq) validate() error {
|
||||
return apiutil.ErrBearerToken
|
||||
}
|
||||
|
||||
if req.domainID == "" {
|
||||
return apiutil.ErrMissingDomainID
|
||||
}
|
||||
|
||||
if req.ThingID == "" {
|
||||
return apiutil.ErrMissingID
|
||||
}
|
||||
@@ -47,6 +52,7 @@ func (req *listReq) validate() error {
|
||||
if req.pm.Limit > maxLimitSize {
|
||||
return apiutil.ErrLimitSize
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -63,8 +69,9 @@ func (req *viewReq) validate() error {
|
||||
}
|
||||
|
||||
type revokeReq struct {
|
||||
token string
|
||||
certID string
|
||||
token string
|
||||
certID string
|
||||
domainID string
|
||||
}
|
||||
|
||||
func (req *revokeReq) validate() error {
|
||||
@@ -72,6 +79,10 @@ func (req *revokeReq) validate() error {
|
||||
return apiutil.ErrBearerToken
|
||||
}
|
||||
|
||||
if req.domainID == "" {
|
||||
return apiutil.ErrMissingDomainID
|
||||
}
|
||||
|
||||
if req.certID == "" {
|
||||
return apiutil.ErrMissingID
|
||||
}
|
||||
|
||||
+32
-28
@@ -41,35 +41,35 @@ func MakeHandler(svc certs.Service, authn mgauthn.Authentication, logger *slog.L
|
||||
|
||||
r.Group(func(r chi.Router) {
|
||||
r.Use(api.AuthenticateMiddleware(authn))
|
||||
|
||||
r.Route("/certs", func(r chi.Router) {
|
||||
r.Post("/", otelhttp.NewHandler(kithttp.NewServer(
|
||||
issueCert(svc),
|
||||
decodeCerts,
|
||||
r.Route("/{domainID}", func(r chi.Router) {
|
||||
r.Route("/certs", func(r chi.Router) {
|
||||
r.Post("/", otelhttp.NewHandler(kithttp.NewServer(
|
||||
issueCert(svc),
|
||||
decodeCerts,
|
||||
api.EncodeResponse,
|
||||
opts...,
|
||||
), "issue").ServeHTTP)
|
||||
r.Get("/{certID}", otelhttp.NewHandler(kithttp.NewServer(
|
||||
viewCert(svc),
|
||||
decodeViewCert,
|
||||
api.EncodeResponse,
|
||||
opts...,
|
||||
), "view").ServeHTTP)
|
||||
r.Delete("/{certID}", otelhttp.NewHandler(kithttp.NewServer(
|
||||
revokeCert(svc),
|
||||
decodeRevokeCerts,
|
||||
api.EncodeResponse,
|
||||
opts...,
|
||||
), "revoke").ServeHTTP)
|
||||
})
|
||||
r.Get("/serials/{thingID}", otelhttp.NewHandler(kithttp.NewServer(
|
||||
listSerials(svc),
|
||||
decodeListCerts,
|
||||
api.EncodeResponse,
|
||||
opts...,
|
||||
), "issue").ServeHTTP)
|
||||
r.Get("/{certID}", otelhttp.NewHandler(kithttp.NewServer(
|
||||
viewCert(svc),
|
||||
decodeViewCert,
|
||||
api.EncodeResponse,
|
||||
opts...,
|
||||
), "view").ServeHTTP)
|
||||
r.Delete("/{certID}", otelhttp.NewHandler(kithttp.NewServer(
|
||||
revokeCert(svc),
|
||||
decodeRevokeCerts,
|
||||
api.EncodeResponse,
|
||||
opts...,
|
||||
), "revoke").ServeHTTP)
|
||||
), "list_serials").ServeHTTP)
|
||||
})
|
||||
r.Get("/serials/{thingID}", otelhttp.NewHandler(kithttp.NewServer(
|
||||
listSerials(svc),
|
||||
decodeListCerts,
|
||||
api.EncodeResponse,
|
||||
opts...,
|
||||
), "list_serials").ServeHTTP)
|
||||
})
|
||||
|
||||
r.Handle("/metrics", promhttp.Handler())
|
||||
r.Get("/health", magistrala.Health("certs", instanceID))
|
||||
|
||||
@@ -114,7 +114,10 @@ func decodeCerts(_ context.Context, r *http.Request) (interface{}, error) {
|
||||
return nil, errors.Wrap(apiutil.ErrValidation, apiutil.ErrUnsupportedContentType)
|
||||
}
|
||||
|
||||
req := addCertsReq{token: apiutil.ExtractBearerToken(r)}
|
||||
req := addCertsReq{
|
||||
token: apiutil.ExtractBearerToken(r),
|
||||
domainID: chi.URLParam(r, "domainID"),
|
||||
}
|
||||
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
|
||||
return nil, errors.Wrap(apiutil.ErrValidation, err)
|
||||
}
|
||||
@@ -124,8 +127,9 @@ func decodeCerts(_ context.Context, r *http.Request) (interface{}, error) {
|
||||
|
||||
func decodeRevokeCerts(_ context.Context, r *http.Request) (interface{}, error) {
|
||||
req := revokeReq{
|
||||
token: apiutil.ExtractBearerToken(r),
|
||||
certID: chi.URLParam(r, "certID"),
|
||||
token: apiutil.ExtractBearerToken(r),
|
||||
certID: chi.URLParam(r, "certID"),
|
||||
domainID: chi.URLParam(r, "domainID"),
|
||||
}
|
||||
|
||||
return req, nil
|
||||
|
||||
+18
-18
@@ -17,9 +17,9 @@ type Service struct {
|
||||
mock.Mock
|
||||
}
|
||||
|
||||
// IssueCert provides a mock function with given fields: ctx, token, thingID, ttl
|
||||
func (_m *Service) IssueCert(ctx context.Context, token string, thingID string, ttl string) (certs.Cert, error) {
|
||||
ret := _m.Called(ctx, token, thingID, ttl)
|
||||
// IssueCert provides a mock function with given fields: ctx, domainID, token, thingID, ttl
|
||||
func (_m *Service) IssueCert(ctx context.Context, domainID string, token string, thingID string, ttl string) (certs.Cert, error) {
|
||||
ret := _m.Called(ctx, domainID, token, thingID, ttl)
|
||||
|
||||
if len(ret) == 0 {
|
||||
panic("no return value specified for IssueCert")
|
||||
@@ -27,17 +27,17 @@ func (_m *Service) IssueCert(ctx context.Context, token string, thingID string,
|
||||
|
||||
var r0 certs.Cert
|
||||
var r1 error
|
||||
if rf, ok := ret.Get(0).(func(context.Context, string, string, string) (certs.Cert, error)); ok {
|
||||
return rf(ctx, token, thingID, ttl)
|
||||
if rf, ok := ret.Get(0).(func(context.Context, string, string, string, string) (certs.Cert, error)); ok {
|
||||
return rf(ctx, domainID, token, thingID, ttl)
|
||||
}
|
||||
if rf, ok := ret.Get(0).(func(context.Context, string, string, string) certs.Cert); ok {
|
||||
r0 = rf(ctx, token, thingID, ttl)
|
||||
if rf, ok := ret.Get(0).(func(context.Context, string, string, string, string) certs.Cert); ok {
|
||||
r0 = rf(ctx, domainID, token, thingID, ttl)
|
||||
} else {
|
||||
r0 = ret.Get(0).(certs.Cert)
|
||||
}
|
||||
|
||||
if rf, ok := ret.Get(1).(func(context.Context, string, string, string) error); ok {
|
||||
r1 = rf(ctx, token, thingID, ttl)
|
||||
if rf, ok := ret.Get(1).(func(context.Context, string, string, string, string) error); ok {
|
||||
r1 = rf(ctx, domainID, token, thingID, ttl)
|
||||
} else {
|
||||
r1 = ret.Error(1)
|
||||
}
|
||||
@@ -101,9 +101,9 @@ func (_m *Service) ListSerials(ctx context.Context, thingID string, pm certs.Pag
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// RevokeCert provides a mock function with given fields: ctx, token, thingID
|
||||
func (_m *Service) RevokeCert(ctx context.Context, token string, thingID string) (certs.Revoke, error) {
|
||||
ret := _m.Called(ctx, token, thingID)
|
||||
// RevokeCert provides a mock function with given fields: ctx, domainID, token, thingID
|
||||
func (_m *Service) RevokeCert(ctx context.Context, domainID string, token string, thingID string) (certs.Revoke, error) {
|
||||
ret := _m.Called(ctx, domainID, token, thingID)
|
||||
|
||||
if len(ret) == 0 {
|
||||
panic("no return value specified for RevokeCert")
|
||||
@@ -111,17 +111,17 @@ func (_m *Service) RevokeCert(ctx context.Context, token string, thingID string)
|
||||
|
||||
var r0 certs.Revoke
|
||||
var r1 error
|
||||
if rf, ok := ret.Get(0).(func(context.Context, string, string) (certs.Revoke, error)); ok {
|
||||
return rf(ctx, token, thingID)
|
||||
if rf, ok := ret.Get(0).(func(context.Context, string, string, string) (certs.Revoke, error)); ok {
|
||||
return rf(ctx, domainID, token, thingID)
|
||||
}
|
||||
if rf, ok := ret.Get(0).(func(context.Context, string, string) certs.Revoke); ok {
|
||||
r0 = rf(ctx, token, thingID)
|
||||
if rf, ok := ret.Get(0).(func(context.Context, string, string, string) certs.Revoke); ok {
|
||||
r0 = rf(ctx, domainID, token, thingID)
|
||||
} else {
|
||||
r0 = ret.Get(0).(certs.Revoke)
|
||||
}
|
||||
|
||||
if rf, ok := ret.Get(1).(func(context.Context, string, string) error); ok {
|
||||
r1 = rf(ctx, token, thingID)
|
||||
if rf, ok := ret.Get(1).(func(context.Context, string, string, string) error); ok {
|
||||
r1 = rf(ctx, domainID, token, thingID)
|
||||
} else {
|
||||
r1 = ret.Error(1)
|
||||
}
|
||||
|
||||
+6
-6
@@ -34,7 +34,7 @@ var _ Service = (*certsService)(nil)
|
||||
//go:generate mockery --name Service --output=./mocks --filename service.go --quiet --note "Copyright (c) Abstract Machines"
|
||||
type Service interface {
|
||||
// IssueCert issues certificate for given thing id if access is granted with token
|
||||
IssueCert(ctx context.Context, token, thingID, ttl string) (Cert, error)
|
||||
IssueCert(ctx context.Context, domainID, token, thingID, ttl string) (Cert, error)
|
||||
|
||||
// ListCerts lists certificates issued for a given thing ID
|
||||
ListCerts(ctx context.Context, thingID string, pm PageMetadata) (CertPage, error)
|
||||
@@ -46,7 +46,7 @@ type Service interface {
|
||||
ViewCert(ctx context.Context, serialID string) (Cert, error)
|
||||
|
||||
// RevokeCert revokes a certificate for a given thing ID
|
||||
RevokeCert(ctx context.Context, token, thingID string) (Revoke, error)
|
||||
RevokeCert(ctx context.Context, domainID, token, thingID string) (Revoke, error)
|
||||
}
|
||||
|
||||
type certsService struct {
|
||||
@@ -67,10 +67,10 @@ type Revoke struct {
|
||||
RevocationTime time.Time `mapstructure:"revocation_time"`
|
||||
}
|
||||
|
||||
func (cs *certsService) IssueCert(ctx context.Context, token, thingID, ttl string) (Cert, error) {
|
||||
func (cs *certsService) IssueCert(ctx context.Context, domainID, token, thingID, ttl string) (Cert, error) {
|
||||
var err error
|
||||
|
||||
thing, err := cs.sdk.Thing(thingID, token)
|
||||
thing, err := cs.sdk.Thing(thingID, domainID, token)
|
||||
if err != nil {
|
||||
return Cert{}, errors.Wrap(ErrFailedCertCreation, err)
|
||||
}
|
||||
@@ -90,11 +90,11 @@ func (cs *certsService) IssueCert(ctx context.Context, token, thingID, ttl strin
|
||||
}, err
|
||||
}
|
||||
|
||||
func (cs *certsService) RevokeCert(ctx context.Context, token, thingID string) (Revoke, error) {
|
||||
func (cs *certsService) RevokeCert(ctx context.Context, domainID, token, thingID string) (Revoke, error) {
|
||||
var revoke Revoke
|
||||
var err error
|
||||
|
||||
thing, err := cs.sdk.Thing(thingID, token)
|
||||
thing, err := cs.sdk.Thing(thingID, domainID, token)
|
||||
if err != nil {
|
||||
return revoke, errors.Wrap(ErrFailedCertRevocation, err)
|
||||
}
|
||||
|
||||
+31
-20
@@ -23,6 +23,7 @@ import (
|
||||
const (
|
||||
invalid = "invalid"
|
||||
email = "user@example.com"
|
||||
domain = "domain"
|
||||
token = "token"
|
||||
thingsNum = 1
|
||||
thingKey = "thingKey"
|
||||
@@ -49,6 +50,7 @@ var cert = mgcrt.Cert{
|
||||
func TestIssueCert(t *testing.T) {
|
||||
svc, agent, sdk := newService(t)
|
||||
cases := []struct {
|
||||
domainID string
|
||||
token string
|
||||
desc string
|
||||
thingID string
|
||||
@@ -61,15 +63,17 @@ func TestIssueCert(t *testing.T) {
|
||||
err error
|
||||
}{
|
||||
{
|
||||
desc: "issue new cert",
|
||||
token: token,
|
||||
thingID: thingID,
|
||||
ttl: ttl,
|
||||
ipAddr: []string{},
|
||||
cert: cert,
|
||||
desc: "issue new cert",
|
||||
domainID: domain,
|
||||
token: token,
|
||||
thingID: thingID,
|
||||
ttl: ttl,
|
||||
ipAddr: []string{},
|
||||
cert: cert,
|
||||
},
|
||||
{
|
||||
desc: "issue new for failed pki",
|
||||
domainID: domain,
|
||||
token: token,
|
||||
thingID: thingID,
|
||||
ttl: ttl,
|
||||
@@ -80,6 +84,7 @@ func TestIssueCert(t *testing.T) {
|
||||
},
|
||||
{
|
||||
desc: "issue new cert for non existing thing id",
|
||||
domainID: domain,
|
||||
token: token,
|
||||
thingID: "2",
|
||||
ttl: ttl,
|
||||
@@ -89,6 +94,7 @@ func TestIssueCert(t *testing.T) {
|
||||
},
|
||||
{
|
||||
desc: "issue new cert for invalid token",
|
||||
domainID: domain,
|
||||
token: invalid,
|
||||
thingID: thingID,
|
||||
ttl: ttl,
|
||||
@@ -100,9 +106,9 @@ func TestIssueCert(t *testing.T) {
|
||||
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
sdkCall := sdk.On("Thing", tc.thingID, tc.token).Return(mgsdk.Thing{ID: tc.thingID, Credentials: mgsdk.Credentials{Secret: thingKey}}, tc.thingErr)
|
||||
sdkCall := sdk.On("Thing", tc.thingID, tc.domainID, tc.token).Return(mgsdk.Thing{ID: tc.thingID, Credentials: mgsdk.Credentials{Secret: thingKey}}, tc.thingErr)
|
||||
agentCall := agent.On("Issue", thingID, tc.ttl, tc.ipAddr).Return(tc.cert, tc.issueCertErr)
|
||||
resp, err := svc.IssueCert(context.Background(), tc.token, tc.thingID, tc.ttl)
|
||||
resp, err := svc.IssueCert(context.Background(), tc.domainID, tc.token, tc.thingID, tc.ttl)
|
||||
assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err))
|
||||
assert.Equal(t, tc.cert.SerialNumber, resp.SerialNumber, fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.cert.SerialNumber, resp.SerialNumber))
|
||||
sdkCall.Unset()
|
||||
@@ -114,6 +120,7 @@ func TestIssueCert(t *testing.T) {
|
||||
func TestRevokeCert(t *testing.T) {
|
||||
svc, agent, sdk := newService(t)
|
||||
cases := []struct {
|
||||
domainID string
|
||||
token string
|
||||
desc string
|
||||
thingID string
|
||||
@@ -125,13 +132,15 @@ func TestRevokeCert(t *testing.T) {
|
||||
err error
|
||||
}{
|
||||
{
|
||||
desc: "revoke cert",
|
||||
token: token,
|
||||
thingID: thingID,
|
||||
page: mgcrt.CertPage{Limit: 10000, Offset: 0, Total: 1, Certificates: []mgcrt.Cert{cert}},
|
||||
desc: "revoke cert",
|
||||
domainID: domain,
|
||||
token: token,
|
||||
thingID: thingID,
|
||||
page: mgcrt.CertPage{Limit: 10000, Offset: 0, Total: 1, Certificates: []mgcrt.Cert{cert}},
|
||||
},
|
||||
{
|
||||
desc: "revoke cert for failed pki revoke",
|
||||
domainID: domain,
|
||||
token: token,
|
||||
thingID: thingID,
|
||||
page: mgcrt.CertPage{Limit: 10000, Offset: 0, Total: 1, Certificates: []mgcrt.Cert{cert}},
|
||||
@@ -140,6 +149,7 @@ func TestRevokeCert(t *testing.T) {
|
||||
},
|
||||
{
|
||||
desc: "revoke cert for invalid thing id",
|
||||
domainID: domain,
|
||||
token: token,
|
||||
thingID: "2",
|
||||
page: mgcrt.CertPage{},
|
||||
@@ -147,21 +157,22 @@ func TestRevokeCert(t *testing.T) {
|
||||
err: certs.ErrFailedCertRevocation,
|
||||
},
|
||||
{
|
||||
desc: "revoke cert with failed to list certs",
|
||||
token: token,
|
||||
thingID: thingID,
|
||||
page: mgcrt.CertPage{},
|
||||
listErr: certs.ErrFailedCertRevocation,
|
||||
err: certs.ErrFailedCertRevocation,
|
||||
desc: "revoke cert with failed to list certs",
|
||||
domainID: domain,
|
||||
token: token,
|
||||
thingID: thingID,
|
||||
page: mgcrt.CertPage{},
|
||||
listErr: certs.ErrFailedCertRevocation,
|
||||
err: certs.ErrFailedCertRevocation,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
sdkCall := sdk.On("Thing", tc.thingID, tc.token).Return(mgsdk.Thing{ID: tc.thingID, Credentials: mgsdk.Credentials{Secret: thingKey}}, tc.thingErr)
|
||||
sdkCall := sdk.On("Thing", tc.thingID, tc.domainID, tc.token).Return(mgsdk.Thing{ID: tc.thingID, Credentials: mgsdk.Credentials{Secret: thingKey}}, tc.thingErr)
|
||||
agentCall := agent.On("Revoke", mock.Anything).Return(tc.revokeErr)
|
||||
agentCall1 := agent.On("ListCerts", mock.Anything).Return(tc.page, tc.listErr)
|
||||
_, err := svc.RevokeCert(context.Background(), tc.token, tc.thingID)
|
||||
_, err := svc.RevokeCert(context.Background(), tc.domainID, tc.token, tc.thingID)
|
||||
assert.True(t, errors.Contains(err, tc.err), fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err))
|
||||
sdkCall.Unset()
|
||||
agentCall.Unset()
|
||||
|
||||
@@ -24,14 +24,14 @@ func New(svc certs.Service, tracer trace.Tracer) certs.Service {
|
||||
}
|
||||
|
||||
// IssueCert traces the "IssueCert" operation of the wrapped certs.Service.
|
||||
func (tm *tracingMiddleware) IssueCert(ctx context.Context, token, thingID, ttl string) (certs.Cert, error) {
|
||||
func (tm *tracingMiddleware) IssueCert(ctx context.Context, domainID, token, thingID, ttl string) (certs.Cert, error) {
|
||||
ctx, span := tm.tracer.Start(ctx, "svc_create_group", trace.WithAttributes(
|
||||
attribute.String("thing_id", thingID),
|
||||
attribute.String("ttl", ttl),
|
||||
))
|
||||
defer span.End()
|
||||
|
||||
return tm.svc.IssueCert(ctx, token, thingID, ttl)
|
||||
return tm.svc.IssueCert(ctx, domainID, token, thingID, ttl)
|
||||
}
|
||||
|
||||
// ListCerts traces the "ListCerts" operation of the wrapped certs.Service.
|
||||
@@ -69,11 +69,11 @@ func (tm *tracingMiddleware) ViewCert(ctx context.Context, serialID string) (cer
|
||||
}
|
||||
|
||||
// RevokeCert traces the "RevokeCert" operation of the wrapped certs.Service.
|
||||
func (tm *tracingMiddleware) RevokeCert(ctx context.Context, token, serialID string) (certs.Revoke, error) {
|
||||
func (tm *tracingMiddleware) RevokeCert(ctx context.Context, domainID, token, serialID string) (certs.Revoke, error) {
|
||||
ctx, span := tm.tracer.Start(ctx, "svc_revoke_cert", trace.WithAttributes(
|
||||
attribute.String("serial_id", serialID),
|
||||
))
|
||||
defer span.End()
|
||||
|
||||
return tm.svc.RevokeCert(ctx, token, serialID)
|
||||
return tm.svc.RevokeCert(ctx, domainID, token, serialID)
|
||||
}
|
||||
|
||||
+23
-22
@@ -12,11 +12,11 @@ import (
|
||||
|
||||
var cmdBootstrap = []cobra.Command{
|
||||
{
|
||||
Use: "create <JSON_config> <user_auth_token>",
|
||||
Use: "create <JSON_config> <domain_id> <user_auth_token>",
|
||||
Short: "Create config",
|
||||
Long: `Create new Thing Bootstrap Config to the user identified by the provided key`,
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 2 {
|
||||
if len(args) != 3 {
|
||||
logUsageCmd(*cmd, cmd.Use)
|
||||
return
|
||||
}
|
||||
@@ -27,7 +27,7 @@ var cmdBootstrap = []cobra.Command{
|
||||
return
|
||||
}
|
||||
|
||||
id, err := sdk.AddBootstrap(cfg, args[1])
|
||||
id, err := sdk.AddBootstrap(cfg, args[1], args[2])
|
||||
if err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
@@ -37,24 +37,25 @@ var cmdBootstrap = []cobra.Command{
|
||||
},
|
||||
},
|
||||
{
|
||||
Use: "get [all | <thing_id>] <user_auth_token>",
|
||||
Use: "get [all | <thing_id>] <domain_id> <user_auth_token>",
|
||||
Short: "Get config",
|
||||
Long: `Get Thing Config with given ID belonging to the user identified by the given key.
|
||||
all - lists all config
|
||||
<thing_id> - view config of <thing_id>`,
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 2 {
|
||||
if len(args) != 3 {
|
||||
logUsageCmd(*cmd, cmd.Use)
|
||||
return
|
||||
}
|
||||
pageMetadata := mgxsdk.PageMetadata{
|
||||
Offset: Offset,
|
||||
Limit: Limit,
|
||||
State: State,
|
||||
Name: Name,
|
||||
Offset: Offset,
|
||||
Limit: Limit,
|
||||
State: State,
|
||||
Name: Name,
|
||||
DomainID: args[1],
|
||||
}
|
||||
if args[0] == "all" {
|
||||
l, err := sdk.Bootstraps(pageMetadata, args[1])
|
||||
l, err := sdk.Bootstraps(pageMetadata, args[2])
|
||||
if err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
@@ -63,7 +64,7 @@ var cmdBootstrap = []cobra.Command{
|
||||
return
|
||||
}
|
||||
|
||||
c, err := sdk.ViewBootstrap(args[0], args[1])
|
||||
c, err := sdk.ViewBootstrap(args[0], args[1], args[2])
|
||||
if err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
@@ -73,7 +74,7 @@ var cmdBootstrap = []cobra.Command{
|
||||
},
|
||||
},
|
||||
{
|
||||
Use: "update [config <JSON_config> | connection <id> <channel_ids> | certs <id> <client_cert> <client_key> <ca> ] <user_auth_token>",
|
||||
Use: "update [config <JSON_config> | connection <id> <channel_ids> | certs <id> <client_cert> <client_key> <ca> ] <domain_id> <user_auth_token>",
|
||||
Short: "Update config",
|
||||
Long: `Updates editable fields of the provided Config.
|
||||
config <JSON_config> - Updates editable fields of the provided Config.
|
||||
@@ -81,7 +82,7 @@ var cmdBootstrap = []cobra.Command{
|
||||
channel_ids - '["channel_id1", ...]'
|
||||
certs <id> <client_cert> <client_key> <ca> - Update bootstrap config certificates.`,
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) < 3 {
|
||||
if len(args) < 4 {
|
||||
logUsageCmd(*cmd, cmd.Use)
|
||||
return
|
||||
}
|
||||
@@ -92,7 +93,7 @@ var cmdBootstrap = []cobra.Command{
|
||||
return
|
||||
}
|
||||
|
||||
if err := sdk.UpdateBootstrap(cfg, args[1]); err != nil {
|
||||
if err := sdk.UpdateBootstrap(cfg, args[1], args[2]); err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
}
|
||||
@@ -106,7 +107,7 @@ var cmdBootstrap = []cobra.Command{
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
}
|
||||
if err := sdk.UpdateBootstrapConnection(args[1], ids, args[3]); err != nil {
|
||||
if err := sdk.UpdateBootstrapConnection(args[1], ids, args[3], args[4]); err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
}
|
||||
@@ -115,7 +116,7 @@ var cmdBootstrap = []cobra.Command{
|
||||
return
|
||||
}
|
||||
if args[0] == "certs" {
|
||||
cfg, err := sdk.UpdateBootstrapCerts(args[0], args[1], args[2], args[3], args[4])
|
||||
cfg, err := sdk.UpdateBootstrapCerts(args[0], args[1], args[2], args[3], args[4], args[5])
|
||||
if err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
@@ -128,16 +129,16 @@ var cmdBootstrap = []cobra.Command{
|
||||
},
|
||||
},
|
||||
{
|
||||
Use: "remove <thing_id> <user_auth_token>",
|
||||
Use: "remove <thing_id> <domain_id> <user_auth_token>",
|
||||
Short: "Remove config",
|
||||
Long: `Removes Config with specified key that belongs to the user identified by the given key`,
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 2 {
|
||||
if len(args) != 3 {
|
||||
logUsageCmd(*cmd, cmd.Use)
|
||||
return
|
||||
}
|
||||
|
||||
if err := sdk.RemoveBootstrap(args[0], args[1]); err != nil {
|
||||
if err := sdk.RemoveBootstrap(args[0], args[1], args[2]); err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
}
|
||||
@@ -175,11 +176,11 @@ var cmdBootstrap = []cobra.Command{
|
||||
},
|
||||
},
|
||||
{
|
||||
Use: "whitelist <JSON_config> <user_auth_token>",
|
||||
Use: "whitelist <JSON_config> <domain_id> <user_auth_token>",
|
||||
Short: "Whitelist config",
|
||||
Long: `Whitelist updates thing state config with given id from the authenticated user`,
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 2 {
|
||||
if len(args) != 3 {
|
||||
logUsageCmd(*cmd, cmd.Use)
|
||||
return
|
||||
}
|
||||
@@ -190,7 +191,7 @@ var cmdBootstrap = []cobra.Command{
|
||||
return
|
||||
}
|
||||
|
||||
if err := sdk.Whitelist(cfg.ThingID, cfg.State, args[1]); err != nil {
|
||||
if err := sdk.Whitelist(cfg.ThingID, cfg.State, args[1], args[2]); err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
}
|
||||
|
||||
+34
-8
@@ -48,6 +48,7 @@ func TestCreateBootstrapConfigCmd(t *testing.T) {
|
||||
desc: "create bootstrap config successfully",
|
||||
args: []string{
|
||||
jsonConfig,
|
||||
domainID,
|
||||
validToken,
|
||||
},
|
||||
logType: createLog,
|
||||
@@ -58,6 +59,7 @@ func TestCreateBootstrapConfigCmd(t *testing.T) {
|
||||
desc: "create bootstrap config with invald args",
|
||||
args: []string{
|
||||
jsonConfig,
|
||||
domainID,
|
||||
validToken,
|
||||
extraArg,
|
||||
},
|
||||
@@ -67,6 +69,7 @@ func TestCreateBootstrapConfigCmd(t *testing.T) {
|
||||
desc: "create bootstrap config with invald json",
|
||||
args: []string{
|
||||
invalidJson,
|
||||
domainID,
|
||||
validToken,
|
||||
},
|
||||
sdkErr: errors.NewSDKError(errors.New("unexpected end of JSON input")),
|
||||
@@ -77,6 +80,7 @@ func TestCreateBootstrapConfigCmd(t *testing.T) {
|
||||
desc: "create bootstrap config with invald token",
|
||||
args: []string{
|
||||
jsonConfig,
|
||||
domainID,
|
||||
invalidToken,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusUnauthorized),
|
||||
@@ -87,7 +91,7 @@ func TestCreateBootstrapConfigCmd(t *testing.T) {
|
||||
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
sdkCall := sdkMock.On("AddBootstrap", mock.Anything, mock.Anything).Return(tc.id, tc.sdkErr)
|
||||
sdkCall := sdkMock.On("AddBootstrap", mock.Anything, mock.Anything, mock.Anything).Return(tc.id, tc.sdkErr)
|
||||
out := executeCommand(t, rootCmd, append([]string{createCmd}, tc.args...)...)
|
||||
|
||||
switch tc.logType {
|
||||
@@ -125,6 +129,7 @@ func TestGetBootstrapConfigCmd(t *testing.T) {
|
||||
desc: "get all bootstrap config successfully",
|
||||
args: []string{
|
||||
all,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
page: mgsdk.BootstrapPage{
|
||||
@@ -141,6 +146,7 @@ func TestGetBootstrapConfigCmd(t *testing.T) {
|
||||
desc: "get bootstrap config with id",
|
||||
args: []string{
|
||||
channel.ID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
logType: entityLog,
|
||||
@@ -150,6 +156,7 @@ func TestGetBootstrapConfigCmd(t *testing.T) {
|
||||
desc: "get bootstrap config with invalid args",
|
||||
args: []string{
|
||||
all,
|
||||
domainID,
|
||||
token,
|
||||
extraArg,
|
||||
},
|
||||
@@ -159,6 +166,7 @@ func TestGetBootstrapConfigCmd(t *testing.T) {
|
||||
desc: "get all bootstrap config with invalid token",
|
||||
args: []string{
|
||||
all,
|
||||
domainID,
|
||||
invalidToken,
|
||||
},
|
||||
logType: errLog,
|
||||
@@ -169,6 +177,7 @@ func TestGetBootstrapConfigCmd(t *testing.T) {
|
||||
desc: "get bootstrap config with invalid id",
|
||||
args: []string{
|
||||
invalidID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden),
|
||||
@@ -179,8 +188,8 @@ func TestGetBootstrapConfigCmd(t *testing.T) {
|
||||
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
sdkCall := sdkMock.On("ViewBootstrap", tc.args[0], tc.args[1]).Return(tc.boot, tc.sdkErr)
|
||||
sdkCall1 := sdkMock.On("Bootstraps", mock.Anything, tc.args[1]).Return(tc.page, tc.sdkErr)
|
||||
sdkCall := sdkMock.On("ViewBootstrap", tc.args[0], tc.args[1], tc.args[2]).Return(tc.boot, tc.sdkErr)
|
||||
sdkCall1 := sdkMock.On("Bootstraps", mock.Anything, tc.args[2]).Return(tc.page, tc.sdkErr)
|
||||
|
||||
out := executeCommand(t, rootCmd, append([]string{getCmd}, tc.args...)...)
|
||||
|
||||
@@ -223,6 +232,7 @@ func TestRemoveBootstrapConfigCmd(t *testing.T) {
|
||||
desc: "remove bootstrap config successfully",
|
||||
args: []string{
|
||||
thing.ID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
logType: okLog,
|
||||
@@ -231,6 +241,7 @@ func TestRemoveBootstrapConfigCmd(t *testing.T) {
|
||||
desc: "remove bootstrap config with invalid args",
|
||||
args: []string{
|
||||
thing.ID,
|
||||
domainID,
|
||||
token,
|
||||
extraArg,
|
||||
},
|
||||
@@ -240,6 +251,7 @@ func TestRemoveBootstrapConfigCmd(t *testing.T) {
|
||||
desc: "remove bootstrap config with invalid thing id",
|
||||
args: []string{
|
||||
invalidID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden),
|
||||
@@ -250,6 +262,7 @@ func TestRemoveBootstrapConfigCmd(t *testing.T) {
|
||||
desc: "remove bootstrap config with invalid token",
|
||||
args: []string{
|
||||
thing.ID,
|
||||
domainID,
|
||||
invalidToken,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden),
|
||||
@@ -260,7 +273,7 @@ func TestRemoveBootstrapConfigCmd(t *testing.T) {
|
||||
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
sdkCall := sdkMock.On("RemoveBootstrap", tc.args[0], tc.args[1]).Return(tc.sdkErr)
|
||||
sdkCall := sdkMock.On("RemoveBootstrap", tc.args[0], tc.args[1], tc.args[2]).Return(tc.sdkErr)
|
||||
out := executeCommand(t, rootCmd, append([]string{rmCmd}, tc.args...)...)
|
||||
|
||||
switch tc.logType {
|
||||
@@ -300,6 +313,7 @@ func TestUpdateBootstrapConfigCmd(t *testing.T) {
|
||||
args: []string{
|
||||
config,
|
||||
newConfigJson,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
logType: okLog,
|
||||
@@ -309,6 +323,7 @@ func TestUpdateBootstrapConfigCmd(t *testing.T) {
|
||||
args: []string{
|
||||
config,
|
||||
newConfigJson,
|
||||
domainID,
|
||||
invalidToken,
|
||||
},
|
||||
logType: errLog,
|
||||
@@ -321,6 +336,7 @@ func TestUpdateBootstrapConfigCmd(t *testing.T) {
|
||||
connection,
|
||||
thing.ID,
|
||||
chanIDsJson,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
logType: okLog,
|
||||
@@ -331,6 +347,7 @@ func TestUpdateBootstrapConfigCmd(t *testing.T) {
|
||||
connection,
|
||||
thing.ID,
|
||||
fmt.Sprintf("[\"%s\"", thing.ID),
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKError(errors.New("unexpected end of JSON input")),
|
||||
@@ -343,6 +360,7 @@ func TestUpdateBootstrapConfigCmd(t *testing.T) {
|
||||
connection,
|
||||
thing.ID,
|
||||
chanIDsJson,
|
||||
domainID,
|
||||
invalidToken,
|
||||
},
|
||||
logType: errLog,
|
||||
@@ -357,6 +375,7 @@ func TestUpdateBootstrapConfigCmd(t *testing.T) {
|
||||
"client cert",
|
||||
"client key",
|
||||
"ca",
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
boot: bootConfig,
|
||||
@@ -370,6 +389,7 @@ func TestUpdateBootstrapConfigCmd(t *testing.T) {
|
||||
"client cert",
|
||||
"client key",
|
||||
"ca",
|
||||
domainID,
|
||||
invalidToken,
|
||||
},
|
||||
logType: errLog,
|
||||
@@ -380,6 +400,7 @@ func TestUpdateBootstrapConfigCmd(t *testing.T) {
|
||||
desc: "update bootstrap config with invalid args",
|
||||
args: []string{
|
||||
newConfigJson,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
logType: usageLog,
|
||||
@@ -389,6 +410,7 @@ func TestUpdateBootstrapConfigCmd(t *testing.T) {
|
||||
args: []string{
|
||||
config,
|
||||
"{\"name\" : \"New Bootstrap\"",
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKError(errors.New("unexpected end of JSON input")),
|
||||
@@ -410,9 +432,9 @@ func TestUpdateBootstrapConfigCmd(t *testing.T) {
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
var boot mgsdk.BootstrapConfig
|
||||
sdkCall := sdkMock.On("UpdateBootstrap", mock.Anything, mock.Anything).Return(tc.sdkErr)
|
||||
sdkCall1 := sdkMock.On("UpdateBootstrapConnection", mock.Anything, mock.Anything, mock.Anything).Return(tc.sdkErr)
|
||||
sdkCall2 := sdkMock.On("UpdateBootstrapCerts", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(tc.boot, tc.sdkErr)
|
||||
sdkCall := sdkMock.On("UpdateBootstrap", mock.Anything, mock.Anything, mock.Anything).Return(tc.sdkErr)
|
||||
sdkCall1 := sdkMock.On("UpdateBootstrapConnection", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(tc.sdkErr)
|
||||
sdkCall2 := sdkMock.On("UpdateBootstrapCerts", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(tc.boot, tc.sdkErr)
|
||||
out := executeCommand(t, rootCmd, append([]string{updCmd}, tc.args...)...)
|
||||
|
||||
switch tc.logType {
|
||||
@@ -453,6 +475,7 @@ func TestWhitelistConfigCmd(t *testing.T) {
|
||||
desc: "whitelist config successfully",
|
||||
args: []string{
|
||||
jsonConfig,
|
||||
domainID,
|
||||
validToken,
|
||||
},
|
||||
logType: okLog,
|
||||
@@ -461,6 +484,7 @@ func TestWhitelistConfigCmd(t *testing.T) {
|
||||
desc: "whitelist config with invalid args",
|
||||
args: []string{
|
||||
jsonConfig,
|
||||
domainID,
|
||||
validToken,
|
||||
extraArg,
|
||||
},
|
||||
@@ -470,6 +494,7 @@ func TestWhitelistConfigCmd(t *testing.T) {
|
||||
desc: "whitelist config with invalid json",
|
||||
args: []string{
|
||||
fmt.Sprintf("{\"thing_id\": \"%s\", \"state\":%d", thing.ID, 1),
|
||||
domainID,
|
||||
validToken,
|
||||
},
|
||||
sdkErr: errors.NewSDKError(errors.New("unexpected end of JSON input")),
|
||||
@@ -480,6 +505,7 @@ func TestWhitelistConfigCmd(t *testing.T) {
|
||||
desc: "whitelist config with invalid token",
|
||||
args: []string{
|
||||
jsonConfig,
|
||||
domainID,
|
||||
invalidToken,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusUnauthorized),
|
||||
@@ -490,7 +516,7 @@ func TestWhitelistConfigCmd(t *testing.T) {
|
||||
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
sdkCall := sdkMock.On("Whitelist", mock.Anything, mock.Anything, tc.args[1]).Return(tc.sdkErr)
|
||||
sdkCall := sdkMock.On("Whitelist", mock.Anything, mock.Anything, tc.args[1], tc.args[2]).Return(tc.sdkErr)
|
||||
out := executeCommand(t, rootCmd, append([]string{whitelistCmd}, tc.args...)...)
|
||||
switch tc.logType {
|
||||
case okLog:
|
||||
|
||||
+10
-10
@@ -9,16 +9,16 @@ import (
|
||||
|
||||
var cmdCerts = []cobra.Command{
|
||||
{
|
||||
Use: "get [<cert_serial> | thing <thing_id> ] <user_auth_token>",
|
||||
Use: "get [<cert_serial> | thing <thing_id> ] <domain_id> <user_auth_token>",
|
||||
Short: "Get certificate",
|
||||
Long: `Gets a certificate for a given cert ID.`,
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) < 2 {
|
||||
if len(args) < 3 {
|
||||
logUsageCmd(*cmd, cmd.Use)
|
||||
return
|
||||
}
|
||||
if args[0] == "thing" {
|
||||
cert, err := sdk.ViewCertByThing(args[1], args[2])
|
||||
cert, err := sdk.ViewCertByThing(args[1], args[2], args[3])
|
||||
if err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
@@ -26,7 +26,7 @@ var cmdCerts = []cobra.Command{
|
||||
logJSONCmd(*cmd, cert)
|
||||
return
|
||||
}
|
||||
cert, err := sdk.ViewCert(args[0], args[1])
|
||||
cert, err := sdk.ViewCert(args[0], args[1], args[2])
|
||||
if err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
@@ -35,15 +35,15 @@ var cmdCerts = []cobra.Command{
|
||||
},
|
||||
},
|
||||
{
|
||||
Use: "revoke <thing_id> <user_auth_token>",
|
||||
Use: "revoke <thing_id> <domain_id> <user_auth_token>",
|
||||
Short: "Revoke certificate",
|
||||
Long: `Revokes a certificate for a given thing ID.`,
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 2 {
|
||||
if len(args) != 3 {
|
||||
logUsageCmd(*cmd, cmd.Use)
|
||||
return
|
||||
}
|
||||
rtime, err := sdk.RevokeCert(args[0], args[1])
|
||||
rtime, err := sdk.RevokeCert(args[0], args[1], args[2])
|
||||
if err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
@@ -58,18 +58,18 @@ func NewCertsCmd() *cobra.Command {
|
||||
var ttl string
|
||||
|
||||
issueCmd := cobra.Command{
|
||||
Use: "issue <thing_id> <user_auth_token> [--ttl=8760h]",
|
||||
Use: "issue <thing_id> <domain_id> <user_auth_token> [--ttl=8760h]",
|
||||
Short: "Issue certificate",
|
||||
Long: `Issues new certificate for a thing`,
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 2 {
|
||||
if len(args) != 3 {
|
||||
logUsageCmd(*cmd, cmd.Use)
|
||||
return
|
||||
}
|
||||
|
||||
thingID := args[0]
|
||||
|
||||
c, err := sdk.IssueCert(thingID, ttl, args[1])
|
||||
c, err := sdk.IssueCert(thingID, ttl, args[1], args[2])
|
||||
if err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
|
||||
+14
-4
@@ -47,6 +47,7 @@ func TestGetCertCmd(t *testing.T) {
|
||||
args: []string{
|
||||
"thing",
|
||||
thing.ID,
|
||||
domainID,
|
||||
validToken,
|
||||
},
|
||||
logType: entityLog,
|
||||
@@ -63,6 +64,7 @@ func TestGetCertCmd(t *testing.T) {
|
||||
desc: "get cert successfully by id",
|
||||
args: []string{
|
||||
thing.ID,
|
||||
domainID,
|
||||
validToken,
|
||||
},
|
||||
logType: entityLog,
|
||||
@@ -73,6 +75,7 @@ func TestGetCertCmd(t *testing.T) {
|
||||
args: []string{
|
||||
"thing",
|
||||
thing.ID,
|
||||
domainID,
|
||||
invalidToken,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusUnauthorized),
|
||||
@@ -83,6 +86,7 @@ func TestGetCertCmd(t *testing.T) {
|
||||
desc: "get cert by id with invalid token",
|
||||
args: []string{
|
||||
thing.ID,
|
||||
domainID,
|
||||
invalidToken,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusUnauthorized),
|
||||
@@ -100,8 +104,8 @@ func TestGetCertCmd(t *testing.T) {
|
||||
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
sdkCall := sdkMock.On("ViewCertByThing", mock.Anything, mock.Anything).Return(tc.serials, tc.sdkErr)
|
||||
sdkCall1 := sdkMock.On("ViewCert", mock.Anything, mock.Anything).Return(tc.cert, tc.sdkErr)
|
||||
sdkCall := sdkMock.On("ViewCertByThing", mock.Anything, mock.Anything, mock.Anything).Return(tc.serials, tc.sdkErr)
|
||||
sdkCall1 := sdkMock.On("ViewCert", mock.Anything, mock.Anything, mock.Anything).Return(tc.cert, tc.sdkErr)
|
||||
out := executeCommand(t, rootCmd, append([]string{getCmd}, tc.args...)...)
|
||||
switch tc.logType {
|
||||
case entityLog:
|
||||
@@ -147,6 +151,7 @@ func TestRevokeCertCmd(t *testing.T) {
|
||||
desc: "revoke cert successfully",
|
||||
args: []string{
|
||||
thing.ID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
logType: revokeLog,
|
||||
@@ -157,6 +162,7 @@ func TestRevokeCertCmd(t *testing.T) {
|
||||
desc: "revoke cert with invalid args",
|
||||
args: []string{
|
||||
thing.ID,
|
||||
domainID,
|
||||
token,
|
||||
extraArg,
|
||||
},
|
||||
@@ -166,6 +172,7 @@ func TestRevokeCertCmd(t *testing.T) {
|
||||
desc: "revoke cert with invalid token",
|
||||
args: []string{
|
||||
thing.ID,
|
||||
domainID,
|
||||
invalidToken,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden),
|
||||
@@ -176,7 +183,7 @@ func TestRevokeCertCmd(t *testing.T) {
|
||||
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
sdkCall := sdkMock.On("RevokeCert", tc.args[0], tc.args[1]).Return(tc.time, tc.sdkErr)
|
||||
sdkCall := sdkMock.On("RevokeCert", tc.args[0], tc.args[1], tc.args[2]).Return(tc.time, tc.sdkErr)
|
||||
out := executeCommand(t, rootCmd, append([]string{revokeCmd}, tc.args...)...)
|
||||
|
||||
switch tc.logType {
|
||||
@@ -215,6 +222,7 @@ func TestIssueCertCmd(t *testing.T) {
|
||||
desc: "issue cert successfully",
|
||||
args: []string{
|
||||
thing.ID,
|
||||
domainID,
|
||||
validToken,
|
||||
},
|
||||
cert: cert,
|
||||
@@ -224,6 +232,7 @@ func TestIssueCertCmd(t *testing.T) {
|
||||
desc: "issue cert with invalid args",
|
||||
args: []string{
|
||||
thing.ID,
|
||||
domainID,
|
||||
validToken,
|
||||
extraArg,
|
||||
},
|
||||
@@ -233,6 +242,7 @@ func TestIssueCertCmd(t *testing.T) {
|
||||
desc: "issue cert with invalid token",
|
||||
args: []string{
|
||||
thing.ID,
|
||||
domainID,
|
||||
invalidToken,
|
||||
},
|
||||
logType: errLog,
|
||||
@@ -243,7 +253,7 @@ func TestIssueCertCmd(t *testing.T) {
|
||||
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
sdkCall := sdkMock.On("IssueCert", mock.Anything, mock.Anything, tc.args[1]).Return(tc.cert, tc.sdkErr)
|
||||
sdkCall := sdkMock.On("IssueCert", mock.Anything, mock.Anything, tc.args[1], tc.args[2]).Return(tc.cert, tc.sdkErr)
|
||||
out := executeCommand(t, rootCmd, append([]string{issueCmd}, tc.args...)...)
|
||||
|
||||
switch tc.logType {
|
||||
|
||||
+56
-53
@@ -14,11 +14,11 @@ const all = "all"
|
||||
|
||||
var cmdChannels = []cobra.Command{
|
||||
{
|
||||
Use: "create <JSON_channel> <user_auth_token>",
|
||||
Use: "create <JSON_channel> <domain_id> <user_auth_token>",
|
||||
Short: "Create channel",
|
||||
Long: `Creates new channel and generates it's UUID`,
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 2 {
|
||||
if len(args) != 3 {
|
||||
logUsageCmd(*cmd, cmd.Use)
|
||||
return
|
||||
}
|
||||
@@ -29,7 +29,7 @@ var cmdChannels = []cobra.Command{
|
||||
return
|
||||
}
|
||||
|
||||
channel, err := sdk.CreateChannel(channel, args[1])
|
||||
channel, err := sdk.CreateChannel(channel, args[1], args[2])
|
||||
if err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
@@ -39,14 +39,14 @@ var cmdChannels = []cobra.Command{
|
||||
},
|
||||
},
|
||||
{
|
||||
Use: "get [all | <channel_id>] <user_auth_token>",
|
||||
Use: "get [all | <channel_id>] <domain_id> <user_auth_token>",
|
||||
Short: "Get channel",
|
||||
Long: `Get all channels or get channel by id. Channels can be filtered by name or metadata.
|
||||
all - lists all channels
|
||||
<channel_id> - shows thing with provided <channel_id>`,
|
||||
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 2 {
|
||||
if len(args) != 3 {
|
||||
logUsageCmd(*cmd, cmd.Use)
|
||||
return
|
||||
}
|
||||
@@ -63,7 +63,7 @@ var cmdChannels = []cobra.Command{
|
||||
}
|
||||
|
||||
if args[0] == all {
|
||||
l, err := sdk.Channels(pageMetadata, args[1])
|
||||
l, err := sdk.Channels(pageMetadata, args[2])
|
||||
if err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
@@ -72,7 +72,7 @@ var cmdChannels = []cobra.Command{
|
||||
logJSONCmd(*cmd, l)
|
||||
return
|
||||
}
|
||||
c, err := sdk.Channel(args[0], args[1])
|
||||
c, err := sdk.Channel(args[0], args[1], args[2])
|
||||
if err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
@@ -82,17 +82,17 @@ var cmdChannels = []cobra.Command{
|
||||
},
|
||||
},
|
||||
{
|
||||
Use: "delete <channel_id> <user_auth_token>",
|
||||
Use: "delete <channel_id> <domain_id> <user_auth_token>",
|
||||
Short: "Delete channel",
|
||||
Long: "Delete channel by id.\n" +
|
||||
"Usage:\n" +
|
||||
"\tmagistrala-cli channels delete <channel_id> $USERTOKEN - delete the given channel ID\n",
|
||||
"\tmagistrala-cli channels delete <channel_id> $DOMAINID $USERTOKEN - delete the given channel ID\n",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 2 {
|
||||
if len(args) != 3 {
|
||||
logUsageCmd(*cmd, cmd.Use)
|
||||
return
|
||||
}
|
||||
if err := sdk.DeleteChannel(args[0], args[1]); err != nil {
|
||||
if err := sdk.DeleteChannel(args[0], args[1], args[2]); err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
}
|
||||
@@ -100,11 +100,11 @@ var cmdChannels = []cobra.Command{
|
||||
},
|
||||
},
|
||||
{
|
||||
Use: "update <channel_id> <JSON_string> <user_auth_token>",
|
||||
Use: "update <channel_id> <JSON_string> <domain_id> <user_auth_token>",
|
||||
Short: "Update channel",
|
||||
Long: `Updates channel record`,
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 3 {
|
||||
if len(args) != 4 {
|
||||
logUsageCmd(*cmd, cmd.Use)
|
||||
return
|
||||
}
|
||||
@@ -115,7 +115,7 @@ var cmdChannels = []cobra.Command{
|
||||
return
|
||||
}
|
||||
channel.ID = args[0]
|
||||
channel, err := sdk.UpdateChannel(channel, args[2])
|
||||
channel, err := sdk.UpdateChannel(channel, args[2], args[3])
|
||||
if err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
@@ -125,19 +125,20 @@ var cmdChannels = []cobra.Command{
|
||||
},
|
||||
},
|
||||
{
|
||||
Use: "connections <channel_id> <user_auth_token>",
|
||||
Use: "connections <channel_id> <domain_id> <user_auth_token>",
|
||||
Short: "Connections list",
|
||||
Long: `List of Things connected to a Channel`,
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 2 {
|
||||
if len(args) != 3 {
|
||||
logUsageCmd(*cmd, cmd.Use)
|
||||
return
|
||||
}
|
||||
pm := mgxsdk.PageMetadata{
|
||||
Offset: Offset,
|
||||
Limit: Limit,
|
||||
Offset: Offset,
|
||||
Limit: Limit,
|
||||
DomainID: args[1],
|
||||
}
|
||||
cl, err := sdk.ThingsByChannel(args[0], pm, args[1])
|
||||
cl, err := sdk.ThingsByChannel(args[0], pm, args[2])
|
||||
if err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
@@ -147,16 +148,16 @@ var cmdChannels = []cobra.Command{
|
||||
},
|
||||
},
|
||||
{
|
||||
Use: "enable <channel_id> <user_auth_token>",
|
||||
Use: "enable <channel_id> <domain_id> <user_auth_token>",
|
||||
Short: "Change channel status to enabled",
|
||||
Long: `Change channel status to enabled`,
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 2 {
|
||||
if len(args) != 3 {
|
||||
logUsageCmd(*cmd, cmd.Use)
|
||||
return
|
||||
}
|
||||
|
||||
channel, err := sdk.EnableChannel(args[0], args[1])
|
||||
channel, err := sdk.EnableChannel(args[0], args[1], args[2])
|
||||
if err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
@@ -166,16 +167,16 @@ var cmdChannels = []cobra.Command{
|
||||
},
|
||||
},
|
||||
{
|
||||
Use: "disable <channel_id> <user_auth_token>",
|
||||
Use: "disable <channel_id> <domain_id> <user_auth_token>",
|
||||
Short: "Change channel status to disabled",
|
||||
Long: `Change channel status to disabled`,
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 2 {
|
||||
if len(args) != 3 {
|
||||
logUsageCmd(*cmd, cmd.Use)
|
||||
return
|
||||
}
|
||||
|
||||
channel, err := sdk.DisableChannel(args[0], args[1])
|
||||
channel, err := sdk.DisableChannel(args[0], args[1], args[2])
|
||||
if err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
@@ -185,21 +186,22 @@ var cmdChannels = []cobra.Command{
|
||||
},
|
||||
},
|
||||
{
|
||||
Use: "users <channel_id> <user_auth_token>",
|
||||
Use: "users <channel_id> <domain_id> <user_auth_token>",
|
||||
Short: "List users",
|
||||
Long: "List users of a channel\n" +
|
||||
"Usage:\n" +
|
||||
"\tmagistrala-cli channels users <channel_id> $USERTOKEN\n",
|
||||
"\tmagistrala-cli channels users <channel_id> $DOMAINID $USERTOKEN\n",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 2 {
|
||||
if len(args) != 3 {
|
||||
logUsageCmd(*cmd, cmd.Use)
|
||||
return
|
||||
}
|
||||
pm := mgxsdk.PageMetadata{
|
||||
Offset: Offset,
|
||||
Limit: Limit,
|
||||
Offset: Offset,
|
||||
Limit: Limit,
|
||||
DomainID: args[1],
|
||||
}
|
||||
ul, err := sdk.ListChannelUsers(args[0], pm, args[1])
|
||||
ul, err := sdk.ListChannelUsers(args[0], pm, args[2])
|
||||
if err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
@@ -209,21 +211,22 @@ var cmdChannels = []cobra.Command{
|
||||
},
|
||||
},
|
||||
{
|
||||
Use: "groups <channel_id> <user_auth_token>",
|
||||
Use: "groups <channel_id> <domain_id> <user_auth_token>",
|
||||
Short: "List groups",
|
||||
Long: "List groups of a channel\n" +
|
||||
"Usage:\n" +
|
||||
"\tmagistrala-cli channels groups <channel_id> $USERTOKEN\n",
|
||||
"\tmagistrala-cli channels groups <channel_id> $DOMAINID $USERTOKEN\n",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 2 {
|
||||
if len(args) != 3 {
|
||||
logUsageCmd(*cmd, cmd.Use)
|
||||
return
|
||||
}
|
||||
pm := mgxsdk.PageMetadata{
|
||||
Offset: Offset,
|
||||
Limit: Limit,
|
||||
Offset: Offset,
|
||||
Limit: Limit,
|
||||
DomainID: args[1],
|
||||
}
|
||||
ul, err := sdk.ListChannelUserGroups(args[0], pm, args[1])
|
||||
ul, err := sdk.ListChannelUserGroups(args[0], pm, args[2])
|
||||
if err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
@@ -236,13 +239,13 @@ var cmdChannels = []cobra.Command{
|
||||
|
||||
var channelAssignCmds = []cobra.Command{
|
||||
{
|
||||
Use: "users <relation> <user_ids> <channel_id> <user_auth_token>",
|
||||
Use: "users <relation> <user_ids> <channel_id> <domain_id> <user_auth_token>",
|
||||
Short: "Assign users",
|
||||
Long: "Assign users to a channel\n" +
|
||||
"Usage:\n" +
|
||||
"\tmagistrala-cli channels assign users <relation> '[\"<user_id_1>\", \"<user_id_2>\"]' <channel_id> $USERTOKEN\n",
|
||||
"\tmagistrala-cli channels assign users <relation> '[\"<user_id_1>\", \"<user_id_2>\"]' <channel_id> $DOMAINID $USERTOKEN\n",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 4 {
|
||||
if len(args) != 5 {
|
||||
logUsageCmd(*cmd, cmd.Use)
|
||||
return
|
||||
}
|
||||
@@ -251,7 +254,7 @@ var channelAssignCmds = []cobra.Command{
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
}
|
||||
if err := sdk.AddUserToChannel(args[2], mgxsdk.UsersRelationRequest{Relation: args[0], UserIDs: userIDs}, args[3]); err != nil {
|
||||
if err := sdk.AddUserToChannel(args[2], mgxsdk.UsersRelationRequest{Relation: args[0], UserIDs: userIDs}, args[3], args[4]); err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
}
|
||||
@@ -259,14 +262,14 @@ var channelAssignCmds = []cobra.Command{
|
||||
},
|
||||
},
|
||||
{
|
||||
Use: "groups <group_ids> <channel_id> <user_auth_token>",
|
||||
Use: "groups <group_ids> <channel_id> <domain_id> <user_auth_token>",
|
||||
Short: "Assign groups",
|
||||
Long: "Assign groups to a channel\n" +
|
||||
"Usage:\n" +
|
||||
"\tmagistrala-cli channels assign groups '[\"<group_id_1>\", \"<group_id_2>\"]' <channel_id> $USERTOKEN\n",
|
||||
"\tmagistrala-cli channels assign groups '[\"<group_id_1>\", \"<group_id_2>\"]' <channel_id> $DOMAINID $USERTOKEN\n",
|
||||
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 3 {
|
||||
if len(args) != 4 {
|
||||
logUsageCmd(*cmd, cmd.Use)
|
||||
return
|
||||
}
|
||||
@@ -275,7 +278,7 @@ var channelAssignCmds = []cobra.Command{
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
}
|
||||
if err := sdk.AddUserGroupToChannel(args[1], mgxsdk.UserGroupsRequest{UserGroupIDs: groupIDs}, args[2]); err != nil {
|
||||
if err := sdk.AddUserGroupToChannel(args[1], mgxsdk.UserGroupsRequest{UserGroupIDs: groupIDs}, args[2], args[3]); err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
}
|
||||
@@ -286,13 +289,13 @@ var channelAssignCmds = []cobra.Command{
|
||||
|
||||
var channelUnassignCmds = []cobra.Command{
|
||||
{
|
||||
Use: "groups <group_ids> <channel_id> <user_auth_token>",
|
||||
Use: "groups <group_ids> <channel_id> <domain_id> <user_auth_token>",
|
||||
Short: "Unassign groups",
|
||||
Long: "Unassign groups from a channel\n" +
|
||||
"Usage:\n" +
|
||||
"\tmagistrala-cli channels unassign groups '[\"<group_id_1>\", \"<group_id_2>\"]' <channel_id> $USERTOKEN\n",
|
||||
"\tmagistrala-cli channels unassign groups '[\"<group_id_1>\", \"<group_id_2>\"]' <channel_id> $DOMAINID $USERTOKEN\n",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 3 {
|
||||
if len(args) != 4 {
|
||||
logUsageCmd(*cmd, cmd.Use)
|
||||
return
|
||||
}
|
||||
@@ -301,7 +304,7 @@ var channelUnassignCmds = []cobra.Command{
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
}
|
||||
if err := sdk.RemoveUserGroupFromChannel(args[1], mgxsdk.UserGroupsRequest{UserGroupIDs: groupIDs}, args[2]); err != nil {
|
||||
if err := sdk.RemoveUserGroupFromChannel(args[1], mgxsdk.UserGroupsRequest{UserGroupIDs: groupIDs}, args[2], args[3]); err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
}
|
||||
@@ -310,13 +313,13 @@ var channelUnassignCmds = []cobra.Command{
|
||||
},
|
||||
|
||||
{
|
||||
Use: "users <relation> <user_ids> <channel_id> <user_auth_token>",
|
||||
Use: "users <relation> <user_ids> <channel_id> <domain_id> <user_auth_token>",
|
||||
Short: "Unassign users",
|
||||
Long: "Unassign users from a channel\n" +
|
||||
"Usage:\n" +
|
||||
"\tmagistrala-cli channels unassign users <relation> '[\"<user_id_1>\", \"<user_id_2>\"]' <channel_id> $USERTOKEN\n",
|
||||
"\tmagistrala-cli channels unassign users <relation> '[\"<user_id_1>\", \"<user_id_2>\"]' <channel_id> $DOMAINID $USERTOKEN\n",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 4 {
|
||||
if len(args) != 5 {
|
||||
logUsageCmd(*cmd, cmd.Use)
|
||||
return
|
||||
}
|
||||
@@ -325,7 +328,7 @@ var channelUnassignCmds = []cobra.Command{
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
}
|
||||
if err := sdk.RemoveUserFromChannel(args[2], mgxsdk.UsersRelationRequest{Relation: args[0], UserIDs: userIDs}, args[3]); err != nil {
|
||||
if err := sdk.RemoveUserFromChannel(args[2], mgxsdk.UsersRelationRequest{Relation: args[0], UserIDs: userIDs}, args[3], args[4]); err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
}
|
||||
|
||||
+68
-44
@@ -45,6 +45,7 @@ func TestCreateChannelCmd(t *testing.T) {
|
||||
desc: "create channel successfully",
|
||||
args: []string{
|
||||
channelJson,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
channel: channel,
|
||||
@@ -54,6 +55,7 @@ func TestCreateChannelCmd(t *testing.T) {
|
||||
desc: "create channel with invalid args",
|
||||
args: []string{
|
||||
channelJson,
|
||||
domainID,
|
||||
token,
|
||||
extraArg,
|
||||
},
|
||||
@@ -63,6 +65,7 @@ func TestCreateChannelCmd(t *testing.T) {
|
||||
desc: "create channel with invalid json",
|
||||
args: []string{
|
||||
"{\"name\":\"testchannel\", \"metadata\":{\"key1\":\"value1\"}",
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKError(errors.New("unexpected end of JSON input")),
|
||||
@@ -73,27 +76,18 @@ func TestCreateChannelCmd(t *testing.T) {
|
||||
desc: "create channel with invalid token",
|
||||
args: []string{
|
||||
channelJson,
|
||||
domainID,
|
||||
invalidToken,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusUnauthorized),
|
||||
errLogMessage: fmt.Sprintf("\nerror: %s\n\n", errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusUnauthorized)),
|
||||
logType: errLog,
|
||||
},
|
||||
{
|
||||
desc: "create channel without domain token",
|
||||
args: []string{
|
||||
channelJson,
|
||||
tokenWithoutDomain,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrDomainAuthorization, http.StatusForbidden),
|
||||
errLogMessage: fmt.Sprintf("\nerror: %s\n\n", errors.NewSDKErrorWithStatus(svcerr.ErrDomainAuthorization, http.StatusForbidden)),
|
||||
logType: errLog,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
sdkCall := sdkMock.On("CreateChannel", mock.Anything, tc.args[1]).Return(tc.channel, tc.sdkErr)
|
||||
sdkCall := sdkMock.On("CreateChannel", mock.Anything, tc.args[1], tc.args[2]).Return(tc.channel, tc.sdkErr)
|
||||
out := executeCommand(t, rootCmd, append([]string{createCmd}, tc.args...)...)
|
||||
|
||||
switch tc.logType {
|
||||
@@ -133,6 +127,7 @@ func TestGetChannelsCmd(t *testing.T) {
|
||||
desc: "get all channels successfully",
|
||||
args: []string{
|
||||
all,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
page: mgsdk.ChannelsPage{
|
||||
@@ -144,6 +139,7 @@ func TestGetChannelsCmd(t *testing.T) {
|
||||
desc: "get channel with id",
|
||||
args: []string{
|
||||
channel.ID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
logType: entityLog,
|
||||
@@ -153,6 +149,7 @@ func TestGetChannelsCmd(t *testing.T) {
|
||||
desc: "get channels with invalid args",
|
||||
args: []string{
|
||||
all,
|
||||
domainID,
|
||||
token,
|
||||
extraArg,
|
||||
},
|
||||
@@ -162,26 +159,18 @@ func TestGetChannelsCmd(t *testing.T) {
|
||||
desc: "get all channels with invalid token",
|
||||
args: []string{
|
||||
all,
|
||||
domainID,
|
||||
invalidToken,
|
||||
},
|
||||
logType: errLog,
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden),
|
||||
errLogMessage: fmt.Sprintf("\nerror: %s\n\n", errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden)),
|
||||
},
|
||||
{
|
||||
desc: "get channel without domain token",
|
||||
args: []string{
|
||||
channel.ID,
|
||||
tokenWithoutDomain,
|
||||
},
|
||||
logType: errLog,
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrDomainAuthorization, http.StatusForbidden),
|
||||
errLogMessage: fmt.Sprintf("\nerror: %s\n\n", errors.NewSDKErrorWithStatus(svcerr.ErrDomainAuthorization, http.StatusForbidden)),
|
||||
},
|
||||
{
|
||||
desc: "get channel with invalid id",
|
||||
args: []string{
|
||||
invalidID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden),
|
||||
@@ -192,8 +181,8 @@ func TestGetChannelsCmd(t *testing.T) {
|
||||
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
sdkCall := sdkMock.On("Channel", tc.args[0], tc.args[1]).Return(tc.channel, tc.sdkErr)
|
||||
sdkCall1 := sdkMock.On("Channels", mock.Anything, tc.args[1]).Return(tc.page, tc.sdkErr)
|
||||
sdkCall := sdkMock.On("Channel", tc.args[0], tc.args[1], tc.args[2]).Return(tc.channel, tc.sdkErr)
|
||||
sdkCall1 := sdkMock.On("Channels", mock.Anything, tc.args[2]).Return(tc.page, tc.sdkErr)
|
||||
|
||||
out := executeCommand(t, rootCmd, append([]string{getCmd}, tc.args...)...)
|
||||
|
||||
@@ -236,6 +225,7 @@ func TestDeleteChannelCmd(t *testing.T) {
|
||||
desc: "delete channel successfully",
|
||||
args: []string{
|
||||
channel.ID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
logType: okLog,
|
||||
@@ -244,6 +234,7 @@ func TestDeleteChannelCmd(t *testing.T) {
|
||||
desc: "delete channel with invalid args",
|
||||
args: []string{
|
||||
channel.ID,
|
||||
domainID,
|
||||
token,
|
||||
extraArg,
|
||||
},
|
||||
@@ -253,6 +244,7 @@ func TestDeleteChannelCmd(t *testing.T) {
|
||||
desc: "delete channel with invalid channel id",
|
||||
args: []string{
|
||||
invalidID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden),
|
||||
@@ -263,6 +255,7 @@ func TestDeleteChannelCmd(t *testing.T) {
|
||||
desc: "delete channel with invalid token",
|
||||
args: []string{
|
||||
channel.ID,
|
||||
domainID,
|
||||
invalidToken,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden),
|
||||
@@ -273,7 +266,7 @@ func TestDeleteChannelCmd(t *testing.T) {
|
||||
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
sdkCall := sdkMock.On("DeleteChannel", tc.args[0], tc.args[1]).Return(tc.sdkErr)
|
||||
sdkCall := sdkMock.On("DeleteChannel", tc.args[0], tc.args[1], tc.args[2]).Return(tc.sdkErr)
|
||||
out := executeCommand(t, rootCmd, append([]string{delCmd}, tc.args...)...)
|
||||
|
||||
switch tc.logType {
|
||||
@@ -309,6 +302,7 @@ func TestUpdateChannelCmd(t *testing.T) {
|
||||
args: []string{
|
||||
channel.ID,
|
||||
newChannelJson,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
channel: mgsdk.Channel{
|
||||
@@ -322,6 +316,7 @@ func TestUpdateChannelCmd(t *testing.T) {
|
||||
args: []string{
|
||||
channel.ID,
|
||||
newChannelJson,
|
||||
domainID,
|
||||
token,
|
||||
extraArg,
|
||||
},
|
||||
@@ -332,6 +327,7 @@ func TestUpdateChannelCmd(t *testing.T) {
|
||||
args: []string{
|
||||
invalidID,
|
||||
newChannelJson,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden),
|
||||
@@ -343,6 +339,7 @@ func TestUpdateChannelCmd(t *testing.T) {
|
||||
args: []string{
|
||||
channel.ID,
|
||||
"{\"name\" : \"channel1\"",
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKError(errors.New("unexpected end of JSON input")),
|
||||
@@ -353,7 +350,7 @@ func TestUpdateChannelCmd(t *testing.T) {
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
var ch mgsdk.Channel
|
||||
sdkCall := sdkMock.On("UpdateChannel", mock.Anything, tc.args[2]).Return(tc.channel, tc.sdkErr)
|
||||
sdkCall := sdkMock.On("UpdateChannel", mock.Anything, tc.args[2], tc.args[3]).Return(tc.channel, tc.sdkErr)
|
||||
out := executeCommand(t, rootCmd, append([]string{updCmd}, tc.args...)...)
|
||||
|
||||
switch tc.logType {
|
||||
@@ -390,6 +387,7 @@ func TestListConnectionsCmd(t *testing.T) {
|
||||
desc: "list connections successfully",
|
||||
args: []string{
|
||||
channel.ID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
page: mgsdk.ThingsPage{
|
||||
@@ -406,6 +404,7 @@ func TestListConnectionsCmd(t *testing.T) {
|
||||
desc: "list connections with invalid args",
|
||||
args: []string{
|
||||
channel.ID,
|
||||
domainID,
|
||||
token,
|
||||
extraArg,
|
||||
},
|
||||
@@ -415,6 +414,7 @@ func TestListConnectionsCmd(t *testing.T) {
|
||||
desc: "list connections with invalid channel id",
|
||||
args: []string{
|
||||
invalidID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden),
|
||||
@@ -425,7 +425,7 @@ func TestListConnectionsCmd(t *testing.T) {
|
||||
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
sdkCall := sdkMock.On("ThingsByChannel", tc.args[0], mock.Anything, tc.args[1]).Return(tc.page, tc.sdkErr)
|
||||
sdkCall := sdkMock.On("ThingsByChannel", tc.args[0], mock.Anything, tc.args[2]).Return(tc.page, tc.sdkErr)
|
||||
out := executeCommand(t, rootCmd, append([]string{connsCmd}, tc.args...)...)
|
||||
switch tc.logType {
|
||||
case entityLog:
|
||||
@@ -463,6 +463,7 @@ func TestEnableChannelCmd(t *testing.T) {
|
||||
desc: "enable channel successfully",
|
||||
args: []string{
|
||||
channel.ID,
|
||||
domainID,
|
||||
validToken,
|
||||
},
|
||||
channel: channel,
|
||||
@@ -472,6 +473,7 @@ func TestEnableChannelCmd(t *testing.T) {
|
||||
desc: "delete channel with invalid token",
|
||||
args: []string{
|
||||
channel.ID,
|
||||
domainID,
|
||||
invalidToken,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden),
|
||||
@@ -482,6 +484,7 @@ func TestEnableChannelCmd(t *testing.T) {
|
||||
desc: "delete channel with invalid channel ID",
|
||||
args: []string{
|
||||
invalidID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden),
|
||||
@@ -492,6 +495,7 @@ func TestEnableChannelCmd(t *testing.T) {
|
||||
desc: "enable channel with invalid args",
|
||||
args: []string{
|
||||
channel.ID,
|
||||
domainID,
|
||||
validToken,
|
||||
extraArg,
|
||||
},
|
||||
@@ -501,7 +505,7 @@ func TestEnableChannelCmd(t *testing.T) {
|
||||
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
sdkCall := sdkMock.On("EnableChannel", tc.args[0], tc.args[1]).Return(tc.channel, tc.sdkErr)
|
||||
sdkCall := sdkMock.On("EnableChannel", tc.args[0], tc.args[1], tc.args[2]).Return(tc.channel, tc.sdkErr)
|
||||
out := executeCommand(t, rootCmd, append([]string{enableCmd}, tc.args...)...)
|
||||
|
||||
switch tc.logType {
|
||||
@@ -540,6 +544,7 @@ func TestDisableChannelCmd(t *testing.T) {
|
||||
desc: "disable channel successfully",
|
||||
args: []string{
|
||||
channel.ID,
|
||||
domainID,
|
||||
validToken,
|
||||
},
|
||||
logType: entityLog,
|
||||
@@ -549,6 +554,7 @@ func TestDisableChannelCmd(t *testing.T) {
|
||||
desc: "disable channel with invalid token",
|
||||
args: []string{
|
||||
channel.ID,
|
||||
domainID,
|
||||
invalidToken,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden),
|
||||
@@ -559,6 +565,7 @@ func TestDisableChannelCmd(t *testing.T) {
|
||||
desc: "disable channel with invalid id",
|
||||
args: []string{
|
||||
invalidID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden),
|
||||
@@ -569,6 +576,7 @@ func TestDisableChannelCmd(t *testing.T) {
|
||||
desc: "disable thing with invalid args",
|
||||
args: []string{
|
||||
channel.ID,
|
||||
domainID,
|
||||
validToken,
|
||||
extraArg,
|
||||
},
|
||||
@@ -578,7 +586,7 @@ func TestDisableChannelCmd(t *testing.T) {
|
||||
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
sdkCall := sdkMock.On("DisableChannel", tc.args[0], tc.args[1]).Return(tc.channel, tc.sdkErr)
|
||||
sdkCall := sdkMock.On("DisableChannel", tc.args[0], tc.args[1], tc.args[2]).Return(tc.channel, tc.sdkErr)
|
||||
out := executeCommand(t, rootCmd, append([]string{disableCmd}, tc.args...)...)
|
||||
|
||||
switch tc.logType {
|
||||
@@ -619,6 +627,7 @@ func TestUsersChannelCmd(t *testing.T) {
|
||||
desc: "get channel's users successfully",
|
||||
args: []string{
|
||||
channel.ID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
page: mgsdk.UsersPage{
|
||||
@@ -635,25 +644,17 @@ func TestUsersChannelCmd(t *testing.T) {
|
||||
desc: "list channel users with invalid args",
|
||||
args: []string{
|
||||
channel.ID,
|
||||
domainID,
|
||||
token,
|
||||
extraArg,
|
||||
},
|
||||
logType: usageLog,
|
||||
},
|
||||
{
|
||||
desc: "list channel users without domain token",
|
||||
args: []string{
|
||||
channel.ID,
|
||||
tokenWithoutDomain,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrDomainAuthorization, http.StatusForbidden),
|
||||
errLogMessage: fmt.Sprintf("\nerror: %s\n\n", errors.NewSDKErrorWithStatus(svcerr.ErrDomainAuthorization, http.StatusForbidden)),
|
||||
logType: errLog,
|
||||
},
|
||||
{
|
||||
desc: "list channel users with invalid id",
|
||||
args: []string{
|
||||
invalidID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden),
|
||||
@@ -664,7 +665,7 @@ func TestUsersChannelCmd(t *testing.T) {
|
||||
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
sdkCall := sdkMock.On("ListChannelUsers", tc.args[0], mock.Anything, tc.args[1]).Return(tc.page, tc.sdkErr)
|
||||
sdkCall := sdkMock.On("ListChannelUsers", tc.args[0], mock.Anything, tc.args[2]).Return(tc.page, tc.sdkErr)
|
||||
out := executeCommand(t, rootCmd, append([]string{usrCmd}, tc.args...)...)
|
||||
|
||||
switch tc.logType {
|
||||
@@ -703,6 +704,7 @@ func TestListGroupCmd(t *testing.T) {
|
||||
desc: "list groups successfully",
|
||||
args: []string{
|
||||
channel.ID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
page: mgsdk.GroupsPage{
|
||||
@@ -719,6 +721,7 @@ func TestListGroupCmd(t *testing.T) {
|
||||
desc: "list groups with invalid args",
|
||||
args: []string{
|
||||
channel.ID,
|
||||
domainID,
|
||||
token,
|
||||
extraArg,
|
||||
},
|
||||
@@ -728,6 +731,7 @@ func TestListGroupCmd(t *testing.T) {
|
||||
desc: "list groups with invalid channel id",
|
||||
args: []string{
|
||||
invalidID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden),
|
||||
@@ -737,7 +741,7 @@ func TestListGroupCmd(t *testing.T) {
|
||||
}
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
sdkCall := sdkMock.On("ListChannelUserGroups", tc.args[0], mock.Anything, tc.args[1]).Return(tc.page, tc.sdkErr)
|
||||
sdkCall := sdkMock.On("ListChannelUserGroups", tc.args[0], mock.Anything, tc.args[2]).Return(tc.page, tc.sdkErr)
|
||||
out := executeCommand(t, rootCmd, append([]string{grpCmd}, tc.args...)...)
|
||||
switch tc.logType {
|
||||
case entityLog:
|
||||
@@ -777,6 +781,7 @@ func TestAssignUserCmd(t *testing.T) {
|
||||
relation,
|
||||
userIds,
|
||||
channel.ID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
logType: okLog,
|
||||
@@ -787,6 +792,7 @@ func TestAssignUserCmd(t *testing.T) {
|
||||
relation,
|
||||
userIds,
|
||||
channel.ID,
|
||||
domainID,
|
||||
token,
|
||||
extraArg,
|
||||
},
|
||||
@@ -798,6 +804,7 @@ func TestAssignUserCmd(t *testing.T) {
|
||||
relation,
|
||||
fmt.Sprintf("[\"%s\"", user.ID),
|
||||
channel.ID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKError(errors.New("unexpected end of JSON input")),
|
||||
@@ -810,6 +817,7 @@ func TestAssignUserCmd(t *testing.T) {
|
||||
relation,
|
||||
userIds,
|
||||
invalidID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden),
|
||||
@@ -822,6 +830,7 @@ func TestAssignUserCmd(t *testing.T) {
|
||||
relation,
|
||||
fmt.Sprintf("[\"%s\"]", invalidID),
|
||||
channel.ID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAddPolicies, http.StatusBadRequest),
|
||||
@@ -832,7 +841,7 @@ func TestAssignUserCmd(t *testing.T) {
|
||||
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
sdkCall := sdkMock.On("AddUserToChannel", tc.args[2], mock.Anything, tc.args[3]).Return(tc.sdkErr)
|
||||
sdkCall := sdkMock.On("AddUserToChannel", tc.args[2], mock.Anything, tc.args[3], tc.args[4]).Return(tc.sdkErr)
|
||||
out := executeCommand(t, rootCmd, append([]string{assignCmd, usrCmd}, tc.args...)...)
|
||||
switch tc.logType {
|
||||
case okLog:
|
||||
@@ -867,6 +876,7 @@ func TestAssignGroupCmd(t *testing.T) {
|
||||
args: []string{
|
||||
grpIds,
|
||||
channel.ID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
logType: okLog,
|
||||
@@ -876,6 +886,7 @@ func TestAssignGroupCmd(t *testing.T) {
|
||||
args: []string{
|
||||
grpIds,
|
||||
channel.ID,
|
||||
domainID,
|
||||
token,
|
||||
extraArg,
|
||||
},
|
||||
@@ -886,6 +897,7 @@ func TestAssignGroupCmd(t *testing.T) {
|
||||
args: []string{
|
||||
fmt.Sprintf("[\"%s\"", group.ID),
|
||||
channel.ID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKError(errors.New("unexpected end of JSON input")),
|
||||
@@ -897,6 +909,7 @@ func TestAssignGroupCmd(t *testing.T) {
|
||||
args: []string{
|
||||
grpIds,
|
||||
invalidID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden),
|
||||
@@ -908,6 +921,7 @@ func TestAssignGroupCmd(t *testing.T) {
|
||||
args: []string{
|
||||
fmt.Sprintf("[\"%s\"]", invalidID),
|
||||
channel.ID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAddPolicies, http.StatusBadRequest),
|
||||
@@ -918,7 +932,7 @@ func TestAssignGroupCmd(t *testing.T) {
|
||||
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
sdkCall := sdkMock.On("AddUserGroupToChannel", tc.args[1], mock.Anything, tc.args[2]).Return(tc.sdkErr)
|
||||
sdkCall := sdkMock.On("AddUserGroupToChannel", tc.args[1], mock.Anything, tc.args[2], tc.args[3]).Return(tc.sdkErr)
|
||||
out := executeCommand(t, rootCmd, append([]string{assignCmd, grpCmd}, tc.args...)...)
|
||||
switch tc.logType {
|
||||
case okLog:
|
||||
@@ -954,6 +968,7 @@ func TestUnassignUserCmd(t *testing.T) {
|
||||
relation,
|
||||
userIds,
|
||||
channel.ID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
logType: okLog,
|
||||
@@ -964,6 +979,7 @@ func TestUnassignUserCmd(t *testing.T) {
|
||||
relation,
|
||||
userIds,
|
||||
channel.ID,
|
||||
domainID,
|
||||
token,
|
||||
extraArg,
|
||||
},
|
||||
@@ -975,6 +991,7 @@ func TestUnassignUserCmd(t *testing.T) {
|
||||
relation,
|
||||
fmt.Sprintf("[\"%s\"", user.ID),
|
||||
channel.ID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKError(errors.New("unexpected end of JSON input")),
|
||||
@@ -987,6 +1004,7 @@ func TestUnassignUserCmd(t *testing.T) {
|
||||
relation,
|
||||
userIds,
|
||||
invalidID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden),
|
||||
@@ -999,6 +1017,7 @@ func TestUnassignUserCmd(t *testing.T) {
|
||||
relation,
|
||||
fmt.Sprintf("[\"%s\"]", invalidID),
|
||||
channel.ID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAddPolicies, http.StatusBadRequest),
|
||||
@@ -1009,7 +1028,7 @@ func TestUnassignUserCmd(t *testing.T) {
|
||||
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
sdkCall := sdkMock.On("RemoveUserFromChannel", tc.args[2], mock.Anything, tc.args[3]).Return(tc.sdkErr)
|
||||
sdkCall := sdkMock.On("RemoveUserFromChannel", tc.args[2], mock.Anything, tc.args[3], tc.args[4]).Return(tc.sdkErr)
|
||||
out := executeCommand(t, rootCmd, append([]string{unassignCmd, usrCmd}, tc.args...)...)
|
||||
switch tc.logType {
|
||||
case okLog:
|
||||
@@ -1046,6 +1065,7 @@ func TestUnassignGroupCmd(t *testing.T) {
|
||||
grpCmd,
|
||||
grpIds,
|
||||
channel.ID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
logType: okLog,
|
||||
@@ -1055,6 +1075,7 @@ func TestUnassignGroupCmd(t *testing.T) {
|
||||
args: []string{
|
||||
grpIds,
|
||||
channel.ID,
|
||||
domainID,
|
||||
token,
|
||||
extraArg,
|
||||
},
|
||||
@@ -1065,6 +1086,7 @@ func TestUnassignGroupCmd(t *testing.T) {
|
||||
args: []string{
|
||||
fmt.Sprintf("[\"%s\"", group.ID),
|
||||
channel.ID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKError(errors.New("unexpected end of JSON input")),
|
||||
@@ -1076,6 +1098,7 @@ func TestUnassignGroupCmd(t *testing.T) {
|
||||
args: []string{
|
||||
grpIds,
|
||||
invalidID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden),
|
||||
@@ -1087,6 +1110,7 @@ func TestUnassignGroupCmd(t *testing.T) {
|
||||
args: []string{
|
||||
fmt.Sprintf("[\"%s\"]", invalidID),
|
||||
channel.ID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAddPolicies, http.StatusBadRequest),
|
||||
@@ -1097,7 +1121,7 @@ func TestUnassignGroupCmd(t *testing.T) {
|
||||
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
sdkCall := sdkMock.On("RemoveUserGroupFromChannel", tc.args[1], mock.Anything, tc.args[2]).Return(tc.sdkErr)
|
||||
sdkCall := sdkMock.On("RemoveUserGroupFromChannel", tc.args[1], mock.Anything, tc.args[2], tc.args[3]).Return(tc.sdkErr)
|
||||
out := executeCommand(t, rootCmd, append([]string{unassignCmd, grpCmd}, tc.args...)...)
|
||||
switch tc.logType {
|
||||
case okLog:
|
||||
|
||||
+67
-62
@@ -13,13 +13,13 @@ import (
|
||||
|
||||
var cmdGroups = []cobra.Command{
|
||||
{
|
||||
Use: "create <JSON_group> <user_auth_token>",
|
||||
Use: "create <JSON_group> <domain_id> <user_auth_token>",
|
||||
Short: "Create group",
|
||||
Long: "Creates new group\n" +
|
||||
"Usage:\n" +
|
||||
"\tmagistrala-cli groups create '{\"name\":\"new group\", \"description\":\"new group description\", \"metadata\":{\"key\": \"value\"}}' $USERTOKEN\n",
|
||||
"\tmagistrala-cli groups create '{\"name\":\"new group\", \"description\":\"new group description\", \"metadata\":{\"key\": \"value\"}}' $DOMAINID $USERTOKEN\n",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 2 {
|
||||
if len(args) != 3 {
|
||||
logUsageCmd(*cmd, cmd.Use)
|
||||
return
|
||||
}
|
||||
@@ -29,7 +29,7 @@ var cmdGroups = []cobra.Command{
|
||||
return
|
||||
}
|
||||
group.Status = mgclients.EnabledStatus.String()
|
||||
group, err := sdk.CreateGroup(group, args[1])
|
||||
group, err := sdk.CreateGroup(group, args[1], args[2])
|
||||
if err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
@@ -38,13 +38,13 @@ var cmdGroups = []cobra.Command{
|
||||
},
|
||||
},
|
||||
{
|
||||
Use: "update <JSON_group> <user_auth_token>",
|
||||
Use: "update <JSON_group> <domain_id> <user_auth_token>",
|
||||
Short: "Update group",
|
||||
Long: "Updates group\n" +
|
||||
"Usage:\n" +
|
||||
"\tmagistrala-cli groups update '{\"id\":\"<group_id>\", \"name\":\"new group\", \"description\":\"new group description\", \"metadata\":{\"key\": \"value\"}}' $USERTOKEN\n",
|
||||
"\tmagistrala-cli groups update '{\"id\":\"<group_id>\", \"name\":\"new group\", \"description\":\"new group description\", \"metadata\":{\"key\": \"value\"}}' $DOMAINID $USERTOKEN\n",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 2 {
|
||||
if len(args) != 3 {
|
||||
logUsageCmd(*cmd, cmd.Use)
|
||||
return
|
||||
}
|
||||
@@ -55,7 +55,7 @@ var cmdGroups = []cobra.Command{
|
||||
return
|
||||
}
|
||||
|
||||
group, err := sdk.UpdateGroup(group, args[1])
|
||||
group, err := sdk.UpdateGroup(group, args[1], args[2])
|
||||
if err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
@@ -65,29 +65,30 @@ var cmdGroups = []cobra.Command{
|
||||
},
|
||||
},
|
||||
{
|
||||
Use: "get [all | children <group_id> | parents <group_id> | members <group_id> | <group_id>] <user_auth_token>",
|
||||
Use: "get [all | children <group_id> | parents <group_id> | members <group_id> | <group_id>] <domain_id> <user_auth_token>",
|
||||
Short: "Get group",
|
||||
Long: "Get all users groups, group children or group by id.\n" +
|
||||
"Usage:\n" +
|
||||
"\tmagistrala-cli groups get all $USERTOKEN - lists all groups\n" +
|
||||
"\tmagistrala-cli groups get children <group_id> $USERTOKEN - lists all children groups of <group_id>\n" +
|
||||
"\tmagistrala-cli groups get parents <group_id> $USERTOKEN - lists all parent groups of <group_id>\n" +
|
||||
"\tmagistrala-cli groups get <group_id> $USERTOKEN - shows group with provided group ID\n",
|
||||
"\tmagistrala-cli groups get all $DOMAINID $USERTOKEN - lists all groups\n" +
|
||||
"\tmagistrala-cli groups get children <group_id> $DOMAINID $USERTOKEN - lists all children groups of <group_id>\n" +
|
||||
"\tmagistrala-cli groups get parents <group_id> $DOMAINID $USERTOKEN - lists all parent groups of <group_id>\n" +
|
||||
"\tmagistrala-cli groups get <group_id> $DOMAINID $USERTOKEN - shows group with provided group ID\n",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) < 2 {
|
||||
if len(args) < 3 {
|
||||
logUsageCmd(*cmd, cmd.Use)
|
||||
return
|
||||
}
|
||||
if args[0] == all {
|
||||
if len(args) > 2 {
|
||||
if len(args) > 3 {
|
||||
logUsageCmd(*cmd, cmd.Use)
|
||||
return
|
||||
}
|
||||
pm := mgxsdk.PageMetadata{
|
||||
Offset: Offset,
|
||||
Limit: Limit,
|
||||
Offset: Offset,
|
||||
Limit: Limit,
|
||||
DomainID: args[1],
|
||||
}
|
||||
l, err := sdk.Groups(pm, args[1])
|
||||
l, err := sdk.Groups(pm, args[2])
|
||||
if err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
@@ -96,15 +97,16 @@ var cmdGroups = []cobra.Command{
|
||||
return
|
||||
}
|
||||
if args[0] == "children" {
|
||||
if len(args) > 3 {
|
||||
if len(args) > 4 {
|
||||
logUsageCmd(*cmd, cmd.Use)
|
||||
return
|
||||
}
|
||||
pm := mgxsdk.PageMetadata{
|
||||
Offset: Offset,
|
||||
Limit: Limit,
|
||||
Offset: Offset,
|
||||
Limit: Limit,
|
||||
DomainID: args[2],
|
||||
}
|
||||
l, err := sdk.Children(args[1], pm, args[2])
|
||||
l, err := sdk.Children(args[1], pm, args[3])
|
||||
if err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
@@ -113,15 +115,16 @@ var cmdGroups = []cobra.Command{
|
||||
return
|
||||
}
|
||||
if args[0] == "parents" {
|
||||
if len(args) > 3 {
|
||||
if len(args) > 4 {
|
||||
logUsageCmd(*cmd, cmd.Use)
|
||||
return
|
||||
}
|
||||
pm := mgxsdk.PageMetadata{
|
||||
Offset: Offset,
|
||||
Limit: Limit,
|
||||
Offset: Offset,
|
||||
Limit: Limit,
|
||||
DomainID: args[2],
|
||||
}
|
||||
l, err := sdk.Parents(args[1], pm, args[2])
|
||||
l, err := sdk.Parents(args[1], pm, args[3])
|
||||
if err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
@@ -129,11 +132,11 @@ var cmdGroups = []cobra.Command{
|
||||
logJSONCmd(*cmd, l)
|
||||
return
|
||||
}
|
||||
if len(args) > 2 {
|
||||
if len(args) > 3 {
|
||||
logUsageCmd(*cmd, cmd.Use)
|
||||
return
|
||||
}
|
||||
t, err := sdk.Group(args[0], args[1])
|
||||
t, err := sdk.Group(args[0], args[1], args[2])
|
||||
if err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
@@ -142,17 +145,17 @@ var cmdGroups = []cobra.Command{
|
||||
},
|
||||
},
|
||||
{
|
||||
Use: "delete <group_id> <user_auth_token>",
|
||||
Use: "delete <group_id> <domain_id> <user_auth_token>",
|
||||
Short: "Delete group",
|
||||
Long: "Delete group by id.\n" +
|
||||
"Usage:\n" +
|
||||
"\tmagistrala-cli groups delete <group_id> $USERTOKEN - delete the given group ID\n",
|
||||
"\tmagistrala-cli groups delete <group_id> $DOMAINID $USERTOKEN - delete the given group ID\n",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 2 {
|
||||
if len(args) != 3 {
|
||||
logUsageCmd(*cmd, cmd.Use)
|
||||
return
|
||||
}
|
||||
if err := sdk.DeleteGroup(args[0], args[1]); err != nil {
|
||||
if err := sdk.DeleteGroup(args[0], args[1], args[2]); err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
}
|
||||
@@ -160,22 +163,23 @@ var cmdGroups = []cobra.Command{
|
||||
},
|
||||
},
|
||||
{
|
||||
Use: "users <group_id> <user_auth_token>",
|
||||
Use: "users <group_id> <domain_id> <user_auth_token>",
|
||||
Short: "List users",
|
||||
Long: "List users in a group\n" +
|
||||
"Usage:\n" +
|
||||
"\tmagistrala-cli groups users <group_id> $USERTOKEN",
|
||||
"\tmagistrala-cli groups users <group_id> $DOMAINID $USERTOKEN",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 2 {
|
||||
if len(args) != 3 {
|
||||
logUsageCmd(*cmd, cmd.Use)
|
||||
return
|
||||
}
|
||||
pm := mgxsdk.PageMetadata{
|
||||
Offset: Offset,
|
||||
Limit: Limit,
|
||||
Status: Status,
|
||||
Offset: Offset,
|
||||
Limit: Limit,
|
||||
Status: Status,
|
||||
DomainID: args[1],
|
||||
}
|
||||
users, err := sdk.ListGroupUsers(args[0], pm, args[1])
|
||||
users, err := sdk.ListGroupUsers(args[0], pm, args[2])
|
||||
if err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
@@ -184,22 +188,23 @@ var cmdGroups = []cobra.Command{
|
||||
},
|
||||
},
|
||||
{
|
||||
Use: "channels <group_id> <user_auth_token>",
|
||||
Use: "channels <group_id> <domain_id> <user_auth_token>",
|
||||
Short: "List channels",
|
||||
Long: "List channels in a group\n" +
|
||||
"Usage:\n" +
|
||||
"\tmagistrala-cli groups channels <group_id> $USERTOKEN",
|
||||
"\tmagistrala-cli groups channels <group_id> $DOMAINID $USERTOKEN",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 2 {
|
||||
if len(args) != 3 {
|
||||
logUsageCmd(*cmd, cmd.Use)
|
||||
return
|
||||
}
|
||||
pm := mgxsdk.PageMetadata{
|
||||
Offset: Offset,
|
||||
Limit: Limit,
|
||||
Status: Status,
|
||||
Offset: Offset,
|
||||
Limit: Limit,
|
||||
Status: Status,
|
||||
DomainID: args[1],
|
||||
}
|
||||
channels, err := sdk.ListGroupChannels(args[0], pm, args[1])
|
||||
channels, err := sdk.ListGroupChannels(args[0], pm, args[2])
|
||||
if err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
@@ -208,18 +213,18 @@ var cmdGroups = []cobra.Command{
|
||||
},
|
||||
},
|
||||
{
|
||||
Use: "enable <group_id> <user_auth_token>",
|
||||
Use: "enable <group_id> <domain_id> <user_auth_token>",
|
||||
Short: "Change group status to enabled",
|
||||
Long: "Change group status to enabled\n" +
|
||||
"Usage:\n" +
|
||||
"\tmagistrala-cli groups enable <group_id> $USERTOKEN\n",
|
||||
"\tmagistrala-cli groups enable <group_id> $DOMAINID $USERTOKEN\n",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 2 {
|
||||
if len(args) != 3 {
|
||||
logUsageCmd(*cmd, cmd.Use)
|
||||
return
|
||||
}
|
||||
|
||||
group, err := sdk.EnableGroup(args[0], args[1])
|
||||
group, err := sdk.EnableGroup(args[0], args[1], args[2])
|
||||
if err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
@@ -229,18 +234,18 @@ var cmdGroups = []cobra.Command{
|
||||
},
|
||||
},
|
||||
{
|
||||
Use: "disable <group_id> <user_auth_token>",
|
||||
Use: "disable <group_id> <domain_id> <user_auth_token>",
|
||||
Short: "Change group status to disabled",
|
||||
Long: "Change group status to disabled\n" +
|
||||
"Usage:\n" +
|
||||
"\tmagistrala-cli groups disable <group_id> $USERTOKEN\n",
|
||||
"\tmagistrala-cli groups disable <group_id> $DOMAINID $USERTOKEN\n",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 2 {
|
||||
if len(args) != 3 {
|
||||
logUsageCmd(*cmd, cmd.Use)
|
||||
return
|
||||
}
|
||||
|
||||
group, err := sdk.DisableGroup(args[0], args[1])
|
||||
group, err := sdk.DisableGroup(args[0], args[1], args[2])
|
||||
if err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
@@ -253,13 +258,13 @@ var cmdGroups = []cobra.Command{
|
||||
|
||||
var groupAssignCmds = []cobra.Command{
|
||||
{
|
||||
Use: "users <relation> <user_ids> <group_id> <user_auth_token>",
|
||||
Use: "users <relation> <user_ids> <group_id> <domain_id> <user_auth_token>",
|
||||
Short: "Assign users",
|
||||
Long: "Assign users to a group\n" +
|
||||
"Usage:\n" +
|
||||
"\tmagistrala-cli groups assign users <relation> '[\"<user_id_1>\", \"<user_id_2>\"]' <group_id> $USERTOKEN\n",
|
||||
"\tmagistrala-cli groups assign users <relation> '[\"<user_id_1>\", \"<user_id_2>\"]' <group_id> $DOMAINID $USERTOKEN\n",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 4 {
|
||||
if len(args) != 5 {
|
||||
logUsageCmd(*cmd, cmd.Use)
|
||||
return
|
||||
}
|
||||
@@ -268,7 +273,7 @@ var groupAssignCmds = []cobra.Command{
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
}
|
||||
if err := sdk.AddUserToGroup(args[2], mgxsdk.UsersRelationRequest{Relation: args[0], UserIDs: userIDs}, args[3]); err != nil {
|
||||
if err := sdk.AddUserToGroup(args[2], mgxsdk.UsersRelationRequest{Relation: args[0], UserIDs: userIDs}, args[3], args[4]); err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
}
|
||||
@@ -279,13 +284,13 @@ var groupAssignCmds = []cobra.Command{
|
||||
|
||||
var groupUnassignCmds = []cobra.Command{
|
||||
{
|
||||
Use: "users <relation> <user_ids> <group_id> <user_auth_token>",
|
||||
Use: "users <relation> <user_ids> <group_id> <domain_id> <user_auth_token>",
|
||||
Short: "Unassign users",
|
||||
Long: "Unassign users from a group\n" +
|
||||
"Usage:\n" +
|
||||
"\tmagistrala-cli groups unassign users <relation> '[\"<user_id_1>\", \"<user_id_2>\"]' <group_id> $USERTOKEN\n",
|
||||
"\tmagistrala-cli groups unassign users <relation> '[\"<user_id_1>\", \"<user_id_2>\"]' <group_id> $DOMAINID $USERTOKEN\n",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 4 {
|
||||
if len(args) != 5 {
|
||||
logUsageCmd(*cmd, cmd.Use)
|
||||
return
|
||||
}
|
||||
@@ -294,7 +299,7 @@ var groupUnassignCmds = []cobra.Command{
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
}
|
||||
if err := sdk.RemoveUserFromGroup(args[2], mgxsdk.UsersRelationRequest{Relation: args[0], UserIDs: userIDs}, args[3]); err != nil {
|
||||
if err := sdk.RemoveUserFromGroup(args[2], mgxsdk.UsersRelationRequest{Relation: args[0], UserIDs: userIDs}, args[3], args[4]); err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
}
|
||||
|
||||
+76
-26
@@ -45,6 +45,7 @@ func TestCreateGroupCmd(t *testing.T) {
|
||||
desc: "create group successfully",
|
||||
args: []string{
|
||||
groupJson,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
group: group,
|
||||
@@ -54,6 +55,7 @@ func TestCreateGroupCmd(t *testing.T) {
|
||||
desc: "create group with invalid args",
|
||||
args: []string{
|
||||
groupJson,
|
||||
domainID,
|
||||
token,
|
||||
extraArg,
|
||||
},
|
||||
@@ -63,6 +65,7 @@ func TestCreateGroupCmd(t *testing.T) {
|
||||
desc: "create group with invalid json",
|
||||
args: []string{
|
||||
"{\"name\":\"testgroup\", \"metadata\":{\"key1\":\"value1\"}",
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKError(errors.New("unexpected end of JSON input")),
|
||||
@@ -73,6 +76,7 @@ func TestCreateGroupCmd(t *testing.T) {
|
||||
desc: "create group with invalid token",
|
||||
args: []string{
|
||||
groupJson,
|
||||
domainID,
|
||||
invalidToken,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusUnauthorized),
|
||||
@@ -80,10 +84,11 @@ func TestCreateGroupCmd(t *testing.T) {
|
||||
logType: errLog,
|
||||
},
|
||||
{
|
||||
desc: "create group without domain token",
|
||||
desc: "create group with invalid domain",
|
||||
args: []string{
|
||||
groupJson,
|
||||
tokenWithoutDomain,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrDomainAuthorization, http.StatusForbidden),
|
||||
errLogMessage: fmt.Sprintf("\nerror: %s\n\n", errors.NewSDKErrorWithStatus(svcerr.ErrDomainAuthorization, http.StatusForbidden)),
|
||||
@@ -93,7 +98,7 @@ func TestCreateGroupCmd(t *testing.T) {
|
||||
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
sdkCall := sdkMock.On("CreateGroup", mock.Anything, tc.args[1]).Return(tc.group, tc.sdkErr)
|
||||
sdkCall := sdkMock.On("CreateGroup", mock.Anything, tc.args[1], tc.args[2]).Return(tc.group, tc.sdkErr)
|
||||
out := executeCommand(t, rootCmd, append([]string{createCmd}, tc.args...)...)
|
||||
|
||||
switch tc.logType {
|
||||
@@ -133,6 +138,7 @@ func TestGetGroupsCmd(t *testing.T) {
|
||||
desc: "get all groups successfully",
|
||||
args: []string{
|
||||
all,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
page: mgsdk.GroupsPage{
|
||||
@@ -144,28 +150,31 @@ func TestGetGroupsCmd(t *testing.T) {
|
||||
desc: "get all groups with invalid args",
|
||||
args: []string{
|
||||
all,
|
||||
domainID,
|
||||
token,
|
||||
extraArg,
|
||||
},
|
||||
logType: usageLog,
|
||||
},
|
||||
{
|
||||
desc: "get children groups successfully",
|
||||
args: []string{
|
||||
childCmd,
|
||||
group.ID,
|
||||
token,
|
||||
},
|
||||
page: mgsdk.GroupsPage{
|
||||
Groups: []mgsdk.Group{group},
|
||||
},
|
||||
logType: entityLog,
|
||||
},
|
||||
// {
|
||||
// desc: "get children groups successfully",
|
||||
// args: []string{
|
||||
// childCmd,
|
||||
// group.ID,
|
||||
// domainID,
|
||||
// token,
|
||||
// },
|
||||
// page: mgsdk.GroupsPage{
|
||||
// Groups: []mgsdk.Group{group},
|
||||
// },
|
||||
// logType: entityLog,
|
||||
// },
|
||||
{
|
||||
desc: "get children groups with invalid args",
|
||||
args: []string{
|
||||
childCmd,
|
||||
group.ID,
|
||||
domainID,
|
||||
token,
|
||||
extraArg,
|
||||
},
|
||||
@@ -176,6 +185,7 @@ func TestGetGroupsCmd(t *testing.T) {
|
||||
args: []string{
|
||||
childCmd,
|
||||
group.ID,
|
||||
domainID,
|
||||
invalidToken,
|
||||
},
|
||||
logType: errLog,
|
||||
@@ -187,6 +197,7 @@ func TestGetGroupsCmd(t *testing.T) {
|
||||
args: []string{
|
||||
parentCmd,
|
||||
group.ID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
page: mgsdk.GroupsPage{
|
||||
@@ -199,6 +210,7 @@ func TestGetGroupsCmd(t *testing.T) {
|
||||
args: []string{
|
||||
parentCmd,
|
||||
group.ID,
|
||||
domainID,
|
||||
token,
|
||||
extraArg,
|
||||
},
|
||||
@@ -209,6 +221,7 @@ func TestGetGroupsCmd(t *testing.T) {
|
||||
args: []string{
|
||||
parentCmd,
|
||||
group.ID,
|
||||
domainID,
|
||||
invalidToken,
|
||||
},
|
||||
logType: errLog,
|
||||
@@ -219,6 +232,7 @@ func TestGetGroupsCmd(t *testing.T) {
|
||||
desc: "get group with id",
|
||||
args: []string{
|
||||
group.ID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
logType: entityLog,
|
||||
@@ -235,6 +249,7 @@ func TestGetGroupsCmd(t *testing.T) {
|
||||
desc: "get all groups with invalid token",
|
||||
args: []string{
|
||||
all,
|
||||
domainID,
|
||||
invalidToken,
|
||||
},
|
||||
logType: errLog,
|
||||
@@ -242,10 +257,11 @@ func TestGetGroupsCmd(t *testing.T) {
|
||||
errLogMessage: fmt.Sprintf("\nerror: %s\n\n", errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden)),
|
||||
},
|
||||
{
|
||||
desc: "get group without domain token",
|
||||
desc: "get group with invalid domain",
|
||||
args: []string{
|
||||
group.ID,
|
||||
invalidToken,
|
||||
invalidID,
|
||||
token,
|
||||
},
|
||||
logType: errLog,
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrDomainAuthorization, http.StatusForbidden),
|
||||
@@ -255,6 +271,7 @@ func TestGetGroupsCmd(t *testing.T) {
|
||||
desc: "get group with invalid id",
|
||||
args: []string{
|
||||
invalidID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden),
|
||||
@@ -265,6 +282,7 @@ func TestGetGroupsCmd(t *testing.T) {
|
||||
desc: "get group with invalid args",
|
||||
args: []string{
|
||||
group.ID,
|
||||
domainID,
|
||||
token,
|
||||
extraArg,
|
||||
},
|
||||
@@ -274,7 +292,7 @@ func TestGetGroupsCmd(t *testing.T) {
|
||||
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
sdkCall := sdkMock.On("Group", mock.Anything, mock.Anything).Return(tc.group, tc.sdkErr)
|
||||
sdkCall := sdkMock.On("Group", mock.Anything, mock.Anything, mock.Anything).Return(tc.group, tc.sdkErr)
|
||||
sdkCall1 := sdkMock.On("Groups", mock.Anything, mock.Anything).Return(tc.page, tc.sdkErr)
|
||||
sdkCall2 := sdkMock.On("Parents", mock.Anything, mock.Anything, mock.Anything).Return(tc.page, tc.sdkErr)
|
||||
sdkCall3 := sdkMock.On("Children", mock.Anything, mock.Anything, mock.Anything).Return(tc.page, tc.sdkErr)
|
||||
@@ -322,6 +340,7 @@ func TestDeletegroupCmd(t *testing.T) {
|
||||
desc: "delete group successfully",
|
||||
args: []string{
|
||||
group.ID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
logType: okLog,
|
||||
@@ -330,6 +349,7 @@ func TestDeletegroupCmd(t *testing.T) {
|
||||
desc: "delete group with invalid args",
|
||||
args: []string{
|
||||
group.ID,
|
||||
domainID,
|
||||
token,
|
||||
extraArg,
|
||||
},
|
||||
@@ -339,6 +359,7 @@ func TestDeletegroupCmd(t *testing.T) {
|
||||
desc: "delete group with invalid id",
|
||||
args: []string{
|
||||
invalidID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden),
|
||||
@@ -349,6 +370,7 @@ func TestDeletegroupCmd(t *testing.T) {
|
||||
desc: "delete group with invalid token",
|
||||
args: []string{
|
||||
group.ID,
|
||||
domainID,
|
||||
invalidToken,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden),
|
||||
@@ -359,7 +381,7 @@ func TestDeletegroupCmd(t *testing.T) {
|
||||
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
sdkCall := sdkMock.On("DeleteGroup", tc.args[0], tc.args[1]).Return(tc.sdkErr)
|
||||
sdkCall := sdkMock.On("DeleteGroup", tc.args[0], tc.args[1], tc.args[2]).Return(tc.sdkErr)
|
||||
out := executeCommand(t, rootCmd, append([]string{delCmd}, tc.args...)...)
|
||||
|
||||
switch tc.logType {
|
||||
@@ -394,6 +416,7 @@ func TestUpdategroupCmd(t *testing.T) {
|
||||
desc: "update group successfully",
|
||||
args: []string{
|
||||
newGroupJson,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
group: mgsdk.Group{
|
||||
@@ -406,6 +429,7 @@ func TestUpdategroupCmd(t *testing.T) {
|
||||
desc: "update group with invalid args",
|
||||
args: []string{
|
||||
newGroupJson,
|
||||
domainID,
|
||||
token,
|
||||
extraArg,
|
||||
},
|
||||
@@ -415,6 +439,7 @@ func TestUpdategroupCmd(t *testing.T) {
|
||||
desc: "update group with invalid group id",
|
||||
args: []string{
|
||||
fmt.Sprintf("{\"id\":\"%s\",\"name\" : \"group1\"}", invalidID),
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden),
|
||||
@@ -425,6 +450,7 @@ func TestUpdategroupCmd(t *testing.T) {
|
||||
desc: "update group with invalid json syntax",
|
||||
args: []string{
|
||||
fmt.Sprintf("{\"id\":\"%s\",\"name\" : \"group1\"", group.ID),
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKError(errors.New("unexpected end of JSON input")),
|
||||
@@ -435,7 +461,7 @@ func TestUpdategroupCmd(t *testing.T) {
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
var ch mgsdk.Group
|
||||
sdkCall := sdkMock.On("UpdateGroup", mock.Anything, tc.args[1]).Return(tc.group, tc.sdkErr)
|
||||
sdkCall := sdkMock.On("UpdateGroup", mock.Anything, tc.args[1], tc.args[2]).Return(tc.group, tc.sdkErr)
|
||||
out := executeCommand(t, rootCmd, append([]string{updCmd}, tc.args...)...)
|
||||
|
||||
switch tc.logType {
|
||||
@@ -472,6 +498,7 @@ func TestListUsersCmd(t *testing.T) {
|
||||
desc: "list users successfully",
|
||||
args: []string{
|
||||
group.ID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
page: mgsdk.UsersPage{
|
||||
@@ -488,6 +515,7 @@ func TestListUsersCmd(t *testing.T) {
|
||||
desc: "list users with invalid args",
|
||||
args: []string{
|
||||
group.ID,
|
||||
domainID,
|
||||
token,
|
||||
extraArg,
|
||||
},
|
||||
@@ -497,6 +525,7 @@ func TestListUsersCmd(t *testing.T) {
|
||||
desc: "list users with invalid id",
|
||||
args: []string{
|
||||
invalidID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden),
|
||||
@@ -506,7 +535,7 @@ func TestListUsersCmd(t *testing.T) {
|
||||
}
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
sdkCall := sdkMock.On("ListGroupUsers", tc.args[0], mock.Anything, tc.args[1]).Return(tc.page, tc.sdkErr)
|
||||
sdkCall := sdkMock.On("ListGroupUsers", tc.args[0], mock.Anything, tc.args[2]).Return(tc.page, tc.sdkErr)
|
||||
out := executeCommand(t, rootCmd, append([]string{usrCmd}, tc.args...)...)
|
||||
switch tc.logType {
|
||||
case entityLog:
|
||||
@@ -544,6 +573,7 @@ func TestListChannelsCmd(t *testing.T) {
|
||||
desc: "list channels successfully",
|
||||
args: []string{
|
||||
group.ID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
page: mgsdk.ChannelsPage{
|
||||
@@ -560,6 +590,7 @@ func TestListChannelsCmd(t *testing.T) {
|
||||
desc: "list channels with invalid args",
|
||||
args: []string{
|
||||
group.ID,
|
||||
domainID,
|
||||
token,
|
||||
extraArg,
|
||||
},
|
||||
@@ -569,6 +600,7 @@ func TestListChannelsCmd(t *testing.T) {
|
||||
desc: "list channels with invalid id",
|
||||
args: []string{
|
||||
invalidID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden),
|
||||
@@ -578,7 +610,7 @@ func TestListChannelsCmd(t *testing.T) {
|
||||
}
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
sdkCall := sdkMock.On("ListGroupChannels", tc.args[0], mock.Anything, tc.args[1]).Return(tc.page, tc.sdkErr)
|
||||
sdkCall := sdkMock.On("ListGroupChannels", tc.args[0], mock.Anything, tc.args[2]).Return(tc.page, tc.sdkErr)
|
||||
out := executeCommand(t, rootCmd, append([]string{chansCmd}, tc.args...)...)
|
||||
switch tc.logType {
|
||||
case entityLog:
|
||||
@@ -616,6 +648,7 @@ func TestEnablegroupCmd(t *testing.T) {
|
||||
desc: "enable group successfully",
|
||||
args: []string{
|
||||
group.ID,
|
||||
domainID,
|
||||
validToken,
|
||||
},
|
||||
group: group,
|
||||
@@ -625,6 +658,7 @@ func TestEnablegroupCmd(t *testing.T) {
|
||||
desc: "delete group with invalid token",
|
||||
args: []string{
|
||||
group.ID,
|
||||
domainID,
|
||||
invalidToken,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden),
|
||||
@@ -635,6 +669,7 @@ func TestEnablegroupCmd(t *testing.T) {
|
||||
desc: "delete group with invalid group ID",
|
||||
args: []string{
|
||||
invalidID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden),
|
||||
@@ -645,6 +680,7 @@ func TestEnablegroupCmd(t *testing.T) {
|
||||
desc: "enable group with invalid args",
|
||||
args: []string{
|
||||
group.ID,
|
||||
domainID,
|
||||
validToken,
|
||||
extraArg,
|
||||
},
|
||||
@@ -654,7 +690,7 @@ func TestEnablegroupCmd(t *testing.T) {
|
||||
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
sdkCall := sdkMock.On("EnableGroup", tc.args[0], tc.args[1]).Return(tc.group, tc.sdkErr)
|
||||
sdkCall := sdkMock.On("EnableGroup", tc.args[0], tc.args[1], tc.args[2]).Return(tc.group, tc.sdkErr)
|
||||
out := executeCommand(t, rootCmd, append([]string{enableCmd}, tc.args...)...)
|
||||
|
||||
switch tc.logType {
|
||||
@@ -693,6 +729,7 @@ func TestDisablegroupCmd(t *testing.T) {
|
||||
desc: "disable group successfully",
|
||||
args: []string{
|
||||
group.ID,
|
||||
domainID,
|
||||
validToken,
|
||||
},
|
||||
logType: entityLog,
|
||||
@@ -702,6 +739,7 @@ func TestDisablegroupCmd(t *testing.T) {
|
||||
desc: "disable group with invalid token",
|
||||
args: []string{
|
||||
group.ID,
|
||||
domainID,
|
||||
invalidToken,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden),
|
||||
@@ -712,6 +750,7 @@ func TestDisablegroupCmd(t *testing.T) {
|
||||
desc: "disable group with invalid id",
|
||||
args: []string{
|
||||
invalidID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden),
|
||||
@@ -722,6 +761,7 @@ func TestDisablegroupCmd(t *testing.T) {
|
||||
desc: "disable thing with invalid args",
|
||||
args: []string{
|
||||
group.ID,
|
||||
domainID,
|
||||
validToken,
|
||||
extraArg,
|
||||
},
|
||||
@@ -731,7 +771,7 @@ func TestDisablegroupCmd(t *testing.T) {
|
||||
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
sdkCall := sdkMock.On("DisableGroup", tc.args[0], tc.args[1]).Return(tc.group, tc.sdkErr)
|
||||
sdkCall := sdkMock.On("DisableGroup", tc.args[0], tc.args[1], tc.args[2]).Return(tc.group, tc.sdkErr)
|
||||
out := executeCommand(t, rootCmd, append([]string{disableCmd}, tc.args...)...)
|
||||
|
||||
switch tc.logType {
|
||||
@@ -773,6 +813,7 @@ func TestAssignUserToGroupCmd(t *testing.T) {
|
||||
relation,
|
||||
userIds,
|
||||
group.ID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
logType: okLog,
|
||||
@@ -783,6 +824,7 @@ func TestAssignUserToGroupCmd(t *testing.T) {
|
||||
relation,
|
||||
userIds,
|
||||
group.ID,
|
||||
domainID,
|
||||
token,
|
||||
extraArg,
|
||||
},
|
||||
@@ -794,6 +836,7 @@ func TestAssignUserToGroupCmd(t *testing.T) {
|
||||
relation,
|
||||
fmt.Sprintf("[\"%s\"", user.ID),
|
||||
group.ID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKError(errors.New("unexpected end of JSON input")),
|
||||
@@ -806,6 +849,7 @@ func TestAssignUserToGroupCmd(t *testing.T) {
|
||||
relation,
|
||||
userIds,
|
||||
invalidID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden),
|
||||
@@ -818,6 +862,7 @@ func TestAssignUserToGroupCmd(t *testing.T) {
|
||||
relation,
|
||||
fmt.Sprintf("[\"%s\"]", invalidID),
|
||||
group.ID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAddPolicies, http.StatusBadRequest),
|
||||
@@ -828,7 +873,7 @@ func TestAssignUserToGroupCmd(t *testing.T) {
|
||||
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
sdkCall := sdkMock.On("AddUserToGroup", tc.args[2], mock.Anything, tc.args[3]).Return(tc.sdkErr)
|
||||
sdkCall := sdkMock.On("AddUserToGroup", tc.args[2], mock.Anything, tc.args[3], tc.args[4]).Return(tc.sdkErr)
|
||||
out := executeCommand(t, rootCmd, append([]string{assignCmd, usrCmd}, tc.args...)...)
|
||||
switch tc.logType {
|
||||
case okLog:
|
||||
@@ -864,6 +909,7 @@ func TestUnassignUserToGroupCmd(t *testing.T) {
|
||||
relation,
|
||||
userIds,
|
||||
group.ID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
logType: okLog,
|
||||
@@ -874,6 +920,7 @@ func TestUnassignUserToGroupCmd(t *testing.T) {
|
||||
relation,
|
||||
userIds,
|
||||
group.ID,
|
||||
domainID,
|
||||
token,
|
||||
extraArg,
|
||||
},
|
||||
@@ -885,6 +932,7 @@ func TestUnassignUserToGroupCmd(t *testing.T) {
|
||||
relation,
|
||||
fmt.Sprintf("[\"%s\"", user.ID),
|
||||
group.ID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKError(errors.New("unexpected end of JSON input")),
|
||||
@@ -897,6 +945,7 @@ func TestUnassignUserToGroupCmd(t *testing.T) {
|
||||
relation,
|
||||
userIds,
|
||||
invalidID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden),
|
||||
@@ -909,6 +958,7 @@ func TestUnassignUserToGroupCmd(t *testing.T) {
|
||||
relation,
|
||||
fmt.Sprintf("[\"%s\"]", invalidID),
|
||||
group.ID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAddPolicies, http.StatusBadRequest),
|
||||
@@ -919,7 +969,7 @@ func TestUnassignUserToGroupCmd(t *testing.T) {
|
||||
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
sdkCall := sdkMock.On("RemoveUserFromGroup", tc.args[2], mock.Anything, tc.args[3]).Return(tc.sdkErr)
|
||||
sdkCall := sdkMock.On("RemoveUserFromGroup", tc.args[2], mock.Anything, tc.args[3], tc.args[4]).Return(tc.sdkErr)
|
||||
out := executeCommand(t, rootCmd, append([]string{unassignCmd, usrCmd}, tc.args...)...)
|
||||
switch tc.logType {
|
||||
case okLog:
|
||||
|
||||
+14
-14
@@ -31,11 +31,11 @@ var (
|
||||
|
||||
var cmdProvision = []cobra.Command{
|
||||
{
|
||||
Use: "things <things_file> <user_token>",
|
||||
Use: "things <things_file> <domain_id> <user_token>",
|
||||
Short: "Provision things",
|
||||
Long: `Bulk create things`,
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 2 {
|
||||
if len(args) != 3 {
|
||||
logUsageCmd(*cmd, cmd.Use)
|
||||
return
|
||||
}
|
||||
@@ -51,7 +51,7 @@ var cmdProvision = []cobra.Command{
|
||||
return
|
||||
}
|
||||
|
||||
things, err = sdk.CreateThings(things, args[1])
|
||||
things, err = sdk.CreateThings(things, args[1], args[2])
|
||||
if err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
@@ -61,11 +61,11 @@ var cmdProvision = []cobra.Command{
|
||||
},
|
||||
},
|
||||
{
|
||||
Use: "channels <channels_file> <user_token>",
|
||||
Use: "channels <channels_file> <domain_id> <user_token>",
|
||||
Short: "Provision channels",
|
||||
Long: `Bulk create channels`,
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 2 {
|
||||
if len(args) != 3 {
|
||||
logUsageCmd(*cmd, cmd.Use)
|
||||
return
|
||||
}
|
||||
@@ -78,7 +78,7 @@ var cmdProvision = []cobra.Command{
|
||||
|
||||
var chs []mgxsdk.Channel
|
||||
for _, c := range channels {
|
||||
c, err = sdk.CreateChannel(c, args[1])
|
||||
c, err = sdk.CreateChannel(c, args[1], args[2])
|
||||
if err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
@@ -91,11 +91,11 @@ var cmdProvision = []cobra.Command{
|
||||
},
|
||||
},
|
||||
{
|
||||
Use: "connect <connections_file> <user_token>",
|
||||
Use: "connect <connections_file> <domain_id> <user_token>",
|
||||
Short: "Provision connections",
|
||||
Long: `Bulk connect things to channels`,
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 2 {
|
||||
if len(args) != 3 {
|
||||
logUsageCmd(*cmd, cmd.Use)
|
||||
return
|
||||
}
|
||||
@@ -106,7 +106,7 @@ var cmdProvision = []cobra.Command{
|
||||
return
|
||||
}
|
||||
for _, conn := range connIDs {
|
||||
if err := sdk.Connect(conn, args[1]); err != nil {
|
||||
if err := sdk.Connect(conn, args[1], args[2]); err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
}
|
||||
@@ -182,7 +182,7 @@ var cmdProvision = []cobra.Command{
|
||||
|
||||
things = append(things, t)
|
||||
}
|
||||
things, err = sdk.CreateThings(things, ut.AccessToken)
|
||||
things, err = sdk.CreateThings(things, domain.ID, ut.AccessToken)
|
||||
if err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
@@ -194,7 +194,7 @@ var cmdProvision = []cobra.Command{
|
||||
Name: fmt.Sprintf("%s-channel-%d", name, i),
|
||||
Status: mgxsdk.EnabledStatus,
|
||||
}
|
||||
c, err = sdk.CreateChannel(c, ut.AccessToken)
|
||||
c, err = sdk.CreateChannel(c, domain.ID, ut.AccessToken)
|
||||
if err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
@@ -208,7 +208,7 @@ var cmdProvision = []cobra.Command{
|
||||
ChannelID: channels[0].ID,
|
||||
ThingID: things[0].ID,
|
||||
}
|
||||
if err := sdk.Connect(conIDs, ut.AccessToken); err != nil {
|
||||
if err := sdk.Connect(conIDs, domain.ID, ut.AccessToken); err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
}
|
||||
@@ -217,7 +217,7 @@ var cmdProvision = []cobra.Command{
|
||||
ChannelID: channels[1].ID,
|
||||
ThingID: things[0].ID,
|
||||
}
|
||||
if err := sdk.Connect(conIDs, ut.AccessToken); err != nil {
|
||||
if err := sdk.Connect(conIDs, domain.ID, ut.AccessToken); err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
}
|
||||
@@ -226,7 +226,7 @@ var cmdProvision = []cobra.Command{
|
||||
ChannelID: channels[0].ID,
|
||||
ThingID: things[1].ID,
|
||||
}
|
||||
if err := sdk.Connect(conIDs, ut.AccessToken); err != nil {
|
||||
if err := sdk.Connect(conIDs, domain.ID, ut.AccessToken); err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
}
|
||||
|
||||
+56
-55
@@ -13,13 +13,13 @@ import (
|
||||
|
||||
var cmdThings = []cobra.Command{
|
||||
{
|
||||
Use: "create <JSON_thing> <user_auth_token>",
|
||||
Use: "create <JSON_thing> <domain_id> <user_auth_token>",
|
||||
Short: "Create thing",
|
||||
Long: "Creates new thing with provided name and metadata\n" +
|
||||
"Usage:\n" +
|
||||
"\tmagistrala-cli things create '{\"name\":\"new thing\", \"metadata\":{\"key\": \"value\"}}' $USERTOKEN\n",
|
||||
"\tmagistrala-cli things create '{\"name\":\"new thing\", \"metadata\":{\"key\": \"value\"}}' $DOMAINID $USERTOKEN\n",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 2 {
|
||||
if len(args) != 3 {
|
||||
logUsageCmd(*cmd, cmd.Use)
|
||||
return
|
||||
}
|
||||
@@ -30,7 +30,7 @@ var cmdThings = []cobra.Command{
|
||||
return
|
||||
}
|
||||
thing.Status = mgclients.EnabledStatus.String()
|
||||
thing, err := sdk.CreateThing(thing, args[1])
|
||||
thing, err := sdk.CreateThing(thing, args[1], args[2])
|
||||
if err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
@@ -40,15 +40,15 @@ var cmdThings = []cobra.Command{
|
||||
},
|
||||
},
|
||||
{
|
||||
Use: "get [all | <thing_id>] <user_auth_token>",
|
||||
Use: "get [all | <thing_id>] <domain_id> <user_auth_token>",
|
||||
Short: "Get things",
|
||||
Long: "Get all things or get thing by id. Things can be filtered by name or metadata\n" +
|
||||
"Usage:\n" +
|
||||
"\tmagistrala-cli things get all $USERTOKEN - lists all things\n" +
|
||||
"\tmagistrala-cli things get all $USERTOKEN --offset=10 --limit=10 - lists all things with offset and limit\n" +
|
||||
"\tmagistrala-cli things get all $DOMAINID $USERTOKEN - lists all things\n" +
|
||||
"\tmagistrala-cli things get all $DOMAINID $USERTOKEN --offset=10 --limit=10 - lists all things with offset and limit\n" +
|
||||
"\tmagistrala-cli things get <thing_id> $USERTOKEN - shows thing with provided <thing_id>\n",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 2 {
|
||||
if len(args) != 3 {
|
||||
logUsageCmd(*cmd, cmd.Use)
|
||||
return
|
||||
}
|
||||
@@ -72,7 +72,7 @@ var cmdThings = []cobra.Command{
|
||||
logJSONCmd(*cmd, l)
|
||||
return
|
||||
}
|
||||
t, err := sdk.Thing(args[0], args[1])
|
||||
t, err := sdk.Thing(args[0], args[1], args[2])
|
||||
if err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
@@ -82,17 +82,17 @@ var cmdThings = []cobra.Command{
|
||||
},
|
||||
},
|
||||
{
|
||||
Use: "delete <thing_id> <user_auth_token>",
|
||||
Use: "delete <thing_id> <domain_id> <user_auth_token>",
|
||||
Short: "Delete thing",
|
||||
Long: "Delete thing by id\n" +
|
||||
"Usage:\n" +
|
||||
"\tmagistrala-cli things delete <thing_id> $USERTOKEN - delete thing with <thing_id>\n",
|
||||
"\tmagistrala-cli things delete <thing_id> $DOMAINID $USERTOKEN - delete thing with <thing_id>\n",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 2 {
|
||||
if len(args) != 3 {
|
||||
logUsageCmd(*cmd, cmd.Use)
|
||||
return
|
||||
}
|
||||
if err := sdk.DeleteThing(args[0], args[1]); err != nil {
|
||||
if err := sdk.DeleteThing(args[0], args[1], args[2]); err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
}
|
||||
@@ -100,15 +100,15 @@ var cmdThings = []cobra.Command{
|
||||
},
|
||||
},
|
||||
{
|
||||
Use: "update [<thing_id> <JSON_string> | tags <thing_id> <tags> | secret <thing_id> <secret> ] <user_auth_token>",
|
||||
Use: "update [<thing_id> <JSON_string> | tags <thing_id> <tags> | secret <thing_id> <secret> ] <domain_id> <user_auth_token>",
|
||||
Short: "Update thing",
|
||||
Long: "Updates thing with provided id, name and metadata, or updates thing tags, secret\n" +
|
||||
"Usage:\n" +
|
||||
"\tmagistrala-cli things update <thing_id> '{\"name\":\"new name\", \"metadata\":{\"key\": \"value\"}}' $USERTOKEN\n" +
|
||||
"\tmagistrala-cli things update tags <thing_id> '{\"tag1\":\"value1\", \"tag2\":\"value2\"}' $USERTOKEN\n" +
|
||||
"\tmagistrala-cli things update secret <thing_id> <newsecret> $USERTOKEN\n",
|
||||
"\tmagistrala-cli things update <thing_id> '{\"name\":\"new name\", \"metadata\":{\"key\": \"value\"}}' $DOMAINID $USERTOKEN\n" +
|
||||
"\tmagistrala-cli things update tags <thing_id> '{\"tag1\":\"value1\", \"tag2\":\"value2\"}' $DOMAINID $USERTOKEN\n" +
|
||||
"\tmagistrala-cli things update secret <thing_id> <newsecret> $DOMAINID $USERTOKEN\n",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 4 && len(args) != 3 {
|
||||
if len(args) != 5 && len(args) != 4 {
|
||||
logUsageCmd(*cmd, cmd.Use)
|
||||
return
|
||||
}
|
||||
@@ -120,7 +120,7 @@ var cmdThings = []cobra.Command{
|
||||
return
|
||||
}
|
||||
thing.ID = args[1]
|
||||
thing, err := sdk.UpdateThingTags(thing, args[3])
|
||||
thing, err := sdk.UpdateThingTags(thing, args[3], args[4])
|
||||
if err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
@@ -131,7 +131,7 @@ var cmdThings = []cobra.Command{
|
||||
}
|
||||
|
||||
if args[0] == "secret" {
|
||||
thing, err := sdk.UpdateThingSecret(args[1], args[2], args[3])
|
||||
thing, err := sdk.UpdateThingSecret(args[1], args[2], args[3], args[4])
|
||||
if err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
@@ -146,7 +146,7 @@ var cmdThings = []cobra.Command{
|
||||
return
|
||||
}
|
||||
thing.ID = args[0]
|
||||
thing, err := sdk.UpdateThing(thing, args[2])
|
||||
thing, err := sdk.UpdateThing(thing, args[2], args[3])
|
||||
if err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
@@ -156,18 +156,18 @@ var cmdThings = []cobra.Command{
|
||||
},
|
||||
},
|
||||
{
|
||||
Use: "enable <thing_id> <user_auth_token>",
|
||||
Use: "enable <thing_id> <domain_id> <user_auth_token>",
|
||||
Short: "Change thing status to enabled",
|
||||
Long: "Change thing status to enabled\n" +
|
||||
"Usage:\n" +
|
||||
"\tmagistrala-cli things enable <thing_id> $USERTOKEN\n",
|
||||
"\tmagistrala-cli things enable <thing_id> $DOMAINID $USERTOKEN\n",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 2 {
|
||||
if len(args) != 3 {
|
||||
logUsageCmd(*cmd, cmd.Use)
|
||||
return
|
||||
}
|
||||
|
||||
thing, err := sdk.EnableThing(args[0], args[1])
|
||||
thing, err := sdk.EnableThing(args[0], args[1], args[2])
|
||||
if err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
@@ -177,18 +177,18 @@ var cmdThings = []cobra.Command{
|
||||
},
|
||||
},
|
||||
{
|
||||
Use: "disable <thing_id> <user_auth_token>",
|
||||
Use: "disable <thing_id> <domain_id> <user_auth_token>",
|
||||
Short: "Change thing status to disabled",
|
||||
Long: "Change thing status to disabled\n" +
|
||||
"Usage:\n" +
|
||||
"\tmagistrala-cli things disable <thing_id> $USERTOKEN\n",
|
||||
"\tmagistrala-cli things disable <thing_id> $DOMAINID $USERTOKEN\n",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 2 {
|
||||
if len(args) != 3 {
|
||||
logUsageCmd(*cmd, cmd.Use)
|
||||
return
|
||||
}
|
||||
|
||||
thing, err := sdk.DisableThing(args[0], args[1])
|
||||
thing, err := sdk.DisableThing(args[0], args[1], args[2])
|
||||
if err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
@@ -198,13 +198,13 @@ var cmdThings = []cobra.Command{
|
||||
},
|
||||
},
|
||||
{
|
||||
Use: "share <thing_id> <user_id> <relation> <user_auth_token>",
|
||||
Use: "share <thing_id> <user_id> <relation> <domain_id> <user_auth_token>",
|
||||
Short: "Share thing with a user",
|
||||
Long: "Share thing with a user\n" +
|
||||
"Usage:\n" +
|
||||
"\tmagistrala-cli things share <thing_id> <user_id> <relation> $USERTOKEN\n",
|
||||
"\tmagistrala-cli things share <thing_id> <user_id> <relation> $DOMAINID $USERTOKEN\n",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 4 {
|
||||
if len(args) != 5 {
|
||||
logUsageCmd(*cmd, cmd.Use)
|
||||
return
|
||||
}
|
||||
@@ -212,7 +212,7 @@ var cmdThings = []cobra.Command{
|
||||
Relation: args[2],
|
||||
UserIDs: []string{args[1]},
|
||||
}
|
||||
err := sdk.ShareThing(args[0], req, args[3])
|
||||
err := sdk.ShareThing(args[0], req, args[3], args[4])
|
||||
if err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
@@ -222,13 +222,13 @@ var cmdThings = []cobra.Command{
|
||||
},
|
||||
},
|
||||
{
|
||||
Use: "unshare <thing_id> <user_id> <relation> <user_auth_token>",
|
||||
Use: "unshare <thing_id> <user_id> <relation> <domain_id> <user_auth_token>",
|
||||
Short: "Unshare thing with a user",
|
||||
Long: "Unshare thing with a user\n" +
|
||||
"Usage:\n" +
|
||||
"\tmagistrala-cli things share <thing_id> <user_id> <relation> $USERTOKEN\n",
|
||||
"\tmagistrala-cli things share <thing_id> <user_id> <relation> $DOMAINID $USERTOKEN\n",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 4 {
|
||||
if len(args) != 5 {
|
||||
logUsageCmd(*cmd, cmd.Use)
|
||||
return
|
||||
}
|
||||
@@ -236,7 +236,7 @@ var cmdThings = []cobra.Command{
|
||||
Relation: args[2],
|
||||
UserIDs: []string{args[1]},
|
||||
}
|
||||
err := sdk.UnshareThing(args[0], req, args[3])
|
||||
err := sdk.UnshareThing(args[0], req, args[3], args[4])
|
||||
if err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
@@ -246,13 +246,13 @@ var cmdThings = []cobra.Command{
|
||||
},
|
||||
},
|
||||
{
|
||||
Use: "connect <thing_id> <channel_id> <user_auth_token>",
|
||||
Use: "connect <thing_id> <channel_id> <domain_id> <user_auth_token>",
|
||||
Short: "Connect thing",
|
||||
Long: "Connect thing to the channel\n" +
|
||||
"Usage:\n" +
|
||||
"\tmagistrala-cli things connect <thing_id> <channel_id> $USERTOKEN\n",
|
||||
"\tmagistrala-cli things connect <thing_id> <channel_id> $DOMAINID $USERTOKEN\n",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 3 {
|
||||
if len(args) != 4 {
|
||||
logUsageCmd(*cmd, cmd.Use)
|
||||
return
|
||||
}
|
||||
@@ -261,7 +261,7 @@ var cmdThings = []cobra.Command{
|
||||
ChannelID: args[1],
|
||||
ThingID: args[0],
|
||||
}
|
||||
if err := sdk.Connect(connIDs, args[2]); err != nil {
|
||||
if err := sdk.Connect(connIDs, args[2], args[3]); err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
}
|
||||
@@ -270,13 +270,13 @@ var cmdThings = []cobra.Command{
|
||||
},
|
||||
},
|
||||
{
|
||||
Use: "disconnect <thing_id> <channel_id> <user_auth_token>",
|
||||
Use: "disconnect <thing_id> <channel_id> <domain_id> <user_auth_token>",
|
||||
Short: "Disconnect thing",
|
||||
Long: "Disconnect thing to the channel\n" +
|
||||
"Usage:\n" +
|
||||
"\tmagistrala-cli things disconnect <thing_id> <channel_id> $USERTOKEN\n",
|
||||
"\tmagistrala-cli things disconnect <thing_id> <channel_id> $DOMAINID $USERTOKEN\n",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 3 {
|
||||
if len(args) != 4 {
|
||||
logUsageCmd(*cmd, cmd.Use)
|
||||
return
|
||||
}
|
||||
@@ -285,7 +285,7 @@ var cmdThings = []cobra.Command{
|
||||
ThingID: args[0],
|
||||
ChannelID: args[1],
|
||||
}
|
||||
if err := sdk.Disconnect(connIDs, args[2]); err != nil {
|
||||
if err := sdk.Disconnect(connIDs, args[2], args[3]); err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
}
|
||||
@@ -294,13 +294,13 @@ var cmdThings = []cobra.Command{
|
||||
},
|
||||
},
|
||||
{
|
||||
Use: "connections <thing_id> <user_auth_token>",
|
||||
Use: "connections <thing_id> <domain_id> <user_auth_token>",
|
||||
Short: "Connected list",
|
||||
Long: "List of Channels connected to Thing\n" +
|
||||
"Usage:\n" +
|
||||
"\tmagistrala-cli connections <thing_id> $USERTOKEN\n",
|
||||
"\tmagistrala-cli connections <thing_id> $DOMAINID $USERTOKEN\n",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 2 {
|
||||
if len(args) != 3 {
|
||||
logUsageCmd(*cmd, cmd.Use)
|
||||
return
|
||||
}
|
||||
@@ -308,7 +308,7 @@ var cmdThings = []cobra.Command{
|
||||
Offset: Offset,
|
||||
Limit: Limit,
|
||||
}
|
||||
cl, err := sdk.ChannelsByThing(args[0], pm, args[1])
|
||||
cl, err := sdk.ChannelsByThing(args[0], pm, args[1], args[2])
|
||||
if err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
@@ -318,21 +318,22 @@ var cmdThings = []cobra.Command{
|
||||
},
|
||||
},
|
||||
{
|
||||
Use: "users <thing_id> <user_auth_token>",
|
||||
Use: "users <thing_id> <domain_id> <user_auth_token>",
|
||||
Short: "List users",
|
||||
Long: "List users of a thing\n" +
|
||||
"Usage:\n" +
|
||||
"\tmagistrala-cli things users <thing_id> $USERTOKEN\n",
|
||||
"\tmagistrala-cli things users <thing_id> $DOMAINID $USERTOKEN\n",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 2 {
|
||||
if len(args) != 3 {
|
||||
logUsageCmd(*cmd, cmd.Use)
|
||||
return
|
||||
}
|
||||
pm := mgxsdk.PageMetadata{
|
||||
Offset: Offset,
|
||||
Limit: Limit,
|
||||
Offset: Offset,
|
||||
Limit: Limit,
|
||||
DomainID: args[1],
|
||||
}
|
||||
ul, err := sdk.ListThingUsers(args[0], pm, args[1])
|
||||
ul, err := sdk.ListThingUsers(args[0], pm, args[2])
|
||||
if err != nil {
|
||||
logErrorCmd(*cmd, err)
|
||||
return
|
||||
|
||||
+80
-50
@@ -24,6 +24,7 @@ import (
|
||||
|
||||
var (
|
||||
token = "valid" + "domaintoken"
|
||||
domainID = "domain-id"
|
||||
tokenWithoutDomain = "valid"
|
||||
relation = "administrator"
|
||||
all = "all"
|
||||
@@ -60,6 +61,7 @@ func TestCreateThingsCmd(t *testing.T) {
|
||||
desc: "create thing successfully with token",
|
||||
args: []string{
|
||||
thingJson,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
thing: thing,
|
||||
@@ -69,6 +71,7 @@ func TestCreateThingsCmd(t *testing.T) {
|
||||
desc: "create thing without token",
|
||||
args: []string{
|
||||
thingJson,
|
||||
domainID,
|
||||
},
|
||||
logType: usageLog,
|
||||
},
|
||||
@@ -76,6 +79,7 @@ func TestCreateThingsCmd(t *testing.T) {
|
||||
desc: "create thing with invalid token",
|
||||
args: []string{
|
||||
thingJson,
|
||||
domainID,
|
||||
invalidToken,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusUnauthorized),
|
||||
@@ -86,26 +90,18 @@ func TestCreateThingsCmd(t *testing.T) {
|
||||
desc: "failed to create thing",
|
||||
args: []string{
|
||||
thingJson,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrCreateEntity, http.StatusUnprocessableEntity),
|
||||
errLogMessage: fmt.Sprintf("\nerror: %s\n\n", errors.NewSDKErrorWithStatus(svcerr.ErrCreateEntity, http.StatusUnprocessableEntity)),
|
||||
logType: errLog,
|
||||
},
|
||||
{
|
||||
desc: "create thing without domain token",
|
||||
args: []string{
|
||||
thingJson,
|
||||
tokenWithoutDomain,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrDomainAuthorization, http.StatusForbidden),
|
||||
errLogMessage: fmt.Sprintf("\nerror: %s\n\n", errors.NewSDKErrorWithStatus(svcerr.ErrDomainAuthorization, http.StatusForbidden)),
|
||||
logType: errLog,
|
||||
},
|
||||
{
|
||||
desc: "create thing with invalid metadata",
|
||||
args: []string{
|
||||
"{\"name\":\"testthing\", \"metadata\":{\"key1\":value1}}",
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(errors.New("invalid character 'v' looking for beginning of value"), 306),
|
||||
@@ -116,7 +112,7 @@ func TestCreateThingsCmd(t *testing.T) {
|
||||
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
sdkCall := sdkMock.On("CreateThing", mock.Anything, mock.Anything).Return(tc.thing, tc.sdkErr)
|
||||
sdkCall := sdkMock.On("CreateThing", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(tc.thing, tc.sdkErr)
|
||||
out := executeCommand(t, rootCmd, append([]string{createCmd}, tc.args...)...)
|
||||
|
||||
switch tc.logType {
|
||||
@@ -157,6 +153,7 @@ func TestGetThingsCmd(t *testing.T) {
|
||||
desc: "get all things successfully",
|
||||
args: []string{
|
||||
all,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
logType: entityLog,
|
||||
@@ -168,6 +165,7 @@ func TestGetThingsCmd(t *testing.T) {
|
||||
desc: "get thing successfully with id",
|
||||
args: []string{
|
||||
thing.ID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
logType: entityLog,
|
||||
@@ -177,6 +175,7 @@ func TestGetThingsCmd(t *testing.T) {
|
||||
desc: "get things with invalid token",
|
||||
args: []string{
|
||||
all,
|
||||
domainID,
|
||||
invalidToken,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden),
|
||||
@@ -184,16 +183,6 @@ func TestGetThingsCmd(t *testing.T) {
|
||||
page: sdk.ThingsPage{},
|
||||
logType: errLog,
|
||||
},
|
||||
{
|
||||
desc: "get thing without domain token",
|
||||
args: []string{
|
||||
all,
|
||||
tokenWithoutDomain,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrDomainAuthorization, http.StatusForbidden),
|
||||
errLogMessage: fmt.Sprintf("\nerror: %s\n\n", errors.NewSDKErrorWithStatus(svcerr.ErrDomainAuthorization, http.StatusForbidden)),
|
||||
logType: errLog,
|
||||
},
|
||||
{
|
||||
desc: "get things with invalid args",
|
||||
args: []string{
|
||||
@@ -212,6 +201,7 @@ func TestGetThingsCmd(t *testing.T) {
|
||||
desc: "get thing without token",
|
||||
args: []string{
|
||||
all,
|
||||
domainID,
|
||||
},
|
||||
logType: usageLog,
|
||||
},
|
||||
@@ -219,6 +209,7 @@ func TestGetThingsCmd(t *testing.T) {
|
||||
desc: "get thing with invalid thing id",
|
||||
args: []string{
|
||||
invalidID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden),
|
||||
@@ -229,8 +220,8 @@ func TestGetThingsCmd(t *testing.T) {
|
||||
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
sdkCall := sdkMock.On("Things", mock.Anything, mock.Anything).Return(tc.page, tc.sdkErr)
|
||||
sdkCall1 := sdkMock.On("Thing", mock.Anything, mock.Anything).Return(tc.thing, tc.sdkErr)
|
||||
sdkCall := sdkMock.On("Things", mock.Anything, mock.Anything, mock.Anything).Return(tc.page, tc.sdkErr)
|
||||
sdkCall1 := sdkMock.On("Thing", mock.Anything, mock.Anything, mock.Anything).Return(tc.thing, tc.sdkErr)
|
||||
|
||||
out := executeCommand(t, rootCmd, append([]string{getCmd}, tc.args...)...)
|
||||
|
||||
@@ -296,6 +287,7 @@ func TestUpdateThingCmd(t *testing.T) {
|
||||
args: []string{
|
||||
thing.ID,
|
||||
newNameandMeta,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
thing: sdk.Thing{
|
||||
@@ -316,6 +308,7 @@ func TestUpdateThingCmd(t *testing.T) {
|
||||
args: []string{
|
||||
thing.ID,
|
||||
"{\"name\": \"thingName\", \"metadata\": {\"role\": \"general\"}",
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKError(errors.New("unexpected end of JSON input")),
|
||||
@@ -327,6 +320,7 @@ func TestUpdateThingCmd(t *testing.T) {
|
||||
args: []string{
|
||||
invalidID,
|
||||
newNameandMeta,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden),
|
||||
@@ -339,6 +333,7 @@ func TestUpdateThingCmd(t *testing.T) {
|
||||
tagUpdateType,
|
||||
thing.ID,
|
||||
newTagsJson,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
thing: sdk.Thing{
|
||||
@@ -356,6 +351,7 @@ func TestUpdateThingCmd(t *testing.T) {
|
||||
tagUpdateType,
|
||||
thing.ID,
|
||||
"[\"tag1\", \"tag2\"",
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
logType: errLog,
|
||||
@@ -368,6 +364,7 @@ func TestUpdateThingCmd(t *testing.T) {
|
||||
tagUpdateType,
|
||||
invalidID,
|
||||
newTagsJson,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden),
|
||||
@@ -380,6 +377,7 @@ func TestUpdateThingCmd(t *testing.T) {
|
||||
secretUpdateType,
|
||||
thing.ID,
|
||||
newSecret,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
thing: sdk.Thing{
|
||||
@@ -399,6 +397,7 @@ func TestUpdateThingCmd(t *testing.T) {
|
||||
secretUpdateType,
|
||||
thing.ID,
|
||||
"",
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(errors.Wrap(apiutil.ErrValidation, apiutil.ErrMissingSecret), http.StatusBadRequest),
|
||||
@@ -411,6 +410,7 @@ func TestUpdateThingCmd(t *testing.T) {
|
||||
secretUpdateType,
|
||||
thing.ID,
|
||||
newSecret,
|
||||
domainID,
|
||||
invalidToken,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden),
|
||||
@@ -423,6 +423,7 @@ func TestUpdateThingCmd(t *testing.T) {
|
||||
secretUpdateType,
|
||||
thing.ID,
|
||||
newSecret,
|
||||
domainID,
|
||||
token,
|
||||
extraArg,
|
||||
},
|
||||
@@ -433,9 +434,9 @@ func TestUpdateThingCmd(t *testing.T) {
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
var tg sdk.Thing
|
||||
sdkCall := sdkMock.On("UpdateThing", mock.Anything, mock.Anything).Return(tc.thing, tc.sdkErr)
|
||||
sdkCall1 := sdkMock.On("UpdateThingTags", mock.Anything, mock.Anything).Return(tc.thing, tc.sdkErr)
|
||||
sdkCall2 := sdkMock.On("UpdateThingSecret", mock.Anything, mock.Anything, mock.Anything).Return(tc.thing, tc.sdkErr)
|
||||
sdkCall := sdkMock.On("UpdateThing", mock.Anything, mock.Anything, mock.Anything).Return(tc.thing, tc.sdkErr)
|
||||
sdkCall1 := sdkMock.On("UpdateThingTags", mock.Anything, mock.Anything, mock.Anything).Return(tc.thing, tc.sdkErr)
|
||||
sdkCall2 := sdkMock.On("UpdateThingSecret", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(tc.thing, tc.sdkErr)
|
||||
|
||||
switch {
|
||||
case tc.args[0] == tagUpdateType:
|
||||
@@ -488,6 +489,7 @@ func TestDeleteThingCmd(t *testing.T) {
|
||||
desc: "delete thing successfully",
|
||||
args: []string{
|
||||
thing.ID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
logType: okLog,
|
||||
@@ -496,6 +498,7 @@ func TestDeleteThingCmd(t *testing.T) {
|
||||
desc: "delete thing with invalid token",
|
||||
args: []string{
|
||||
thing.ID,
|
||||
domainID,
|
||||
invalidToken,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden),
|
||||
@@ -506,6 +509,7 @@ func TestDeleteThingCmd(t *testing.T) {
|
||||
desc: "delete thing with invalid thing id",
|
||||
args: []string{
|
||||
invalidID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden),
|
||||
@@ -516,6 +520,7 @@ func TestDeleteThingCmd(t *testing.T) {
|
||||
desc: "delete thing with invalid args",
|
||||
args: []string{
|
||||
thing.ID,
|
||||
domainID,
|
||||
token,
|
||||
extraArg,
|
||||
},
|
||||
@@ -525,7 +530,7 @@ func TestDeleteThingCmd(t *testing.T) {
|
||||
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
sdkCall := sdkMock.On("DeleteThing", tc.args[0], tc.args[1]).Return(tc.sdkErr)
|
||||
sdkCall := sdkMock.On("DeleteThing", tc.args[0], tc.args[1], tc.args[2]).Return(tc.sdkErr)
|
||||
out := executeCommand(t, rootCmd, append([]string{delCmd}, tc.args...)...)
|
||||
|
||||
switch tc.logType {
|
||||
@@ -560,6 +565,7 @@ func TestEnableThingCmd(t *testing.T) {
|
||||
desc: "enable thing successfully",
|
||||
args: []string{
|
||||
thing.ID,
|
||||
domainID,
|
||||
validToken,
|
||||
},
|
||||
sdkErr: nil,
|
||||
@@ -570,6 +576,7 @@ func TestEnableThingCmd(t *testing.T) {
|
||||
desc: "delete thing with invalid token",
|
||||
args: []string{
|
||||
thing.ID,
|
||||
domainID,
|
||||
invalidToken,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden),
|
||||
@@ -580,6 +587,7 @@ func TestEnableThingCmd(t *testing.T) {
|
||||
desc: "delete thing with invalid thing ID",
|
||||
args: []string{
|
||||
invalidID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden),
|
||||
@@ -590,6 +598,7 @@ func TestEnableThingCmd(t *testing.T) {
|
||||
desc: "enable thing with invalid args",
|
||||
args: []string{
|
||||
thing.ID,
|
||||
domainID,
|
||||
validToken,
|
||||
extraArg,
|
||||
},
|
||||
@@ -599,7 +608,7 @@ func TestEnableThingCmd(t *testing.T) {
|
||||
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
sdkCall := sdkMock.On("EnableThing", tc.args[0], tc.args[1]).Return(tc.thing, tc.sdkErr)
|
||||
sdkCall := sdkMock.On("EnableThing", tc.args[0], tc.args[1], tc.args[2]).Return(tc.thing, tc.sdkErr)
|
||||
out := executeCommand(t, rootCmd, append([]string{enableCmd}, tc.args...)...)
|
||||
|
||||
switch tc.logType {
|
||||
@@ -638,6 +647,7 @@ func TestDisablethingCmd(t *testing.T) {
|
||||
desc: "disable thing successfully",
|
||||
args: []string{
|
||||
thing.ID,
|
||||
domainID,
|
||||
validToken,
|
||||
},
|
||||
logType: entityLog,
|
||||
@@ -647,6 +657,7 @@ func TestDisablethingCmd(t *testing.T) {
|
||||
desc: "delete thing with invalid token",
|
||||
args: []string{
|
||||
thing.ID,
|
||||
domainID,
|
||||
invalidToken,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden),
|
||||
@@ -657,6 +668,7 @@ func TestDisablethingCmd(t *testing.T) {
|
||||
desc: "delete thing with invalid thing ID",
|
||||
args: []string{
|
||||
invalidID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden),
|
||||
@@ -667,6 +679,7 @@ func TestDisablethingCmd(t *testing.T) {
|
||||
desc: "disable thing with invalid args",
|
||||
args: []string{
|
||||
thing.ID,
|
||||
domainID,
|
||||
validToken,
|
||||
extraArg,
|
||||
},
|
||||
@@ -676,7 +689,7 @@ func TestDisablethingCmd(t *testing.T) {
|
||||
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
sdkCall := sdkMock.On("DisableThing", tc.args[0], tc.args[1]).Return(tc.thing, tc.sdkErr)
|
||||
sdkCall := sdkMock.On("DisableThing", tc.args[0], tc.args[1], tc.args[2]).Return(tc.thing, tc.sdkErr)
|
||||
out := executeCommand(t, rootCmd, append([]string{disableCmd}, tc.args...)...)
|
||||
|
||||
switch tc.logType {
|
||||
@@ -717,6 +730,7 @@ func TestUsersThingCmd(t *testing.T) {
|
||||
desc: "get thing's users successfully",
|
||||
args: []string{
|
||||
thing.ID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
page: sdk.UsersPage{
|
||||
@@ -733,16 +747,18 @@ func TestUsersThingCmd(t *testing.T) {
|
||||
desc: "list thing users' with invalid args",
|
||||
args: []string{
|
||||
thing.ID,
|
||||
domainID,
|
||||
token,
|
||||
extraArg,
|
||||
},
|
||||
logType: usageLog,
|
||||
},
|
||||
{
|
||||
desc: "list thing users' without domain token",
|
||||
desc: "list thing users' with invalid domain",
|
||||
args: []string{
|
||||
thing.ID,
|
||||
tokenWithoutDomain,
|
||||
invalidID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrDomainAuthorization, http.StatusForbidden),
|
||||
errLogMessage: fmt.Sprintf("\nerror: %s\n\n", errors.NewSDKErrorWithStatus(svcerr.ErrDomainAuthorization, http.StatusForbidden)),
|
||||
@@ -752,22 +768,13 @@ func TestUsersThingCmd(t *testing.T) {
|
||||
desc: "list thing users with invalid id",
|
||||
args: []string{
|
||||
invalidID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden),
|
||||
errLogMessage: fmt.Sprintf("\nerror: %s\n\n", errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden)),
|
||||
logType: errLog,
|
||||
},
|
||||
{
|
||||
desc: "list thing users' without domain token",
|
||||
args: []string{
|
||||
thing.ID,
|
||||
tokenWithoutDomain,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrDomainAuthorization, http.StatusForbidden),
|
||||
errLogMessage: fmt.Sprintf("\nerror: %s\n\n", errors.NewSDKErrorWithStatus(svcerr.ErrDomainAuthorization, http.StatusForbidden)),
|
||||
logType: errLog,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
@@ -810,6 +817,7 @@ func TestConnectThingCmd(t *testing.T) {
|
||||
args: []string{
|
||||
thing.ID,
|
||||
channel.ID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
logType: okLog,
|
||||
@@ -819,6 +827,7 @@ func TestConnectThingCmd(t *testing.T) {
|
||||
args: []string{
|
||||
thing.ID,
|
||||
channel.ID,
|
||||
domainID,
|
||||
token,
|
||||
extraArg,
|
||||
},
|
||||
@@ -829,6 +838,7 @@ func TestConnectThingCmd(t *testing.T) {
|
||||
args: []string{
|
||||
invalidID,
|
||||
channel.ID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAddPolicies, http.StatusBadRequest),
|
||||
@@ -840,6 +850,7 @@ func TestConnectThingCmd(t *testing.T) {
|
||||
args: []string{
|
||||
thing.ID,
|
||||
invalidID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden),
|
||||
@@ -847,11 +858,12 @@ func TestConnectThingCmd(t *testing.T) {
|
||||
logType: errLog,
|
||||
},
|
||||
{
|
||||
desc: "list thing users' without domain token",
|
||||
desc: "list thing users' with invalid domain",
|
||||
args: []string{
|
||||
thing.ID,
|
||||
channel.ID,
|
||||
tokenWithoutDomain,
|
||||
invalidID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrDomainAuthorization, http.StatusForbidden),
|
||||
errLogMessage: fmt.Sprintf("\nerror: %s\n\n", errors.NewSDKErrorWithStatus(svcerr.ErrDomainAuthorization, http.StatusForbidden)),
|
||||
@@ -861,7 +873,7 @@ func TestConnectThingCmd(t *testing.T) {
|
||||
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
sdkCall := sdkMock.On("Connect", mock.Anything, tc.args[2]).Return(tc.sdkErr)
|
||||
sdkCall := sdkMock.On("Connect", mock.Anything, tc.args[2], tc.args[3]).Return(tc.sdkErr)
|
||||
out := executeCommand(t, rootCmd, append([]string{connCmd}, tc.args...)...)
|
||||
|
||||
switch tc.logType {
|
||||
@@ -895,6 +907,7 @@ func TestDisconnectThingCmd(t *testing.T) {
|
||||
args: []string{
|
||||
thing.ID,
|
||||
channel.ID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
logType: okLog,
|
||||
@@ -904,6 +917,7 @@ func TestDisconnectThingCmd(t *testing.T) {
|
||||
args: []string{
|
||||
thing.ID,
|
||||
channel.ID,
|
||||
domainID,
|
||||
token,
|
||||
extraArg,
|
||||
},
|
||||
@@ -914,6 +928,7 @@ func TestDisconnectThingCmd(t *testing.T) {
|
||||
args: []string{
|
||||
invalidID,
|
||||
channel.ID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAddPolicies, http.StatusBadRequest),
|
||||
@@ -925,6 +940,7 @@ func TestDisconnectThingCmd(t *testing.T) {
|
||||
args: []string{
|
||||
thing.ID,
|
||||
invalidID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden),
|
||||
@@ -932,11 +948,12 @@ func TestDisconnectThingCmd(t *testing.T) {
|
||||
logType: errLog,
|
||||
},
|
||||
{
|
||||
desc: "disconnect thing without domain token",
|
||||
desc: "disconnect thing with invalid domain",
|
||||
args: []string{
|
||||
thing.ID,
|
||||
channel.ID,
|
||||
tokenWithoutDomain,
|
||||
invalidID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrDomainAuthorization, http.StatusForbidden),
|
||||
errLogMessage: fmt.Sprintf("\nerror: %s\n\n", errors.NewSDKErrorWithStatus(svcerr.ErrDomainAuthorization, http.StatusForbidden)),
|
||||
@@ -946,7 +963,7 @@ func TestDisconnectThingCmd(t *testing.T) {
|
||||
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
sdkCall := sdkMock.On("Disconnect", mock.Anything, tc.args[2]).Return(tc.sdkErr)
|
||||
sdkCall := sdkMock.On("Disconnect", mock.Anything, tc.args[2], tc.args[3]).Return(tc.sdkErr)
|
||||
out := executeCommand(t, rootCmd, append([]string{disconnCmd}, tc.args...)...)
|
||||
|
||||
switch tc.logType {
|
||||
@@ -981,6 +998,7 @@ func TestListConnectionCmd(t *testing.T) {
|
||||
desc: "list connections successfully",
|
||||
args: []string{
|
||||
thing.ID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
page: sdk.ChannelsPage{
|
||||
@@ -997,6 +1015,7 @@ func TestListConnectionCmd(t *testing.T) {
|
||||
desc: "list connections with invalid args",
|
||||
args: []string{
|
||||
thing.ID,
|
||||
domainID,
|
||||
token,
|
||||
extraArg,
|
||||
},
|
||||
@@ -1006,6 +1025,7 @@ func TestListConnectionCmd(t *testing.T) {
|
||||
desc: "list connections with invalid thing ID",
|
||||
args: []string{
|
||||
invalidID,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden),
|
||||
@@ -1016,6 +1036,7 @@ func TestListConnectionCmd(t *testing.T) {
|
||||
desc: "list connections with invalid token",
|
||||
args: []string{
|
||||
thing.ID,
|
||||
domainID,
|
||||
invalidToken,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusUnauthorized),
|
||||
@@ -1025,7 +1046,7 @@ func TestListConnectionCmd(t *testing.T) {
|
||||
}
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
sdkCall := sdkMock.On("ChannelsByThing", tc.args[0], mock.Anything, tc.args[1]).Return(tc.page, tc.sdkErr)
|
||||
sdkCall := sdkMock.On("ChannelsByThing", tc.args[0], mock.Anything, tc.args[1], tc.args[2]).Return(tc.page, tc.sdkErr)
|
||||
out := executeCommand(t, rootCmd, append([]string{connsCmd}, tc.args...)...)
|
||||
|
||||
switch tc.logType {
|
||||
@@ -1065,6 +1086,7 @@ func TestShareThingCmd(t *testing.T) {
|
||||
thing.ID,
|
||||
user.ID,
|
||||
relation,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
logType: okLog,
|
||||
@@ -1075,6 +1097,7 @@ func TestShareThingCmd(t *testing.T) {
|
||||
thing.ID,
|
||||
invalidID,
|
||||
relation,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAddPolicies, http.StatusBadRequest),
|
||||
@@ -1087,6 +1110,7 @@ func TestShareThingCmd(t *testing.T) {
|
||||
invalidID,
|
||||
user.ID,
|
||||
relation,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden),
|
||||
@@ -1099,6 +1123,7 @@ func TestShareThingCmd(t *testing.T) {
|
||||
thing.ID,
|
||||
user.ID,
|
||||
relation,
|
||||
domainID,
|
||||
token,
|
||||
extraArg,
|
||||
},
|
||||
@@ -1110,6 +1135,7 @@ func TestShareThingCmd(t *testing.T) {
|
||||
thing.ID,
|
||||
user.ID,
|
||||
"invalid",
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrUpdateEntity, http.StatusBadRequest),
|
||||
@@ -1119,7 +1145,7 @@ func TestShareThingCmd(t *testing.T) {
|
||||
}
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
sdkCall := sdkMock.On("ShareThing", tc.args[0], mock.Anything, tc.args[3]).Return(tc.sdkErr)
|
||||
sdkCall := sdkMock.On("ShareThing", tc.args[0], mock.Anything, tc.args[3], tc.args[4]).Return(tc.sdkErr)
|
||||
out := executeCommand(t, rootCmd, append([]string{shrCmd}, tc.args...)...)
|
||||
|
||||
switch tc.logType {
|
||||
@@ -1154,6 +1180,7 @@ func TestUnshareThingCmd(t *testing.T) {
|
||||
thing.ID,
|
||||
user.ID,
|
||||
relation,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
logType: okLog,
|
||||
@@ -1164,6 +1191,7 @@ func TestUnshareThingCmd(t *testing.T) {
|
||||
invalidID,
|
||||
user.ID,
|
||||
relation,
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrAuthorization, http.StatusForbidden),
|
||||
@@ -1176,6 +1204,7 @@ func TestUnshareThingCmd(t *testing.T) {
|
||||
thing.ID,
|
||||
user.ID,
|
||||
relation,
|
||||
domainID,
|
||||
token,
|
||||
extraArg,
|
||||
},
|
||||
@@ -1187,6 +1216,7 @@ func TestUnshareThingCmd(t *testing.T) {
|
||||
thing.ID,
|
||||
user.ID,
|
||||
"invalid",
|
||||
domainID,
|
||||
token,
|
||||
},
|
||||
sdkErr: errors.NewSDKErrorWithStatus(svcerr.ErrUpdateEntity, http.StatusBadRequest),
|
||||
@@ -1196,7 +1226,7 @@ func TestUnshareThingCmd(t *testing.T) {
|
||||
}
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
sdkCall := sdkMock.On("UnshareThing", tc.args[0], mock.Anything, tc.args[3]).Return(tc.sdkErr)
|
||||
sdkCall := sdkMock.On("UnshareThing", tc.args[0], mock.Anything, tc.args[3], tc.args[4]).Return(tc.sdkErr)
|
||||
out := executeCommand(t, rootCmd, append([]string{unshrCmd}, tc.args...)...)
|
||||
|
||||
switch tc.logType {
|
||||
|
||||
@@ -75,7 +75,6 @@ func MakeHandler(svc notifiers.Service, logger *slog.Logger, instanceID string)
|
||||
opts...,
|
||||
), "delete").ServeHTTP)
|
||||
})
|
||||
|
||||
mux.Get("/health", magistrala.Health("notifier", instanceID))
|
||||
mux.Handle("/metrics", promhttp.Handler())
|
||||
|
||||
|
||||
@@ -46,7 +46,6 @@ func MakeHandler(logger *slog.Logger, instanceID string) http.Handler {
|
||||
api.EncodeResponse,
|
||||
opts...,
|
||||
), "publish").ServeHTTP)
|
||||
|
||||
r.Get("/health", magistrala.Health("http", instanceID))
|
||||
r.Handle("/metrics", promhttp.Handler())
|
||||
|
||||
@@ -60,7 +59,6 @@ func decodeRequest(_ context.Context, r *http.Request) (interface{}, error) {
|
||||
}
|
||||
|
||||
var req publishReq
|
||||
|
||||
_, pass, ok := r.BasicAuth()
|
||||
switch {
|
||||
case ok:
|
||||
|
||||
@@ -9,6 +9,7 @@ import (
|
||||
|
||||
"github.com/absmach/magistrala/pkg/apiutil"
|
||||
mgauthn "github.com/absmach/magistrala/pkg/authn"
|
||||
"github.com/go-chi/chi/v5"
|
||||
)
|
||||
|
||||
type sessionKeyType string
|
||||
@@ -36,3 +37,36 @@ func AuthenticateMiddleware(authn mgauthn.Authentication) func(http.Handler) htt
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func AuthenticateMiddlewareDomain(authn mgauthn.Authentication) func(http.Handler) http.Handler {
|
||||
return func(next http.Handler) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
token := apiutil.ExtractBearerToken(r)
|
||||
if token == "" {
|
||||
EncodeError(r.Context(), apiutil.ErrBearerToken, w)
|
||||
return
|
||||
}
|
||||
domain := chi.URLParam(r, "domainID")
|
||||
if domain == "" {
|
||||
EncodeError(r.Context(), apiutil.ErrMissingDomainID, w)
|
||||
return
|
||||
}
|
||||
|
||||
resp, err := authn.Authenticate(r.Context(), token)
|
||||
if err != nil {
|
||||
EncodeError(r.Context(), err, w)
|
||||
return
|
||||
}
|
||||
|
||||
if domain != resp.DomainID {
|
||||
resp = mgauthn.Session{}
|
||||
EncodeError(r.Context(), apiutil.ErrValidation, w)
|
||||
return
|
||||
}
|
||||
|
||||
ctx := context.WithValue(r.Context(), SessionKey, resp)
|
||||
|
||||
next.ServeHTTP(w, r.WithContext(ctx))
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -164,6 +164,7 @@ func EncodeError(_ context.Context, err error, w http.ResponseWriter) {
|
||||
errors.Contains(err, svcerr.ErrSearch),
|
||||
errors.Contains(err, apiutil.ErrEmptySearchQuery),
|
||||
errors.Contains(err, apiutil.ErrLenSearchQuery),
|
||||
errors.Contains(err, apiutil.ErrMissingDomainID),
|
||||
errors.Contains(err, certs.ErrFailedReadFromPKI):
|
||||
err = unwrap(err)
|
||||
w.WriteHeader(http.StatusBadRequest)
|
||||
|
||||
@@ -105,7 +105,7 @@ func acceptInvitationEndpoint(svc invitations.Service) endpoint.Endpoint {
|
||||
return nil, svcerr.ErrAuthorization
|
||||
}
|
||||
|
||||
if err := svc.AcceptInvitation(ctx, session, req.DomainID); err != nil {
|
||||
if err := svc.AcceptInvitation(ctx, session, req.domainID); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -125,7 +125,7 @@ func rejectInvitationEndpoint(svc invitations.Service) endpoint.Endpoint {
|
||||
return nil, svcerr.ErrAuthorization
|
||||
}
|
||||
|
||||
if err := svc.RejectInvitation(ctx, session, req.DomainID); err != nil {
|
||||
if err := svc.RejectInvitation(ctx, session, req.domainID); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
|
||||
+155
-119
@@ -28,6 +28,7 @@ var (
|
||||
validToken = "valid"
|
||||
validContenType = "application/json"
|
||||
validID = testsutil.GenerateUUID(&testing.T{})
|
||||
domainID = testsutil.GenerateUUID(&testing.T{})
|
||||
)
|
||||
|
||||
type testRequest struct {
|
||||
@@ -69,6 +70,7 @@ func TestSendInvitation(t *testing.T) {
|
||||
|
||||
cases := []struct {
|
||||
desc string
|
||||
domainID string
|
||||
token string
|
||||
data string
|
||||
contentType string
|
||||
@@ -79,8 +81,9 @@ func TestSendInvitation(t *testing.T) {
|
||||
}{
|
||||
{
|
||||
desc: "valid request",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
data: fmt.Sprintf(`{"user_id": "%s", "domain_id": "%s", "relation": "%s"}`, validID, validID, "domain"),
|
||||
data: fmt.Sprintf(`{"user_id": "%s", "relation": "%s"}`, validID, "domain"),
|
||||
authnRes: mgauthn.Session{UserID: validID, DomainID: validID},
|
||||
status: http.StatusCreated,
|
||||
contentType: validContenType,
|
||||
@@ -88,22 +91,34 @@ func TestSendInvitation(t *testing.T) {
|
||||
},
|
||||
{
|
||||
desc: "invalid token",
|
||||
domainID: domainID,
|
||||
token: "",
|
||||
data: fmt.Sprintf(`{"user_id": "%s", "domain_id": "%s", "relation": "%s"}`, validID, validID, "domain"),
|
||||
data: fmt.Sprintf(`{"user_id": "%s", "relation": "%s"}`, validID, "domain"),
|
||||
status: http.StatusUnauthorized,
|
||||
contentType: validContenType,
|
||||
svcErr: nil,
|
||||
},
|
||||
{
|
||||
desc: "invalid content type",
|
||||
desc: "empty domain_id",
|
||||
domainID: "",
|
||||
token: validToken,
|
||||
data: fmt.Sprintf(`{"user_id": "%s", "domain_id": "%s", "relation": "%s"}`, validID, validID, "domain"),
|
||||
data: fmt.Sprintf(`{"user_id": "%s", "relation": "%s"}`, validID, "domain"),
|
||||
status: http.StatusBadRequest,
|
||||
contentType: validContenType,
|
||||
svcErr: nil,
|
||||
},
|
||||
{
|
||||
desc: "invalid content type",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
data: fmt.Sprintf(`{"user_id": "%s", "relation": "%s"}`, validID, "domain"),
|
||||
status: http.StatusUnsupportedMediaType,
|
||||
contentType: "text/plain",
|
||||
svcErr: nil,
|
||||
},
|
||||
{
|
||||
desc: "invalid data",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
data: `data`,
|
||||
status: http.StatusBadRequest,
|
||||
@@ -112,8 +127,9 @@ func TestSendInvitation(t *testing.T) {
|
||||
},
|
||||
{
|
||||
desc: "with service error",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
data: fmt.Sprintf(`{"user_id": "%s", "domain_id": "%s", "relation": "%s"}`, validID, validID, "domain"),
|
||||
data: fmt.Sprintf(`{"user_id": "%s", "relation": "%s"}`, validID, "domain"),
|
||||
status: http.StatusForbidden,
|
||||
contentType: validContenType,
|
||||
svcErr: svcerr.ErrAuthorization,
|
||||
@@ -121,22 +137,24 @@ func TestSendInvitation(t *testing.T) {
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
authnCall := authn.On("Authenticate", mock.Anything, tc.token).Return(tc.authnRes, tc.authnErr)
|
||||
repoCall := svc.On("SendInvitation", mock.Anything, tc.authnRes, mock.Anything).Return(tc.svcErr)
|
||||
req := testRequest{
|
||||
client: is.Client(),
|
||||
method: http.MethodPost,
|
||||
url: is.URL + "/invitations",
|
||||
token: tc.token,
|
||||
contentType: tc.contentType,
|
||||
body: strings.NewReader(tc.data),
|
||||
}
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
authnCall := authn.On("Authenticate", mock.Anything, tc.token).Return(tc.authnRes, tc.authnErr)
|
||||
repoCall := svc.On("SendInvitation", mock.Anything, tc.authnRes, mock.Anything).Return(tc.svcErr)
|
||||
req := testRequest{
|
||||
client: is.Client(),
|
||||
method: http.MethodPost,
|
||||
url: is.URL + "/" + tc.domainID + "/invitations",
|
||||
token: tc.token,
|
||||
contentType: tc.contentType,
|
||||
body: strings.NewReader(tc.data),
|
||||
}
|
||||
|
||||
res, err := req.make()
|
||||
assert.Nil(t, err, tc.desc)
|
||||
assert.Equal(t, tc.status, res.StatusCode, tc.desc)
|
||||
repoCall.Unset()
|
||||
authnCall.Unset()
|
||||
res, err := req.make()
|
||||
assert.Nil(t, err, tc.desc)
|
||||
assert.Equal(t, tc.status, res.StatusCode, tc.desc)
|
||||
repoCall.Unset()
|
||||
authnCall.Unset()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -145,6 +163,7 @@ func TestListInvitation(t *testing.T) {
|
||||
|
||||
cases := []struct {
|
||||
desc string
|
||||
domainID string
|
||||
token string
|
||||
query string
|
||||
contentType string
|
||||
@@ -155,6 +174,7 @@ func TestListInvitation(t *testing.T) {
|
||||
}{
|
||||
{
|
||||
desc: "valid request",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
status: http.StatusOK,
|
||||
contentType: validContenType,
|
||||
@@ -162,6 +182,7 @@ func TestListInvitation(t *testing.T) {
|
||||
},
|
||||
{
|
||||
desc: "invalid token",
|
||||
domainID: domainID,
|
||||
token: "",
|
||||
status: http.StatusUnauthorized,
|
||||
contentType: validContenType,
|
||||
@@ -169,6 +190,7 @@ func TestListInvitation(t *testing.T) {
|
||||
},
|
||||
{
|
||||
desc: "with offset",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
query: "offset=1",
|
||||
status: http.StatusOK,
|
||||
@@ -177,6 +199,7 @@ func TestListInvitation(t *testing.T) {
|
||||
},
|
||||
{
|
||||
desc: "with invalid offset",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
query: "offset=invalid",
|
||||
status: http.StatusBadRequest,
|
||||
@@ -185,6 +208,7 @@ func TestListInvitation(t *testing.T) {
|
||||
},
|
||||
{
|
||||
desc: "with limit",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
query: "limit=1",
|
||||
status: http.StatusOK,
|
||||
@@ -193,6 +217,7 @@ func TestListInvitation(t *testing.T) {
|
||||
},
|
||||
{
|
||||
desc: "with invalid limit",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
query: "limit=invalid",
|
||||
status: http.StatusBadRequest,
|
||||
@@ -201,6 +226,7 @@ func TestListInvitation(t *testing.T) {
|
||||
},
|
||||
{
|
||||
desc: "with user_id",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
query: fmt.Sprintf("user_id=%s", validID),
|
||||
status: http.StatusOK,
|
||||
@@ -209,6 +235,7 @@ func TestListInvitation(t *testing.T) {
|
||||
},
|
||||
{
|
||||
desc: "with duplicate user_id",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
query: "user_id=1&user_id=2",
|
||||
status: http.StatusBadRequest,
|
||||
@@ -217,6 +244,7 @@ func TestListInvitation(t *testing.T) {
|
||||
},
|
||||
{
|
||||
desc: "with invited_by",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
query: fmt.Sprintf("invited_by=%s", validID),
|
||||
status: http.StatusOK,
|
||||
@@ -225,6 +253,7 @@ func TestListInvitation(t *testing.T) {
|
||||
},
|
||||
{
|
||||
desc: "with duplicate invited_by",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
query: "invited_by=1&invited_by=2",
|
||||
status: http.StatusBadRequest,
|
||||
@@ -233,6 +262,7 @@ func TestListInvitation(t *testing.T) {
|
||||
},
|
||||
{
|
||||
desc: "with relation",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
query: fmt.Sprintf("relation=%s", "relation"),
|
||||
status: http.StatusOK,
|
||||
@@ -241,6 +271,7 @@ func TestListInvitation(t *testing.T) {
|
||||
},
|
||||
{
|
||||
desc: "with duplicate relation",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
query: "relation=1&relation=2",
|
||||
status: http.StatusBadRequest,
|
||||
@@ -248,23 +279,16 @@ func TestListInvitation(t *testing.T) {
|
||||
svcErr: nil,
|
||||
},
|
||||
{
|
||||
desc: "with domain_id",
|
||||
desc: "with empty domain_id",
|
||||
domainID: "",
|
||||
token: validToken,
|
||||
query: fmt.Sprintf("domain_id=%s", validID),
|
||||
status: http.StatusOK,
|
||||
contentType: validContenType,
|
||||
svcErr: nil,
|
||||
},
|
||||
{
|
||||
desc: "with duplicate domain_id",
|
||||
token: validToken,
|
||||
query: "domain_id=1&domain_id=2",
|
||||
status: http.StatusBadRequest,
|
||||
contentType: validContenType,
|
||||
svcErr: nil,
|
||||
},
|
||||
{
|
||||
desc: "with state",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
query: "state=pending",
|
||||
status: http.StatusOK,
|
||||
@@ -273,6 +297,7 @@ func TestListInvitation(t *testing.T) {
|
||||
},
|
||||
{
|
||||
desc: "with invalid state",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
query: "state=invalid",
|
||||
status: http.StatusBadRequest,
|
||||
@@ -281,6 +306,7 @@ func TestListInvitation(t *testing.T) {
|
||||
},
|
||||
{
|
||||
desc: "with duplicate state",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
query: "state=all&state=all",
|
||||
status: http.StatusBadRequest,
|
||||
@@ -289,6 +315,7 @@ func TestListInvitation(t *testing.T) {
|
||||
},
|
||||
{
|
||||
desc: "with service error",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
status: http.StatusForbidden,
|
||||
contentType: validContenType,
|
||||
@@ -297,20 +324,22 @@ func TestListInvitation(t *testing.T) {
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
authnCall := authn.On("Authenticate", mock.Anything, tc.token).Return(tc.authnRes, tc.authnErr)
|
||||
repoCall := svc.On("ListInvitations", mock.Anything, tc.authnRes, mock.Anything).Return(invitations.InvitationPage{}, tc.svcErr)
|
||||
req := testRequest{
|
||||
client: is.Client(),
|
||||
method: http.MethodGet,
|
||||
url: is.URL + "/invitations?" + tc.query,
|
||||
token: tc.token,
|
||||
contentType: tc.contentType,
|
||||
}
|
||||
res, err := req.make()
|
||||
assert.Nil(t, err, tc.desc)
|
||||
assert.Equal(t, tc.status, res.StatusCode, tc.desc)
|
||||
repoCall.Unset()
|
||||
authnCall.Unset()
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
authnCall := authn.On("Authenticate", mock.Anything, tc.token).Return(tc.authnRes, tc.authnErr)
|
||||
repoCall := svc.On("ListInvitations", mock.Anything, tc.authnRes, mock.Anything).Return(invitations.InvitationPage{}, tc.svcErr)
|
||||
req := testRequest{
|
||||
client: is.Client(),
|
||||
method: http.MethodGet,
|
||||
url: is.URL + "/" + tc.domainID + "/invitations?" + tc.query,
|
||||
token: tc.token,
|
||||
contentType: tc.contentType,
|
||||
}
|
||||
res, err := req.make()
|
||||
assert.Nil(t, err, tc.desc)
|
||||
assert.Equal(t, tc.status, res.StatusCode, tc.desc)
|
||||
repoCall.Unset()
|
||||
authnCall.Unset()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -360,7 +389,7 @@ func TestViewInvitation(t *testing.T) {
|
||||
token: validToken,
|
||||
userID: "",
|
||||
domainID: validID,
|
||||
status: http.StatusBadRequest,
|
||||
status: http.StatusNotFound,
|
||||
contentType: validContenType,
|
||||
svcErr: nil,
|
||||
},
|
||||
@@ -369,7 +398,7 @@ func TestViewInvitation(t *testing.T) {
|
||||
token: validToken,
|
||||
userID: validID,
|
||||
domainID: "",
|
||||
status: http.StatusNotFound,
|
||||
status: http.StatusBadRequest,
|
||||
contentType: validContenType,
|
||||
svcErr: nil,
|
||||
},
|
||||
@@ -385,21 +414,23 @@ func TestViewInvitation(t *testing.T) {
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
authnCall := authn.On("Authenticate", mock.Anything, tc.token).Return(tc.authnRes, tc.authnErr)
|
||||
repoCall := svc.On("ViewInvitation", mock.Anything, tc.authnRes, tc.userID, tc.domainID).Return(invitations.Invitation{}, tc.svcErr)
|
||||
req := testRequest{
|
||||
client: is.Client(),
|
||||
method: http.MethodGet,
|
||||
url: is.URL + "/invitations/" + tc.userID + "/" + tc.domainID,
|
||||
token: tc.token,
|
||||
contentType: tc.contentType,
|
||||
}
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
authnCall := authn.On("Authenticate", mock.Anything, tc.token).Return(tc.authnRes, tc.authnErr)
|
||||
repoCall := svc.On("ViewInvitation", mock.Anything, tc.authnRes, tc.userID, tc.domainID).Return(invitations.Invitation{}, tc.svcErr)
|
||||
req := testRequest{
|
||||
client: is.Client(),
|
||||
method: http.MethodGet,
|
||||
url: is.URL + "/" + tc.domainID + "/invitations/users/" + tc.userID,
|
||||
token: tc.token,
|
||||
contentType: tc.contentType,
|
||||
}
|
||||
|
||||
res, err := req.make()
|
||||
assert.Nil(t, err, tc.desc)
|
||||
assert.Equal(t, tc.status, res.StatusCode, tc.desc)
|
||||
repoCall.Unset()
|
||||
authnCall.Unset()
|
||||
res, err := req.make()
|
||||
assert.Nil(t, err, tc.desc)
|
||||
assert.Equal(t, tc.status, res.StatusCode, tc.desc)
|
||||
repoCall.Unset()
|
||||
authnCall.Unset()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -450,7 +481,7 @@ func TestDeleteInvitation(t *testing.T) {
|
||||
token: validToken,
|
||||
userID: "",
|
||||
domainID: validID,
|
||||
status: http.StatusBadRequest,
|
||||
status: http.StatusNotFound,
|
||||
contentType: validContenType,
|
||||
svcErr: nil,
|
||||
},
|
||||
@@ -459,7 +490,7 @@ func TestDeleteInvitation(t *testing.T) {
|
||||
token: validToken,
|
||||
userID: validID,
|
||||
domainID: "",
|
||||
status: http.StatusNotFound,
|
||||
status: http.StatusBadRequest,
|
||||
contentType: validContenType,
|
||||
svcErr: nil,
|
||||
},
|
||||
@@ -475,21 +506,23 @@ func TestDeleteInvitation(t *testing.T) {
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
authnCall := authn.On("Authenticate", mock.Anything, tc.token).Return(tc.authnRes, tc.authnErr)
|
||||
repoCall := svc.On("DeleteInvitation", mock.Anything, tc.authnRes, tc.userID, tc.domainID).Return(tc.svcErr)
|
||||
req := testRequest{
|
||||
client: is.Client(),
|
||||
method: http.MethodDelete,
|
||||
url: is.URL + "/invitations/" + tc.userID + "/" + tc.domainID,
|
||||
token: tc.token,
|
||||
contentType: tc.contentType,
|
||||
}
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
authnCall := authn.On("Authenticate", mock.Anything, tc.token).Return(tc.authnRes, tc.authnErr)
|
||||
repoCall := svc.On("DeleteInvitation", mock.Anything, tc.authnRes, tc.userID, tc.domainID).Return(tc.svcErr)
|
||||
req := testRequest{
|
||||
client: is.Client(),
|
||||
method: http.MethodDelete,
|
||||
url: is.URL + "/" + tc.domainID + "/invitations/users/" + tc.userID,
|
||||
token: tc.token,
|
||||
contentType: tc.contentType,
|
||||
}
|
||||
|
||||
res, err := req.make()
|
||||
assert.Nil(t, err, tc.desc)
|
||||
assert.Equal(t, tc.status, res.StatusCode, tc.desc)
|
||||
repoCall.Unset()
|
||||
authnCall.Unset()
|
||||
res, err := req.make()
|
||||
assert.Nil(t, err, tc.desc)
|
||||
assert.Equal(t, tc.status, res.StatusCode, tc.desc)
|
||||
repoCall.Unset()
|
||||
authnCall.Unset()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -498,6 +531,7 @@ func TestAcceptInvitation(t *testing.T) {
|
||||
_ = authn
|
||||
cases := []struct {
|
||||
desc string
|
||||
domainID string
|
||||
token string
|
||||
data string
|
||||
contentType string
|
||||
@@ -508,40 +542,40 @@ func TestAcceptInvitation(t *testing.T) {
|
||||
}{
|
||||
{
|
||||
desc: "valid request",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
data: fmt.Sprintf(`{"domain_id": "%s"}`, validID),
|
||||
status: http.StatusNoContent,
|
||||
contentType: validContenType,
|
||||
svcErr: nil,
|
||||
},
|
||||
{
|
||||
desc: "invalid token",
|
||||
domainID: domainID,
|
||||
token: "",
|
||||
data: fmt.Sprintf(`{"domain_id": "%s"}`, validID),
|
||||
status: http.StatusUnauthorized,
|
||||
contentType: validContenType,
|
||||
svcErr: nil,
|
||||
},
|
||||
{
|
||||
desc: "with service error",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
data: fmt.Sprintf(`{"domain_id": "%s"}`, validID),
|
||||
status: http.StatusForbidden,
|
||||
contentType: validContenType,
|
||||
svcErr: svcerr.ErrAuthorization,
|
||||
},
|
||||
{
|
||||
desc: "invalid content type",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
data: fmt.Sprintf(`{"domain_id": "%s"}`, validID),
|
||||
status: http.StatusUnsupportedMediaType,
|
||||
contentType: "text/plain",
|
||||
svcErr: nil,
|
||||
},
|
||||
{
|
||||
desc: "invalid data",
|
||||
desc: "empty domain",
|
||||
domainID: "",
|
||||
token: validToken,
|
||||
data: `data`,
|
||||
status: http.StatusBadRequest,
|
||||
contentType: validContenType,
|
||||
svcErr: nil,
|
||||
@@ -549,22 +583,23 @@ func TestAcceptInvitation(t *testing.T) {
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
authnCall := authn.On("Authenticate", mock.Anything, tc.token).Return(tc.authnRes, tc.authnErr)
|
||||
repoCall := svc.On("AcceptInvitation", mock.Anything, tc.authnRes, mock.Anything).Return(tc.svcErr)
|
||||
req := testRequest{
|
||||
client: is.Client(),
|
||||
method: http.MethodPost,
|
||||
url: is.URL + "/invitations/accept",
|
||||
token: tc.token,
|
||||
contentType: tc.contentType,
|
||||
body: strings.NewReader(tc.data),
|
||||
}
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
authnCall := authn.On("Authenticate", mock.Anything, tc.token).Return(tc.authnRes, tc.authnErr)
|
||||
repoCall := svc.On("AcceptInvitation", mock.Anything, tc.authnRes, mock.Anything).Return(tc.svcErr)
|
||||
req := testRequest{
|
||||
client: is.Client(),
|
||||
method: http.MethodPost,
|
||||
url: is.URL + "/" + tc.domainID + "/invitations/accept",
|
||||
token: tc.token,
|
||||
contentType: tc.contentType,
|
||||
}
|
||||
|
||||
res, err := req.make()
|
||||
assert.Nil(t, err, tc.desc)
|
||||
assert.Equal(t, tc.status, res.StatusCode, tc.desc)
|
||||
repoCall.Unset()
|
||||
authnCall.Unset()
|
||||
res, err := req.make()
|
||||
assert.Nil(t, err, tc.desc)
|
||||
assert.Equal(t, tc.status, res.StatusCode, tc.desc)
|
||||
repoCall.Unset()
|
||||
authnCall.Unset()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -574,8 +609,8 @@ func TestRejectInvitation(t *testing.T) {
|
||||
|
||||
cases := []struct {
|
||||
desc string
|
||||
domainID string
|
||||
token string
|
||||
data string
|
||||
contentType string
|
||||
status int
|
||||
svcErr error
|
||||
@@ -584,40 +619,40 @@ func TestRejectInvitation(t *testing.T) {
|
||||
}{
|
||||
{
|
||||
desc: "valid request",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
data: fmt.Sprintf(`{"domain_id": "%s"}`, validID),
|
||||
status: http.StatusNoContent,
|
||||
contentType: validContenType,
|
||||
svcErr: nil,
|
||||
},
|
||||
{
|
||||
desc: "invalid token",
|
||||
domainID: domainID,
|
||||
token: "",
|
||||
data: fmt.Sprintf(`{"domain_id": "%s"}`, validID),
|
||||
status: http.StatusUnauthorized,
|
||||
contentType: validContenType,
|
||||
svcErr: nil,
|
||||
},
|
||||
{
|
||||
desc: "unauthorized error",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
data: fmt.Sprintf(`{"domain_id": "%s"}`, "invalid"),
|
||||
status: http.StatusForbidden,
|
||||
contentType: validContenType,
|
||||
svcErr: svcerr.ErrAuthorization,
|
||||
},
|
||||
{
|
||||
desc: "invalid content type",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
data: fmt.Sprintf(`{"domain_id": "%s"}`, validID),
|
||||
status: http.StatusUnsupportedMediaType,
|
||||
contentType: "text/plain",
|
||||
svcErr: nil,
|
||||
},
|
||||
{
|
||||
desc: "invalid data",
|
||||
desc: "empty domain",
|
||||
domainID: "",
|
||||
token: validToken,
|
||||
data: `data`,
|
||||
status: http.StatusBadRequest,
|
||||
contentType: validContenType,
|
||||
svcErr: nil,
|
||||
@@ -625,21 +660,22 @@ func TestRejectInvitation(t *testing.T) {
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
authnCall := authn.On("Authenticate", mock.Anything, tc.token).Return(tc.authnRes, tc.authnErr)
|
||||
repoCall := svc.On("RejectInvitation", mock.Anything, tc.authnRes, mock.Anything).Return(tc.svcErr)
|
||||
req := testRequest{
|
||||
client: is.Client(),
|
||||
method: http.MethodPost,
|
||||
url: is.URL + "/invitations/reject",
|
||||
token: tc.token,
|
||||
contentType: tc.contentType,
|
||||
body: strings.NewReader(tc.data),
|
||||
}
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
authnCall := authn.On("Authenticate", mock.Anything, tc.token).Return(tc.authnRes, tc.authnErr)
|
||||
repoCall := svc.On("RejectInvitation", mock.Anything, tc.authnRes, mock.Anything).Return(tc.svcErr)
|
||||
req := testRequest{
|
||||
client: is.Client(),
|
||||
method: http.MethodPost,
|
||||
url: is.URL + "/" + tc.domainID + "/invitations/reject",
|
||||
token: tc.token,
|
||||
contentType: tc.contentType,
|
||||
}
|
||||
|
||||
res, err := req.make()
|
||||
assert.Nil(t, err, tc.desc)
|
||||
assert.Equal(t, tc.status, res.StatusCode, tc.desc)
|
||||
repoCall.Unset()
|
||||
authnCall.Unset()
|
||||
res, err := req.make()
|
||||
assert.Nil(t, err, tc.desc)
|
||||
assert.Equal(t, tc.status, res.StatusCode, tc.desc)
|
||||
repoCall.Unset()
|
||||
authnCall.Unset()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
+10
-10
@@ -4,20 +4,16 @@
|
||||
package api
|
||||
|
||||
import (
|
||||
"errors"
|
||||
|
||||
"github.com/absmach/magistrala/invitations"
|
||||
"github.com/absmach/magistrala/pkg/apiutil"
|
||||
)
|
||||
|
||||
const maxLimitSize = 100
|
||||
|
||||
var errMissingDomain = errors.New("missing domain")
|
||||
|
||||
type sendInvitationReq struct {
|
||||
token string
|
||||
UserID string `json:"user_id,omitempty"`
|
||||
DomainID string `json:"domain_id,omitempty"`
|
||||
UserID string `json:"user_id,omitempty"`
|
||||
Relation string `json:"relation,omitempty"`
|
||||
Resend bool `json:"resend,omitempty"`
|
||||
}
|
||||
@@ -30,7 +26,7 @@ func (req *sendInvitationReq) validate() error {
|
||||
return apiutil.ErrMissingID
|
||||
}
|
||||
if req.DomainID == "" {
|
||||
return errMissingDomain
|
||||
return apiutil.ErrMissingDomainID
|
||||
}
|
||||
if err := invitations.CheckRelation(req.Relation); err != nil {
|
||||
return err
|
||||
@@ -48,6 +44,10 @@ func (req *listInvitationsReq) validate() error {
|
||||
if req.token == "" {
|
||||
return apiutil.ErrBearerToken
|
||||
}
|
||||
if req.Page.DomainID == "" {
|
||||
return apiutil.ErrMissingDomainID
|
||||
}
|
||||
|
||||
if req.Page.Limit > maxLimitSize || req.Page.Limit < 1 {
|
||||
return apiutil.ErrLimitSize
|
||||
}
|
||||
@@ -57,15 +57,15 @@ func (req *listInvitationsReq) validate() error {
|
||||
|
||||
type acceptInvitationReq struct {
|
||||
token string
|
||||
DomainID string `json:"domain_id,omitempty"`
|
||||
domainID string
|
||||
}
|
||||
|
||||
func (req *acceptInvitationReq) validate() error {
|
||||
if req.token == "" {
|
||||
return apiutil.ErrBearerToken
|
||||
}
|
||||
if req.DomainID == "" {
|
||||
return errMissingDomain
|
||||
if req.domainID == "" {
|
||||
return apiutil.ErrMissingDomainID
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -85,7 +85,7 @@ func (req *invitationReq) validate() error {
|
||||
return apiutil.ErrMissingID
|
||||
}
|
||||
if req.domainID == "" {
|
||||
return errMissingDomain
|
||||
return apiutil.ErrMissingDomainID
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
@@ -63,7 +63,7 @@ func TestSendInvitationReqValidation(t *testing.T) {
|
||||
Relation: policies.DomainRelation,
|
||||
Resend: true,
|
||||
},
|
||||
err: errMissingDomain,
|
||||
err: apiutil.ErrMissingDomainID,
|
||||
},
|
||||
{
|
||||
desc: "missing relation",
|
||||
@@ -90,8 +90,10 @@ func TestSendInvitationReqValidation(t *testing.T) {
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
err := tc.req.validate()
|
||||
assert.Equal(t, tc.err, err, fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err))
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
err := tc.req.validate()
|
||||
assert.Equal(t, tc.err, err, fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err))
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -105,15 +107,29 @@ func TestListInvitationsReq(t *testing.T) {
|
||||
desc: "valid request",
|
||||
req: listInvitationsReq{
|
||||
token: valid,
|
||||
Page: invitations.Page{Limit: 1},
|
||||
Page: invitations.Page{
|
||||
Limit: 1,
|
||||
DomainID: valid,
|
||||
},
|
||||
},
|
||||
err: nil,
|
||||
},
|
||||
{
|
||||
desc: "empty domainID",
|
||||
req: listInvitationsReq{
|
||||
token: valid,
|
||||
Page: invitations.Page{Limit: 1},
|
||||
},
|
||||
err: apiutil.ErrMissingDomainID,
|
||||
},
|
||||
{
|
||||
desc: "empty token",
|
||||
req: listInvitationsReq{
|
||||
token: "",
|
||||
Page: invitations.Page{Limit: 1},
|
||||
Page: invitations.Page{
|
||||
Limit: 1,
|
||||
DomainID: valid,
|
||||
},
|
||||
},
|
||||
err: apiutil.ErrBearerToken,
|
||||
},
|
||||
@@ -121,15 +137,20 @@ func TestListInvitationsReq(t *testing.T) {
|
||||
desc: "invalid limit",
|
||||
req: listInvitationsReq{
|
||||
token: valid,
|
||||
Page: invitations.Page{Limit: 1000},
|
||||
Page: invitations.Page{
|
||||
Limit: 1000,
|
||||
DomainID: valid,
|
||||
},
|
||||
},
|
||||
err: apiutil.ErrLimitSize,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
err := tc.req.validate()
|
||||
assert.Equal(t, tc.err, err, fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err))
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
err := tc.req.validate()
|
||||
assert.Equal(t, tc.err, err, fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err))
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -143,7 +164,7 @@ func TestAcceptInvitationReq(t *testing.T) {
|
||||
desc: "valid request",
|
||||
req: acceptInvitationReq{
|
||||
token: valid,
|
||||
DomainID: valid,
|
||||
domainID: valid,
|
||||
},
|
||||
err: nil,
|
||||
},
|
||||
@@ -158,15 +179,17 @@ func TestAcceptInvitationReq(t *testing.T) {
|
||||
desc: "empty domain_id",
|
||||
req: acceptInvitationReq{
|
||||
token: valid,
|
||||
DomainID: "",
|
||||
domainID: "",
|
||||
},
|
||||
err: errMissingDomain,
|
||||
err: apiutil.ErrMissingDomainID,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
err := tc.req.validate()
|
||||
assert.Equal(t, tc.err, err, fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err))
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
err := tc.req.validate()
|
||||
assert.Equal(t, tc.err, err, fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err))
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -210,12 +233,14 @@ func TestInvitationReqValidation(t *testing.T) {
|
||||
userID: valid,
|
||||
domainID: "",
|
||||
},
|
||||
err: errMissingDomain,
|
||||
err: apiutil.ErrMissingDomainID,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
err := tc.req.validate()
|
||||
assert.Equal(t, tc.err, err, fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err))
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
err := tc.req.validate()
|
||||
assert.Equal(t, tc.err, err, fmt.Sprintf("%s: expected %s got %s\n", tc.desc, tc.err, err))
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -40,7 +40,7 @@ func MakeHandler(svc invitations.Service, logger *slog.Logger, authn mgauthn.Aut
|
||||
mux.Group(func(r chi.Router) {
|
||||
r.Use(api.AuthenticateMiddleware(authn))
|
||||
|
||||
r.Route("/invitations", func(r chi.Router) {
|
||||
r.Route("/{domainID}/invitations", func(r chi.Router) {
|
||||
r.Post("/", otelhttp.NewHandler(kithttp.NewServer(
|
||||
sendInvitationEndpoint(svc),
|
||||
decodeSendInvitationReq,
|
||||
@@ -53,7 +53,7 @@ func MakeHandler(svc invitations.Service, logger *slog.Logger, authn mgauthn.Aut
|
||||
api.EncodeResponse,
|
||||
opts...,
|
||||
), "list_invitations").ServeHTTP)
|
||||
r.Route("/{user_id}/{domain_id}", func(r chi.Router) {
|
||||
r.Route("/users/{user_id}", func(r chi.Router) {
|
||||
r.Get("/", otelhttp.NewHandler(kithttp.NewServer(
|
||||
viewInvitationEndpoint(svc),
|
||||
decodeInvitationReq,
|
||||
@@ -94,6 +94,7 @@ func decodeSendInvitationReq(_ context.Context, r *http.Request) (interface{}, e
|
||||
}
|
||||
|
||||
var req sendInvitationReq
|
||||
req.DomainID = chi.URLParam(r, "domainID")
|
||||
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
|
||||
return nil, errors.Wrap(apiutil.ErrValidation, errors.Wrap(err, errors.ErrMalformedEntity))
|
||||
}
|
||||
@@ -123,10 +124,6 @@ func decodeListInvitationsReq(_ context.Context, r *http.Request) (interface{},
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(apiutil.ErrValidation, err)
|
||||
}
|
||||
domainID, err := apiutil.ReadStringQuery(r, domainIDKey, "")
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(apiutil.ErrValidation, err)
|
||||
}
|
||||
st, err := apiutil.ReadStringQuery(r, stateKey, invitations.All.String())
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(apiutil.ErrValidation, err)
|
||||
@@ -144,7 +141,7 @@ func decodeListInvitationsReq(_ context.Context, r *http.Request) (interface{},
|
||||
InvitedBy: invitedBy,
|
||||
UserID: userID,
|
||||
Relation: relation,
|
||||
DomainID: domainID,
|
||||
DomainID: chi.URLParam(r, "domainID"),
|
||||
State: state,
|
||||
},
|
||||
}
|
||||
@@ -157,20 +154,17 @@ func decodeAcceptInvitationReq(_ context.Context, r *http.Request) (interface{},
|
||||
return nil, errors.Wrap(apiutil.ErrValidation, apiutil.ErrUnsupportedContentType)
|
||||
}
|
||||
|
||||
var req acceptInvitationReq
|
||||
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
|
||||
return nil, errors.Wrap(apiutil.ErrValidation, errors.Wrap(err, errors.ErrMalformedEntity))
|
||||
}
|
||||
req.token = apiutil.ExtractBearerToken(r)
|
||||
|
||||
return req, nil
|
||||
return acceptInvitationReq{
|
||||
token: apiutil.ExtractBearerToken(r),
|
||||
domainID: chi.URLParam(r, "domainID"),
|
||||
}, nil
|
||||
}
|
||||
|
||||
func decodeInvitationReq(_ context.Context, r *http.Request) (interface{}, error) {
|
||||
req := invitationReq{
|
||||
token: apiutil.ExtractBearerToken(r),
|
||||
userID: chi.URLParam(r, "user_id"),
|
||||
domainID: chi.URLParam(r, "domain_id"),
|
||||
domainID: chi.URLParam(r, "domainID"),
|
||||
}
|
||||
|
||||
return req, nil
|
||||
|
||||
+51
-40
@@ -108,15 +108,17 @@ func TestSendInvitation(t *testing.T) {
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
repocall1 := token.On("Issue", context.Background(), mock.Anything).Return(&magistrala.Token{AccessToken: tc.req.Token}, tc.issueErr)
|
||||
repocall2 := repo.On("Create", context.Background(), mock.Anything).Return(tc.repoErr)
|
||||
if tc.req.Resend {
|
||||
repocall2 = repo.On("UpdateToken", context.Background(), mock.Anything).Return(tc.repoErr)
|
||||
}
|
||||
err := svc.SendInvitation(context.Background(), tc.session, tc.req)
|
||||
assert.Equal(t, tc.err, err, tc.desc)
|
||||
repocall1.Unset()
|
||||
repocall2.Unset()
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
repocall1 := token.On("Issue", context.Background(), mock.Anything).Return(&magistrala.Token{AccessToken: tc.req.Token}, tc.issueErr)
|
||||
repocall2 := repo.On("Create", context.Background(), mock.Anything).Return(tc.repoErr)
|
||||
if tc.req.Resend {
|
||||
repocall2 = repo.On("UpdateToken", context.Background(), mock.Anything).Return(tc.repoErr)
|
||||
}
|
||||
err := svc.SendInvitation(context.Background(), tc.session, tc.req)
|
||||
assert.Equal(t, tc.err, err, tc.desc)
|
||||
repocall1.Unset()
|
||||
repocall2.Unset()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -194,11 +196,13 @@ func TestViewInvitation(t *testing.T) {
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
repocall1 := repo.On("Retrieve", context.Background(), mock.Anything, mock.Anything).Return(tc.resp, tc.repoErr)
|
||||
inv, err := svc.ViewInvitation(context.Background(), tc.session, tc.userID, tc.domainID)
|
||||
assert.Equal(t, tc.err, err, tc.desc)
|
||||
assert.Equal(t, tc.resp, inv, tc.desc)
|
||||
repocall1.Unset()
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
repocall1 := repo.On("Retrieve", context.Background(), mock.Anything, mock.Anything).Return(tc.resp, tc.repoErr)
|
||||
inv, err := svc.ViewInvitation(context.Background(), tc.session, tc.userID, tc.domainID)
|
||||
assert.Equal(t, tc.err, err, tc.desc)
|
||||
assert.Equal(t, tc.resp, inv, tc.desc)
|
||||
repocall1.Unset()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -248,7 +252,6 @@ func TestListInvitations(t *testing.T) {
|
||||
{
|
||||
desc: "list invitations unsuccessful",
|
||||
session: authn.Session{DomainUserID: validDomainUserID, DomainID: validDomainID, UserID: validUserID},
|
||||
// page: invitations.Page{DomainID: testsutil.GenerateUUID(t)},
|
||||
page: validPage,
|
||||
err: repoerr.ErrViewEntity,
|
||||
resp: invitations.InvitationPage{},
|
||||
@@ -257,11 +260,13 @@ func TestListInvitations(t *testing.T) {
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
repocall1 := repo.On("RetrieveAll", context.Background(), mock.Anything).Return(tc.resp, tc.repoErr)
|
||||
resp, err := svc.ListInvitations(context.Background(), tc.session, tc.page)
|
||||
assert.Equal(t, tc.err, err, tc.desc)
|
||||
assert.Equal(t, tc.resp, resp, tc.desc)
|
||||
repocall1.Unset()
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
repocall1 := repo.On("RetrieveAll", context.Background(), mock.Anything).Return(tc.resp, tc.repoErr)
|
||||
resp, err := svc.ListInvitations(context.Background(), tc.session, tc.page)
|
||||
assert.Equal(t, tc.err, err, tc.desc)
|
||||
assert.Equal(t, tc.resp, resp, tc.desc)
|
||||
repocall1.Unset()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -368,14 +373,16 @@ func TestAcceptInvitation(t *testing.T) {
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
repocall1 := repo.On("Retrieve", context.Background(), mock.Anything, tc.domainID).Return(tc.resp, tc.repoErr)
|
||||
sdkcall := sdksvc.On("AddUserToDomain", mock.Anything, mock.Anything, mock.Anything).Return(tc.sdkErr)
|
||||
repocall2 := repo.On("UpdateConfirmation", context.Background(), mock.Anything).Return(tc.repoErr1)
|
||||
err := svc.AcceptInvitation(context.Background(), tc.session, tc.domainID)
|
||||
assert.Equal(t, tc.err, err, tc.desc)
|
||||
repocall1.Unset()
|
||||
sdkcall.Unset()
|
||||
repocall2.Unset()
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
repocall1 := repo.On("Retrieve", context.Background(), mock.Anything, tc.domainID).Return(tc.resp, tc.repoErr)
|
||||
sdkcall := sdksvc.On("AddUserToDomain", mock.Anything, mock.Anything, mock.Anything).Return(tc.sdkErr)
|
||||
repocall2 := repo.On("UpdateConfirmation", context.Background(), mock.Anything).Return(tc.repoErr1)
|
||||
err := svc.AcceptInvitation(context.Background(), tc.session, tc.domainID)
|
||||
assert.Equal(t, tc.err, err, tc.desc)
|
||||
repocall1.Unset()
|
||||
sdkcall.Unset()
|
||||
repocall2.Unset()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -431,12 +438,14 @@ func TestDeleteInvitation(t *testing.T) {
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
repocall1 := repo.On("Retrieve", context.Background(), mock.Anything, mock.Anything).Return(tc.resp, tc.repoErr)
|
||||
repocall2 := repo.On("Delete", context.Background(), mock.Anything, mock.Anything).Return(tc.repoErr)
|
||||
err := svc.DeleteInvitation(context.Background(), authn.Session{}, tc.userID, tc.domainID)
|
||||
assert.Equal(t, tc.err, err, tc.desc)
|
||||
repocall1.Unset()
|
||||
repocall2.Unset()
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
repocall1 := repo.On("Retrieve", context.Background(), mock.Anything, mock.Anything).Return(tc.resp, tc.repoErr)
|
||||
repocall2 := repo.On("Delete", context.Background(), mock.Anything, mock.Anything).Return(tc.repoErr)
|
||||
err := svc.DeleteInvitation(context.Background(), authn.Session{}, tc.userID, tc.domainID)
|
||||
assert.Equal(t, tc.err, err, tc.desc)
|
||||
repocall1.Unset()
|
||||
repocall2.Unset()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -494,11 +503,13 @@ func TestRejectInvitation(t *testing.T) {
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
repocall1 := repo.On("Retrieve", context.Background(), mock.Anything, mock.Anything).Return(tc.resp, tc.repoErr)
|
||||
repocall3 := repo.On("UpdateRejection", context.Background(), mock.Anything).Return(tc.repoErr1)
|
||||
err := svc.RejectInvitation(context.Background(), tc.session, tc.domainID)
|
||||
assert.Equal(t, tc.err, err, tc.desc)
|
||||
repocall1.Unset()
|
||||
repocall3.Unset()
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
repocall1 := repo.On("Retrieve", context.Background(), mock.Anything, mock.Anything).Return(tc.resp, tc.repoErr)
|
||||
repocall3 := repo.On("UpdateRejection", context.Background(), mock.Anything).Return(tc.repoErr1)
|
||||
err := svc.RejectInvitation(context.Background(), tc.session, tc.domainID)
|
||||
assert.Equal(t, tc.err, err, tc.desc)
|
||||
repocall1.Unset()
|
||||
repocall3.Unset()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -185,4 +185,7 @@ var (
|
||||
|
||||
// ErrLenSearchQuery indicates search query length.
|
||||
ErrLenSearchQuery = errors.New("search query must be at least 3 characters")
|
||||
|
||||
// ErrMissingDomainID indicates missing domainID.
|
||||
ErrMissingDomainID = errors.New("missing domainID")
|
||||
)
|
||||
|
||||
+16
-15
@@ -95,13 +95,13 @@ func (ts *BootstrapConfig) UnmarshalJSON(data []byte) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (sdk mgSDK) AddBootstrap(cfg BootstrapConfig, token string) (string, errors.SDKError) {
|
||||
func (sdk mgSDK) AddBootstrap(cfg BootstrapConfig, domainID, token string) (string, errors.SDKError) {
|
||||
data, err := json.Marshal(cfg)
|
||||
if err != nil {
|
||||
return "", errors.NewSDKError(err)
|
||||
}
|
||||
|
||||
url := fmt.Sprintf("%s/%s", sdk.bootstrapURL, configsEndpoint)
|
||||
url := fmt.Sprintf("%s/%s/%s", sdk.bootstrapURL, domainID, configsEndpoint)
|
||||
|
||||
headers, _, sdkerr := sdk.processRequest(http.MethodPost, url, token, data, nil, http.StatusOK, http.StatusCreated)
|
||||
if sdkerr != nil {
|
||||
@@ -114,7 +114,8 @@ func (sdk mgSDK) AddBootstrap(cfg BootstrapConfig, token string) (string, errors
|
||||
}
|
||||
|
||||
func (sdk mgSDK) Bootstraps(pm PageMetadata, token string) (BootstrapPage, errors.SDKError) {
|
||||
url, err := sdk.withQueryParams(sdk.bootstrapURL, configsEndpoint, pm)
|
||||
endpoint := fmt.Sprintf("%s/%s", pm.DomainID, configsEndpoint)
|
||||
url, err := sdk.withQueryParams(sdk.bootstrapURL, endpoint, pm)
|
||||
if err != nil {
|
||||
return BootstrapPage{}, errors.NewSDKError(err)
|
||||
}
|
||||
@@ -132,7 +133,7 @@ func (sdk mgSDK) Bootstraps(pm PageMetadata, token string) (BootstrapPage, error
|
||||
return bb, nil
|
||||
}
|
||||
|
||||
func (sdk mgSDK) Whitelist(thingID string, state int, token string) errors.SDKError {
|
||||
func (sdk mgSDK) Whitelist(thingID string, state int, domainID, token string) errors.SDKError {
|
||||
if thingID == "" {
|
||||
return errors.NewSDKError(apiutil.ErrMissingID)
|
||||
}
|
||||
@@ -142,18 +143,18 @@ func (sdk mgSDK) Whitelist(thingID string, state int, token string) errors.SDKEr
|
||||
return errors.NewSDKError(err)
|
||||
}
|
||||
|
||||
url := fmt.Sprintf("%s/%s/%s", sdk.bootstrapURL, whitelistEndpoint, thingID)
|
||||
url := fmt.Sprintf("%s/%s/%s/%s", sdk.bootstrapURL, domainID, whitelistEndpoint, thingID)
|
||||
|
||||
_, _, sdkerr := sdk.processRequest(http.MethodPut, url, token, data, nil, http.StatusCreated, http.StatusOK)
|
||||
|
||||
return sdkerr
|
||||
}
|
||||
|
||||
func (sdk mgSDK) ViewBootstrap(id, token string) (BootstrapConfig, errors.SDKError) {
|
||||
func (sdk mgSDK) ViewBootstrap(id, domainID, token string) (BootstrapConfig, errors.SDKError) {
|
||||
if id == "" {
|
||||
return BootstrapConfig{}, errors.NewSDKError(apiutil.ErrMissingID)
|
||||
}
|
||||
url := fmt.Sprintf("%s/%s/%s", sdk.bootstrapURL, configsEndpoint, id)
|
||||
url := fmt.Sprintf("%s/%s/%s/%s", sdk.bootstrapURL, domainID, configsEndpoint, id)
|
||||
|
||||
_, body, err := sdk.processRequest(http.MethodGet, url, token, nil, nil, http.StatusOK)
|
||||
if err != nil {
|
||||
@@ -168,11 +169,11 @@ func (sdk mgSDK) ViewBootstrap(id, token string) (BootstrapConfig, errors.SDKErr
|
||||
return bc, nil
|
||||
}
|
||||
|
||||
func (sdk mgSDK) UpdateBootstrap(cfg BootstrapConfig, token string) errors.SDKError {
|
||||
func (sdk mgSDK) UpdateBootstrap(cfg BootstrapConfig, domainID, token string) errors.SDKError {
|
||||
if cfg.ThingID == "" {
|
||||
return errors.NewSDKError(apiutil.ErrMissingID)
|
||||
}
|
||||
url := fmt.Sprintf("%s/%s/%s", sdk.bootstrapURL, configsEndpoint, cfg.ThingID)
|
||||
url := fmt.Sprintf("%s/%s/%s/%s", sdk.bootstrapURL, domainID, configsEndpoint, cfg.ThingID)
|
||||
|
||||
data, err := json.Marshal(cfg)
|
||||
if err != nil {
|
||||
@@ -184,11 +185,11 @@ func (sdk mgSDK) UpdateBootstrap(cfg BootstrapConfig, token string) errors.SDKEr
|
||||
return sdkerr
|
||||
}
|
||||
|
||||
func (sdk mgSDK) UpdateBootstrapCerts(id, clientCert, clientKey, ca, token string) (BootstrapConfig, errors.SDKError) {
|
||||
func (sdk mgSDK) UpdateBootstrapCerts(id, clientCert, clientKey, ca, domainID, token string) (BootstrapConfig, errors.SDKError) {
|
||||
if id == "" {
|
||||
return BootstrapConfig{}, errors.NewSDKError(apiutil.ErrMissingID)
|
||||
}
|
||||
url := fmt.Sprintf("%s/%s/%s", sdk.bootstrapURL, bootstrapCertsEndpoint, id)
|
||||
url := fmt.Sprintf("%s/%s/%s/%s", sdk.bootstrapURL, domainID, bootstrapCertsEndpoint, id)
|
||||
request := BootstrapConfig{
|
||||
ClientCert: clientCert,
|
||||
ClientKey: clientKey,
|
||||
@@ -213,11 +214,11 @@ func (sdk mgSDK) UpdateBootstrapCerts(id, clientCert, clientKey, ca, token strin
|
||||
return bc, nil
|
||||
}
|
||||
|
||||
func (sdk mgSDK) UpdateBootstrapConnection(id string, channels []string, token string) errors.SDKError {
|
||||
func (sdk mgSDK) UpdateBootstrapConnection(id string, channels []string, domainID, token string) errors.SDKError {
|
||||
if id == "" {
|
||||
return errors.NewSDKError(apiutil.ErrMissingID)
|
||||
}
|
||||
url := fmt.Sprintf("%s/%s/%s", sdk.bootstrapURL, bootstrapConnEndpoint, id)
|
||||
url := fmt.Sprintf("%s/%s/%s/%s", sdk.bootstrapURL, domainID, bootstrapConnEndpoint, id)
|
||||
request := map[string][]string{
|
||||
"channels": channels,
|
||||
}
|
||||
@@ -230,11 +231,11 @@ func (sdk mgSDK) UpdateBootstrapConnection(id string, channels []string, token s
|
||||
return sdkerr
|
||||
}
|
||||
|
||||
func (sdk mgSDK) RemoveBootstrap(id, token string) errors.SDKError {
|
||||
func (sdk mgSDK) RemoveBootstrap(id, domainID, token string) errors.SDKError {
|
||||
if id == "" {
|
||||
return errors.NewSDKError(apiutil.ErrMissingID)
|
||||
}
|
||||
url := fmt.Sprintf("%s/%s/%s", sdk.bootstrapURL, configsEndpoint, id)
|
||||
url := fmt.Sprintf("%s/%s/%s/%s", sdk.bootstrapURL, domainID, configsEndpoint, id)
|
||||
|
||||
_, _, err := sdk.processRequest(http.MethodDelete, url, token, nil, nil, http.StatusNoContent)
|
||||
return err
|
||||
|
||||
+201
-145
@@ -153,6 +153,7 @@ func TestAddBootstrap(t *testing.T) {
|
||||
|
||||
cases := []struct {
|
||||
desc string
|
||||
domainID string
|
||||
token string
|
||||
session mgauthn.Session
|
||||
cfg sdk.BootstrapConfig
|
||||
@@ -164,26 +165,29 @@ func TestAddBootstrap(t *testing.T) {
|
||||
err errors.SDKError
|
||||
}{
|
||||
{
|
||||
desc: "add successfully",
|
||||
token: validToken,
|
||||
cfg: sdkBootstrapConfig,
|
||||
svcReq: bootstrapConfig,
|
||||
svcRes: bootstrapConfig,
|
||||
svcErr: nil,
|
||||
err: nil,
|
||||
desc: "add successfully",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
cfg: sdkBootstrapConfig,
|
||||
svcReq: bootstrapConfig,
|
||||
svcRes: bootstrapConfig,
|
||||
svcErr: nil,
|
||||
err: nil,
|
||||
},
|
||||
{
|
||||
desc: "add with invalid token",
|
||||
token: invalidToken,
|
||||
cfg: sdkBootstrapConfig,
|
||||
svcReq: bootstrapConfig,
|
||||
svcRes: bootstrap.Config{},
|
||||
svcErr: svcerr.ErrAuthentication,
|
||||
err: errors.NewSDKErrorWithStatus(svcerr.ErrAuthentication, http.StatusUnauthorized),
|
||||
desc: "add with invalid token",
|
||||
domainID: domainID,
|
||||
token: invalidToken,
|
||||
cfg: sdkBootstrapConfig,
|
||||
svcReq: bootstrapConfig,
|
||||
svcRes: bootstrap.Config{},
|
||||
svcErr: svcerr.ErrAuthentication,
|
||||
err: errors.NewSDKErrorWithStatus(svcerr.ErrAuthentication, http.StatusUnauthorized),
|
||||
},
|
||||
{
|
||||
desc: "add with config that cannot be marshalled",
|
||||
token: validToken,
|
||||
desc: "add with config that cannot be marshalled",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
cfg: sdk.BootstrapConfig{
|
||||
Channels: map[string]interface{}{
|
||||
"channel1": make(chan int),
|
||||
@@ -204,42 +208,45 @@ func TestAddBootstrap(t *testing.T) {
|
||||
err: errors.NewSDKError(errMarshalChan),
|
||||
},
|
||||
{
|
||||
desc: "add an existing config",
|
||||
token: validToken,
|
||||
cfg: sdkBootstrapConfig,
|
||||
svcReq: bootstrapConfig,
|
||||
svcRes: bootstrap.Config{},
|
||||
svcErr: svcerr.ErrConflict,
|
||||
err: errors.NewSDKErrorWithStatus(svcerr.ErrConflict, http.StatusConflict),
|
||||
desc: "add an existing config",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
cfg: sdkBootstrapConfig,
|
||||
svcReq: bootstrapConfig,
|
||||
svcRes: bootstrap.Config{},
|
||||
svcErr: svcerr.ErrConflict,
|
||||
err: errors.NewSDKErrorWithStatus(svcerr.ErrConflict, http.StatusConflict),
|
||||
},
|
||||
{
|
||||
desc: "add empty config",
|
||||
token: validToken,
|
||||
cfg: sdk.BootstrapConfig{},
|
||||
svcReq: bootstrap.Config{},
|
||||
svcRes: bootstrap.Config{},
|
||||
svcErr: nil,
|
||||
err: errors.NewSDKErrorWithStatus(errors.Wrap(apiutil.ErrValidation, apiutil.ErrMissingID), http.StatusBadRequest),
|
||||
desc: "add empty config",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
cfg: sdk.BootstrapConfig{},
|
||||
svcReq: bootstrap.Config{},
|
||||
svcRes: bootstrap.Config{},
|
||||
svcErr: nil,
|
||||
err: errors.NewSDKErrorWithStatus(errors.Wrap(apiutil.ErrValidation, apiutil.ErrMissingID), http.StatusBadRequest),
|
||||
},
|
||||
{
|
||||
desc: "add with non-existent thing Id",
|
||||
token: validToken,
|
||||
cfg: neID,
|
||||
svcReq: neReqId,
|
||||
svcRes: bootstrap.Config{},
|
||||
svcErr: svcerr.ErrNotFound,
|
||||
err: errors.NewSDKErrorWithStatus(svcerr.ErrNotFound, http.StatusNotFound),
|
||||
desc: "add with non-existent thing Id",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
cfg: neID,
|
||||
svcReq: neReqId,
|
||||
svcRes: bootstrap.Config{},
|
||||
svcErr: svcerr.ErrNotFound,
|
||||
err: errors.NewSDKErrorWithStatus(svcerr.ErrNotFound, http.StatusNotFound),
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
if tc.token == validToken {
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: validID}
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: domainID}
|
||||
}
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(tc.session, tc.authenticateErr)
|
||||
svcCall := bsvc.On("Add", mock.Anything, tc.session, tc.token, tc.svcReq).Return(tc.svcRes, tc.svcErr)
|
||||
resp, err := mgsdk.AddBootstrap(tc.cfg, tc.token)
|
||||
resp, err := mgsdk.AddBootstrap(tc.cfg, tc.domainID, tc.token)
|
||||
assert.Equal(t, tc.err, err)
|
||||
if err == nil {
|
||||
assert.Equal(t, bootstrapConfig.ThingID, resp)
|
||||
@@ -301,8 +308,9 @@ func TestListBootstraps(t *testing.T) {
|
||||
desc: "list successfully",
|
||||
token: validToken,
|
||||
pageMeta: sdk.PageMetadata{
|
||||
Offset: 0,
|
||||
Limit: 10,
|
||||
Offset: 0,
|
||||
Limit: 10,
|
||||
DomainID: domainID,
|
||||
},
|
||||
svcResp: bootstrap.ConfigsPage{
|
||||
Total: 1,
|
||||
@@ -321,8 +329,9 @@ func TestListBootstraps(t *testing.T) {
|
||||
desc: "list with invalid token",
|
||||
token: invalidToken,
|
||||
pageMeta: sdk.PageMetadata{
|
||||
Offset: 0,
|
||||
Limit: 10,
|
||||
Offset: 0,
|
||||
Limit: 10,
|
||||
DomainID: domainID,
|
||||
},
|
||||
svcResp: bootstrap.ConfigsPage{},
|
||||
svcErr: svcerr.ErrAuthentication,
|
||||
@@ -333,8 +342,9 @@ func TestListBootstraps(t *testing.T) {
|
||||
desc: "list with empty token",
|
||||
token: "",
|
||||
pageMeta: sdk.PageMetadata{
|
||||
Offset: 0,
|
||||
Limit: 10,
|
||||
Offset: 0,
|
||||
Limit: 10,
|
||||
DomainID: domainID,
|
||||
},
|
||||
svcResp: bootstrap.ConfigsPage{},
|
||||
svcErr: nil,
|
||||
@@ -345,8 +355,9 @@ func TestListBootstraps(t *testing.T) {
|
||||
desc: "list with invalid query params",
|
||||
token: validToken,
|
||||
pageMeta: sdk.PageMetadata{
|
||||
Offset: 1,
|
||||
Limit: 10,
|
||||
Offset: 1,
|
||||
Limit: 10,
|
||||
DomainID: domainID,
|
||||
Metadata: map[string]interface{}{
|
||||
"test": make(chan int),
|
||||
},
|
||||
@@ -360,8 +371,9 @@ func TestListBootstraps(t *testing.T) {
|
||||
desc: "list with response that cannot be unmarshalled",
|
||||
token: validToken,
|
||||
pageMeta: sdk.PageMetadata{
|
||||
Offset: 0,
|
||||
Limit: 10,
|
||||
Offset: 0,
|
||||
Limit: 10,
|
||||
DomainID: domainID,
|
||||
},
|
||||
svcResp: bootstrap.ConfigsPage{
|
||||
Total: 1,
|
||||
@@ -376,7 +388,7 @@ func TestListBootstraps(t *testing.T) {
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
if tc.token == validToken {
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: validID}
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: domainID}
|
||||
}
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(tc.session, tc.authenticateErr)
|
||||
svcCall := bsvc.On("List", mock.Anything, tc.session, mock.Anything, tc.pageMeta.Offset, tc.pageMeta.Limit).Return(tc.svcResp, tc.svcErr)
|
||||
@@ -407,6 +419,7 @@ func TestWhiteList(t *testing.T) {
|
||||
|
||||
cases := []struct {
|
||||
desc string
|
||||
domainID string
|
||||
token string
|
||||
session mgauthn.Session
|
||||
thingID string
|
||||
@@ -417,25 +430,28 @@ func TestWhiteList(t *testing.T) {
|
||||
err errors.SDKError
|
||||
}{
|
||||
{
|
||||
desc: "whitelist to active state successfully",
|
||||
token: validToken,
|
||||
thingID: thingId,
|
||||
state: active,
|
||||
svcReq: bootstrap.Active,
|
||||
svcErr: nil,
|
||||
err: nil,
|
||||
desc: "whitelist to active state successfully",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
thingID: thingId,
|
||||
state: active,
|
||||
svcReq: bootstrap.Active,
|
||||
svcErr: nil,
|
||||
err: nil,
|
||||
},
|
||||
{
|
||||
desc: "whitelist to inactive state successfully",
|
||||
token: validToken,
|
||||
thingID: thingId,
|
||||
state: inactive,
|
||||
svcReq: bootstrap.Inactive,
|
||||
svcErr: nil,
|
||||
err: nil,
|
||||
desc: "whitelist to inactive state successfully",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
thingID: thingId,
|
||||
state: inactive,
|
||||
svcReq: bootstrap.Inactive,
|
||||
svcErr: nil,
|
||||
err: nil,
|
||||
},
|
||||
{
|
||||
desc: "whitelist with invalid token",
|
||||
domainID: domainID,
|
||||
token: invalidToken,
|
||||
thingID: thingId,
|
||||
state: active,
|
||||
@@ -444,41 +460,44 @@ func TestWhiteList(t *testing.T) {
|
||||
err: errors.NewSDKErrorWithStatus(svcerr.ErrAuthentication, http.StatusUnauthorized),
|
||||
},
|
||||
{
|
||||
desc: "whitelist with empty token",
|
||||
token: "",
|
||||
thingID: thingId,
|
||||
state: active,
|
||||
svcReq: bootstrap.Active,
|
||||
svcErr: nil,
|
||||
err: errors.NewSDKErrorWithStatus(apiutil.ErrBearerToken, http.StatusUnauthorized),
|
||||
desc: "whitelist with empty token",
|
||||
domainID: domainID,
|
||||
token: "",
|
||||
thingID: thingId,
|
||||
state: active,
|
||||
svcReq: bootstrap.Active,
|
||||
svcErr: nil,
|
||||
err: errors.NewSDKErrorWithStatus(apiutil.ErrBearerToken, http.StatusUnauthorized),
|
||||
},
|
||||
{
|
||||
desc: "whitelist with invalid state",
|
||||
token: validToken,
|
||||
thingID: thingId,
|
||||
state: -1,
|
||||
svcReq: bootstrap.Active,
|
||||
svcErr: nil,
|
||||
err: errors.NewSDKErrorWithStatus(errors.Wrap(apiutil.ErrValidation, apiutil.ErrBootstrapState), http.StatusBadRequest),
|
||||
desc: "whitelist with invalid state",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
thingID: thingId,
|
||||
state: -1,
|
||||
svcReq: bootstrap.Active,
|
||||
svcErr: nil,
|
||||
err: errors.NewSDKErrorWithStatus(errors.Wrap(apiutil.ErrValidation, apiutil.ErrBootstrapState), http.StatusBadRequest),
|
||||
},
|
||||
{
|
||||
desc: "whitelist with empty thing Id",
|
||||
token: validToken,
|
||||
thingID: "",
|
||||
state: 1,
|
||||
svcReq: bootstrap.Active,
|
||||
svcErr: nil,
|
||||
err: errors.NewSDKError(apiutil.ErrMissingID),
|
||||
desc: "whitelist with empty thing Id",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
thingID: "",
|
||||
state: 1,
|
||||
svcReq: bootstrap.Active,
|
||||
svcErr: nil,
|
||||
err: errors.NewSDKError(apiutil.ErrMissingID),
|
||||
},
|
||||
}
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
if tc.token == validToken {
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: validID}
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: domainID}
|
||||
}
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(tc.session, tc.authenticateErr)
|
||||
svcCall := bsvc.On("ChangeState", mock.Anything, tc.session, tc.token, tc.thingID, tc.svcReq).Return(tc.svcErr)
|
||||
err := mgsdk.Whitelist(tc.thingID, tc.state, tc.token)
|
||||
err := mgsdk.Whitelist(tc.thingID, tc.state, tc.domainID, tc.token)
|
||||
assert.Equal(t, tc.err, err)
|
||||
if tc.err == nil {
|
||||
ok := svcCall.Parent.AssertCalled(t, "ChangeState", mock.Anything, tc.session, tc.token, tc.thingID, tc.svcReq)
|
||||
@@ -511,6 +530,7 @@ func TestViewBootstrap(t *testing.T) {
|
||||
|
||||
cases := []struct {
|
||||
desc string
|
||||
domainID string
|
||||
token string
|
||||
session mgauthn.Session
|
||||
id string
|
||||
@@ -522,6 +542,7 @@ func TestViewBootstrap(t *testing.T) {
|
||||
}{
|
||||
{
|
||||
desc: "view successfully",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
id: thingId,
|
||||
svcResp: bootstrapConfig,
|
||||
@@ -531,6 +552,7 @@ func TestViewBootstrap(t *testing.T) {
|
||||
},
|
||||
{
|
||||
desc: "view with invalid token",
|
||||
domainID: domainID,
|
||||
token: invalidToken,
|
||||
id: thingId,
|
||||
svcResp: bootstrap.Config{},
|
||||
@@ -540,6 +562,7 @@ func TestViewBootstrap(t *testing.T) {
|
||||
},
|
||||
{
|
||||
desc: "view with empty token",
|
||||
domainID: domainID,
|
||||
token: "",
|
||||
id: thingId,
|
||||
svcResp: bootstrap.Config{},
|
||||
@@ -549,6 +572,7 @@ func TestViewBootstrap(t *testing.T) {
|
||||
},
|
||||
{
|
||||
desc: "view with non-existent thing Id",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
id: invalid,
|
||||
svcResp: bootstrap.Config{},
|
||||
@@ -557,9 +581,10 @@ func TestViewBootstrap(t *testing.T) {
|
||||
err: errors.NewSDKErrorWithStatus(svcerr.ErrViewEntity, http.StatusBadRequest),
|
||||
},
|
||||
{
|
||||
desc: "view with response that cannot be unmarshalled",
|
||||
token: validToken,
|
||||
id: thingId,
|
||||
desc: "view with response that cannot be unmarshalled",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
id: thingId,
|
||||
svcResp: bootstrap.Config{
|
||||
ThingID: thingId,
|
||||
Channels: []bootstrap.Channel{
|
||||
@@ -577,6 +602,7 @@ func TestViewBootstrap(t *testing.T) {
|
||||
},
|
||||
{
|
||||
desc: "view with empty thing Id",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
id: "",
|
||||
svcResp: bootstrap.Config{},
|
||||
@@ -588,11 +614,11 @@ func TestViewBootstrap(t *testing.T) {
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
if tc.token == validToken {
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: validID}
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: domainID}
|
||||
}
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(tc.session, tc.authenticateErr)
|
||||
svcCall := bsvc.On("View", mock.Anything, tc.session, tc.id).Return(tc.svcResp, tc.svcErr)
|
||||
resp, err := mgsdk.ViewBootstrap(tc.id, tc.token)
|
||||
resp, err := mgsdk.ViewBootstrap(tc.id, tc.domainID, tc.token)
|
||||
assert.Equal(t, tc.err, err)
|
||||
assert.Equal(t, tc.response, resp)
|
||||
if err == nil {
|
||||
@@ -616,6 +642,7 @@ func TestUpdateBootstrap(t *testing.T) {
|
||||
|
||||
cases := []struct {
|
||||
desc string
|
||||
domainID string
|
||||
token string
|
||||
session mgauthn.Session
|
||||
cfg sdk.BootstrapConfig
|
||||
@@ -625,9 +652,10 @@ func TestUpdateBootstrap(t *testing.T) {
|
||||
err errors.SDKError
|
||||
}{
|
||||
{
|
||||
desc: "update successfully",
|
||||
token: validToken,
|
||||
cfg: sdkBootstrapConfig,
|
||||
desc: "update successfully",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
cfg: sdkBootstrapConfig,
|
||||
svcReq: bootstrap.Config{
|
||||
ThingID: thingId,
|
||||
Name: bsName,
|
||||
@@ -637,9 +665,10 @@ func TestUpdateBootstrap(t *testing.T) {
|
||||
err: nil,
|
||||
},
|
||||
{
|
||||
desc: "update with invalid token",
|
||||
token: invalidToken,
|
||||
cfg: sdkBootstrapConfig,
|
||||
desc: "update with invalid token",
|
||||
domainID: domainID,
|
||||
token: invalidToken,
|
||||
cfg: sdkBootstrapConfig,
|
||||
svcReq: bootstrap.Config{
|
||||
ThingID: thingId,
|
||||
Name: bsName,
|
||||
@@ -649,16 +678,18 @@ func TestUpdateBootstrap(t *testing.T) {
|
||||
err: errors.NewSDKErrorWithStatus(svcerr.ErrAuthentication, http.StatusUnauthorized),
|
||||
},
|
||||
{
|
||||
desc: "update with empty token",
|
||||
token: "",
|
||||
cfg: sdkBootstrapConfig,
|
||||
svcReq: bootstrap.Config{},
|
||||
svcErr: nil,
|
||||
err: errors.NewSDKErrorWithStatus(apiutil.ErrBearerToken, http.StatusUnauthorized),
|
||||
desc: "update with empty token",
|
||||
domainID: domainID,
|
||||
token: "",
|
||||
cfg: sdkBootstrapConfig,
|
||||
svcReq: bootstrap.Config{},
|
||||
svcErr: nil,
|
||||
err: errors.NewSDKErrorWithStatus(apiutil.ErrBearerToken, http.StatusUnauthorized),
|
||||
},
|
||||
{
|
||||
desc: "update with config that cannot be marshalled",
|
||||
token: validToken,
|
||||
desc: "update with config that cannot be marshalled",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
cfg: sdk.BootstrapConfig{
|
||||
Channels: map[string]interface{}{
|
||||
"channel1": make(chan int),
|
||||
@@ -682,8 +713,9 @@ func TestUpdateBootstrap(t *testing.T) {
|
||||
err: errors.NewSDKError(errMarshalChan),
|
||||
},
|
||||
{
|
||||
desc: "update with non-existent thing Id",
|
||||
token: validToken,
|
||||
desc: "update with non-existent thing Id",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
cfg: sdk.BootstrapConfig{
|
||||
ThingID: invalid,
|
||||
Channels: []sdk.Channel{
|
||||
@@ -705,8 +737,9 @@ func TestUpdateBootstrap(t *testing.T) {
|
||||
err: errors.NewSDKErrorWithStatus(svcerr.ErrNotFound, http.StatusNotFound),
|
||||
},
|
||||
{
|
||||
desc: "update with empty thing Id",
|
||||
token: validToken,
|
||||
desc: "update with empty thing Id",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
cfg: sdk.BootstrapConfig{
|
||||
ThingID: "",
|
||||
Channels: []sdk.Channel{
|
||||
@@ -728,8 +761,9 @@ func TestUpdateBootstrap(t *testing.T) {
|
||||
err: errors.NewSDKError(apiutil.ErrMissingID),
|
||||
},
|
||||
{
|
||||
desc: "update with config with only thing Id",
|
||||
token: validToken,
|
||||
desc: "update with config with only thing Id",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
cfg: sdk.BootstrapConfig{
|
||||
ThingID: thingId,
|
||||
},
|
||||
@@ -743,11 +777,11 @@ func TestUpdateBootstrap(t *testing.T) {
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
if tc.token == validToken {
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: validID}
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: domainID}
|
||||
}
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(tc.session, tc.authenticationErr)
|
||||
svcCall := bsvc.On("Update", mock.Anything, tc.session, tc.svcReq).Return(tc.svcErr)
|
||||
err := mgsdk.UpdateBootstrap(tc.cfg, tc.token)
|
||||
err := mgsdk.UpdateBootstrap(tc.cfg, tc.domainID, tc.token)
|
||||
assert.Equal(t, tc.err, err)
|
||||
if tc.err == nil {
|
||||
ok := svcCall.Parent.AssertCalled(t, "Update", mock.Anything, tc.session, tc.svcReq)
|
||||
@@ -777,6 +811,7 @@ func TestUpdateBootstrapCerts(t *testing.T) {
|
||||
|
||||
cases := []struct {
|
||||
desc string
|
||||
domainID string
|
||||
token string
|
||||
session mgauthn.Session
|
||||
id string
|
||||
@@ -791,6 +826,7 @@ func TestUpdateBootstrapCerts(t *testing.T) {
|
||||
}{
|
||||
{
|
||||
desc: "update certs successfully",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
id: thingId,
|
||||
clientCert: clientCert,
|
||||
@@ -803,6 +839,7 @@ func TestUpdateBootstrapCerts(t *testing.T) {
|
||||
},
|
||||
{
|
||||
desc: "update certs with invalid token",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
id: thingId,
|
||||
clientCert: clientCert,
|
||||
@@ -814,6 +851,7 @@ func TestUpdateBootstrapCerts(t *testing.T) {
|
||||
},
|
||||
{
|
||||
desc: "update certs with empty token",
|
||||
domainID: domainID,
|
||||
token: "",
|
||||
id: thingId,
|
||||
clientCert: clientCert,
|
||||
@@ -825,6 +863,7 @@ func TestUpdateBootstrapCerts(t *testing.T) {
|
||||
},
|
||||
{
|
||||
desc: "update certs with non-existent thing Id",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
id: invalid,
|
||||
clientCert: clientCert,
|
||||
@@ -836,6 +875,7 @@ func TestUpdateBootstrapCerts(t *testing.T) {
|
||||
},
|
||||
{
|
||||
desc: "update certs with empty certs",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
id: thingId,
|
||||
clientCert: "",
|
||||
@@ -847,6 +887,7 @@ func TestUpdateBootstrapCerts(t *testing.T) {
|
||||
},
|
||||
{
|
||||
desc: "update certs with empty id",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
id: "",
|
||||
clientCert: clientCert,
|
||||
@@ -859,11 +900,11 @@ func TestUpdateBootstrapCerts(t *testing.T) {
|
||||
}
|
||||
for _, tc := range cases {
|
||||
if tc.token == validToken {
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: validID}
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: domainID}
|
||||
}
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(tc.session, tc.authenticateErr)
|
||||
svcCall := bsvc.On("UpdateCert", mock.Anything, tc.session, tc.id, tc.clientCert, tc.clientKey, tc.caCert).Return(tc.svcResp, tc.svcErr)
|
||||
resp, err := mgsdk.UpdateBootstrapCerts(tc.id, tc.clientCert, tc.clientKey, tc.caCert, tc.token)
|
||||
resp, err := mgsdk.UpdateBootstrapCerts(tc.id, tc.clientCert, tc.clientKey, tc.caCert, tc.domainID, tc.token)
|
||||
assert.Equal(t, tc.err, err)
|
||||
if err == nil {
|
||||
assert.Equal(t, tc.response, resp)
|
||||
@@ -884,6 +925,7 @@ func TestUpdateBootstrapConnection(t *testing.T) {
|
||||
|
||||
cases := []struct {
|
||||
desc string
|
||||
domainID string
|
||||
token string
|
||||
session mgauthn.Session
|
||||
id string
|
||||
@@ -895,6 +937,7 @@ func TestUpdateBootstrapConnection(t *testing.T) {
|
||||
}{
|
||||
{
|
||||
desc: "update connection successfully",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
id: thingId,
|
||||
channels: []string{channel1Id, channel2Id},
|
||||
@@ -903,6 +946,7 @@ func TestUpdateBootstrapConnection(t *testing.T) {
|
||||
},
|
||||
{
|
||||
desc: "update connection with invalid token",
|
||||
domainID: domainID,
|
||||
token: invalidToken,
|
||||
id: thingId,
|
||||
channels: []string{channel1Id, channel2Id},
|
||||
@@ -911,6 +955,7 @@ func TestUpdateBootstrapConnection(t *testing.T) {
|
||||
},
|
||||
{
|
||||
desc: "update connection with empty token",
|
||||
domainID: domainID,
|
||||
token: "",
|
||||
id: thingId,
|
||||
channels: []string{channel1Id, channel2Id},
|
||||
@@ -919,6 +964,7 @@ func TestUpdateBootstrapConnection(t *testing.T) {
|
||||
},
|
||||
{
|
||||
desc: "update connection with non-existent thing Id",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
id: invalid,
|
||||
channels: []string{channel1Id, channel2Id},
|
||||
@@ -927,6 +973,7 @@ func TestUpdateBootstrapConnection(t *testing.T) {
|
||||
},
|
||||
{
|
||||
desc: "update connection with non-existent channel Id",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
id: thingId,
|
||||
channels: []string{invalid},
|
||||
@@ -935,6 +982,7 @@ func TestUpdateBootstrapConnection(t *testing.T) {
|
||||
},
|
||||
{
|
||||
desc: "update connection with empty channels",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
id: thingId,
|
||||
channels: []string{},
|
||||
@@ -943,6 +991,7 @@ func TestUpdateBootstrapConnection(t *testing.T) {
|
||||
},
|
||||
{
|
||||
desc: "update connection with empty id",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
id: "",
|
||||
channels: []string{channel1Id, channel2Id},
|
||||
@@ -953,11 +1002,11 @@ func TestUpdateBootstrapConnection(t *testing.T) {
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
if tc.token == validToken {
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: validID}
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: domainID}
|
||||
}
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(tc.session, tc.authenticateErr)
|
||||
svcCall := bsvc.On("UpdateConnections", mock.Anything, tc.session, tc.token, tc.id, tc.channels).Return(tc.svcErr)
|
||||
err := mgsdk.UpdateBootstrapConnection(tc.id, tc.channels, tc.token)
|
||||
err := mgsdk.UpdateBootstrapConnection(tc.id, tc.channels, tc.domainID, tc.token)
|
||||
assert.Equal(t, tc.err, err)
|
||||
if tc.err == nil {
|
||||
ok := svcCall.Parent.AssertCalled(t, "UpdateConnections", mock.Anything, tc.session, tc.token, tc.id, tc.channels)
|
||||
@@ -980,6 +1029,7 @@ func TestRemoveBootstrap(t *testing.T) {
|
||||
|
||||
cases := []struct {
|
||||
desc string
|
||||
domainID string
|
||||
token string
|
||||
session mgauthn.Session
|
||||
id string
|
||||
@@ -988,56 +1038,62 @@ func TestRemoveBootstrap(t *testing.T) {
|
||||
err errors.SDKError
|
||||
}{
|
||||
{
|
||||
desc: "remove successfully",
|
||||
token: validToken,
|
||||
id: thingId,
|
||||
svcErr: nil,
|
||||
err: nil,
|
||||
desc: "remove successfully",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
id: thingId,
|
||||
svcErr: nil,
|
||||
err: nil,
|
||||
},
|
||||
{
|
||||
desc: "remove with invalid token",
|
||||
domainID: domainID,
|
||||
token: invalidToken,
|
||||
id: thingId,
|
||||
authenticateErr: svcerr.ErrAuthentication,
|
||||
err: errors.NewSDKErrorWithStatus(svcerr.ErrAuthentication, http.StatusUnauthorized),
|
||||
},
|
||||
{
|
||||
desc: "remove with non-existent thing Id",
|
||||
token: validToken,
|
||||
id: invalid,
|
||||
svcErr: svcerr.ErrNotFound,
|
||||
err: errors.NewSDKErrorWithStatus(svcerr.ErrNotFound, http.StatusNotFound),
|
||||
desc: "remove with non-existent thing Id",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
id: invalid,
|
||||
svcErr: svcerr.ErrNotFound,
|
||||
err: errors.NewSDKErrorWithStatus(svcerr.ErrNotFound, http.StatusNotFound),
|
||||
},
|
||||
{
|
||||
desc: "remove removed bootstrap",
|
||||
token: validToken,
|
||||
id: thingId,
|
||||
svcErr: svcerr.ErrNotFound,
|
||||
err: errors.NewSDKErrorWithStatus(svcerr.ErrNotFound, http.StatusNotFound),
|
||||
desc: "remove removed bootstrap",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
id: thingId,
|
||||
svcErr: svcerr.ErrNotFound,
|
||||
err: errors.NewSDKErrorWithStatus(svcerr.ErrNotFound, http.StatusNotFound),
|
||||
},
|
||||
{
|
||||
desc: "remove with empty token",
|
||||
token: "",
|
||||
id: thingId,
|
||||
svcErr: nil,
|
||||
err: errors.NewSDKErrorWithStatus(apiutil.ErrBearerToken, http.StatusUnauthorized),
|
||||
desc: "remove with empty token",
|
||||
domainID: domainID,
|
||||
token: "",
|
||||
id: thingId,
|
||||
svcErr: nil,
|
||||
err: errors.NewSDKErrorWithStatus(apiutil.ErrBearerToken, http.StatusUnauthorized),
|
||||
},
|
||||
{
|
||||
desc: "remove with empty id",
|
||||
token: validToken,
|
||||
id: "",
|
||||
svcErr: nil,
|
||||
err: errors.NewSDKError(apiutil.ErrMissingID),
|
||||
desc: "remove with empty id",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
id: "",
|
||||
svcErr: nil,
|
||||
err: errors.NewSDKError(apiutil.ErrMissingID),
|
||||
},
|
||||
}
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
if tc.token == validToken {
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: validID}
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: domainID}
|
||||
}
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(tc.session, tc.authenticateErr)
|
||||
svcCall := bsvc.On("Remove", mock.Anything, tc.session, tc.id).Return(tc.svcErr)
|
||||
err := mgsdk.RemoveBootstrap(tc.id, tc.token)
|
||||
err := mgsdk.RemoveBootstrap(tc.id, tc.domainID, tc.token)
|
||||
assert.Equal(t, tc.err, err)
|
||||
if tc.err == nil {
|
||||
ok := svcCall.Parent.AssertCalled(t, "Remove", mock.Anything, tc.session, tc.id)
|
||||
|
||||
+8
-8
@@ -28,7 +28,7 @@ type Cert struct {
|
||||
ThingID string `json:"thing_id,omitempty"`
|
||||
}
|
||||
|
||||
func (sdk mgSDK) IssueCert(thingID, validity, token string) (Cert, errors.SDKError) {
|
||||
func (sdk mgSDK) IssueCert(thingID, validity, domainID, token string) (Cert, errors.SDKError) {
|
||||
r := certReq{
|
||||
ThingID: thingID,
|
||||
Validity: validity,
|
||||
@@ -38,7 +38,7 @@ func (sdk mgSDK) IssueCert(thingID, validity, token string) (Cert, errors.SDKErr
|
||||
return Cert{}, errors.NewSDKError(err)
|
||||
}
|
||||
|
||||
url := fmt.Sprintf("%s/%s", sdk.certsURL, certsEndpoint)
|
||||
url := fmt.Sprintf("%s/%s/%s", sdk.certsURL, domainID, certsEndpoint)
|
||||
|
||||
_, body, sdkerr := sdk.processRequest(http.MethodPost, url, token, d, nil, http.StatusCreated)
|
||||
if sdkerr != nil {
|
||||
@@ -52,8 +52,8 @@ func (sdk mgSDK) IssueCert(thingID, validity, token string) (Cert, errors.SDKErr
|
||||
return c, nil
|
||||
}
|
||||
|
||||
func (sdk mgSDK) ViewCert(id, token string) (Cert, errors.SDKError) {
|
||||
url := fmt.Sprintf("%s/%s/%s", sdk.certsURL, certsEndpoint, id)
|
||||
func (sdk mgSDK) ViewCert(id, domainID, token string) (Cert, errors.SDKError) {
|
||||
url := fmt.Sprintf("%s/%s/%s/%s", sdk.certsURL, domainID, certsEndpoint, id)
|
||||
|
||||
_, body, err := sdk.processRequest(http.MethodGet, url, token, nil, nil, http.StatusOK)
|
||||
if err != nil {
|
||||
@@ -68,11 +68,11 @@ func (sdk mgSDK) ViewCert(id, token string) (Cert, errors.SDKError) {
|
||||
return cert, nil
|
||||
}
|
||||
|
||||
func (sdk mgSDK) ViewCertByThing(thingID, token string) (CertSerials, errors.SDKError) {
|
||||
func (sdk mgSDK) ViewCertByThing(thingID, domainID, token string) (CertSerials, errors.SDKError) {
|
||||
if thingID == "" {
|
||||
return CertSerials{}, errors.NewSDKError(apiutil.ErrMissingID)
|
||||
}
|
||||
url := fmt.Sprintf("%s/%s/%s", sdk.certsURL, serialsEndpoint, thingID)
|
||||
url := fmt.Sprintf("%s/%s/%s/%s", sdk.certsURL, domainID, serialsEndpoint, thingID)
|
||||
|
||||
_, body, err := sdk.processRequest(http.MethodGet, url, token, nil, nil, http.StatusOK)
|
||||
if err != nil {
|
||||
@@ -86,8 +86,8 @@ func (sdk mgSDK) ViewCertByThing(thingID, token string) (CertSerials, errors.SDK
|
||||
return cs, nil
|
||||
}
|
||||
|
||||
func (sdk mgSDK) RevokeCert(id, token string) (time.Time, errors.SDKError) {
|
||||
url := fmt.Sprintf("%s/%s/%s", sdk.certsURL, certsEndpoint, id)
|
||||
func (sdk mgSDK) RevokeCert(id, domainID, token string) (time.Time, errors.SDKError) {
|
||||
url := fmt.Sprintf("%s/%s/%s/%s", sdk.certsURL, domainID, certsEndpoint, id)
|
||||
|
||||
_, body, err := sdk.processRequest(http.MethodDelete, url, token, nil, nil, http.StatusOK)
|
||||
if err != nil {
|
||||
|
||||
+100
-74
@@ -85,6 +85,7 @@ func TestIssueCert(t *testing.T) {
|
||||
desc string
|
||||
thingID string
|
||||
duration string
|
||||
domainID string
|
||||
token string
|
||||
session mgauthn.Session
|
||||
authenticateErr error
|
||||
@@ -96,6 +97,7 @@ func TestIssueCert(t *testing.T) {
|
||||
desc: "create new cert with thing id and duration",
|
||||
thingID: thingID,
|
||||
duration: ttl,
|
||||
domainID: validID,
|
||||
token: validToken,
|
||||
svcRes: certs.Cert{SerialNumber: serial},
|
||||
svcErr: nil,
|
||||
@@ -105,6 +107,7 @@ func TestIssueCert(t *testing.T) {
|
||||
desc: "create new cert with empty thing id and duration",
|
||||
thingID: "",
|
||||
duration: ttl,
|
||||
domainID: validID,
|
||||
token: validToken,
|
||||
svcRes: certs.Cert{},
|
||||
svcErr: errors.Wrap(certs.ErrFailedCertCreation, apiutil.ErrMissingID),
|
||||
@@ -114,6 +117,7 @@ func TestIssueCert(t *testing.T) {
|
||||
desc: "create new cert with invalid thing id and duration",
|
||||
thingID: invalid,
|
||||
duration: ttl,
|
||||
domainID: validID,
|
||||
token: validToken,
|
||||
svcRes: certs.Cert{},
|
||||
svcErr: errors.Wrap(certs.ErrFailedCertCreation, apiutil.ErrValidation),
|
||||
@@ -123,6 +127,7 @@ func TestIssueCert(t *testing.T) {
|
||||
desc: "create new cert with thing id and empty duration",
|
||||
thingID: thingID,
|
||||
duration: "",
|
||||
domainID: validID,
|
||||
token: validToken,
|
||||
svcRes: certs.Cert{},
|
||||
svcErr: errors.Wrap(certs.ErrFailedCertCreation, apiutil.ErrMissingCertData),
|
||||
@@ -132,6 +137,7 @@ func TestIssueCert(t *testing.T) {
|
||||
desc: "create new cert with thing id and malformed duration",
|
||||
thingID: thingID,
|
||||
duration: invalid,
|
||||
domainID: validID,
|
||||
token: validToken,
|
||||
svcRes: certs.Cert{},
|
||||
svcErr: errors.Wrap(certs.ErrFailedCertCreation, apiutil.ErrInvalidCertData),
|
||||
@@ -141,6 +147,7 @@ func TestIssueCert(t *testing.T) {
|
||||
desc: "create new cert with empty token",
|
||||
thingID: thingID,
|
||||
duration: ttl,
|
||||
domainID: validID,
|
||||
token: "",
|
||||
svcRes: certs.Cert{},
|
||||
svcErr: errors.Wrap(certs.ErrFailedCertCreation, svcerr.ErrAuthentication),
|
||||
@@ -149,6 +156,7 @@ func TestIssueCert(t *testing.T) {
|
||||
{
|
||||
desc: "create new cert with invalid token",
|
||||
thingID: thingID,
|
||||
domainID: domainID,
|
||||
duration: ttl,
|
||||
token: invalidToken,
|
||||
svcRes: certs.Cert{},
|
||||
@@ -159,6 +167,7 @@ func TestIssueCert(t *testing.T) {
|
||||
desc: "create new empty cert",
|
||||
thingID: "",
|
||||
duration: "",
|
||||
domainID: validID,
|
||||
token: validToken,
|
||||
svcRes: certs.Cert{},
|
||||
svcErr: errors.Wrap(certs.ErrFailedCertCreation, certs.ErrFailedCertCreation),
|
||||
@@ -172,12 +181,12 @@ func TestIssueCert(t *testing.T) {
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: validID}
|
||||
}
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(tc.session, tc.authenticateErr)
|
||||
svcCall := svc.On("IssueCert", mock.Anything, tc.token, tc.thingID, tc.duration).Return(tc.svcRes, tc.svcErr)
|
||||
resp, err := mgsdk.IssueCert(tc.thingID, tc.duration, tc.token)
|
||||
svcCall := svc.On("IssueCert", mock.Anything, tc.domainID, tc.token, tc.thingID, tc.duration).Return(tc.svcRes, tc.svcErr)
|
||||
resp, err := mgsdk.IssueCert(tc.thingID, tc.duration, tc.domainID, tc.token)
|
||||
assert.Equal(t, tc.err, err)
|
||||
if tc.err == nil {
|
||||
assert.Equal(t, tc.svcRes.SerialNumber, resp.SerialNumber)
|
||||
ok := svcCall.Parent.AssertCalled(t, "IssueCert", mock.Anything, tc.token, tc.thingID, tc.duration)
|
||||
ok := svcCall.Parent.AssertCalled(t, "IssueCert", mock.Anything, tc.domainID, tc.token, tc.thingID, tc.duration)
|
||||
assert.True(t, ok)
|
||||
}
|
||||
svcCall.Unset()
|
||||
@@ -204,6 +213,7 @@ func TestViewCert(t *testing.T) {
|
||||
cases := []struct {
|
||||
desc string
|
||||
certID string
|
||||
domainID string
|
||||
token string
|
||||
session mgauthn.Session
|
||||
authenticateErr error
|
||||
@@ -212,36 +222,40 @@ func TestViewCert(t *testing.T) {
|
||||
err errors.SDKError
|
||||
}{
|
||||
{
|
||||
desc: "view existing cert",
|
||||
certID: validID,
|
||||
token: token,
|
||||
svcRes: cert,
|
||||
svcErr: nil,
|
||||
err: nil,
|
||||
desc: "view existing cert",
|
||||
certID: validID,
|
||||
domainID: validID,
|
||||
token: validToken,
|
||||
svcRes: cert,
|
||||
svcErr: nil,
|
||||
err: nil,
|
||||
},
|
||||
{
|
||||
desc: "view non-existent cert",
|
||||
certID: invalid,
|
||||
token: token,
|
||||
svcRes: certs.Cert{},
|
||||
svcErr: errors.Wrap(svcerr.ErrNotFound, repoerr.ErrNotFound),
|
||||
err: errors.NewSDKErrorWithStatus(errors.Wrap(apiutil.ErrValidation, svcerr.ErrNotFound), http.StatusNotFound),
|
||||
desc: "view non-existent cert",
|
||||
certID: invalid,
|
||||
domainID: validID,
|
||||
token: validToken,
|
||||
svcRes: certs.Cert{},
|
||||
svcErr: errors.Wrap(svcerr.ErrNotFound, repoerr.ErrNotFound),
|
||||
err: errors.NewSDKErrorWithStatus(errors.Wrap(apiutil.ErrValidation, svcerr.ErrNotFound), http.StatusNotFound),
|
||||
},
|
||||
{
|
||||
desc: "view cert with invalid token",
|
||||
certID: validID,
|
||||
domainID: domainID,
|
||||
token: invalidToken,
|
||||
svcRes: certs.Cert{},
|
||||
authenticateErr: svcerr.ErrAuthentication,
|
||||
err: errors.NewSDKErrorWithStatus(svcerr.ErrAuthentication, http.StatusUnauthorized),
|
||||
},
|
||||
{
|
||||
desc: "view cert with empty token",
|
||||
certID: validID,
|
||||
token: "",
|
||||
svcRes: certs.Cert{},
|
||||
svcErr: nil,
|
||||
err: errors.NewSDKErrorWithStatus(apiutil.ErrBearerToken, http.StatusUnauthorized),
|
||||
desc: "view cert with empty token",
|
||||
certID: validID,
|
||||
domainID: domainID,
|
||||
token: "",
|
||||
svcRes: certs.Cert{},
|
||||
svcErr: nil,
|
||||
err: errors.NewSDKErrorWithStatus(apiutil.ErrBearerToken, http.StatusUnauthorized),
|
||||
},
|
||||
}
|
||||
|
||||
@@ -252,7 +266,7 @@ func TestViewCert(t *testing.T) {
|
||||
}
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(tc.session, tc.authenticateErr)
|
||||
svcCall := svc.On("ViewCert", mock.Anything, tc.certID).Return(tc.svcRes, tc.svcErr)
|
||||
resp, err := mgsdk.ViewCert(tc.certID, tc.token)
|
||||
resp, err := mgsdk.ViewCert(tc.certID, tc.domainID, tc.token)
|
||||
assert.Equal(t, tc.err, err)
|
||||
if err == nil {
|
||||
assert.Equal(t, viewCertRes, resp)
|
||||
@@ -285,6 +299,7 @@ func TestViewCertByThing(t *testing.T) {
|
||||
cases := []struct {
|
||||
desc string
|
||||
thingID string
|
||||
domainID string
|
||||
token string
|
||||
session mgauthn.Session
|
||||
authenticateErr error
|
||||
@@ -293,44 +308,49 @@ func TestViewCertByThing(t *testing.T) {
|
||||
err errors.SDKError
|
||||
}{
|
||||
{
|
||||
desc: "view existing cert",
|
||||
thingID: thingID,
|
||||
token: validToken,
|
||||
svcRes: certs.CertPage{Certificates: []certs.Cert{{SerialNumber: serial}}},
|
||||
svcErr: nil,
|
||||
err: nil,
|
||||
desc: "view existing cert",
|
||||
thingID: thingID,
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
svcRes: certs.CertPage{Certificates: []certs.Cert{{SerialNumber: serial}}},
|
||||
svcErr: nil,
|
||||
err: nil,
|
||||
},
|
||||
{
|
||||
desc: "view non-existent cert",
|
||||
thingID: invalid,
|
||||
token: validToken,
|
||||
svcRes: certs.CertPage{Certificates: []certs.Cert{}},
|
||||
svcErr: errors.Wrap(svcerr.ErrNotFound, repoerr.ErrNotFound),
|
||||
err: errors.NewSDKErrorWithStatus(errors.Wrap(apiutil.ErrValidation, svcerr.ErrNotFound), http.StatusNotFound),
|
||||
desc: "view non-existent cert",
|
||||
thingID: invalid,
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
svcRes: certs.CertPage{Certificates: []certs.Cert{}},
|
||||
svcErr: errors.Wrap(svcerr.ErrNotFound, repoerr.ErrNotFound),
|
||||
err: errors.NewSDKErrorWithStatus(errors.Wrap(apiutil.ErrValidation, svcerr.ErrNotFound), http.StatusNotFound),
|
||||
},
|
||||
{
|
||||
desc: "view cert with invalid token",
|
||||
thingID: thingID,
|
||||
domainID: domainID,
|
||||
token: invalidToken,
|
||||
svcRes: certs.CertPage{Certificates: []certs.Cert{}},
|
||||
authenticateErr: svcerr.ErrAuthentication,
|
||||
err: errors.NewSDKErrorWithStatus(svcerr.ErrAuthentication, http.StatusUnauthorized),
|
||||
},
|
||||
{
|
||||
desc: "view cert with empty token",
|
||||
thingID: thingID,
|
||||
token: "",
|
||||
svcRes: certs.CertPage{Certificates: []certs.Cert{}},
|
||||
svcErr: nil,
|
||||
err: errors.NewSDKErrorWithStatus(apiutil.ErrBearerToken, http.StatusUnauthorized),
|
||||
desc: "view cert with empty token",
|
||||
thingID: thingID,
|
||||
domainID: domainID,
|
||||
token: "",
|
||||
svcRes: certs.CertPage{Certificates: []certs.Cert{}},
|
||||
svcErr: nil,
|
||||
err: errors.NewSDKErrorWithStatus(apiutil.ErrBearerToken, http.StatusUnauthorized),
|
||||
},
|
||||
{
|
||||
desc: "view cert with empty thing id",
|
||||
thingID: "",
|
||||
token: validToken,
|
||||
svcRes: certs.CertPage{Certificates: []certs.Cert{}},
|
||||
svcErr: nil,
|
||||
err: errors.NewSDKError(apiutil.ErrMissingID),
|
||||
desc: "view cert with empty thing id",
|
||||
thingID: "",
|
||||
domainID: domainID,
|
||||
token: validToken,
|
||||
svcRes: certs.CertPage{Certificates: []certs.Cert{}},
|
||||
svcErr: nil,
|
||||
err: errors.NewSDKError(apiutil.ErrMissingID),
|
||||
},
|
||||
}
|
||||
for _, tc := range cases {
|
||||
@@ -340,7 +360,7 @@ func TestViewCertByThing(t *testing.T) {
|
||||
}
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(tc.session, tc.authenticateErr)
|
||||
svcCall := svc.On("ListSerials", mock.Anything, tc.thingID, certs.PageMetadata{Revoked: defRevoke, Offset: defOffset, Limit: defLimit}).Return(tc.svcRes, tc.svcErr)
|
||||
resp, err := mgsdk.ViewCertByThing(tc.thingID, tc.token)
|
||||
resp, err := mgsdk.ViewCertByThing(tc.thingID, tc.domainID, tc.token)
|
||||
assert.Equal(t, tc.err, err)
|
||||
if tc.err == nil {
|
||||
assert.Equal(t, viewCertThingRes, resp)
|
||||
@@ -368,6 +388,7 @@ func TestRevokeCert(t *testing.T) {
|
||||
cases := []struct {
|
||||
desc string
|
||||
thingID string
|
||||
domainID string
|
||||
token string
|
||||
session mgauthn.Session
|
||||
svcResp certs.Revoke
|
||||
@@ -376,44 +397,49 @@ func TestRevokeCert(t *testing.T) {
|
||||
err errors.SDKError
|
||||
}{
|
||||
{
|
||||
desc: "revoke cert successfully",
|
||||
thingID: thingID,
|
||||
token: validToken,
|
||||
svcResp: certs.Revoke{RevocationTime: time.Now()},
|
||||
svcErr: nil,
|
||||
err: nil,
|
||||
desc: "revoke cert successfully",
|
||||
thingID: thingID,
|
||||
domainID: validID,
|
||||
token: validToken,
|
||||
svcResp: certs.Revoke{RevocationTime: time.Now()},
|
||||
svcErr: nil,
|
||||
err: nil,
|
||||
},
|
||||
{
|
||||
desc: "revoke cert with invalid token",
|
||||
thingID: thingID,
|
||||
domainID: validID,
|
||||
token: invalidToken,
|
||||
svcResp: certs.Revoke{},
|
||||
authenticateErr: svcerr.ErrAuthentication,
|
||||
err: errors.NewSDKErrorWithStatus(svcerr.ErrAuthentication, http.StatusUnauthorized),
|
||||
},
|
||||
{
|
||||
desc: "revoke non-existing cert",
|
||||
thingID: invalid,
|
||||
token: token,
|
||||
svcResp: certs.Revoke{},
|
||||
svcErr: errors.Wrap(certs.ErrFailedCertRevocation, svcerr.ErrNotFound),
|
||||
err: errors.NewSDKErrorWithStatus(certs.ErrFailedCertRevocation, http.StatusNotFound),
|
||||
desc: "revoke non-existing cert",
|
||||
thingID: invalid,
|
||||
domainID: validID,
|
||||
token: validToken,
|
||||
svcResp: certs.Revoke{},
|
||||
svcErr: errors.Wrap(certs.ErrFailedCertRevocation, svcerr.ErrNotFound),
|
||||
err: errors.NewSDKErrorWithStatus(certs.ErrFailedCertRevocation, http.StatusNotFound),
|
||||
},
|
||||
{
|
||||
desc: "revoke cert with empty token",
|
||||
thingID: thingID,
|
||||
token: "",
|
||||
svcResp: certs.Revoke{},
|
||||
svcErr: nil,
|
||||
err: errors.NewSDKErrorWithStatus(apiutil.ErrBearerToken, http.StatusUnauthorized),
|
||||
desc: "revoke cert with empty token",
|
||||
thingID: thingID,
|
||||
domainID: validID,
|
||||
token: "",
|
||||
svcResp: certs.Revoke{},
|
||||
svcErr: nil,
|
||||
err: errors.NewSDKErrorWithStatus(apiutil.ErrBearerToken, http.StatusUnauthorized),
|
||||
},
|
||||
{
|
||||
desc: "revoke deleted cert",
|
||||
thingID: thingID,
|
||||
token: token,
|
||||
svcResp: certs.Revoke{},
|
||||
svcErr: errors.Wrap(certs.ErrFailedToRemoveCertFromDB, svcerr.ErrNotFound),
|
||||
err: errors.NewSDKErrorWithStatus(certs.ErrFailedToRemoveCertFromDB, http.StatusNotFound),
|
||||
desc: "revoke deleted cert",
|
||||
thingID: thingID,
|
||||
domainID: validID,
|
||||
token: validToken,
|
||||
svcResp: certs.Revoke{},
|
||||
svcErr: errors.Wrap(certs.ErrFailedToRemoveCertFromDB, svcerr.ErrNotFound),
|
||||
err: errors.NewSDKErrorWithStatus(certs.ErrFailedToRemoveCertFromDB, http.StatusNotFound),
|
||||
},
|
||||
}
|
||||
for _, tc := range cases {
|
||||
@@ -422,12 +448,12 @@ func TestRevokeCert(t *testing.T) {
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: validID}
|
||||
}
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(tc.session, tc.authenticateErr)
|
||||
svcCall := svc.On("RevokeCert", mock.Anything, tc.token, tc.thingID).Return(tc.svcResp, tc.svcErr)
|
||||
resp, err := mgsdk.RevokeCert(tc.thingID, tc.token)
|
||||
svcCall := svc.On("RevokeCert", mock.Anything, tc.domainID, tc.token, tc.thingID).Return(tc.svcResp, tc.svcErr)
|
||||
resp, err := mgsdk.RevokeCert(tc.thingID, tc.domainID, tc.token)
|
||||
assert.Equal(t, tc.err, err)
|
||||
if err == nil {
|
||||
assert.NotEmpty(t, resp)
|
||||
ok := svcCall.Parent.AssertCalled(t, "RevokeCert", mock.Anything, tc.token, tc.thingID)
|
||||
ok := svcCall.Parent.AssertCalled(t, "RevokeCert", mock.Anything, tc.domainID, tc.token, tc.thingID)
|
||||
assert.True(t, ok)
|
||||
}
|
||||
svcCall.Unset()
|
||||
|
||||
+38
-37
@@ -32,12 +32,12 @@ type Channel struct {
|
||||
Permissions []string `json:"permissions,omitempty"`
|
||||
}
|
||||
|
||||
func (sdk mgSDK) CreateChannel(c Channel, token string) (Channel, errors.SDKError) {
|
||||
func (sdk mgSDK) CreateChannel(c Channel, domainID, token string) (Channel, errors.SDKError) {
|
||||
data, err := json.Marshal(c)
|
||||
if err != nil {
|
||||
return Channel{}, errors.NewSDKError(err)
|
||||
}
|
||||
url := fmt.Sprintf("%s/%s", sdk.thingsURL, channelsEndpoint)
|
||||
url := fmt.Sprintf("%s/%s/%s", sdk.thingsURL, domainID, channelsEndpoint)
|
||||
|
||||
_, body, sdkerr := sdk.processRequest(http.MethodPost, url, token, data, nil, http.StatusCreated)
|
||||
if sdkerr != nil {
|
||||
@@ -53,7 +53,8 @@ func (sdk mgSDK) CreateChannel(c Channel, token string) (Channel, errors.SDKErro
|
||||
}
|
||||
|
||||
func (sdk mgSDK) Channels(pm PageMetadata, token string) (ChannelsPage, errors.SDKError) {
|
||||
url, err := sdk.withQueryParams(sdk.thingsURL, channelsEndpoint, pm)
|
||||
endpoint := fmt.Sprintf("%s/%s", pm.DomainID, channelsEndpoint)
|
||||
url, err := sdk.withQueryParams(sdk.thingsURL, endpoint, pm)
|
||||
if err != nil {
|
||||
return ChannelsPage{}, errors.NewSDKError(err)
|
||||
}
|
||||
@@ -71,8 +72,8 @@ func (sdk mgSDK) Channels(pm PageMetadata, token string) (ChannelsPage, errors.S
|
||||
return cp, nil
|
||||
}
|
||||
|
||||
func (sdk mgSDK) ChannelsByThing(thingID string, pm PageMetadata, token string) (ChannelsPage, errors.SDKError) {
|
||||
url, err := sdk.withQueryParams(fmt.Sprintf("%s/things/%s", sdk.thingsURL, thingID), channelsEndpoint, pm)
|
||||
func (sdk mgSDK) ChannelsByThing(thingID string, pm PageMetadata, domainID, token string) (ChannelsPage, errors.SDKError) {
|
||||
url, err := sdk.withQueryParams(fmt.Sprintf("%s/%s/things/%s", sdk.thingsURL, domainID, thingID), channelsEndpoint, pm)
|
||||
if err != nil {
|
||||
return ChannelsPage{}, errors.NewSDKError(err)
|
||||
}
|
||||
@@ -90,11 +91,11 @@ func (sdk mgSDK) ChannelsByThing(thingID string, pm PageMetadata, token string)
|
||||
return cp, nil
|
||||
}
|
||||
|
||||
func (sdk mgSDK) Channel(id, token string) (Channel, errors.SDKError) {
|
||||
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", sdk.thingsURL, channelsEndpoint, id)
|
||||
url := fmt.Sprintf("%s/%s/%s/%s", sdk.thingsURL, domainID, channelsEndpoint, id)
|
||||
|
||||
_, body, err := sdk.processRequest(http.MethodGet, url, token, nil, nil, http.StatusOK)
|
||||
if err != nil {
|
||||
@@ -109,8 +110,8 @@ func (sdk mgSDK) Channel(id, token string) (Channel, errors.SDKError) {
|
||||
return c, nil
|
||||
}
|
||||
|
||||
func (sdk mgSDK) ChannelPermissions(id, token string) (Channel, errors.SDKError) {
|
||||
url := fmt.Sprintf("%s/%s/%s/%s", sdk.thingsURL, channelsEndpoint, id, permissionsEndpoint)
|
||||
func (sdk mgSDK) ChannelPermissions(id, domainID, token string) (Channel, errors.SDKError) {
|
||||
url := fmt.Sprintf("%s/%s/%s/%s/%s", sdk.thingsURL, domainID, channelsEndpoint, id, permissionsEndpoint)
|
||||
|
||||
_, body, err := sdk.processRequest(http.MethodGet, url, token, nil, nil, http.StatusOK)
|
||||
if err != nil {
|
||||
@@ -125,11 +126,11 @@ func (sdk mgSDK) ChannelPermissions(id, token string) (Channel, errors.SDKError)
|
||||
return c, nil
|
||||
}
|
||||
|
||||
func (sdk mgSDK) UpdateChannel(c Channel, token string) (Channel, errors.SDKError) {
|
||||
func (sdk mgSDK) UpdateChannel(c Channel, domainID, token string) (Channel, errors.SDKError) {
|
||||
if c.ID == "" {
|
||||
return Channel{}, errors.NewSDKError(apiutil.ErrMissingID)
|
||||
}
|
||||
url := fmt.Sprintf("%s/%s/%s", sdk.thingsURL, channelsEndpoint, c.ID)
|
||||
url := fmt.Sprintf("%s/%s/%s/%s", sdk.thingsURL, domainID, channelsEndpoint, c.ID)
|
||||
|
||||
data, err := json.Marshal(c)
|
||||
if err != nil {
|
||||
@@ -149,32 +150,32 @@ func (sdk mgSDK) UpdateChannel(c Channel, token string) (Channel, errors.SDKErro
|
||||
return c, nil
|
||||
}
|
||||
|
||||
func (sdk mgSDK) AddUserToChannel(channelID string, req UsersRelationRequest, token string) errors.SDKError {
|
||||
func (sdk mgSDK) AddUserToChannel(channelID string, req UsersRelationRequest, domainID, token string) errors.SDKError {
|
||||
data, err := json.Marshal(req)
|
||||
if err != nil {
|
||||
return errors.NewSDKError(err)
|
||||
}
|
||||
|
||||
url := fmt.Sprintf("%s/%s/%s/%s/%s", sdk.thingsURL, channelsEndpoint, channelID, usersEndpoint, assignEndpoint)
|
||||
url := fmt.Sprintf("%s/%s/%s/%s/%s/%s", sdk.thingsURL, domainID, channelsEndpoint, channelID, usersEndpoint, assignEndpoint)
|
||||
|
||||
_, _, sdkerr := sdk.processRequest(http.MethodPost, url, token, data, nil, http.StatusCreated)
|
||||
return sdkerr
|
||||
}
|
||||
|
||||
func (sdk mgSDK) RemoveUserFromChannel(channelID string, req UsersRelationRequest, token string) errors.SDKError {
|
||||
func (sdk mgSDK) RemoveUserFromChannel(channelID string, req UsersRelationRequest, domainID, token string) errors.SDKError {
|
||||
data, err := json.Marshal(req)
|
||||
if err != nil {
|
||||
return errors.NewSDKError(err)
|
||||
}
|
||||
|
||||
url := fmt.Sprintf("%s/%s/%s/%s/%s", sdk.thingsURL, channelsEndpoint, channelID, usersEndpoint, unassignEndpoint)
|
||||
url := fmt.Sprintf("%s/%s/%s/%s/%s/%s", sdk.thingsURL, domainID, channelsEndpoint, channelID, usersEndpoint, unassignEndpoint)
|
||||
|
||||
_, _, sdkerr := sdk.processRequest(http.MethodPost, url, token, data, nil, http.StatusNoContent)
|
||||
return sdkerr
|
||||
}
|
||||
|
||||
func (sdk mgSDK) ListChannelUsers(channelID string, pm PageMetadata, token string) (UsersPage, errors.SDKError) {
|
||||
url, err := sdk.withQueryParams(sdk.usersURL, fmt.Sprintf("%s/%s/%s", channelsEndpoint, channelID, usersEndpoint), pm)
|
||||
url, err := sdk.withQueryParams(sdk.usersURL, fmt.Sprintf("%s/%s/%s/%s", pm.DomainID, channelsEndpoint, channelID, usersEndpoint), pm)
|
||||
if err != nil {
|
||||
return UsersPage{}, errors.NewSDKError(err)
|
||||
}
|
||||
@@ -190,32 +191,32 @@ func (sdk mgSDK) ListChannelUsers(channelID string, pm PageMetadata, token strin
|
||||
return up, nil
|
||||
}
|
||||
|
||||
func (sdk mgSDK) AddUserGroupToChannel(channelID string, req UserGroupsRequest, token string) errors.SDKError {
|
||||
func (sdk mgSDK) AddUserGroupToChannel(channelID string, req UserGroupsRequest, domainID, token string) errors.SDKError {
|
||||
data, err := json.Marshal(req)
|
||||
if err != nil {
|
||||
return errors.NewSDKError(err)
|
||||
}
|
||||
|
||||
url := fmt.Sprintf("%s/%s/%s/%s/%s", sdk.thingsURL, channelsEndpoint, channelID, groupsEndpoint, assignEndpoint)
|
||||
url := fmt.Sprintf("%s/%s/%s/%s/%s/%s", sdk.thingsURL, domainID, channelsEndpoint, channelID, groupsEndpoint, assignEndpoint)
|
||||
|
||||
_, _, sdkerr := sdk.processRequest(http.MethodPost, url, token, data, nil, http.StatusCreated)
|
||||
return sdkerr
|
||||
}
|
||||
|
||||
func (sdk mgSDK) RemoveUserGroupFromChannel(channelID string, req UserGroupsRequest, token string) errors.SDKError {
|
||||
func (sdk mgSDK) RemoveUserGroupFromChannel(channelID string, req UserGroupsRequest, domainID, token string) errors.SDKError {
|
||||
data, err := json.Marshal(req)
|
||||
if err != nil {
|
||||
return errors.NewSDKError(err)
|
||||
}
|
||||
|
||||
url := fmt.Sprintf("%s/%s/%s/%s/%s", sdk.thingsURL, channelsEndpoint, channelID, groupsEndpoint, unassignEndpoint)
|
||||
url := fmt.Sprintf("%s/%s/%s/%s/%s/%s", sdk.thingsURL, domainID, channelsEndpoint, channelID, groupsEndpoint, unassignEndpoint)
|
||||
|
||||
_, _, sdkerr := sdk.processRequest(http.MethodPost, url, token, data, nil, http.StatusNoContent)
|
||||
return sdkerr
|
||||
}
|
||||
|
||||
func (sdk mgSDK) ListChannelUserGroups(channelID string, pm PageMetadata, token string) (GroupsPage, errors.SDKError) {
|
||||
url, err := sdk.withQueryParams(sdk.usersURL, fmt.Sprintf("%s/%s/%s", channelsEndpoint, channelID, groupsEndpoint), pm)
|
||||
url, err := sdk.withQueryParams(sdk.usersURL, fmt.Sprintf("%s/%s/%s/%s", pm.DomainID, channelsEndpoint, channelID, groupsEndpoint), pm)
|
||||
if err != nil {
|
||||
return GroupsPage{}, errors.NewSDKError(err)
|
||||
}
|
||||
@@ -231,67 +232,67 @@ func (sdk mgSDK) ListChannelUserGroups(channelID string, pm PageMetadata, token
|
||||
return gp, nil
|
||||
}
|
||||
|
||||
func (sdk mgSDK) Connect(conn Connection, token string) errors.SDKError {
|
||||
func (sdk mgSDK) Connect(conn Connection, domainID, token string) errors.SDKError {
|
||||
data, err := json.Marshal(conn)
|
||||
if err != nil {
|
||||
return errors.NewSDKError(err)
|
||||
}
|
||||
|
||||
url := fmt.Sprintf("%s/%s", sdk.thingsURL, connectEndpoint)
|
||||
url := fmt.Sprintf("%s/%s/%s", sdk.thingsURL, domainID, connectEndpoint)
|
||||
|
||||
_, _, sdkerr := sdk.processRequest(http.MethodPost, url, token, data, nil, http.StatusCreated)
|
||||
|
||||
return sdkerr
|
||||
}
|
||||
|
||||
func (sdk mgSDK) Disconnect(connIDs Connection, token string) errors.SDKError {
|
||||
func (sdk mgSDK) Disconnect(connIDs Connection, domainID, token string) errors.SDKError {
|
||||
data, err := json.Marshal(connIDs)
|
||||
if err != nil {
|
||||
return errors.NewSDKError(err)
|
||||
}
|
||||
|
||||
url := fmt.Sprintf("%s/%s", sdk.thingsURL, disconnectEndpoint)
|
||||
url := fmt.Sprintf("%s/%s/%s", sdk.thingsURL, domainID, disconnectEndpoint)
|
||||
|
||||
_, _, sdkerr := sdk.processRequest(http.MethodPost, url, token, data, nil, http.StatusNoContent)
|
||||
|
||||
return sdkerr
|
||||
}
|
||||
|
||||
func (sdk mgSDK) ConnectThing(thingID, channelID, token string) errors.SDKError {
|
||||
url := fmt.Sprintf("%s/%s/%s/%s/%s/%s", sdk.thingsURL, channelsEndpoint, channelID, thingsEndpoint, thingID, connectEndpoint)
|
||||
func (sdk mgSDK) ConnectThing(thingID, channelID, domainID, token string) errors.SDKError {
|
||||
url := fmt.Sprintf("%s/%s/%s/%s/%s/%s/%s", sdk.thingsURL, domainID, channelsEndpoint, channelID, thingsEndpoint, thingID, connectEndpoint)
|
||||
|
||||
_, _, sdkerr := sdk.processRequest(http.MethodPost, url, token, nil, nil, http.StatusCreated)
|
||||
|
||||
return sdkerr
|
||||
}
|
||||
|
||||
func (sdk mgSDK) DisconnectThing(thingID, channelID, token string) errors.SDKError {
|
||||
url := fmt.Sprintf("%s/%s/%s/%s/%s/%s", sdk.thingsURL, channelsEndpoint, channelID, thingsEndpoint, thingID, disconnectEndpoint)
|
||||
func (sdk mgSDK) DisconnectThing(thingID, channelID, domainID, token string) errors.SDKError {
|
||||
url := fmt.Sprintf("%s/%s/%s/%s/%s/%s/%s", sdk.thingsURL, domainID, channelsEndpoint, channelID, thingsEndpoint, thingID, disconnectEndpoint)
|
||||
|
||||
_, _, sdkerr := sdk.processRequest(http.MethodPost, url, token, nil, nil, http.StatusNoContent)
|
||||
|
||||
return sdkerr
|
||||
}
|
||||
|
||||
func (sdk mgSDK) EnableChannel(id, token string) (Channel, errors.SDKError) {
|
||||
return sdk.changeChannelStatus(id, enableEndpoint, token)
|
||||
func (sdk mgSDK) EnableChannel(id, domainID, token string) (Channel, errors.SDKError) {
|
||||
return sdk.changeChannelStatus(id, enableEndpoint, domainID, token)
|
||||
}
|
||||
|
||||
func (sdk mgSDK) DisableChannel(id, token string) (Channel, errors.SDKError) {
|
||||
return sdk.changeChannelStatus(id, disableEndpoint, token)
|
||||
func (sdk mgSDK) DisableChannel(id, domainID, token string) (Channel, errors.SDKError) {
|
||||
return sdk.changeChannelStatus(id, disableEndpoint, domainID, token)
|
||||
}
|
||||
|
||||
func (sdk mgSDK) DeleteChannel(id, token string) errors.SDKError {
|
||||
func (sdk mgSDK) DeleteChannel(id, domainID, token string) errors.SDKError {
|
||||
if id == "" {
|
||||
return errors.NewSDKError(apiutil.ErrMissingID)
|
||||
}
|
||||
url := fmt.Sprintf("%s/%s/%s", sdk.thingsURL, channelsEndpoint, id)
|
||||
url := fmt.Sprintf("%s/%s/%s/%s", sdk.thingsURL, domainID, channelsEndpoint, id)
|
||||
_, _, sdkerr := sdk.processRequest(http.MethodDelete, url, token, nil, nil, http.StatusNoContent)
|
||||
return sdkerr
|
||||
}
|
||||
|
||||
func (sdk mgSDK) changeChannelStatus(id, status, token string) (Channel, errors.SDKError) {
|
||||
url := fmt.Sprintf("%s/%s/%s/%s", sdk.thingsURL, channelsEndpoint, id, status)
|
||||
func (sdk mgSDK) changeChannelStatus(id, status, domainID, token string) (Channel, errors.SDKError) {
|
||||
url := fmt.Sprintf("%s/%s/%s/%s/%s", sdk.thingsURL, domainID, channelsEndpoint, id, status)
|
||||
|
||||
_, body, err := sdk.processRequest(http.MethodPost, url, token, nil, nil, http.StatusOK)
|
||||
if err != nil {
|
||||
|
||||
+307
-154
File diff suppressed because it is too large
Load Diff
+28
-25
@@ -39,12 +39,12 @@ type Group struct {
|
||||
Permissions []string `json:"permissions,omitempty"`
|
||||
}
|
||||
|
||||
func (sdk mgSDK) CreateGroup(g Group, token string) (Group, errors.SDKError) {
|
||||
func (sdk mgSDK) CreateGroup(g Group, domainID, token string) (Group, errors.SDKError) {
|
||||
data, err := json.Marshal(g)
|
||||
if err != nil {
|
||||
return Group{}, errors.NewSDKError(err)
|
||||
}
|
||||
url := fmt.Sprintf("%s/%s", sdk.usersURL, groupsEndpoint)
|
||||
url := fmt.Sprintf("%s/%s/%s", sdk.usersURL, domainID, groupsEndpoint)
|
||||
|
||||
_, body, sdkerr := sdk.processRequest(http.MethodPost, url, token, data, nil, http.StatusCreated)
|
||||
if sdkerr != nil {
|
||||
@@ -60,7 +60,8 @@ func (sdk mgSDK) CreateGroup(g Group, token string) (Group, errors.SDKError) {
|
||||
}
|
||||
|
||||
func (sdk mgSDK) Groups(pm PageMetadata, token string) (GroupsPage, errors.SDKError) {
|
||||
url, err := sdk.withQueryParams(sdk.usersURL, groupsEndpoint, pm)
|
||||
endpoint := fmt.Sprintf("%s/%s", pm.DomainID, groupsEndpoint)
|
||||
url, err := sdk.withQueryParams(sdk.usersURL, endpoint, pm)
|
||||
if err != nil {
|
||||
return GroupsPage{}, errors.NewSDKError(err)
|
||||
}
|
||||
@@ -70,7 +71,8 @@ func (sdk mgSDK) Groups(pm PageMetadata, token string) (GroupsPage, errors.SDKEr
|
||||
|
||||
func (sdk mgSDK) Parents(id string, pm PageMetadata, token string) (GroupsPage, errors.SDKError) {
|
||||
pm.Level = MaxLevel
|
||||
url, err := sdk.withQueryParams(fmt.Sprintf("%s/%s/%s", sdk.usersURL, groupsEndpoint, id), "parents", pm)
|
||||
endpoint := fmt.Sprintf("%s/%s", pm.DomainID, groupsEndpoint)
|
||||
url, err := sdk.withQueryParams(fmt.Sprintf("%s/%s/%s", sdk.usersURL, endpoint, id), "parents", pm)
|
||||
if err != nil {
|
||||
return GroupsPage{}, errors.NewSDKError(err)
|
||||
}
|
||||
@@ -80,7 +82,8 @@ func (sdk mgSDK) Parents(id string, pm PageMetadata, token string) (GroupsPage,
|
||||
|
||||
func (sdk mgSDK) Children(id string, pm PageMetadata, token string) (GroupsPage, errors.SDKError) {
|
||||
pm.Level = MaxLevel
|
||||
url, err := sdk.withQueryParams(fmt.Sprintf("%s/%s/%s", sdk.usersURL, groupsEndpoint, id), "children", pm)
|
||||
endpoint := fmt.Sprintf("%s/%s", pm.DomainID, groupsEndpoint)
|
||||
url, err := sdk.withQueryParams(fmt.Sprintf("%s/%s/%s", sdk.usersURL, endpoint, id), "children", pm)
|
||||
if err != nil {
|
||||
return GroupsPage{}, errors.NewSDKError(err)
|
||||
}
|
||||
@@ -102,12 +105,12 @@ func (sdk mgSDK) getGroups(url, token string) (GroupsPage, errors.SDKError) {
|
||||
return tp, nil
|
||||
}
|
||||
|
||||
func (sdk mgSDK) Group(id, token string) (Group, errors.SDKError) {
|
||||
func (sdk mgSDK) Group(id, domainID, token string) (Group, errors.SDKError) {
|
||||
if id == "" {
|
||||
return Group{}, errors.NewSDKError(apiutil.ErrMissingID)
|
||||
}
|
||||
|
||||
url := fmt.Sprintf("%s/%s/%s", sdk.usersURL, groupsEndpoint, id)
|
||||
url := fmt.Sprintf("%s/%s/%s/%s", sdk.usersURL, domainID, groupsEndpoint, id)
|
||||
|
||||
_, body, err := sdk.processRequest(http.MethodGet, url, token, nil, nil, http.StatusOK)
|
||||
if err != nil {
|
||||
@@ -122,8 +125,8 @@ func (sdk mgSDK) Group(id, token string) (Group, errors.SDKError) {
|
||||
return t, nil
|
||||
}
|
||||
|
||||
func (sdk mgSDK) GroupPermissions(id, token string) (Group, errors.SDKError) {
|
||||
url := fmt.Sprintf("%s/%s/%s/%s", sdk.usersURL, groupsEndpoint, id, permissionsEndpoint)
|
||||
func (sdk mgSDK) GroupPermissions(id, domainID, token string) (Group, errors.SDKError) {
|
||||
url := fmt.Sprintf("%s/%s/%s/%s/%s", sdk.usersURL, domainID, groupsEndpoint, id, permissionsEndpoint)
|
||||
|
||||
_, body, err := sdk.processRequest(http.MethodGet, url, token, nil, nil, http.StatusOK)
|
||||
if err != nil {
|
||||
@@ -138,7 +141,7 @@ func (sdk mgSDK) GroupPermissions(id, token string) (Group, errors.SDKError) {
|
||||
return t, nil
|
||||
}
|
||||
|
||||
func (sdk mgSDK) UpdateGroup(g Group, token string) (Group, errors.SDKError) {
|
||||
func (sdk mgSDK) UpdateGroup(g Group, domainID, token string) (Group, errors.SDKError) {
|
||||
data, err := json.Marshal(g)
|
||||
if err != nil {
|
||||
return Group{}, errors.NewSDKError(err)
|
||||
@@ -147,7 +150,7 @@ func (sdk mgSDK) UpdateGroup(g Group, token string) (Group, errors.SDKError) {
|
||||
if g.ID == "" {
|
||||
return Group{}, errors.NewSDKError(apiutil.ErrMissingID)
|
||||
}
|
||||
url := fmt.Sprintf("%s/%s/%s", sdk.usersURL, groupsEndpoint, g.ID)
|
||||
url := fmt.Sprintf("%s/%s/%s/%s", sdk.usersURL, domainID, groupsEndpoint, g.ID)
|
||||
|
||||
_, body, sdkerr := sdk.processRequest(http.MethodPut, url, token, data, nil, http.StatusOK)
|
||||
if sdkerr != nil {
|
||||
@@ -162,40 +165,40 @@ func (sdk mgSDK) UpdateGroup(g Group, token string) (Group, errors.SDKError) {
|
||||
return g, nil
|
||||
}
|
||||
|
||||
func (sdk mgSDK) EnableGroup(id, token string) (Group, errors.SDKError) {
|
||||
return sdk.changeGroupStatus(id, enableEndpoint, token)
|
||||
func (sdk mgSDK) EnableGroup(id, domainID, token string) (Group, errors.SDKError) {
|
||||
return sdk.changeGroupStatus(id, enableEndpoint, domainID, token)
|
||||
}
|
||||
|
||||
func (sdk mgSDK) DisableGroup(id, token string) (Group, errors.SDKError) {
|
||||
return sdk.changeGroupStatus(id, disableEndpoint, token)
|
||||
func (sdk mgSDK) DisableGroup(id, domainID, token string) (Group, errors.SDKError) {
|
||||
return sdk.changeGroupStatus(id, disableEndpoint, domainID, token)
|
||||
}
|
||||
|
||||
func (sdk mgSDK) AddUserToGroup(groupID string, req UsersRelationRequest, token string) errors.SDKError {
|
||||
func (sdk mgSDK) AddUserToGroup(groupID string, req UsersRelationRequest, domainID, token string) errors.SDKError {
|
||||
data, err := json.Marshal(req)
|
||||
if err != nil {
|
||||
return errors.NewSDKError(err)
|
||||
}
|
||||
|
||||
url := fmt.Sprintf("%s/%s/%s/%s/%s", sdk.usersURL, groupsEndpoint, groupID, usersEndpoint, assignEndpoint)
|
||||
url := fmt.Sprintf("%s/%s/%s/%s/%s/%s", sdk.usersURL, domainID, groupsEndpoint, groupID, usersEndpoint, assignEndpoint)
|
||||
|
||||
_, _, sdkerr := sdk.processRequest(http.MethodPost, url, token, data, nil, http.StatusCreated)
|
||||
return sdkerr
|
||||
}
|
||||
|
||||
func (sdk mgSDK) RemoveUserFromGroup(groupID string, req UsersRelationRequest, token string) errors.SDKError {
|
||||
func (sdk mgSDK) RemoveUserFromGroup(groupID string, req UsersRelationRequest, domainID, token string) errors.SDKError {
|
||||
data, err := json.Marshal(req)
|
||||
if err != nil {
|
||||
return errors.NewSDKError(err)
|
||||
}
|
||||
|
||||
url := fmt.Sprintf("%s/%s/%s/%s/%s", sdk.usersURL, groupsEndpoint, groupID, usersEndpoint, unassignEndpoint)
|
||||
url := fmt.Sprintf("%s/%s/%s/%s/%s/%s", sdk.usersURL, domainID, groupsEndpoint, groupID, usersEndpoint, unassignEndpoint)
|
||||
|
||||
_, _, sdkerr := sdk.processRequest(http.MethodPost, url, token, data, nil, http.StatusNoContent)
|
||||
return sdkerr
|
||||
}
|
||||
|
||||
func (sdk mgSDK) ListGroupUsers(groupID string, pm PageMetadata, token string) (UsersPage, errors.SDKError) {
|
||||
url, err := sdk.withQueryParams(sdk.usersURL, fmt.Sprintf("%s/%s/%s", groupsEndpoint, groupID, usersEndpoint), pm)
|
||||
url, err := sdk.withQueryParams(sdk.usersURL, fmt.Sprintf("%s/%s/%s/%s", pm.DomainID, groupsEndpoint, groupID, usersEndpoint), pm)
|
||||
if err != nil {
|
||||
return UsersPage{}, errors.NewSDKError(err)
|
||||
}
|
||||
@@ -212,7 +215,7 @@ func (sdk mgSDK) ListGroupUsers(groupID string, pm PageMetadata, token string) (
|
||||
}
|
||||
|
||||
func (sdk mgSDK) ListGroupChannels(groupID string, pm PageMetadata, token string) (ChannelsPage, errors.SDKError) {
|
||||
url, err := sdk.withQueryParams(sdk.thingsURL, fmt.Sprintf("%s/%s/%s", groupsEndpoint, groupID, channelsEndpoint), pm)
|
||||
url, err := sdk.withQueryParams(sdk.thingsURL, fmt.Sprintf("%s/%s/%s/%s", pm.DomainID, groupsEndpoint, groupID, channelsEndpoint), pm)
|
||||
if err != nil {
|
||||
return ChannelsPage{}, errors.NewSDKError(err)
|
||||
}
|
||||
@@ -228,17 +231,17 @@ func (sdk mgSDK) ListGroupChannels(groupID string, pm PageMetadata, token string
|
||||
return cp, nil
|
||||
}
|
||||
|
||||
func (sdk mgSDK) DeleteGroup(id, token string) errors.SDKError {
|
||||
func (sdk mgSDK) DeleteGroup(id, domainID, token string) errors.SDKError {
|
||||
if id == "" {
|
||||
return errors.NewSDKError(apiutil.ErrMissingID)
|
||||
}
|
||||
url := fmt.Sprintf("%s/%s/%s", sdk.usersURL, groupsEndpoint, id)
|
||||
url := fmt.Sprintf("%s/%s/%s/%s", sdk.usersURL, domainID, groupsEndpoint, id)
|
||||
_, _, sdkerr := sdk.processRequest(http.MethodDelete, url, token, nil, nil, http.StatusNoContent)
|
||||
return sdkerr
|
||||
}
|
||||
|
||||
func (sdk mgSDK) changeGroupStatus(id, status, token string) (Group, errors.SDKError) {
|
||||
url := fmt.Sprintf("%s/%s/%s/%s", sdk.usersURL, groupsEndpoint, id, status)
|
||||
func (sdk mgSDK) changeGroupStatus(id, status, domainID, token string) (Group, errors.SDKError) {
|
||||
url := fmt.Sprintf("%s/%s/%s/%s/%s", sdk.usersURL, domainID, groupsEndpoint, id, status)
|
||||
|
||||
_, body, err := sdk.processRequest(http.MethodPost, url, token, nil, nil, http.StatusOK)
|
||||
if err != nil {
|
||||
|
||||
+269
-177
File diff suppressed because it is too large
Load Diff
+11
-28
@@ -5,6 +5,7 @@ package sdk
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
@@ -43,7 +44,7 @@ func (sdk mgSDK) SendInvitation(invitation Invitation, token string) (err error)
|
||||
return errors.NewSDKError(err)
|
||||
}
|
||||
|
||||
url := sdk.invitationsURL + "/" + invitationsEndpoint
|
||||
url := sdk.invitationsURL + "/" + invitation.DomainID + "/" + invitationsEndpoint
|
||||
|
||||
_, _, sdkerr := sdk.processRequest(http.MethodPost, url, token, data, nil, http.StatusCreated)
|
||||
|
||||
@@ -51,7 +52,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 + "/" + domainID + "/" + invitationsEndpoint + "/" + usersEndpoint + "/" + userID
|
||||
|
||||
_, body, sdkerr := sdk.processRequest(http.MethodGet, url, token, nil, nil, http.StatusOK)
|
||||
if sdkerr != nil {
|
||||
@@ -66,7 +67,9 @@ 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)
|
||||
endpoint := fmt.Sprintf("%s/%s", pm.DomainID, invitationsEndpoint)
|
||||
|
||||
url, err := sdk.withQueryParams(sdk.invitationsURL, endpoint, pm)
|
||||
if err != nil {
|
||||
return InvitationPage{}, errors.NewSDKError(err)
|
||||
}
|
||||
@@ -85,43 +88,23 @@ func (sdk mgSDK) Invitations(pm PageMetadata, token string) (invitations Invitat
|
||||
}
|
||||
|
||||
func (sdk mgSDK) AcceptInvitation(domainID, token string) (err error) {
|
||||
req := struct {
|
||||
DomainID string `json:"domain_id"`
|
||||
}{
|
||||
DomainID: domainID,
|
||||
}
|
||||
data, err := json.Marshal(req)
|
||||
if err != nil {
|
||||
return errors.NewSDKError(err)
|
||||
}
|
||||
url := sdk.invitationsURL + "/" + domainID + "/" + invitationsEndpoint + "/" + acceptEndpoint
|
||||
|
||||
url := sdk.invitationsURL + "/" + invitationsEndpoint + "/" + acceptEndpoint
|
||||
|
||||
_, _, sdkerr := sdk.processRequest(http.MethodPost, url, token, data, nil, http.StatusNoContent)
|
||||
_, _, sdkerr := sdk.processRequest(http.MethodPost, url, token, nil, nil, http.StatusNoContent)
|
||||
|
||||
return sdkerr
|
||||
}
|
||||
|
||||
func (sdk mgSDK) RejectInvitation(domainID, token string) (err error) {
|
||||
req := struct {
|
||||
DomainID string `json:"domain_id"`
|
||||
}{
|
||||
DomainID: domainID,
|
||||
}
|
||||
data, err := json.Marshal(req)
|
||||
if err != nil {
|
||||
return errors.NewSDKError(err)
|
||||
}
|
||||
url := sdk.invitationsURL + "/" + domainID + "/" + invitationsEndpoint + "/" + rejectEndpoint
|
||||
|
||||
url := sdk.invitationsURL + "/" + invitationsEndpoint + "/" + rejectEndpoint
|
||||
|
||||
_, _, sdkerr := sdk.processRequest(http.MethodPost, url, token, data, nil, http.StatusNoContent)
|
||||
_, _, sdkerr := sdk.processRequest(http.MethodPost, url, token, nil, nil, http.StatusNoContent)
|
||||
|
||||
return sdkerr
|
||||
}
|
||||
|
||||
func (sdk mgSDK) DeleteInvitation(userID, domainID, token string) (err error) {
|
||||
url := sdk.invitationsURL + "/" + invitationsEndpoint + "/" + userID + "/" + domainID
|
||||
url := sdk.invitationsURL + "/" + domainID + "/" + invitationsEndpoint + "/" + usersEndpoint + "/" + userID
|
||||
|
||||
_, _, sdkerr := sdk.processRequest(http.MethodDelete, url, token, nil, nil, http.StatusNoContent)
|
||||
|
||||
|
||||
@@ -205,16 +205,6 @@ func TestViewInvitation(t *testing.T) {
|
||||
response: sdk.Invitation{},
|
||||
err: errors.NewSDKErrorWithStatus(apiutil.ErrBearerToken, http.StatusUnauthorized),
|
||||
},
|
||||
{
|
||||
desc: "view invitation with empty userID",
|
||||
token: validToken,
|
||||
userID: "",
|
||||
domainID: invitation.DomainID,
|
||||
svcRes: invitations.Invitation{},
|
||||
svcErr: nil,
|
||||
response: sdk.Invitation{},
|
||||
err: errors.NewSDKErrorWithStatus(errors.Wrap(apiutil.ErrValidation, apiutil.ErrMissingID), http.StatusBadRequest),
|
||||
},
|
||||
{
|
||||
desc: "view invitation with invalid domainID",
|
||||
token: validToken,
|
||||
@@ -229,7 +219,7 @@ func TestViewInvitation(t *testing.T) {
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
if tc.token == valid {
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: validID}
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: domainID}
|
||||
}
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(tc.session, tc.authenticateErr)
|
||||
svcCall := svc.On("ViewInvitation", mock.Anything, tc.session, tc.userID, tc.domainID).Return(tc.svcRes, tc.svcErr)
|
||||
@@ -271,12 +261,14 @@ func TestListInvitation(t *testing.T) {
|
||||
desc: "list invitations successfully",
|
||||
token: validToken,
|
||||
pageMeta: sdk.PageMetadata{
|
||||
Offset: 0,
|
||||
Limit: 10,
|
||||
Offset: 0,
|
||||
Limit: 10,
|
||||
DomainID: domainID,
|
||||
},
|
||||
svcReq: invitations.Page{
|
||||
Offset: 0,
|
||||
Limit: 10,
|
||||
Offset: 0,
|
||||
Limit: 10,
|
||||
DomainID: domainID,
|
||||
},
|
||||
svcRes: invitations.InvitationPage{
|
||||
Total: 1,
|
||||
@@ -293,8 +285,9 @@ func TestListInvitation(t *testing.T) {
|
||||
desc: "list invitations with invalid token",
|
||||
token: invalidToken,
|
||||
pageMeta: sdk.PageMetadata{
|
||||
Offset: 0,
|
||||
Limit: 10,
|
||||
Offset: 0,
|
||||
Limit: 10,
|
||||
DomainID: domainID,
|
||||
},
|
||||
svcReq: invitations.Page{
|
||||
Offset: 0,
|
||||
@@ -306,20 +299,32 @@ func TestListInvitation(t *testing.T) {
|
||||
err: errors.NewSDKErrorWithStatus(svcerr.ErrAuthentication, http.StatusUnauthorized),
|
||||
},
|
||||
{
|
||||
desc: "list invitations with empty token",
|
||||
token: "",
|
||||
pageMeta: sdk.PageMetadata{},
|
||||
desc: "list invitations with empty token",
|
||||
token: "",
|
||||
pageMeta: sdk.PageMetadata{
|
||||
DomainID: domainID,
|
||||
},
|
||||
svcRes: invitations.InvitationPage{},
|
||||
svcErr: nil,
|
||||
response: sdk.InvitationPage{},
|
||||
err: errors.NewSDKErrorWithStatus(apiutil.ErrBearerToken, http.StatusUnauthorized),
|
||||
},
|
||||
{
|
||||
desc: "list invitations with empty domainID",
|
||||
token: validToken,
|
||||
pageMeta: sdk.PageMetadata{},
|
||||
svcRes: invitations.InvitationPage{},
|
||||
svcErr: nil,
|
||||
response: sdk.InvitationPage{},
|
||||
err: errors.NewSDKErrorWithStatus(errors.Wrap(apiutil.ErrValidation, apiutil.ErrMissingDomainID), http.StatusBadRequest),
|
||||
},
|
||||
{
|
||||
desc: "list invitations with limit greater than max limit",
|
||||
token: validToken,
|
||||
pageMeta: sdk.PageMetadata{
|
||||
Offset: 0,
|
||||
Limit: 101,
|
||||
Offset: 0,
|
||||
Limit: 101,
|
||||
DomainID: domainID,
|
||||
},
|
||||
svcReq: invitations.Page{},
|
||||
svcRes: invitations.InvitationPage{},
|
||||
@@ -523,14 +528,6 @@ func TestDeleteInvitation(t *testing.T) {
|
||||
svcErr: nil,
|
||||
err: errors.NewSDKErrorWithStatus(apiutil.ErrBearerToken, http.StatusUnauthorized),
|
||||
},
|
||||
{
|
||||
desc: "delete invitation with empty userID",
|
||||
token: validToken,
|
||||
userID: "",
|
||||
domainID: invitation.DomainID,
|
||||
svcErr: nil,
|
||||
err: errors.NewSDKErrorWithStatus(errors.Wrap(apiutil.ErrValidation, apiutil.ErrMissingID), http.StatusBadRequest),
|
||||
},
|
||||
{
|
||||
desc: "delete invitation with invalid domainID",
|
||||
token: validToken,
|
||||
|
||||
+98
-95
@@ -175,6 +175,7 @@ type SDK interface {
|
||||
// pm := sdk.PageMetadata{
|
||||
// Offset: 0,
|
||||
// Limit: 10,
|
||||
// DomainID: "domainID"
|
||||
// }
|
||||
// members, _ := sdk.Members("groupID", pm, "token")
|
||||
// fmt.Println(members)
|
||||
@@ -353,13 +354,13 @@ type SDK interface {
|
||||
// example:
|
||||
// thing := sdk.Thing{
|
||||
// Name: "My Thing",
|
||||
// Metadata: sdk.Metadata{
|
||||
// Metadata: sdk.Metadata{"domain_1"
|
||||
// "key": "value",
|
||||
// },
|
||||
// }
|
||||
// thing, _ := sdk.CreateThing(thing, "token")
|
||||
// thing, _ := sdk.CreateThing(thing, "domainID", "token")
|
||||
// fmt.Println(thing)
|
||||
CreateThing(thing Thing, token string) (Thing, errors.SDKError)
|
||||
CreateThing(thing Thing, domainID, token string) (Thing, errors.SDKError)
|
||||
|
||||
// CreateThings registers new things and returns their ids.
|
||||
//
|
||||
@@ -378,9 +379,9 @@ type SDK interface {
|
||||
// },
|
||||
// },
|
||||
// }
|
||||
// things, _ := sdk.CreateThings(things, "token")
|
||||
// things, _ := sdk.CreateThings(things, "domainID", "token")
|
||||
// fmt.Println(things)
|
||||
CreateThings(things []Thing, token string) ([]Thing, errors.SDKError)
|
||||
CreateThings(things []Thing, domainID, token string) ([]Thing, errors.SDKError)
|
||||
|
||||
// Filters things and returns a page result.
|
||||
//
|
||||
@@ -409,16 +410,16 @@ type SDK interface {
|
||||
// Thing returns thing object by id.
|
||||
//
|
||||
// example:
|
||||
// thing, _ := sdk.Thing("thingID", "token")
|
||||
// thing, _ := sdk.Thing("thingID", "domainID", "token")
|
||||
// fmt.Println(thing)
|
||||
Thing(id, token string) (Thing, errors.SDKError)
|
||||
Thing(id, domainID, token string) (Thing, errors.SDKError)
|
||||
|
||||
// ThingPermissions returns user permissions on the thing id.
|
||||
//
|
||||
// example:
|
||||
// thing, _ := sdk.Thing("thingID", "token")
|
||||
// thing, _ := sdk.Thing("thingID", "domainID", "token")
|
||||
// fmt.Println(thing)
|
||||
ThingPermissions(id, token string) (Thing, errors.SDKError)
|
||||
ThingPermissions(id, domainID, token string) (Thing, errors.SDKError)
|
||||
|
||||
// UpdateThing updates existing thing.
|
||||
//
|
||||
@@ -430,9 +431,9 @@ type SDK interface {
|
||||
// "key": "value",
|
||||
// },
|
||||
// }
|
||||
// thing, _ := sdk.UpdateThing(thing, "token")
|
||||
// thing, _ := sdk.UpdateThing(thing, "domainID", "token")
|
||||
// fmt.Println(thing)
|
||||
UpdateThing(thing Thing, token string) (Thing, errors.SDKError)
|
||||
UpdateThing(thing Thing, domainID, token string) (Thing, errors.SDKError)
|
||||
|
||||
// UpdateThingTags updates the client's tags.
|
||||
//
|
||||
@@ -441,30 +442,30 @@ type SDK interface {
|
||||
// ID: "thingID",
|
||||
// Tags: []string{"tag1", "tag2"},
|
||||
// }
|
||||
// thing, _ := sdk.UpdateThingTags(thing, "token")
|
||||
// thing, _ := sdk.UpdateThingTags(thing, "domainID", "token")
|
||||
// fmt.Println(thing)
|
||||
UpdateThingTags(thing Thing, token string) (Thing, errors.SDKError)
|
||||
UpdateThingTags(thing Thing, domainID, token string) (Thing, errors.SDKError)
|
||||
|
||||
// UpdateThingSecret updates the client's secret
|
||||
//
|
||||
// example:
|
||||
// thing, err := sdk.UpdateThingSecret("thingID", "newSecret", "token")
|
||||
// thing, err := sdk.UpdateThingSecret("thingID", "newSecret", "domainID," "token")
|
||||
// fmt.Println(thing)
|
||||
UpdateThingSecret(id, secret, token string) (Thing, errors.SDKError)
|
||||
UpdateThingSecret(id, secret, domainID, token string) (Thing, errors.SDKError)
|
||||
|
||||
// EnableThing changes client status to enabled.
|
||||
//
|
||||
// example:
|
||||
// thing, _ := sdk.EnableThing("thingID", "token")
|
||||
// thing, _ := sdk.EnableThing("thingID", "domainID", "token")
|
||||
// fmt.Println(thing)
|
||||
EnableThing(id, token string) (Thing, errors.SDKError)
|
||||
EnableThing(id, domainID, token string) (Thing, errors.SDKError)
|
||||
|
||||
// DisableThing changes client status to disabled - soft delete.
|
||||
//
|
||||
// example:
|
||||
// thing, _ := sdk.DisableThing("thingID", "token")
|
||||
// thing, _ := sdk.DisableThing("thingID", "domainID", "token")
|
||||
// fmt.Println(thing)
|
||||
DisableThing(id, token string) (Thing, errors.SDKError)
|
||||
DisableThing(id, domainID, token string) (Thing, errors.SDKError)
|
||||
|
||||
// ShareThing shares thing with other users.
|
||||
//
|
||||
@@ -473,9 +474,9 @@ type SDK interface {
|
||||
// Relation: "contributor", // available options: "owner", "admin", "editor", "contributor", "guest"
|
||||
// UserIDs: ["user_id_1", "user_id_2", "user_id_3"]
|
||||
// }
|
||||
// err := sdk.ShareThing("thing_id", req, "token")
|
||||
// err := sdk.ShareThing("thing_id", req, "domainID","token")
|
||||
// fmt.Println(err)
|
||||
ShareThing(thingID string, req UsersRelationRequest, token string) errors.SDKError
|
||||
ShareThing(thingID string, req UsersRelationRequest, domainID, token string) errors.SDKError
|
||||
|
||||
// UnshareThing unshare a thing with other users.
|
||||
//
|
||||
@@ -484,9 +485,9 @@ type SDK interface {
|
||||
// Relation: "contributor", // available options: "owner", "admin", "editor", "contributor", "guest"
|
||||
// UserIDs: ["user_id_1", "user_id_2", "user_id_3"]
|
||||
// }
|
||||
// err := sdk.UnshareThing("thing_id", req, "token")
|
||||
// err := sdk.UnshareThing("thing_id", req, "domainID", "token")
|
||||
// fmt.Println(err)
|
||||
UnshareThing(thingID string, req UsersRelationRequest, token string) errors.SDKError
|
||||
UnshareThing(thingID string, req UsersRelationRequest, domainID, token string) errors.SDKError
|
||||
|
||||
// ListThingUsers all users in a thing.
|
||||
//
|
||||
@@ -503,9 +504,9 @@ type SDK interface {
|
||||
// DeleteThing deletes a thing with the given id.
|
||||
//
|
||||
// example:
|
||||
// err := sdk.DeleteThing("thingID", "token")
|
||||
// err := sdk.DeleteThing("thingID", "domainID", "token")
|
||||
// fmt.Println(err)
|
||||
DeleteThing(id, token string) errors.SDKError
|
||||
DeleteThing(id, domainID, token string) errors.SDKError
|
||||
|
||||
// CreateGroup creates new group and returns its id.
|
||||
//
|
||||
@@ -516,9 +517,9 @@ type SDK interface {
|
||||
// "key": "value",
|
||||
// },
|
||||
// }
|
||||
// group, _ := sdk.CreateGroup(group, "token")
|
||||
// group, _ := sdk.CreateGroup(group, "domainID", "token")
|
||||
// fmt.Println(group)
|
||||
CreateGroup(group Group, token string) (Group, errors.SDKError)
|
||||
CreateGroup(group Group, domainID, token string) (Group, errors.SDKError)
|
||||
|
||||
// Groups returns page of groups.
|
||||
//
|
||||
@@ -559,16 +560,16 @@ type SDK interface {
|
||||
// Group returns users group object by id.
|
||||
//
|
||||
// example:
|
||||
// group, _ := sdk.Group("groupID", "token")
|
||||
// group, _ := sdk.Group("groupID", "domainID", "token")
|
||||
// fmt.Println(group)
|
||||
Group(id, token string) (Group, errors.SDKError)
|
||||
Group(id, domainID, token string) (Group, errors.SDKError)
|
||||
|
||||
// GroupPermissions returns user permissions by group ID.
|
||||
//
|
||||
// example:
|
||||
// group, _ := sdk.Group("groupID", "token")
|
||||
// group, _ := sdk.Group("groupID", "domainID" "token")
|
||||
// fmt.Println(group)
|
||||
GroupPermissions(id, token string) (Group, errors.SDKError)
|
||||
GroupPermissions(id, domainID, token string) (Group, errors.SDKError)
|
||||
|
||||
// UpdateGroup updates existing group.
|
||||
//
|
||||
@@ -580,23 +581,23 @@ type SDK interface {
|
||||
// "key": "value",
|
||||
// },
|
||||
// }
|
||||
// group, _ := sdk.UpdateGroup(group, "token")
|
||||
// group, _ := sdk.UpdateGroup(group, "domainID", "token")
|
||||
// fmt.Println(group)
|
||||
UpdateGroup(group Group, token string) (Group, errors.SDKError)
|
||||
UpdateGroup(group Group, domainID, token string) (Group, errors.SDKError)
|
||||
|
||||
// EnableGroup changes group status to enabled.
|
||||
//
|
||||
// example:
|
||||
// group, _ := sdk.EnableGroup("groupID", "token")
|
||||
// group, _ := sdk.EnableGroup("groupID", "domainID", "token")
|
||||
// fmt.Println(group)
|
||||
EnableGroup(id, token string) (Group, errors.SDKError)
|
||||
EnableGroup(id, domainID, token string) (Group, errors.SDKError)
|
||||
|
||||
// DisableGroup changes group status to disabled - soft delete.
|
||||
//
|
||||
// example:
|
||||
// group, _ := sdk.DisableGroup("groupID", "token")
|
||||
// group, _ := sdk.DisableGroup("groupID", "domainID", "token")
|
||||
// fmt.Println(group)
|
||||
DisableGroup(id, token string) (Group, errors.SDKError)
|
||||
DisableGroup(id, domainID, token string) (Group, errors.SDKError)
|
||||
|
||||
// AddUserToGroup add user to a group.
|
||||
//
|
||||
@@ -605,9 +606,9 @@ type SDK interface {
|
||||
// Relation: "contributor", // available options: "owner", "admin", "editor", "contributor", "guest"
|
||||
// UserIDs: ["user_id_1", "user_id_2", "user_id_3"]
|
||||
// }
|
||||
// err := sdk.AddUserToGroup("groupID",req, "token")
|
||||
// err := sdk.AddUserToGroup("groupID",req, "domainID", "token")
|
||||
// fmt.Println(err)
|
||||
AddUserToGroup(groupID string, req UsersRelationRequest, token string) errors.SDKError
|
||||
AddUserToGroup(groupID string, req UsersRelationRequest, domainID, token string) errors.SDKError
|
||||
|
||||
// RemoveUserFromGroup remove user from a group.
|
||||
//
|
||||
@@ -616,9 +617,9 @@ type SDK interface {
|
||||
// Relation: "contributor", // available options: "owner", "admin", "editor", "contributor", "guest"
|
||||
// UserIDs: ["user_id_1", "user_id_2", "user_id_3"]
|
||||
// }
|
||||
// err := sdk.RemoveUserFromGroup("groupID",req, "token")
|
||||
// err := sdk.RemoveUserFromGroup("groupID",req, "domainID", "token")
|
||||
// fmt.Println(err)
|
||||
RemoveUserFromGroup(groupID string, req UsersRelationRequest, token string) errors.SDKError
|
||||
RemoveUserFromGroup(groupID string, req UsersRelationRequest, domainID, token string) errors.SDKError
|
||||
|
||||
// ListGroupUsers list all users in the group id .
|
||||
//
|
||||
@@ -638,6 +639,7 @@ type SDK interface {
|
||||
// pm := sdk.PageMetadata{
|
||||
// Offset: 0,
|
||||
// Limit: 10,
|
||||
// DomainID: "domain"
|
||||
// Permission: "edit", // available Options: "administrator", "administrator", "delete", edit", "view", "share", "owner", "owner", "admin", "editor", "contributor", "editor", "viewer", "guest", "create"
|
||||
// }
|
||||
// groups, _ := sdk.ListGroupChannels("groupID", pm, "token")
|
||||
@@ -647,9 +649,9 @@ type SDK interface {
|
||||
// DeleteGroup delete given group id.
|
||||
//
|
||||
// example:
|
||||
// err := sdk.DeleteGroup("groupID", "token")
|
||||
// err := sdk.DeleteGroup("groupID", "domainID", "token")
|
||||
// fmt.Println(err)
|
||||
DeleteGroup(id, token string) errors.SDKError
|
||||
DeleteGroup(id, domainID, token string) errors.SDKError
|
||||
|
||||
// CreateChannel creates new channel and returns its id.
|
||||
//
|
||||
@@ -660,9 +662,9 @@ type SDK interface {
|
||||
// "key": "value",
|
||||
// },
|
||||
// }
|
||||
// channel, _ := sdk.CreateChannel(channel, "token")
|
||||
// channel, _ := sdk.CreateChannel(channel, "domainID", "token")
|
||||
// fmt.Println(channel)
|
||||
CreateChannel(channel Channel, token string) (Channel, errors.SDKError)
|
||||
CreateChannel(channel Channel, domainID, token string) (Channel, errors.SDKError)
|
||||
|
||||
// Channels returns page of channels.
|
||||
//
|
||||
@@ -671,6 +673,7 @@ type SDK interface {
|
||||
// Offset: 0,
|
||||
// Limit: 10,
|
||||
// Name: "My Channel",
|
||||
// Domain: "domainID"
|
||||
// }
|
||||
// channels, _ := sdk.Channels(pm, "token")
|
||||
// fmt.Println(channels)
|
||||
@@ -684,23 +687,23 @@ type SDK interface {
|
||||
// Limit: 10,
|
||||
// Name: "My Channel",
|
||||
// }
|
||||
// channels, _ := sdk.ChannelsByThing("thingID", pm, "token")
|
||||
// channels, _ := sdk.ChannelsByThing("thingID", pm, "domainID" "token")
|
||||
// fmt.Println(channels)
|
||||
ChannelsByThing(thingID string, pm PageMetadata, token string) (ChannelsPage, errors.SDKError)
|
||||
ChannelsByThing(thingID string, pm PageMetadata, domainID, token string) (ChannelsPage, errors.SDKError)
|
||||
|
||||
// Channel returns channel data by id.
|
||||
//
|
||||
// example:
|
||||
// channel, _ := sdk.Channel("channelID", "token")
|
||||
// channel, _ := sdk.Channel("channelID", "domainID", "token")
|
||||
// fmt.Println(channel)
|
||||
Channel(id, token string) (Channel, errors.SDKError)
|
||||
Channel(id, domainID, token string) (Channel, errors.SDKError)
|
||||
|
||||
// ChannelPermissions returns user permissions on the channel ID.
|
||||
//
|
||||
// example:
|
||||
// channel, _ := sdk.Channel("channelID", "token")
|
||||
// channel, _ := sdk.Channel("channelID", "domainID", "token")
|
||||
// fmt.Println(channel)
|
||||
ChannelPermissions(id, token string) (Channel, errors.SDKError)
|
||||
ChannelPermissions(id, domainID, token string) (Channel, errors.SDKError)
|
||||
|
||||
// UpdateChannel updates existing channel.
|
||||
//
|
||||
@@ -712,23 +715,23 @@ type SDK interface {
|
||||
// "key": "value",
|
||||
// },
|
||||
// }
|
||||
// channel, _ := sdk.UpdateChannel(channel, "token")
|
||||
// channel, _ := sdk.UpdateChannel(channel, "domainID", "token")
|
||||
// fmt.Println(channel)
|
||||
UpdateChannel(channel Channel, token string) (Channel, errors.SDKError)
|
||||
UpdateChannel(channel Channel, domainID, token string) (Channel, errors.SDKError)
|
||||
|
||||
// EnableChannel changes channel status to enabled.
|
||||
//
|
||||
// example:
|
||||
// channel, _ := sdk.EnableChannel("channelID", "token")
|
||||
// channel, _ := sdk.EnableChannel("channelID", "domainID", "token")
|
||||
// fmt.Println(channel)
|
||||
EnableChannel(id, token string) (Channel, errors.SDKError)
|
||||
EnableChannel(id, domainID, token string) (Channel, errors.SDKError)
|
||||
|
||||
// DisableChannel changes channel status to disabled - soft delete.
|
||||
//
|
||||
// example:
|
||||
// channel, _ := sdk.DisableChannel("channelID", "token")
|
||||
// channel, _ := sdk.DisableChannel("channelID", "domainID", "token")
|
||||
// fmt.Println(channel)
|
||||
DisableChannel(id, token string) (Channel, errors.SDKError)
|
||||
DisableChannel(id, domainID, token string) (Channel, errors.SDKError)
|
||||
|
||||
// AddUserToChannel add user to a channel.
|
||||
//
|
||||
@@ -737,9 +740,9 @@ type SDK interface {
|
||||
// Relation: "contributor", // available options: "owner", "admin", "editor", "contributor", "guest"
|
||||
// UserIDs: ["user_id_1", "user_id_2", "user_id_3"]
|
||||
// }
|
||||
// err := sdk.AddUserToChannel("channel_id", req, "token")
|
||||
// err := sdk.AddUserToChannel("channel_id", req, "domainID", "token")
|
||||
// fmt.Println(err)
|
||||
AddUserToChannel(channelID string, req UsersRelationRequest, token string) errors.SDKError
|
||||
AddUserToChannel(channelID string, req UsersRelationRequest, domainID, token string) errors.SDKError
|
||||
|
||||
// RemoveUserFromChannel remove user from a group.
|
||||
//
|
||||
@@ -748,9 +751,9 @@ type SDK interface {
|
||||
// Relation: "contributor", // available options: "owner", "admin", "editor", "contributor", "guest"
|
||||
// UserIDs: ["user_id_1", "user_id_2", "user_id_3"]
|
||||
// }
|
||||
// err := sdk.RemoveUserFromChannel("channel_id", req, "token")
|
||||
// err := sdk.RemoveUserFromChannel("channel_id", req, "domainID", "token")
|
||||
// fmt.Println(err)
|
||||
RemoveUserFromChannel(channelID string, req UsersRelationRequest, token string) errors.SDKError
|
||||
RemoveUserFromChannel(channelID string, req UsersRelationRequest, domainID, token string) errors.SDKError
|
||||
|
||||
// ListChannelUsers list all users in a channel .
|
||||
//
|
||||
@@ -770,9 +773,9 @@ type SDK interface {
|
||||
// req := sdk.UserGroupsRequest{
|
||||
// GroupsIDs: ["group_id_1", "group_id_2", "group_id_3"]
|
||||
// }
|
||||
// err := sdk.AddUserGroupToChannel("channel_id",req, "token")
|
||||
// err := sdk.AddUserGroupToChannel("channel_id",req, "domainID", "token")
|
||||
// fmt.Println(err)
|
||||
AddUserGroupToChannel(channelID string, req UserGroupsRequest, token string) errors.SDKError
|
||||
AddUserGroupToChannel(channelID string, req UserGroupsRequest, domainID, token string) errors.SDKError
|
||||
|
||||
// RemoveUserGroupFromChannel remove user group from a channel.
|
||||
//
|
||||
@@ -780,9 +783,9 @@ type SDK interface {
|
||||
// req := sdk.UserGroupsRequest{
|
||||
// GroupsIDs: ["group_id_1", "group_id_2", "group_id_3"]
|
||||
// }
|
||||
// err := sdk.RemoveUserGroupFromChannel("channel_id",req, "token")
|
||||
// err := sdk.RemoveUserGroupFromChannel("channel_id",req, "domainID", "token")
|
||||
// fmt.Println(err)
|
||||
RemoveUserGroupFromChannel(channelID string, req UserGroupsRequest, token string) errors.SDKError
|
||||
RemoveUserGroupFromChannel(channelID string, req UserGroupsRequest, domainID, token string) errors.SDKError
|
||||
|
||||
// ListChannelUserGroups list all user groups in a channel.
|
||||
//
|
||||
@@ -799,9 +802,9 @@ type SDK interface {
|
||||
// DeleteChannel delete given group id.
|
||||
//
|
||||
// example:
|
||||
// err := sdk.DeleteChannel("channelID", "token")
|
||||
// err := sdk.DeleteChannel("channelID", "domainID", "token")
|
||||
// fmt.Println(err)
|
||||
DeleteChannel(id, token string) errors.SDKError
|
||||
DeleteChannel(id, domainID, token string) errors.SDKError
|
||||
|
||||
// Connect bulk connects things to channels specified by id.
|
||||
//
|
||||
@@ -810,9 +813,9 @@ type SDK interface {
|
||||
// ChannelID: "channel_id_1",
|
||||
// ThingID: "thing_id_1",
|
||||
// }
|
||||
// err := sdk.Connect(conns, "token")
|
||||
// err := sdk.Connect(conns, "domainID", "token")
|
||||
// fmt.Println(err)
|
||||
Connect(conns Connection, token string) errors.SDKError
|
||||
Connect(conns Connection, domainID, token string) errors.SDKError
|
||||
|
||||
// Disconnect
|
||||
//
|
||||
@@ -821,9 +824,9 @@ type SDK interface {
|
||||
// ChannelID: "channel_id_1",
|
||||
// ThingID: "thing_id_1",
|
||||
// }
|
||||
// err := sdk.Disconnect(conns, "token")
|
||||
// err := sdk.Disconnect(conns, "domainID", "token")
|
||||
// fmt.Println(err)
|
||||
Disconnect(connIDs Connection, token string) errors.SDKError
|
||||
Disconnect(connIDs Connection, domainID, token string) errors.SDKError
|
||||
|
||||
// ConnectThing connects thing to specified channel by id.
|
||||
//
|
||||
@@ -832,7 +835,7 @@ type SDK interface {
|
||||
// example:
|
||||
// err := sdk.ConnectThing("thingID", "channelID", "token")
|
||||
// fmt.Println(err)
|
||||
ConnectThing(thingID, chanID, token string) errors.SDKError
|
||||
ConnectThing(thingID, chanID, domainID, token string) errors.SDKError
|
||||
|
||||
// DisconnectThing disconnect thing from specified channel by id.
|
||||
//
|
||||
@@ -841,7 +844,7 @@ type SDK interface {
|
||||
// example:
|
||||
// err := sdk.DisconnectThing("thingID", "channelID", "token")
|
||||
// fmt.Println(err)
|
||||
DisconnectThing(thingID, chanID, token string) errors.SDKError
|
||||
DisconnectThing(thingID, chanID, domainID, token string) errors.SDKError
|
||||
|
||||
// SendMessage send message to specified channel.
|
||||
//
|
||||
@@ -886,16 +889,16 @@ type SDK interface {
|
||||
// ExternalKey: "externalKey",
|
||||
// Channels: []string{"channel1", "channel2"},
|
||||
// }
|
||||
// id, _ := sdk.AddBootstrap(cfg, "token")
|
||||
// id, _ := sdk.AddBootstrap(cfg, "domainID", "token")
|
||||
// fmt.Println(id)
|
||||
AddBootstrap(cfg BootstrapConfig, token string) (string, errors.SDKError)
|
||||
AddBootstrap(cfg BootstrapConfig, domainID, token string) (string, errors.SDKError)
|
||||
|
||||
// View returns Thing Config with given ID belonging to the user identified by the given token.
|
||||
//
|
||||
// example:
|
||||
// bootstrap, _ := sdk.ViewBootstrap("id", "token")
|
||||
// bootstrap, _ := sdk.ViewBootstrap("id", "domainID", "token")
|
||||
// fmt.Println(bootstrap)
|
||||
ViewBootstrap(id, token string) (BootstrapConfig, errors.SDKError)
|
||||
ViewBootstrap(id, domainID, token string) (BootstrapConfig, errors.SDKError)
|
||||
|
||||
// Update updates editable fields of the provided Config.
|
||||
//
|
||||
@@ -907,30 +910,30 @@ type SDK interface {
|
||||
// ExternalKey: "externalKey",
|
||||
// Channels: []string{"channel1", "channel2"},
|
||||
// }
|
||||
// err := sdk.UpdateBootstrap(cfg, "token")
|
||||
// err := sdk.UpdateBootstrap(cfg, "domainID", "token")
|
||||
// fmt.Println(err)
|
||||
UpdateBootstrap(cfg BootstrapConfig, token string) errors.SDKError
|
||||
UpdateBootstrap(cfg BootstrapConfig, domainID, token string) errors.SDKError
|
||||
|
||||
// Update bootstrap config certificates.
|
||||
//
|
||||
// example:
|
||||
// err := sdk.UpdateBootstrapCerts("id", "clientCert", "clientKey", "ca", "token")
|
||||
// err := sdk.UpdateBootstrapCerts("id", "clientCert", "clientKey", "ca", "domainID", "token")
|
||||
// fmt.Println(err)
|
||||
UpdateBootstrapCerts(id string, clientCert, clientKey, ca string, token string) (BootstrapConfig, errors.SDKError)
|
||||
UpdateBootstrapCerts(id string, clientCert, clientKey, ca string, domainID, token string) (BootstrapConfig, errors.SDKError)
|
||||
|
||||
// UpdateBootstrapConnection updates connections performs update of the channel list corresponding Thing is connected to.
|
||||
//
|
||||
// example:
|
||||
// err := sdk.UpdateBootstrapConnection("id", []string{"channel1", "channel2"}, "token")
|
||||
// err := sdk.UpdateBootstrapConnection("id", []string{"channel1", "channel2"}, "domainID", "token")
|
||||
// fmt.Println(err)
|
||||
UpdateBootstrapConnection(id string, channels []string, token string) errors.SDKError
|
||||
UpdateBootstrapConnection(id string, channels []string, domainID, token string) errors.SDKError
|
||||
|
||||
// Remove removes Config with specified token that belongs to the user identified by the given token.
|
||||
//
|
||||
// example:
|
||||
// err := sdk.RemoveBootstrap("id", "token")
|
||||
// err := sdk.RemoveBootstrap("id", "domainID", "token")
|
||||
// fmt.Println(err)
|
||||
RemoveBootstrap(id, token string) errors.SDKError
|
||||
RemoveBootstrap(id, domainID, token string) errors.SDKError
|
||||
|
||||
// Bootstrap returns Config to the Thing with provided external ID using external key.
|
||||
//
|
||||
@@ -960,37 +963,37 @@ type SDK interface {
|
||||
// Whitelist updates Thing state Config with given ID belonging to the user identified by the given token.
|
||||
//
|
||||
// example:
|
||||
// err := sdk.Whitelist("thingID", 1, "token")
|
||||
// err := sdk.Whitelist("thingID", 1, "domainID", "token")
|
||||
// fmt.Println(err)
|
||||
Whitelist(thingID string, state int, token string) errors.SDKError
|
||||
Whitelist(thingID string, state int, domainID, token string) errors.SDKError
|
||||
|
||||
// IssueCert issues a certificate for a thing required for mTLS.
|
||||
//
|
||||
// example:
|
||||
// cert, _ := sdk.IssueCert("thingID", "24h", "token")
|
||||
// cert, _ := sdk.IssueCert("thingID", "24h", "domainID", "token")
|
||||
// fmt.Println(cert)
|
||||
IssueCert(thingID, validity, token string) (Cert, errors.SDKError)
|
||||
IssueCert(thingID, validity, domainID, token string) (Cert, errors.SDKError)
|
||||
|
||||
// ViewCert returns a certificate given certificate ID
|
||||
//
|
||||
// example:
|
||||
// cert, _ := sdk.ViewCert("certID", "token")
|
||||
// cert, _ := sdk.ViewCert("certID", "domainID", "token")
|
||||
// fmt.Println(cert)
|
||||
ViewCert(certID, token string) (Cert, errors.SDKError)
|
||||
ViewCert(certID, domainID, token string) (Cert, errors.SDKError)
|
||||
|
||||
// ViewCertByThing retrieves a list of certificates' serial IDs for a given thing ID.
|
||||
//
|
||||
// example:
|
||||
// cserial, _ := sdk.ViewCertByThing("thingID", "token")
|
||||
// cserial, _ := sdk.ViewCertByThing("thingID", "domainID", "token")
|
||||
// fmt.Println(cserial)
|
||||
ViewCertByThing(thingID, token string) (CertSerials, errors.SDKError)
|
||||
ViewCertByThing(thingID, domainID, token string) (CertSerials, errors.SDKError)
|
||||
|
||||
// RevokeCert revokes certificate for thing with thingID
|
||||
//
|
||||
// example:
|
||||
// tm, _ := sdk.RevokeCert("thingID", "token")
|
||||
// tm, _ := sdk.RevokeCert("thingID", "domainID", "token")
|
||||
// fmt.Println(tm)
|
||||
RevokeCert(thingID, token string) (time.Time, errors.SDKError)
|
||||
RevokeCert(thingID, domainID, token string) (time.Time, errors.SDKError)
|
||||
|
||||
// CreateSubscription creates a new subscription
|
||||
//
|
||||
|
||||
@@ -24,7 +24,6 @@ const (
|
||||
invalidIdentity = "invalididentity"
|
||||
Identity = "identity"
|
||||
secret = "strongsecret"
|
||||
token = "token"
|
||||
invalidToken = "invalid"
|
||||
contentType = "application/senml+json"
|
||||
invalid = "invalid"
|
||||
|
||||
+30
-29
@@ -37,13 +37,13 @@ type Thing struct {
|
||||
Permissions []string `json:"permissions,omitempty"`
|
||||
}
|
||||
|
||||
func (sdk mgSDK) CreateThing(thing Thing, token string) (Thing, errors.SDKError) {
|
||||
func (sdk mgSDK) CreateThing(thing Thing, domainID, token string) (Thing, errors.SDKError) {
|
||||
data, err := json.Marshal(thing)
|
||||
if err != nil {
|
||||
return Thing{}, errors.NewSDKError(err)
|
||||
}
|
||||
|
||||
url := fmt.Sprintf("%s/%s", sdk.thingsURL, thingsEndpoint)
|
||||
url := fmt.Sprintf("%s/%s/%s", sdk.thingsURL, domainID, thingsEndpoint)
|
||||
|
||||
_, body, sdkerr := sdk.processRequest(http.MethodPost, url, token, data, nil, http.StatusCreated)
|
||||
if sdkerr != nil {
|
||||
@@ -58,13 +58,13 @@ func (sdk mgSDK) CreateThing(thing Thing, token string) (Thing, errors.SDKError)
|
||||
return thing, nil
|
||||
}
|
||||
|
||||
func (sdk mgSDK) CreateThings(things []Thing, token string) ([]Thing, errors.SDKError) {
|
||||
func (sdk mgSDK) CreateThings(things []Thing, domainID, token string) ([]Thing, errors.SDKError) {
|
||||
data, err := json.Marshal(things)
|
||||
if err != nil {
|
||||
return []Thing{}, errors.NewSDKError(err)
|
||||
}
|
||||
|
||||
url := fmt.Sprintf("%s/%s/%s", sdk.thingsURL, thingsEndpoint, "bulk")
|
||||
url := fmt.Sprintf("%s/%s/%s/%s", sdk.thingsURL, domainID, thingsEndpoint, "bulk")
|
||||
|
||||
_, body, sdkerr := sdk.processRequest(http.MethodPost, url, token, data, nil, http.StatusOK)
|
||||
if sdkerr != nil {
|
||||
@@ -80,7 +80,8 @@ func (sdk mgSDK) CreateThings(things []Thing, token string) ([]Thing, errors.SDK
|
||||
}
|
||||
|
||||
func (sdk mgSDK) Things(pm PageMetadata, token string) (ThingsPage, errors.SDKError) {
|
||||
url, err := sdk.withQueryParams(sdk.thingsURL, thingsEndpoint, pm)
|
||||
endpoint := fmt.Sprintf("%s/%s", pm.DomainID, thingsEndpoint)
|
||||
url, err := sdk.withQueryParams(sdk.thingsURL, endpoint, pm)
|
||||
if err != nil {
|
||||
return ThingsPage{}, errors.NewSDKError(err)
|
||||
}
|
||||
@@ -99,7 +100,7 @@ func (sdk mgSDK) Things(pm PageMetadata, token string) (ThingsPage, errors.SDKEr
|
||||
}
|
||||
|
||||
func (sdk mgSDK) ThingsByChannel(chanID string, pm PageMetadata, token string) (ThingsPage, errors.SDKError) {
|
||||
url, err := sdk.withQueryParams(sdk.thingsURL, fmt.Sprintf("channels/%s/%s", chanID, thingsEndpoint), pm)
|
||||
url, err := sdk.withQueryParams(sdk.thingsURL, fmt.Sprintf("%s/channels/%s/%s", pm.DomainID, chanID, thingsEndpoint), pm)
|
||||
if err != nil {
|
||||
return ThingsPage{}, errors.NewSDKError(err)
|
||||
}
|
||||
@@ -117,11 +118,11 @@ func (sdk mgSDK) ThingsByChannel(chanID string, pm PageMetadata, token string) (
|
||||
return tp, nil
|
||||
}
|
||||
|
||||
func (sdk mgSDK) Thing(id, token string) (Thing, errors.SDKError) {
|
||||
func (sdk mgSDK) Thing(id, domainID, token string) (Thing, errors.SDKError) {
|
||||
if id == "" {
|
||||
return Thing{}, errors.NewSDKError(apiutil.ErrMissingID)
|
||||
}
|
||||
url := fmt.Sprintf("%s/%s/%s", sdk.thingsURL, thingsEndpoint, id)
|
||||
url := fmt.Sprintf("%s/%s/%s/%s", sdk.thingsURL, domainID, thingsEndpoint, id)
|
||||
|
||||
_, body, sdkerr := sdk.processRequest(http.MethodGet, url, token, nil, nil, http.StatusOK)
|
||||
if sdkerr != nil {
|
||||
@@ -136,8 +137,8 @@ func (sdk mgSDK) Thing(id, token string) (Thing, errors.SDKError) {
|
||||
return t, nil
|
||||
}
|
||||
|
||||
func (sdk mgSDK) ThingPermissions(id, token string) (Thing, errors.SDKError) {
|
||||
url := fmt.Sprintf("%s/%s/%s/%s", sdk.thingsURL, thingsEndpoint, id, permissionsEndpoint)
|
||||
func (sdk mgSDK) ThingPermissions(id, domainID, token string) (Thing, errors.SDKError) {
|
||||
url := fmt.Sprintf("%s/%s/%s/%s/%s", sdk.thingsURL, domainID, thingsEndpoint, id, permissionsEndpoint)
|
||||
|
||||
_, body, sdkerr := sdk.processRequest(http.MethodGet, url, token, nil, nil, http.StatusOK)
|
||||
if sdkerr != nil {
|
||||
@@ -152,11 +153,11 @@ func (sdk mgSDK) ThingPermissions(id, token string) (Thing, errors.SDKError) {
|
||||
return t, nil
|
||||
}
|
||||
|
||||
func (sdk mgSDK) UpdateThing(t Thing, token string) (Thing, errors.SDKError) {
|
||||
func (sdk mgSDK) UpdateThing(t Thing, domainID, token string) (Thing, errors.SDKError) {
|
||||
if t.ID == "" {
|
||||
return Thing{}, errors.NewSDKError(apiutil.ErrMissingID)
|
||||
}
|
||||
url := fmt.Sprintf("%s/%s/%s", sdk.thingsURL, thingsEndpoint, t.ID)
|
||||
url := fmt.Sprintf("%s/%s/%s/%s", sdk.thingsURL, domainID, thingsEndpoint, t.ID)
|
||||
|
||||
data, err := json.Marshal(t)
|
||||
if err != nil {
|
||||
@@ -176,13 +177,13 @@ func (sdk mgSDK) UpdateThing(t Thing, token string) (Thing, errors.SDKError) {
|
||||
return t, nil
|
||||
}
|
||||
|
||||
func (sdk mgSDK) UpdateThingTags(t Thing, token string) (Thing, errors.SDKError) {
|
||||
func (sdk mgSDK) UpdateThingTags(t Thing, domainID, token string) (Thing, errors.SDKError) {
|
||||
data, err := json.Marshal(t)
|
||||
if err != nil {
|
||||
return Thing{}, errors.NewSDKError(err)
|
||||
}
|
||||
|
||||
url := fmt.Sprintf("%s/%s/%s/tags", sdk.thingsURL, thingsEndpoint, t.ID)
|
||||
url := fmt.Sprintf("%s/%s/%s/%s/tags", sdk.thingsURL, domainID, thingsEndpoint, t.ID)
|
||||
|
||||
_, body, sdkerr := sdk.processRequest(http.MethodPatch, url, token, data, nil, http.StatusOK)
|
||||
if sdkerr != nil {
|
||||
@@ -197,7 +198,7 @@ func (sdk mgSDK) UpdateThingTags(t Thing, token string) (Thing, errors.SDKError)
|
||||
return t, nil
|
||||
}
|
||||
|
||||
func (sdk mgSDK) UpdateThingSecret(id, secret, token string) (Thing, errors.SDKError) {
|
||||
func (sdk mgSDK) UpdateThingSecret(id, secret, domainID, token string) (Thing, errors.SDKError) {
|
||||
ucsr := updateThingSecretReq{Secret: secret}
|
||||
|
||||
data, err := json.Marshal(ucsr)
|
||||
@@ -205,7 +206,7 @@ func (sdk mgSDK) UpdateThingSecret(id, secret, token string) (Thing, errors.SDKE
|
||||
return Thing{}, errors.NewSDKError(err)
|
||||
}
|
||||
|
||||
url := fmt.Sprintf("%s/%s/%s/secret", sdk.thingsURL, thingsEndpoint, id)
|
||||
url := fmt.Sprintf("%s/%s/%s/%s/secret", sdk.thingsURL, domainID, thingsEndpoint, id)
|
||||
|
||||
_, body, sdkerr := sdk.processRequest(http.MethodPatch, url, token, data, nil, http.StatusOK)
|
||||
if sdkerr != nil {
|
||||
@@ -220,16 +221,16 @@ func (sdk mgSDK) UpdateThingSecret(id, secret, token string) (Thing, errors.SDKE
|
||||
return t, nil
|
||||
}
|
||||
|
||||
func (sdk mgSDK) EnableThing(id, token string) (Thing, errors.SDKError) {
|
||||
return sdk.changeThingStatus(id, enableEndpoint, token)
|
||||
func (sdk mgSDK) EnableThing(id, domainID, token string) (Thing, errors.SDKError) {
|
||||
return sdk.changeThingStatus(id, enableEndpoint, domainID, token)
|
||||
}
|
||||
|
||||
func (sdk mgSDK) DisableThing(id, token string) (Thing, errors.SDKError) {
|
||||
return sdk.changeThingStatus(id, disableEndpoint, token)
|
||||
func (sdk mgSDK) DisableThing(id, domainID, token string) (Thing, errors.SDKError) {
|
||||
return sdk.changeThingStatus(id, disableEndpoint, domainID, token)
|
||||
}
|
||||
|
||||
func (sdk mgSDK) changeThingStatus(id, status, token string) (Thing, errors.SDKError) {
|
||||
url := fmt.Sprintf("%s/%s/%s/%s", sdk.thingsURL, thingsEndpoint, id, status)
|
||||
func (sdk mgSDK) changeThingStatus(id, status, domainID, token string) (Thing, errors.SDKError) {
|
||||
url := fmt.Sprintf("%s/%s/%s/%s/%s", sdk.thingsURL, domainID, thingsEndpoint, id, status)
|
||||
|
||||
_, body, sdkerr := sdk.processRequest(http.MethodPost, url, token, nil, nil, http.StatusOK)
|
||||
if sdkerr != nil {
|
||||
@@ -244,32 +245,32 @@ func (sdk mgSDK) changeThingStatus(id, status, token string) (Thing, errors.SDKE
|
||||
return t, nil
|
||||
}
|
||||
|
||||
func (sdk mgSDK) ShareThing(thingID string, req UsersRelationRequest, token string) errors.SDKError {
|
||||
func (sdk mgSDK) ShareThing(thingID string, req UsersRelationRequest, domainID, token string) errors.SDKError {
|
||||
data, err := json.Marshal(req)
|
||||
if err != nil {
|
||||
return errors.NewSDKError(err)
|
||||
}
|
||||
|
||||
url := fmt.Sprintf("%s/%s/%s/%s", sdk.thingsURL, thingsEndpoint, thingID, shareEndpoint)
|
||||
url := fmt.Sprintf("%s/%s/%s/%s/%s", sdk.thingsURL, domainID, thingsEndpoint, thingID, shareEndpoint)
|
||||
|
||||
_, _, sdkerr := sdk.processRequest(http.MethodPost, url, token, data, nil, http.StatusCreated)
|
||||
return sdkerr
|
||||
}
|
||||
|
||||
func (sdk mgSDK) UnshareThing(thingID string, req UsersRelationRequest, token string) errors.SDKError {
|
||||
func (sdk mgSDK) UnshareThing(thingID string, req UsersRelationRequest, domainID, token string) errors.SDKError {
|
||||
data, err := json.Marshal(req)
|
||||
if err != nil {
|
||||
return errors.NewSDKError(err)
|
||||
}
|
||||
|
||||
url := fmt.Sprintf("%s/%s/%s/%s", sdk.thingsURL, thingsEndpoint, thingID, unshareEndpoint)
|
||||
url := fmt.Sprintf("%s/%s/%s/%s/%s", sdk.thingsURL, domainID, thingsEndpoint, thingID, unshareEndpoint)
|
||||
|
||||
_, _, sdkerr := sdk.processRequest(http.MethodPost, url, token, data, nil, http.StatusNoContent)
|
||||
return sdkerr
|
||||
}
|
||||
|
||||
func (sdk mgSDK) ListThingUsers(thingID string, pm PageMetadata, token string) (UsersPage, errors.SDKError) {
|
||||
url, err := sdk.withQueryParams(sdk.usersURL, fmt.Sprintf("%s/%s/%s", thingsEndpoint, thingID, usersEndpoint), pm)
|
||||
url, err := sdk.withQueryParams(sdk.usersURL, fmt.Sprintf("%s/%s/%s/%s", pm.DomainID, thingsEndpoint, thingID, usersEndpoint), pm)
|
||||
if err != nil {
|
||||
return UsersPage{}, errors.NewSDKError(err)
|
||||
}
|
||||
@@ -286,11 +287,11 @@ func (sdk mgSDK) ListThingUsers(thingID string, pm PageMetadata, token string) (
|
||||
return up, nil
|
||||
}
|
||||
|
||||
func (sdk mgSDK) DeleteThing(id, token string) errors.SDKError {
|
||||
func (sdk mgSDK) DeleteThing(id, domainID, token string) errors.SDKError {
|
||||
if id == "" {
|
||||
return errors.NewSDKError(apiutil.ErrMissingID)
|
||||
}
|
||||
url := fmt.Sprintf("%s/%s/%s", sdk.thingsURL, thingsEndpoint, id)
|
||||
url := fmt.Sprintf("%s/%s/%s/%s", sdk.thingsURL, domainID, thingsEndpoint, id)
|
||||
_, _, sdkerr := sdk.processRequest(http.MethodDelete, url, token, nil, nil, http.StatusNoContent)
|
||||
return sdkerr
|
||||
}
|
||||
|
||||
+260
-154
File diff suppressed because it is too large
Load Diff
+4
-4
@@ -80,7 +80,7 @@ func (sdk mgSDK) Users(pm PageMetadata, token string) (UsersPage, errors.SDKErro
|
||||
}
|
||||
|
||||
func (sdk mgSDK) Members(groupID string, meta PageMetadata, token string) (UsersPage, errors.SDKError) {
|
||||
url, err := sdk.withQueryParams(sdk.usersURL, fmt.Sprintf("%s/%s/%s", groupsEndpoint, groupID, usersEndpoint), meta)
|
||||
url, err := sdk.withQueryParams(sdk.usersURL, fmt.Sprintf("%s/%s/%s/%s", meta.DomainID, groupsEndpoint, groupID, usersEndpoint), meta)
|
||||
if err != nil {
|
||||
return UsersPage{}, errors.NewSDKError(err)
|
||||
}
|
||||
@@ -277,7 +277,7 @@ func (sdk mgSDK) UpdateUserRole(user User, token string) (User, errors.SDKError)
|
||||
}
|
||||
|
||||
func (sdk mgSDK) ListUserChannels(userID string, pm PageMetadata, token string) (ChannelsPage, errors.SDKError) {
|
||||
url, err := sdk.withQueryParams(sdk.thingsURL, fmt.Sprintf("%s/%s/%s", usersEndpoint, userID, channelsEndpoint), pm)
|
||||
url, err := sdk.withQueryParams(sdk.thingsURL, fmt.Sprintf("%s/%s/%s/%s", pm.DomainID, usersEndpoint, userID, channelsEndpoint), pm)
|
||||
if err != nil {
|
||||
return ChannelsPage{}, errors.NewSDKError(err)
|
||||
}
|
||||
@@ -295,7 +295,7 @@ func (sdk mgSDK) ListUserChannels(userID string, pm PageMetadata, token string)
|
||||
}
|
||||
|
||||
func (sdk mgSDK) ListUserGroups(userID string, pm PageMetadata, token string) (GroupsPage, errors.SDKError) {
|
||||
url, err := sdk.withQueryParams(sdk.usersURL, fmt.Sprintf("%s/%s/%s", usersEndpoint, userID, groupsEndpoint), pm)
|
||||
url, err := sdk.withQueryParams(sdk.usersURL, fmt.Sprintf("%s/%s/%s/%s", pm.DomainID, usersEndpoint, userID, groupsEndpoint), pm)
|
||||
if err != nil {
|
||||
return GroupsPage{}, errors.NewSDKError(err)
|
||||
}
|
||||
@@ -312,7 +312,7 @@ func (sdk mgSDK) ListUserGroups(userID string, pm PageMetadata, token string) (G
|
||||
}
|
||||
|
||||
func (sdk mgSDK) ListUserThings(userID string, pm PageMetadata, token string) (ThingsPage, errors.SDKError) {
|
||||
url, err := sdk.withQueryParams(sdk.thingsURL, fmt.Sprintf("%s/%s/%s", usersEndpoint, userID, thingsEndpoint), pm)
|
||||
url, err := sdk.withQueryParams(sdk.thingsURL, fmt.Sprintf("%s/%s/%s/%s", pm.DomainID, usersEndpoint, userID, thingsEndpoint), pm)
|
||||
if err != nil {
|
||||
return ThingsPage{}, errors.NewSDKError(err)
|
||||
}
|
||||
|
||||
+66
-50
@@ -33,7 +33,10 @@ import (
|
||||
"github.com/stretchr/testify/mock"
|
||||
)
|
||||
|
||||
var id = generateUUID(&testing.T{})
|
||||
var (
|
||||
id = generateUUID(&testing.T{})
|
||||
domainID = "c717fa97-ffd9-40cb-8cf9-7c2859059395"
|
||||
)
|
||||
|
||||
func setupUsers() (*httptest.Server, *umocks.Service, *authnmocks.Authentication) {
|
||||
usvc := new(umocks.Service)
|
||||
@@ -291,7 +294,7 @@ func TestListUsers(t *testing.T) {
|
||||
}{
|
||||
{
|
||||
desc: "list users successfully",
|
||||
token: token,
|
||||
token: validToken,
|
||||
pageMeta: sdk.PageMetadata{
|
||||
Offset: offset,
|
||||
Limit: limit,
|
||||
@@ -352,7 +355,7 @@ func TestListUsers(t *testing.T) {
|
||||
},
|
||||
{
|
||||
desc: "list users with zero limit",
|
||||
token: token,
|
||||
token: validToken,
|
||||
pageMeta: sdk.PageMetadata{
|
||||
Offset: offset,
|
||||
Limit: 0,
|
||||
@@ -379,7 +382,7 @@ func TestListUsers(t *testing.T) {
|
||||
},
|
||||
{
|
||||
desc: "list users with limit greater than max",
|
||||
token: token,
|
||||
token: validToken,
|
||||
pageMeta: sdk.PageMetadata{
|
||||
Offset: offset,
|
||||
Limit: 101,
|
||||
@@ -536,7 +539,7 @@ func TestListUsers(t *testing.T) {
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
if tc.token == validToken {
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: validID}
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: domainID}
|
||||
}
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(tc.session, tc.authenticateErr)
|
||||
svcCall := svc.On("ListClients", mock.Anything, tc.session, tc.svcReq).Return(tc.svcRes, tc.svcErr)
|
||||
@@ -667,7 +670,7 @@ func TestSearchClients(t *testing.T) {
|
||||
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: validID}, tc.authenticateErr)
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: domainID}, tc.authenticateErr)
|
||||
svcCall := svc.On("SearchUsers", mock.Anything, mock.Anything).Return(tc.searchreturn, tc.err)
|
||||
page, err := mgsdk.SearchUsers(tc.page, tc.token)
|
||||
assert.Equal(t, tc.err, err, fmt.Sprintf("%s: expected error %s, got %s", tc.desc, tc.err, err))
|
||||
@@ -763,7 +766,7 @@ func TestViewUser(t *testing.T) {
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
if tc.token == validToken {
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: validID}
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: domainID}
|
||||
}
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(tc.session, tc.authenticateErr)
|
||||
svcCall := svc.On("ViewClient", mock.Anything, tc.session, tc.userID).Return(tc.svcRes, tc.svcErr)
|
||||
@@ -842,7 +845,7 @@ func TestUserProfile(t *testing.T) {
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
if tc.token == validToken {
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: validID}
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: domainID}
|
||||
}
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(tc.session, tc.authenticateErr)
|
||||
svcCall := svc.On("ViewProfile", mock.Anything, tc.session).Return(tc.svcRes, tc.svcErr)
|
||||
@@ -1006,7 +1009,7 @@ func TestUpdateUser(t *testing.T) {
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
if tc.token == validToken {
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: validID}
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: domainID}
|
||||
}
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(tc.session, tc.authenticateErr)
|
||||
svcCall := svc.On("UpdateClient", mock.Anything, tc.session, tc.svcReq).Return(tc.svcRes, tc.svcErr)
|
||||
@@ -1164,7 +1167,7 @@ func TestUpdateUserTags(t *testing.T) {
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
if tc.token == validToken {
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: validID}
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: domainID}
|
||||
}
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(tc.session, tc.authenticateErr)
|
||||
svcCall := svc.On("UpdateClientTags", mock.Anything, tc.session, tc.svcReq).Return(tc.svcRes, tc.svcErr)
|
||||
@@ -1312,7 +1315,7 @@ func TestUpdateUserIdentity(t *testing.T) {
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
if tc.token == validToken {
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: validID}
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: domainID}
|
||||
}
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(tc.session, tc.authenticateErr)
|
||||
svcCall := svc.On("UpdateClientIdentity", mock.Anything, tc.session, tc.updateClientReq.ID, tc.svcReq).Return(tc.svcRes, tc.svcErr)
|
||||
@@ -1417,7 +1420,7 @@ func TestResetPassword(t *testing.T) {
|
||||
{
|
||||
desc: "reset password successfully",
|
||||
token: validToken,
|
||||
session: mgauthn.Session{UserID: validID, DomainID: validID},
|
||||
session: mgauthn.Session{UserID: validID, DomainID: domainID},
|
||||
newPassword: newPassword,
|
||||
confPassword: newPassword,
|
||||
svcErr: nil,
|
||||
@@ -1442,7 +1445,7 @@ func TestResetPassword(t *testing.T) {
|
||||
{
|
||||
desc: "reset password with empty new password",
|
||||
token: validToken,
|
||||
session: mgauthn.Session{UserID: validID, DomainID: validID},
|
||||
session: mgauthn.Session{UserID: validID, DomainID: domainID},
|
||||
newPassword: "",
|
||||
confPassword: newPassword,
|
||||
svcErr: nil,
|
||||
@@ -1451,7 +1454,7 @@ func TestResetPassword(t *testing.T) {
|
||||
{
|
||||
desc: "reset password with empty confirm password",
|
||||
token: validToken,
|
||||
session: mgauthn.Session{UserID: validID, DomainID: validID},
|
||||
session: mgauthn.Session{UserID: validID, DomainID: domainID},
|
||||
newPassword: newPassword,
|
||||
confPassword: "",
|
||||
svcErr: nil,
|
||||
@@ -1460,7 +1463,7 @@ func TestResetPassword(t *testing.T) {
|
||||
{
|
||||
desc: "reset password with new password not matching confirm password",
|
||||
token: validToken,
|
||||
session: mgauthn.Session{UserID: validID, DomainID: validID},
|
||||
session: mgauthn.Session{UserID: validID, DomainID: domainID},
|
||||
newPassword: newPassword,
|
||||
confPassword: "wrongPassword",
|
||||
svcErr: nil,
|
||||
@@ -1469,7 +1472,7 @@ func TestResetPassword(t *testing.T) {
|
||||
{
|
||||
desc: "reset password with weak password",
|
||||
token: validToken,
|
||||
session: mgauthn.Session{UserID: validID, DomainID: validID},
|
||||
session: mgauthn.Session{UserID: validID, DomainID: domainID},
|
||||
newPassword: "weak",
|
||||
confPassword: "weak",
|
||||
svcErr: nil,
|
||||
@@ -1479,7 +1482,7 @@ func TestResetPassword(t *testing.T) {
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
if tc.token == validToken {
|
||||
tc.session = mgauthn.Session{UserID: validID, DomainID: validID}
|
||||
tc.session = mgauthn.Session{UserID: validID, DomainID: domainID}
|
||||
}
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(tc.session, tc.authenticateErr)
|
||||
svcCall := svc.On("ResetSecret", mock.Anything, tc.session, tc.newPassword).Return(tc.svcErr)
|
||||
@@ -1610,7 +1613,7 @@ func TestUpdatePassword(t *testing.T) {
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
if tc.token == validToken {
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: validID}
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: domainID}
|
||||
}
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(tc.session, tc.authenticateErr)
|
||||
svcCall := svc.On("UpdateClientSecret", mock.Anything, tc.session, tc.oldPassword, tc.newPassword).Return(tc.svcRes, tc.svcErr)
|
||||
@@ -1767,7 +1770,7 @@ func TestUpdateUserRole(t *testing.T) {
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
if tc.token == validToken {
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: validID}
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: domainID}
|
||||
}
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(tc.session, tc.authenticateErr)
|
||||
svcCall := svc.On("UpdateClientRole", mock.Anything, tc.session, tc.svcReq).Return(tc.svcRes, tc.svcErr)
|
||||
@@ -1839,7 +1842,7 @@ func TestEnableUser(t *testing.T) {
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
if tc.token == validToken {
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: validID}
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: domainID}
|
||||
}
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(tc.session, tc.authenticateErr)
|
||||
svcCall := svc.On("EnableClient", mock.Anything, tc.session, tc.userID).Return(tc.svcRes, tc.svcErr)
|
||||
@@ -1944,7 +1947,7 @@ func TestDisableUser(t *testing.T) {
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
if tc.token == validToken {
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: validID}
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: domainID}
|
||||
}
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(tc.session, tc.authenticateErr)
|
||||
svcCall := svc.On("DisableClient", mock.Anything, tc.session, tc.userID).Return(tc.svcRes, tc.svcErr)
|
||||
@@ -1989,8 +1992,9 @@ func TestListMembers(t *testing.T) {
|
||||
token: validToken,
|
||||
groupID: validID,
|
||||
pageMeta: sdk.PageMetadata{
|
||||
Offset: 0,
|
||||
Limit: 10,
|
||||
Offset: 0,
|
||||
Limit: 10,
|
||||
DomainID: domainID,
|
||||
},
|
||||
svcReq: mgclients.Page{
|
||||
Offset: 0,
|
||||
@@ -2016,8 +2020,9 @@ func TestListMembers(t *testing.T) {
|
||||
token: invalidToken,
|
||||
groupID: validID,
|
||||
pageMeta: sdk.PageMetadata{
|
||||
Offset: 0,
|
||||
Limit: 10,
|
||||
Offset: 0,
|
||||
Limit: 10,
|
||||
DomainID: domainID,
|
||||
},
|
||||
svcReq: mgclients.Page{
|
||||
Offset: 0,
|
||||
@@ -2033,8 +2038,9 @@ func TestListMembers(t *testing.T) {
|
||||
token: "",
|
||||
groupID: validID,
|
||||
pageMeta: sdk.PageMetadata{
|
||||
Offset: 0,
|
||||
Limit: 10,
|
||||
Offset: 0,
|
||||
Limit: 10,
|
||||
DomainID: domainID,
|
||||
},
|
||||
svcReq: mgclients.Page{},
|
||||
svcErr: nil,
|
||||
@@ -2046,8 +2052,9 @@ func TestListMembers(t *testing.T) {
|
||||
token: validToken,
|
||||
groupID: wrongID,
|
||||
pageMeta: sdk.PageMetadata{
|
||||
Offset: 0,
|
||||
Limit: 10,
|
||||
Offset: 0,
|
||||
Limit: 10,
|
||||
DomainID: domainID,
|
||||
},
|
||||
svcReq: mgclients.Page{
|
||||
Offset: 0,
|
||||
@@ -2063,8 +2070,9 @@ func TestListMembers(t *testing.T) {
|
||||
token: validToken,
|
||||
groupID: "",
|
||||
pageMeta: sdk.PageMetadata{
|
||||
Offset: 0,
|
||||
Limit: 10,
|
||||
Offset: 0,
|
||||
Limit: 10,
|
||||
DomainID: domainID,
|
||||
},
|
||||
svcReq: mgclients.Page{},
|
||||
svcErr: nil,
|
||||
@@ -2076,8 +2084,9 @@ func TestListMembers(t *testing.T) {
|
||||
token: validToken,
|
||||
groupID: validID,
|
||||
pageMeta: sdk.PageMetadata{
|
||||
Offset: 0,
|
||||
Limit: 10,
|
||||
Offset: 0,
|
||||
Limit: 10,
|
||||
DomainID: domainID,
|
||||
Metadata: map[string]interface{}{
|
||||
"test": make(chan int),
|
||||
},
|
||||
@@ -2093,8 +2102,9 @@ func TestListMembers(t *testing.T) {
|
||||
token: validToken,
|
||||
groupID: validID,
|
||||
pageMeta: sdk.PageMetadata{
|
||||
Offset: 0,
|
||||
Limit: 10,
|
||||
Offset: 0,
|
||||
Limit: 10,
|
||||
DomainID: domainID,
|
||||
},
|
||||
svcReq: mgclients.Page{
|
||||
Offset: 0,
|
||||
@@ -2121,7 +2131,7 @@ func TestListMembers(t *testing.T) {
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
if tc.token == validToken {
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: validID}
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: domainID}
|
||||
}
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(tc.session, tc.authenticateErr)
|
||||
svcCall := svc.On("ListMembers", mock.Anything, tc.session, "groups", tc.groupID, tc.svcReq).Return(tc.svcRes, tc.svcErr)
|
||||
@@ -2195,7 +2205,7 @@ func TestDeleteUser(t *testing.T) {
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
if tc.token == validToken {
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: validID}
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: domainID}
|
||||
}
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(tc.session, tc.authenticateErr)
|
||||
svcCall := svc.On("DeleteClient", mock.Anything, tc.session, tc.userID).Return(tc.svcErr)
|
||||
@@ -2239,8 +2249,9 @@ func TestListUserGroups(t *testing.T) {
|
||||
token: validToken,
|
||||
userID: validID,
|
||||
pageMeta: sdk.PageMetadata{
|
||||
Offset: 0,
|
||||
Limit: 10,
|
||||
Offset: 0,
|
||||
Limit: 10,
|
||||
DomainID: domainID,
|
||||
},
|
||||
svcReq: groups.Page{
|
||||
PageMeta: groups.PageMeta{
|
||||
@@ -2270,8 +2281,9 @@ func TestListUserGroups(t *testing.T) {
|
||||
token: invalidToken,
|
||||
userID: validID,
|
||||
pageMeta: sdk.PageMetadata{
|
||||
Offset: 0,
|
||||
Limit: 10,
|
||||
Offset: 0,
|
||||
Limit: 10,
|
||||
DomainID: domainID,
|
||||
},
|
||||
svcReq: groups.Page{
|
||||
PageMeta: groups.PageMeta{
|
||||
@@ -2296,8 +2308,9 @@ func TestListUserGroups(t *testing.T) {
|
||||
token: "",
|
||||
userID: validID,
|
||||
pageMeta: sdk.PageMetadata{
|
||||
Offset: 0,
|
||||
Limit: 10,
|
||||
Offset: 0,
|
||||
Limit: 10,
|
||||
DomainID: domainID,
|
||||
},
|
||||
svcReq: groups.Page{},
|
||||
svcErr: nil,
|
||||
@@ -2309,8 +2322,9 @@ func TestListUserGroups(t *testing.T) {
|
||||
token: validToken,
|
||||
userID: wrongID,
|
||||
pageMeta: sdk.PageMetadata{
|
||||
Offset: 0,
|
||||
Limit: 10,
|
||||
Offset: 0,
|
||||
Limit: 10,
|
||||
DomainID: domainID,
|
||||
},
|
||||
svcReq: groups.Page{
|
||||
PageMeta: groups.PageMeta{
|
||||
@@ -2330,8 +2344,9 @@ func TestListUserGroups(t *testing.T) {
|
||||
token: validToken,
|
||||
userID: validID,
|
||||
pageMeta: sdk.PageMetadata{
|
||||
Offset: 0,
|
||||
Limit: 10,
|
||||
Offset: 0,
|
||||
Limit: 10,
|
||||
DomainID: domainID,
|
||||
Metadata: map[string]interface{}{
|
||||
"test": make(chan int),
|
||||
},
|
||||
@@ -2347,8 +2362,9 @@ func TestListUserGroups(t *testing.T) {
|
||||
token: validToken,
|
||||
userID: validID,
|
||||
pageMeta: sdk.PageMetadata{
|
||||
Offset: 0,
|
||||
Limit: 10,
|
||||
Offset: 0,
|
||||
Limit: 10,
|
||||
DomainID: domainID,
|
||||
},
|
||||
svcReq: groups.Page{
|
||||
PageMeta: groups.PageMeta{
|
||||
@@ -2378,7 +2394,7 @@ func TestListUserGroups(t *testing.T) {
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
if tc.token == validToken {
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: validID}
|
||||
tc.session = mgauthn.Session{DomainUserID: validID, UserID: validID, DomainID: domainID}
|
||||
}
|
||||
authCall := auth.On("Authenticate", mock.Anything, tc.token).Return(tc.session, tc.authenticateErr)
|
||||
svcCall := svc.On("ListGroups", mock.Anything, tc.session, "users", tc.userID, tc.svcReq).Return(tc.svcRes, tc.svcErr)
|
||||
|
||||
+356
-356
File diff suppressed because it is too large
Load Diff
@@ -19,7 +19,7 @@ func doProvision(svc provision.Service) endpoint.Endpoint {
|
||||
return nil, errors.Wrap(apiutil.ErrValidation, err)
|
||||
}
|
||||
|
||||
res, err := svc.Provision(req.token, req.Name, req.ExternalID, req.ExternalKey)
|
||||
res, err := svc.Provision(req.domainID, req.token, req.Name, req.ExternalID, req.ExternalKey)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -67,6 +67,7 @@ func TestProvision(t *testing.T) {
|
||||
cases := []struct {
|
||||
desc string
|
||||
token string
|
||||
domainID string
|
||||
data string
|
||||
contentType string
|
||||
status int
|
||||
@@ -75,6 +76,7 @@ func TestProvision(t *testing.T) {
|
||||
{
|
||||
desc: "valid request",
|
||||
token: validToken,
|
||||
domainID: validID,
|
||||
data: fmt.Sprintf(`{"name": "test", "external_id": "%s", "external_key": "%s"}`, validID, validID),
|
||||
status: http.StatusCreated,
|
||||
contentType: validContenType,
|
||||
@@ -83,6 +85,7 @@ func TestProvision(t *testing.T) {
|
||||
{
|
||||
desc: "request with empty external id",
|
||||
token: validToken,
|
||||
domainID: validID,
|
||||
data: fmt.Sprintf(`{"name": "test", "external_key": "%s"}`, validID),
|
||||
status: http.StatusBadRequest,
|
||||
contentType: validContenType,
|
||||
@@ -91,6 +94,7 @@ func TestProvision(t *testing.T) {
|
||||
{
|
||||
desc: "request with empty external key",
|
||||
token: validToken,
|
||||
domainID: validID,
|
||||
data: fmt.Sprintf(`{"name": "test", "external_id": "%s"}`, validID),
|
||||
status: http.StatusBadRequest,
|
||||
contentType: validContenType,
|
||||
@@ -99,6 +103,7 @@ func TestProvision(t *testing.T) {
|
||||
{
|
||||
desc: "empty token",
|
||||
token: "",
|
||||
domainID: validID,
|
||||
data: fmt.Sprintf(`{"name": "test", "external_id": "%s", "external_key": "%s"}`, validID, validID),
|
||||
status: http.StatusCreated,
|
||||
contentType: validContenType,
|
||||
@@ -107,6 +112,7 @@ func TestProvision(t *testing.T) {
|
||||
{
|
||||
desc: "invalid content type",
|
||||
token: validToken,
|
||||
domainID: validID,
|
||||
data: fmt.Sprintf(`{"name": "test", "external_id": "%s", "external_key": "%s"}`, validID, validID),
|
||||
status: http.StatusUnsupportedMediaType,
|
||||
contentType: "text/plain",
|
||||
@@ -115,6 +121,7 @@ func TestProvision(t *testing.T) {
|
||||
{
|
||||
desc: "invalid request",
|
||||
token: validToken,
|
||||
domainID: validID,
|
||||
data: `data`,
|
||||
status: http.StatusBadRequest,
|
||||
contentType: validContenType,
|
||||
@@ -123,6 +130,7 @@ func TestProvision(t *testing.T) {
|
||||
{
|
||||
desc: "service error",
|
||||
token: validToken,
|
||||
domainID: validID,
|
||||
data: fmt.Sprintf(`{"name": "test", "external_id": "%s", "external_key": "%s"}`, validID, validID),
|
||||
status: http.StatusForbidden,
|
||||
contentType: validContenType,
|
||||
@@ -132,11 +140,11 @@ func TestProvision(t *testing.T) {
|
||||
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
repocall := svc.On("Provision", tc.token, "test", validID, validID).Return(provision.Result{}, tc.svcErr)
|
||||
repocall := svc.On("Provision", validID, tc.token, "test", validID, validID).Return(provision.Result{}, tc.svcErr)
|
||||
req := testRequest{
|
||||
client: is.Client(),
|
||||
method: http.MethodPost,
|
||||
url: is.URL + "/mapping",
|
||||
url: is.URL + fmt.Sprintf("/%s/mapping", tc.domainID),
|
||||
token: tc.token,
|
||||
contentType: tc.contentType,
|
||||
body: strings.NewReader(tc.data),
|
||||
@@ -156,6 +164,7 @@ func TestMapping(t *testing.T) {
|
||||
cases := []struct {
|
||||
desc string
|
||||
token string
|
||||
domainID string
|
||||
contentType string
|
||||
status int
|
||||
svcErr error
|
||||
@@ -163,6 +172,7 @@ func TestMapping(t *testing.T) {
|
||||
{
|
||||
desc: "valid request",
|
||||
token: validToken,
|
||||
domainID: validID,
|
||||
status: http.StatusOK,
|
||||
contentType: validContenType,
|
||||
svcErr: nil,
|
||||
@@ -170,6 +180,7 @@ func TestMapping(t *testing.T) {
|
||||
{
|
||||
desc: "empty token",
|
||||
token: "",
|
||||
domainID: validID,
|
||||
status: http.StatusUnauthorized,
|
||||
contentType: validContenType,
|
||||
svcErr: nil,
|
||||
@@ -177,6 +188,7 @@ func TestMapping(t *testing.T) {
|
||||
{
|
||||
desc: "invalid content type",
|
||||
token: validToken,
|
||||
domainID: validID,
|
||||
status: http.StatusUnsupportedMediaType,
|
||||
contentType: "text/plain",
|
||||
svcErr: nil,
|
||||
@@ -184,6 +196,7 @@ func TestMapping(t *testing.T) {
|
||||
{
|
||||
desc: "service error",
|
||||
token: validToken,
|
||||
domainID: validID,
|
||||
status: http.StatusForbidden,
|
||||
contentType: validContenType,
|
||||
svcErr: svcerr.ErrAuthorization,
|
||||
@@ -196,7 +209,7 @@ func TestMapping(t *testing.T) {
|
||||
req := testRequest{
|
||||
client: is.Client(),
|
||||
method: http.MethodGet,
|
||||
url: is.URL + "/mapping",
|
||||
url: is.URL + fmt.Sprintf("/%s/mapping", tc.domainID),
|
||||
token: tc.token,
|
||||
contentType: tc.contentType,
|
||||
}
|
||||
|
||||
@@ -24,7 +24,7 @@ func NewLoggingMiddleware(svc provision.Service, logger *slog.Logger) provision.
|
||||
return &loggingMiddleware{logger, svc}
|
||||
}
|
||||
|
||||
func (lm *loggingMiddleware) Provision(token, name, externalID, externalKey string) (res provision.Result, err error) {
|
||||
func (lm *loggingMiddleware) Provision(domainID, token, name, externalID, externalKey string) (res provision.Result, err error) {
|
||||
defer func(begin time.Time) {
|
||||
args := []any{
|
||||
slog.String("duration", time.Since(begin).String()),
|
||||
@@ -39,10 +39,10 @@ func (lm *loggingMiddleware) Provision(token, name, externalID, externalKey stri
|
||||
lm.logger.Info("Provision completed successfully", args...)
|
||||
}(time.Now())
|
||||
|
||||
return lm.svc.Provision(token, name, externalID, externalKey)
|
||||
return lm.svc.Provision(domainID, token, name, externalID, externalKey)
|
||||
}
|
||||
|
||||
func (lm *loggingMiddleware) Cert(token, thingID, duration string) (cert, key string, err error) {
|
||||
func (lm *loggingMiddleware) Cert(domainID, token, thingID, duration string) (cert, key string, err error) {
|
||||
defer func(begin time.Time) {
|
||||
args := []any{
|
||||
slog.String("duration", time.Since(begin).String()),
|
||||
@@ -57,7 +57,7 @@ func (lm *loggingMiddleware) Cert(token, thingID, duration string) (cert, key st
|
||||
lm.logger.Info("Thing certificate created successfully", args...)
|
||||
}(time.Now())
|
||||
|
||||
return lm.svc.Cert(token, thingID, duration)
|
||||
return lm.svc.Cert(domainID, token, thingID, duration)
|
||||
}
|
||||
|
||||
func (lm *loggingMiddleware) Mapping(token string) (res map[string]interface{}, err error) {
|
||||
|
||||
@@ -7,6 +7,7 @@ import "github.com/absmach/magistrala/pkg/apiutil"
|
||||
|
||||
type provisionReq struct {
|
||||
token string
|
||||
domainID string
|
||||
Name string `json:"name"`
|
||||
ExternalID string `json:"external_id"`
|
||||
ExternalKey string `json:"external_key"`
|
||||
@@ -16,6 +17,9 @@ func (req provisionReq) validate() error {
|
||||
if req.ExternalID == "" {
|
||||
return apiutil.ErrMissingID
|
||||
}
|
||||
if req.domainID == "" {
|
||||
return apiutil.ErrMissingDomainID
|
||||
}
|
||||
|
||||
if req.ExternalKey == "" {
|
||||
return apiutil.ErrBearerKey
|
||||
@@ -29,12 +33,16 @@ func (req provisionReq) validate() error {
|
||||
}
|
||||
|
||||
type mappingReq struct {
|
||||
token string
|
||||
token string
|
||||
domainID string
|
||||
}
|
||||
|
||||
func (req mappingReq) validate() error {
|
||||
if req.token == "" {
|
||||
return apiutil.ErrBearerToken
|
||||
}
|
||||
if req.domainID == "" {
|
||||
return apiutil.ErrMissingDomainID
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -23,6 +23,7 @@ func TestProvisioReq(t *testing.T) {
|
||||
desc: "valid request",
|
||||
req: provisionReq{
|
||||
token: "token",
|
||||
domainID: testsutil.GenerateUUID(t),
|
||||
Name: "name",
|
||||
ExternalID: testsutil.GenerateUUID(t),
|
||||
ExternalKey: testsutil.GenerateUUID(t),
|
||||
@@ -33,16 +34,29 @@ func TestProvisioReq(t *testing.T) {
|
||||
desc: "empty external id",
|
||||
req: provisionReq{
|
||||
token: "token",
|
||||
domainID: testsutil.GenerateUUID(t),
|
||||
Name: "name",
|
||||
ExternalID: "",
|
||||
ExternalKey: testsutil.GenerateUUID(t),
|
||||
},
|
||||
err: apiutil.ErrMissingID,
|
||||
},
|
||||
{
|
||||
desc: "empty domain id",
|
||||
req: provisionReq{
|
||||
token: "token",
|
||||
domainID: "",
|
||||
Name: "name",
|
||||
ExternalID: testsutil.GenerateUUID(t),
|
||||
ExternalKey: testsutil.GenerateUUID(t),
|
||||
},
|
||||
err: apiutil.ErrMissingDomainID,
|
||||
},
|
||||
{
|
||||
desc: "empty external key",
|
||||
req: provisionReq{
|
||||
token: "token",
|
||||
domainID: testsutil.GenerateUUID(t),
|
||||
Name: "name",
|
||||
ExternalID: testsutil.GenerateUUID(t),
|
||||
ExternalKey: "",
|
||||
@@ -66,17 +80,27 @@ func TestMappingReq(t *testing.T) {
|
||||
{
|
||||
desc: "valid request",
|
||||
req: mappingReq{
|
||||
token: "token",
|
||||
token: "token",
|
||||
domainID: testsutil.GenerateUUID(t),
|
||||
},
|
||||
err: nil,
|
||||
},
|
||||
{
|
||||
desc: "empty token",
|
||||
req: mappingReq{
|
||||
token: "",
|
||||
token: "",
|
||||
domainID: testsutil.GenerateUUID(t),
|
||||
},
|
||||
err: apiutil.ErrBearerToken,
|
||||
},
|
||||
{
|
||||
desc: "empty domain id",
|
||||
req: mappingReq{
|
||||
token: "token",
|
||||
domainID: "",
|
||||
},
|
||||
err: apiutil.ErrMissingDomainID,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
|
||||
+23
-16
@@ -31,21 +31,22 @@ func MakeHandler(svc provision.Service, logger *slog.Logger, instanceID string)
|
||||
|
||||
r := chi.NewRouter()
|
||||
|
||||
r.Route("/mapping", func(r chi.Router) {
|
||||
r.Post("/", kithttp.NewServer(
|
||||
doProvision(svc),
|
||||
decodeProvisionRequest,
|
||||
api.EncodeResponse,
|
||||
opts...,
|
||||
).ServeHTTP)
|
||||
r.Get("/", kithttp.NewServer(
|
||||
getMapping(svc),
|
||||
decodeMappingRequest,
|
||||
api.EncodeResponse,
|
||||
opts...,
|
||||
).ServeHTTP)
|
||||
r.Route("/{domainID}", func(r chi.Router) {
|
||||
r.Route("/mapping", func(r chi.Router) {
|
||||
r.Post("/", kithttp.NewServer(
|
||||
doProvision(svc),
|
||||
decodeProvisionRequest,
|
||||
api.EncodeResponse,
|
||||
opts...,
|
||||
).ServeHTTP)
|
||||
r.Get("/", kithttp.NewServer(
|
||||
getMapping(svc),
|
||||
decodeMappingRequest,
|
||||
api.EncodeResponse,
|
||||
opts...,
|
||||
).ServeHTTP)
|
||||
})
|
||||
})
|
||||
|
||||
r.Handle("/metrics", promhttp.Handler())
|
||||
r.Get("/health", magistrala.Health("provision", instanceID))
|
||||
|
||||
@@ -57,7 +58,10 @@ func decodeProvisionRequest(_ context.Context, r *http.Request) (interface{}, er
|
||||
return nil, errors.Wrap(apiutil.ErrValidation, apiutil.ErrUnsupportedContentType)
|
||||
}
|
||||
|
||||
req := provisionReq{token: apiutil.ExtractBearerToken(r)}
|
||||
req := provisionReq{
|
||||
token: apiutil.ExtractBearerToken(r),
|
||||
domainID: chi.URLParam(r, "domainID"),
|
||||
}
|
||||
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
|
||||
return nil, errors.Wrap(apiutil.ErrValidation, errors.Wrap(err, errors.ErrMalformedEntity))
|
||||
}
|
||||
@@ -70,7 +74,10 @@ func decodeMappingRequest(_ context.Context, r *http.Request) (interface{}, erro
|
||||
return nil, errors.Wrap(apiutil.ErrValidation, apiutil.ErrUnsupportedContentType)
|
||||
}
|
||||
|
||||
req := mappingReq{token: apiutil.ExtractBearerToken(r)}
|
||||
req := mappingReq{
|
||||
token: apiutil.ExtractBearerToken(r),
|
||||
domainID: chi.URLParam(r, "domainID"),
|
||||
}
|
||||
|
||||
return req, nil
|
||||
}
|
||||
|
||||
+20
-20
@@ -14,9 +14,9 @@ type Service struct {
|
||||
mock.Mock
|
||||
}
|
||||
|
||||
// Cert provides a mock function with given fields: token, thingID, duration
|
||||
func (_m *Service) Cert(token string, thingID string, duration string) (string, string, error) {
|
||||
ret := _m.Called(token, thingID, duration)
|
||||
// Cert provides a mock function with given fields: domainID, token, thingID, duration
|
||||
func (_m *Service) Cert(domainID string, token string, thingID string, duration string) (string, string, error) {
|
||||
ret := _m.Called(domainID, token, thingID, duration)
|
||||
|
||||
if len(ret) == 0 {
|
||||
panic("no return value specified for Cert")
|
||||
@@ -25,23 +25,23 @@ func (_m *Service) Cert(token string, thingID string, duration string) (string,
|
||||
var r0 string
|
||||
var r1 string
|
||||
var r2 error
|
||||
if rf, ok := ret.Get(0).(func(string, string, string) (string, string, error)); ok {
|
||||
return rf(token, thingID, duration)
|
||||
if rf, ok := ret.Get(0).(func(string, string, string, string) (string, string, error)); ok {
|
||||
return rf(domainID, token, thingID, duration)
|
||||
}
|
||||
if rf, ok := ret.Get(0).(func(string, string, string) string); ok {
|
||||
r0 = rf(token, thingID, duration)
|
||||
if rf, ok := ret.Get(0).(func(string, string, string, string) string); ok {
|
||||
r0 = rf(domainID, token, thingID, duration)
|
||||
} else {
|
||||
r0 = ret.Get(0).(string)
|
||||
}
|
||||
|
||||
if rf, ok := ret.Get(1).(func(string, string, string) string); ok {
|
||||
r1 = rf(token, thingID, duration)
|
||||
if rf, ok := ret.Get(1).(func(string, string, string, string) string); ok {
|
||||
r1 = rf(domainID, token, thingID, duration)
|
||||
} else {
|
||||
r1 = ret.Get(1).(string)
|
||||
}
|
||||
|
||||
if rf, ok := ret.Get(2).(func(string, string, string) error); ok {
|
||||
r2 = rf(token, thingID, duration)
|
||||
if rf, ok := ret.Get(2).(func(string, string, string, string) error); ok {
|
||||
r2 = rf(domainID, token, thingID, duration)
|
||||
} else {
|
||||
r2 = ret.Error(2)
|
||||
}
|
||||
@@ -79,9 +79,9 @@ func (_m *Service) Mapping(token string) (map[string]interface{}, error) {
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// Provision provides a mock function with given fields: token, name, externalID, externalKey
|
||||
func (_m *Service) Provision(token string, name string, externalID string, externalKey string) (provision.Result, error) {
|
||||
ret := _m.Called(token, name, externalID, externalKey)
|
||||
// Provision provides a mock function with given fields: domainID, token, name, externalID, externalKey
|
||||
func (_m *Service) Provision(domainID string, token string, name string, externalID string, externalKey string) (provision.Result, error) {
|
||||
ret := _m.Called(domainID, token, name, externalID, externalKey)
|
||||
|
||||
if len(ret) == 0 {
|
||||
panic("no return value specified for Provision")
|
||||
@@ -89,17 +89,17 @@ func (_m *Service) Provision(token string, name string, externalID string, exter
|
||||
|
||||
var r0 provision.Result
|
||||
var r1 error
|
||||
if rf, ok := ret.Get(0).(func(string, string, string, string) (provision.Result, error)); ok {
|
||||
return rf(token, name, externalID, externalKey)
|
||||
if rf, ok := ret.Get(0).(func(string, string, string, string, string) (provision.Result, error)); ok {
|
||||
return rf(domainID, token, name, externalID, externalKey)
|
||||
}
|
||||
if rf, ok := ret.Get(0).(func(string, string, string, string) provision.Result); ok {
|
||||
r0 = rf(token, name, externalID, externalKey)
|
||||
if rf, ok := ret.Get(0).(func(string, string, string, string, string) provision.Result); ok {
|
||||
r0 = rf(domainID, token, name, externalID, externalKey)
|
||||
} else {
|
||||
r0 = ret.Get(0).(provision.Result)
|
||||
}
|
||||
|
||||
if rf, ok := ret.Get(1).(func(string, string, string, string) error); ok {
|
||||
r1 = rf(token, name, externalID, externalKey)
|
||||
if rf, ok := ret.Get(1).(func(string, string, string, string, string) error); ok {
|
||||
r1 = rf(domainID, token, name, externalID, externalKey)
|
||||
} else {
|
||||
r1 = ret.Error(1)
|
||||
}
|
||||
|
||||
+38
-38
@@ -56,7 +56,7 @@ type Service interface {
|
||||
// - create multiple Channels
|
||||
// - create Bootstrap configuration
|
||||
// - whitelist Thing in Bootstrap configuration == connect Thing to Channels
|
||||
Provision(token, name, externalID, externalKey string) (Result, error)
|
||||
Provision(domainID, token, name, externalID, externalKey string) (Result, error)
|
||||
|
||||
// Mapping returns current configuration used for provision
|
||||
// useful for using in ui to create configuration that matches
|
||||
@@ -67,7 +67,7 @@ type Service interface {
|
||||
// A duration string is a possibly signed sequence of decimal numbers,
|
||||
// each with optional fraction and a unit suffix, such as "300ms", "-1.5h" or "2h45m".
|
||||
// Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h".
|
||||
Cert(token, thingID, duration string) (string, string, error)
|
||||
Cert(domainID, token, thingID, duration string) (string, string, error)
|
||||
}
|
||||
|
||||
type provisionService struct {
|
||||
@@ -112,10 +112,10 @@ func (ps *provisionService) Mapping(token string) (map[string]interface{}, error
|
||||
|
||||
// Provision is provision method for creating setup according to
|
||||
// provision layout specified in config.toml.
|
||||
func (ps *provisionService) Provision(token, name, externalID, externalKey string) (res Result, err error) {
|
||||
func (ps *provisionService) Provision(domainID, token, name, externalID, externalKey string) (res Result, err error) {
|
||||
var channels []sdk.Channel
|
||||
var things []sdk.Thing
|
||||
defer ps.recover(&err, &things, &channels, &token)
|
||||
defer ps.recover(&err, &things, &channels, &domainID, &token)
|
||||
|
||||
token, err = ps.createTokenIfEmpty(token)
|
||||
if err != nil {
|
||||
@@ -142,14 +142,14 @@ func (ps *provisionService) Provision(token, name, externalID, externalKey strin
|
||||
name = thing.Name
|
||||
}
|
||||
th.Name = name
|
||||
th, err := ps.sdk.CreateThing(th, token)
|
||||
th, err := ps.sdk.CreateThing(th, domainID, token)
|
||||
if err != nil {
|
||||
res.Error = err.Error()
|
||||
return res, errors.Wrap(ErrFailedThingCreation, err)
|
||||
}
|
||||
|
||||
// Get newly created thing (in order to get the key).
|
||||
th, err = ps.sdk.Thing(th.ID, token)
|
||||
th, err = ps.sdk.Thing(th.ID, domainID, token)
|
||||
if err != nil {
|
||||
e := errors.Wrap(err, fmt.Errorf("thing id: %s", th.ID))
|
||||
return res, errors.Wrap(ErrFailedThingRetrieval, e)
|
||||
@@ -162,11 +162,11 @@ func (ps *provisionService) Provision(token, name, externalID, externalKey strin
|
||||
Name: name + "_" + channel.Name,
|
||||
Metadata: sdk.Metadata(channel.Metadata),
|
||||
}
|
||||
ch, err := ps.sdk.CreateChannel(ch, token)
|
||||
ch, err := ps.sdk.CreateChannel(ch, domainID, token)
|
||||
if err != nil {
|
||||
return res, errors.Wrap(ErrFailedChannelCreation, err)
|
||||
}
|
||||
ch, err = ps.sdk.Channel(ch.ID, token)
|
||||
ch, err = ps.sdk.Channel(ch.ID, domainID, token)
|
||||
if err != nil {
|
||||
e := errors.Wrap(err, fmt.Errorf("channel id: %s", ch.ID))
|
||||
return res, errors.Wrap(ErrFailedChannelRetrieval, e)
|
||||
@@ -206,12 +206,12 @@ func (ps *provisionService) Provision(token, name, externalID, externalKey strin
|
||||
ClientKey: cert.Key,
|
||||
Content: string(content),
|
||||
}
|
||||
bsid, err := ps.sdk.AddBootstrap(bsReq, token)
|
||||
bsid, err := ps.sdk.AddBootstrap(bsReq, domainID, token)
|
||||
if err != nil {
|
||||
return Result{}, errors.Wrap(ErrFailedBootstrap, err)
|
||||
}
|
||||
|
||||
bsConfig, err = ps.sdk.ViewBootstrap(bsid, token)
|
||||
bsConfig, err = ps.sdk.ViewBootstrap(bsid, domainID, token)
|
||||
if err != nil {
|
||||
return Result{}, errors.Wrap(ErrFailedBootstrapValidate, err)
|
||||
}
|
||||
@@ -220,12 +220,12 @@ func (ps *provisionService) Provision(token, name, externalID, externalKey strin
|
||||
if ps.conf.Bootstrap.X509Provision {
|
||||
var cert sdk.Cert
|
||||
|
||||
cert, err = ps.sdk.IssueCert(thing.ID, ps.conf.Cert.TTL, token)
|
||||
cert, err = ps.sdk.IssueCert(thing.ID, ps.conf.Cert.TTL, domainID, token)
|
||||
if err != nil {
|
||||
e := errors.Wrap(err, fmt.Errorf("thing id: %s", thing.ID))
|
||||
return res, errors.Wrap(ErrFailedCertCreation, e)
|
||||
}
|
||||
cert, err := ps.sdk.ViewCert(cert.SerialNumber, token)
|
||||
cert, err := ps.sdk.ViewCert(cert.SerialNumber, domainID, token)
|
||||
if err != nil {
|
||||
return res, errors.Wrap(ErrFailedCertView, err)
|
||||
}
|
||||
@@ -235,14 +235,14 @@ func (ps *provisionService) Provision(token, name, externalID, externalKey strin
|
||||
res.CACert = ""
|
||||
|
||||
if needsBootstrap(thing) {
|
||||
if _, err = ps.sdk.UpdateBootstrapCerts(bsConfig.ThingID, cert.Certificate, cert.Key, "", token); err != nil {
|
||||
if _, err = ps.sdk.UpdateBootstrapCerts(bsConfig.ThingID, cert.Certificate, cert.Key, "", domainID, token); err != nil {
|
||||
return Result{}, errors.Wrap(ErrFailedCertCreation, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ps.conf.Bootstrap.AutoWhiteList {
|
||||
if err := ps.sdk.Whitelist(thing.ID, Active, token); err != nil {
|
||||
if err := ps.sdk.Whitelist(thing.ID, Active, domainID, token); err != nil {
|
||||
res.Error = err.Error()
|
||||
return res, ErrThingUpdate
|
||||
}
|
||||
@@ -250,27 +250,27 @@ func (ps *provisionService) Provision(token, name, externalID, externalKey strin
|
||||
}
|
||||
}
|
||||
|
||||
if err = ps.updateGateway(token, bsConfig, channels); err != nil {
|
||||
if err = ps.updateGateway(domainID, token, bsConfig, channels); err != nil {
|
||||
return res, err
|
||||
}
|
||||
return res, nil
|
||||
}
|
||||
|
||||
func (ps *provisionService) Cert(token, thingID, ttl string) (string, string, error) {
|
||||
func (ps *provisionService) Cert(domainID, token, thingID, ttl string) (string, string, error) {
|
||||
token, err := ps.createTokenIfEmpty(token)
|
||||
if err != nil {
|
||||
return "", "", errors.Wrap(ErrFailedToCreateToken, err)
|
||||
}
|
||||
|
||||
th, err := ps.sdk.Thing(thingID, token)
|
||||
th, err := ps.sdk.Thing(thingID, domainID, token)
|
||||
if err != nil {
|
||||
return "", "", errors.Wrap(ErrUnauthorized, err)
|
||||
}
|
||||
cert, err := ps.sdk.IssueCert(th.ID, ps.conf.Cert.TTL, token)
|
||||
cert, err := ps.sdk.IssueCert(th.ID, ps.conf.Cert.TTL, domainID, token)
|
||||
if err != nil {
|
||||
return "", "", errors.Wrap(ErrFailedCertCreation, err)
|
||||
}
|
||||
cert, err = ps.sdk.ViewCert(cert.SerialNumber, token)
|
||||
cert, err = ps.sdk.ViewCert(cert.SerialNumber, domainID, token)
|
||||
if err != nil {
|
||||
return "", "", errors.Wrap(ErrFailedCertView, err)
|
||||
}
|
||||
@@ -306,7 +306,7 @@ func (ps *provisionService) createTokenIfEmpty(token string) (string, error) {
|
||||
return tkn.AccessToken, nil
|
||||
}
|
||||
|
||||
func (ps *provisionService) updateGateway(token string, bs sdk.BootstrapConfig, channels []sdk.Channel) error {
|
||||
func (ps *provisionService) updateGateway(domainID, token string, bs sdk.BootstrapConfig, channels []sdk.Channel) error {
|
||||
var gw Gateway
|
||||
for _, ch := range channels {
|
||||
switch ch.Metadata["type"] {
|
||||
@@ -323,7 +323,7 @@ func (ps *provisionService) updateGateway(token string, bs sdk.BootstrapConfig,
|
||||
gw.CfgID = bs.ThingID
|
||||
gw.Type = gateway
|
||||
|
||||
th, sdkerr := ps.sdk.Thing(bs.ThingID, token)
|
||||
th, sdkerr := ps.sdk.Thing(bs.ThingID, domainID, token)
|
||||
if sdkerr != nil {
|
||||
return errors.Wrap(ErrGatewayUpdate, sdkerr)
|
||||
}
|
||||
@@ -334,7 +334,7 @@ func (ps *provisionService) updateGateway(token string, bs sdk.BootstrapConfig,
|
||||
if err := json.Unmarshal(b, &th.Metadata); err != nil {
|
||||
return errors.Wrap(ErrGatewayUpdate, err)
|
||||
}
|
||||
if _, err := ps.sdk.UpdateThing(th, token); err != nil {
|
||||
if _, err := ps.sdk.UpdateThing(th, domainID, token); err != nil {
|
||||
return errors.Wrap(ErrGatewayUpdate, err)
|
||||
}
|
||||
return nil
|
||||
@@ -346,68 +346,68 @@ func (ps *provisionService) errLog(err error) {
|
||||
}
|
||||
}
|
||||
|
||||
func clean(ps *provisionService, things []sdk.Thing, channels []sdk.Channel, token string) {
|
||||
func clean(ps *provisionService, things []sdk.Thing, channels []sdk.Channel, domainID, token string) {
|
||||
for _, t := range things {
|
||||
err := ps.sdk.DeleteThing(t.ID, token)
|
||||
err := ps.sdk.DeleteThing(t.ID, domainID, token)
|
||||
ps.errLog(err)
|
||||
}
|
||||
for _, c := range channels {
|
||||
err := ps.sdk.DeleteChannel(c.ID, token)
|
||||
err := ps.sdk.DeleteChannel(c.ID, domainID, token)
|
||||
ps.errLog(err)
|
||||
}
|
||||
}
|
||||
|
||||
func (ps *provisionService) recover(e *error, ths *[]sdk.Thing, chs *[]sdk.Channel, tkn *string) {
|
||||
func (ps *provisionService) recover(e *error, ths *[]sdk.Thing, chs *[]sdk.Channel, dm, tkn *string) {
|
||||
if e == nil {
|
||||
return
|
||||
}
|
||||
things, channels, token, err := *ths, *chs, *tkn, *e
|
||||
things, channels, domainID, token, err := *ths, *chs, *dm, *tkn, *e
|
||||
|
||||
if errors.Contains(err, ErrFailedThingRetrieval) || errors.Contains(err, ErrFailedChannelCreation) {
|
||||
for _, th := range things {
|
||||
err := ps.sdk.DeleteThing(th.ID, token)
|
||||
err := ps.sdk.DeleteThing(th.ID, domainID, token)
|
||||
ps.errLog(err)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
if errors.Contains(err, ErrFailedBootstrap) || errors.Contains(err, ErrFailedChannelRetrieval) {
|
||||
clean(ps, things, channels, token)
|
||||
clean(ps, things, channels, domainID, token)
|
||||
return
|
||||
}
|
||||
|
||||
if errors.Contains(err, ErrFailedBootstrapValidate) || errors.Contains(err, ErrFailedCertCreation) {
|
||||
clean(ps, things, channels, token)
|
||||
clean(ps, things, channels, domainID, token)
|
||||
for _, th := range things {
|
||||
if needsBootstrap(th) {
|
||||
ps.errLog(ps.sdk.RemoveBootstrap(th.ID, token))
|
||||
ps.errLog(ps.sdk.RemoveBootstrap(th.ID, domainID, token))
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
if errors.Contains(err, ErrFailedBootstrapValidate) || errors.Contains(err, ErrFailedCertCreation) {
|
||||
clean(ps, things, channels, token)
|
||||
clean(ps, things, channels, domainID, token)
|
||||
for _, th := range things {
|
||||
if needsBootstrap(th) {
|
||||
bs, err := ps.sdk.ViewBootstrap(th.ID, token)
|
||||
bs, err := ps.sdk.ViewBootstrap(th.ID, domainID, token)
|
||||
ps.errLog(errors.Wrap(ErrFailedBootstrapRetrieval, err))
|
||||
ps.errLog(ps.sdk.RemoveBootstrap(bs.ThingID, token))
|
||||
ps.errLog(ps.sdk.RemoveBootstrap(bs.ThingID, domainID, token))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if errors.Contains(err, ErrThingUpdate) || errors.Contains(err, ErrGatewayUpdate) {
|
||||
clean(ps, things, channels, token)
|
||||
clean(ps, things, channels, domainID, token)
|
||||
for _, th := range things {
|
||||
if ps.conf.Bootstrap.X509Provision && needsBootstrap(th) {
|
||||
_, err := ps.sdk.RevokeCert(th.ID, token)
|
||||
_, err := ps.sdk.RevokeCert(th.ID, domainID, token)
|
||||
ps.errLog(err)
|
||||
}
|
||||
if needsBootstrap(th) {
|
||||
bs, err := ps.sdk.ViewBootstrap(th.ID, token)
|
||||
bs, err := ps.sdk.ViewBootstrap(th.ID, domainID, token)
|
||||
ps.errLog(errors.Wrap(ErrFailedBootstrapRetrieval, err))
|
||||
ps.errLog(ps.sdk.RemoveBootstrap(bs.ThingID, token))
|
||||
ps.errLog(ps.sdk.RemoveBootstrap(bs.ThingID, domainID, token))
|
||||
}
|
||||
}
|
||||
return
|
||||
|
||||
@@ -64,6 +64,7 @@ func TestCert(t *testing.T) {
|
||||
cases := []struct {
|
||||
desc string
|
||||
config provision.Config
|
||||
domainID string
|
||||
token string
|
||||
thingID string
|
||||
ttl string
|
||||
@@ -78,6 +79,7 @@ func TestCert(t *testing.T) {
|
||||
{
|
||||
desc: "valid",
|
||||
config: validConfig,
|
||||
domainID: testsutil.GenerateUUID(t),
|
||||
token: validToken,
|
||||
thingID: testsutil.GenerateUUID(t),
|
||||
ttl: "1h",
|
||||
@@ -94,6 +96,7 @@ func TestCert(t *testing.T) {
|
||||
Server: provision.ServiceConf{MgAPIKey: "key"},
|
||||
Cert: provision.Cert{TTL: "1h"},
|
||||
},
|
||||
domainID: testsutil.GenerateUUID(t),
|
||||
token: "",
|
||||
thingID: testsutil.GenerateUUID(t),
|
||||
ttl: "1h",
|
||||
@@ -114,6 +117,7 @@ func TestCert(t *testing.T) {
|
||||
},
|
||||
Cert: provision.Cert{TTL: "1h"},
|
||||
},
|
||||
domainID: testsutil.GenerateUUID(t),
|
||||
token: "",
|
||||
thingID: testsutil.GenerateUUID(t),
|
||||
ttl: "1h",
|
||||
@@ -134,6 +138,7 @@ func TestCert(t *testing.T) {
|
||||
},
|
||||
Cert: provision.Cert{TTL: "1h"},
|
||||
},
|
||||
domainID: testsutil.GenerateUUID(t),
|
||||
token: "",
|
||||
thingID: testsutil.GenerateUUID(t),
|
||||
ttl: "1h",
|
||||
@@ -150,6 +155,7 @@ func TestCert(t *testing.T) {
|
||||
Server: provision.ServiceConf{},
|
||||
Cert: provision.Cert{TTL: "1h"},
|
||||
},
|
||||
domainID: testsutil.GenerateUUID(t),
|
||||
token: "",
|
||||
thingID: testsutil.GenerateUUID(t),
|
||||
ttl: "1h",
|
||||
@@ -163,6 +169,7 @@ func TestCert(t *testing.T) {
|
||||
{
|
||||
desc: "invalid thingID",
|
||||
config: validConfig,
|
||||
domainID: testsutil.GenerateUUID(t),
|
||||
token: "invalid",
|
||||
thingID: testsutil.GenerateUUID(t),
|
||||
ttl: "1h",
|
||||
@@ -176,6 +183,7 @@ func TestCert(t *testing.T) {
|
||||
{
|
||||
desc: "invalid thingID",
|
||||
config: validConfig,
|
||||
domainID: testsutil.GenerateUUID(t),
|
||||
token: validToken,
|
||||
thingID: "invalid",
|
||||
ttl: "1h",
|
||||
@@ -189,6 +197,7 @@ func TestCert(t *testing.T) {
|
||||
{
|
||||
desc: "failed to issue cert",
|
||||
config: validConfig,
|
||||
domainID: testsutil.GenerateUUID(t),
|
||||
token: validToken,
|
||||
thingID: testsutil.GenerateUUID(t),
|
||||
ttl: "1h",
|
||||
@@ -206,16 +215,16 @@ func TestCert(t *testing.T) {
|
||||
mgsdk := new(sdkmocks.SDK)
|
||||
svc := provision.New(c.config, mgsdk, mglog.NewMock())
|
||||
|
||||
mgsdk.On("Thing", c.thingID, mock.Anything).Return(sdk.Thing{ID: c.thingID}, c.sdkThingErr)
|
||||
mgsdk.On("IssueCert", c.thingID, c.config.Cert.TTL, mock.Anything).Return(sdk.Cert{SerialNumber: c.serial}, c.sdkCertErr)
|
||||
mgsdk.On("ViewCert", c.serial, mock.Anything).Return(sdk.Cert{Certificate: c.cert, Key: c.key}, c.sdkCertErr)
|
||||
mgsdk.On("Thing", c.thingID, c.domainID, mock.Anything).Return(sdk.Thing{ID: c.thingID}, c.sdkThingErr)
|
||||
mgsdk.On("IssueCert", c.thingID, c.config.Cert.TTL, c.domainID, mock.Anything).Return(sdk.Cert{SerialNumber: c.serial}, c.sdkCertErr)
|
||||
mgsdk.On("ViewCert", c.serial, mock.Anything, mock.Anything).Return(sdk.Cert{Certificate: c.cert, Key: c.key}, c.sdkCertErr)
|
||||
login := sdk.Login{
|
||||
Identity: c.config.Server.MgUser,
|
||||
Secret: c.config.Server.MgPass,
|
||||
DomainID: c.config.Server.MgDomainID,
|
||||
}
|
||||
mgsdk.On("CreateToken", login).Return(sdk.Token{AccessToken: validToken}, c.sdkTokenErr)
|
||||
cert, key, err := svc.Cert(c.token, c.thingID, c.ttl)
|
||||
cert, key, err := svc.Cert(c.domainID, c.token, c.thingID, c.ttl)
|
||||
assert.Equal(t, c.cert, cert)
|
||||
assert.Equal(t, c.key, key)
|
||||
assert.True(t, errors.Contains(err, c.err), fmt.Sprintf("expected error %v, got %v", c.err, err))
|
||||
|
||||
@@ -6,7 +6,6 @@ package api
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net/http"
|
||||
|
||||
"github.com/absmach/magistrala"
|
||||
@@ -258,7 +257,6 @@ func authorize(ctx context.Context, req listMessagesReq, authz mgauthz.Authoriza
|
||||
if ok && e.Code() == codes.PermissionDenied {
|
||||
return errors.Wrap(errUserAccess, err)
|
||||
}
|
||||
fmt.Println("err", err)
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
|
||||
@@ -28,9 +28,9 @@ func groupsHandler(svc groups.Service, authn mgauthn.Authentication, r *chi.Mux,
|
||||
}
|
||||
|
||||
r.Group(func(r chi.Router) {
|
||||
r.Use(api.AuthenticateMiddleware(authn))
|
||||
r.Use(api.AuthenticateMiddlewareDomain(authn))
|
||||
|
||||
r.Route("/channels", func(r chi.Router) {
|
||||
r.Route("/{domainID}/channels", func(r chi.Router) {
|
||||
r.Post("/", otelhttp.NewHandler(kithttp.NewServer(
|
||||
gapi.CreateGroupEndpoint(svc, policies.NewChannelKind),
|
||||
gapi.DecodeGroupCreate,
|
||||
@@ -143,7 +143,7 @@ func groupsHandler(svc groups.Service, authn mgauthn.Authentication, r *chi.Mux,
|
||||
// SpiceDB provides list of channel ids to which thing id attached
|
||||
// and channel service can access spiceDB and get this channel ids list with given thing id.
|
||||
// Request to get list of channels to which thingID ({memberID}) belongs
|
||||
r.Get("/things/{memberID}/channels", otelhttp.NewHandler(kithttp.NewServer(
|
||||
r.Get("/{domainID}/things/{memberID}/channels", otelhttp.NewHandler(kithttp.NewServer(
|
||||
gapi.ListGroupsEndpoint(svc, "channels", "things"),
|
||||
gapi.DecodeListGroupsRequest,
|
||||
api.EncodeResponse,
|
||||
@@ -155,7 +155,7 @@ func groupsHandler(svc groups.Service, authn mgauthn.Authentication, r *chi.Mux,
|
||||
// SpiceDB provides list of channel ids attached to given user id
|
||||
// and channel service can access spiceDB and get this user ids list with given thing id.
|
||||
// Request to get list of channels to which userID ({memberID}) have permission.
|
||||
r.Get("/users/{memberID}/channels", otelhttp.NewHandler(kithttp.NewServer(
|
||||
r.Get("/{domainID}/users/{memberID}/channels", otelhttp.NewHandler(kithttp.NewServer(
|
||||
gapi.ListGroupsEndpoint(svc, "channels", "users"),
|
||||
gapi.DecodeListGroupsRequest,
|
||||
api.EncodeResponse,
|
||||
@@ -166,7 +166,7 @@ func groupsHandler(svc groups.Service, authn mgauthn.Authentication, r *chi.Mux,
|
||||
// SpiceDB provides list of channel ids attached to given user_group id
|
||||
// and channel service can access spiceDB and get this user ids list with given user_group id.
|
||||
// Request to get list of channels to which user_group_id ({memberID}) attached.
|
||||
r.Get("/groups/{memberID}/channels", otelhttp.NewHandler(kithttp.NewServer(
|
||||
r.Get("/{domainID}/groups/{memberID}/channels", otelhttp.NewHandler(kithttp.NewServer(
|
||||
gapi.ListGroupsEndpoint(svc, "channels", "groups"),
|
||||
gapi.DecodeListGroupsRequest,
|
||||
api.EncodeResponse,
|
||||
@@ -174,7 +174,7 @@ func groupsHandler(svc groups.Service, authn mgauthn.Authentication, r *chi.Mux,
|
||||
), "list_channel_by_user_group_id").ServeHTTP)
|
||||
|
||||
// Connect channel and thing
|
||||
r.Post("/connect", otelhttp.NewHandler(kithttp.NewServer(
|
||||
r.Post("/{domainID}/connect", otelhttp.NewHandler(kithttp.NewServer(
|
||||
connectEndpoint(svc),
|
||||
decodeConnectRequest,
|
||||
api.EncodeResponse,
|
||||
@@ -182,7 +182,7 @@ func groupsHandler(svc groups.Service, authn mgauthn.Authentication, r *chi.Mux,
|
||||
), "connect").ServeHTTP)
|
||||
|
||||
// Disconnect channel and thing
|
||||
r.Post("/disconnect", otelhttp.NewHandler(kithttp.NewServer(
|
||||
r.Post("/{domainID}/disconnect", otelhttp.NewHandler(kithttp.NewServer(
|
||||
disconnectEndpoint(svc),
|
||||
decodeDisconnectRequest,
|
||||
api.EncodeResponse,
|
||||
|
||||
@@ -25,11 +25,10 @@ func clientsHandler(svc things.Service, r *chi.Mux, authn mgauthn.Authentication
|
||||
opts := []kithttp.ServerOption{
|
||||
kithttp.ServerErrorEncoder(apiutil.LoggingErrorEncoder(logger, api.EncodeError)),
|
||||
}
|
||||
|
||||
r.Group(func(r chi.Router) {
|
||||
r.Use(api.AuthenticateMiddleware(authn))
|
||||
r.Use(api.AuthenticateMiddlewareDomain(authn))
|
||||
|
||||
r.Route("/things", func(r chi.Router) {
|
||||
r.Route("/{domainID}/things", func(r chi.Router) {
|
||||
r.Post("/", otelhttp.NewHandler(kithttp.NewServer(
|
||||
createClientEndpoint(svc),
|
||||
decodeCreateClientReq,
|
||||
@@ -127,21 +126,20 @@ func clientsHandler(svc things.Service, r *chi.Mux, authn mgauthn.Authentication
|
||||
// SpiceDB provides list of thing ids present in given channel id
|
||||
// and things service can access spiceDB and get the list of thing ids present in given channel id.
|
||||
// Request to get list of things present in channelID ({groupID}) .
|
||||
r.Get("/channels/{groupID}/things", otelhttp.NewHandler(kithttp.NewServer(
|
||||
r.Get("/{domainID}/channels/{groupID}/things", otelhttp.NewHandler(kithttp.NewServer(
|
||||
listMembersEndpoint(svc),
|
||||
decodeListMembersRequest,
|
||||
api.EncodeResponse,
|
||||
opts...,
|
||||
), "list_things_by_channel_id").ServeHTTP)
|
||||
|
||||
r.Get("/users/{userID}/things", otelhttp.NewHandler(kithttp.NewServer(
|
||||
r.Get("/{domainID}/users/{userID}/things", otelhttp.NewHandler(kithttp.NewServer(
|
||||
listClientsEndpoint(svc),
|
||||
decodeListClients,
|
||||
api.EncodeResponse,
|
||||
opts...,
|
||||
), "list_user_things").ServeHTTP)
|
||||
})
|
||||
|
||||
return r
|
||||
}
|
||||
|
||||
|
||||
+851
-616
File diff suppressed because it is too large
Load Diff
@@ -54,6 +54,7 @@ func (req viewClientReq) validate() error {
|
||||
if req.id == "" {
|
||||
return apiutil.ErrMissingID
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -65,6 +66,7 @@ func (req viewClientPermsReq) validate() error {
|
||||
if req.id == "" {
|
||||
return apiutil.ErrMissingID
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -123,6 +125,7 @@ func (req updateClientReq) validate() error {
|
||||
if req.id == "" {
|
||||
return apiutil.ErrMissingID
|
||||
}
|
||||
|
||||
if len(req.Name) > api.MaxNameSize {
|
||||
return apiutil.ErrNameSize
|
||||
}
|
||||
@@ -152,6 +155,7 @@ func (req updateClientCredentialsReq) validate() error {
|
||||
if req.id == "" {
|
||||
return apiutil.ErrMissingID
|
||||
}
|
||||
|
||||
if req.Secret == "" {
|
||||
return apiutil.ErrMissingSecret
|
||||
}
|
||||
@@ -246,5 +250,6 @@ func (req deleteClientReq) validate() error {
|
||||
if req.id == "" {
|
||||
return apiutil.ErrMissingID
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -60,8 +60,10 @@ func TestCreateThingReqValidate(t *testing.T) {
|
||||
},
|
||||
}
|
||||
for _, tc := range cases {
|
||||
err := tc.req.validate()
|
||||
assert.Equal(t, tc.err, err)
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
err := tc.req.validate()
|
||||
assert.Equal(t, tc.err, err)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -115,9 +117,11 @@ func TestCreateThingsReqValidate(t *testing.T) {
|
||||
err: apiutil.ErrInvalidIDFormat,
|
||||
},
|
||||
}
|
||||
for _, c := range cases {
|
||||
err := c.req.validate()
|
||||
assert.Equal(t, c.err, err, "%s: expected %s got %s\n", c.desc, c.err, err)
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
err := tc.req.validate()
|
||||
assert.Equal(t, tc.err, err, "%s: expected %s got %s\n", tc.desc, tc.err, err)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -142,9 +146,11 @@ func TestViewClientReqValidate(t *testing.T) {
|
||||
err: apiutil.ErrMissingID,
|
||||
},
|
||||
}
|
||||
for _, c := range cases {
|
||||
err := c.req.validate()
|
||||
assert.Equal(t, c.err, err, "%s: expected %s got %s\n", c.desc, c.err, err)
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
err := tc.req.validate()
|
||||
assert.Equal(t, tc.err, err, "%s: expected %s got %s\n", tc.desc, tc.err, err)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -169,9 +175,11 @@ func TestViewClientPermsReq(t *testing.T) {
|
||||
err: apiutil.ErrMissingID,
|
||||
},
|
||||
}
|
||||
for _, c := range cases {
|
||||
err := c.req.validate()
|
||||
assert.Equal(t, c.err, err, "%s: expected %s got %s\n", c.desc, c.err, err)
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
err := tc.req.validate()
|
||||
assert.Equal(t, tc.err, err, "%s: expected %s got %s\n", tc.desc, tc.err, err)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -219,9 +227,11 @@ func TestListClientsReqValidate(t *testing.T) {
|
||||
err: apiutil.ErrNameSize,
|
||||
},
|
||||
}
|
||||
for _, c := range cases {
|
||||
err := c.req.validate()
|
||||
assert.Equal(t, c.err, err, "%s: expected %s got %s\n", c.desc, c.err, err)
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
err := tc.req.validate()
|
||||
assert.Equal(t, tc.err, err, "%s: expected %s got %s\n", tc.desc, tc.err, err)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -246,9 +256,11 @@ func TestListMembersReqValidate(t *testing.T) {
|
||||
err: apiutil.ErrMissingID,
|
||||
},
|
||||
}
|
||||
for _, c := range cases {
|
||||
err := c.req.validate()
|
||||
assert.Equal(t, c.err, err, "%s: expected %s got %s\n", c.desc, c.err, err)
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
err := tc.req.validate()
|
||||
assert.Equal(t, tc.err, err, "%s: expected %s got %s\n", tc.desc, tc.err, err)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -283,9 +295,11 @@ func TestUpdateClientReqValidate(t *testing.T) {
|
||||
err: apiutil.ErrNameSize,
|
||||
},
|
||||
}
|
||||
for _, c := range cases {
|
||||
err := c.req.validate()
|
||||
assert.Equal(t, c.err, err, "%s: expected %s got %s\n", c.desc, c.err, err)
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
err := tc.req.validate()
|
||||
assert.Equal(t, tc.err, err, "%s: expected %s got %s\n", tc.desc, tc.err, err)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -312,9 +326,11 @@ func TestUpdateClientTagsReqValidate(t *testing.T) {
|
||||
err: apiutil.ErrMissingID,
|
||||
},
|
||||
}
|
||||
for _, c := range cases {
|
||||
err := c.req.validate()
|
||||
assert.Equal(t, c.err, err, "%s: expected %s got %s\n", c.desc, c.err, err)
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
err := tc.req.validate()
|
||||
assert.Equal(t, tc.err, err, "%s: expected %s got %s\n", tc.desc, tc.err, err)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -349,9 +365,11 @@ func TestUpdateClientCredentialsReqValidate(t *testing.T) {
|
||||
err: apiutil.ErrMissingSecret,
|
||||
},
|
||||
}
|
||||
for _, c := range cases {
|
||||
err := c.req.validate()
|
||||
assert.Equal(t, c.err, err, "%s: expected %s got %s\n", c.desc, c.err, err)
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
err := tc.req.validate()
|
||||
assert.Equal(t, tc.err, err, "%s: expected %s got %s\n", tc.desc, tc.err, err)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -376,9 +394,11 @@ func TestChangeClientStatusReqValidate(t *testing.T) {
|
||||
err: apiutil.ErrMissingID,
|
||||
},
|
||||
}
|
||||
for _, c := range cases {
|
||||
err := c.req.validate()
|
||||
assert.Equal(t, c.err, err, "%s: expected %s got %s\n", c.desc, c.err, err)
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
err := tc.req.validate()
|
||||
assert.Equal(t, tc.err, err, "%s: expected %s got %s\n", tc.desc, tc.err, err)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -425,9 +445,11 @@ func TestAssignUsersRequestValidate(t *testing.T) {
|
||||
err: apiutil.ErrMissingRelation,
|
||||
},
|
||||
}
|
||||
for _, c := range cases {
|
||||
err := c.req.validate()
|
||||
assert.Equal(t, c.err, err, "%s: expected %s got %s\n", c.desc, c.err, err)
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
err := tc.req.validate()
|
||||
assert.Equal(t, tc.err, err, "%s: expected %s got %s\n", tc.desc, tc.err, err)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -462,9 +484,11 @@ func TestAssignUserGroupsRequestValidate(t *testing.T) {
|
||||
err: apiutil.ErrEmptyList,
|
||||
},
|
||||
}
|
||||
for _, c := range cases {
|
||||
err := c.req.validate()
|
||||
assert.Equal(t, c.err, err, "%s: expected %s got %s\n", c.desc, c.err, err)
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
err := tc.req.validate()
|
||||
assert.Equal(t, tc.err, err, "%s: expected %s got %s\n", tc.desc, tc.err, err)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -499,9 +523,11 @@ func TestConnectChannelThingRequestValidate(t *testing.T) {
|
||||
err: apiutil.ErrMissingID,
|
||||
},
|
||||
}
|
||||
for _, c := range cases {
|
||||
err := c.req.validate()
|
||||
assert.Equal(t, c.err, err, "%s: expected %s got %s\n", c.desc, c.err, err)
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
err := tc.req.validate()
|
||||
assert.Equal(t, tc.err, err, "%s: expected %s got %s\n", tc.desc, tc.err, err)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -548,9 +574,11 @@ func TestThingShareRequestValidate(t *testing.T) {
|
||||
err: apiutil.ErrMalformedPolicy,
|
||||
},
|
||||
}
|
||||
for _, c := range cases {
|
||||
err := c.req.validate()
|
||||
assert.Equal(t, c.err, err, "%s: expected %s got %s\n", c.desc, c.err, err)
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
err := tc.req.validate()
|
||||
assert.Equal(t, tc.err, err, "%s: expected %s got %s\n", tc.desc, tc.err, err)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -575,8 +603,10 @@ func TestDeleteClientReqValidate(t *testing.T) {
|
||||
err: apiutil.ErrMissingID,
|
||||
},
|
||||
}
|
||||
for _, c := range cases {
|
||||
err := c.req.validate()
|
||||
assert.Equal(t, c.err, err, "%s: expected %s got %s\n", c.desc, c.err, err)
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
err := tc.req.validate()
|
||||
assert.Equal(t, tc.err, err, "%s: expected %s got %s\n", tc.desc, tc.err, err)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
+48
-46
@@ -77,7 +77,7 @@ func Test(conf Config) {
|
||||
|
||||
magenta := color.FgLightMagenta.Render
|
||||
|
||||
token, err := createUser(s, conf)
|
||||
domainID, token, err := createUser(s, conf)
|
||||
if err != nil {
|
||||
errExit(fmt.Errorf("unable to create user: %w", err))
|
||||
}
|
||||
@@ -89,38 +89,38 @@ func Test(conf Config) {
|
||||
}
|
||||
color.Success.Printf("created users of ids:\n%s\n", magenta(getIDS(users)))
|
||||
|
||||
groups, err := createGroups(s, conf, token)
|
||||
groups, err := createGroups(s, conf, domainID, token)
|
||||
if err != nil {
|
||||
errExit(fmt.Errorf("unable to create groups: %w", err))
|
||||
}
|
||||
color.Success.Printf("created groups of ids:\n%s\n", magenta(getIDS(groups)))
|
||||
|
||||
things, err := createThings(s, conf, token)
|
||||
things, err := createThings(s, conf, domainID, token)
|
||||
if err != nil {
|
||||
errExit(fmt.Errorf("unable to create things: %w", err))
|
||||
}
|
||||
color.Success.Printf("created things of ids:\n%s\n", magenta(getIDS(things)))
|
||||
|
||||
channels, err := createChannels(s, conf, token)
|
||||
channels, err := createChannels(s, conf, domainID, token)
|
||||
if err != nil {
|
||||
errExit(fmt.Errorf("unable to create channels: %w", err))
|
||||
}
|
||||
color.Success.Printf("created channels of ids:\n%s\n", magenta(getIDS(channels)))
|
||||
|
||||
// List users, groups, things and channels
|
||||
if err := read(s, conf, token, users, groups, things, channels); err != nil {
|
||||
if err := read(s, conf, domainID, token, users, groups, things, channels); err != nil {
|
||||
errExit(fmt.Errorf("unable to read users, groups, things and channels: %w", err))
|
||||
}
|
||||
color.Success.Println("viewed users, groups, things and channels")
|
||||
|
||||
// Update users, groups, things and channels
|
||||
if err := update(s, token, users, groups, things, channels); err != nil {
|
||||
if err := update(s, domainID, token, users, groups, things, channels); err != nil {
|
||||
errExit(fmt.Errorf("unable to update users, groups, things and channels: %w", err))
|
||||
}
|
||||
color.Success.Println("updated users, groups, things and channels")
|
||||
|
||||
// Send messages to channels
|
||||
if err := messaging(s, conf, token, things, channels); err != nil {
|
||||
if err := messaging(s, conf, domainID, token, things, channels); err != nil {
|
||||
errExit(fmt.Errorf("unable to send messages to channels: %w", err))
|
||||
}
|
||||
color.Success.Println("sent messages to channels")
|
||||
@@ -131,7 +131,7 @@ func errExit(err error) {
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
func createUser(s sdk.SDK, conf Config) (string, error) {
|
||||
func createUser(s sdk.SDK, conf Config) (string, string, error) {
|
||||
user := sdk.User{
|
||||
Name: fmt.Sprintf("%s%s", conf.Prefix, namesgenerator.Generate()),
|
||||
Credentials: sdk.Credentials{
|
||||
@@ -143,7 +143,7 @@ func createUser(s sdk.SDK, conf Config) (string, error) {
|
||||
}
|
||||
|
||||
if _, err := s.CreateUser(user, ""); err != nil {
|
||||
return "", fmt.Errorf("unable to create user: %w", err)
|
||||
return "", "", fmt.Errorf("unable to create user: %w", err)
|
||||
}
|
||||
|
||||
login := sdk.Login{
|
||||
@@ -152,7 +152,7 @@ func createUser(s sdk.SDK, conf Config) (string, error) {
|
||||
}
|
||||
token, err := s.CreateToken(login)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("unable to login user: %w", err)
|
||||
return "", "", fmt.Errorf("unable to login user: %w", err)
|
||||
}
|
||||
|
||||
dname := fmt.Sprintf("%s%s", conf.Prefix, namesgenerator.Generate())
|
||||
@@ -164,7 +164,7 @@ func createUser(s sdk.SDK, conf Config) (string, error) {
|
||||
|
||||
domain, err = s.CreateDomain(domain, token.AccessToken)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("unable to create domain: %w", err)
|
||||
return "", "", fmt.Errorf("unable to create domain: %w", err)
|
||||
}
|
||||
|
||||
login = sdk.Login{
|
||||
@@ -174,10 +174,10 @@ func createUser(s sdk.SDK, conf Config) (string, error) {
|
||||
}
|
||||
token, err = s.CreateToken(login)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("unable to login user: %w", err)
|
||||
return "", "", fmt.Errorf("unable to login user: %w", err)
|
||||
}
|
||||
|
||||
return token.AccessToken, nil
|
||||
return domain.ID, token.AccessToken, nil
|
||||
}
|
||||
|
||||
func createUsers(s sdk.SDK, conf Config, token string) ([]sdk.User, error) {
|
||||
@@ -204,7 +204,7 @@ func createUsers(s sdk.SDK, conf Config, token string) ([]sdk.User, error) {
|
||||
return users, nil
|
||||
}
|
||||
|
||||
func createGroups(s sdk.SDK, conf Config, token string) ([]sdk.Group, error) {
|
||||
func createGroups(s sdk.SDK, conf Config, domainID, token string) ([]sdk.Group, error) {
|
||||
var err error
|
||||
groups := []sdk.Group{}
|
||||
|
||||
@@ -214,7 +214,7 @@ func createGroups(s sdk.SDK, conf Config, token string) ([]sdk.Group, error) {
|
||||
Status: sdk.EnabledStatus,
|
||||
}
|
||||
|
||||
group, err = s.CreateGroup(group, token)
|
||||
group, err = s.CreateGroup(group, domainID, token)
|
||||
if err != nil {
|
||||
return []sdk.Group{}, fmt.Errorf("failed to create the group: %w", err)
|
||||
}
|
||||
@@ -224,7 +224,7 @@ func createGroups(s sdk.SDK, conf Config, token string) ([]sdk.Group, error) {
|
||||
return groups, nil
|
||||
}
|
||||
|
||||
func createThingsInBatch(s sdk.SDK, conf Config, token string, num uint64) ([]sdk.Thing, error) {
|
||||
func createThingsInBatch(s sdk.SDK, conf Config, domainID, token string, num uint64) ([]sdk.Thing, error) {
|
||||
var err error
|
||||
things := make([]sdk.Thing, num)
|
||||
|
||||
@@ -234,7 +234,7 @@ func createThingsInBatch(s sdk.SDK, conf Config, token string, num uint64) ([]sd
|
||||
}
|
||||
}
|
||||
|
||||
things, err = s.CreateThings(things, token)
|
||||
things, err = s.CreateThings(things, domainID, token)
|
||||
if err != nil {
|
||||
return []sdk.Thing{}, fmt.Errorf("failed to create the things: %w", err)
|
||||
}
|
||||
@@ -242,25 +242,25 @@ func createThingsInBatch(s sdk.SDK, conf Config, token string, num uint64) ([]sd
|
||||
return things, nil
|
||||
}
|
||||
|
||||
func createThings(s sdk.SDK, conf Config, token string) ([]sdk.Thing, error) {
|
||||
func createThings(s sdk.SDK, conf Config, domainID, token string) ([]sdk.Thing, error) {
|
||||
things := []sdk.Thing{}
|
||||
|
||||
if conf.Num > batchSize {
|
||||
batches := int(conf.Num) / batchSize
|
||||
for i := 0; i < batches; i++ {
|
||||
ths, err := createThingsInBatch(s, conf, token, batchSize)
|
||||
ths, err := createThingsInBatch(s, conf, domainID, token, batchSize)
|
||||
if err != nil {
|
||||
return []sdk.Thing{}, fmt.Errorf("Failed to create the things: %w", err)
|
||||
}
|
||||
things = append(things, ths...)
|
||||
}
|
||||
ths, err := createThingsInBatch(s, conf, token, conf.Num%uint64(batchSize))
|
||||
ths, err := createThingsInBatch(s, conf, domainID, token, conf.Num%uint64(batchSize))
|
||||
if err != nil {
|
||||
return []sdk.Thing{}, fmt.Errorf("Failed to create the things: %w", err)
|
||||
}
|
||||
things = append(things, ths...)
|
||||
} else {
|
||||
ths, err := createThingsInBatch(s, conf, token, conf.Num)
|
||||
ths, err := createThingsInBatch(s, conf, domainID, token, conf.Num)
|
||||
if err != nil {
|
||||
return []sdk.Thing{}, fmt.Errorf("Failed to create the things: %w", err)
|
||||
}
|
||||
@@ -270,7 +270,7 @@ func createThings(s sdk.SDK, conf Config, token string) ([]sdk.Thing, error) {
|
||||
return things, nil
|
||||
}
|
||||
|
||||
func createChannelsInBatch(s sdk.SDK, conf Config, token string, num uint64) ([]sdk.Channel, error) {
|
||||
func createChannelsInBatch(s sdk.SDK, conf Config, domainID, token string, num uint64) ([]sdk.Channel, error) {
|
||||
var err error
|
||||
channels := make([]sdk.Channel, num)
|
||||
|
||||
@@ -278,7 +278,7 @@ func createChannelsInBatch(s sdk.SDK, conf Config, token string, num uint64) ([]
|
||||
channels[i] = sdk.Channel{
|
||||
Name: fmt.Sprintf("%s%s", conf.Prefix, namesgenerator.Generate()),
|
||||
}
|
||||
channels[i], err = s.CreateChannel(channels[i], token)
|
||||
channels[i], err = s.CreateChannel(channels[i], domainID, token)
|
||||
if err != nil {
|
||||
return []sdk.Channel{}, fmt.Errorf("failed to create the channels: %w", err)
|
||||
}
|
||||
@@ -287,25 +287,25 @@ func createChannelsInBatch(s sdk.SDK, conf Config, token string, num uint64) ([]
|
||||
return channels, nil
|
||||
}
|
||||
|
||||
func createChannels(s sdk.SDK, conf Config, token string) ([]sdk.Channel, error) {
|
||||
func createChannels(s sdk.SDK, conf Config, domainID, token string) ([]sdk.Channel, error) {
|
||||
channels := []sdk.Channel{}
|
||||
|
||||
if conf.Num > batchSize {
|
||||
batches := int(conf.Num) / batchSize
|
||||
for i := 0; i < batches; i++ {
|
||||
chs, err := createChannelsInBatch(s, conf, token, batchSize)
|
||||
chs, err := createChannelsInBatch(s, conf, token, domainID, batchSize)
|
||||
if err != nil {
|
||||
return []sdk.Channel{}, fmt.Errorf("Failed to create the channels: %w", err)
|
||||
}
|
||||
channels = append(channels, chs...)
|
||||
}
|
||||
chs, err := createChannelsInBatch(s, conf, token, conf.Num%uint64(batchSize))
|
||||
chs, err := createChannelsInBatch(s, conf, domainID, token, conf.Num%uint64(batchSize))
|
||||
if err != nil {
|
||||
return []sdk.Channel{}, fmt.Errorf("Failed to create the channels: %w", err)
|
||||
}
|
||||
channels = append(channels, chs...)
|
||||
} else {
|
||||
chs, err := createChannelsInBatch(s, conf, token, conf.Num)
|
||||
chs, err := createChannelsInBatch(s, conf, domainID, token, conf.Num)
|
||||
if err != nil {
|
||||
return []sdk.Channel{}, fmt.Errorf("Failed to create the channels: %w", err)
|
||||
}
|
||||
@@ -315,7 +315,7 @@ func createChannels(s sdk.SDK, conf Config, token string) ([]sdk.Channel, error)
|
||||
return channels, nil
|
||||
}
|
||||
|
||||
func read(s sdk.SDK, conf Config, token string, users []sdk.User, groups []sdk.Group, things []sdk.Thing, channels []sdk.Channel) error {
|
||||
func read(s sdk.SDK, conf Config, domainID, token string, users []sdk.User, groups []sdk.Group, things []sdk.Thing, channels []sdk.Channel) error {
|
||||
for _, user := range users {
|
||||
if _, err := s.User(user.ID, token); err != nil {
|
||||
return fmt.Errorf("failed to get user %w", err)
|
||||
@@ -329,7 +329,7 @@ func read(s sdk.SDK, conf Config, token string, users []sdk.User, groups []sdk.G
|
||||
return fmt.Errorf("returned users %d less than created users %d", up.Total, conf.Num)
|
||||
}
|
||||
for _, group := range groups {
|
||||
if _, err := s.Group(group.ID, token); err != nil {
|
||||
if _, err := s.Group(group.ID, domainID, token); err != nil {
|
||||
return fmt.Errorf("failed to get group %w", err)
|
||||
}
|
||||
}
|
||||
@@ -341,7 +341,7 @@ func read(s sdk.SDK, conf Config, token string, users []sdk.User, groups []sdk.G
|
||||
return fmt.Errorf("returned groups %d less than created groups %d", gp.Total, conf.Num)
|
||||
}
|
||||
for _, thing := range things {
|
||||
if _, err := s.Thing(thing.ID, token); err != nil {
|
||||
if _, err := s.Thing(thing.ID, domainID, token); err != nil {
|
||||
return fmt.Errorf("failed to get thing %w", err)
|
||||
}
|
||||
}
|
||||
@@ -353,11 +353,13 @@ func read(s sdk.SDK, conf Config, token string, users []sdk.User, groups []sdk.G
|
||||
return fmt.Errorf("returned things %d less than created things %d", tp.Total, conf.Num)
|
||||
}
|
||||
for _, channel := range channels {
|
||||
if _, err := s.Channel(channel.ID, token); err != nil {
|
||||
if _, err := s.Channel(channel.ID, domainID, token); err != nil {
|
||||
return fmt.Errorf("failed to get channel %w", err)
|
||||
}
|
||||
}
|
||||
cp, err := s.Channels(sdk.PageMetadata{}, token)
|
||||
cp, err := s.Channels(sdk.PageMetadata{
|
||||
DomainID: domainID,
|
||||
}, token)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to get channels %w", err)
|
||||
}
|
||||
@@ -368,7 +370,7 @@ func read(s sdk.SDK, conf Config, token string, users []sdk.User, groups []sdk.G
|
||||
return nil
|
||||
}
|
||||
|
||||
func update(s sdk.SDK, token string, users []sdk.User, groups []sdk.Group, things []sdk.Thing, channels []sdk.Channel) error {
|
||||
func update(s sdk.SDK, domainID, token string, users []sdk.User, groups []sdk.Group, things []sdk.Thing, channels []sdk.Channel) error {
|
||||
for _, user := range users {
|
||||
user.Name = namesgenerator.Generate()
|
||||
user.Metadata = sdk.Metadata{"Update": namesgenerator.Generate()}
|
||||
@@ -420,7 +422,7 @@ func update(s sdk.SDK, token string, users []sdk.User, groups []sdk.Group, thing
|
||||
for _, group := range groups {
|
||||
group.Name = namesgenerator.Generate()
|
||||
group.Metadata = sdk.Metadata{"Update": namesgenerator.Generate()}
|
||||
rGroup, err := s.UpdateGroup(group, token)
|
||||
rGroup, err := s.UpdateGroup(group, domainID, token)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to update group %w", err)
|
||||
}
|
||||
@@ -431,7 +433,7 @@ func update(s sdk.SDK, token string, users []sdk.User, groups []sdk.Group, thing
|
||||
return fmt.Errorf("failed to update group metadata before %s after %s", group.Metadata["Update"], rGroup.Metadata["Update"])
|
||||
}
|
||||
group = rGroup
|
||||
rGroup, err = s.DisableGroup(group.ID, token)
|
||||
rGroup, err = s.DisableGroup(group.ID, domainID, token)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to disable group %w", err)
|
||||
}
|
||||
@@ -439,7 +441,7 @@ func update(s sdk.SDK, token string, users []sdk.User, groups []sdk.Group, thing
|
||||
return fmt.Errorf("failed to disable group before %s after %s", group.Status, rGroup.Status)
|
||||
}
|
||||
group = rGroup
|
||||
rGroup, err = s.EnableGroup(group.ID, token)
|
||||
rGroup, err = s.EnableGroup(group.ID, domainID, token)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to enable group %w", err)
|
||||
}
|
||||
@@ -450,7 +452,7 @@ func update(s sdk.SDK, token string, users []sdk.User, groups []sdk.Group, thing
|
||||
for _, thing := range things {
|
||||
thing.Name = namesgenerator.Generate()
|
||||
thing.Metadata = sdk.Metadata{"Update": namesgenerator.Generate()}
|
||||
rThing, err := s.UpdateThing(thing, token)
|
||||
rThing, err := s.UpdateThing(thing, domainID, token)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to update thing %w", err)
|
||||
}
|
||||
@@ -461,13 +463,13 @@ func update(s sdk.SDK, token string, users []sdk.User, groups []sdk.Group, thing
|
||||
return fmt.Errorf("failed to update thing metadata before %s after %s", thing.Metadata["Update"], rThing.Metadata["Update"])
|
||||
}
|
||||
thing = rThing
|
||||
rThing, err = s.UpdateThingSecret(thing.ID, thing.Credentials.Secret, token)
|
||||
rThing, err = s.UpdateThingSecret(thing.ID, thing.Credentials.Secret, domainID, token)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to update thing secret %w", err)
|
||||
}
|
||||
thing = rThing
|
||||
thing.Tags = []string{namesgenerator.Generate()}
|
||||
rThing, err = s.UpdateThingTags(thing, token)
|
||||
rThing, err = s.UpdateThingTags(thing, domainID, token)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to update thing tags %w", err)
|
||||
}
|
||||
@@ -475,7 +477,7 @@ func update(s sdk.SDK, token string, users []sdk.User, groups []sdk.Group, thing
|
||||
return fmt.Errorf("failed to update thing tags before %s after %s", thing.Tags[0], rThing.Tags[0])
|
||||
}
|
||||
thing = rThing
|
||||
rThing, err = s.DisableThing(thing.ID, token)
|
||||
rThing, err = s.DisableThing(thing.ID, domainID, token)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to disable thing %w", err)
|
||||
}
|
||||
@@ -483,7 +485,7 @@ func update(s sdk.SDK, token string, users []sdk.User, groups []sdk.Group, thing
|
||||
return fmt.Errorf("failed to disable thing before %s after %s", thing.Status, rThing.Status)
|
||||
}
|
||||
thing = rThing
|
||||
rThing, err = s.EnableThing(thing.ID, token)
|
||||
rThing, err = s.EnableThing(thing.ID, domainID, token)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to enable thing %w", err)
|
||||
}
|
||||
@@ -494,7 +496,7 @@ func update(s sdk.SDK, token string, users []sdk.User, groups []sdk.Group, thing
|
||||
for _, channel := range channels {
|
||||
channel.Name = namesgenerator.Generate()
|
||||
channel.Metadata = sdk.Metadata{"Update": namesgenerator.Generate()}
|
||||
rChannel, err := s.UpdateChannel(channel, token)
|
||||
rChannel, err := s.UpdateChannel(channel, domainID, token)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to update channel %w", err)
|
||||
}
|
||||
@@ -505,7 +507,7 @@ func update(s sdk.SDK, token string, users []sdk.User, groups []sdk.Group, thing
|
||||
return fmt.Errorf("failed to update channel metadata before %s after %s", channel.Metadata["Update"], rChannel.Metadata["Update"])
|
||||
}
|
||||
channel = rChannel
|
||||
rChannel, err = s.DisableChannel(channel.ID, token)
|
||||
rChannel, err = s.DisableChannel(channel.ID, domainID, token)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to disable channel %w", err)
|
||||
}
|
||||
@@ -513,7 +515,7 @@ func update(s sdk.SDK, token string, users []sdk.User, groups []sdk.Group, thing
|
||||
return fmt.Errorf("failed to disable channel before %s after %s", channel.Status, rChannel.Status)
|
||||
}
|
||||
channel = rChannel
|
||||
rChannel, err = s.EnableChannel(channel.ID, token)
|
||||
rChannel, err = s.EnableChannel(channel.ID, domainID, token)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to enable channel %w", err)
|
||||
}
|
||||
@@ -525,14 +527,14 @@ func update(s sdk.SDK, token string, users []sdk.User, groups []sdk.Group, thing
|
||||
return nil
|
||||
}
|
||||
|
||||
func messaging(s sdk.SDK, conf Config, token string, things []sdk.Thing, channels []sdk.Channel) error {
|
||||
func messaging(s sdk.SDK, conf Config, domainID, token string, things []sdk.Thing, channels []sdk.Channel) error {
|
||||
for _, thing := range things {
|
||||
for _, channel := range channels {
|
||||
conn := sdk.Connection{
|
||||
ThingID: thing.ID,
|
||||
ChannelID: channel.ID,
|
||||
}
|
||||
if err := s.Connect(conn, token); err != nil {
|
||||
if err := s.Connect(conn, domainID, token); err != nil {
|
||||
return fmt.Errorf("failed to connect thing %s to channel %s", thing.ID, channel.ID)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@ import (
|
||||
"log"
|
||||
"math/big"
|
||||
"os"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/0x6flab/namegenerator"
|
||||
@@ -97,6 +98,28 @@ func Provision(conf Config) error {
|
||||
return fmt.Errorf("unable to login user: %s", err.Error())
|
||||
}
|
||||
|
||||
// Create new domain
|
||||
dname := fmt.Sprintf("%s%s", conf.Prefix, namesgenerator.Generate())
|
||||
domain := sdk.Domain{
|
||||
Name: dname,
|
||||
Alias: strings.ToLower(dname),
|
||||
Permission: "admin",
|
||||
}
|
||||
|
||||
domain, err = s.CreateDomain(domain, token.AccessToken)
|
||||
if err != nil {
|
||||
return fmt.Errorf("unable to create domain: %w", err)
|
||||
}
|
||||
// Login to domain
|
||||
token, err = s.CreateToken(sdk.Login{
|
||||
Identity: user.Credentials.Identity,
|
||||
Secret: user.Credentials.Secret,
|
||||
DomainID: domain.ID,
|
||||
})
|
||||
if err != nil {
|
||||
return fmt.Errorf("unable to login user: %w", err)
|
||||
}
|
||||
|
||||
var tlsCert tls.Certificate
|
||||
var caCert *x509.Certificate
|
||||
|
||||
@@ -135,14 +158,14 @@ func Provision(conf Config) error {
|
||||
channels[i] = sdk.Channel{Name: fmt.Sprintf("%s-channel-%d", conf.Prefix, i)}
|
||||
}
|
||||
|
||||
things, err = s.CreateThings(things, token.AccessToken)
|
||||
things, err = s.CreateThings(things, domain.ID, token.AccessToken)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to create the things: %s", err.Error())
|
||||
}
|
||||
|
||||
var chs []sdk.Channel
|
||||
for _, c := range channels {
|
||||
c, err = s.CreateChannel(c, token.AccessToken)
|
||||
c, err = s.CreateChannel(c, domain.ID, token.AccessToken)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to create the chennels: %s", err.Error())
|
||||
}
|
||||
@@ -237,7 +260,7 @@ func Provision(conf Config) error {
|
||||
ThingID: tID,
|
||||
ChannelID: cID,
|
||||
}
|
||||
if err := s.Connect(conIDs, token.AccessToken); err != nil {
|
||||
if err := s.Connect(conIDs, domain.ID, token.AccessToken); err != nil {
|
||||
log.Fatalf("Failed to connect things %s to channels %s: %s", tID, cID, err)
|
||||
}
|
||||
}
|
||||
|
||||
+11
-4
@@ -120,6 +120,13 @@ func clientsHandler(svc users.Service, authn mgauthn.Authentication, tokenClient
|
||||
opts...,
|
||||
), "update_client_role").ServeHTTP)
|
||||
|
||||
r.Patch("/{id}/role", otelhttp.NewHandler(kithttp.NewServer(
|
||||
updateClientRoleEndpoint(svc),
|
||||
decodeUpdateClientRole,
|
||||
api.EncodeResponse,
|
||||
opts...,
|
||||
), "update_client_role").ServeHTTP)
|
||||
|
||||
r.Post("/{id}/enable", otelhttp.NewHandler(kithttp.NewServer(
|
||||
enableClientEndpoint(svc),
|
||||
decodeChangeClientStatus,
|
||||
@@ -164,7 +171,7 @@ func clientsHandler(svc users.Service, authn mgauthn.Authentication, tokenClient
|
||||
// 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("/groups/{groupID}/users", otelhttp.NewHandler(kithttp.NewServer(
|
||||
r.Get("/{domainID}/groups/{groupID}/users", otelhttp.NewHandler(kithttp.NewServer(
|
||||
listMembersByGroupEndpoint(svc),
|
||||
decodeListMembersByGroup,
|
||||
api.EncodeResponse,
|
||||
@@ -176,21 +183,21 @@ func clientsHandler(svc users.Service, authn mgauthn.Authentication, tokenClient
|
||||
// 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("/channels/{channelID}/users", otelhttp.NewHandler(kithttp.NewServer(
|
||||
r.Get("/{domainID}/channels/{channelID}/users", otelhttp.NewHandler(kithttp.NewServer(
|
||||
listMembersByChannelEndpoint(svc),
|
||||
decodeListMembersByChannel,
|
||||
api.EncodeResponse,
|
||||
opts...,
|
||||
), "list_users_by_channel_id").ServeHTTP)
|
||||
|
||||
r.Get("/things/{thingID}/users", otelhttp.NewHandler(kithttp.NewServer(
|
||||
r.Get("/{domainID}/things/{thingID}/users", otelhttp.NewHandler(kithttp.NewServer(
|
||||
listMembersByThingEndpoint(svc),
|
||||
decodeListMembersByThing,
|
||||
api.EncodeResponse,
|
||||
opts...,
|
||||
), "list_users_by_thing_id").ServeHTTP)
|
||||
|
||||
r.Get("/domains/{domainID}/users", otelhttp.NewHandler(kithttp.NewServer(
|
||||
r.Get("/{domainID}/users", otelhttp.NewHandler(kithttp.NewServer(
|
||||
listMembersByDomainEndpoint(svc),
|
||||
decodeListMembersByDomain,
|
||||
api.EncodeResponse,
|
||||
|
||||
+744
-662
File diff suppressed because it is too large
Load Diff
+8
-6
@@ -31,9 +31,9 @@ func groupsHandler(svc groups.Service, authn mgauthn.Authentication, r *chi.Mux,
|
||||
}
|
||||
|
||||
r.Group(func(r chi.Router) {
|
||||
r.Use(api.AuthenticateMiddleware(authn))
|
||||
r.Use(api.AuthenticateMiddlewareDomain(authn))
|
||||
|
||||
r.Route("/groups", func(r chi.Router) {
|
||||
r.Route("/{domainID}/groups", func(r chi.Router) {
|
||||
r.Post("/", otelhttp.NewHandler(kithttp.NewServer(
|
||||
gapi.CreateGroupEndpoint(svc, policies.NewGroupKind),
|
||||
gapi.DecodeGroupCreate,
|
||||
@@ -135,14 +135,14 @@ func groupsHandler(svc groups.Service, authn mgauthn.Authentication, r *chi.Mux,
|
||||
|
||||
// The ideal placeholder name should be {channelID}, but gapi.DecodeListGroupsRequest uses {memberID} as a placeholder for the ID.
|
||||
// So here, we are using {memberID} as the placeholder.
|
||||
r.Get("/channels/{memberID}/groups", otelhttp.NewHandler(kithttp.NewServer(
|
||||
r.Get("/{domainID}/channels/{memberID}/groups", otelhttp.NewHandler(kithttp.NewServer(
|
||||
gapi.ListGroupsEndpoint(svc, "groups", "channels"),
|
||||
gapi.DecodeListGroupsRequest,
|
||||
api.EncodeResponse,
|
||||
opts...,
|
||||
), "list_groups_by_channel_id").ServeHTTP)
|
||||
|
||||
r.Get("/users/{memberID}/groups", otelhttp.NewHandler(kithttp.NewServer(
|
||||
r.Get("/{domainID}/users/{memberID}/groups", otelhttp.NewHandler(kithttp.NewServer(
|
||||
gapi.ListGroupsEndpoint(svc, "groups", "users"),
|
||||
gapi.DecodeListGroupsRequest,
|
||||
api.EncodeResponse,
|
||||
@@ -212,7 +212,8 @@ func unassignUsersEndpoint(svc groups.Service) endpoint.Endpoint {
|
||||
|
||||
func decodeAssignGroupsRequest(_ context.Context, r *http.Request) (interface{}, error) {
|
||||
req := assignGroupsReq{
|
||||
groupID: chi.URLParam(r, "groupID"),
|
||||
groupID: chi.URLParam(r, "groupID"),
|
||||
domainID: chi.URLParam(r, "domainID"),
|
||||
}
|
||||
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
|
||||
return nil, errors.Wrap(apiutil.ErrValidation, errors.Wrap(err, errors.ErrMalformedEntity))
|
||||
@@ -222,7 +223,8 @@ func decodeAssignGroupsRequest(_ context.Context, r *http.Request) (interface{},
|
||||
|
||||
func decodeUnassignGroupsRequest(_ context.Context, r *http.Request) (interface{}, error) {
|
||||
req := unassignGroupsReq{
|
||||
groupID: chi.URLParam(r, "groupID"),
|
||||
groupID: chi.URLParam(r, "groupID"),
|
||||
domainID: chi.URLParam(r, "domainID"),
|
||||
}
|
||||
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
|
||||
return nil, errors.Wrap(apiutil.ErrValidation, errors.Wrap(err, errors.ErrMalformedEntity))
|
||||
|
||||
@@ -298,10 +298,15 @@ func (req unassignUsersReq) validate() error {
|
||||
|
||||
type assignGroupsReq struct {
|
||||
groupID string
|
||||
domainID string
|
||||
GroupIDs []string `json:"group_ids"`
|
||||
}
|
||||
|
||||
func (req assignGroupsReq) validate() error {
|
||||
if req.domainID == "" {
|
||||
return apiutil.ErrMissingDomainID
|
||||
}
|
||||
|
||||
if req.groupID == "" {
|
||||
return apiutil.ErrMissingID
|
||||
}
|
||||
@@ -315,10 +320,15 @@ func (req assignGroupsReq) validate() error {
|
||||
|
||||
type unassignGroupsReq struct {
|
||||
groupID string
|
||||
domainID string
|
||||
GroupIDs []string `json:"group_ids"`
|
||||
}
|
||||
|
||||
func (req unassignGroupsReq) validate() error {
|
||||
if req.domainID == "" {
|
||||
return apiutil.ErrMissingDomainID
|
||||
}
|
||||
|
||||
if req.groupID == "" {
|
||||
return apiutil.ErrMissingID
|
||||
}
|
||||
|
||||
@@ -21,7 +21,10 @@ const (
|
||||
name = "client"
|
||||
)
|
||||
|
||||
var validID = testsutil.GenerateUUID(&testing.T{})
|
||||
var (
|
||||
validID = testsutil.GenerateUUID(&testing.T{})
|
||||
domain = testsutil.GenerateUUID(&testing.T{})
|
||||
)
|
||||
|
||||
func TestCreateClientReqValidate(t *testing.T) {
|
||||
cases := []struct {
|
||||
@@ -685,6 +688,7 @@ func TestAssignGroupsRequestValidate(t *testing.T) {
|
||||
{
|
||||
desc: "valid request",
|
||||
req: assignGroupsReq{
|
||||
domainID: domain,
|
||||
groupID: validID,
|
||||
GroupIDs: []string{validID},
|
||||
},
|
||||
@@ -693,6 +697,7 @@ func TestAssignGroupsRequestValidate(t *testing.T) {
|
||||
{
|
||||
desc: "empty group id",
|
||||
req: assignGroupsReq{
|
||||
domainID: domain,
|
||||
groupID: "",
|
||||
GroupIDs: []string{validID},
|
||||
},
|
||||
@@ -701,11 +706,21 @@ func TestAssignGroupsRequestValidate(t *testing.T) {
|
||||
{
|
||||
desc: "empty user group ids",
|
||||
req: assignGroupsReq{
|
||||
domainID: domain,
|
||||
groupID: validID,
|
||||
GroupIDs: []string{},
|
||||
},
|
||||
err: apiutil.ErrEmptyList,
|
||||
},
|
||||
{
|
||||
desc: "empty domain id",
|
||||
req: assignGroupsReq{
|
||||
domainID: "",
|
||||
groupID: validID,
|
||||
GroupIDs: []string{validID},
|
||||
},
|
||||
err: apiutil.ErrMissingDomainID,
|
||||
},
|
||||
}
|
||||
for _, c := range cases {
|
||||
err := c.req.validate()
|
||||
@@ -722,6 +737,7 @@ func TestUnassignGroupsRequestValidate(t *testing.T) {
|
||||
{
|
||||
desc: "valid request",
|
||||
req: unassignGroupsReq{
|
||||
domainID: domain,
|
||||
groupID: validID,
|
||||
GroupIDs: []string{validID},
|
||||
},
|
||||
@@ -730,6 +746,7 @@ func TestUnassignGroupsRequestValidate(t *testing.T) {
|
||||
{
|
||||
desc: "empty group id",
|
||||
req: unassignGroupsReq{
|
||||
domainID: domain,
|
||||
groupID: "",
|
||||
GroupIDs: []string{validID},
|
||||
},
|
||||
@@ -738,11 +755,21 @@ func TestUnassignGroupsRequestValidate(t *testing.T) {
|
||||
{
|
||||
desc: "empty user group ids",
|
||||
req: unassignGroupsReq{
|
||||
domainID: domain,
|
||||
groupID: validID,
|
||||
GroupIDs: []string{},
|
||||
},
|
||||
err: apiutil.ErrEmptyList,
|
||||
},
|
||||
{
|
||||
desc: "empty domain id",
|
||||
req: unassignGroupsReq{
|
||||
domainID: "",
|
||||
groupID: validID,
|
||||
GroupIDs: []string{valid},
|
||||
},
|
||||
err: apiutil.ErrMissingDomainID,
|
||||
},
|
||||
}
|
||||
for _, c := range cases {
|
||||
err := c.req.validate()
|
||||
|
||||
Reference in New Issue
Block a user