mobile_team/lib/services/project_service.dart
2026-04-16 15:06:41 +05:30

85 lines
3.1 KiB
Dart

import 'dart:io';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_storage/firebase_storage.dart';
import '../models/project_model.dart';
import '../models/branch_model.dart';
import '../models/project_doc_model.dart';
class ProjectService {
FirebaseFirestore get _db => FirebaseFirestore.instance;
FirebaseStorage get _storage => FirebaseStorage.instance;
Stream<List<ProjectModel>> getProjects() {
return _db.collection('projects')
.orderBy('createdAt', descending: true)
.snapshots()
.map((snapshot) => snapshot.docs.map((doc) =>
ProjectModel.fromMap(doc.id, doc.data())).toList());
}
Future<void> addProject(ProjectModel project) async {
await _db.collection('projects').add(project.toMap());
}
Future<void> updateProject(ProjectModel project) async {
await _db.collection('projects').doc(project.id).update(project.toMap());
}
Future<void> deleteProject(String id) async {
// Note: In real app, consider deleting subcollections and storage files too.
await _db.collection('projects').doc(id).delete();
}
// Branches
Stream<List<BranchModel>> getBranches(String projectId) {
return _db.collection('projects').doc(projectId).collection('branches')
.snapshots()
.map((snapshot) => snapshot.docs.map((doc) =>
BranchModel.fromMap(doc.id, doc.data())).toList());
}
Future<List<BranchModel>> getBranchesOnce(String projectId) async {
var snapshot = await _db.collection('projects').doc(projectId).collection('branches').get();
return snapshot.docs.map((doc) => BranchModel.fromMap(doc.id, doc.data())).toList();
}
Future<void> addBranch(String projectId, String name) async {
await _db.collection('projects').doc(projectId).collection('branches').add({
'name': name
});
}
Future<void> deleteBranch(String projectId, String branchId) async {
await _db.collection('projects').doc(projectId).collection('branches').doc(branchId).delete();
}
// Docs
Stream<List<ProjectDocModel>> getDocs(String projectId) {
return _db.collection('projects').doc(projectId).collection('docs')
.orderBy('uploadedAt', descending: true)
.snapshots()
.map((snapshot) => snapshot.docs.map((doc) =>
ProjectDocModel.fromMap(doc.id, doc.data())).toList());
}
Future<void> addDoc(String projectId, String label, String url, String type) async {
await _db.collection('projects').doc(projectId).collection('docs').add({
'label': label,
'url': url,
'type': type,
'uploadedAt': FieldValue.serverTimestamp(),
});
}
Future<void> deleteDoc(String projectId, String docId) async {
await _db.collection('projects').doc(projectId).collection('docs').doc(docId).delete();
}
Future<String> uploadDoc(String projectId, File file) async {
String fileName = "${DateTime.now().millisecondsSinceEpoch}_${file.path.split(Platform.pathSeparator).last}";
var ref = _storage.ref().child('projects').child(projectId).child('docs').child(fileName);
var uploadTask = await ref.putFile(file);
return await uploadTask.ref.getDownloadURL();
}
}