npm package: @softchef/cdk-iot-device-management
Description: IoT device management is composed of things, thing types, thing groups, jobs, files API services. The constructs can be used independently, that are based on full-managed service to create an API Gateway & Lambda function.
Author: SoftChef
Latest version: 2.0.0

[![npm version](https://badge.fury.io/js/%40softchef%2Fcdk-iot-device-management.svg)](https://badge.fury.io/js/%40softchef%2Fcdk-iot-device-management)
![Release](https://github.com/SoftChef/cdk-iot-device-management/workflows/Release/badge.svg)
![npm](https://img.shields.io/npm/dt/@softchef/cdk-iot-device-management?label=NPM%20Downloads&color=orange)

# CDK Construct - IoT Device Management

IoT device management is composed of things, thing types, thing groups, jobs, files API services. The constructs can be used independently, that are based on full-managed service to create an API Gateway & Lambda function.

![Architecture](docs/cdk-iot-device-management.png)

## Installation

```sh
npm install @softchef/cdk-iot-device-management

or

yarn add @softchef/cdk-iot-device-management

```

## Why

- Integrate RestAPI and AWS IoT core to implement access control.
- Manage device firmware information.
- Manage device, such as create an OTA jobs.

This construct library provides five constructs:

- **Thing Type API construct** - Create and modify thing types' information.
- **Thing API construct** - Create and modify things' information.
- **Thing Group construct** - Create and modify thing groups' information.
- **Job API construct** - Create and modify thing's jobs.
- **File API construct** - Integrate API Gateway and DynamoDB to store device firmware information.

## Constructs

### Thing Type API construct

Use thing type API to manage thing types.

```typescript
import { ThingTypeApi } from '@softchef/cdk-iot-device-management'

const thingTypeApi = new ThingTypeApi(scope, id, {
  authorizationType?: apigateway.AuthorizationType;
  authorizer?: apigateway.IAuthorizer
})
```

[Thing Type API Docs](./docs/thing-type-api.md)

### Thing API construct

Use thing API to manage things' information.

```typescript
import { ThingApi } from '@softchef/cdk-iot-device-management'

const thingApi = new ThingApi(scope, id, {
  authorizationType?: apigateway.AuthorizationType;
  authorizer?: apigateway.IAuthorizer
})
```

[Thing API Docs](./docs/thing-api.md)

### Thing Group API construct

Use thing API to manage thing groups' information.

```typescript
import { ThingGroupApi } from '@softchef/cdk-iot-device-management'

const thingGroupApi = new ThingGroupApi(scope, id, {
  authorizationType?: apigateway.AuthorizationType;
  authorizer?: apigateway.IAuthorizer
})
```

[Thing Group API Docs](./docs/thing-group-api.md)

### Job API construct

Use job API to manage jobs' information.

```typescript
import { JobApi } from '@softchef/cdk-iot-device-management'

const jobApi = new JobApi(scope, id, {
  authorizationType?: apigateway.AuthorizationType;
  authorizer?: apigateway.IAuthorizer;
  scheduleFunction: ScheduleFunction
})
```

> The [ScheduleFunction](https://www.npmjs.com/package/@softchef/cdk-schedule-function/v/0.0.15) is support to custom create job by schedule time.

[Job API Docs](./docs/job-api.md)

### File API construct

Use File API to manage IoT devices firmware. File API contains category and file.

```typescript
import { fileApi } from '@softchef/cdk-iot-device-management'

const FileApi = new FileApi(scope, id, {
  authorizationType?: apigateway.AuthorizationType;
  authorizer?: apigateway.IAuthorizer;
})
```

[File API Docs](./docs/file-api.md)

### Category Table Schema

| Name        | Schema | Primary Index | GSI(Query By ParentId) |
| ----------- | ------ | ------------- | ---------------------- |
| categoryId  | String | Partition Key |                        |
| parentId    | String |               | Partition Key          |
| name        | String |               |                        |
| description | String |               |                        |

### File Table Schema

| Name         | Schema | Primary Index | GSI(Query By CategoryId And Locale) | GSI(Get File By Checksum And Version) |
| ------------ | ------ | ------------- | ----------------------------------- | ------------------------------------- |
| fileId       | String | Partition Key |                                     |                                       |
| categoryId   | String |               | Partition Key                       |                                       |
| checksum     | String |               |                                     | Partition Key                         |
| version      | String |               |                                     | Sort Key                              |
| checksumType | String |               |                                     |                                       |
| location     | String |               |                                     |                                       |
| locale       | String |               | Sort Key                            |                                       |
| summary      | String |               |                                     |                                       |
| description  | String |               |                                     |                                       |
| updatedAt    | Number |               |                                     |                                       |
| createdAt    | Number |               |                                     |                                       |

## License

This code is licensed under the Apache License 2.0. See the [LICENSE](https://github.com/SoftChef/cdk-iot-device-management/blob/main/LICENSE) file.