creek
The AI Image Editor of 2030git clone https://github.com/maydayv7/creek
lib/services/project_service.dart (2622B)
1import 'dart:convert';
2import 'dart:io';
3import 'package:flutter/rendering.dart';
4
5import 'package:creekui/data/repos/project_repo.dart';
6import 'package:creekui/data/repos/image_repo.dart';
7import 'package:creekui/data/repos/file_repo.dart';
8import 'package:creekui/data/models/project_model.dart';
9
10class ProjectService {
11 final _projectRepo = ProjectRepo();
12 final _imageRepo = ImageRepo();
13 final _fileRepo = FileRepo();
14
15 Future<int> createProject(
16 String title, {
17 String? description,
18 int? parentId,
19 }) async {
20 final project = ProjectModel(
21 title: title.trim(),
22 description: description,
23 parentId: parentId,
24 lastAccessedAt: DateTime.now(),
25 createdAt: DateTime.now(),
26 );
27 return await _projectRepo.createProject(project);
28 }
29
30 Future<void> updateProjectDetails(
31 int projectId, {
32 String? title,
33 String? description,
34 }) async {
35 if (title != null && title.trim().isEmpty) return; // Prevent empty titles
36 await _projectRepo.updateProject(
37 projectId,
38 title: title?.trim(),
39 description: description?.trim(),
40 );
41 }
42
43 Future<void> openProject(int id) async {
44 await _projectRepo.touchProject(id);
45 }
46
47 Future<void> saveStylesheet(
48 int projectId,
49 Map<String, dynamic> stylesheet,
50 ) async {
51 final jsonString = jsonEncode(stylesheet);
52 await _projectRepo.updateStylesheet(projectId, jsonString);
53 }
54
55 Future<void> deleteProject(int projectId) async {
56 List<int> allIdsToDelete = [projectId];
57 final subEventIds = await _projectRepo.getAllSubEventIds(projectId);
58 allIdsToDelete.addAll(subEventIds);
59
60 List<String> pathsToDelete = [];
61 pathsToDelete.addAll(
62 await _imageRepo.getAllFilePathsForProjectIds(allIdsToDelete),
63 );
64 pathsToDelete.addAll(
65 await _fileRepo.getAllFilePathsForProjectIds(allIdsToDelete),
66 );
67
68 for (var path in pathsToDelete) {
69 try {
70 final file = File(path);
71 if (await file.exists()) await file.delete();
72 } catch (e) {
73 debugPrint("Error deleting file $path: $e");
74 }
75 }
76
77 await _projectRepo.deleteProject(projectId);
78 }
79
80 Future<List<ProjectModel>> getRecentProjectsAndEvents() async {
81 return await _projectRepo.getRecentProjectsAndEvents();
82 }
83
84 Future<List<ProjectModel>> getAllProjects() async {
85 return await _projectRepo.getAllProjects();
86 }
87
88 Future<List<ProjectModel>> getEvents(int projectId) async {
89 return await _projectRepo.getEvents(projectId);
90 }
91
92 Future<ProjectModel?> getProjectById(int id) async {
93 return await _projectRepo.getProjectById(id);
94 }
95}