feat: not allow upload scheme with name occupied.
This commit is contained in:
@@ -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,
|
||||||
|
}
|
||||||
+13
-2
@@ -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": "确定分享?",
|
||||||
|
|||||||
Reference in New Issue
Block a user