61 lines
1.7 KiB
Dart
61 lines
1.7 KiB
Dart
import 'dart:mirrors';
|
|
import 'package:angel_framework/angel_framework.dart';
|
|
import 'errors.dart';
|
|
import 'is_server_side.dart';
|
|
|
|
/// Adds the authed user's id to `data`.
|
|
///
|
|
///Default [idField] is `'id'`.
|
|
/// Default [ownerField] is `'userId'`.
|
|
/// Default [userKey] is `'user'`.
|
|
HookedServiceEventListener associateCurrentUser(
|
|
{String idField,
|
|
String ownerField,
|
|
userKey,
|
|
String errorMessage,
|
|
bool allowNullUserId: false,
|
|
getId(user),
|
|
assignUserId(id, obj)}) {
|
|
return (HookedServiceEvent e) async {
|
|
var fieldName = ownerField?.isNotEmpty == true ? ownerField : 'userId';
|
|
var user = e.request?.grab(userKey ?? 'user');
|
|
|
|
if (user == null) {
|
|
if (!isServerSide(e))
|
|
throw new AngelHttpException.forbidden(
|
|
message: errorMessage ?? Errors.NOT_LOGGED_IN);
|
|
else
|
|
return;
|
|
}
|
|
|
|
_getId(user) {
|
|
if (getId != null)
|
|
return getId(user);
|
|
else if (user is Map)
|
|
return user[idField ?? 'id'];
|
|
else if (idField == null || idField == 'id')
|
|
return user.id;
|
|
else
|
|
return reflect(user).getField(new Symbol(idField ?? 'id')).reflectee;
|
|
}
|
|
|
|
var id = await _getId(user);
|
|
|
|
if (id == null && allowNullUserId != true)
|
|
throw new AngelHttpException.notProcessable(
|
|
message: 'Current user is missing a $fieldName field.');
|
|
|
|
_assignUserId(id, obj) {
|
|
if (assignUserId != null)
|
|
return assignUserId(id, obj);
|
|
else if (obj is Map)
|
|
obj[fieldName] = id;
|
|
else if (fieldName == 'userId')
|
|
obj.userId = id;
|
|
else
|
|
reflect(obj).setField(new Symbol(fieldName), id);
|
|
}
|
|
|
|
await _assignUserId(id, e.data);
|
|
};
|
|
}
|