Files
bowlingManager/mobile/lib/services/score_service.dart
T
2025-08-01 16:45:26 +09:00

297 lines
7.6 KiB
Dart

import 'package:flutter/foundation.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../config/api_config.dart';
import '../models/score_model.dart';
import './api_service.dart';
class ScoreService with ChangeNotifier {
List<Score> _scores = [];
bool _isLoading = false;
String? _token;
String? _clubId;
final ApiService _apiService = ApiService();
String? _memberId;
String? _eventId;
List<Score> get scores => [..._scores];
bool get isLoading => _isLoading;
// 초기화 함수
void initialize(String token) {
_token = token;
_apiService.setToken(token);
}
// 회원 ID 설정
void setMemberId(String memberId) {
_memberId = memberId;
notifyListeners();
}
// 이벤트 ID 설정
void setEventId(String eventId) {
_eventId = eventId;
notifyListeners();
}
// 클럽의 모든 점수 가져오기
Future<void> fetchClubScores() async {
print('fetchClubScores 호출됨: token=$_token');
_isLoading = true;
notifyListeners();
try {
// 클럽 ID 가져오기
final prefs = await SharedPreferences.getInstance();
final clubId = prefs.getString(ApiConfig.clubIdKey);
if (clubId == null) {
throw Exception('선택된 클럽이 없습니다');
}
final data = await _apiService.post(
'${ApiConfig.clubs}/scores',
data: {'clubId': clubId},
);
// 응답 데이터가 리스트 형태로 직접 왔는지 확인
if (data is List) {
final List<dynamic> scoresData = data;
_scores = scoresData
.map((scoreData) => Score.fromJson(scoreData))
.toList();
} else {
// 응답 데이터가 객체 형태로 왔을 경우 scores 키를 통해 접근
final List<dynamic> scoresData = data['scores'] ?? [];
_scores = scoresData
.map((scoreData) => Score.fromJson(scoreData))
.toList();
}
_isLoading = false;
notifyListeners();
} catch (e) {
_isLoading = false;
notifyListeners();
throw Exception('점수 목록을 불러오는데 실패했습니다: $e');
}
}
// 회원의 점수 가져오기
Future<List<Score>> fetchMemberScores(String memberId) async {
if (_token == null || _clubId == null) {
throw Exception('인증 또는 클럽 정보가 필요합니다');
}
_isLoading = true;
notifyListeners();
try {
final data = await _apiService.post(
'${ApiConfig.clubs}/members/scores',
data: {'memberId': memberId},
);
final List<dynamic> scoresData = data['scores'];
final memberScores = scoresData
.map((scoreData) => Score.fromJson(scoreData))
.toList();
_isLoading = false;
notifyListeners();
return memberScores;
} catch (e) {
_isLoading = false;
notifyListeners();
throw Exception('회원 점수를 불러오는데 실패했습니다: $e');
}
}
// 이벤트의 점수 가져오기
Future<List<Score>> fetchEventScores(String eventId) async {
if (_token == null || _clubId == null) {
throw Exception('인증 또는 클럽 정보가 필요합니다');
}
_isLoading = true;
notifyListeners();
try {
final data = await _apiService.post(
'${ApiConfig.clubs}/events/scores',
data: {'eventId': eventId},
);
final List<dynamic> scoresData = data['scores'];
final eventScores = scoresData
.map((scoreData) => Score.fromJson(scoreData))
.toList();
_isLoading = false;
notifyListeners();
return eventScores;
} catch (e) {
_isLoading = false;
notifyListeners();
throw Exception('이벤트 점수를 불러오는데 실패했습니다: $e');
}
}
// 점수 추가
Future<Score> addScore(Map<String, dynamic> scoreData) async {
if (_token == null || _clubId == null) {
throw Exception('인증 또는 클럽 정보가 필요합니다');
}
_isLoading = true;
notifyListeners();
try {
final data = await _apiService.post(ApiConfig.scores, data: scoreData);
final newScore = Score.fromJson(data['score']);
_scores.add(newScore);
_isLoading = false;
notifyListeners();
return newScore;
} catch (e) {
_isLoading = false;
notifyListeners();
throw Exception('점수 추가에 실패했습니다: $e');
}
}
// 점수 수정
Future<Score> updateScore(
String scoreId,
Map<String, dynamic> updates,
) async {
if (_token == null || _clubId == null) {
throw Exception('인증 또는 클럽 정보가 필요합니다');
}
_isLoading = true;
notifyListeners();
try {
final data = await _apiService.put(
'${ApiConfig.scores}/$scoreId',
data: updates,
);
final updatedScore = Score.fromJson(data['score']);
// 점수 목록 업데이트
final index = _scores.indexWhere((score) => score.id == scoreId);
if (index >= 0) {
_scores[index] = updatedScore;
}
_isLoading = false;
notifyListeners();
return updatedScore;
} catch (e) {
_isLoading = false;
notifyListeners();
throw Exception('점수 수정에 실패했습니다: $e');
}
}
// 점수 삭제
Future<bool> deleteScore(String scoreId) async {
if (_token == null || _clubId == null) {
throw Exception('인증 또는 클럽 정보가 필요합니다');
}
_isLoading = true;
notifyListeners();
try {
await _apiService.delete('${ApiConfig.scores}/$scoreId');
// 점수 목록에서 삭제
_scores.removeWhere((score) => score.id == scoreId);
_isLoading = false;
notifyListeners();
return true;
} catch (e) {
_isLoading = false;
notifyListeners();
throw Exception('점수 삭제에 실패했습니다: $e');
}
}
// 회원 통계 가져오기
Future<ScoreStatistics> fetchMemberStatistics(String memberId) async {
if (_token == null || _clubId == null) {
throw Exception('인증 또는 클럽 정보가 필요합니다');
}
try {
final data = await _apiService.post(
'${ApiConfig.clubs}/members/stats',
data: {'memberId': memberId},
);
return ScoreStatistics.fromJson(data['statistics']);
} catch (e) {
throw Exception('회원 통계를 불러오는데 실패했습니다: $e');
}
}
// 클럽 통계 가져오기
Future<Map<String, ScoreStatistics>> fetchClubStatistics() async {
if (_token == null) {
throw Exception('인증 정보가 필요합니다');
}
try {
// 클럽 ID 가져오기
final prefs = await SharedPreferences.getInstance();
final clubId = prefs.getString(ApiConfig.clubIdKey);
if (clubId == null) {
throw Exception('선택된 클럽이 없습니다');
}
final data = await _apiService.post(
'${ApiConfig.clubs}/scores/stats',
data: {'clubId': clubId},
);
final Map<String, ScoreStatistics> statistics = {};
if (data['statistics'] != null) {
final Map<String, dynamic> statsData =
data['statistics'] as Map<String, dynamic>;
statsData.forEach((key, value) {
if (value != null) {
try {
statistics[key] = ScoreStatistics.fromJson(value);
} catch (e) {
print('통계 변환 오류: $key - $e');
}
}
});
}
return statistics;
} catch (e) {
throw Exception('클럽 통계를 불러오는데 실패했습니다: $e');
}
}
}