feat: not allow upload scheme with name occupied.

dev
DebuggerX 3 years ago
parent da28e25377
commit faffbe1e00

@ -1,4 +1,5 @@
import 'dart:async'; import 'dart:async';
import 'dart:io';
import 'package:angel3_framework/angel3_framework.dart'; import 'package:angel3_framework/angel3_framework.dart';
import 'package:dde_gesture_manager_api/apis.dart'; import 'package:dde_gesture_manager_api/apis.dart';
@ -21,13 +22,21 @@ Future configureServer(Angel app) async {
try { try {
var scheme = SchemeSerializer.fromMap(req.bodyAsMap); var scheme = SchemeSerializer.fromMap(req.bodyAsMap);
var schemeQuery = SchemeQuery(); 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 { req.queryExecutor.transaction((tx) async {
schemeQuery = SchemeQuery();
schemeQuery.where!.uuid.equals(scheme.uuid!);
var one = await schemeQuery.getOne(tx); var one = await schemeQuery.getOne(tx);
schemeQuery = SchemeQuery(); schemeQuery = SchemeQuery();
schemeQuery.values.copyFrom(scheme); schemeQuery.values.copyFrom(scheme);
schemeQuery.values.uid = req.user!.idAsInt; schemeQuery.values.uid = req.user!.idAsInt;
if (one.isEmpty) { if (one.isEmpty) {
schemeQuery.values.metadata?['author'] = req.user!.email;
return await schemeQuery.insert(tx); return await schemeQuery.insert(tx);
} else { } else {
schemeQuery.whereId = one.value.idAsInt; schemeQuery.whereId = one.value.idAsInt;

@ -40,3 +40,9 @@ enum PanelType {
local_manager, local_manager,
market_or_me, market_or_me,
} }
enum UploadRespStatus {
done,
name_occupied,
error,
}

@ -1,6 +1,7 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:io'; 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/constants/sp_keys.dart';
import 'package:dde_gesture_manager/extensions.dart'; import 'package:dde_gesture_manager/extensions.dart';
import 'package:dde_gesture_manager/models/scheme.dart' as AppScheme; import 'package:dde_gesture_manager/models/scheme.dart' as AppScheme;
@ -146,7 +147,7 @@ class Api {
static Future<bool> checkAuthStatus() => _get<int>(Apis.auth.status, getStatusCodeFunc, ignoreErrorHandle: true) static Future<bool> checkAuthStatus() => _get<int>(Apis.auth.status, getStatusCodeFunc, ignoreErrorHandle: true)
.then((value) => value == HttpStatus.noContent); .then((value) => value == HttpStatus.noContent);
static Future<bool> uploadScheme({required AppScheme.Scheme scheme, required bool share}) => _post( static Future<UploadRespStatus> uploadScheme({required AppScheme.Scheme scheme, required bool share}) => _post(
Apis.scheme.upload, Apis.scheme.upload,
getStatusCodeFunc, getStatusCodeFunc,
body: SchemeSerializer.toMap( body: SchemeSerializer.toMap(
@ -158,7 +159,17 @@ class Api {
shared: share, 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<List<SimpleSchemeTransMetaData>?> userSchemes({required SchemeListType type}) => static Future<List<SimpleSchemeTransMetaData>?> userSchemes({required SchemeListType type}) =>
_get(Apis.scheme.user(type: type.name.param), listRespBuilderWrap(SimpleSchemeTransMetaDataSerializer.fromMap)); _get(Apis.scheme.user(type: type.name.param), listRespBuilderWrap(SimpleSchemeTransMetaDataSerializer.fromMap));

@ -301,6 +301,10 @@ class GestureEditor extends StatelessWidget {
child: DButton.upload( child: DButton.upload(
enabled: schemeProvider.readOnly == false, enabled: schemeProvider.readOnly == false,
onTap: () async { onTap: () async {
if (schemeProvider.description.isNull) {
Notificator.error(context, title: LocaleKeys.info_upload_pls_add_description.tr());
return;
}
if (context.read<ConfigsProvider>().accessToken.isNull) { if (context.read<ConfigsProvider>().accessToken.isNull) {
return Notificator.showAlert( return Notificator.showAlert(
title: LocaleKeys.info_login_for_upload_title.tr(), title: LocaleKeys.info_login_for_upload_title.tr(),
@ -326,7 +330,7 @@ class GestureEditor extends StatelessWidget {
if (_share != null) { if (_share != null) {
Api.uploadScheme(scheme: schemeProvider, share: _share).then((value) { Api.uploadScheme(scheme: schemeProvider, share: _share).then((value) {
if (value) { if (value == UploadRespStatus.done) {
Notificator.success(context, title: LocaleKeys.info_upload_success.tr()); Notificator.success(context, title: LocaleKeys.info_upload_success.tr());
var localSchemesProvider = context.read<LocalSchemesProvider>(); var localSchemesProvider = context.read<LocalSchemesProvider>();
var localSchemeEntry = localSchemesProvider.schemes! var localSchemeEntry = localSchemesProvider.schemes!
@ -336,6 +340,12 @@ class GestureEditor extends StatelessWidget {
context context
.read<SchemeListRefreshKeyProvider>() .read<SchemeListRefreshKeyProvider>()
.setProps(refreshKey: DateTime.now().millisecondsSinceEpoch); .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 { } else {
Notificator.error(context, title: LocaleKeys.info_upload_failed.tr()); Notificator.error(context, title: LocaleKeys.info_upload_failed.tr());
} }

@ -154,7 +154,10 @@
}, },
"upload": { "upload": {
"success": "Upload success ~", "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": { "share": {
"title": "Are you sure to sharing?", "title": "Are you sure to sharing?",

@ -154,7 +154,10 @@
}, },
"upload": { "upload": {
"success": "上传成功~", "success": "上传成功~",
"failed": "上传失败。。" "failed": "上传失败。。",
"name_occupied": "名称被占用……",
"pls_rename": "请重新命名",
"pls_add_description": "请填写方案描述~"
}, },
"share": { "share": {
"title": "确定分享?", "title": "确定分享?",

Loading…
Cancel
Save