Custom plug-ins :)
This commit is contained in:
parent
3655c7020e
commit
9a7a7d29e1
15 changed files with 81 additions and 61 deletions
9
.idea/runConfigurations/Start_Server__PRODUCTION_.xml
Normal file
9
.idea/runConfigurations/Start_Server__PRODUCTION_.xml
Normal file
|
@ -0,0 +1,9 @@
|
|||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="Start Server (PRODUCTION)" type="DartCommandLineRunConfigurationType" factoryName="Dart Command Line Application" singleton="true">
|
||||
<option name="envs">
|
||||
<entry key="ANGEL_ENV" value="production" />
|
||||
</option>
|
||||
<option name="filePath" value="$PROJECT_DIR$/bin/server.dart" />
|
||||
<method />
|
||||
</configuration>
|
||||
</component>
|
6
.idea/runConfigurations/Users_Tests.xml
Normal file
6
.idea/runConfigurations/Users_Tests.xml
Normal file
|
@ -0,0 +1,6 @@
|
|||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="Users Tests" type="DartTestRunConfigurationType" factoryName="Dart Test" singleton="true">
|
||||
<option name="filePath" value="$PROJECT_DIR$/test/services/users_test.dart" />
|
||||
<method />
|
||||
</configuration>
|
||||
</component>
|
0
analysis_options.yaml
Normal file
0
analysis_options.yaml
Normal file
|
@ -4,7 +4,6 @@ import 'dart:async';
|
|||
import 'dart:io';
|
||||
import 'package:angel/angel.dart';
|
||||
import 'package:angel_diagnostics/angel_diagnostics.dart';
|
||||
import 'package:angel_framework/angel_framework.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
|
||||
main() async {
|
||||
|
|
|
@ -6,6 +6,7 @@ import 'package:angel_framework/angel_framework.dart';
|
|||
import 'src/config/config.dart' as configuration;
|
||||
import 'src/routes/routes.dart' as routes;
|
||||
import 'src/services/services.dart' as services;
|
||||
export 'src/services/services.dart';
|
||||
|
||||
/// Creates and configures the server instance.
|
||||
Future<Angel> createServer() async {
|
||||
|
|
|
@ -5,9 +5,11 @@ import 'dart:io';
|
|||
import 'package:angel_configuration/angel_configuration.dart';
|
||||
import 'package:angel_framework/angel_framework.dart';
|
||||
import 'package:angel_mustache/angel_mustache.dart';
|
||||
import 'plugins/plugins.dart' as plugins;
|
||||
|
||||
/// This is a perfect place to include configuration and load plug-ins.
|
||||
configureServer(Angel app) async {
|
||||
await app.configure(loadConfigurationFile());
|
||||
await app.configure(mustache(new Directory('views')));
|
||||
await plugins.configureServer(app);
|
||||
}
|
||||
|
|
9
lib/src/config/plugins/plugins.dart
Normal file
9
lib/src/config/plugins/plugins.dart
Normal file
|
@ -0,0 +1,9 @@
|
|||
/// Custom plugins go here.
|
||||
library angel.config.plugins;
|
||||
|
||||
import 'dart:async';
|
||||
import 'package:angel_framework/angel_framework.dart';
|
||||
|
||||
Future configureServer(Angel app) async {
|
||||
// Include any plugins you have made here.
|
||||
}
|
|
@ -26,18 +26,18 @@ class User extends Model {
|
|||
|
||||
factory User.fromMap(Map data) => new User(
|
||||
id: data['id'],
|
||||
email: data["email"],
|
||||
username: data["username"],
|
||||
password: data["password"],
|
||||
roles: data["roles"]);
|
||||
email: data['email'],
|
||||
username: data['username'],
|
||||
password: data['password'],
|
||||
roles: data['roles']);
|
||||
|
||||
Map toJson() {
|
||||
return {
|
||||
"id": id,
|
||||
"email": email,
|
||||
"username": username,
|
||||
"password": password,
|
||||
"roles": roles
|
||||
'id': id,
|
||||
'email': email,
|
||||
'username': username,
|
||||
'password': password,
|
||||
'roles': roles
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,17 +4,17 @@ import 'package:angel_auth/angel_auth.dart';
|
|||
import 'package:angel_framework/angel_framework.dart';
|
||||
import '../../services/user.dart';
|
||||
|
||||
@Expose("/api/auth")
|
||||
@Expose('/api/auth')
|
||||
class AuthController extends Controller {
|
||||
final AngelAuth auth = new AngelAuth();
|
||||
|
||||
deserializer(String id) async => app.service("api/users").read(id);
|
||||
deserializer(String id) async => app.service('api/users').read(id);
|
||||
serializer(User user) async => user.id;
|
||||
|
||||
/// Attempt to log a user in
|
||||
verifier(UserService Users) {
|
||||
return (String username, String password) async {
|
||||
List<User> users = await Users.index({"username": username});
|
||||
List<User> users = await Users.index({'username': username});
|
||||
|
||||
if (users.isNotEmpty) {
|
||||
var hash = hashPassword(password);
|
||||
|
@ -36,14 +36,14 @@ class AuthController extends Controller {
|
|||
await app.configure(auth);
|
||||
}
|
||||
|
||||
bool loggedIn(RequestContext req) => req.session["userId"] != null;
|
||||
bool loggedIn(RequestContext req) => req.session['userId'] != null;
|
||||
|
||||
@Expose("/login", method: "POST")
|
||||
@Expose('/login', method: 'POST')
|
||||
login(RequestContext req) async {
|
||||
// Include log-in logic here...
|
||||
}
|
||||
|
||||
@Expose("/register", method: "POST")
|
||||
@Expose('/register', method: 'POST')
|
||||
register(RequestContext req, UserService Users) async {
|
||||
// And your registration logic...
|
||||
}
|
||||
|
|
|
@ -26,7 +26,7 @@ configureAfter(Angel app) async {
|
|||
|
||||
// Default error handler
|
||||
app.onError(
|
||||
(e, req, res) async => res.render("error", {"message": e.message}));
|
||||
(e, req, res) async => res.render('error', {'message': e.message}));
|
||||
}
|
||||
|
||||
configureServer(Angel app) async {
|
||||
|
|
|
@ -7,7 +7,7 @@ import 'package:mongo_dart/mongo_dart.dart';
|
|||
import 'user.dart' as User;
|
||||
|
||||
configureServer(Angel app) async {
|
||||
Db db = new Db(app.properties["mongo_db"]);
|
||||
Db db = new Db(app.properties['mongo_db']);
|
||||
await db.open();
|
||||
|
||||
await app.configure(User.configureServer(db));
|
||||
|
|
|
@ -8,9 +8,9 @@ export '../models/user.dart';
|
|||
|
||||
configureServer(Db db) {
|
||||
return (Angel app) async {
|
||||
app.use("/api/users", new UserService(db.collection("users")));
|
||||
app.use('/api/users', new UserService(db.collection('users')));
|
||||
|
||||
HookedService service = app.service("api/users");
|
||||
HookedService service = app.service('api/users');
|
||||
app.container.singleton(service.inner);
|
||||
};
|
||||
}
|
||||
|
@ -32,7 +32,7 @@ class UserService extends Service {
|
|||
|
||||
@override
|
||||
index([Map params]) {
|
||||
if (params != null && params.containsKey("provider")) {
|
||||
if (params != null && params.containsKey('provider')) {
|
||||
// Nobody needs to see the entire user list except for the server.
|
||||
throw new AngelHttpException.Forbidden();
|
||||
}
|
||||
|
@ -42,19 +42,19 @@ class UserService extends Service {
|
|||
|
||||
@override
|
||||
create(data, [Map params]) {
|
||||
if (params != null && params.containsKey("provider")) {
|
||||
if (params != null && params.containsKey('provider')) {
|
||||
// Deny creating users to the public - this should be done by the server only.
|
||||
throw new AngelHttpException.Forbidden();
|
||||
}
|
||||
|
||||
try {
|
||||
Validate.isKeyInMap("username", data);
|
||||
Validate.isKeyInMap("password", data);
|
||||
Validate.isEmail(data["email"]);
|
||||
data["password"] = hashPassword(data["password"]);
|
||||
Validate.isKeyInMap('username', data);
|
||||
Validate.isKeyInMap('password', data);
|
||||
Validate.isEmail(data['email']);
|
||||
data['password'] = hashPassword(data['password']);
|
||||
} catch (e) {
|
||||
throw new AngelHttpException.BadRequest(
|
||||
message: "User must have a username, e-mail address and password.");
|
||||
message: 'User must have a username, e-mail address and password.');
|
||||
}
|
||||
|
||||
return _inner.create(data, params);
|
||||
|
|
|
@ -14,6 +14,7 @@ dependencies:
|
|||
angel_mustache: ^1.0.0-dev
|
||||
angel_proxy: ^1.0.0-dev
|
||||
angel_static: ^1.1.0-dev
|
||||
angel_test: ^1.0.0-dev
|
||||
mailer: ^1.1.0+4
|
||||
validate: ^1.5.2
|
||||
dev_dependencies:
|
||||
|
|
|
@ -1,34 +0,0 @@
|
|||
import 'dart:io';
|
||||
import 'package:angel/angel.dart';
|
||||
import 'package:angel_framework/angel_framework.dart';
|
||||
import 'package:http/http.dart';
|
||||
import 'package:test/test.dart';
|
||||
|
||||
main() async {
|
||||
group('services.users', () {
|
||||
Angel app;
|
||||
Client client = new Client();
|
||||
Map headers = {
|
||||
HttpHeaders.ACCEPT: ContentType.JSON.mimeType,
|
||||
HttpHeaders.CONTENT_TYPE: ContentType.JSON.mimeType
|
||||
};
|
||||
HttpServer server;
|
||||
String url;
|
||||
|
||||
setUp(() async {
|
||||
Angel app = await createServer();
|
||||
server = await app.startServer(InternetAddress.LOOPBACK_IP_V4, 3000);
|
||||
url = "http://localhost:3000";
|
||||
});
|
||||
|
||||
tearDown(() async {
|
||||
await server.close(force: true);
|
||||
client.close();
|
||||
});
|
||||
|
||||
test('index users', () async {
|
||||
Response response = await client.get("$url/api/users");
|
||||
expect(response.statusCode, equals(HttpStatus.OK));
|
||||
});
|
||||
});
|
||||
}
|
27
test/services/users_test.dart
Normal file
27
test/services/users_test.dart
Normal file
|
@ -0,0 +1,27 @@
|
|||
import 'dart:io';
|
||||
import 'package:angel/angel.dart';
|
||||
import 'package:angel_framework/angel_framework.dart';
|
||||
import 'package:angel_test/angel_test.dart';
|
||||
import 'package:test/test.dart';
|
||||
|
||||
main() async {
|
||||
Angel app;
|
||||
TestClient client;
|
||||
|
||||
setUp(() async {
|
||||
app = await createServer();
|
||||
client = await connectTo(app, saveSession: false);
|
||||
});
|
||||
|
||||
tearDown(() async {
|
||||
await client.close();
|
||||
app = null;
|
||||
});
|
||||
|
||||
test('index users', () async {
|
||||
final response = await client.get('/api/users');
|
||||
|
||||
// By default, we locked this away from the Internet...
|
||||
expect(response, hasStatus(HttpStatus.FORBIDDEN));
|
||||
});
|
||||
}
|
Loading…
Reference in a new issue