142 lines
4.0 KiB
Dart
142 lines
4.0 KiB
Dart
import 'dart:convert';
|
|
import 'dart:io';
|
|
import 'package:dio/dio.dart';
|
|
import 'package:flutter/foundation.dart';
|
|
|
|
class ApiService {
|
|
// Use 10.0.2.2 for Android Emulator, localhost for iOS/Web
|
|
static final String baseUrl = Platform.isAndroid
|
|
? 'http://10.0.2.2:3000'
|
|
: 'http://localhost:3000';
|
|
|
|
final Dio _dio = Dio(
|
|
BaseOptions(
|
|
baseUrl: baseUrl,
|
|
connectTimeout: const Duration(seconds: 10),
|
|
receiveTimeout: const Duration(seconds: 10),
|
|
),
|
|
);
|
|
|
|
// Get Initial Master Data (Groups, Species, Breeds, Diseases)
|
|
Future<Map<String, dynamic>> getInitialData() async {
|
|
try {
|
|
final response = await _dio.get('/common/initial-data');
|
|
return response.data;
|
|
} catch (e) {
|
|
debugPrint('Error fetching initial data: $e');
|
|
rethrow;
|
|
}
|
|
}
|
|
|
|
// Register Pet
|
|
Future<Map<String, dynamic>> registerPet({
|
|
required int userId,
|
|
required String name,
|
|
required String species,
|
|
required String breed,
|
|
required String gender,
|
|
required bool isNeutered,
|
|
DateTime? birthDate,
|
|
required bool isDateUnknown,
|
|
double? weight,
|
|
String? registrationNumber,
|
|
File? profileImage,
|
|
List<String>? diseases,
|
|
List<String>? pastDiseases,
|
|
List<String>? healthConcerns,
|
|
}) async {
|
|
try {
|
|
final formData = FormData.fromMap({
|
|
'userId': userId,
|
|
'name': name,
|
|
'species': species,
|
|
'breed': breed,
|
|
'gender': gender, // "남아", "여아", "기타"
|
|
'isNeutered': isNeutered,
|
|
'birthDate': birthDate?.toIso8601String(),
|
|
'isDateUnknown': isDateUnknown,
|
|
'weight': weight,
|
|
'registrationNumber': registrationNumber,
|
|
'diseases': diseases != null ? jsonEncode(diseases) : '[]',
|
|
'pastDiseases': pastDiseases != null ? jsonEncode(pastDiseases) : '[]',
|
|
'healthConcerns': healthConcerns != null
|
|
? jsonEncode(healthConcerns)
|
|
: '[]',
|
|
if (profileImage != null)
|
|
'profileImage': await MultipartFile.fromFile(
|
|
profileImage.path,
|
|
filename: profileImage.path.split('/').last,
|
|
),
|
|
});
|
|
|
|
final response = await _dio.post('/pets', data: formData);
|
|
return response.data;
|
|
} catch (e) {
|
|
debugPrint('Error registering pet: $e');
|
|
rethrow;
|
|
}
|
|
}
|
|
|
|
// Update Pet
|
|
Future<Map<String, dynamic>> updatePet({
|
|
required int petId,
|
|
required String name,
|
|
required String species,
|
|
required String breed,
|
|
required String gender,
|
|
required bool isNeutered,
|
|
DateTime? birthDate,
|
|
required bool isDateUnknown,
|
|
double? weight,
|
|
String? registrationNumber,
|
|
File? profileImage,
|
|
List<String>? diseases,
|
|
List<String>? pastDiseases,
|
|
List<String>? healthConcerns,
|
|
}) async {
|
|
try {
|
|
final formData = FormData.fromMap({
|
|
'name': name,
|
|
'species': species,
|
|
'breed': breed,
|
|
'gender': gender,
|
|
'isNeutered': isNeutered,
|
|
'birthDate': birthDate?.toIso8601String(),
|
|
'isDateUnknown': isDateUnknown,
|
|
'weight': weight,
|
|
'registrationNumber': registrationNumber,
|
|
'diseases': diseases != null ? jsonEncode(diseases) : '[]',
|
|
'pastDiseases': pastDiseases != null ? jsonEncode(pastDiseases) : '[]',
|
|
'healthConcerns': healthConcerns != null
|
|
? jsonEncode(healthConcerns)
|
|
: '[]',
|
|
if (profileImage != null)
|
|
'profileImage': await MultipartFile.fromFile(
|
|
profileImage.path,
|
|
filename: profileImage.path.split('/').last,
|
|
),
|
|
});
|
|
|
|
final response = await _dio.put('/pets/$petId', data: formData);
|
|
return response.data;
|
|
} catch (e) {
|
|
debugPrint('Error updating pet: $e');
|
|
rethrow;
|
|
}
|
|
}
|
|
|
|
// Get Pets
|
|
Future<List<dynamic>> getPets(int userId) async {
|
|
try {
|
|
final response = await _dio.get(
|
|
'/pets',
|
|
queryParameters: {'userId': userId},
|
|
);
|
|
return response.data;
|
|
} catch (e) {
|
|
debugPrint('Error fetching pets: $e');
|
|
rethrow;
|
|
}
|
|
}
|
|
}
|