Allthings Node/Javascript SDK
Contents
- Installation & Usage
- Configuration
- Options
- Authentication
- API
- OAuth Implicit Grant Example
- OAuth Authorization Code Grant Example
- Release management & versioning
Installation & Usage
yarn add @allthings/sdk
const allthings = require('@allthings/sdk')
const client = allthings.restClient({
accessToken: '043dab7447450772example1214b552838003522',
})
client
.getCurrentUser()
.then(viewer => console.log(`Welcome back ${viewer.username}!`))
Configuration
Configuration Options
The available configuration options are outlined here:
Option | Default | Description |
---|
accessToken | | API Access Token |
clientId | | OAuth 2.0 clientId |
clientSecret | | OAuth 2.0 client secret |
username | | Username to use with OAuth 2.0 Password Grant authentication flow |
password | | Password to use with OAuth 2.0 Password Grant authentication flow |
concurrency | | Number of concurrent requests to perform in parallel. Default behavior is burst of 30/s, 1/s thereafter |
apiUrl | | Base API url to use. Defaults to https://api.allthings.me/, respects value of the ALLTHINGS_REST_API_URL environment variable |
Authentication
@TODO
process.env.ALLTHINGS_OAUTH_CLIENT_ID
process.env.ALLTHINGS_OAUTH_CLIENT_SECRET,
process.env.ALLTHINGS_OAUTH_PASSWORD,
process.env.ALLTHINGS_OAUTH_USERNAME,
OAuth Implicit Grant Example
@TODO
const allthings = require('@allthings/sdk')
const client = allthings.restClient({
accessToken: '043dab7447450772example1214b552838003522',
})
client
.getCurrentUser()
.then(viewer => console.log(`Welcome back ${viewer.username}!`))
OAuth Authorization Code Grant Example
- Initialize instance of
client
:
const allthings = require('@allthings/sdk')
const client = allthings.restClient({
clientId: '5d038ef2441f4de574005c54_example',
clientSecret: '40f63f981ff082dbc8d273983ac3852c2e51e90856123156',
redirectUri: 'https://example-app.com/callback',
})
- Construct a URI to send authorization request to using a
state
which should be unique per request and hard to guess. It can be generated with client.oauth.generateState()
method:
const state = client.oauth.generateState()
const authorizationUri = client.oauth.authorizationCode.getUri(state)
-
Direct user's browser to the constructed URI.
-
When user completes authentication process, he is redirected to the redirectUri
having code
and state
query string arguments, e.g.:
https://example-app.com/callback?code=ebc110bee11b2829&state=k1bt3c1d0vnfu7qk
At this point state
must be validated - if it doesn't match the one generated on step 2, such request is probably malicious and should be aborted.
- Use the code extracted from query parameters on the previous step to obtain an access token:
await client.oauth.authorizationCode.requestToken(code)
- Client is ready to make API requests:
const user = await client.getCurrentUser()
API
Allthings SDK module
restClient(configurationOptions?): Client
Create an client instance of the SDK.
const allthings = require('@allthings/sdk')
const client = allthings.restClient(configurationOptions)
client.createAgent()
Create a new agent. This is a convenience function around creating a user and adding that user to a property-manager's team.
const appId = '575027e58178f56a008b4568'
const propertyManagerId = '5a818c07ef5f2f00441146a2'
const username = 'mr.example@allthings.test'
const agent = await client.createAgent(appId, propertyManagerId, username, {
email: 'mr.example@allthings.test',
locale: 'en_US',
})
export type MethodCreateAgent = (
appId: string,
propertyManagerId: string,
username: string,
data: PartialUser & {
readonly email: string
readonly locale: EnumLocale
},
) => UserResult
export interface IAllthingsRestClient {
readonly delete: MethodHttpDelete
readonly get: MethodHttpGet
readonly post: MethodHttpPost
readonly patch: MethodHttpPatch
readonly agentCreate: MethodAgentCreate
readonly agentCreatePermissions: MethodAgentCreatePermissions
readonly appCreate: MethodAppCreate
readonly lookupIds: MethodLookupIds
readonly groupCreate: MethodGroupCreate
readonly groupGetById: MethodGroupGetById
readonly groupUpdateById: MethodGroupUpdateById
readonly notificationsGetByUser: MethodNotificationsGetByUser
readonly notificationsUpdateReadByUser: MethodNotificationsUpdateReadByUser
readonly notificationUpdateRead: MethodNotificationUpdateRead
readonly notificationSettingsResetByUser: MethodNotificationSettingsResetByUser
readonly notificationSettingsUpdateByUser: MethodNotificationSettingsUpdateByUser
readonly propertyCreate: MethodPropertyCreate
readonly propertyGetById: MethodPropertyGetById
readonly propertyUpdateById: MethodPropertyUpdateById
readonly registrationCodeCreate: MethodRegistrationCodeCreate
readonly unitCreate: MethodUnitCreate
readonly unitGetById: MethodUnitGetById
readonly unitUpdateById: MethodUnitUpdateById
readonly userCreate: MethodUserCreate
readonly userGetById: MethodUserGetById
readonly userUpdateById: MethodUserUpdateById
readonly getUsers: MethodGetUsers
readonly getCurrentUser: MethodGetCurrentUser
readonly userCreatePermission: MethodUserCreatePermission
readonly userGetPermissions: MethodUserGetPermissions
readonly userDeletePermission: MethodUserDeletePermission
readonly userGetUtilisationPeriods: MethodUserGetUtilisationPeriods
readonly userCheckInToUtilisationPeriod: MethodUserCheckInToUtilisationPeriod
readonly userRelationCreate: MethodUserRelationCreate
readonly userRelationDelete: MethodUserRelationDelete
readonly utilisationPeriodCreate: MethodUtilisationPeriodCreate
readonly utilisationPeriodGetById: MethodUtilisationPeriodGetById
readonly utilisationPeriodUpdateById: MethodUtilisationPeriodUpdateById
readonly utilisationPeriodCheckInUser: MethodUtilisationPeriodCheckInUser
}
Release management & versioning
The Allthings SDK makes use of semantic-release which automates the whole package release workflow including: determining the next version number, generating the release notes and publishing the package. This repository is configured to squash-merge
(see here).
When you squash merge, GitHub takes the title of the PR for the squash-merge's commit subject. By choosing a proper PR title e.g. feat: my new feature
your merged PR will trigger a new release. See semantic-releases docs for available prefixes.