diff --git a/lib/src/commands/service.dart b/lib/src/commands/service.dart index 50eaef2..3c56238 100644 --- a/lib/src/commands/service.dart +++ b/lib/src/commands/service.dart @@ -11,10 +11,11 @@ class ServiceCommand extends Command { final String TRESTLE = "Trestle"; final TextPen _pen = new TextPen(); - @override String get name => "service"; + @override + String get name => "service"; - @override String get description => - "Creates a new service within the given project."; + @override + String get description => "Creates a new service within the given project."; @override run() async { @@ -34,9 +35,9 @@ class ServiceCommand extends Command { if (type == MONGO) { serviceSource = _generateMongoService(name); } else if (type == MONGO_TYPED) { - _pen.blue(); - _pen("${Icon.STAR} To create a typed Mongo service, please create a schema using 'angel schema'."); - _pen(); + serviceSource = _generateMongoTypedService(name); + + await _generateMongoModel(name); } else if (type == MEMORY) { serviceSource = _generateMemoryService(name); } else if (type == CUSTOM) { @@ -50,32 +51,36 @@ class ServiceCommand extends Command { } if (serviceSource.isEmpty) { - if (type == MONGO_TYPED) - return; - fail(); throw new Exception("Empty generated service code."); } var servicesDir = new Directory("lib/src/services"); - var serviceFile = new File.fromUri(servicesDir.uri.resolve("${name.toLowerCase()}.dart")); - var serviceLibrary = new File.fromUri( - servicesDir.uri.resolve("services.dart")); + var serviceFile = + new File.fromUri(servicesDir.uri.resolve("${name.toLowerCase()}.dart")); + var serviceLibrary = + new File.fromUri(servicesDir.uri.resolve("services.dart")); var testDir = new Directory("test/services"); - var testFile = new File.fromUri(testDir.uri.resolve("${name.toLowerCase()}.dart")); + var testFile = new File.fromUri( + testDir.uri.resolve("${name.toLowerCase()}_test.dart")); - if (!await servicesDir.exists()) - await servicesDir.create(recursive: true); + if (!await servicesDir.exists()) await servicesDir.create(recursive: true); - if (!await testDir.exists()) - await testDir.create(recursive: true); + if (!await testDir.exists()) await testDir.create(recursive: true); await serviceFile.writeAsString(serviceSource); - await serviceLibrary.writeAsString( - "\nexport '${name.toLowerCase()}.dart';", mode: FileMode.APPEND); + await serviceLibrary.writeAsString("\nexport '${name.toLowerCase()}.dart';", + mode: FileMode.APPEND); await testFile.writeAsString(_generateTests(name, type)); + final runConfig = new File('./.idea/runConfigurations/${name}_tests.xml'); + + if (!await runConfig.exists()) { + await runConfig.create(recursive: true); + await runConfig.writeAsString(_generateRunConfiguration(name)); + } + _pen.green(); _pen("${Icon.CHECKMARK} Successfully generated service $name."); _pen(); @@ -90,7 +95,8 @@ class ${name}Service extends Service { // Your logic here! } } - '''.trim(); + ''' + .trim(); } _generateMemoryService(String name) { @@ -108,19 +114,112 @@ class ${name}Service extends MemoryService<$name> { // Your logic here! } } - '''.trim(); + ''' + .trim(); + } + + _generateMongoModel(String name) async { + final lower = name.toLowerCase(); + final file = new File('lib/src/models/$lower.dart'); + + if (!await file.exists()) await file.createSync(recursive: true); + + await file.writeAsString(''' +library angel.models.$lower; + +import 'dart:convert'; +import 'package:angel_mongo/model.dart'; + +class $name extends Model { + String name, desc; + + $name({this.name, this.desc}); + + factory $name.fromJson(String json) => new $name.fromMap(JSON.decode(json)); + + factory $name.fromMap(Map data) => new $name( + name: data["name"], + desc: data["desc"]); + + Map toJson() { + return { + "name": name, + "desc": desc + }; + } +} + ''' + .trim()); } _generateMongoService(String name) { - return ''' -import 'package:angel_mongo/angel_mongo.dart'; + final lower = name.toLowerCase(); + return ''' +import 'package:angel_framework/angel_framework.dart'; +import 'package:angel_mongo/angel_mongo.dart'; +import 'package:mongo_dart/mongo_dart.dart'; + +configureServer(Db db) { + return (Angel app) async { + app.use("/api/${lower}s", new ${name}Service(db.collection("${lower}s"))); + + HookedService service = app.service("api/${lower}s"); + app.container.singleton(service.inner); + }; +} + +/// Manages [$name] in the database. class ${name}Service extends MongoService { ${name}Service(collection):super(collection) { // Your logic here! } } - '''.trim(); + ''' + .trim(); + } + + _generateMongoTypedService(String name) { + final lower = name.toLowerCase(); + + return ''' +import 'package:angel_framework/angel_framework.dart'; +import 'package:angel_mongo/angel_mongo.dart'; +import 'package:mongo_dart/mongo_dart.dart'; +import '../models/$lower.dart'; +export '../models/$lower.dart'; + +configureServer(Db db) { + return (Angel app) async { + app.use("/api/${lower}s", new ${name}Service(db.collection("${lower}s"))); + + HookedService service = app.service("api/${lower}s"); + app.container.singleton(service.inner); + }; +} + +/// Manages [$name] in the database. +class ${name}Service extends MongoTypedService<$name> { + ${name}Service(collection):super(collection) { + // Your logic here! + } +} + ''' + .trim(); + } + + _generateRunConfiguration(String name) { + final lower = name.toLowerCase(); + + return ''' + + + + +''' + .trim(); } _generateTests(String name, String type) { @@ -169,7 +268,8 @@ main() { }); }); } - '''.trim(); + ''' + .trim(); } _createDb(String type) { @@ -203,4 +303,4 @@ main() { return ""; } -} \ No newline at end of file +} diff --git a/pubspec.yaml b/pubspec.yaml index ec84e24..ba1d1d5 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: angel_cli -version: 1.0.0-dev+2 +version: 1.0.0-dev+3 description: Command-line tools for the Angel framework. author: Tobe O homepage: https://github.com/angel-dart/angel_cli @@ -9,6 +9,5 @@ dependencies: analyzer: ">=0.28.1 <1.0.0" args: ">=0.3.4 <1.0.0" console: ">=2.2.3 <3.0.0" - # dart_style: "0.2.9+1 <0.3.0" mustache4dart: ">=1.0.0 <3.0.0" yaml: ">=2.0.0 <3.0.0" \ No newline at end of file