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

266 lines
7.9 KiB
Dart

/// 사용자 역할 정의
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<String, dynamic> 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<String, dynamic> 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<String, dynamic> 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<String, dynamic> 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<String, dynamic>? customFields;
final Map<String, dynamic>? notificationSettings;
final Map<String, dynamic>? 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<String, dynamic> 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<String, dynamic> 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<String, dynamic>? customFields,
Map<String, dynamic>? notificationSettings,
Map<String, dynamic>? 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(),
);
}
}