mirror of
https://github.com/GitJournal/GitJournal.git
synced 2025-06-30 03:19:11 +08:00
Make FileStorage a NoteRepository
This commit is contained in:
@ -2,6 +2,7 @@ import 'dart:async';
|
|||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
|
import 'package:journal/notes_repository.dart';
|
||||||
import 'package:journal/serializers.dart';
|
import 'package:journal/serializers.dart';
|
||||||
import 'package:path/path.dart' as p;
|
import 'package:path/path.dart' as p;
|
||||||
|
|
||||||
@ -9,7 +10,7 @@ import './note.dart';
|
|||||||
|
|
||||||
typedef String NoteFileNameGenerator(Note note);
|
typedef String NoteFileNameGenerator(Note note);
|
||||||
|
|
||||||
class FileStorage {
|
class FileStorage implements NoteRepository {
|
||||||
final Future<Directory> Function() getDirectory;
|
final Future<Directory> Function() getDirectory;
|
||||||
final NoteSerializer noteSerializer;
|
final NoteSerializer noteSerializer;
|
||||||
final NoteFileNameGenerator fileNameGenerator;
|
final NoteFileNameGenerator fileNameGenerator;
|
||||||
@ -20,7 +21,8 @@ class FileStorage {
|
|||||||
@required this.fileNameGenerator,
|
@required this.fileNameGenerator,
|
||||||
});
|
});
|
||||||
|
|
||||||
Future<List<Note>> loadNotes() async {
|
@override
|
||||||
|
Future<List<Note>> listNotes() async {
|
||||||
final dir = await getDirectory();
|
final dir = await getDirectory();
|
||||||
|
|
||||||
var notes = new List<Note>();
|
var notes = new List<Note>();
|
||||||
@ -44,22 +46,7 @@ class FileStorage {
|
|||||||
return noteSerializer.decode(string);
|
return noteSerializer.decode(string);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<Directory> saveNotes(List<Note> notes) async {
|
@override
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<bool> addNote(Note note) async {
|
Future<bool> addNote(Note note) async {
|
||||||
final dir = await getDirectory();
|
final dir = await getDirectory();
|
||||||
var filePath = p.join(dir.path, fileNameGenerator(note));
|
var filePath = p.join(dir.path, fileNameGenerator(note));
|
||||||
@ -71,6 +58,7 @@ class FileStorage {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
Future<bool> removeNote(Note note) async {
|
Future<bool> removeNote(Note note) async {
|
||||||
final dir = await getDirectory();
|
final dir = await getDirectory();
|
||||||
var filePath = p.join(dir.path, fileNameGenerator(note));
|
var filePath = p.join(dir.path, fileNameGenerator(note));
|
||||||
@ -80,4 +68,14 @@ class FileStorage {
|
|||||||
|
|
||||||
return true;
|
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
76
lib/notes_repository.dart
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
@ -3,6 +3,7 @@ import 'dart:io';
|
|||||||
|
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:journal/notes_repository.dart';
|
||||||
import 'package:journal/serializers.dart';
|
import 'package:journal/serializers.dart';
|
||||||
import 'package:path_provider/path_provider.dart';
|
import 'package:path_provider/path_provider.dart';
|
||||||
import 'package:path/path.dart' as p;
|
import 'package:path/path.dart' as p;
|
||||||
@ -40,7 +41,7 @@ class StateContainer extends StatefulWidget {
|
|||||||
|
|
||||||
class StateContainerState extends State<StateContainer> {
|
class StateContainerState extends State<StateContainer> {
|
||||||
AppState appState = AppState.loading();
|
AppState appState = AppState.loading();
|
||||||
FileStorage fileStorage = new FileStorage(
|
NoteRepository noteRepo = new FileStorage(
|
||||||
getDirectory: getNotesDir,
|
getDirectory: getNotesDir,
|
||||||
noteSerializer: new MarkdownYAMLSerializer(),
|
noteSerializer: new MarkdownYAMLSerializer(),
|
||||||
fileNameGenerator: (Note note) => note.id,
|
fileNameGenerator: (Note note) => note.id,
|
||||||
@ -50,7 +51,7 @@ class StateContainerState extends State<StateContainer> {
|
|||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
|
|
||||||
fileStorage.loadNotes().then((loadedNotes) {
|
noteRepo.listNotes().then((loadedNotes) {
|
||||||
setState(() {
|
setState(() {
|
||||||
appState = AppState(notes: loadedNotes);
|
appState = AppState(notes: loadedNotes);
|
||||||
});
|
});
|
||||||
@ -67,21 +68,21 @@ class StateContainerState extends State<StateContainer> {
|
|||||||
setState(() {
|
setState(() {
|
||||||
note.id = new Uuid().v4();
|
note.id = new Uuid().v4();
|
||||||
appState.notes.insert(0, note);
|
appState.notes.insert(0, note);
|
||||||
fileStorage.addNote(note);
|
noteRepo.addNote(note);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void removeNote(Note note) {
|
void removeNote(Note note) {
|
||||||
setState(() {
|
setState(() {
|
||||||
appState.notes.remove(note);
|
appState.notes.remove(note);
|
||||||
fileStorage.removeNote(note);
|
noteRepo.removeNote(note);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void insertNote(int index, Note note) {
|
void insertNote(int index, Note note) {
|
||||||
setState(() {
|
setState(() {
|
||||||
appState.notes.insert(index, note);
|
appState.notes.insert(index, note);
|
||||||
fileStorage.addNote(note);
|
noteRepo.addNote(note);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user