Skip to content

DenUP/network

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

25 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

network – клиентская библиотека для Matule 2026

Dart SDK Powered by PocketBase Профессионалы 2026

Библиотека для взаимодействия с API сервера мобильного приложения Matule 2026, разрабатываемого в рамках чемпионата «Профессионалы». Предоставляет готовые сервисы и модели данных для работы с бэкендом на базе PocketBase.

📦 Возможности

  • ⚡️ Основана на мощном HTTP-клиенте dio.
  • 🧩 Модели данных генерируются с помощью freezed – иммутабельность и удобная сериализация JSON.
  • 🔐 Автоматическое добавление JWT-токена в заголовки после аутентификации.
  • 🖼️ Загрузка файлов через multipart/form-data (например, изображения для проектов).
  • ✅ Интеграционные тесты, проверяющие работу с реальным сервером.
  • 🧱 Чёткое разделение на сервисы по функциональным модулям.

🔧 Требования

  • Dart SDK >=3.0.0
  • Flutter (только для запуска тестов)
  • Развёрнутый сервер PocketBase (см. раздел Связанные проекты)

🚀 Установка

Добавьте зависимость в pubspec.yaml вашего проекта:

dependencies:
  network:
    git:
      url: https://github.com/DenUP/network.git
      ref: main
  dio: ^5.4.0
  freezed_annotation: ^2.4.1
  json_annotation: ^4.8.1

dev_dependencies:
  build_runner: ^2.4.6
  freezed: ^2.4.5
  json_serializable: ^6.7.1
  flutter_test:
    sdk: flutter

Затем выполните:

flutter pub get

Если вы вносили изменения в freezed-классы, сгенерируйте код:

flutter pub run build_runner build --delete-conflicting-outputs

⚙️ Настройка

Перед использованием создайте экземпляр Dio с базовым URL вашего сервера и при необходимости добавьте токен авторизации.

import 'package:dio/dio.dart';
import 'package:network/user_service.dart';
import 'package:network/shop_service.dart';
import 'package:network/project_service.dart';
import 'package:network/basket_service.dart';

final dio = Dio(BaseOptions(baseUrl: 'http://localhost:8090/api'));

// После успешного входа токен можно установить так:
dio.options.headers['Authorization'] = 'Bearer $token';

// Создание сервисов
final userService = UserService(dio: dio);
final shopService = ShopService(dio: dio);
final projectService = ProjectService(dio: dio);
final basketService = BasketService(dio: dio);

📁 Структура проекта

lib/
├── entity/               # Модели данных
│   ├── user/             # Пользователи (User, ResponseAuth, UserAuthList)
│   ├── shop/             # Товары и новости (Product, ResponseProducts, ResponsesNews)
│   ├── project/          # Проекты (Project, ResponsesProject)
│   └── basket/           # Корзина (ResponseCart)
├── user_service.dart      # Сервис пользователей
├── shop_service.dart      # Сервис магазина (товары, новости)
├── project_service.dart   # Сервис проектов
├── basket_service.dart    # Сервис корзины
└── network.dart           # (Опционально) обёртка для инициализации

📘 Примеры использования

🔐 Авторизация и получение профиля

// Вход
final auth = await userService.userLogIn(
  email: 'user@example.com',
  password: '12345678',
);

// Устанавливаем токен для всех последующих запросов
dio.options.headers['Authorization'] = 'Bearer ${auth.token}';

// Получаем данные пользователя по ID
final user = await userService.userRecordsIdUser(idUser: auth.record.id);
print('Привет, ${user.email}!');

🖼️ Создание проекта с изображением

import 'dart:io';
import 'package:dio/dio.dart';

// Подготовка файла
final imageFile = File('path/to/project.jpg');
final multipartFile = await MultipartFile.fromFile(
  imageFile.path,
  filename: 'project.jpg',
  contentType: DioMediaType('image', 'jpeg'),
);

// Создание проекта
final newProject = await projectService.addProject(
  title: 'Мой проект',
  typeProject: 'Разработка',
  user_id: userId,
  dateStart: '2025-10-05',
  dateEnd: '2025-10-06',
  gender: 'Male',
  description_source: 'Описание проекта',
  category: 'IT',
  image: multipartFile,
);

print('Проект создан, ID: ${newProject.id}');

🔍 Поиск товаров

final products = await shopService.searchProduct('футболка');
for (var item in products.items) {
  print('${item.title} – ${item.price} руб.');
}

🛒 Работа с корзиной

// Создание записи в корзине
final cartItem = await basketService.addBasket(
  user_id: userId,
  product_id: productId,
  count: 2,
);

// Изменение количества
final updated = await basketService.editBasket(
  id_bucket: cartItem.id,
  user_id: userId,
  product_id: productId,
  count: 3,
);

🧪 Тестирование

В библиотеке реализованы интеграционные тесты, которые обращаются к реальному серверу PocketBase.

Подготовка

  1. Убедитесь, что сервер доступен по адресу http://192.168.1.146:8090 (при необходимости измените baseUrl в тестах).
  2. В базе должен существовать пользователь test21@test.ru с паролем 12345678.
    Если его нет – создайте вручную или раскомментируйте тест регистрации.

Запуск

flutter test test/

Тесты используют общий экземпляр Dio, авторизация выполняется один раз в setUpAll. В консоль выводятся токены и идентификаторы для отладки.

🔗 Связанные проекты

Проект Описание Ссылка
Сервер (PocketBase + Docker) Готовое окружение для локального развёртывания бэкенда GitHub
UI-kit Дизайн-система приложения (виджеты, цвета, типографика) GitHub
Макет в Figma Дизайн мобильного приложения Matule 2026 Figma
Основное приложение Репозиторий самого приложения (в разработке)

📄 Лицензия

Проект распространяется под лицензией MIT. Это означает, что вы можете свободно использовать, копировать, изменять, объединять, публиковать, распространять, сублицензировать и/или продавать копии данного программного обеспечения при соблюдении следующих условий:

  • Уведомление об авторских правах и сам текст лицензии должны быть включены во все копии или значимые части программного обеспечения.

Отказ от ответственности: ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, ЯВНЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИЯМИ ТОВАРНОЙ ПРИГОДНОСТИ, СООТВЕТСТВИЯ ПО ЕГО КОНКРЕТНОМУ НАЗНАЧЕНИЮ И ОТСУТСТВИЯ НАРУШЕНИЙ ПРАВ. НИ В КАКОМ СЛУЧАЕ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ПО КАКИМ-ЛИБО ИСКАМ, ЗА УЩЕРБ ИЛИ ПО ИНЫМ ТРЕБОВАНИЯМ, В ТОМ ЧИСЛЕ, ПРИ ДЕЙСТВИИ КОНТРАКТА, ДЕЛИКТЕ ИЛИ ИНОЙ СИТУАЦИИ, ВОЗНИКШИМ ИЗ-ЗА ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ИЛИ ИНЫХ ДЕЙСТВИЙ С НИМ.

Полный текст лицензии доступен в файле LICENSE в корне репозитория.

About

🔧network – клиентская библиотека для соревновании "Профессионалы 2026 - Разработка мобильных приложений "

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages