Skip to content

lexxai/it-marathon-v4-net-workshop

Repository files navigation

Якщо ви хочете підняти локально базу даних та Blob Storage то слідуйте інструкціям поданим нижче.

В директорії з docker-compose файлом (файл прикріплено нижче) запускаєте команду: docker-compose up -d Щоб зупинити контейнер: docker compose stop Щоб зупинити і повністю видалити контейнер: docker-compose down -v

Для доступу до бази я рекомендую скачати DBeaver. Це універсальний інструмент для роботи з різними СУБД.

Інструкція по налаштуванню DBeaver

Крок 1: Встановлення DBeaver

  1. Якщо у вас ще не встановлено DBeaver, ви можете завантажити його з офіційного сайту DBeaver.
  2. Встановіть DBeaver згідно з інструкціями для вашої операційної системи.

Крок 2: Створення нового з'єднання

  1. Запустіть DBeaver.
  2. Перейдіть до Database > New Database Connection.
  3. Виберіть MySQL зі списку доступних баз даних.
  4. Натисніть Next.

Крок 3: Конфігурація з'єднання

  1. У полі Host введіть localhost.
  2. У полі Port введіть 3306 (це стандартний порт для MySQL).
  3. У полі Database введіть назву вашої бази даних, наприклад ItMarathonDb.
  4. У полі User name введіть TestUser (ім'я користувача за замовчуванням, вказане у docker-compose файлі).
  5. У полі Password введіть 123 (пароль за замовчуванням, вказаний у docker-compose файлі).

Крок 4: Налаштування додаткових параметрів

  1. Перейдіть до вкладки Driver Properties або Connection properties.
  2. Знайдіть параметр allowPublicKeyRetrieval і встановіть його значення на true. Це необхідно для уникнення помилок підключення, пов'язаних з аутентифікацією.

Крок 5: Тестування з'єднання

  1. Натисніть Test Connection, щоб перевірити, чи можна успішно підключитися до бази даних.
  2. Якщо з'єднання успішне, натисніть Finish. Connection String: Server=localhost;Port=3306;Database=ItMaraphonDb;Uid=TestUser;Pwd=123;

Локальний запуск

  1. Запустити docker-compose
  2. Під'єднатися до БД, створити тестового користувача і access token для нього.
  3. Відкрити солюшн в Visual Studio
  4. Зробити проект ItMarathon.Api стартовим і запустити Якщо все пройшло успішно повинен відкритися браузер зі сторінкою сваггера
  5. Введіть створений access token в Authorize на сторінці сваггера.
  6. Можна викликати будь-які ендпоінти через сваггер.

Приклад JSON для створення оголошення

{ "isActive": true, "petOrigin": 1, "title": "Кіт Програміст", "price": 0, "summary": "", "location": "Україна", "age": 1, "ageUnits": 0, "photos": [{"image": "data:image/jpeg;base64,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"}], "properties": [ { "id": 1, "propertyDefinition": { "id": 1, "name": "Вид тварини", "propertyDefinitionType": 0, "isMandatory": true, "propertyValues": [] }, "predefinedValue": { "id": 2, "value": "Коти" } }, { "id": 2, "propertyDefinition": { "id": 2, "name": "Різновид", "propertyDefinitionType": 0, "isMandatory": true, "propertyValues": [] }, "predefinedValue": { "id": 46, "value": "Британська короткошерста", "parentPropertyValue": { "id": 2, "value": "Коти" } } }, { "id": 3, "propertyDefinition": { "id": 3, "name": "Стать", "propertyDefinitionType": 0, "isMandatory": true, "propertyValues": [] }, "predefinedValue": { "id": 8, "value": "Хлопчик" } } ] }


Інструкція по налаштуванню з'єднань з Azure

Коли ви задеплоїте проект в Azure (частина DevOps Марафону), щоб з'єднати локальний проект з базою даних і Blob Storage в Azure вам потрібно змінити наступні налаштунки:

База даних:

ItMarathon.Api\appsettings.Development.json
"ConnectionStrings": { "DefaultConnection": "Взяти з БД MySQL в Azure" }

Blob Storage:

ItMarathon.Api\appsettings.Development.json
"AzureBlobStorageConfig": { "ConnectionString": "Взяти з Azure Storage Account - Blob", }

HOME WORK

Завдання

Реалізувати REST endpoint отримання оголошень з фільтруванням, сортуванням і посторінковим завантаженням.

В ProposalsController реалізувати метод:

public async Task<ActionResult<DataPage<ProposalDto>>> GetAllProposals(
  [FromQuery(Name = "$top")] int? top,
  [FromQuery(Name = "$skip")] int? skip,
  [FromQuery(Name = "$filter")] string? filter,
  [FromQuery(Name = "$orderby")] string? orderby)

Цей метод повинен зчитувати з бази даних оголошення, використовуючи надані параметри:

  • top - повертає тільки задану кількість перших записів
  • skip - пропускає задану кількість записів
  • filter - фільтрує записи (формат фільтра OData)
  • orderby - сортує записи (формат сортування OData)

Додатково до цього повинна вираховуватись загальна кількість записів, що проходить фільтр.

Це потрібно для вирахування кількості сторінок посторінкового завантаження.

Написання юніт тестів для цієї функціональності буде плюсом.

Реалізація

Apps:

  • Docker
  • Visual Studio Code
  • DBeaver
  • Postman

Visual Studio Code Extensions:

  • C# Dev Kit
  • .NET Install Tool (.NET SDK 8.0)

VS Code SQL LOG

Результат

Database structure: DataBase Swagger: swagger 1 swagger 21 Image result: alt text Postman request $filter=Age eq 1 AND AgeUnits eq 1: alt text Postman request $filter=Age eq 1 AND AgeUnits eq 0: alt text

TotalCount

    public async Task<ActionResult<DataPage<ProposalDto>>> GetAllProposals(
        [FromQuery(Name = "$top")] int? top = 20,
        [FromQuery(Name = "$skip")] int? skip = 0,
        [FromQuery(Name = "$filter")] string? filter = "",
        [FromQuery(Name = "$orderby")] string? orderby = "Id asc")
    {
        var (proposals, totalCount) = await proposalService.GetAllProposalsAsync(Request);
        var dataPage = new DataPage<ProposalDto>(proposals, totalCount);
        return Ok(dataPage);
    }

totalCount

About

EPAM. Marathon 2024. Section .NET for Backend.

Topics

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages