buildChunkRowsForUpload function

  1. @visibleForTesting
List<Map<String, dynamic>> buildChunkRowsForUpload({
  1. required List chunks,
  2. required Map<String, String> titleToId,
  3. required Uuid uuid,
})

Build flat chunk row maps for Supabase insertion.

Implementation

@visibleForTesting
List<Map<String, dynamic>> buildChunkRowsForUpload({
  required List<dynamic> chunks,
  required Map<String, String> titleToId,
  required Uuid uuid,
}) {
  final lowerToId = {
    for (final e in titleToId.entries) e.key.toLowerCase(): e.value,
  };
  final chunkRows = <Map<String, dynamic>>[];
  for (final chunk in chunks) {
    if (chunk is! Map<String, dynamic>) continue;
    final content = (chunk['content'] as String?)?.trim() ?? '';
    if (content.isEmpty) continue;

    final topicPath = chunk['topic_path'];
    String? topicId;
    if (topicPath is List) {
      for (final title in topicPath.reversed) {
        final t = title.toString();
        topicId = titleToId[t] ?? lowerToId[t.toLowerCase()];
        if (topicId != null) break;
      }
    }
    if (topicId == null) continue;

    final meta = <String, dynamic>{'has_code': chunk['has_code'] == true};
    final extra = chunk['metadata'];
    if (extra is Map<String, dynamic>) meta.addAll(extra);

    chunkRows.add({
      'id': uuid.v4(),
      'topic_id': topicId,
      'book_id': null,
      'chunk_index': chunk['chunk_index'] ?? 0,
      'content': content,
      'page_number': chunk['page_number'],
      'token_count': chunk['token_count'],
      'metadata': jsonEncode(meta),
    });
  }
  return chunkRows;
}