# User-Mobile
# Retrieves all unavailable slot for a facility for a date sorted by the earliest to latest unavailable slot
## Request format:
```
GET /api/facility/{facilityID}/date/{date}/unavailableslots
Authorization: Bearer {jwt_token}
```
## Response format
### With data found
```
HTTP 200 OK
Content-Type: application/json
{
"data":{
"bookings":[
{
"type":"BOOKING",
"booking_id":"{bookingID}",
"start_datetime": "{bookingStartTime}",
"end_datetime":"{bookingEndTime}",
"booking_name":"{bookingName}",
"booking_contact": "{bookingContact}",
"booker_name":"{bookerName}",
"booking_status":"{bookingStatus}",
"facility":{
"facility_id":"{facilityID}",
"facility_name":"{facilityName}"
}
},
{
"type":"BOOKING",
"booking_id":"{bookingID}",
"start_datetime": "{bookingStartTime}",
"end_datetime":"{bookingEndTime}",
"booking_name":"{bookingName}",
"booking_contact": "{bookingContact}",
"booker_name":"{bookerName}",
"booking_status":"{bookingStatus}",
"facility":{
"facility_id":"{facilityID}",
"facility_name":"{facilityName}"
}
},
{
"type":"MAINTENANCE",
"maintenance_id":"{maintainanceid}",
"start_datetime": "{startDatetime}",
"end_datetime":"{bookingEndTime}",
"facility":{
"facility_id":"{facilityID}",
"facility_name":"{facilityName}"
}
},
{
"type":"MAINTENANCE",
"maintenance_id":"{maintainanceid}",
"start_datetime": "{startDatetime}",
"end_datetime":"{bookingEndTime}",
"facility":{
"facility_id":"{facilityID}",
"facility_name":"{facilityName}"
}
}
],
}
}
```
### With no data found
```
HTTP 404 Not Found
Content-Type: application/json
{
"error":{
"message":"No unavailable event slots"
}
}
```
# Retrieve all pending bookings for facility and date
```
GET /api/facility/{facilityID}/date/{date}/bookings/pending
Content-Type: application/json
{
"data":{
"pending_bookings":[
{
"booking_id":"{bookingID}",
"start_datetime": "{bookingStartTime}",
"end_datetime":"{bookingEndTime}",
"booking_name":"{bookingName}",
"booking_contact": "{bookingContact}",
"booker_name":"{bookerName}",
"booking_status":"{bookingStatus}",
"facility":{
"facility_id":"{facilityID}",
"facility_name":"{facilityName}"
}
},
{
"booking_id":"{bookingID}",
"start_datetime": "{bookingStartTime}",
"end_datetime":"{bookingEndTime}",
"booking_name":"{bookingName}",
"booking_contact": "{bookingContact}",
"booker_name":"{bookerName}",
"booking_status":"{bookingStatus}",
"facility":{
"facility_id":"{facilityID}",
"facility_name":"{facilityName}"
}
}
]
}
}
```
# Retrieves all bookings of a user.
## Request format
```
GET /api/bookings
Authorization: Bearer {jwt_token}
```
## Response format
### With bookings found
```
HTTP 200 OK
Content-Type: application/json
{
"data":{
"bookings":[
{
"booking_id":"{bookingID}",
"start_datetime": "{bookingStartTime}",
"end_datetime":"{bookingEndTime}",
"booking_name":"{bookingName}",
"booking_contact": "{bookingContact}",
"booker_name":"{bookerName}",
"booking_status":"{bookingStatus}",
"facility":{
"facility_id":"{facilityID}",
"facility_name":"{facilityName}"
}
},
{
"booking_id":"{bookingID}",
"start_datetime": "{bookingStartTime}",
"end_datetime":"{bookingEndTime}",
"booking_name":"{bookingName}",
"booking_contact": "{bookingContact}",
"booker_name":"{bookerName}",
"booking_status":"{bookingStatus}",
"facility":{
"facility_id":"{facilityID}",
"facility_name":"{facilityName}"
}
},
]
}
}
```
### No Data found
```
HTTP 404 Not Found
{
"error":{
"message":"No bookings found"
}
}
```
# Retrieves a particular booking information
## Request
```
GET /api/booking/{bookingID}
Authorization: Bearer {jwt_token}
```
## Response
### Data found
```
Authorization: Bearer {jwt_token}
Content-Type: application/json
{
"data":{
"booking":{
"booking_id":"{bookingID}",
"start_datetime": "{bookingStartTime}",
"end_datetime":"{bookingEndTime}",
"booking_name":"{bookingName}",
"booking_contact": "{bookingContact}",
"booker_name":"{bookerName}",
"booking_status":"{bookingStatus}",
"facility":{
"facility_id":"{facilityID}",
"facility_name":"{facilityName}"
}
},
}
}
```
### Data not found
```
HTTP 404 Not Found
Content-Type: application/json
{
"error":{
"message":"Booking not found"
}
}
```
# Retrieves all facilities
## Request Format
```
GET /api/facilities
```
## Response Format
### With data found
```
HTTP 200 OK
{
"data":{
"facilities":[
{
"facility_id":"1",
"facility_name":"Sports Hall"
},
{
"facility_id":"2",
"facility_name":"Sports Hall 2"
},
{
"facility_id":"3",
"facility_name":"Sports Hall 3"
}
]
}
}
```
### with no data found
```
HTTP 404 Not Found
Content-Type: application/json
{
"error":{
"message":"No facilities found"
}
}
```
# First factor Login
## Request format
```
POST /api/login
{
"username":"{username}",
"password":"{password}"
}
```
## Response format
`phone_number` registered phone number.
### Username and password found
```
HTTP 200 OK
{
"data":{
"phone_number":"82738213",
"user_id": "3"
}
}
```
### Username or password not found
```
HTTP 404 Not Found
Content-Type: application/json
{
"error":{
"message": "Account Not Found"
}
}
```
# Request JWT
This api should return a jwt after validating the input verificationid with firebase server.
## Request
```
POST /api/jwt
Content-Type: application/json
{
"verification_id":"{verification_id}",
"user_id": "3"
}
```
## Response
### Success
```
HTTP 200 OK
Content-Type: application/json
{
"data":{
"token":"token",
"default_password":false,
"user":{
"user_id": 6,
"full_name": {fullName},
"username": {userName},
"phone_number": {phoneNumber},
"number_of_booking_cancellation": {numberOfCancellation}
}
}
}
```
### User still using default password
```
HTTP 200 OK
Content-Type: application/json
{
"data":{
"token":"token",
"default_password":true,
"user":{
"user_id": 6,
"fullName": {fullName},
"userName": {userName},
"phoneNumber": {phoneNumber},
"numberOfConfirmedBookingCancellation": {numberOfCancellation}
}
}
}
```
### Cannot be verified on firebase
```
HTTP 404 Not Found
Content-Type: application/json
{
"error":{
"message":"User not authenticated"
}
}
```
### User not did not perform first factor login
```
HTTP 401 Unauthorized
Content-Type: application/json
{
"error":{
"message":"Requires login first"
}
}
```
# Delete a booking
## Request format
```
DELETE /api/bookings/{bookingID}
```
## Response format
### Booking found and deleted
```
HTTP 200 OK
Content-Type: application/json
{
"data":{
"status":"deleted"
}
}
```
### Booking not found
```
HTTP 404 Not Found
Content-Type: application/json
{
"error":{
"message":"Booking not found"
}
}
```
# Update Password
## Request
```
POST /password
{
userID: {userID}
userName: {userName},
password: {password}
}
```
## Response success
```
HTTP 200 OK
Content-Type: application/json
{
"data":{
"token":"token"
}
}
```
## Response fail password in wrong format
```
HTTP 422 Unprocessable Entity
{
"password": [
"Password does not meet the criteria of minimum length of 8 and minimum 1 lower cased, 1 upper case and must contain at least a number."
]
}
```
## Response fail
```
HTTP 404 Not Found
{
"error": {
"message": "Update password not required"
}
}
```
# Register FCM token
## Request
```
POST /fcm/token
Authorization: Bearer {jwttoken}
{
"token":"{fcmtoken}"
}
```
## Response
```
HTTP 200 OK
```
# Make booking
## Request
```
POST /api/bookings
Authorization: Bearer {jwttoken}
{
"booking_name":"booking name",
"facility_id": 4,
"start_datetime": "2019-08-13 00:59:00",
"end_datetime": "2019-08-14 00:59:00"
}
```
## Response
Returns the created record if success
```
HTTP 201 Created
Content-Type: application/json
{
"data":{
"booking":{
"booking_id":"{bookingID}",
"start_datetime": "{bookingStartTime}",
"end_datetime":"{bookingEndTime}",
"booking_name":"{bookingName}",
"booking_contact": "{bookingContact}",
"booker_name":"{bookerName}",
"booking_status":"PENDING",
"facility":{
"facility_id":"{facilityID}",
"facility_name":"{facilityName}"
}
},
}
}
}
```
# Get all full booking dates
Returns the unavailable dates for a month
## Request
```
GET /facility/{facilityID}/startdate/{startdate}/enddate/{enddate}/unavailabledays
```
## Response
### With Data found
```
HTTP 200 OK
{
"data":{
"unavailable_days":[
"datestring",
"datestring",
"datestring",
"datestring"
]
}
}
```
### With no data found
```
HTTP 404 Not Found
{
"error":{
"message":"No unavailable dates"s
}
}
```
# Update Username
Update username of user. New username can be the same as old one.
## Request
```
PUT /username
Content-Type: application/json
{
"user_name":"new_username"
}
```
## Response
### Success
```
HTTP 200 OK
Content-Type: application/json
{
"data":{
"user":{
"user_id": 6,
"full_name": {fullName},
"user_name": {new user name},
"phone_number": {phoneNumber},
"number_of_booking_cancellation": {numberOfCancellation}
}
}
}
```
### Failure
#### Username not found
```
HTTP 404 Not Found
Content-Type: application/json
{
"error":{
"message": "username not found"
}
}
```
#### Username alr exist
```
HTTP 409 Conflict
Content-Type: application/json
{
"error":{
"message":"Username already exists"
}
}
```
# Change Password
This is different from Update Password where change password requires user to provide the current password to authenticate himself before changing to a new password. Success of this operation should immediately invalidate the old jwt.
## Request
```
PUT /password
{
"old_password":"oldpassword"
"new_password":"new password"
}
```
## Response
### Success
```
HTTP 200 OK
Content-Type: application/json
{
"data":{
"token":"token",
"default_password":false,
"user":{
"user_id": 6,
"full_name": {fullName},
"username": {userName},
"phone_number": {phoneNumber},
"number_of_booking_cancellation": {numberOfCancellation}
}
}
}
```
### Failure
#### Wrong Password
```
HTTP 404 Not Found
Content-Type: application/json
{
"error":{
"message": "Wrong password"
}
}
```
# Logout
## Request
```
DELETE /logout
```
## Response
### Success
```
{
"data":{
"message":"Successfully logged out"
}
}
```
# Forget password
## Request
```
POST /passwordreset
{
"user_name":"username"
}
```
## Response
```
HTTP 200 OK
{
"data":{
"status":"Resetted",
"message":"Password reset request has been submitted"
}
}
```
# FCM PAYLOAD STRUCTURE
## Approved notification
```
{
"to":"fRyERNOIOfA:APA91bFbLFjSdd7i876AZN1xJDF6Mm-CywyCTAjsaA2SRy_Py8KOvlwdI1ZY8Ugk915hBA9JO6O3T-ZZ6wx0vdqduhoefWJETZYI-NuLjOe3A9mredoqYN4SGZ-y7IdniLts4Mv8OAGz",
"priority" : "normal",
"notification" : {
"body" : "Your Booking has been accepted!",
"title": "Booking status for {facilityname} on {date}"
},
"data" : {
"click_action":"FLUTTER_CLICK_NOTIFICATION",
"booking_id":3,
"subject": "BOOKING_STATUS_UPDATE",
"status" : "APPROVED",
}
}
```
## REJECTED NOTIFICATION
```
{
"to":"fRyERNOIOfA:APA91bFbLFjSdd7i876AZN1xJDF6Mm-CywyCTAjsaA2SRy_Py8KOvlwdI1ZY8Ugk915hBA9JO6O3T-ZZ6wx0vdqduhoefWJETZYI-NuLjOe3A9mredoqYN4SGZ-y7IdniLts4Mv8OAGz",
"priority" : "normal",
"notification" : {
"body" : "Your Booking has been accepted!",
"title": "Booking status for {facilityname} on {date}"
},
"data" : {
"click_action":"FLUTTER_CLICK_NOTIFICATION",
"booking_id":3,
"subject": "BOOKING_STATUS_UPDATE",
"status" : "REJECTED",
"booking_facility_name":"Facility Name",
"booking_start_date":"123",
"booking_end_date":"456"
}
}
```