creek

The AI Image Editor of 2030

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}