Skip to content

Instantly share code, notes, and snippets.

@stalniy
Last active April 8, 2019 06:59
Show Gist options
  • Save stalniy/2bf85b78b4c76bcf69ec6a252af973e1 to your computer and use it in GitHub Desktop.
Save stalniy/2bf85b78b4c76bcf69ec6a252af973e1 to your computer and use it in GitHub Desktop.
Backend js test task

Backend Тестове завдання

Створити можливість описувати довільні сутності з атрибутами та валідацією для цих атрибутів (відношення між атрибутами і сутностями 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')

Основні вимоги

  1. Тестове завдання дається для того, щоб Ви могли проявити свої знання, показати, що Ви розбираєтесь в best practices, знаєте шаблони програмування, та можете зробити задачу від початку до кінця із свідомим вибором рішень. Бо вибрані рішення так чи інакше доведеться пояснювати. Тому зробіть це завдання як найкраще! Бажаю успіхів ;)
  2. Структурність рішення і підходів, код має бути прозорим.
  3. Використовувати SQL базу данних (ми використовуємо PostgreSQL)
  4. Повинна бути можливість змінювати схему сутностей без зміни схеми бази данних (реалізувати спрощений варіант: грубо флов такий - почистили базу, засідували структуру через DSL,
    хочемо змінити DSL - чистимо базу і знову сідуємо). Важливо розбиратись в EAV та знати її плюси, а не орієнтуватись на те що пишуть в інтернеті про anti-pattern-и (це інструмент і як будь-який інструмент, має своє призначення)
  5. Використання шаблонів програмування і SOLID
  6. Якщо передавати атрибути, які не існують в описанні сутності викидується exception
  7. Правильно обробляти помилки, відділяти помилки клієнта і сервера
  8. REST API повинен слідувати best practices включаючи правильну видачу статус кодів

Бонус (можна усно)

  1. Взяти до уваги вирішення конфліктів, коли АРІ користується декілька людей одночасно і пробують оновити одну і ту ж сутність приблизно в той самий час
  2. Зберігати історію по змінах сутностей
  3. Мати можливість отримати стан довільної сутності/сутностей за вказаний проміжок часу
  4. Повинна бути реалізована валідація атрибутів
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment