createDataRepository method

void createDataRepository(
  1. String pathPage,
  2. String pageName,
  3. String apiName,
  4. String method,
  5. bool bodyList,
  6. bool responseList,
)

Implementation

void createDataRepository(
  String pathPage,
  String pageName,
  String apiName,
  String method,
  bool bodyList,
  bool responseList,
) {
  final apiClassName = apiName.pascalCase;
  final apiMethodName = apiName.camelCase;

  final path = join(pathPage, 'data', 'repositories');
  DirectoryHelper.createDir(path);

  final bodyClass = getBodyClass(apiClassName, bodyList);
  final entityClass = getEntityClass(apiClassName, responseList);

  final entityImpl = getEntityReturn(apiClassName, responseList);

  final methodOfDataRepository = '''@override
${whenMethod(
    method,
    onStream: () {
      return '''${flutterClassOfMethod(method)}<Either<MorphemeFailure, $entityClass>> $apiMethodName($bodyClass body,{Map<String, String>? headers,}) async* {
  try {
    final response = remoteDataSource.$apiMethodName(
      body,
      headers: headers,
    );
    await for (final data in response) {
      yield Right($entityImpl);
    }
  } on MorphemeException catch (e) {
    yield Left(e.toMorphemeFailure());
  } catch (e) {
    yield Left(InternalFailure(e.toString()));
  }
}''';
    },
    onFuture: () {
      return '''${flutterClassOfMethod(method)}<Either<MorphemeFailure, $entityClass>> $apiMethodName($bodyClass body,{Map<String, String>? headers, ${isApplyCacheStrategy(method) ? 'CacheStrategy? cacheStrategy,' : ''}}) async {
  try {
    final data = await remoteDataSource.$apiMethodName(body, headers: headers, ${isApplyCacheStrategy(method) ? 'cacheStrategy: cacheStrategy,' : ''});
    return Right($entityImpl);
  } on MorphemeException catch (e) {
    return Left(e.toMorphemeFailure());
  } catch (e) {
    return Left(InternalFailure(e.toString()));
  }
}''';
    },
  )}''';

  if (!exists(join(path, '${pageName}_repository_impl.dart'))) {
    join(path, '${pageName}_repository_impl.dart').write(
        '''${returnData == 'body_bytes' ? "import 'dart:typed_data';" : ''}

import 'package:core/core.dart';

${isReturnDataModel ? '''import '../../domain/entities/${apiName}_entity.dart';''' : ''}
${isReturnDataModel ? '''import '../../mapper.dart';''' : ''}
import '../../domain/repositories/${pageName}_repository.dart';
import '../datasources/${pageName}_remote_data_source.dart';
import '../models/body/${apiName}_body.dart';

class ${pageName.pascalCase}RepositoryImpl implements ${pageName.pascalCase}Repository {
${pageName.pascalCase}RepositoryImpl({
  required this.remoteDataSource,
});

final ${pageName.pascalCase}RemoteDataSource remoteDataSource;

$methodOfDataRepository
}''');
  } else {
    String data = File(join(path, '${pageName}_repository_impl.dart'))
        .readAsStringSync();

    final isDataDatasourceAlready =
        RegExp(r'remote_data_source\.dart').hasMatch(data);
    final isDomainRepositoryAlready =
        RegExp(r'repository\.dart').hasMatch(data);

    final isNeedMapper =
        (RegExp(r'.toEntity()').hasMatch(data) || isReturnDataModel) &&
            !RegExp(r'''import '../../mapper.dart';''').hasMatch(data);

    final isNeedImportTypeData = returnData == 'body_bytes' &&
        !RegExp(r'''import 'dart:typed_data';''').hasMatch(data);

    if (isNeedImportTypeData) {
      data = '''import 'dart:typed_data';

      $data''';
    }

    data = data.replaceAll(
        RegExp(r"import\s?'package:core\/core.dart';\n?\n?", multiLine: true),
        '''import 'package:core/core.dart';

${isNeedMapper ? '''import '../../mapper.dart';''' : ''}
${isDataDatasourceAlready ? '' : "import '../datasources/${pageName}_remote_data_source.dart';"}
${isDomainRepositoryAlready ? '' : "import '../../domain/repositories/${pageName}_repository.dart';"}
${isReturnDataModel ? '''import '../../domain/entities/${apiName}_entity.dart';''' : ''}
import '../models/body/${apiName}_body.dart';''');

    final isEmpty = RegExp(r'remoteDataSource;(\s+)?}(\s+)?}').hasMatch(data);

    data =
        data.replaceAll(RegExp(r'}(\s+)?}(\s+)?}'), '''${isEmpty ? '' : '}}'}

$methodOfDataRepository
}''');

    join(path, '${pageName}_repository_impl.dart').write(data);
  }

  StatusHelper.generated(join(path, '${pageName}_repository_impl.dart'));
}