Створити можливість описувати довільні сутності з атрибутами та валідацією для цих атрибутів (відношення між атрибутами і сутностями many-to-many). Описання повинно бути реалізовано за допомогою DSL або конфігураційного об'єкту (наприклад yaml). Реалізувати CRUD по цим об'єктам через REST.
Наприклад, описання сутності Person
з атрибутами може виглядати у DSL так
define('attribute', 'firstName')
.validation({ required: true })
define('attribute', 'lastName')
.validation({ required: true })
define('attribute', 'age')
.type('int')
.validation({ min: 1, max: 120 })
define('attribute', 'email')
.validation({ email: true })
define('entity', 'Person')
.has('firstName')
.has('lastName')
.has('age')
.hasMany('email') // може мати багато емейлів
CRUD по сутності може виглядати так:
const person = new Entity('Person', {
firstName: 'John',
lastName: 'Doe',
age: 10,
email: [ // only unique emails
'[email protected]',
'[email protected]'
]
})
person.validate() // validates all attributes if something is wrong throws exception
person.save() // saves person into db
// Update
person.firstName = 'Bred'
person.save()
// Delete
Entity.destroy('Person', personId)
// Read
Entity.findById('Person', personId)
Entity.findAll('Person')
- Тестове завдання дається для того, щоб Ви могли проявити свої знання, показати, що Ви розбираєтесь в best practices, знаєте шаблони програмування, та можете зробити задачу від початку до кінця із свідомим вибором рішень. Бо вибрані рішення так чи інакше доведеться пояснювати. Тому зробіть це завдання як найкраще! Бажаю успіхів ;)
- Структурність рішення і підходів, код має бути прозорим.
- Використовувати SQL базу данних (ми використовуємо PostgreSQL)
- Повинна бути можливість змінювати схему сутностей без зміни схеми бази данних (реалізувати спрощений варіант:
грубо флов такий - почистили базу, засідували структуру через DSL,
хочемо змінити DSL - чистимо базу і знову сідуємо). Важливо розбиратись в EAV та знати її плюси, а не орієнтуватись на те що пишуть в інтернеті про anti-pattern-и (це інструмент і як будь-який інструмент, має своє призначення) - Використання шаблонів програмування і SOLID
- Якщо передавати атрибути, які не існують в описанні сутності викидується exception
- Правильно обробляти помилки, відділяти помилки клієнта і сервера
- REST API повинен слідувати best practices включаючи правильну видачу статус кодів
- Взяти до уваги вирішення конфліктів, коли АРІ користується декілька людей одночасно і пробують оновити одну і ту ж сутність приблизно в той самий час
- Зберігати історію по змінах сутностей
- Мати можливість отримати стан довільної сутності/сутностей за вказаний проміжок часу
- Повинна бути реалізована валідація атрибутів