# NP_COLLEGE PART 3
###### tags: ```NCTU-Intro2NP```
:::info
**The sequence diagrams below are just for reference. You can design those interactions by yourself.**
:::
## Commands in the previous part
### 1. register <username> <email> <password>
**Success scenario**
```sequence
client1->server: command \nregister <username>...
Note over server: Valid username.
server-->client1: Response
client1->Amazon S3: create client1's bucket
Amazon S3->client1: Amazon S3 API response.
client1->server: metadata of the user.
Note over server: Server stores \nthe metadata \nof the user.
server-->client1: Success
Note over client1: Register successfully.
```
**Failure scenario**
**a. User is already used.**
```sequence
client1->server: command \nregister <username>...
Note over server: User is already used.
server-->client1: Error response.
Note over client1: User is already used.
```
### 2. login <username> <password>
**Success scenario**
```sequence
client1->server: command \nlogin <username>...
Note over server: Correct password and log in.
server-->client1: Response
client1->Amazon S3: Access client1's bucket
Amazon S3->client1: Amazon S3 API response.
```
**Failure scenario**
**a. client already logged in.**
```sequence
client->server: command \nlogin <username>...
Note over server: client already logged in.
server-->client: Error response.
Note over client: Please logout first.
```
**b. Username or password is incorrect.**
```sequence
client->server: command \nlogin <username>...
Note over server: Username or password is incorrect.
server-->client: Error response.
Note over client: Login failed.
```
### 3. create-post <board_name> --title title --content <content>
**Success scenario**
```sequence
client1->server: command \ncreate-post <board_name>...
Note over server: valid action.
server-->client1: Response
client1->client1 bucket: create the post object in client1's bucket
client1 bucket->client1: Amazon S3 API response.
client1->server: metadata of the post.
Note over server: Server stores \nthe metadata \nof the post.
server-->client1: Success
Note over client1: Create post successfully.
```
**Failure scenario**
**a. No user logged in.**
```sequence
client->server: command \ncreate-post <board_name>...
Note over server: client doesn't log in.
server-->client: Error response.
Note over client: Please login first.
```
**b. board doesn't exist.**
```sequence
client1->server: command \ncreate-post <board_name>...
Note over server: board doesn't exist.
server-->client1: Error response.
Note over client1: Board doesn't exist.
```
### 4. read <post_id>
**Success scenario**
```sequence
client1->server: command \nread <post_id>
Note over server: valid action.
server-->client1: metadata of the post
client1->post owner's bucket: get the content of the post
post owner's bucket->client1: Amazon S3 API response.
Note over client1: Print the post.
```
**Failure scenario**
**a. Unknown <post_id>**
```sequence
client1->server: command \nread <post_id>
Note over server: post <post_id> doesn't exist.
server-->client1: Error response.
Note over client1: Post does not exist.
```
### 5. update-post <post_id> --title/content <new>
**Success scenario (title)**
```sequence
client1->server: command \nupdate-post <post_id>...
Note over server: update the title of the post.
server-->client1: Response
Note over client1: Update successfully.
```
**Success scenario (content)**
```sequence
client1->server: command \nupdate-post <post_id>...
Note over server: valid action.
server-->client1: Response
client1->client1 bucket: update the post object in client1's bucket
client1 bucket->client1: Amazon S3 API response.
Note over client1: Update successfully.
```
**Failure scenario**
**a. No user logged in.**
```sequence
client->server: command \nupdate-post <post_id>...
Note over server: client doesn't log in.
server-->client: Error response.
Note over client: Please login first.
```
**b. Unknown <post_id>**
```sequence
client1->server: command \nupdate-post <post_id>...
Note over server: post <post_id> doesn't exist.
server-->client1: Error response.
Note over client1: Post does not exist.
```
**c. Not the post owner**
```sequence
client1->server: command \nupdate-post <post_id>...
Note over server: Not the post owner.
server-->client1: Error response.
Note over client1: Not the post owner.
```
### 6. comment <post_id> <comment>
**Success scenario**
```sequence
client1->server: command \ncomment <post_id>...
Note over server: valid action.
server-->client1: metadata of the post
client1->post owner's bucket: append <comment> to\n the content of the post
post owner's bucket->client1: Amazon S3 API response.
Note over client1: Comment successfully.
```
**Failure scenario**
**a. No user logged in.**
```sequence
client->server: command \ncomment <post_id>...
Note over server: client doesn't log in.
server-->client: Error response.
Note over client: Please login first.
```
**b. Unknown <post_id>**
```sequence
client1->server: command \ncomment <post_id>...
Note over server: post <post_id> doesn't exist.
server-->client1: Error response.
Note over client1: Post does not exist.
```
### 7. delete-post <post_id>
**Success scenario**
```sequence
client1->server: command \ndelete-post <post_id>
Note over server: delete the metadata of the post.
server-->client1: Response
client1->client1 bucket: delete the post object from client1's bucket
client1 bucket->client1: Amazon S3 API response.
Note over client1: Delete successfully.
```
**Failure scenario**
**a. No user logged in.**
```sequence
client->server: command \ncomment <post_id>...
Note over server: client doesn't log in.
server-->client: Error response.
Note over client: Please login first.
```
**b. Unknown <post_id>**
```sequence
client1->server: command \ncomment <post_id>...
Note over server: post <post_id> doesn't exist.
server-->client1: Error response.
Note over client1: Post does not exist.
```
**c. Not the post owner**
```sequence
client1->server: command \nupdate-post <post_id>...
Note over server: Not the post owner.
server-->client1: Error response.
Note over client1: Not the post owner.
```
## New commands
### 1. mail-to <username> --subject <subject> --content <content>
**Success scenario**
```sequence
client1->server: command \nmail-to client2..
Note over server: client2 exists.
server-->client1: client2's bucket name
client1->client2 bucket: create mail in client2's bucket
client2 bucket->client1: Amazon S3 API response.
client1->server: metadata of the email.
Note over server: Server stores \nthe metadata \nof the mail.
server-->client1: Success
Note over client1: Sent successfully.
```
**Failure scenario**
**a. No user logged in.**
```sequence
client->server: command \nmail-to client2
Note over server: client doesn't log in.
server-->client: Error response.
Note over client: Please login first.
```
**b. client doesn't exist.**
```sequence
client1->server: command \nmail-to client2
Note over server: client2 doesn't exist.
server-->client1: Error response.
Note over client1: <username> does not exist.
```
---
### 2. list-mail
**Success scenario**
```sequence
client1->server: command \nlist-mail
Note over server: Server gets all \nmetadata of client1's \nincoming mails.
server-->client1: metadata of \nincoming mails.
Note over client1: Print mail#, Subject, \nFrom of \nincoming mails.
```
**Failure scenario**
**a. No user logged in.**
```sequence
client->server: command \nlist-mail
Note over server: client doesn't log in.
server-->client: Error response.
Note over client: Please login first.
```
---
### 3. retr-mail <mail#>
**Success scenario**
```sequence
client1->server: command \nretr-mail <mail#>
Note over server: Query metadata \nof the mail
server-->client1: metadata of \n the mail.
client1->client1's bucket: Get mail object from \nclient1's bucket.
client1's bucket->client1: Amazon S3 API response.
Note over client1: Print the content \nof the mail.
```
**Failure scenario**
**a. No user logged in.**
```sequence
client->server: command \nretr-mail <mail#>
Note over server: client doesn't log in.
server-->client: Error response.
Note over client: Please login first.
```
**b. Unknown <mail#>**
```sequence
client1->server: command \nretr-mail <mail#>
Note over server: <mail#> doesn't exist.
server-->client1: Error response.
Note over client1: No such mail.
```
---
### 4. delete-mail <mail#>
**Success scenario**
```sequence
client1->server: command \ndelete-mail <mail#>
Note over server: Query metadata \nof the mail
server-->client1: metadata of the mail.
client1->client1's bucket: Delete <mail#> object.
client1's bucket->client1: Amazon S3 API response.
Note over client1: Mail deleted.
```
**Failure scenario**
**a. No user logged in.**
```sequence
client->server: command \ndelete-mail <mail#>
Note over server: client doesn't log in.
server-->client: Error response.
Note over client: Please login first.
```
**b. Unknown <mail#>**
```sequence
client1->server: command \ndelete-mail <mail#>
Note over server: <mail#> doesn't exist.
server-->client1: Error response.
Note over client1: No such mail.
```