Updated framework

This commit is contained in:
thomashii 2021-11-29 09:04:50 +08:00
parent 8b2d9bf725
commit 1d8fb252be
5 changed files with 93 additions and 77 deletions

View file

@ -3,6 +3,7 @@
## 4.3.0
* Updated `container` to non nullable
* Updated `angel` to non nullable
## 4.2.2

View file

@ -45,7 +45,9 @@ class HookedService<Id, Data, T extends Service<Id, Data>>
HookedService(this.inner) {
// Clone app instance
if (inner.app != null) app = inner.app;
if (inner.isAppActive) {
app = inner.app;
}
}
@override
@ -62,9 +64,9 @@ class HookedService<Id, Data, T extends Service<Id, Data>>
return params['__responsectx'] as ResponseContext?;
}
Map<String, dynamic>? _stripReq(Map<String, dynamic>? params) {
Map<String, dynamic> _stripReq(Map<String, dynamic>? params) {
if (params == null) {
return params;
return {};
} else {
return params.keys
.where((key) => key != '__requestctx' && key != '__responsectx')
@ -302,136 +304,136 @@ class HookedService<Id, Data, T extends Service<Id, Data>>
}
@override
Future<Data> read(Id id, [Map<String, dynamic>? _params]) {
var params = _stripReq(_params);
Future<Data> read(Id id, [Map<String, dynamic>? params]) {
var localParams = _stripReq(params);
return beforeRead
._emit(HookedServiceEvent(false, _getRequest(_params),
_getResponse(_params), inner, HookedServiceEvent.read,
id: id, params: params))
._emit(HookedServiceEvent(false, _getRequest(params),
_getResponse(params), inner, HookedServiceEvent.read,
id: id, params: localParams))
.then((before) {
if (before._canceled) {
return afterRead
._emit(HookedServiceEvent(true, _getRequest(_params),
_getResponse(_params), inner, HookedServiceEvent.read,
id: id, params: params, result: before.result))
._emit(HookedServiceEvent(true, _getRequest(params),
_getResponse(params), inner, HookedServiceEvent.read,
id: id, params: localParams, result: before.result))
.then((after) => after.result as Data);
}
return inner.read(id, params).then((result) {
return inner.read(id, localParams).then((result) {
return afterRead
._emit(HookedServiceEvent(true, _getRequest(_params),
_getResponse(_params), inner, HookedServiceEvent.read,
id: id, params: params, result: result))
._emit(HookedServiceEvent(true, _getRequest(params),
_getResponse(params), inner, HookedServiceEvent.read,
id: id, params: localParams, result: result))
.then((after) => after.result as Data);
});
});
}
@override
Future<Data> create(Data data, [Map<String, dynamic>? _params]) {
var params = _stripReq(_params);
Future<Data> create(Data data, [Map<String, dynamic>? params]) {
var localParams = _stripReq(params);
return beforeCreated
._emit(HookedServiceEvent(false, _getRequest(_params),
_getResponse(_params), inner, HookedServiceEvent.created,
data: data, params: params))
._emit(HookedServiceEvent(false, _getRequest(params),
_getResponse(params), inner, HookedServiceEvent.created,
data: data, params: localParams))
.then((before) {
if (before._canceled) {
return afterCreated
._emit(HookedServiceEvent(true, _getRequest(_params),
_getResponse(_params), inner, HookedServiceEvent.created,
data: before.data, params: params, result: before.result))
._emit(HookedServiceEvent(true, _getRequest(params),
_getResponse(params), inner, HookedServiceEvent.created,
data: before.data, params: localParams, result: before.result))
.then((after) => after.result as Data);
}
return inner.create(before.data!, params).then((result) {
return inner.create(before.data!, localParams).then((result) {
return afterCreated
._emit(HookedServiceEvent(true, _getRequest(_params),
_getResponse(_params), inner, HookedServiceEvent.created,
data: before.data, params: params, result: result))
._emit(HookedServiceEvent(true, _getRequest(params),
_getResponse(params), inner, HookedServiceEvent.created,
data: before.data, params: localParams, result: result))
.then((after) => after.result as Data);
});
});
}
@override
Future<Data> modify(Id id, Data data, [Map<String, dynamic>? _params]) {
var params = _stripReq(_params);
Future<Data> modify(Id id, Data data, [Map<String, dynamic>? params]) {
var localParams = _stripReq(params);
return beforeModified
._emit(HookedServiceEvent(false, _getRequest(_params),
_getResponse(_params), inner, HookedServiceEvent.modified,
id: id, data: data, params: params))
._emit(HookedServiceEvent(false, _getRequest(params),
_getResponse(params), inner, HookedServiceEvent.modified,
id: id, data: data, params: localParams))
.then((before) {
if (before._canceled) {
return afterModified
._emit(HookedServiceEvent(true, _getRequest(_params),
_getResponse(_params), inner, HookedServiceEvent.modified,
._emit(HookedServiceEvent(true, _getRequest(params),
_getResponse(params), inner, HookedServiceEvent.modified,
id: id,
data: before.data,
params: params,
params: localParams,
result: before.result))
.then((after) => after.result as Data);
}
return inner.modify(id, before.data!, params).then((result) {
return inner.modify(id, before.data!, localParams).then((result) {
return afterModified
._emit(HookedServiceEvent(true, _getRequest(_params),
_getResponse(_params), inner, HookedServiceEvent.created,
id: id, data: before.data, params: params, result: result))
._emit(HookedServiceEvent(true, _getRequest(params),
_getResponse(params), inner, HookedServiceEvent.created,
id: id, data: before.data, params: localParams, result: result))
.then((after) => after.result as Data);
});
});
}
@override
Future<Data> update(Id id, Data data, [Map<String, dynamic>? _params]) {
var params = _stripReq(_params);
Future<Data> update(Id id, Data data, [Map<String, dynamic>? params]) {
var localParams = _stripReq(params);
return beforeUpdated
._emit(HookedServiceEvent(false, _getRequest(_params),
_getResponse(_params), inner, HookedServiceEvent.updated,
id: id, data: data, params: params))
._emit(HookedServiceEvent(false, _getRequest(params),
_getResponse(params), inner, HookedServiceEvent.updated,
id: id, data: data, params: localParams))
.then((before) {
if (before._canceled) {
return afterUpdated
._emit(HookedServiceEvent(true, _getRequest(_params),
_getResponse(_params), inner, HookedServiceEvent.updated,
._emit(HookedServiceEvent(true, _getRequest(params),
_getResponse(params), inner, HookedServiceEvent.updated,
id: id,
data: before.data,
params: params,
params: localParams,
result: before.result))
.then((after) => after.result as Data);
}
return inner.update(id, before.data!, params).then((result) {
return inner.update(id, before.data!, localParams).then((result) {
return afterUpdated
._emit(HookedServiceEvent(true, _getRequest(_params),
_getResponse(_params), inner, HookedServiceEvent.updated,
id: id, data: before.data, params: params, result: result))
._emit(HookedServiceEvent(true, _getRequest(params),
_getResponse(params), inner, HookedServiceEvent.updated,
id: id, data: before.data, params: localParams, result: result))
.then((after) => after.result as Data);
});
});
}
@override
Future<Data> remove(Id id, [Map<String, dynamic>? _params]) {
var params = _stripReq(_params);
Future<Data> remove(Id id, [Map<String, dynamic>? params]) {
var localParams = _stripReq(params);
return beforeRemoved
._emit(HookedServiceEvent(false, _getRequest(_params),
_getResponse(_params), inner, HookedServiceEvent.removed,
id: id, params: params))
._emit(HookedServiceEvent(false, _getRequest(params),
_getResponse(params), inner, HookedServiceEvent.removed,
id: id, params: localParams))
.then((before) {
if (before._canceled) {
return afterRemoved
._emit(HookedServiceEvent(true, _getRequest(_params),
_getResponse(_params), inner, HookedServiceEvent.removed,
id: id, params: params, result: before.result))
._emit(HookedServiceEvent(true, _getRequest(params),
_getResponse(params), inner, HookedServiceEvent.removed,
id: id, params: localParams, result: before.result))
.then((after) => after.result) as Data;
}
return inner.remove(id, params).then((result) {
return inner.remove(id, localParams).then((result) {
return afterRemoved
._emit(HookedServiceEvent(true, _getRequest(_params),
_getResponse(_params), inner, HookedServiceEvent.removed,
id: id, params: params, result: result))
._emit(HookedServiceEvent(true, _getRequest(params),
_getResponse(params), inner, HookedServiceEvent.removed,
id: id, params: localParams, result: result))
.then((after) => after.result as Data);
});
});
@ -512,7 +514,7 @@ class HookedServiceEvent<Id, Data, T extends Service<Id, Data>> {
/// Resolves a service from the application.
///
/// Shorthand for `e.service.app.service(...)`.
Service? getService(Pattern path) => service.app!.findService(path);
Service? getService(Pattern path) => service.app.findService(path);
bool _canceled = false;
final String _eventName;
@ -522,7 +524,7 @@ class HookedServiceEvent<Id, Data, T extends Service<Id, Data>> {
Map<String, dynamic>? _params;
final RequestContext? _request;
final ResponseContext? _response;
var result;
dynamic result;
String get eventName => _eventName;
@ -532,7 +534,7 @@ class HookedServiceEvent<Id, Data, T extends Service<Id, Data>> {
bool get isBefore => !isAfter;
Map? get params => _params;
Map get params => _params ?? {};
RequestContext? get request => _request;

View file

@ -68,7 +68,20 @@ class Service<Id, Data> extends Routable {
List<RequestHandler> get bootstrappers => [];
/// The [Angel] app powering this service.
Angel? app;
Angel? _app;
Angel get app {
if (_app == null) {
throw ArgumentError("Angel is not initialized");
}
return _app!;
}
set app(Angel angel) {
_app = angel;
}
bool get isAppActive => _app != null;
/// Closes this service, including any database connections or stream controllers.
@override
@ -223,12 +236,12 @@ class Service<Id, Data> extends Routable {
var handlers = List<RequestHandler>.from(handlerss);
// Add global middleware if declared on the instance itself
var before = getAnnotation<Middleware>(service, app!.container.reflector);
var before = getAnnotation<Middleware>(service, app.container.reflector);
if (before != null) handlers.addAll(before.handlers);
var indexMiddleware =
getAnnotation<Middleware>(service.index, app!.container.reflector);
getAnnotation<Middleware>(service.index, app.container.reflector);
get('/', (req, res) {
return index(mergeMap([
{'query': req.queryParameters},
@ -241,7 +254,7 @@ class Service<Id, Data> extends Routable {
]);
var createMiddleware =
getAnnotation<Middleware>(service.create, app!.container.reflector);
getAnnotation<Middleware>(service.create, app.container.reflector);
post('/', (req, ResponseContext res) {
return req.parseBody().then((_) async {
return await create(
@ -261,7 +274,7 @@ class Service<Id, Data> extends Routable {
]);
var readMiddleware =
getAnnotation<Middleware>(service.read, app!.container.reflector);
getAnnotation<Middleware>(service.read, app.container.reflector);
get('/:id', (req, res) {
return read(
@ -277,7 +290,7 @@ class Service<Id, Data> extends Routable {
]);
var modifyMiddleware =
getAnnotation<Middleware>(service.modify, app!.container.reflector);
getAnnotation<Middleware>(service.modify, app.container.reflector);
patch('/:id', (req, res) {
return req.parseBody().then((_) async {
@ -296,7 +309,7 @@ class Service<Id, Data> extends Routable {
]);
var updateMiddleware =
getAnnotation<Middleware>(service.update, app!.container.reflector);
getAnnotation<Middleware>(service.update, app.container.reflector);
post('/:id', (req, res) {
return req.parseBody().then((_) async {
return await update(
@ -330,7 +343,7 @@ class Service<Id, Data> extends Routable {
]);
var removeMiddleware =
getAnnotation<Middleware>(service.remove, app!.container.reflector);
getAnnotation<Middleware>(service.remove, app.container.reflector);
delete('/', (req, res) {
return remove(
'' as Id,

View file

@ -3,7 +3,7 @@ library performance.hello;
import 'dart:io';
Future<Null> main() {
Future<void> main() {
return HttpServer.bind('127.0.0.1', 3000, shared: true).then((server) {
print('Listening at http://${server.address.address}:${server.port}');

View file

@ -135,8 +135,8 @@ void main() {
var type = e.isBefore ? 'before' : 'after';
print('Params to $type ${e.eventName}: ${e.params}');
expect(e.params, isMap);
expect(e.params?.keys, contains('provider'));
expect(e.params?['provider'], const IsInstanceOf<Providers>());
expect(e.params.keys, contains('provider'));
expect(e.params['provider'], const IsInstanceOf<Providers>());
}
svc