* docs(toh-6/dart): refactoring of 'add, edit, delete heroes' Refactoring of "add, edit, delete heroes" section of toh-6 from one big bottom-up step into small independent feature slices, where the user achieves a "milesone" (i.e., can run the full app) after each feature section. The section rewrite is shorter and offers a better UX. Other simplifications: - Error handling is consistent: in the hero service we log to the console, everwhere else we just let errors bubble up. - Hero service methods renamed based on function (create, update) rather then lower-level implementation (post, put). - @Output properties have been eliminated (since they weren't explained). E2E tests now pass on both the TS and Dart sides. * docs(toh-6/ts): refactoring of 'add, edit, delete heroes' Refactoring of "add, edit, delete heroes" section of toh-6 from one big bottom-up step into small independent feature slices, where the user achieves a "milesone" (i.e., can run the full app) after each feature section. The section rewrite is shorter and offers a better UX. Other simplifications: - Error handling is consistent: in the hero service we log to the console, everwhere else we just let errors bubble up. - Hero service methods renamed based on function (create, update) rather then lower-level implementation (post, put). - @Output properties have been eliminated (since they weren't explained). E2E tests now pass on both the TS and Dart sides. Post-Dart-review updates included. * docs(toh-6): ward tweaks
66 lines
2.1 KiB
Dart
66 lines
2.1 KiB
Dart
// #docregion , init
|
|
import 'dart:async';
|
|
import 'dart:convert';
|
|
import 'dart:math';
|
|
|
|
import 'package:angular2/core.dart';
|
|
import 'package:http/http.dart';
|
|
import 'package:http/testing.dart';
|
|
|
|
import 'hero.dart';
|
|
|
|
@Injectable()
|
|
class InMemoryDataService extends MockClient {
|
|
static final _initialHeroes = [
|
|
{'id': 11, 'name': 'Mr. Nice'},
|
|
{'id': 12, 'name': 'Narco'},
|
|
{'id': 13, 'name': 'Bombasto'},
|
|
{'id': 14, 'name': 'Celeritas'},
|
|
{'id': 15, 'name': 'Magneta'},
|
|
{'id': 16, 'name': 'RubberMan'},
|
|
{'id': 17, 'name': 'Dynama2'},
|
|
{'id': 18, 'name': 'Dr IQ'},
|
|
{'id': 19, 'name': 'Magma'},
|
|
{'id': 20, 'name': 'Tornado'}
|
|
];
|
|
static final List<Hero> _heroesDb =
|
|
_initialHeroes.map((json) => new Hero.fromJson(json)).toList();
|
|
static int _nextId = _heroesDb.map((hero) => hero.id).reduce(max) + 1;
|
|
|
|
static Future<Response> _handler(Request request) async {
|
|
var data;
|
|
switch (request.method) {
|
|
case 'GET':
|
|
String prefix = request.url.queryParameters['name'] ?? '';
|
|
final regExp = new RegExp(prefix, caseSensitive: false);
|
|
data = _heroesDb.where((hero) => hero.name.contains(regExp)).toList();
|
|
break;
|
|
// #enddocregion init-disabled
|
|
case 'POST':
|
|
var name = JSON.decode(request.body)['name'];
|
|
var newHero = new Hero(_nextId++, name);
|
|
_heroesDb.add(newHero);
|
|
data = newHero;
|
|
break;
|
|
case 'PUT':
|
|
var heroChanges = new Hero.fromJson(JSON.decode(request.body));
|
|
var targetHero = _heroesDb.firstWhere((h) => h.id == heroChanges.id);
|
|
targetHero.name = heroChanges.name;
|
|
data = targetHero;
|
|
break;
|
|
case 'DELETE':
|
|
var id = int.parse(request.url.pathSegments.last);
|
|
_heroesDb.removeWhere((hero) => hero.id == id);
|
|
// No data, so leave it as null.
|
|
break;
|
|
// #docregion init-disabled
|
|
default:
|
|
throw 'Unimplemented HTTP method ${request.method}';
|
|
}
|
|
return new Response(JSON.encode({'data': data}), 200,
|
|
headers: {'content-type': 'application/json'});
|
|
}
|
|
|
|
InMemoryDataService() : super(_handler);
|
|
}
|