/// 사용자 역할 정의 enum UserRole { member, // 일반 회원 manager, // 매니저 (일부 관리 권한) admin, // 관리자 (대부분의 관리 권한) owner // 소유자 (모든 권한) } /// 관리 권한 정의 class AdminPermission { final bool canManageMembers; // 회원 관리 권한 final bool canManageEvents; // 이벤트 관리 권한 final bool canManageScores; // 점수 관리 권한 final bool canManageSettings; // 설정 관리 권한 final bool canManageSubscription; // 구독 관리 권한 final bool canManageRoles; // 역할 관리 권한 final bool canViewFinancials; // 재정 정보 조회 권한 final bool canExportData; // 데이터 내보내기 권한 const AdminPermission({ this.canManageMembers = false, this.canManageEvents = false, this.canManageScores = false, this.canManageSettings = false, this.canManageSubscription = false, this.canManageRoles = false, this.canViewFinancials = false, this.canExportData = false, }); /// 역할에 따른 기본 권한 생성 factory AdminPermission.fromRole(UserRole role) { switch (role) { case UserRole.member: return const AdminPermission(); case UserRole.manager: return const AdminPermission( canManageMembers: true, canManageEvents: true, canManageScores: true, canExportData: true, ); case UserRole.admin: return const AdminPermission( canManageMembers: true, canManageEvents: true, canManageScores: true, canManageSettings: true, canViewFinancials: true, canExportData: true, ); case UserRole.owner: return const AdminPermission( canManageMembers: true, canManageEvents: true, canManageScores: true, canManageSettings: true, canManageSubscription: true, canManageRoles: true, canViewFinancials: true, canExportData: true, ); } } /// JSON에서 권한 객체 생성 factory AdminPermission.fromJson(Map json) { return AdminPermission( canManageMembers: json['canManageMembers'] ?? false, canManageEvents: json['canManageEvents'] ?? false, canManageScores: json['canManageScores'] ?? false, canManageSettings: json['canManageSettings'] ?? false, canManageSubscription: json['canManageSubscription'] ?? false, canManageRoles: json['canManageRoles'] ?? false, canViewFinancials: json['canViewFinancials'] ?? false, canExportData: json['canExportData'] ?? false, ); } /// 권한 객체를 JSON으로 변환 Map toJson() { return { 'canManageMembers': canManageMembers, 'canManageEvents': canManageEvents, 'canManageScores': canManageScores, 'canManageSettings': canManageSettings, 'canManageSubscription': canManageSubscription, 'canManageRoles': canManageRoles, 'canViewFinancials': canViewFinancials, 'canExportData': canExportData, }; } } /// 클럽 회원 역할 정보 class MemberRole { final String userId; final String memberId; final String clubId; final UserRole role; final AdminPermission permissions; final DateTime assignedAt; final String? assignedBy; MemberRole({ required this.userId, required this.memberId, required this.clubId, required this.role, required this.permissions, required this.assignedAt, this.assignedBy, }); /// JSON에서 회원 역할 객체 생성 factory MemberRole.fromJson(Map json) { return MemberRole( userId: json['userId'], memberId: json['memberId'], clubId: json['clubId'], role: UserRole.values.firstWhere( (e) => e.toString().split('.').last == json['role'], orElse: () => UserRole.member, ), permissions: AdminPermission.fromJson(json['permissions'] ?? {}), assignedAt: DateTime.parse(json['assignedAt']), assignedBy: json['assignedBy'], ); } /// 회원 역할 객체를 JSON으로 변환 Map toJson() { return { 'userId': userId, 'memberId': memberId, 'clubId': clubId, 'role': role.toString().split('.').last, 'permissions': permissions.toJson(), 'assignedAt': assignedAt.toIso8601String(), 'assignedBy': assignedBy, }; } /// 역할 이름 (한글) String get roleName { switch (role) { case UserRole.member: return '일반 회원'; case UserRole.manager: return '매니저'; case UserRole.admin: return '관리자'; case UserRole.owner: return '소유자'; } } } /// 클럽 설정 모델 class ClubSettings { final String clubId; final String clubName; final String? logoUrl; final String? bannerUrl; final String? description; final String? contactEmail; final String? contactPhone; final String? address; final String? website; final Map? customFields; final Map? notificationSettings; final Map? privacySettings; final DateTime createdAt; final DateTime updatedAt; ClubSettings({ required this.clubId, required this.clubName, this.logoUrl, this.bannerUrl, this.description, this.contactEmail, this.contactPhone, this.address, this.website, this.customFields, this.notificationSettings, this.privacySettings, required this.createdAt, required this.updatedAt, }); /// JSON에서 클럽 설정 객체 생성 factory ClubSettings.fromJson(Map json) { return ClubSettings( clubId: json['clubId'], clubName: json['clubName'], logoUrl: json['logoUrl'], bannerUrl: json['bannerUrl'], description: json['description'], contactEmail: json['contactEmail'], contactPhone: json['contactPhone'], address: json['address'], website: json['website'], customFields: json['customFields'], notificationSettings: json['notificationSettings'], privacySettings: json['privacySettings'], createdAt: DateTime.parse(json['createdAt']), updatedAt: DateTime.parse(json['updatedAt']), ); } /// 클럽 설정 객체를 JSON으로 변환 Map toJson() { return { 'clubId': clubId, 'clubName': clubName, 'logoUrl': logoUrl, 'bannerUrl': bannerUrl, 'description': description, 'contactEmail': contactEmail, 'contactPhone': contactPhone, 'address': address, 'website': website, 'customFields': customFields, 'notificationSettings': notificationSettings, 'privacySettings': privacySettings, 'createdAt': createdAt.toIso8601String(), 'updatedAt': updatedAt.toIso8601String(), }; } /// 복사본 생성 (일부 필드 업데이트) ClubSettings copyWith({ String? clubName, String? logoUrl, String? bannerUrl, String? description, String? contactEmail, String? contactPhone, String? address, String? website, Map? customFields, Map? notificationSettings, Map? privacySettings, }) { return ClubSettings( clubId: clubId, clubName: clubName ?? this.clubName, logoUrl: logoUrl ?? this.logoUrl, bannerUrl: bannerUrl ?? this.bannerUrl, description: description ?? this.description, contactEmail: contactEmail ?? this.contactEmail, contactPhone: contactPhone ?? this.contactPhone, address: address ?? this.address, website: website ?? this.website, customFields: customFields ?? this.customFields, notificationSettings: notificationSettings ?? this.notificationSettings, privacySettings: privacySettings ?? this.privacySettings, createdAt: createdAt, updatedAt: DateTime.now(), ); } }