// lib/models/user.dart // // مدل کاربر. به‌روزرسانی شده برای پشتیبانی از بک‌اند جدید (Keycloak): // - بک‌اند جدید id را به صورت UUID (string) برمی‌گرداند => `keycloakId`. // - برای سازگاری با کدهای قدیمی پروژه که از `user.id` (int) استفاده می‌کنند، // فیلد `id` نگه داشته شده است (0 در صورت نبود معادل عددی). // - فیلدهای جدید بک‌اند: firstName, lastName, phone, avatar // معادل قدیمی: fullName, phoneNumber, photo // - متد `fromJson` هر دو شکل قدیمی و جدید را قبول می‌کند. class User { /// Identifier عددی قدیمی (سازگاری). در بک‌اند جدید معمولا 0 خواهد بود. final int id; /// شناسه کاربر در Keycloak (UUID). در بک‌اند جدید کلید اصلی است. final String? keycloakId; final String phoneNumber; final String fullName; final String? username; final String? photo; final String? email; final String? firstName; final String? lastName; const User({ required this.id, required this.username, required this.phoneNumber, required this.photo, required this.fullName, required this.email, this.keycloakId, this.firstName, this.lastName, }); /// سازنده‌ای که هم با شکل قدیمی (`{id, fullName, phoneNumber, photo, ...}`) /// و هم با شکل جدید (`{id: , firstName, lastName, phone, avatar, ...}`) /// کار می‌کند. factory User.fromJson(Map json) { // id ممکن است int یا String (UUID) باشد. final dynamic rawId = json['id']; int intId = 0; String? keycloakId; if (rawId is int) { intId = rawId; } else if (rawId is String) { keycloakId = rawId; intId = int.tryParse(rawId) ?? 0; } // اولویت با فیلد جدید keycloakId اگر صریح ارسال شده باشد. if (json['keycloakId'] is String) { keycloakId = json['keycloakId'] as String; } // ساخت fullName: اگر مستقیم آمده استفاده می‌کنیم، // وگرنه از firstName + lastName می‌سازیم. final firstName = json['firstName'] as String?; final lastName = json['lastName'] as String?; String fullName; if (json['fullName'] is String && (json['fullName'] as String).isNotEmpty) { fullName = json['fullName'] as String; } else { fullName = [ firstName ?? '', lastName ?? '', ].where((s) => s.isNotEmpty).join(' '); } // phoneNumber: قدیم `phoneNumber`، جدید `phone`. final phone = (json['phoneNumber'] ?? json['phone'] ?? '') as String; // photo: قدیم `photo`، جدید `avatar`. final photo = (json['photo'] ?? json['avatar']) as String?; return User( id: intId, keycloakId: keycloakId, username: json['username'] as String?, phoneNumber: phone, photo: photo, fullName: fullName, email: json['email'] as String?, firstName: firstName, lastName: lastName, ); } Map toJson() => { 'id': id, if (keycloakId != null) 'keycloakId': keycloakId, 'username': username, 'phoneNumber': phoneNumber, 'photo': photo, 'fullName': fullName, 'email': email, if (firstName != null) 'firstName': firstName, if (lastName != null) 'lastName': lastName, }; User copyWith({ int? id, String? keycloakId, String? username, String? phoneNumber, String? photo, String? fullName, String? email, String? firstName, String? lastName, }) { return User( id: id ?? this.id, keycloakId: keycloakId ?? this.keycloakId, username: username ?? this.username, phoneNumber: phoneNumber ?? this.phoneNumber, photo: photo, fullName: fullName ?? this.fullName, email: email ?? this.email, firstName: firstName ?? this.firstName, lastName: lastName ?? this.lastName, ); } }