uploadImage method

  1. @override
Future<MediaAsset> uploadImage(
  1. String fileName,
  2. Uint8List fileData
)
override

Upload an image. The server computes all derived metadata. Returns the MediaAsset (existing if deduplicated, new otherwise).

Implementation

@override
Future<MediaAsset> uploadImage(String fileName, Uint8List fileData) async {
  final ext = fileName.contains('.')
      ? fileName.split('.').last.toLowerCase()
      : 'bin';
  final contentHash = sha256.convert(fileData).toString();

  // Try to decode for dimensions; fall back to zeros for non-images.
  int width = 0;
  int height = 0;
  bool hasAlpha = false;
  try {
    final decoded = img.decodeImage(fileData);
    if (decoded != null) {
      width = decoded.width;
      height = decoded.height;
      hasAlpha = decoded.hasAlpha;
    }
  } catch (_) {
    // ignore
  }

  final assetId = 'image-$contentHash-${width}x$height-$ext';
  if (_media.containsKey(assetId)) return _media[assetId]!;

  final mimeType = switch (ext) {
    'jpg' || 'jpeg' => 'image/jpeg',
    'png' => 'image/png',
    'gif' => 'image/gif',
    'webp' => 'image/webp',
    'svg' => 'image/svg+xml',
    _ => 'image/$ext',
  };

  final id = _genMediaId();
  final asset = MediaAsset(
    id: id,
    assetId: assetId,
    fileName: fileName,
    mimeType: mimeType,
    fileSize: fileData.length,
    publicUrl: 'https://mock-cdn.test/media/$assetId/$fileName',
    width: width,
    height: height,
    hasAlpha: hasAlpha,
    blurHash: 'L00000fQfQfQfQfQfQfQfQfQfQ', // placeholder
    createdAt: DateTime.now(),
    metadataStatus: MediaAssetMetadataStatus.complete,
  );
  _media[assetId] = asset;
  return asset;
}