platform/lib/src/http/services/memory.dart

81 lines
2.4 KiB
Dart
Raw Normal View History

2016-04-18 03:27:23 +00:00
part of angel_framework.http;
/// An in-memory [Service].
class MemoryService<T> extends Service {
God god = new God();
Map <int, T> items = {};
2016-06-19 05:02:41 +00:00
_makeJson(int index, T t) {
2016-05-04 01:01:29 +00:00
if (T == null || T == Map)
return mergeMap([god.serializeToMap(t), {'id': index}]);
else
return t;
}
Future<List> index([Map params]) async {
return items.keys
.where((index) => items[index] != null)
2016-06-19 05:02:41 +00:00
.map((index) => _makeJson(index, items[index]))
.toList();
}
2016-04-18 03:27:23 +00:00
2016-05-04 01:01:29 +00:00
Future read(id, [Map params]) async {
int desiredId = int.parse(id.toString());
if (items.containsKey(desiredId)) {
T found = items[desiredId];
if (found != null) {
2016-06-19 05:02:41 +00:00
return _makeJson(desiredId, found);
} else throw new AngelHttpException.NotFound();
} else throw new AngelHttpException.NotFound();
}
2016-04-18 03:27:23 +00:00
2016-05-04 01:01:29 +00:00
Future create(data, [Map params]) async {
try {
2016-05-04 00:58:28 +00:00
items[items.length] =
(data is Map) ? god.deserializeFromMap(data, T) : data;
T created = items[items.length - 1];
2016-06-19 05:02:41 +00:00
return _makeJson(items.length - 1, created);
} catch (e) {
throw new AngelHttpException.BadRequest(message: 'Invalid data.');
}
}
2016-05-04 01:01:29 +00:00
Future modify(id, data, [Map params]) async {
int desiredId = int.parse(id.toString());
if (items.containsKey(desiredId)) {
try {
Map existing = god.serializeToMap(items[desiredId]);
data = mergeMap([existing, data]);
2016-05-04 00:58:28 +00:00
items[desiredId] =
(data is Map) ? god.deserializeFromMap(data, T) : data;
2016-06-19 05:02:41 +00:00
return _makeJson(desiredId, items[desiredId]);
} catch (e) {
throw new AngelHttpException.BadRequest(message: 'Invalid data.');
}
} else throw new AngelHttpException.NotFound();
2016-04-18 03:27:23 +00:00
}
2016-05-04 01:01:29 +00:00
Future update(id, data, [Map params]) async {
int desiredId = int.parse(id.toString());
if (items.containsKey(desiredId)) {
try {
2016-05-04 00:58:28 +00:00
items[desiredId] =
(data is Map) ? god.deserializeFromMap(data, T) : data;
2016-06-19 05:02:41 +00:00
return _makeJson(desiredId, items[desiredId]);
} catch (e) {
throw new AngelHttpException.BadRequest(message: 'Invalid data.');
}
} else throw new AngelHttpException.NotFound();
2016-04-18 03:27:23 +00:00
}
2016-05-04 01:01:29 +00:00
Future remove(id, [Map params]) async {
int desiredId = int.parse(id.toString());
if (items.containsKey(desiredId)) {
T item = items[desiredId];
items[desiredId] = null;
2016-06-19 05:02:41 +00:00
return _makeJson(desiredId, item);
} else throw new AngelHttpException.NotFound();
2016-04-18 03:27:23 +00:00
}
MemoryService() : super();
}