import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'role.dart'; class User { String docID; final String corpId; final String name; String phoneNumber; String get phone => phoneNumber != null && phoneNumber.startsWith("959") ? "0${phoneNumber.substring(2)}" : phoneNumber; List claimPrivileges = []; final String dateofBirth; final String gender; final String status; final bool disable; bool registeredBuyer; List privilegeIds; String roleName; String roleID; bool agreeTerms; String bizID; String accountID; String email; bool isBlock; int userLevel; String userLevelID; String frontUrl; String backUrl; String selfieUrl; DateTime lastActiveTime; String device; String primaryDeviceID; String primaryDeviceName; String pin; String get getcorpId => this.corpId; String get getname => this.name; String get getphonenumber => this.phoneNumber; String get getdateofBirth => this.dateofBirth; bool get getdisable => this.disable; String getLogDesc(List privileges) { String result = ""; if (privilegeIds.isNotEmpty) { privilegeIds.forEach((pID) { privileges.forEach((p) { if (p.id == pID) { if (result != "") result += ","; result += p.name; } }); }); } return result; } Future setFirebaseUser(FirebaseUser firebaseUser) async { IdTokenResult idToken = await firebaseUser.getIdToken(refresh: true); String privileges = idToken.claims["privileges"]; if (privileges == null || privileges == "") return; this.claimPrivileges = privileges.split(":").toList(); this.accountID = idToken.claims["account_id"]; this.bizID = idToken.claims["biz_id"]; } User( {this.docID, this.name, this.gender, this.phoneNumber, this.dateofBirth, this.corpId, this.roleName, this.roleID, this.privilegeIds, this.email, this.disable, this.status, this.frontUrl, this.backUrl, this.selfieUrl, this.registeredBuyer, this.agreeTerms, this.lastActiveTime, this.device, this.primaryDeviceID, this.primaryDeviceName, this.isBlock, this.userLevel, this.userLevelID, this.pin}); factory User.fromJson(Map json) { return User( docID: json['id'], name: json['user_name'], phoneNumber: json['phone_number'], dateofBirth: json['dob'], gender: json['gender'], frontUrl: json['front_url'], backUrl: json['back_url'], selfieUrl: json['selfie_url'], status: json['status'], agreeTerms: json['agree_terms'], disable: json['disable'], registeredBuyer: json['registered_buyer'], privilegeIds: json['privileges'], email: json['email'], isBlock: json['black_list'], userLevel: json['user_level'], userLevelID: json['user_level_id'], pin: json['pin']); } factory User.fromUserJson(Map json) { DateTime parsedDate = DateTime.parse(json['last_active_time']); return User( docID: json['id'], name: json['user_name'], phoneNumber: json['phone_number'], dateofBirth: json['dob'], corpId: json['corp_id'], roleName: json['role_name'], roleID: json['role_id'], disable: json['disable'], gender: json['gender'], status: json['status'], // agreeTerms: json['agree_terms'], // registeredBuyer: json['registered_buyer'], // privilegeIds: json['privileges']==null?[]:json['privileges'].cast(), // isBlock: map['black_list'], lastActiveTime: parsedDate == null ? null : parsedDate, device: json['last_active_device'], email: json['email'], primaryDeviceID: json['primary_device_id'], primaryDeviceName: json['primary_device_name'], userLevel: json['user_level'], userLevelID: json['user_level_id'], pin: json['pin']); } Map toJson() => { 'id': docID, 'user_name': name, 'gender': gender, 'phone_number': phoneNumber, 'dob': dateofBirth, 'corpId': corpId, 'roleName': roleName, 'roleId': roleID, 'disable': disable, 'status': status, 'registered_buyer': registeredBuyer, 'agree_terms': agreeTerms, 'front_url': frontUrl, 'back_url': backUrl, 'selfie_url': selfieUrl, 'email': email, 'black_list': isBlock, 'user_level': userLevel, 'user_level_id': userLevelID, 'pin': pin, 'privileges': privilegeIds, }; Map toMap() { return { 'user_name': name, 'phone_number': phoneNumber, 'dob': dateofBirth, 'corp_id': corpId, 'role_name': roleName, 'role_id': roleID, 'disable': disable, 'gender': gender, 'status': status, 'email': email, 'black_list': isBlock, 'user_level': userLevel, 'user_level_id': userLevelID, 'pin': pin }; } factory User.fromMap(Map map, String docID) { var activeTime = (map['last_active_time'] as Timestamp); return User( docID: docID, name: map['user_name'], phoneNumber: map['phone_number'], privilegeIds: map['privileges'] == null ? [] : map['privileges'].cast(), dateofBirth: map['dob'], corpId: map['corp_id'], roleName: map['role_name'], roleID: map['role_id'], disable: map['disable'], gender: map['gender'], status: map['status'], registeredBuyer: map['registered_buyer'], agreeTerms: map['agree_terms'] == null ? false : map['agree_terms'], lastActiveTime: activeTime == null ? null : activeTime.toDate(), device: map['last_active_device'], email: map['email'], primaryDeviceID: map['primary_device_id'], primaryDeviceName: map['primary_device_name'], isBlock: map['black_list'], userLevel: map['user_level'], userLevelID: map['user_level_id'], pin: map['pin']); } bool isBlockUser() { return this.isBlock == true; } bool isPrimaryDevice() { return this.primaryDeviceID != null && this.primaryDeviceID != ''; } bool isRegisteredBuyer() { return this.registeredBuyer != null && this.registeredBuyer; } bool isSysAdmin() { return claimPrivileges != null ? claimPrivileges.contains('sys_admin') : false; } bool isSysSupport() { return claimPrivileges != null ? claimPrivileges.contains('sys_support') : false; } bool isBizAdmin() { return claimPrivileges != null ? claimPrivileges.contains('ba') : false; } bool isBuyer() { return claimPrivileges == null || claimPrivileges.length == 0; } bool isEmail() { return email != null; } bool hasAccount() { return isOwner() || (claimPrivileges != null ? claimPrivileges.contains('a') : false); } bool hasDelivery() { return isOwner() || (claimPrivileges != null ? claimPrivileges.contains('d') : false); } bool hasBuyer() { return isOwner() || (claimPrivileges != null ? claimPrivileges.contains('b') : false); } bool isOwner() { return claimPrivileges != null ? claimPrivileges.contains('o') : false; } bool isOwnerAndAbove() { return isOwner() || isBizAdmin() || isSysAdmin(); } bool hasAdmin() { return isOwner() || (claimPrivileges != null ? claimPrivileges.contains('admin') : false); } bool hasDO() { return isOwner() || (claimPrivileges != null ? claimPrivileges.contains('do') : false); } bool hasPO() { return isOwner() || (claimPrivileges != null ? claimPrivileges.contains('po') : false); } bool hasInventory() { return isOwner() || (claimPrivileges != null ? claimPrivileges.contains('inv') : false); } @override String toString() { return 'User{name: $name, phoneNumber: $phoneNumber,dateofBirth:$dateofBirth,corpId:$corpId,disable:$disable,gender:$gender,roleName:$roleName,roleID:$roleID,privilegeIds:$privilegeIds,status:$status,frontUrl:$frontUrl,backUrl:$backUrl,selfieUrl:$selfieUrl}'; } } class JsonUser { String status; String message; User data; String sessionId; JsonUser({this.status, this.message, this.sessionId, this.data}); JsonUser.fromJson(Map json) { status = json['status']; message = json['message']; sessionId = json['session_id']; if (json['status'] == 'Ok') { data = User.fromJson(json['data']); } } }