feat: add upload logic.

This commit is contained in:
2021-12-31 18:05:13 +08:00
parent 317aa006e3
commit 048c54e080
21 changed files with 317 additions and 49 deletions
+1 -1
View File
@@ -9,7 +9,7 @@ Future<void> configureServer(Angel app) async {
allowCookie: false,
deserializer: (p) async => (UserQuery()..where!.id.equals(int.parse(p)))
.getOne(app.container!.make<orm.QueryExecutor>())
.then((value) => value.value),
.then((value) => value.isNotEmpty ? value.value : User(email: '')),
serializer: (p) => p.id ?? '',
);
await auth.configureServer(app);
+35
View File
@@ -0,0 +1,35 @@
import 'package:angel3_orm/angel3_orm.dart';
import 'package:angel3_serialize/angel3_serialize.dart';
import 'package:dde_gesture_manager_api/src/models/base_model.dart';
import 'package:angel3_migration/angel3_migration.dart';
import 'package:optional/optional.dart';
part 'scheme.g.dart';
@serializable
@orm
abstract class _Scheme extends BaseModel {
@Column(isNullable: false, indexType: IndexType.unique)
@SerializableField(isNullable: false)
String? get uuid;
@Column(isNullable: false)
@SerializableField(isNullable: false)
String? get name;
@Column(isNullable: false, indexType: IndexType.standardIndex)
@SerializableField(isNullable: true, exclude: true)
int? uid;
@Column(type: ColumnType.text)
String? description;
@Column(isNullable: false, indexType: IndexType.standardIndex)
@SerializableField(defaultValue: false, isNullable: false)
bool? get shared;
@Column(type: ColumnType.jsonb)
@SerializableField()
@DefaultsTo([])
List? get gestures;
}
+4
View File
@@ -20,5 +20,9 @@ abstract class _User extends BaseModel {
@SerializableField(isNullable: true, exclude: true)
String? get password;
@Column(isNullable: false)
@SerializableField(defaultValue: false)
bool? get blocked;
String secret(String salt) => base64.encode(Hmac(sha256, salt.codeUnits).convert((password ?? '').codeUnits).bytes);
}
@@ -5,6 +5,7 @@ import 'package:angel3_auth/angel3_auth.dart';
import 'package:angel3_framework/angel3_framework.dart';
import 'package:dde_gesture_manager_api/apis.dart';
import 'package:dde_gesture_manager_api/models.dart';
import 'package:dde_gesture_manager_api/src/routes/controllers/middlewares.dart';
import 'package:mailer/mailer.dart';
import 'package:mailer/smtp_server.dart';
import 'package:uuid/uuid.dart';
@@ -48,6 +49,8 @@ Future configureServer(Angel app) async {
return res.notFound();
} else if (user.value.password != userParams.password) {
return res.unauthorized();
} else if (user.value.blocked == true) {
return res.forbidden();
} else {
var angelAuth = req.container!.make<AngelAuth>();
await angelAuth.loginById(user.value.id!, req, res);
@@ -75,4 +78,14 @@ Future configureServer(Angel app) async {
}
return res.render('sign_up_result.html', {'success': false});
});
app.get(
Apis.auth.status,
chain(
[
jwtMiddleware(),
(req, res) => req.user.blocked == false ? res.noContent() : res.forbidden(),
],
),
);
}
@@ -2,6 +2,7 @@ import 'dart:io';
import 'package:angel3_framework/angel3_framework.dart';
import 'package:angel3_orm/angel3_orm.dart' as orm;
import 'package:dde_gesture_manager_api/models.dart';
import 'package:dde_gesture_manager_api/src/config/plugins/redis_cache.dart';
import 'package:neat_cache/neat_cache.dart';
@@ -20,6 +21,16 @@ extension ResponseNoContent on ResponseContext {
statusCode = HttpStatus.unauthorized;
return close();
}
forbidden() {
statusCode = HttpStatus.forbidden;
return close();
}
unProcessableEntity() {
statusCode = HttpStatus.unprocessableEntity;
return close();
}
}
extension QueryWhereId on orm.Query {
@@ -32,6 +43,10 @@ extension QueryExecutor on RequestContext {
orm.QueryExecutor get queryExecutor => container!.make<orm.QueryExecutor>();
}
extension RedisExecutor on RequestContext {
extension RedisClient on RequestContext {
Cache get cache => container!.make<RedisCache>().cache;
}
extension JWTUserInstance on RequestContext {
User get user => container!.make<User>();
}
@@ -2,16 +2,15 @@ import 'package:angel3_auth/angel3_auth.dart';
import 'package:angel3_framework/angel3_framework.dart';
import 'package:dde_gesture_manager_api/models.dart';
import '../controllers/controller_extensions.dart';
RequestHandler jwtMiddleware() {
return (RequestContext req, ResponseContext res, {bool throwError = true}) async {
bool _reject(ResponseContext res) {
if (throwError) {
res.statusCode = 403;
throw AngelHttpException.forbidden();
} else {
return false;
res.forbidden();
}
return false;
}
if (req.container != null) {
@@ -0,0 +1,60 @@
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/scheme.dart';
import 'package:dde_gesture_manager_api/src/routes/controllers/middlewares.dart';
import 'package:logging/logging.dart';
import 'controller_extensions.dart';
Future configureServer(Angel app) async {
final _log = Logger('scheme_controller');
app.post(
Apis.scheme.upload,
chain(
[
jwtMiddleware(),
(req, res) async {
try {
var scheme = SchemeSerializer.fromMap(req.bodyAsMap);
var schemeQuery = SchemeQuery();
schemeQuery.where!.uuid.equals(scheme.uuid!);
var one = await schemeQuery.getOne(req.queryExecutor);
schemeQuery = SchemeQuery();
schemeQuery.values.copyFrom(scheme);
schemeQuery.values.uid = int.parse(req.user.id!);
if (one.isEmpty) {
await schemeQuery.insert(req.queryExecutor);
} else {
schemeQuery.whereId = int.parse(one.value.id!);
await schemeQuery.updateOne(req.queryExecutor);
}
} catch (e) {
_log.severe(e);
return res.unProcessableEntity();
}
return res.noContent();
},
],
),
);
app.get(
Apis.scheme.userUploads,
chain(
[
jwtMiddleware(),
(req, res) async {
var schemeQuery = SchemeQuery();
schemeQuery.where!.uid.equals(int.parse(req.user.id!));
schemeQuery.orderBy(SchemeFields.updatedAt, descending: true);
return schemeQuery.get(req.queryExecutor).then((value) => value.map((e) => {
'name': e.name,
'description': e.description,
}).toList());
},
],
),
);
}
+2
View File
@@ -2,6 +2,7 @@ import 'package:angel3_framework/angel3_framework.dart';
import 'package:file/file.dart';
import 'controllers/auth_controllers.dart' as auth_controllers;
import 'controllers/system_controllers.dart' as system_controllers;
import 'controllers/scheme_controllers.dart' as scheme_controllers;
/// Put your app routes here!
///
@@ -22,6 +23,7 @@ AngelConfigurer configureServer(FileSystem fileSystem) {
// Typically, you want to mount controllers first, after any global middleware.
await app.configure(system_controllers.configureServerWithFileSystem(fileSystem));
await app.configure(auth_controllers.configureServer);
await app.configure(scheme_controllers.configureServer);
// Throw a 404 if no route matched the request.
app.fallback((req, res) => throw AngelHttpException.notFound());