---
# System prepended metadata

title: Streetlity User

---

# Streetlity User
A server for managin the streetlity user

## User
### Login
Login need username, password and token of the device for notification.

**Path**: `/user/login`

**Method**: `POST`

**Param**:
<pre>
- username
- password
- deviceToken: token of the device
</pre>

### Logout

**Path**: `/user/logout`

**Method**: `POST`

**Param**:
<pre>
- username
- rtoken: refresh token
- deviceToken: token of the device
</pre>

### Refresh Token

**Path**: `/user/refresh`

**Method**: `POST`

**Param**:
<pre>
- rtoken
</pre>

### Notify
Using to send notify to users
**Path**: `/user/notify`

**Method**: `POST`

**Param**: 
<pre>
- id (array): id of the user
- notify-title: title
- notify-body: message content of the notification
- notify-image: path to the image that will be showed on the notification
- data (array): the following data need to be sent. data must following the format: "key:value"
</pre>

### User Validation
Validate the user before the registration. User validation could validate in 3 cases: only username, only email, both username and email perspective with 1, 2, 3

**Path**: `/user/validate/`

**Method**: `GET`

**Param**:
<pre>
- case: determining the validation case, have value 1, 2 or 3
- username (optional by case)
- email (optional by case)
</pre>

### Register
Create new common user

**Path**: `/user/common/register`

**Method**: `POST`

**Param**:
<pre>
- username
- passwd
- email
- phone
- address
</pre>

### Get user information
Get information of a specified user

**Path**: `/user/info/`
 
**Method**: `GET`

**Param**:
<pre>
- id: id of the user
</pre>

**Return**:
<pre>
- Info: information of the user
</pre>

### Update user information
Update information of a specified user

**Path**: `user/info/`

**Method**: `POST`

**Param**:
<pre>
- id: id of the updating user
- name: new name of the user
- address: new address of the user
- phone: new phone of the user
- avatar: new avatar of the user
</pre>
## Maintenance User

### Register
Create new maintenance user. If them maintenance service is not available, [another register](#register-when-service-is-not-availble) will be used.

**Path**: `/user/maintenance/register`

**Method**: `POST`

**Param**:
<pre>
- username
- passwd
- email
- phone
- address
- serviceId: service id of the maintenance user
</pre>

### Register when service is not available
Not all of services are available when create a new maintenance user, in this case maintenance user can define their own service and it will be added when approved.

**Path**: `/user/maintenance/register`

**Method**: `POST`

**Param**:
<pre>
Same as Register but have more param to define the service
- service_name
- location (array): contains lat and lon in location[0] and location[1] perspective.
- service_address
- note (optional)
</pre>

### Approve
Approve a specified maintenance user

**Path**: `/user/maintenance/approve`

**Method**: `POST`

**Param**:
<pre>
- username: username that needed to approve
</pre>

## Achievement
Achievement provide methods to record the actions, get and update the achievement

### Get achievement
Return the achievement of the specified user

**Path**: `/user/achievement`

**Method**: `GET`

**Param**:
<pre>
- id: username of the user
</pre>

**Return**:
<pre>
- Achievement: information about the achievement
</pre>
### Get achievement progress
Return achievement progress of a specified user in json format.

**Path**: `/user/achievement/progress`

**Method**: `GET`

**Param**:
<pre>
- id: username of the user
</pre>

**Return**:
<pre>
- Progress: progress of the user in json format
</pre>

### Get user reputation
Return the reputation of a specified user

**Path**: `/user/achievement/reputation`

**Method**: `GET`

**Param**:
<pre>
- id: username of the user
</pre>

**Return**:
<pre>
- Reputation
</pre>
### Add action
Record an action for a specified user by a pair of information. the information contains `action_type`, `time`, `affect`, `service`.

`$action_type` could be: 
- `contribute`
- `review`
- `upvote`

**Path**: `/user/action/$action_type/`

**Method**: `POST`

**Param**:
<pre>
- id: id of the user
- time (array): 
- affect (array): id of the affection things that affected by the action. eg: if review affect is the id of the review, if upvote we use the id of the upvoted service, if contribute...
- service (array): "Atm", "Fuel", "Maintenance" or "Toilet" to determine the service that the action affect.
</pre>

### Remove action
Same as add action
`$action_type` could be: 
- `contribute`
- `review`
- `upvote`

**Path**: `/user/action/$action_type/`

**Method**: `DELETE`

**Param**:
<pre>
- affect (array): affect of the action
- service (array): "Atm", "Fuel", "Maintenance" or "Toilet" to determine the service that the action affect.
</pre>

## Emergency
Contains methods for working with emergency maintenance

### Get emergency maintenance

**Path**: `users/maintenance/emergency`

