Dmitriy Liakhov [email protected]
Розробити Appointment API для онлайн університету, в якому буде 2 ролі: викладач та студент.
- Викладач :
- може вказувати коли і скільки часу він доступний для індивідуальних занять
- може вказувати ціну за певну к-сть часу. Наприклад 15 хв коштують 30$, 30 хв = 55$, 60 хв = 100$
- може підтверджувати або відхиляти участь студентів (approve/decline)
- Студент :
- може зарезервувати певний час
- може скасувати резервацію
- Система повинна мати :
- REST Api для реєстрації, логування користувача (JWT token)
- REST Api Апі для викладача
- REST Api Апі для студента
- Логіку та Валідацію даних
- Збереження даних в БД
- REST Api для реєстрації, логування користувача (JWT token)
- Мінімально необхідні валідації даних :
- Чи поля об’єкта не пусті
- Чи dateFrom < dateTo
- і т.д.
- Технічний стек :
- Java 8
- Spring Boot 2.2.* (Security, MVC, Data Jpa)
- SQL
- Maven 3.6.*
- Как зупустить проект?
- Скачать репозиторий
- Создать SQL базу
- В файле application.properties внести зміни
- spring.datasource.url =jdbc:mysql://localhost:3306/[імя SQL бази]?serverTimezone=UTC
- spring.liquibase.url=jdbc:mysql://localhost:3306/[імя SQL бази]?serverTimezone=UTC
- spring.datasource.username=[SQL username]
- spring.liquibase.user=[SQL username]
- spring.datasource.password=[SQL password]
- spring.liquibase.password=[SQL password]
- P.S: База повинна бути пустою.
- Метод POST
- http://localhost:{yourPort}/api/registration
- Тіло запиту, приклад:
{
"username":"Ivan",
"firstName":"Ivanovich",
"lastName":"Ivanov",
"email":"[email protected]",
"password":"verySecurePassword",
"role":"STUDENT"
}
- Відповідь:
{
"user Ivan": "Registration successful: User{username='Ivan', firstName='Ivanovich', lastName='Ivanov', email='[email protected]', money='0', password='[password for encryption via bcrypt]'}"
}
- Метод POST
- http://localhost:{yourPort}/api/login
- Тіло запиту, приклад:
{
"username":"Ivan",
"password":"verySecurePassword"
}
- Відповідь:
{
"username": "Ivan",
"token": "[token]"
}
- Отриманий "token" потрібно буде додавати в "Header" в "Authorization" з додаванням в початок токену "Bearer_". Приклад "Header":
[
{
"key":"Authorization",
"value":"Bearer_[token]",
"description":"",
"type":"text",
"enabled":true
}
]
- Метод Get
- http://localhost:{yourPort}/api/{id}
- Header:
[
{
"key":"Authorization",
"value":"Bearer_[token]",
"description":"",
"type":"text",
"enabled":true
}
]
- Відповідь:
{
"id": 2,
"username": "teacher",
"firstName": "FirstNameT",
"lastName": "LastNameT",
"email": "[email protected]"
}
- Метод POST
- http://localhost:{yourPort}/api/student/create
- Header:
[
{
"key":"Authorization",
"value":"Bearer_[token]",
"description":"",
"type":"text",
"enabled":true
}
]
- Тіло запиту, приклад:
{
"dateStart":"2020-01-24 00:00",
"dateEnd":"2020-01-24 00:01",
"price":"24",
"idTeacher":"2"
}
- Відповідь:
{
"msg": "The lesson was created by - Ivan; he chose a teacher - teacher",
"timeEnd": "2020-01-24 00:00",
"timeStart": "2020-01-24 00:01"
}
- Метод Get
- http://localhost:{yourPort}/api/student/myLessons
- Header:
[
{
"key":"Authorization",
"value":"Bearer_[token]",
"description":"",
"type":"text",
"enabled":true
}
]
- Відповідь:
{
"msg": [
{
"id": 1,
"created": "2020-01-23 00:00",
"updated": "2020-01-23 00:00",
"status": "ACTIVE",
"idTeacher": 2,
"dateStart": "2020-01-24 00:00",
"dateEnd": "2020-01-24 00:01",
"price": 24
}
]
}
- Метод POST
- http://localhost:{yourPort}/api/student/myLessons
- Header:
[
{
"key":"Authorization",
"value":"Bearer_[token]",
"description":"",
"type":"text",
"enabled":true
}
]
- Тіло запиту, приклад:
[
1,
2
]
- Відповідь:
{
"lesson 1": "Now the status is this: NOT_ACTIVE",
"lesson 2": "Now the status is this: NOT_ACTIVE"
}
- Метод Get
- http://localhost:{yourPort}/api/student/teacher
- Header:
[
{
"key":"Authorization",
"value":"Bearer_[token]",
"description":"",
"type":"text",
"enabled":true
}
]
- Відповідь:
{
"Available teacher 'teacher'": "His id: 2"
}
- Метод Get
- http://localhost:{yourPort}/api/student/teacher/{id}
- Header:
[
{
"key":"Authorization",
"value":"Bearer_[token]",
"description":"",
"type":"text",
"enabled":true
}
]
- Відповідь:
{
"Teacher: 'teacher'; His id 2": {
"Price 1": "Time 60 minutes; Price: 55"
}
}
- Метод Get
- http://localhost:{yourPort}/api/teacher/offers
- Header:
[
{
"key":"Authorization",
"value":"Bearer_[token]",
"description":"",
"type":"text",
"enabled":true
}
]
- Відповідь:
{
"msg": [
{
"id": 6,
"created": "2020-01-24 00:00",
"updated": "2020-01-24 00:00",
"status": "CONSIDERATION",
"idTeacher": 2,
"dateStart": "2020-01-25 00:00",
"dateEnd": "2020-01-25 00:01",
"price": 24
}
]
}
- Метод POST
- http://localhost:{yourPort}/api/teacher/offers
- Header:
[
{
"key":"Authorization",
"value":"Bearer_[token]",
"description":"",
"type":"text",
"enabled":true
}
]
- Тіло запиту, приклад:
[
{
"lessonId":[
1,
2
],
"status": "CONSIDERATION"
}
]
- Відповідь:
{
"lesson 1": "Now the status is: NOT_ACTIVE",
"lesson 2": "Now the status is: NOT_ACTIVE"
}
- Метод POST
- http://localhost:{yourPort}/api/teacher/add
- Header:
[
{
"key":"Authorization",
"value":"Bearer_[token]",
"description":"",
"type":"text",
"enabled":true
}
]
- Тіло запиту, приклад:
[
{
"timeStart": "2020-01-24 08:30",
"timeEnd": "2020-01-24 09:00"
},
{
"timeStart": "2020-01-25 08:30",
"timeEnd": "2020-01-25 09:00"
}
]
- Відповідь:
{
"msg": "Available time was add!",
"interval 0": "Start: 2020-01-24 08:30; End: 2020-01-24 09:00",
"interval 1": "Start: 2020-01-25 08:30; End: 2020-01-25 09:00"
}
- Метод POST
- http://localhost:{yourPort}/api/teacher/addToPriceList
- Header:
[
{
"key":"Authorization",
"value":"Bearer_[token]",
"description":"",
"type":"text",
"enabled":true
}
]
- Тіло запиту, приклад:
{
"time":"60",
"price":"100"
}
- Відповідь:
{
"price": {
"time": 60,
"price": 100
}
}
- Метод Get
- http://localhost:{yourPort}/api/teacher/myPriceList
- Header:
[
{
"key":"Authorization",
"value":"Bearer_[token]",
"description":"",
"type":"text",
"enabled":true
}
]
- Відповідь:
{
"Prices": {
"Price 0": "Time 60 minutes; Price: 100",
},
"My username": "teacher"
}
- Метод POST
- http://localhost:{yourPort}/api/teacher/myPriceList
- Header:
[
{
"key":"Authorization",
"value":"Bearer_[token]",
"description":"",
"type":"text",
"enabled":true
}
]
- Тіло запиту, приклад:
[
1
]
- Відповідь:
{
"Price 1": "Now the status is this: NOT_ACTIVE"
}
- При першому запуску, вони автоматично будуть додані як і таблиці.
[
{
"user":[
{
"username":"student",
"money":"0",
"email":"[email protected]",
"first_name":"FirstNameS",
"last_name":"LastNameS",
"password":"$2b$10$mY8.DORMnmctP1g8Rc9TlOk9sucv2uDefMe11eN1d556EG7vCqMSO",
"created":"2020-01-01 12:12:12",
"updated":"2020-01-01 12:12:12",
"status":"ACTIVE"
},
{
"username":"teacher",
"money":"0",
"email":"[email protected]",
"first_name":"FirstNameT",
"last_name":"LastNameT",
"password":"$2b$10$mY8.DORMnmctP1g8Rc9TlOk9sucv2uDefMe11eN1d556EG7vCqMSO",
"created":"2020-01-01 12:12:12",
"updated":"2020-01-01 12:12:12",
"status":"ACTIVE"
},
{
"username":"admin",
"money":"0",
"email":"[email protected]",
"first_name":"FirstNameA",
"last_name":"LastNameA",
"password":"$2b$10$mY8.DORMnmctP1g8Rc9TlOk9sucv2uDefMe11eN1d556EG7vCqMSO",
"created":"2020-01-01 12:12:12",
"updated":"2020-01-01 12:12:12",
"status":"ACTIVE"
}
],
"role":[
{
"name":"ROLE_STUDENT",
},
{
"name":"ROLE_TEACHER",
},
{
"name":"ROLE_ADMIN",
}
],
"role_user":[
{
"user_id":"1",
"role_id":"1",
},
{
"user_id":"2",
"role_id":"2",
},
{
"user_id":"3",
"role_id":"3",
}
]
}
]
- Перевірка тайм слотів на перетин між собою та на унікальність
- Написати тести