From 1a0e8f8de72ab86ff07d0c9cbf33c192ede8bac0 Mon Sep 17 00:00:00 2001 From: debuggerx Date: Fri, 17 Dec 2021 19:12:50 +0800 Subject: [PATCH] feat: change api framework to angel3. --- api/.gitignore | 2 + api/lib/apis.dart | 8 + api/lib/models.dart | 1 + api/lib/src/models/app_version.dart | 11 + api/lib/src/models/user.g.dart | 369 --------------------- .../src/routes/controllers/system_controllers.dart | 26 ++ api/lib/src/routes/routes.dart | 6 +- api/pubspec.yaml | 1 + app/lib/widgets/version_checker.dart | 14 +- app/pubspec.yaml | 2 + 10 files changed, 68 insertions(+), 372 deletions(-) create mode 100644 api/lib/apis.dart create mode 100644 api/lib/src/models/app_version.dart delete mode 100644 api/lib/src/models/user.g.dart create mode 100644 api/lib/src/routes/controllers/system_controllers.dart diff --git a/api/.gitignore b/api/.gitignore index a0541d9..342a80c 100644 --- a/api/.gitignore +++ b/api/.gitignore @@ -93,3 +93,5 @@ server_log.txt /config/production.yaml /config/development.yaml + +*.g.dart diff --git a/api/lib/apis.dart b/api/lib/apis.dart new file mode 100644 index 0000000..e309e7b --- /dev/null +++ b/api/lib/apis.dart @@ -0,0 +1,8 @@ +class Apis { + static final system = SystemApis(); +} + +class SystemApis { + static final String _path = '/system'; + String get appVersion => _path + '/app-version'; +} \ No newline at end of file diff --git a/api/lib/models.dart b/api/lib/models.dart index b72d675..e604c02 100644 --- a/api/lib/models.dart +++ b/api/lib/models.dart @@ -1 +1,2 @@ export 'src/models/user.dart'; +export 'src/models/app_version.dart'; \ No newline at end of file diff --git a/api/lib/src/models/app_version.dart b/api/lib/src/models/app_version.dart new file mode 100644 index 0000000..e52b2b3 --- /dev/null +++ b/api/lib/src/models/app_version.dart @@ -0,0 +1,11 @@ +import 'package:angel3_serialize/angel3_serialize.dart'; +part 'app_version.g.dart'; + +@serializable +abstract class _AppVersion { + @SerializableField(isNullable: false) + String? get versionName; + + @SerializableField(isNullable: false) + int? get versionCode; +} \ No newline at end of file diff --git a/api/lib/src/models/user.g.dart b/api/lib/src/models/user.g.dart deleted file mode 100644 index 669e5f8..0000000 --- a/api/lib/src/models/user.g.dart +++ /dev/null @@ -1,369 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'user.dart'; - -// ************************************************************************** -// MigrationGenerator -// ************************************************************************** - -class UserMigration extends Migration { - @override - void up(Schema schema) { - schema.create('users', (table) { - table.serial('id').primaryKey(); - table.timeStamp('created_at'); - table.timeStamp('updated_at'); - table.declareColumn( - 'metadata', Column(type: ColumnType('jsonb'), length: 256)); - table.varChar('email', length: 256); - table.varChar('password', length: 256); - table.varChar('token', length: 256); - }); - } - - @override - void down(Schema schema) { - schema.drop('users'); - } -} - -// ************************************************************************** -// OrmGenerator -// ************************************************************************** - -class UserQuery extends Query { - UserQuery({Query? parent, Set? trampoline}) : super(parent: parent) { - trampoline ??= {}; - trampoline.add(tableName); - _where = UserQueryWhere(this); - } - - @override - final UserQueryValues values = UserQueryValues(); - - UserQueryWhere? _where; - - @override - Map get casts { - return {}; - } - - @override - String get tableName { - return 'users'; - } - - @override - List get fields { - return const [ - 'id', - 'created_at', - 'updated_at', - 'metadata', - 'email', - 'password', - 'token' - ]; - } - - @override - UserQueryWhere? get where { - return _where; - } - - @override - UserQueryWhere newWhereClause() { - return UserQueryWhere(this); - } - - static User? parseRow(List row) { - if (row.every((x) => x == null)) { - return null; - } - var model = User( - id: row[0].toString(), - createdAt: (row[1] as DateTime?), - updatedAt: (row[2] as DateTime?), - metadata: (row[3] as Map?), - email: (row[4] as String?), - password: (row[5] as String?), - token: (row[6] as String?)); - return model; - } - - @override - Optional deserialize(List row) { - return Optional.ofNullable(parseRow(row)); - } -} - -class UserQueryWhere extends QueryWhere { - UserQueryWhere(UserQuery query) - : id = NumericSqlExpressionBuilder(query, 'id'), - createdAt = DateTimeSqlExpressionBuilder(query, 'created_at'), - updatedAt = DateTimeSqlExpressionBuilder(query, 'updated_at'), - metadata = MapSqlExpressionBuilder(query, 'metadata'), - email = StringSqlExpressionBuilder(query, 'email'), - password = StringSqlExpressionBuilder(query, 'password'), - token = StringSqlExpressionBuilder(query, 'token'); - - final NumericSqlExpressionBuilder id; - - final DateTimeSqlExpressionBuilder createdAt; - - final DateTimeSqlExpressionBuilder updatedAt; - - final MapSqlExpressionBuilder metadata; - - final StringSqlExpressionBuilder email; - - final StringSqlExpressionBuilder password; - - final StringSqlExpressionBuilder token; - - @override - List get expressionBuilders { - return [id, createdAt, updatedAt, metadata, email, password, token]; - } -} - -class UserQueryValues extends MapQueryValues { - @override - Map get casts { - return {}; - } - - String? get id { - return (values['id'] as String?); - } - - set id(String? value) => values['id'] = value; - DateTime? get createdAt { - return (values['created_at'] as DateTime?); - } - - set createdAt(DateTime? value) => values['created_at'] = value; - DateTime? get updatedAt { - return (values['updated_at'] as DateTime?); - } - - set updatedAt(DateTime? value) => values['updated_at'] = value; - Map? get metadata { - return (values['metadata'] as Map?); - } - - set metadata(Map? value) => values['metadata'] = value; - String? get email { - return (values['email'] as String?); - } - - set email(String? value) => values['email'] = value; - String? get password { - return (values['password'] as String?); - } - - set password(String? value) => values['password'] = value; - String? get token { - return (values['token'] as String?); - } - - set token(String? value) => values['token'] = value; - void copyFrom(User model) { - createdAt = model.createdAt; - updatedAt = model.updatedAt; - metadata = model.metadata; - email = model.email; - password = model.password; - token = model.token; - } -} - -// ************************************************************************** -// JsonModelGenerator -// ************************************************************************** - -@generatedSerializable -class User extends _User { - User( - {this.id, - this.createdAt, - this.updatedAt, - Map? metadata, - required this.email, - required this.password, - required this.token}) - : metadata = Map.unmodifiable(metadata ?? {}); - - /// A unique identifier corresponding to this item. - @override - String? id; - - /// The time at which this item was created. - @override - DateTime? createdAt; - - /// The last time at which this item was updated. - @override - DateTime? updatedAt; - - @override - Map? metadata; - - @override - String? email; - - @override - String? password; - - @override - String? token; - - User copyWith( - {String? id, - DateTime? createdAt, - DateTime? updatedAt, - Map? metadata, - String? email, - String? password, - String? token}) { - return User( - id: id ?? this.id, - createdAt: createdAt ?? this.createdAt, - updatedAt: updatedAt ?? this.updatedAt, - metadata: metadata ?? this.metadata, - email: email ?? this.email, - password: password ?? this.password, - token: token ?? this.token); - } - - @override - bool operator ==(other) { - return other is _User && - other.id == id && - other.createdAt == createdAt && - other.updatedAt == updatedAt && - MapEquality( - keys: DefaultEquality(), values: DefaultEquality()) - .equals(other.metadata, metadata) && - other.email == email && - other.password == password && - other.token == token; - } - - @override - int get hashCode { - return hashObjects( - [id, createdAt, updatedAt, metadata, email, password, token]); - } - - @override - String toString() { - return 'User(id=$id, createdAt=$createdAt, updatedAt=$updatedAt, metadata=$metadata, email=$email, password=$password, token=$token)'; - } - - Map toJson() { - return UserSerializer.toMap(this); - } -} - -// ************************************************************************** -// SerializerGenerator -// ************************************************************************** - -const UserSerializer userSerializer = UserSerializer(); - -class UserEncoder extends Converter { - const UserEncoder(); - - @override - Map convert(User model) => UserSerializer.toMap(model); -} - -class UserDecoder extends Converter { - const UserDecoder(); - - @override - User convert(Map map) => UserSerializer.fromMap(map); -} - -class UserSerializer extends Codec { - const UserSerializer(); - - @override - UserEncoder get encoder => const UserEncoder(); - @override - UserDecoder get decoder => const UserDecoder(); - static User fromMap(Map map) { - if (map['email'] == null) { - throw FormatException("Missing required field 'email' on User."); - } - - if (map['password'] == null) { - throw FormatException("Missing required field 'password' on User."); - } - - if (map['token'] == null) { - throw FormatException("Missing required field 'token' on User."); - } - - return User( - id: map['id'] as String?, - createdAt: map['created_at'] != null - ? (map['created_at'] is DateTime - ? (map['created_at'] as DateTime) - : DateTime.parse(map['created_at'].toString())) - : null, - updatedAt: map['updated_at'] != null - ? (map['updated_at'] is DateTime - ? (map['updated_at'] as DateTime) - : DateTime.parse(map['updated_at'].toString())) - : null, - metadata: map['metadata'] is Map - ? (map['metadata'] as Map).cast() - : {}, - email: map['email'] as String?, - password: map['password'] as String?, - token: map['token'] as String?); - } - - static Map toMap(_User? model) { - if (model == null) { - return {}; - } - return { - 'id': model.id, - 'created_at': model.createdAt?.toIso8601String(), - 'updated_at': model.updatedAt?.toIso8601String(), - 'metadata': model.metadata, - 'email': model.email, - 'password': model.password, - 'token': model.token - }; - } -} - -abstract class UserFields { - static const List allFields = [ - id, - createdAt, - updatedAt, - metadata, - email, - password, - token - ]; - - static const String id = 'id'; - - static const String createdAt = 'created_at'; - - static const String updatedAt = 'updated_at'; - - static const String metadata = 'metadata'; - - static const String email = 'email'; - - static const String password = 'password'; - - static const String token = 'token'; -} diff --git a/api/lib/src/routes/controllers/system_controllers.dart b/api/lib/src/routes/controllers/system_controllers.dart new file mode 100644 index 0000000..9ff1c39 --- /dev/null +++ b/api/lib/src/routes/controllers/system_controllers.dart @@ -0,0 +1,26 @@ +import 'dart:async'; + +import 'package:angel3_framework/angel3_framework.dart'; +import 'package:dde_gesture_manager_api/apis.dart'; +import 'package:dde_gesture_manager_api/src/models/app_version.dart'; +import 'package:file/file.dart'; +import 'package:yaml/yaml.dart'; + +late FileSystem fs; + +Future configureServer(Angel app) async { + app.get( + Apis.system.appVersion, + (req, res) async { + var pubspec = fs.currentDirectory.parent.childDirectory('app').childFile('pubspec.yaml').readAsStringSync(); + var version = loadYaml(pubspec)['version'] as String; + var versions = version.split('+'); + return res.json(AppVersion(versionName: versions.first, versionCode: int.parse(versions.last))); + }, + ); +} + +configureServerWithFileSystem(FileSystem fileSystem) { + fs = fileSystem; + return configureServer; +} diff --git a/api/lib/src/routes/routes.dart b/api/lib/src/routes/routes.dart index 23a8dec..f1eec6c 100644 --- a/api/lib/src/routes/routes.dart +++ b/api/lib/src/routes/routes.dart @@ -1,6 +1,7 @@ import 'package:angel3_framework/angel3_framework.dart'; import 'package:file/file.dart'; -import 'controllers/user_controllers.dart' as UserControllers; +import 'controllers/user_controllers.dart' as user_controllers; +import 'controllers/system_controllers.dart' as system_controllers; /// Put your app routes here! /// @@ -11,7 +12,8 @@ import 'controllers/user_controllers.dart' as UserControllers; AngelConfigurer configureServer(FileSystem fileSystem) { return (Angel app) async { // Typically, you want to mount controllers first, after any global middleware. - await app.configure(UserControllers.configureServer); + await app.configure(system_controllers.configureServerWithFileSystem(fileSystem)); + await app.configure(user_controllers.configureServer); // Throw a 404 if no route matched the request. app.fallback((req, res) => throw AngelHttpException.notFound()); diff --git a/api/pubspec.yaml b/api/pubspec.yaml index 877dd7b..d4f6806 100644 --- a/api/pubspec.yaml +++ b/api/pubspec.yaml @@ -18,6 +18,7 @@ dependencies: belatuk_pretty_logging: ^4.0.0 optional: ^6.0.0 logging: ^1.0.0 + yaml: ^3.1.0 dev_dependencies: angel3_hot: ^4.2.0 angel3_jinja: ^2.0.1 diff --git a/app/lib/widgets/version_checker.dart b/app/lib/widgets/version_checker.dart index 7aeb7d3..7e39321 100644 --- a/app/lib/widgets/version_checker.dart +++ b/app/lib/widgets/version_checker.dart @@ -1,6 +1,11 @@ +import 'dart:convert'; + import 'package:dde_gesture_manager/extensions.dart'; import 'package:flutter/material.dart'; import 'package:package_info_plus/package_info_plus.dart'; +import 'package:http/http.dart' as http; +import 'package:dde_gesture_manager_api/apis.dart'; +import 'package:dde_gesture_manager_api/models.dart'; class VersionChecker extends StatelessWidget { const VersionChecker({Key? key}) : super(key: key); @@ -21,7 +26,14 @@ class VersionChecker extends StatelessWidget { padding: const EdgeInsets.symmetric(horizontal: 3), child: TextButton( child: Text(LocaleKeys.version_check_update).tr(), - onPressed: () {}, + onPressed: () { + http.get(Uri.parse('http://127.0.0.1:3000' + Apis.system.appVersion)).then((value) { + var appVersion = AppVersionSerializer.fromMap(json.decode(value.body)); + appVersion.versionName.sout(); + appVersion.versionCode.sout(); + appVersion.sout(); + }); + }, ), ), ], diff --git a/app/pubspec.yaml b/app/pubspec.yaml index e64e791..11a3699 100644 --- a/app/pubspec.yaml +++ b/app/pubspec.yaml @@ -46,6 +46,8 @@ dependencies: path: 3rd_party/cherry_toast xdg_directories_web: path: 3rd_party/xdg_directories_web + dde_gesture_manager_api: + path: ../api dev_dependencies: flutter_test: