---
# System prepended metadata

title: Blocky API !

---

# Blocky API !


```url
Environment URL

blynk.blocky.edu.vn:5000/api/v1/<command>
```

## Account Register
```json
POST /api/v1/register
{
	"username" : "myemail@gmail.com",
	"password" : "mypassword"
}
```

If user has already registered and the password is correct
```json
{
	"success" : True,
	"message" : "EMAIL_ALREADY_REGISTERED",
	"data" : "ZXlKMGVYQWlPaUpLVjFRaUxDSmhiR2NpT2lKSVV6STFOaUo5LmV5SjFjMlZ5Ym1GdFpTSTZJbEp2WW1WeWRDQlNZWGx0YjI1a1FHZHRZV2xzTG1OdmJTSXNJbVY0Y0NJNk1UVTNNelUxT1RFd05Td2lhV0YwSWpveE5UY3lPVFUwTXpBMWZRLndsdFpYZFdnc3Q1bDhNOFdXeFRtYkNZYkducEdTOXlndFNuYmQ2TzJGZDQ="
}
```

If the password is wrong
```json
{
	"success" : False,
	"message" : "REGISTERED_WRONG_PASSWORD",
	"data" : "",
}
```
If not registered
```json
{
	"success" : True,
	"message" : "USER_REGISTERED",
	"data" : "ZXlKMGVYQWlPaUpLVjFRaUxDSmhiR2NpT2lKSVV6STFOaUo5LmV5SjFjMlZ5Ym1GdFpTSTZJbEp2WW1WeWRDQlNZWGx0YjI1a1FHZHRZV2xzTG1OdmJTSXNJbVY0Y0NJNk1UVTNNelUxT1RFd05Td2lhV0YwSWpveE5UY3lPVFUwTXpBMWZRLndsdFpYZFdnc3Q1bDhNOFdXeFRtYkNZYkducEdTOXlndFNuYmQ2TzJGZDQ=", // JWT Token
}
```

Save the JWT Token to local storage, use this token for any API call



## Admin creating access token for students ( just like Kahoot )

```json
GET /api/v1/passport

{
	"username" : "myemail@gmail.com",
	"token"  : "myLongJWTKey...",
} 
```
If wrong token ( expired or invalid)
```json
{
	"success" : False,
	"message" : "JWT_EXPIRED" or "JWT_INVALID",
	"data" : "",
}
```
If success
```json
{
	"success" : True,
	"message" : "PASSPORT_CREATED",
	"data" : 123909819,
}
// Start the countdown in 5 minutes
```
### Students will use this passport key to create their account !
When they input all 9 digits, call to the server to verify
```json
GET /api/v1/passport
{
	"passport" : 123909819
}
```
If not correct
```json
{
	"success" : False,
	"message" : "INVALID_PASSPORT",
	"data" : ""
}
```
If correct : 
```json
{
	"success" : True,
	"message" : "ACCESS_TOKEN_CREATED",
	"data" : "ZXlKMGVYQWlPaUpLVjFRaUxDSmhiR2NpT2lKSVV6STFOaUo5LmV5SjFjMlZ5Ym1GdFpTSTZJbEp2WW1WeWRDQlNZWGx0YjI1a1FHZHRZV2xzTG1OdmJTSXNJbVY0Y0NJNk1UVTNNelUxT1RFd05Td2lhV0YwSWpveE5UY3lPVFUwTXpBMWZRLndsdFpYZFdnc3Q1bDhNOFdXeFRtYkNZYkducEdTOXlndFNuYmQ2TzJGZDQ="
}
```
Save the temporary jwt key, this will expire soon 
Show another dialog, where user can input their name ( must ) and email,password (optional)
Send those input back to the server

```json
POST : /api/v1/studentregister
{
	"nickname" : "Trung Nguyen",
	"username" : "trungnguyen@gmail.com",
	"password"  : "mypassword",
	"token" : "ZXlKMGVYQWlPaUpLVjFRaUxDSmhiR2NpT2lKSVV6STFOaUo5LmV5SjFjMlZ5Ym1GdFpTSTZJbEp2WW1WeWRDQlNZWGx0YjI1a1FHZHRZV2xzTG1OdmJTSXNJbVY0Y0NJNk1UVTNNelUxT1RFd05Td2lhV0YwSWpveE5UY3lPVFUwTXpBMWZRLndsdFpYZFdnc3Q1bDhNOFdXeFRtYkNZYkducEdTOXlndFNuYmQ2TzJGZDQ="
}
```
```json
{
	"success" : True,
	"message" : "STUDENT_REGISTERED",
	"data" : "ZXlKMGVYQWlPaUpLVjFRaUxDSmhiR2NpT2lKSVV6STFOaUo5LmV5SjFjMlZ5Ym1GdFpTSTZJbEp2WW1WeWRDQlNZWGx0YjI1a1FHZHRZV2xzTG1OdmJTSXNJbVY0Y0NJNk1UVTNNelUxT1RFd05Td2lhV0YwSWpveE5UY3lPVFUwTXpBMWZRLndsdFpYZFdnc3Q1bDhNOFdXeFRtYkNZYkducEdTOXlndFNuYmQ2TzJGZDQ=",
}
// Save this token to the localStorage
```
The idea is that students don't need to log in if they register using the same machine
If they aren't , they can log in using email and password, if they have registered that too.

In case name has already taken: 
In case email has already taken:
```json
{
	"success" : False,
	"message" : "NICKNAME_ALREADY_USED" or "EMAIL_ALREADY_REGISTERED"
	"data" : ""
}
```





# ==================== STUFF BELOW THIS LINE IS NOT WORKING YET ======================================== #
 

# Students getting the profile.
### Using the localStorage 
```json
GET /api/v1/profile
{
	"token" : "myJWTToken"
}
// return the same thing as above ( Admin )
```

### Using email and password
```json
GET /api/v1/profile
{
	"email" : "myEmail@gmail.com",
	"password" : "alita"
}
// This will return the JWT token, then do the above step to get the profile
```

# Device
Idea : 
1. when the students has selected a controller, other students can't
2. when the students selected another controller, call the api

### Notify the server about student selecting a controller
```json
UPDATE /api/v1/device
{
	"token" : "myJWTToken",
	"controller" : "controllerA"
}
```
When user clicked on the controller dropdown list, pull the profile to know if the controller is being used by anyone !

# Project
### Saving Project
```json
POST /api/v1/project
{
	"token": "myJWTToken",
	"username" : "myemail@gmail.com",
	"project" : 
	{ 
		"projectName" : "This is my project",
		"owner" : "studentA", 
		"dateCreated" : 1572975838, // Unix Time
		"dateModified" : 1572975900,
		"currentMode"  : "block" or "python",
		"lastModifiedBy" : "studentA",
		// specify that this code is being used
		// by some controller. Appendix A
		"controller" : None or "controllerA",
		"data":{
			"xml" : "XMLSTRUCTURE...",
			"python" : "pythonCode",
			// Advance parameter. Phase 2
			"channelMapping" : {},
	}
}
```
If success : 
```json
{
	"success" : true,
	"message" : "PROJECT_SAVED",
}
```
If error : 
```json
{
	"success" : false,
	"message" : "ERROR_SAVING_PROJECT"
}
```


# SocketIO Service

### This service is to ensure a real-time interaction between Codelabs of the same class 

NAMESPACE : 			/codelab
```json
{
	"
}
```


## Getting the user profile 

```json
#api_accountProfile
GET : /api/v1/profile
{
	"username" : "myemail@gmail.com",
	"token":"ZXlKMGVYQWlPaUpLVjFRaUxDSmhiR2NpT2lKSVV6STFOaUo5LmV5SjFjMlZ5Ym1GdFpTSTZJbEp2WW1WeWRDQlNZWGx0YjI1a1FHZHRZV2xzTG1OdmJTSXNJbVY0Y0NJNk1UVTNNelUxT1RFd05Td2lhV0YwSWpveE5UY3lPVFUwTXpBMWZRLndsdFpYZFdnc3Q1bDhNOFdXeFRtYkNZYkducEdTOXlndFNuYmQ2TzJGZDQ="
}
```
If the token is expired
```json
{
	"success" : False,
	"message" : "WRONG_TOKEN",
	"data" : "", 
	
	// This is for the server to controll the notification
	"toast" : 
	{
		"type" : "error",
		"title" : "Sorry",
		"text" : "Please log in again, your session has expired"
	}
}
```

If success
```json
{
	"success" : True,
	"message" : "USER_LOGGED_IN",
	"data" : 
	{
		"projects" : [ 
			{ 
				"projectName" : "This is my project",
				"owner" : "studentA", 
				"dateCreated" : 1572975838, // Unix Time
				"dateModified" : 1572975900,
				"currentMode"  : "block" or "python",
				"lastModifiedBy" : "studentA",
				// specify that this code is being used
				// by some controller. Appendix A
				"controller" : None or "controllerA",
				"data":{
					"xml" : "XMLSTRUCTURE...",
					"python" : "pythonCode",
					// Advance parameter. Phase 2
					"channelMapping" : {},
			}
			...
		],
		"users" : [
			{
				"username" : "Curly Nguyen",
				"favoriteColour" : "#ff00ff",
				"avatar" : "happy-cat", // use Chrome user avatar
				"lastLoggedIn" : 1572975900,
				"isLoggedIn" : True, //for displaying students status
				"currentController" : None or "controllerA",
				// Phase 2
				"machineInfo": { }
			}, 
			...
		]
	}
	
	// This is for the server to controll the notification
	"toast" : 
	{
		"type" : "success",
		"title" : "Welcome !",
		"text" : "Have a good day"
	}
}
```