storeDocument method

Future<Document> storeDocument({
  1. required String fileName,
  2. required String filePath,
  3. required String content,
  4. int? fileSize,
  5. String? fileHash,
})

Implementation

Future<Document> storeDocument({
  required String fileName,
  required String filePath,
  required String content,
  int? fileSize,
  String? fileHash,
}) async {
  if (_embeddingGenerator == null) {
    throw Exception('Embedding generator not set. Call setEmbeddingGenerator() first.');
  }

  final existingDoc = await getDocumentByFileName(fileName);

  if (existingDoc != null) {
    // Delete old chunks
    for (var chunk in existingDoc.chunks) {
      chunkBox.remove(chunk.id);
    }
    existingDoc.chunks.clear();

    // Create and store new chunks
    final chunks = _chunkContent(
      content,
      chunkSize: _chunkSize,
      chunkOverlap: _chunkOverlap,
    );
    for (final chunkContent in chunks) {
      final embedding = await _embeddingGenerator!(chunkContent);
      final chunk = DocumentChunk(content: chunkContent, embeddings: embedding);
      chunk.document.target = existingDoc;
      existingDoc.chunks.add(chunk);
    }

    existingDoc.filePath = filePath;
    existingDoc.fileSize = fileSize;
    existingDoc.fileHash = fileHash;
    existingDoc.updatedAt = DateTime.now();
    await updateDocument(existingDoc);
    return existingDoc;
  } else {
    final document = Document(
      fileName: fileName,
      filePath: filePath,
      fileSize: fileSize,
      fileHash: fileHash,
    );

    final chunks = _chunkContent(
      content,
      chunkSize: _chunkSize,
      chunkOverlap: _chunkOverlap,
    );
    for (final chunkContent in chunks) {
      final embedding = await _embeddingGenerator!(chunkContent);
      final chunk = DocumentChunk(content: chunkContent, embeddings: embedding);
      chunk.document.target = document;
      document.chunks.add(chunk);
    }

    document.id = documentBox.put(document);
    document.chunks.applyToDb();
    return document;
  }
}