Skip to content

Instantly share code, notes, and snippets.

@RobertApikyan
Created November 23, 2023 12:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save RobertApikyan/d4246bb8669d012c5266792fd08613c2 to your computer and use it in GitHub Desktop.
Save RobertApikyan/d4246bb8669d012c5266792fd08613c2 to your computer and use it in GitHub Desktop.
import 'dart:io';
import 'dart:math';
class FileSaveDirectory {
FileSaveDirectory(this.parentDirectoryFuture);
Directory? _saveDirectory;
final Future<Directory> parentDirectoryFuture;
bool get isExists => _saveDirectory?.existsSync() ?? false;
String get path => _saveDirectory!.path;
Directory? get directory => _saveDirectory;
/// Create directory in device temporary directory with a given [subDirName] for
/// video or captured images (see [remove]).
Future<void> initialize(String subDirName,{bool clear = false}) async {
_saveDirectory =
Directory((await parentDirectoryFuture).path + '/$subDirName/');
if(clear){
await remove();
}
if (!_saveDirectory!.existsSync()) {
await _saveDirectory!.create(recursive: true);
}
}
/// Removes created subdirectory (see [initialize]).
Future<void> remove() async {
if (_saveDirectory != null && _saveDirectory!.existsSync()) {
_saveDirectory!.deleteSync(recursive: true);
}
}
/// Generate full file path with given file [fileExtension]
/// (see [initialize] and [remove]).
String generateFilePath(String fileExtension,{String? name}) {
name = name ?? Random()
.nextDouble()
.toString()
.replaceAll(',', '')
.replaceAll('.', '');
return _saveDirectory!.path + name + fileExtension;
}
}
class EventStore {
late final FileSaveDirectory _fileSaveDirectory =
FileSaveDirectory(getTemporaryDirectory());
Future<void> storeEvent(
String legitimationId, EventReport eventReport) async {
if (_fileSaveDirectory.directory == null) {
await _fileSaveDirectory.initialize('events');
}
final file = File(_createFileName(legitimationId));
final exists = file.existsSync();
if (!exists) {
await _fileSaveDirectory.initialize('events', clear: true);
file.createSync();
}
await file.writeAsString(jsonEncode(eventReport.toJsonMap()) + "%%",
mode: FileMode.append, flush: true);
}
Future<List<Map<String,dynamic>>> fetchEventsByLegitimationId(
String legitimationId) async {
final file = File(_createFileName(legitimationId));
final exists = file.existsSync();
if (!exists) {
return [];
}
final jsonObjects = file.readAsStringSync().split('%%');
if (jsonObjects.lastOrNull == '') {
jsonObjects.removeLast();
}
final events = <Map<String,dynamic>> [
for (final json in jsonObjects) jsonDecode(json) as Map<String,dynamic>
];
return events;
}
Future<void> removeEventsByLegitimationId(String legitimationId) async {
final file = File(_createFileName(legitimationId));
file.deleteSync(recursive: true);
}
Future<List<String>> fetchEventFileNames() async {
if(!_fileSaveDirectory.isExists){
return [];
}
final directory = Directory(_fileSaveDirectory.path);
return directory.listSync().map((e) => e.path.split('/').last).toList();
}
String _createFileName(String legitimationId) =>
'${_fileSaveDirectory.path}/$legitimationId';
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment