# DesignbyAI.co
## Database
- Asset (Images)
- ID*
- Name
- Slug
- CreatedAt
- FileType
- OriginalSize
- OriginalDimension
- ThumbnailUrl
- PreviewUrl
- OriginalUrl
- Type (Free, Subscribe, Premium)
- Category
- ID*
- Name
- Slug
- CreatedAt
- AssetCategory
- AssetID*
- CategoryID*
- Tag
- ID*
- Name
- AssetTag
- AssetID*
- TagID*
- Download
- UserID*
- AssetID*
- NumberOfDownload
- CreatedAt
- UpdatedAt
- Role (Admin/Collaborator/User)
- ID*
- RoleName
- User
- ID*
- Email
- Password
- CreatedAt
- UpdatedAt
- LastLoginAt
- FirstName
- LastName
- RoleID
- AccountPlan (enum: "free", "premium", "professional")
- SubscriptionExpiredAt
- SubscriptionStartAt
## APIs:
- UserAPI: `/v1/users`
- Register: POST `/register`
- Body
```
{
"email": "",
"password": "",
"firstName": "",
"lastName": ""
}
```
- Login: POST `/login`
- Body
```
{
"email": "",
"password": ""
}
```
- Social Login: POST `/login/social`
- Profile: GET `/me`
- Profile Update: PUT `/me`
- AssetAPI: `/v1/assets`
- Get: GET ""
- params: category, tag, offset, size
- AssetDetail: GET `/:id`
- Create: POST ""
- Permissions: Role = Admin
- CategoryAPI: `/v1/categories`
- Get: GET ""
- params: category, tag, offset, size
- Create: POST ""
- Permissions: Role = Admin
- DownloadAPI: `/v1/downloads`
- Download: GET `/:id` (JWT authentication)
- params: assetID
- History: GET "" (JWT authentication)
- (TBD) PremiumAPI:
## UseCases:
- Guest:
- Login
- Register
- View Categories
- View Assets
- View Asset Preview
- Download Free Assets
- User: (+Guest)
- Download SubscribeOnly Assets
- Get Histories.
- Manage User Info
- Collaborators: (+User)
- Create/Upload Asset
- Admin: (+User)
- Create Category
- Create/Upload Asset
- Statistic
- (TBD) Premium: (+User)
- Download Premium Assets
## Special Flows:
- Upload Asset:
```mermaid
sequenceDiagram
autonumber
Client->>+Server: POST /v1/assets
Server->>Server: Check Permission
Server->>Server: Validate data
Server->>+S3/Cloud Storage: Upload thumbnail/preview/original asset
S3/Cloud Storage-->>-Server: urls
Server->>Server: Save info into Database
Server-->>-Client: Status
```
- Download Asset:
```mermaid
sequenceDiagram
autonumber
Client->>+Server: GET /v1/downloads/:id
Server->>Server: QueryDB & Check for Plan & Permission
Server->>+S3/Cloud Storage: get original asset
S3/Cloud Storage-->>-Server: original asset file
Server->>Server: Save log into Download table
Server-->>-Client: Return file
```
## Infrastructure:
- A load balancer to distribute incoming traffic to multiple backend servers for scalability and reliability.
- Multiple backend servers to handle API requests and run the background jobs.
- A database cluster for storing user information and image metadata (PostgreSQL).
- A storage solution using Amazon S3