Skip to content

Instantly share code, notes, and snippets.

@stalniy
Last active October 7, 2019 19:10
Show Gist options
  • Save stalniy/54948199db84f0f8b006759c4c980110 to your computer and use it in GitHub Desktop.
Save stalniy/54948199db84f0f8b006759c4c980110 to your computer and use it in GitHub Desktop.
Task for Senior .NET developer

Завдання

У систему приходить структурована інформація, але її типи не можуть бути визначені на етапі розробки. Типи об'єктів, як і самі дані додаються через API.

Необхідно

  1. Створити API-сервіс, який дозволяє працювати з сутностями будь-яких типів.
  2. Реалізувати CRUD для типів сутностей. Наприклад, створимо тип Person, з атрибутами name, age та workIn (workIn - це посилання на інший тип, Organization - має 1 атрибут name): POST /api/types/person
    {
      "name": "Person",
      "attributes": {
        "name": { "type": "string" }, 
        "age": { "type": "integer" },
        "workIn": { "type": "Organization" }
      }
    }
  3. Реалізувати CRUD (create, read, update, delete) сутностей і читання всієї колекції. Атрибути, яких не має в сутності не повинні прийматись.
  4. Запит POST /api/entities/person повинен створити сутність Person з атрибутами name, age:
{
  "name": "Тарас Шевченко",
  "age": "33"
}

Для лінкування організації використовується id:

{
  "name": "Тарас Шевченко",
  "age": "33",
  "workIn": "5"
}
  1. Запит GET /api/entities/person повинен повернути всіх Person-ів

Примітка: URL-и та структура JSON не принципова, можна змінювати якщо треба

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

  1. Покажи на що здатний, похизуйся (best practices, SOLID, GoF), але знай міру ;)
  2. ASP .NET Core
  3. Логіка в коді має бути прозорою
  4. Використовуй SQL базу данних (ми використовуємо PostgreSQL)
  5. Використовуй EAV структуру таблиць
  6. Правильно обробляй помилки
  7. REST API повинен слідувати best practices включаючи правильну видачу статус кодів

Окремо зверну увагу

  1. "Охайність" коду, інструкція по запуску
  2. Назва змінних
  3. Скільки запитів іде в базу при збереженні і вибірці
  4. Чи оптимізована база під read чи під write яким чином?

Що робити не можна?

  1. Створювати динамічно таблички або view не можна.

Бонус пойнти

  1. Додати можливість валідувати атрибути, бажано щоб це розширялось легко (e.g., required, maxlength, minlength)
  2. Додати підтримку типізації атрибутів (integer, datetime, geoPoint, etc)
  3. Зробити НЕ на Entity Framework
  4. Зробити можливість створювати сутність з пов'язаною сутністю в одній транзакції:

POST /api/entities/person

{
  "name": "Тарас Шевченко",
  "age": "33",
  "workIn": {
    "name": "Університет мовних наук"
  }
}

Даний запит створює Person, Organization і зв'язує їх між собою

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment