Make FileStorage a NoteRepository

This commit is contained in:
Vishesh Handa
2018-06-03 19:44:36 +02:00
parent 69998c37f9
commit 9d19ee4c14
3 changed files with 98 additions and 23 deletions

View File

@ -2,6 +2,7 @@ import 'dart:async';
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:journal/notes_repository.dart';
import 'package:journal/serializers.dart';
import 'package:path/path.dart' as p;
@ -9,7 +10,7 @@ import './note.dart';
typedef String NoteFileNameGenerator(Note note);
class FileStorage {
class FileStorage implements NoteRepository {
final Future<Directory> Function() getDirectory;
final NoteSerializer noteSerializer;
final NoteFileNameGenerator fileNameGenerator;
@ -20,7 +21,8 @@ class FileStorage {
@required this.fileNameGenerator,
});
Future<List<Note>> loadNotes() async {
@override
Future<List<Note>> listNotes() async {
final dir = await getDirectory();
var notes = new List<Note>();
@ -44,22 +46,7 @@ class FileStorage {
return noteSerializer.decode(string);
}
Future<Directory> saveNotes(List<Note> notes) async {
final dir = await getDirectory();
await dir.delete(recursive: true);
await dir.create();
for (var note in notes) {
var filePath = p.join(dir.path, fileNameGenerator(note));
var file = new File(filePath);
var contents = noteSerializer.encode(note);
await file.writeAsString(contents);
}
return dir;
}
@override
Future<bool> addNote(Note note) async {
final dir = await getDirectory();
var filePath = p.join(dir.path, fileNameGenerator(note));
@ -71,6 +58,7 @@ class FileStorage {
return true;
}
@override
Future<bool> removeNote(Note note) async {
final dir = await getDirectory();
var filePath = p.join(dir.path, fileNameGenerator(note));
@ -80,4 +68,14 @@ class FileStorage {
return true;
}
@override
Future<bool> updateNote(Note note) async {
return addNote(note);
}
@override
Future<bool> sync() async {
return false;
}
}

76
lib/notes_repository.dart Normal file
View File

@ -0,0 +1,76 @@
import 'dart:async';
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:journal/file_storage.dart';
import 'package:journal/note.dart';
import 'package:journal/serializers.dart';
import 'package:path_provider/path_provider.dart';
import 'package:path/path.dart' as p;
abstract class NoteRepository {
// Syncs the repo
// - git pull with an auto merge
// - git push
// TODO: Better error message!
Future<bool> sync();
Future<bool> addNote(Note note);
Future<bool> updateNote(Note note);
Future<bool> removeNote(Note note);
Future<List<Note>> listNotes();
}
Future<Directory> getNotesDir() async {
var appDir = await getApplicationDocumentsDirectory();
var dir = new Directory(p.join(appDir.path, "notes"));
await dir.create();
return dir;
}
class GitNoteRepository implements NoteRepository {
FileStorage _fileStorage = new FileStorage(
getDirectory: getNotesDir,
noteSerializer: new MarkdownYAMLSerializer(),
fileNameGenerator: (Note note) => note.id,
);
final String gitUrl;
final String dirPath;
GitNoteRepository({
@required this.gitUrl,
@required this.dirPath,
}) {
// FIXME: This isn't correct. The gitUrl might not be cloned at this point!
}
@override
Future<bool> addNote(Note note) async {
return _fileStorage.addNote(note);
}
@override
Future<List<Note>> listNotes() {
return _fileStorage.listNotes();
}
@override
Future<bool> removeNote(Note note) async {
return _fileStorage.removeNote(note);
}
@override
Future<bool> sync() async {
return false;
}
@override
Future<bool> updateNote(Note note) async {
return _fileStorage.updateNote(note);
}
}

View File

@ -3,6 +3,7 @@ import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:journal/notes_repository.dart';
import 'package:journal/serializers.dart';
import 'package:path_provider/path_provider.dart';
import 'package:path/path.dart' as p;
@ -40,7 +41,7 @@ class StateContainer extends StatefulWidget {
class StateContainerState extends State<StateContainer> {
AppState appState = AppState.loading();
FileStorage fileStorage = new FileStorage(
NoteRepository noteRepo = new FileStorage(
getDirectory: getNotesDir,
noteSerializer: new MarkdownYAMLSerializer(),
fileNameGenerator: (Note note) => note.id,
@ -50,7 +51,7 @@ class StateContainerState extends State<StateContainer> {
void initState() {
super.initState();
fileStorage.loadNotes().then((loadedNotes) {
noteRepo.listNotes().then((loadedNotes) {
setState(() {
appState = AppState(notes: loadedNotes);
});
@ -67,21 +68,21 @@ class StateContainerState extends State<StateContainer> {
setState(() {
note.id = new Uuid().v4();
appState.notes.insert(0, note);
fileStorage.addNote(note);
noteRepo.addNote(note);
});
}
void removeNote(Note note) {
setState(() {
appState.notes.remove(note);
fileStorage.removeNote(note);
noteRepo.removeNote(note);
});
}
void insertNote(int index, Note note) {
setState(() {
appState.notes.insert(index, note);
fileStorage.addNote(note);
noteRepo.addNote(note);
});
}