creek

The AI Image Editor of 2030

project_service.dart (2622B)


import 'dart:convert';
import 'dart:io';
import 'package:flutter/rendering.dart';

import 'package:creekui/data/repos/project_repo.dart';
import 'package:creekui/data/repos/image_repo.dart';
import 'package:creekui/data/repos/file_repo.dart';
import 'package:creekui/data/models/project_model.dart';

class ProjectService {
  final _projectRepo = ProjectRepo();
  final _imageRepo = ImageRepo();
  final _fileRepo = FileRepo();

  Future<int> createProject(
    String title, {
    String? description,
    int? parentId,
  }) async {
    final project = ProjectModel(
      title: title.trim(),
      description: description,
      parentId: parentId,
      lastAccessedAt: DateTime.now(),
      createdAt: DateTime.now(),
    );
    return await _projectRepo.createProject(project);
  }

  Future<void> updateProjectDetails(
    int projectId, {
    String? title,
    String? description,
  }) async {
    if (title != null && title.trim().isEmpty) return; // Prevent empty titles
    await _projectRepo.updateProject(
      projectId,
      title: title?.trim(),
      description: description?.trim(),
    );
  }

  Future<void> openProject(int id) async {
    await _projectRepo.touchProject(id);
  }

  Future<void> saveStylesheet(
    int projectId,
    Map<String, dynamic> stylesheet,
  ) async {
    final jsonString = jsonEncode(stylesheet);
    await _projectRepo.updateStylesheet(projectId, jsonString);
  }

  Future<void> deleteProject(int projectId) async {
    List<int> allIdsToDelete = [projectId];
    final subEventIds = await _projectRepo.getAllSubEventIds(projectId);
    allIdsToDelete.addAll(subEventIds);

    List<String> pathsToDelete = [];
    pathsToDelete.addAll(
      await _imageRepo.getAllFilePathsForProjectIds(allIdsToDelete),
    );
    pathsToDelete.addAll(
      await _fileRepo.getAllFilePathsForProjectIds(allIdsToDelete),
    );

    for (var path in pathsToDelete) {
      try {
        final file = File(path);
        if (await file.exists()) await file.delete();
      } catch (e) {
        debugPrint("Error deleting file $path: $e");
      }
    }

    await _projectRepo.deleteProject(projectId);
  }

  Future<List<ProjectModel>> getRecentProjectsAndEvents() async {
    return await _projectRepo.getRecentProjectsAndEvents();
  }

  Future<List<ProjectModel>> getAllProjects() async {
    return await _projectRepo.getAllProjects();
  }

  Future<List<ProjectModel>> getEvents(int projectId) async {
    return await _projectRepo.getEvents(projectId);
  }

  Future<ProjectModel?> getProjectById(int id) async {
    return await _projectRepo.getProjectById(id);
  }
}