{"id":21587007,"url":"https://github.com/pome1lo/modsen-practice","last_synced_at":"2025-03-18T09:20:59.680Z","repository":{"id":248825381,"uuid":"829894092","full_name":"pome1lo/Modsen-practice","owner":"pome1lo","description":"This repository contains a practical task that I perform in my production practice at Modsen","archived":false,"fork":false,"pushed_at":"2024-07-17T07:54:18.000Z","size":58,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-24T15:42:05.185Z","etag":null,"topics":["asp-net-core","c-sharp","git-flow","mvc","wpf"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pome1lo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-07-17T07:50:17.000Z","updated_at":"2024-10-13T11:23:42.000Z","dependencies_parsed_at":"2024-07-17T10:09:52.201Z","dependency_job_id":null,"html_url":"https://github.com/pome1lo/Modsen-practice","commit_stats":null,"previous_names":["pome1lo/modsen-practice"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pome1lo%2FModsen-practice","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pome1lo%2FModsen-practice/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pome1lo%2FModsen-practice/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pome1lo%2FModsen-practice/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pome1lo","download_url":"https://codeload.github.com/pome1lo/Modsen-practice/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244189790,"owners_count":20412991,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["asp-net-core","c-sharp","git-flow","mvc","wpf"],"created_at":"2024-11-24T15:15:30.119Z","updated_at":"2025-03-18T09:20:59.658Z","avatar_url":"https://github.com/pome1lo.png","language":"C#","readme":"# Modsen-practice\n\nhttps://learn.modsen.app/courses\n\n### Project Conventions\n- [This](https://google.github.io/styleguide/csharp-style.html)\n- Significant folders and files names\n- Namespaces in short form: `namespace MyNamespace;`\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003ch2\u003e TASK-1: Калькулятор с поддержкой переменных и функций \u003c/h2\u003e\n\u003c/summary\u003e\n\n \u003cdetails\u003e\n\u003csummary\u003e \u003ch3\u003e Описание \u003c/h3\u003e \u003c/summary\u003e\n\tНеобходимо создать программу, которая будет функционировать как калькулятор\nс поддержкой переменных и пользовательских функций. Программа должна\nпредоставлять пользователю интерфейс для ввода математических выражений,\nкоторые могут содержать числа, операторы (сложение, вычитание, умножение,\nделение), скобки, переменные и пользовательские функции.\n \u003c/details\u003e\n \u003cdetails\u003e\n\t \u003csummary\u003e \u003ch3\u003e Требования \u003c/h3\u003e \u003c/summary\u003e\n1. Напишите программу, которая будет работать как калькулятор, позволяющий\nпользователю выполнять математические операции, а также использовать\nпеременные и определять свои функции. \u003cbr/\u003e\n2. Программа должна предложить пользователю ввести выражение. Выражение\nможет содержать числа, операторы (сложение, вычитание, умножение, деление),\nскобки, переменные и пользовательские функции. \u003cbr/\u003e\n3. Реализуйте парсинг введенного выражения и его вычисление. Поддержите\nобработку ошибок ввода. \u003cbr/\u003e\n4. Для переменных реализуйте возможность их определения и использования.\nНапример, пользователь может ввести \"x = 5\" и затем использовать переменную x\nв дальнейших выражениях. \u003cbr/\u003e\n5. Поддержите определение пользовательских функций. Например, пользователь\nможет определить функцию \"f(x,y) = x+y \" и затем использовать эту функцию в\nдальнейших вычислениях. \u003cbr/\u003e\n6. Обеспечьте возможность работы с дробными числами и отрицательными\nчислами. \u003cbr/\u003e\n7. Предложите пользователю возможность выхода из программы или ввода\nнового выражения после каждого вычисления. \u003cbr/\u003e\n8. Напишите тесты для вашей программы, чтобы убедиться в ее корректной\nработы \u003cbr/\u003e\n \u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e \u003ch3\u003e Project Backlog \u003c/h3\u003e \u003c/summary\u003e \n\n- **интерфейс**\n  \u003cbr/\u003eUI-фреймворк: WPF\n  \n\t 1. основная вкладка:\u003cbr/\u003e\n\t\t -поле ввода выражений(вычисление динамически, т.е. при вводе значения парсер сразу вычисляет выражение, при малейшем изменении значение в поле вывода меняется)\u003cbr/\u003e\n\t\t -поле вывода(при нажатии на поле, вся выведенная информация -перемещается в поле ввода, поле вывода чистится)\u003cbr/\u003e\n\t\t -кнопка с меню ввода переменных\u003cbr/\u003e\n\t\t -кнопка с меню ввода функций\u003cbr/\u003e\n\t 2. меню ввода переменных:\u003cbr/\u003e\n\t\t -поле для ввода имени переменной\u003cbr/\u003e\n\t\t -поле для ввода значения переменной\u003cbr/\u003e\n\t\t -кнопка добавления переменной\u003cbr/\u003e\n\t 3. меню ввода функций:\u003cbr/\u003e\n\t\t -кнопка для добавления полей ввода аргументов\u003cbr/\u003e\n\t\t -поля, добавляемые по кнопке, для ввода аргументов(переменных функции)\u003cbr/\u003e\n\t\t -поле ввода алгоритма функции(Пример: x+y\\*2)\u003cbr/\u003e\n\t\t -поле добавления функции\u003cbr/\u003e\n- **парсер**\n\t 1. парсинг выражения в структуру данных\n\t 2. замена переменных на их значения\n\t 3. замена функций на результат их выполнения\n- **класс вычисления распаршенных данных**\n\t 1. вызывает парсер и получает структуру данных, хранящую выражение\n\t 2. проходится по структуре данных и выполняет вычисления\n\t 3. учитывает порядок операторов и скобок\n\t 4. обработка ошибок(деление на 0 и т.п.)\n- **определение пользовательских переменных**\n\t 1. словарь с ключами и их значениями\n\t 2. проверка повторяющихся ключей и если такой существует - предложить пользователю замену\n- **выполнение пользовательских функций**\n\t 1. словарь с ключами и объектами класса функции\n\t 2. класс функции, содержащий в себе конструктор, принимающий params double\\[\\]\n\t 3. при получении параметров и строки функции - парсит с помощью **парсер** выражение и записывает в переменную результата своё значение.\n- **тесты**\n\t 1. создать тесты для операторов\n  \t 2. создать тесты с различными скобками\n  \t 3. создать тесты с функциями в функциях\n  \t 4. создать тесты с использованием переменных\n  \t 5. создать тесты с передачей переменных в функции\n  \t 6. создать тесты с наложением операторов друг на друга\n - **обработка ошибок**\n\u003c/details\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003ch2\u003e TASK-2: Интернет-магазин на основе ASP.NET Core Web API \u003c/h2\u003e\n\u003c/summary\u003e\n\n\u003cdetails\u003e\n\t\u003csummary\u003e \u003ch3\u003e Описание \u003c/h3\u003e \u003c/summary\u003e\nДанное задание рассчитано на выполнение в течение двух недель. Основной\nцелью проекта является разработка интернет-магазина с использованием ASP.NET\nCore Web API. Проект включает в себя создание функционала для управления\nтоварами, категориями, заказами и элементами заказов в базе данных.\nДополнительно предусмотрен механизм аутентификации пользователей для\nобеспечения безопасности системы.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\t\u003csummary\u003e \u003ch3\u003e Неделя 1 \u003c/h3\u003e \u003c/summary\u003e\n\n#### Разработка структуры и архитектуры.\nПостройте концептуальное решение для вашего проекта, опираясь на N-Layer\nArchitecture. Разделите проект на уровни: Presentation Layer, Business Logic Layer,\nData Access Layer. Начните разработку Data Access Layer, который будет\nобеспечивать взаимодействие с базой данных. **Создайте модели,\nсоответствующие таблицам базы данных, таким как:**\n- Таблица Products: содержит информацию о товарах.\n- Таблица Categories: содержит информацию о категориях товаров.\n- Таблица Orders: содержит информацию о заказах с ссылкой на таблицу Users.\n- Таблица OrderItems: содержит информацию о товарах в каждом заказе с\nссылкой на таблицу Products.\n- Таблица Users: содержит информацию о пользователях.\n\n#### Требования к взаимодействию с базой данных\n- Для работы с базой данных используйте EF Core.\n- Примените подход Code First для создания схемы базы данных.\n- Воспользуйтесь EF Fluent API для конфигурации моделей.\n- Для управления изменениями в схеме базы данных применяйте миграции.\n\n#### Реализация репозиториев\nНачните создавать необходимые репозитории для взаимодействия с базой\nданных. Реализуйте репозитории для товаров, категорий, заказов, товаров в\nзаказах и пользователей. Ожидаемый функционал включает:\n- Создание, чтение, обновление и удаление товаров.\n- Получение списка всех товаров.\n- Получение подробной информации о конкретном товаре по его Id.\n- Получение товаров по определенной категории.\n- Создание, чтение, обновление и удаление категорий.\n- Возможность просмотра всех категорий.\n- Создание новых заказов.\n- Получение списка всех заказов.\n- Получение всех заказов по конкретному пользователю.\n- Получение информации о конкретном заказе по его Id, включая состав\nзаказанных товаров и их количества.\n\n**Асинхронное программирование** Внедрите асинхронное программирование для\nработы с базой данных, используя асинхронные методы в репозиториях для\nобеспечения эффективной и отзывчивой работы с базой данных.\u003cbr/\u003e\n**Начните реализацию Business Logic Layer**. Создайте классы, которые будут\nиспользоваться как входные параметры и выходные данные в сервисах.\nОпределите интерфейсы с методами для всех сервисов на основе этих классов.\nДобавьте валидацию входных параметров (классов) через FluentValidation.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\t\u003csummary\u003e \u003ch3\u003e Неделя 2 \u003c/h3\u003e \u003c/summary\u003e\n\t\nПродолжайте разрабатывать **Business Logic Layer**. Сделайте реализацию всех\nинтерфейсов для сервисов и соответствующих методов. Внутри сервисов\nтщательно проверяйте **корректность входных данных и условий выполнения\nопераций**. В случае обнаружения некорректных данных или отсутствия\nнеобходимых условий, выбрасывайте свои **собственные исключения с четкими\nсообщениями об ошибке**. Например, при попытке аутентификации пользователя,\nесли указанный пользователь не найден, выбрасывайте исключение. Аналогично,\nперед удалением или обновлением модели, проверяйте ее существование, и в\nслучае отсутствия выбрасывайте соответствующее исключение. \u003cbr/\u003e\n\nДобавьте функционал для **регистрации новых пользователей и аутентификации\nпользователей через JWT**. Создайте необходимые сервисы для этих операций,\nвключая мапперы для удобного преобразования классов с похожими данными.\u003cbr/\u003e\n\tЗатем приступите к разработке **Presentation Layer**.\u003cbr/\u003e\n\tВ рамках данного проекта создайте контроллеры с минимальной логикой.\nКонтроллеры должны вызывать соответствующие сервисы и возвращать результат\nклиенту. Все исключительные ситуации, включая ошибки, должны обрабатываться\nчерез глобальный обработчик исключений. Глобальный обработчик должен\nобеспечивать централизованное управление исключениями для всего\nприложения, предоставляя клиенту понятные ошибки.\u003cbr/\u003e\n\t**Настройте созданные валидаторы через FluentValidation**, чтобы они автоматически\nвыполняли валидацию входных параметров при вызове соответствующих\nсервисов. Реализуйте принцип Automatic Validation, где система автоматически\nприменяет валидацию, не требуя явного вызова из кода.\u003cbr/\u003e\n\tУбедитесь, что ваши валидаторы подключены к соответствующим классам входных\nпараметров сервисов. Кроме того, ваши контроллеры в Presentation Layer должны\nавтоматически инициировать валидацию, когда получают запросы от клиента.\u003cbr/\u003e\n\u003c/details\u003e\n\u003c/details\u003e\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpome1lo%2Fmodsen-practice","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpome1lo%2Fmodsen-practice","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpome1lo%2Fmodsen-practice/lists"}