// lib/services/api/api_service.dart import 'package:flutter/material.dart'; import 'package:Stocky/models/task_adapter.dart'; import 'package:Stocky/services/local/StorageService.dart'; import 'package:Stocky/utils/constants.dart'; import 'package:dio/dio.dart'; import 'package:get/get.dart'; class ApiService extends GetxService { static final ApiService _instance = ApiService._internal(); ApiService._internal() { _setupDio(); } final Dio _dio = Dio(); String? get accessToken => Get.find().getAccessToken(); factory ApiService() => _instance; void _setupDio() { _dio.options.baseUrl = Constants.BASE_URL; _dio.options.connectTimeout = const Duration(seconds: 10); _dio.options.receiveTimeout = const Duration(seconds: 10); _dio.options.contentType = Headers.jsonContentType; _dio.interceptors.add( InterceptorsWrapper( onRequest: (options, handler) async { final token = accessToken; if (token != null) { options.headers['Authorization'] = 'Bearer $token'; } return handler.next(options); }, onResponse: (response, handler) => handler.next(response), ), ); } Future registerByPhone(String phone) async { try { await _dio.post( '/register', data: {'application': 'warehouse', 'phone': phone}, ); } catch (e) { debugPrint('Регистрация по телефону: $e'); } } Future loginByPhone(String phone, String digCode) async { try { final response = await _dio.post( '/login', data: { 'phone': phone, 'digCode': digCode, 'application': 'warehouse', }, // ← убран пробел ); if (response.statusCode == 200) { final data = response.data; final token = data['token']; final username = data['name']; Get.find().saveAccessToken(token); Get.find().putUsername(username); return true; } } catch (e) { debugPrint('Логин по телефону: $e'); } return false; } Future> fetchTasks() async { try { final username = await Get.find().getUsername(); final response = await _dio.get('/warehouse/tasks/$username'); if (response.statusCode == 200) { final List list = response.data; return list.map((item) => Task.fromMap(item)).toList(); } else { debugPrint( 'Некорректный статус при загрузке задач: ${response.statusCode}', ); } } catch (e) { debugPrint('Ошибка загрузки задач: $e'); } return []; } Future upsertTask(Task task) async { if (task.isNew == true || task.id.isEmpty) { final saved = await saveTask(task); return saved; } else { final success = await updateTask(task); return success ? task : null; } } Future saveTask(Task task) async { try { final response = await _dio.post('/warehouse/task', data: task.toMap()); if (response.statusCode == 200) { return response.data; } } catch (e) { debugPrint('Ошибка сохранения задачи: $e'); } return null; } Future updateTask(Task task) async { try { debugPrint('Обновление задачи: ${task.toMap()}'); final response = await _dio.put('/warehouse/task', data: task.toMap()); return response.statusCode == 201; } catch (e) { debugPrint('Ошибка обновления задачи: $e'); } return false; } Future deleteTask(String taskId) async { try { final response = await _dio.delete('/warehouse/task/$taskId'); return response.statusCode == 200; } catch (e) { debugPrint('Ошибка удаления задачи: $e'); } return false; } void clearAuth() { Get.find().clearAuth(); } static Future init() async { final service = ApiService(); Get.put(service, permanent: true); return service; } Future setFcmToken(String token) async { try { final response = await _dio.put( '/warehouse/user', data: { "number": await Get.find().getNumber(), "notification": { "token": token.toString(), "enable": true, "type": "FCM", }, }, ); return response.statusCode == 200; } catch (e) { debugPrint('Ошибка обновление токена: $e'); } return false; } }