From faffbe1e006c2296d16a1faf31206104f6615801 Mon Sep 17 00:00:00 2001 From: debuggerx Date: Mon, 17 Jan 2022 18:58:28 +0800 Subject: [PATCH] feat: not allow upload scheme with name occupied. --- api/lib/src/routes/controllers/scheme_controllers.dart | 11 ++++++++++- app/lib/constants/constants.dart | 6 ++++++ app/lib/http/api.dart | 15 +++++++++++++-- app/lib/pages/gesture_editor.dart | 12 +++++++++++- app/resources/langs/en.json | 5 ++++- app/resources/langs/zh-CN.json | 5 ++++- 6 files changed, 48 insertions(+), 6 deletions(-) diff --git a/api/lib/src/routes/controllers/scheme_controllers.dart b/api/lib/src/routes/controllers/scheme_controllers.dart index 059b1a8..fa51f38 100644 --- a/api/lib/src/routes/controllers/scheme_controllers.dart +++ b/api/lib/src/routes/controllers/scheme_controllers.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:io'; import 'package:angel3_framework/angel3_framework.dart'; import 'package:dde_gesture_manager_api/apis.dart'; @@ -21,13 +22,21 @@ Future configureServer(Angel app) async { try { var scheme = SchemeSerializer.fromMap(req.bodyAsMap); var schemeQuery = SchemeQuery(); - schemeQuery.where!.uuid.equals(scheme.uuid!); + schemeQuery.where!.uuid.notEquals(scheme.uuid!); + schemeQuery.where!.name.equals(scheme.name!); + if ((await schemeQuery.getOne(req.queryExecutor)).isNotEmpty) { + res.statusCode = HttpStatus.locked; + return res.close(); + } req.queryExecutor.transaction((tx) async { + schemeQuery = SchemeQuery(); + schemeQuery.where!.uuid.equals(scheme.uuid!); var one = await schemeQuery.getOne(tx); schemeQuery = SchemeQuery(); schemeQuery.values.copyFrom(scheme); schemeQuery.values.uid = req.user!.idAsInt; if (one.isEmpty) { + schemeQuery.values.metadata?['author'] = req.user!.email; return await schemeQuery.insert(tx); } else { schemeQuery.whereId = one.value.idAsInt; diff --git a/app/lib/constants/constants.dart b/app/lib/constants/constants.dart index a7263de..52cdae0 100644 --- a/app/lib/constants/constants.dart +++ b/app/lib/constants/constants.dart @@ -40,3 +40,9 @@ enum PanelType { local_manager, market_or_me, } + +enum UploadRespStatus { + done, + name_occupied, + error, +} \ No newline at end of file diff --git a/app/lib/http/api.dart b/app/lib/http/api.dart index cdb6142..3a52e9b 100644 --- a/app/lib/http/api.dart +++ b/app/lib/http/api.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'dart:io'; +import 'package:dde_gesture_manager/constants/constants.dart'; import 'package:dde_gesture_manager/constants/sp_keys.dart'; import 'package:dde_gesture_manager/extensions.dart'; import 'package:dde_gesture_manager/models/scheme.dart' as AppScheme; @@ -146,7 +147,7 @@ class Api { static Future checkAuthStatus() => _get(Apis.auth.status, getStatusCodeFunc, ignoreErrorHandle: true) .then((value) => value == HttpStatus.noContent); - static Future uploadScheme({required AppScheme.Scheme scheme, required bool share}) => _post( + static Future uploadScheme({required AppScheme.Scheme scheme, required bool share}) => _post( Apis.scheme.upload, getStatusCodeFunc, body: SchemeSerializer.toMap( @@ -158,7 +159,17 @@ class Api { shared: share, ), ), - ).then((value) => value == HttpStatus.noContent); + ).then((value) { + switch (value) { + case HttpStatus.noContent: + return UploadRespStatus.done; + case HttpStatus.locked: + return UploadRespStatus.name_occupied; + case HttpStatus.unprocessableEntity: + default: + return UploadRespStatus.error; + } + }); static Future?> userSchemes({required SchemeListType type}) => _get(Apis.scheme.user(type: type.name.param), listRespBuilderWrap(SimpleSchemeTransMetaDataSerializer.fromMap)); diff --git a/app/lib/pages/gesture_editor.dart b/app/lib/pages/gesture_editor.dart index 3ff5710..18194e9 100644 --- a/app/lib/pages/gesture_editor.dart +++ b/app/lib/pages/gesture_editor.dart @@ -301,6 +301,10 @@ class GestureEditor extends StatelessWidget { child: DButton.upload( enabled: schemeProvider.readOnly == false, onTap: () async { + if (schemeProvider.description.isNull) { + Notificator.error(context, title: LocaleKeys.info_upload_pls_add_description.tr()); + return; + } if (context.read().accessToken.isNull) { return Notificator.showAlert( title: LocaleKeys.info_login_for_upload_title.tr(), @@ -326,7 +330,7 @@ class GestureEditor extends StatelessWidget { if (_share != null) { Api.uploadScheme(scheme: schemeProvider, share: _share).then((value) { - if (value) { + if (value == UploadRespStatus.done) { Notificator.success(context, title: LocaleKeys.info_upload_success.tr()); var localSchemesProvider = context.read(); var localSchemeEntry = localSchemesProvider.schemes! @@ -336,6 +340,12 @@ class GestureEditor extends StatelessWidget { context .read() .setProps(refreshKey: DateTime.now().millisecondsSinceEpoch); + } else if (value == UploadRespStatus.name_occupied) { + Notificator.error( + context, + title: LocaleKeys.info_upload_name_occupied.tr(), + description: LocaleKeys.info_upload_pls_rename.tr(), + ); } else { Notificator.error(context, title: LocaleKeys.info_upload_failed.tr()); } diff --git a/app/resources/langs/en.json b/app/resources/langs/en.json index dabc42f..b88dfea 100644 --- a/app/resources/langs/en.json +++ b/app/resources/langs/en.json @@ -154,7 +154,10 @@ }, "upload": { "success": "Upload success ~", - "failed": "Upload failed.." + "failed": "Upload failed..", + "name_occupied": "Name occupied……", + "pls_rename": "Please rename", + "pls_add_description": "Please enter the scheme description" }, "share": { "title": "Are you sure to sharing?", diff --git a/app/resources/langs/zh-CN.json b/app/resources/langs/zh-CN.json index d842369..03227f9 100644 --- a/app/resources/langs/zh-CN.json +++ b/app/resources/langs/zh-CN.json @@ -154,7 +154,10 @@ }, "upload": { "success": "上传成功~", - "failed": "上传失败。。" + "failed": "上传失败。。", + "name_occupied": "名称被占用……", + "pls_rename": "请重新命名", + "pls_add_description": "请填写方案描述~" }, "share": { "title": "确定分享?",