---
# System prepended metadata

title: 動態牆
tags: [jkfans]

---

# 動態牆

[TOC]

###### tags: `jkfans`

---

## 需求

- 動態牆(簡稱**牆**)
- 女神發佈視頻**動態**到牆上
- 單則動態可設定❤️數量**上鎖**
- 粉絲使用❤️**解鎖**單則動態

## 規格

- 女神 vs. 動態 (一對多)
- 女神(網頁)上傳動態
	- 一張圖像或一個視頻(必要)
	- 文字內容(選填)
	- ❤️數量(選填)
- 粉絲 vs. 動態 (多對多)

### 視頻前置作業

![](https://i.imgur.com/dK7oI2B.png)

1. [x] EC2 - 接收上傳檔案
	- [x] 驗證檔案類型(`video/mp4`、`video/quicktime`)
		- [x] 不符則刪除**本地暫存檔**後直接響應給**女神**
	- [x] 暫存檔名為 `UUID.randomUUID()`
	- [x] 暫存於 `System.getProperty("java.io.tmpdir")`
2. [x] RDS - 創建初始數據
	- [x] 女神(`goddes`)
	- [x] 識別碼(`identifier`)
	- [x] 創建的時戳(`createdAt`)
	- [x] 解鎖愛心數量(`hearts`)
	- [x] S3 上的暫存檔案位址(`preProcessingUri`)
	- [x] Beanstalk 的網鉤位址(`webhookUrl`)
3. [x] S3 - 封存原檔
	- [x] EC2 - 刪除本地暫存檔
4. [x] 發送消息到 SQS 佇列

### 視頻後製作業

![](https://i.imgur.com/8lDvOD0.png)

1. [x] SQS - 接收消息調用 Lambda 函數
2. [x] Lambda
	- [x] 從消息中取得 S3 的暫存檔案位址(`getPreProcessingUri()`)
	- [x] 將 S3 的暫存檔案上傳到 Cloudinary
3. [x] Cloudinary
	- [x] 後製(加上 emblem)
	- [x] 後製(套用濾鏡、加上 emblem)
	- [x] Cloudinary 完成後會發送 notification 到 webhook
4. [x] EC2 - 透過 webhook 接收 notification
	- [x] 從 RDS 取得 S3 的暫存檔案位址(`getPreProcessingUri()`)
	- [x] 刪除 S3 的暫存檔案
	- [x] 將 RDS 中 S3 的暫存檔案位址設為 `null`
5. [ ] 發送消息到 SQS 佇列

### 封存視頻

![](https://i.imgur.com/tvVp1wX.png)

1. [x] SQS - 接收消息調用 Lambda 函數
2. [x] Lambda - 使 S3 從 Cloudinary 下載資產
3. [ ] RDS - 更新數據
4. [ ] Cloudinary - 刪除資產
5. [ ] MediaConvert - 視頻轉碼(`.m3u8`、`.ts`)
6. [ ] EventBridge - 構建事件調用 Lambda 函數
7. [ ] Lambda - 透過 LINE Messaging API 通知女神

## LINE Notify

|          | Development                                   | Production                                    |        |
| -------- | --------------------------------------------- | --------------------------------------------- | ------ |
| 接收视频 | `qqbrW2eLmnPl2LB6LI4UgnQWFwnwuxBj740ihSSljwY` | `qqbrW2eLmnPl2LB6LI4UgnQWFwnwuxBj740ihSSljwY` | Fēifēi |
| 视频后制 | `XOE1KJ8OqtLPlQAeZwebgViNEpmzb70SmHdya7RjoiP` | `XOE1KJ8OqtLPlQAeZwebgViNEpmzb70SmHdya7RjoiP` | 林可可 |
| 前製視頻 |                                               |                                               |        |
## 

- [x] Upload to S3:
	- [x] `s3://{BUCKET}/prEprOcEssIng/{UUID}.(mov|mp4)`
- Cloudinary to Lambda:
	- [ ] `/tmp/{UUID}/{PUBLIC_ID}.mp4`
	- [ ] `/tmp/{UUID}/preview.mp4`
- Lambda to S3:
	- [ ] `s3://{BUCKET}/story/{UUID}/{PUBLIC_ID}.mp4`
	- [ ] `s3://{BUCKET}/story/{UUID}/preview.mp4`
- S3 to MediaConvert:
	- [ ] `s3://{BUCKET}/story/{UUID}/{PUBLIC_ID}.(m3u8|ts)`
	- [ ] `s3://{BUCKET}/story/{UUID}/preview.(m3u8|ts)`
