# VIVOCloud Recording System
## Overview
### Parts list
1. Camera side
1. Server side
* S3
* EC2
* Account Server
* Playback Server
* lambda
* Recording server
* Redis
* DynamoDB
* AWS IOT STS endpoint
1. Client side
* APP
* Web
### Actions between parts
```mermaid
graph LR
C[Camera]
F[Web/APP]-->|login|A[Account]
F -->|play| P[Playback]
subgraph SERVER
AS(AWS-STS)
D[(DynamoDB)]
R(Redis)
P --> |get media|S((S3))
S --> |event call|RS{{Recording}}
A--> |query owner| D
A -->|query session, put credential| R
A --> |create credential|AS
P --> |query intervals| D
P --> |query session, query credential| R
RS--> |insert interval| D
RS-->|get media|S
I(IOT-STS)
end
C -->|put media|S
C -->|create credential|I
```
## Parts
1. S3
* Store all recording media files
* Store all archived media files
* Support upload HTTPS request
2. DynamoDB
* Store all interval information of medias
* S3 filename
* Begin time and end time in local time and UTC
* Timezone and DST inforamtion
* Store all information of archives
* S3 filename
* Begin time, end time and create time
* Create from whitch camera
4. Redis
* Cache Storage credentials for each user
5. AWS IOT STS endpoint
* Support camera get a temporary credential by HTTPS request with cerificate
7. Camera
* Get frame and compose 3gp type media files
* Refresh Storage credential form IOT certificate
* Put 3gp files to Storage by HTTPS request with credential
* Varify AWS server with AWS root CA
8. Recording server
* A AWS managed lambad
* Support Storage new file event
* Parse file to get interval information and insert to Database
9. Client
* User login Account server
* Send query API to Playback server, then show timeline and video
* Send archives API to keep media avoid be recycled
10. Account server
* Create a user session for client when login
* Create a credential of Storage in cache when user login
11. Playback server
* Check API with user session
* Get crendtial of Storage form Cache
* Support HTTPS requests:
* Query recorded days in a month
* Query recording intervals in a day
* Play recording files in a time
* Create archive with a interval
* Query all archives
* Play/Download/Delete archive with a archive ID
## Flow of Actions
### Camera Recording
```mermaid
sequenceDiagram
Camera->>+IOT STS: HTTPS request + cetificate
IOT STS->>-Camera: temporary credential
Camera->>+S3:upload 3gp file + credential
S3->>-Camera:ok
S3->>+Recording:trigger event with obj key
Recording->>+S3:HTTPS request
S3->>-Recording:download 3gp
Note over Recording:parse 3gp
Recording->>+DynamoDB:insert new file interval
DynamoDB->>-Recording:ok
Recording->>-S3:ok
```
### Client login
```mermaid
sequenceDiagram
Client->>+Account: HTTPS request + username + password
Account->>Account: create session
Account->>+AWS STS: create temporary credential
AWS STS->>-Account: downlaod credential
Account->>+Redis: Add session and credential
Redis->>-Account: ok
Account->>-Client: user session
```
### Client Playback - get intervals and calendar
```mermaid
sequenceDiagram
Client->>+Playback: HTTPS request + user session
Playback->>+Redis: verify user session
Redis->>-Playback: ok
Playback->>+DynamoDB: query camera owner
DynamoDB->>-Playback: owner ID
Playback->>+DynamoDB: query interval of files
DynamoDB->>-Playback: interval list in JSON
Playback->>-Client: JSON response
```
### Client Playback - play media
```mermaid
sequenceDiagram
Client->>+Playback: HTTPS request + user session
Playback->>+Redis: verify user session
Redis->>-Playback: ok
Playback->>+Redis: get credential
Redis->>-Playback:downlaod credential
Playback->>+DynamoDB: query camera owner
DynamoDB->>-Playback: owner ID
Playback->>+DynamoDB: find the file
DynamoDB->>-Playback: return a s3 obj key
Playback->>+S3: GetObj HTTPS request with credential
S3->>-Playback: dowwnload 3gp
Playback->>-Client: downlaod 3gp
Note over Client: render the 3gp
```
### Client Archive - Create
```mermaid
sequenceDiagram
Client->>+Playback: HTTPS request + user session
Playback->>+Redis: verify user session
Redis->>-Playback: ok
Playback->>+Redis: get credential
Redis->>-Playback:downlaod credential
Playback->>+DynamoDB: query camera owner
DynamoDB->>-Playback: owner ID
Playback->>+DynamoDB: query files in the range
DynamoDB->>-Playback: file list in JSON
loop all files
Playback->>+S3: GetObj HTTPS request with credential
S3->>-Playback: dowwnload all 3gp files
end
Note over Playback: Merge files
Playback->>+S3: Upload archived 3gp
S3->>-Playback: ok
Playback->>+DynamoDB: insert archive information
DynamoDB->>-Playback: ok
Playback->>-Client: JSON response
```
### Client Archive - Query, Deelte
```mermaid
sequenceDiagram
Client->>+Playback: HTTPS request + user session
Playback->>+Redis: verify user session
Redis->>-Playback: ok
Playback->>+Redis: get credential
Redis->>-Playback:downlaod credential
Playback->>+DynamoDB: query camera owner
DynamoDB->>-Playback: owner ID
Playback->>+DynamoDB: query command
DynamoDB->>-Playback: result in JSON
Playback->>-Client: JSON response
```
### Client Archive - Download, Play
```mermaid
sequenceDiagram
Client->>+Playback: HTTPS request + user session
Playback->>+Redis: verify user session
Redis->>-Playback: ok
Playback->>+Redis: get credential
Redis->>-Playback:downlaod credential
Playback->>+DynamoDB: query camera owner
DynamoDB->>-Playback: owner ID
Playback->>+DynamoDB: query archive s3 obj key
DynamoDB->>-Playback: return a s3 obj key
Playback->>+S3: create pre-signed URL
S3->>-Playback:string in JSON
Playback->>-Client: JSON response
```