2024-05-19 17:01:06 +02:00
|
|
|
import 'package:cloud_firestore/cloud_firestore.dart';
|
|
|
|
import 'package:firebase_auth/firebase_auth.dart';
|
|
|
|
import '../constants.dart';
|
|
|
|
import '../enumerations.dart';
|
2024-05-30 01:10:53 +02:00
|
|
|
import '../models/language.dart';
|
|
|
|
import '../models/location.dart';
|
|
|
|
import '../models/user_profile.dart';
|
2024-05-19 17:01:06 +02:00
|
|
|
|
|
|
|
class UserService {
|
2024-05-30 01:10:53 +02:00
|
|
|
UserService._(); // Private constructor to prevent instantiation
|
2024-05-19 17:01:06 +02:00
|
|
|
|
2024-05-30 01:10:53 +02:00
|
|
|
static Future<void> saveUserData(UserCredential userCredential, String email,
|
2024-05-19 17:01:06 +02:00
|
|
|
String firstname, String lastname) async {
|
|
|
|
// create full name
|
|
|
|
String fullName = (firstname.isNotEmpty && lastname.isNotEmpty)
|
|
|
|
? '$firstname $lastname'
|
|
|
|
: (firstname.isNotEmpty
|
|
|
|
? firstname
|
|
|
|
: (lastname.isNotEmpty ? lastname : ''));
|
|
|
|
|
|
|
|
// save user info to users document
|
2024-05-30 01:10:53 +02:00
|
|
|
await FirebaseFirestore.instance
|
2024-05-19 17:01:06 +02:00
|
|
|
.collection(Constants.dbCollectionUsers)
|
|
|
|
.doc(userCredential.user!.uid)
|
|
|
|
.set(
|
|
|
|
{
|
2024-05-24 00:30:08 +02:00
|
|
|
Constants.dbFieldUsersID: userCredential.user!.uid,
|
|
|
|
Constants.dbFieldUsersEmail: email,
|
|
|
|
Constants.dbFieldUsersFirstName: firstname,
|
|
|
|
Constants.dbFieldUsersLastName: lastname,
|
|
|
|
Constants.dbFieldUsersName: fullName,
|
2024-05-19 17:01:06 +02:00
|
|
|
},
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2024-05-30 01:10:53 +02:00
|
|
|
static Future<List<SkillOption>> getSkillsFromFirebase(
|
2024-05-19 17:01:06 +02:00
|
|
|
bool skillsSought, String userId) async {
|
|
|
|
// Fetch skills from Firestore
|
2024-05-30 01:10:53 +02:00
|
|
|
DocumentSnapshot userDoc = await FirebaseFirestore.instance
|
2024-05-19 17:01:06 +02:00
|
|
|
.collection(Constants.dbCollectionUsers)
|
|
|
|
.doc(userId)
|
|
|
|
.get();
|
|
|
|
|
|
|
|
if (userDoc.exists && userDoc.data() != null) {
|
2024-05-30 16:37:34 +02:00
|
|
|
Map<String, dynamic> userData = userDoc.data()! as Map<String, dynamic>;
|
2024-05-19 17:01:06 +02:00
|
|
|
|
|
|
|
List<dynamic>? skills;
|
|
|
|
if (skillsSought) {
|
|
|
|
skills = userData[Constants.dbFieldUsersSkillsSought];
|
|
|
|
} else {
|
2024-05-30 16:37:34 +02:00
|
|
|
skills = userData[Constants.dbFieldUsersSkills];
|
2024-05-19 17:01:06 +02:00
|
|
|
}
|
|
|
|
|
2024-05-31 18:31:37 +02:00
|
|
|
return convertSkillStringToEnum(skills);
|
2024-05-19 17:01:06 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return [];
|
|
|
|
}
|
|
|
|
|
2024-05-31 18:31:37 +02:00
|
|
|
static List<SkillOption> convertSkillStringToEnum(List<dynamic>? skills) {
|
|
|
|
if (skills != null && skills.isNotEmpty) {
|
|
|
|
// Convert skills from strings to enum values
|
|
|
|
List<SkillOption> userSkills = skills
|
|
|
|
.map((skill) => SkillOption.values
|
|
|
|
.firstWhere((x) => x.toString() == 'SkillOption.$skill'))
|
|
|
|
.toList();
|
|
|
|
return userSkills;
|
|
|
|
}
|
|
|
|
return [];
|
|
|
|
}
|
|
|
|
|
2024-05-30 01:10:53 +02:00
|
|
|
static Future<bool> saveSkillsToFirebase(List<SkillOption> selectedOptions,
|
2024-05-19 17:01:06 +02:00
|
|
|
bool skillsSought, String userId) async {
|
|
|
|
try {
|
|
|
|
// Convert enum values to strings, removing leading EnumType with split
|
|
|
|
List<String> skills = selectedOptions
|
|
|
|
.map((option) => option.toString().split('.').last)
|
|
|
|
.toList();
|
|
|
|
|
|
|
|
// Update the corresponding 'skills' field in the user's document
|
|
|
|
String keyToUpdate = skillsSought
|
|
|
|
? Constants.dbFieldUsersSkillsSought
|
|
|
|
: Constants.dbFieldUsersSkills;
|
|
|
|
|
2024-05-30 01:10:53 +02:00
|
|
|
FirebaseFirestore.instance
|
2024-05-19 17:01:06 +02:00
|
|
|
.collection(Constants.dbCollectionUsers)
|
|
|
|
.doc(userId)
|
|
|
|
.update({keyToUpdate: skills});
|
|
|
|
|
|
|
|
return true;
|
|
|
|
} catch (e) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
2024-05-30 01:10:53 +02:00
|
|
|
|
|
|
|
/// Get UserProfile for given [userId]
|
|
|
|
static Future<UserProfile> getUserProfileById(String userId) async {
|
|
|
|
FirebaseFirestore firestore = FirebaseFirestore.instance;
|
|
|
|
|
|
|
|
DocumentSnapshot userDoc = await firestore
|
|
|
|
.collection(Constants.dbCollectionUsers)
|
|
|
|
.doc(userId)
|
|
|
|
.get();
|
|
|
|
|
|
|
|
QuerySnapshot languagesSnapshot = await firestore
|
|
|
|
.collection(Constants.dbCollectionUsers)
|
|
|
|
.doc(userId)
|
|
|
|
.collection(Constants.dbCollectionLanguages)
|
|
|
|
.get();
|
|
|
|
List<Language> languages = languagesSnapshot.docs
|
|
|
|
.map((doc) => Language.fromDocument(doc))
|
|
|
|
.toList();
|
|
|
|
|
|
|
|
QuerySnapshot locationsSnapshot = await firestore
|
|
|
|
.collection(Constants.dbCollectionUsers)
|
|
|
|
.doc(userId)
|
|
|
|
.collection(Constants.dbCollectionLocations)
|
|
|
|
.get();
|
|
|
|
Map<String, MyLocation?> locations = {
|
|
|
|
for (var doc in locationsSnapshot.docs)
|
|
|
|
doc.id: MyLocation.fromDocument(doc)
|
|
|
|
};
|
|
|
|
|
|
|
|
// Fill UserProfile including its sub collections
|
|
|
|
UserProfile userProfile = UserProfile.fromDocument(userDoc);
|
|
|
|
userProfile.languages.addAll(languages);
|
|
|
|
userProfile.locations.addAll(locations);
|
|
|
|
|
|
|
|
return userProfile;
|
|
|
|
}
|
2024-05-19 17:01:06 +02:00
|
|
|
}
|