feat: 删除mobile前删除关联的已禁用token

This commit is contained in:
lxy 2025-11-06 15:54:08 +08:00
parent 212df98c60
commit 75a303ed95
14 changed files with 196 additions and 8 deletions

View File

@ -1,6 +1,8 @@
import { differenceBy } from 'oak-domain/lib/utils/lodash';
import { OakUserDisabledException } from '../../../types/Exception';
import assert from 'assert';
import { generateNewId } from 'oak-domain/lib/utils/uuid';
import { OakRowInconsistencyException } from 'oak-domain/lib/types';
export default OakComponent({
entity: 'mobile',
isList: true,
@ -108,8 +110,33 @@ export default OakComponent({
},
async onRemoveConfirm() {
const { mobileId } = this.state;
this.removeItem(mobileId);
await this.execute();
// this.removeItem(mobileId);
try {
await this.execute(undefined, undefined, undefined, [
{
entity: 'mobile',
operation: {
id: generateNewId(),
action: 'remove',
data: {},
filter: {
id: mobileId,
},
},
},
]);
}
catch (err) {
if (err instanceof OakRowInconsistencyException || err.name === 'OakRowInconsistencyException') {
this.setMessage({
content: this.t('occupied'),
type: 'warning',
});
}
else {
throw err;
}
}
this.setState({
confirmDeleteModalVisible: false,
mobileId: '',

View File

@ -7,5 +7,6 @@
},
"success": "添加成功",
"please input mobile": "请输入手机号",
"tip": "提示"
"tip": "提示",
"occupied": "当前手机号正处于登录状态,无法删除"
}

View File

@ -1,2 +1,2 @@
declare const _default: (import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatQrCode", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "extraFile", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "oauthUser", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "application", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "address", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "user", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "userEntityGrant", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "message", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "notification", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatLogin", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "articleMenu", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "article", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "parasite", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "sessionMessage", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatMenu", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatPublicTag", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatMpJump", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "system", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "passport", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "oauthApplication", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "oauthProvider", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "oauthUserAuthorization", import("../context/BackendRuntimeContext").BackendRuntimeContext<import("../oak-app-domain").EntityDict>>)[];
declare const _default: (import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "mobile", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "application", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "address", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "user", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "userEntityGrant", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatQrCode", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "message", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "notification", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatLogin", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "articleMenu", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "article", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "parasite", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "extraFile", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "sessionMessage", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatMenu", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatPublicTag", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatMpJump", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "system", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "passport", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "oauthApplication", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "oauthProvider", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "oauthUser", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "oauthUserAuthorization", import("../context/BackendRuntimeContext").BackendRuntimeContext<import("../oak-app-domain").EntityDict>>)[];
export default _default;

View File

@ -20,6 +20,7 @@ import oauthAppsTriggers from './oauthApps';
import oauthProviderTriggers from './oauthProvider';
import oauthUserTriggers from './oauthUser';
import oauthUserAuthTriggers from './oauthUserAuth';
import mobileTriggers from './mobile';
// import accountTriggers from './account';
export default [
// ...accountTriggers,
@ -45,4 +46,5 @@ export default [
...oauthProviderTriggers,
...oauthUserTriggers,
...oauthUserAuthTriggers,
...mobileTriggers,
];

5
es/triggers/mobile.d.ts vendored Normal file
View File

@ -0,0 +1,5 @@
import { Trigger } from 'oak-domain/lib/types/Trigger';
import { EntityDict } from '../oak-app-domain/EntityDict';
import { BRC } from '../types/RuntimeCxt';
declare const triggers: Trigger<EntityDict, 'mobile', BRC<EntityDict>>[];
export default triggers;

37
es/triggers/mobile.js Normal file
View File

@ -0,0 +1,37 @@
import { generateNewIdAsync } from 'oak-domain/lib/utils/uuid';
const triggers = [
{
name: '当mobile删除前将关联的已禁用token删除',
entity: 'mobile',
action: 'remove',
when: 'before',
asRoot: true,
fn: async ({ operation }, context, option) => {
const { filter } = operation;
const mobiles = await context.select('mobile', {
data: {
id: 1,
ableState: 1,
},
filter,
}, { forUpdate: true });
if (mobiles && mobiles.length > 0) {
const mobileIds = mobiles.map((ele) => ele.id);
await context.operate('token', {
id: await generateNewIdAsync(),
action: 'remove',
data: {},
filter: {
entity: 'mobile',
entityId: {
$in: mobileIds,
},
ableState: 'disabled',
},
}, option);
}
return mobiles.length;
}
}
];
export default triggers;

View File

@ -1,2 +1,2 @@
declare const _default: (import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "oauthUser", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "oauthProvider", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "oauthApplication", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "passport", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "system", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatMpJump", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatPublicTag", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatMenu", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "sessionMessage", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "parasite", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatLogin", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "notification", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatQrCode", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "userEntityGrant", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "user", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "extraFile", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "articleMenu", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "article", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "application", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "address", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "message", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "oauthUserAuthorization", import("../context/BackendRuntimeContext").BackendRuntimeContext<import("../oak-app-domain").EntityDict>>)[];
declare const _default: (import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "mobile", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "application", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "address", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "user", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "userEntityGrant", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatQrCode", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "message", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "notification", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatLogin", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "articleMenu", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "article", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "parasite", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "extraFile", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "sessionMessage", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatMenu", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatPublicTag", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatMpJump", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "system", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "passport", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "oauthApplication", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "oauthProvider", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "oauthUser", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "oauthUserAuthorization", import("../context/BackendRuntimeContext").BackendRuntimeContext<import("../oak-app-domain").EntityDict>>)[];
export default _default;

View File

@ -23,6 +23,7 @@ const oauthApps_1 = tslib_1.__importDefault(require("./oauthApps"));
const oauthProvider_1 = tslib_1.__importDefault(require("./oauthProvider"));
const oauthUser_1 = tslib_1.__importDefault(require("./oauthUser"));
const oauthUserAuth_1 = tslib_1.__importDefault(require("./oauthUserAuth"));
const mobile_1 = tslib_1.__importDefault(require("./mobile"));
// import accountTriggers from './account';
exports.default = [
// ...accountTriggers,
@ -48,4 +49,5 @@ exports.default = [
...oauthProvider_1.default,
...oauthUser_1.default,
...oauthUserAuth_1.default,
...mobile_1.default,
];

5
lib/triggers/mobile.d.ts vendored Normal file
View File

@ -0,0 +1,5 @@
import { Trigger } from 'oak-domain/lib/types/Trigger';
import { EntityDict } from '../oak-app-domain/EntityDict';
import { BRC } from '../types/RuntimeCxt';
declare const triggers: Trigger<EntityDict, 'mobile', BRC<EntityDict>>[];
export default triggers;

39
lib/triggers/mobile.js Normal file
View File

@ -0,0 +1,39 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const uuid_1 = require("oak-domain/lib/utils/uuid");
const triggers = [
{
name: '当mobile删除前将关联的已禁用token删除',
entity: 'mobile',
action: 'remove',
when: 'before',
asRoot: true,
fn: async ({ operation }, context, option) => {
const { filter } = operation;
const mobiles = await context.select('mobile', {
data: {
id: 1,
ableState: 1,
},
filter,
}, { forUpdate: true });
if (mobiles && mobiles.length > 0) {
const mobileIds = mobiles.map((ele) => ele.id);
await context.operate('token', {
id: await (0, uuid_1.generateNewIdAsync)(),
action: 'remove',
data: {},
filter: {
entity: 'mobile',
entityId: {
$in: mobileIds,
},
ableState: 'disabled',
},
}, option);
}
return mobiles.length;
}
}
];
exports.default = triggers;

View File

@ -2,6 +2,8 @@ import { differenceBy } from 'oak-domain/lib/utils/lodash';
import { OakUserDisabledException } from '../../../types/Exception';
import assert from 'assert';
import { WechatMpConfig } from '../../../oak-app-domain/Application/_baseSchema';
import { generateNewId } from 'oak-domain/lib/utils/uuid';
import { OakRowInconsistencyException } from 'oak-domain/lib/types';
export default OakComponent({
entity: 'mobile',
@ -109,8 +111,31 @@ export default OakComponent({
async onRemoveConfirm() {
const { mobileId } = this.state;
this.removeItem(mobileId);
await this.execute();
// this.removeItem(mobileId);
try {
await this.execute(undefined, undefined, undefined, [
{
entity: 'mobile',
operation: {
id: generateNewId(),
action: 'remove',
data: {},
filter: {
id: mobileId,
},
},
},
]);
} catch (err:any) {
if (err instanceof OakRowInconsistencyException || err.name === 'OakRowInconsistencyException') {
this.setMessage({
content: this.t('occupied'),
type: 'warning',
})
} else {
throw err;
}
}
this.setState({
confirmDeleteModalVisible: false,
mobileId: '',

View File

@ -7,5 +7,6 @@
},
"success": "添加成功",
"please input mobile": "请输入手机号",
"tip": "提示"
"tip": "提示",
"occupied": "当前手机号正处于登录状态,无法删除"
}

View File

@ -20,6 +20,7 @@ import oauthAppsTriggers from './oauthApps';
import oauthProviderTriggers from './oauthProvider';
import oauthUserTriggers from './oauthUser';
import oauthUserAuthTriggers from './oauthUserAuth';
import mobileTriggers from './mobile';
// import accountTriggers from './account';
@ -48,4 +49,5 @@ export default [
...oauthProviderTriggers,
...oauthUserTriggers,
...oauthUserAuthTriggers,
...mobileTriggers,
];

42
src/triggers/mobile.ts Normal file
View File

@ -0,0 +1,42 @@
import { generateNewIdAsync } from 'oak-domain/lib/utils/uuid';
import { RemoveTrigger, Trigger, } from 'oak-domain/lib/types/Trigger';
import { EntityDict } from '../oak-app-domain/EntityDict';
import { BRC } from '../types/RuntimeCxt';
const triggers: Trigger<EntityDict, 'mobile', BRC<EntityDict>>[] = [
{
name: '当mobile删除前将关联的已禁用token删除',
entity: 'mobile',
action: 'remove',
when: 'before',
asRoot: true,
fn: async ({ operation }, context, option) => {
const { filter } = operation;
const mobiles = await context.select('mobile', {
data: {
id: 1,
ableState: 1,
},
filter,
}, { forUpdate: true });
if (mobiles && mobiles.length > 0) {
const mobileIds = mobiles.map((ele) => ele.id!);
await context.operate('token', {
id: await generateNewIdAsync(),
action: 'remove',
data: {},
filter: {
entity: 'mobile',
entityId: {
$in: mobileIds,
},
ableState: 'disabled',
},
}, option);
}
return mobiles.length;
}
} as RemoveTrigger<EntityDict, 'mobile', BRC<EntityDict>>
];
export default triggers;