feat: add upload logic.
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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,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());
|
||||
|
||||
Reference in New Issue
Block a user