captcha添加application外键,创建captcha时附上applicationId

This commit is contained in:
lxy 2025-08-19 17:18:46 +08:00
parent 130740db93
commit c79b7ca63f
20 changed files with 104 additions and 21 deletions

View File

@ -2027,6 +2027,7 @@ export async function sendCaptchaByMobile({ mobile, env, type: captchaType, }, c
expired: false,
expiresAt: now + duration * 60 * 1000,
type: captchaType,
applicationId: application?.id,
},
}, {
dontCollect: true,
@ -2158,6 +2159,7 @@ export async function sendCaptchaByEmail({ email, env, type: captchaType, }, con
// }
code = Array.from({ length: digit }, () => Math.floor(Math.random() * 10)).join('');
const id = await generateNewIdAsync();
const applicationId = context.getApplication()?.id;
await context.operate('captcha', {
id: await generateNewIdAsync(),
action: 'create',
@ -2171,6 +2173,7 @@ export async function sendCaptchaByEmail({ email, env, type: captchaType, }, con
expired: false,
expiresAt: now + duration * 60 * 1000,
type: captchaType,
applicationId,
},
}, {
dontCollect: true,

View File

@ -2,6 +2,7 @@ import { EntityShape } from 'oak-domain/lib/types/Entity';
import { String, Text, Boolean, Datetime } from 'oak-domain/lib/types/DataType';
import { ActionDef } from 'oak-domain/lib/types';
import { EntityDesc } from 'oak-domain/lib/types/EntityDesc';
import { Schema as Application } from './Application';
export interface Schema extends EntityShape {
origin: 'mobile' | 'email';
content: String<32>;
@ -12,6 +13,7 @@ export interface Schema extends EntityShape {
expired: Boolean;
expiresAt: Datetime;
type: 'login' | 'changePassword' | 'confirm';
application?: Application;
}
export type IState = 'unsent' | 'sending' | 'sent' | 'failure';
export type IAction = 'send' | 'success' | 'fail';

View File

@ -22,6 +22,7 @@ export const entityDesc = {
expiresAt: '过期时间',
iState: '状态',
type: '类型',
application: '应用',
},
action: {
send: '发送',

View File

@ -44,6 +44,10 @@ export const desc = {
type: "enum",
enumeration: ["login", "changePassword", "confirm"]
},
applicationId: {
type: "ref",
ref: "application"
},
iState: {
type: "enum",
enumeration: ["unsent", "sending", "sent", "failure"]

View File

@ -1,3 +1,4 @@
import { ForeignKey } from "oak-domain/lib/types/DataType";
import { Q_DateValue, Q_BooleanValue, Q_NumberValue, Q_StringValue, Q_EnumValue, NodeId, ExprOp, ExpressionKey } from "oak-domain/lib/types/Demand";
import { MakeAction as OakMakeAction, EntityShape } from "oak-domain/lib/types/Entity";
import { Action, ParticularAction, IState } from "./Action";
@ -12,6 +13,7 @@ export type OpSchema = EntityShape & {
expired: Boolean;
expiresAt: Datetime;
type: "login" | "changePassword" | "confirm";
applicationId?: ForeignKey<"application"> | null;
iState?: IState | null;
} & {
[A in ExpressionKey]?: any;
@ -31,6 +33,7 @@ export type OpFilter = {
expired: Q_BooleanValue;
expiresAt: Q_DateValue;
type: Q_EnumValue<"login" | "changePassword" | "confirm">;
applicationId: Q_StringValue;
iState: Q_EnumValue<IState>;
} & ExprOp<OpAttr | string>;
export type OpProjection = {
@ -49,6 +52,7 @@ export type OpProjection = {
expired?: number;
expiresAt?: number;
type?: number;
applicationId?: number;
iState?: number;
} & Partial<ExprOp<OpAttr | string>>;
export type OpSortAttr = Partial<{
@ -64,6 +68,7 @@ export type OpSortAttr = Partial<{
expired: number;
expiresAt: number;
type: number;
applicationId: number;
iState: number;
[k: string]: any;
} | ExprOp<OpAttr | string>>;

View File

@ -10,7 +10,8 @@
"expired": "是否过期",
"expiresAt": "过期时间",
"iState": "状态",
"type": "类型"
"type": "类型",
"application": "应用"
},
"action": {
"send": "发送",

View File

@ -1038,6 +1038,7 @@ export type Application = {
system: System["Schema"];
domain?: Domain["Schema"];
applicationPassport$application?: Array<Omit<ApplicationPassport["Schema"], "application">>;
captcha$application?: Array<Omit<Captcha["Schema"], "application">>;
extraFile$application?: Array<Omit<ExtraFile["Schema"], "application">>;
notification$application?: Array<Omit<Notification["Schema"], "application">>;
sessionMessage$application?: Array<Omit<SessionMessage["Schema"], "application">>;
@ -1050,6 +1051,7 @@ export type Application = {
wechatUser$application?: Array<Omit<WechatUser["Schema"], "application">>;
session$entity?: Array<Omit<Session["Schema"], "entity">>;
applicationPassport$application$$aggr?: AggregationResult<Omit<ApplicationPassport["Schema"], "application">>;
captcha$application$$aggr?: AggregationResult<Omit<Captcha["Schema"], "application">>;
extraFile$application$$aggr?: AggregationResult<Omit<ExtraFile["Schema"], "application">>;
notification$application$$aggr?: AggregationResult<Omit<Notification["Schema"], "application">>;
sessionMessage$application$$aggr?: AggregationResult<Omit<SessionMessage["Schema"], "application">>;
@ -1071,6 +1073,12 @@ export type Application = {
applicationPassport$application$$aggr?: DeduceAggregation<Omit<ApplicationPassport["Projection"], "application">, Omit<ApplicationPassport["Filter"], "application">, ApplicationPassport["Sorter"]> & {
$entity: "applicationPassport";
};
captcha$application?: OakSelection<"select", Omit<Captcha["Projection"], "application">, Omit<Captcha["Filter"], "application">, Captcha["Sorter"]> & {
$entity: "captcha";
};
captcha$application$$aggr?: DeduceAggregation<Omit<Captcha["Projection"], "application">, Omit<Captcha["Filter"], "application">, Captcha["Sorter"]> & {
$entity: "captcha";
};
extraFile$application?: OakSelection<"select", Omit<ExtraFile["Projection"], "application">, Omit<ExtraFile["Filter"], "application">, ExtraFile["Sorter"]> & {
$entity: "extraFile";
};
@ -1142,6 +1150,7 @@ export type Application = {
system: MakeFilter<System["FilterUnit"]>;
domain: MakeFilter<Domain["FilterUnit"]>;
applicationPassport$application: MakeFilter<Omit<ApplicationPassport["FilterUnit"], "application">> & SubQueryPredicateMetadata;
captcha$application: MakeFilter<Omit<Captcha["FilterUnit"], "application">> & SubQueryPredicateMetadata;
extraFile$application: MakeFilter<Omit<ExtraFile["FilterUnit"], "application">> & SubQueryPredicateMetadata;
notification$application: MakeFilter<Omit<Notification["FilterUnit"], "application">> & SubQueryPredicateMetadata;
sessionMessage$application: MakeFilter<Omit<SessionMessage["FilterUnit"], "application">> & SubQueryPredicateMetadata;
@ -1170,6 +1179,7 @@ export type Application = {
system?: OakOperation<"create", System["CreateOperationData"]> | OakOperation<BaseSystem.OpUpdateAction, System["UpdateOperationData"], System["Filter"]>;
domain?: OakOperation<"create", Domain["CreateOperationData"]> | OakOperation<BaseDomain.OpUpdateAction, Domain["UpdateOperationData"], Domain["Filter"]>;
applicationPassport$application?: (OakOperation<"create", Omit<ApplicationPassport["CreateOperationData"], "application"> | Omit<ApplicationPassport["CreateOperationData"], "application">[]> | OakOperation<BaseApplicationPassport.OpUpdateAction, Omit<ApplicationPassport["UpdateOperationData"], "application">, ApplicationPassport["Filter"]>)[];
captcha$application?: (OakOperation<"create", Omit<Captcha["CreateOperationData"], "application"> | Omit<Captcha["CreateOperationData"], "application">[]> | OakOperation<BaseCaptcha.OpUpdateAction, Omit<Captcha["UpdateOperationData"], "application">, Captcha["Filter"]>)[];
extraFile$application?: (OakOperation<"create", Omit<ExtraFile["CreateOperationData"], "application"> | Omit<ExtraFile["CreateOperationData"], "application">[]> | OakOperation<BaseExtraFile.OpUpdateAction, Omit<ExtraFile["UpdateOperationData"], "application">, ExtraFile["Filter"]>)[];
notification$application?: (OakOperation<"create", Omit<Notification["CreateOperationData"], "application"> | Omit<Notification["CreateOperationData"], "application">[]> | OakOperation<BaseNotification.OpUpdateAction, Omit<Notification["UpdateOperationData"], "application">, Notification["Filter"]>)[];
sessionMessage$application?: (OakOperation<"create", Omit<SessionMessage["CreateOperationData"], "application"> | Omit<SessionMessage["CreateOperationData"], "application">[]> | OakOperation<BaseSessionMessage.OpUpdateAction, Omit<SessionMessage["UpdateOperationData"], "application">, SessionMessage["Filter"]>)[];
@ -1189,6 +1199,7 @@ export type Application = {
system?: OakOperation<"create", System["CreateOperationData"]> | OakOperation<BaseSystem.OpUpdateAction, System["UpdateOperationData"], System["Filter"]> | OakOperation<"remove", System["RemoveOperationData"], System["Filter"]>;
domain?: OakOperation<"create", Domain["CreateOperationData"]> | OakOperation<BaseDomain.OpUpdateAction, Domain["UpdateOperationData"], Domain["Filter"]> | OakOperation<"remove", Domain["RemoveOperationData"], Domain["Filter"]>;
applicationPassport$application?: (OakOperation<"create", Omit<ApplicationPassport["CreateOperationData"], "application"> | Omit<ApplicationPassport["CreateOperationData"], "application">[]> | OakOperation<BaseApplicationPassport.OpUpdateAction, Omit<ApplicationPassport["UpdateOperationData"], "application">, ApplicationPassport["Filter"]> | OakOperation<"remove", ApplicationPassport["RemoveOperationData"], ApplicationPassport["Filter"]>)[];
captcha$application?: (OakOperation<"create", Omit<Captcha["CreateOperationData"], "application"> | Omit<Captcha["CreateOperationData"], "application">[]> | OakOperation<BaseCaptcha.OpUpdateAction, Omit<Captcha["UpdateOperationData"], "application">, Captcha["Filter"]> | OakOperation<"remove", Captcha["RemoveOperationData"], Captcha["Filter"]>)[];
extraFile$application?: (OakOperation<"create", Omit<ExtraFile["CreateOperationData"], "application"> | Omit<ExtraFile["CreateOperationData"], "application">[]> | OakOperation<BaseExtraFile.OpUpdateAction, Omit<ExtraFile["UpdateOperationData"], "application">, ExtraFile["Filter"]> | OakOperation<"remove", ExtraFile["RemoveOperationData"], ExtraFile["Filter"]>)[];
notification$application?: (OakOperation<"create", Omit<Notification["CreateOperationData"], "application"> | Omit<Notification["CreateOperationData"], "application">[]> | OakOperation<BaseNotification.OpUpdateAction, Omit<Notification["UpdateOperationData"], "application">, Notification["Filter"]> | OakOperation<"remove", Notification["RemoveOperationData"], Notification["Filter"]>)[];
sessionMessage$application?: (OakOperation<"create", Omit<SessionMessage["CreateOperationData"], "application"> | Omit<SessionMessage["CreateOperationData"], "application">[]> | OakOperation<BaseSessionMessage.OpUpdateAction, Omit<SessionMessage["UpdateOperationData"], "application">, SessionMessage["Filter"]> | OakOperation<"remove", SessionMessage["RemoveOperationData"], SessionMessage["Filter"]>)[];
@ -1447,11 +1458,19 @@ export type ArticleMenu = {
export type Captcha = {
OpSchema: BaseCaptcha.OpSchema;
Action: BaseCaptcha.OpAction;
Schema: BaseCaptcha.OpSchema & {};
Projection: BaseCaptcha.OpProjection & {};
FilterUnit: BaseCaptcha.OpFilter & {};
Schema: BaseCaptcha.OpSchema & {
application?: Application["Schema"];
};
Projection: BaseCaptcha.OpProjection & {
application?: Application["Projection"];
};
FilterUnit: BaseCaptcha.OpFilter & {
application: MakeFilter<Application["FilterUnit"]>;
};
Filter: MakeFilter<Captcha["FilterUnit"]>;
SortAttr: Partial<BaseCaptcha.OpSortAttr | {}>;
SortAttr: Partial<BaseCaptcha.OpSortAttr | {
application: Application["SortAttr"];
}>;
SortNode: {
$attr: Captcha["SortAttr"];
$direction?: "asc" | "desc";
@ -1459,11 +1478,15 @@ export type Captcha = {
Sorter: Captcha["SortNode"][];
Selection: OakSelection<"select", Captcha["Projection"], Captcha["Filter"], Captcha["Sorter"]>;
Aggregation: DeduceAggregation<Captcha["Projection"], Captcha["Filter"], Captcha["Sorter"]>;
CreateOperationData: FormCreateData<BaseCaptcha.OpSchema>;
CreateOperationData: FormCreateData<BaseCaptcha.OpSchema & {
application?: OakOperation<"create", Application["CreateOperationData"]> | OakOperation<BaseApplication.OpUpdateAction, Application["UpdateOperationData"], Application["Filter"]>;
}>;
CreateSingle: OakOperation<"create", Captcha["CreateOperationData"]>;
CreateMulti: OakOperation<"create", Array<Captcha["CreateOperationData"]>>;
Create: Captcha["CreateSingle"] | Captcha["CreateMulti"];
UpdateOperationData: FormUpdateData<BaseCaptcha.OpSchema>;
UpdateOperationData: FormUpdateData<BaseCaptcha.OpSchema & {
application?: OakOperation<"create", Application["CreateOperationData"]> | OakOperation<BaseApplication.OpUpdateAction, Application["UpdateOperationData"], Application["Filter"]> | OakOperation<"remove", Application["RemoveOperationData"], Application["Filter"]>;
}>;
Update: OakOperation<BaseCaptcha.OpUpdateAction, Captcha["UpdateOperationData"], Captcha["Filter"], Captcha["Sorter"]>;
RemoveOperationData: {};
Remove: OakOperation<"remove", Captcha["RemoveOperationData"], Captcha["Filter"], Captcha["Sorter"]>;

View File

@ -19,6 +19,6 @@ export declare function syncMessageTemplate<ED extends EntityDict>(params: {
example: string;
keywordEnumValueList: {
keywordCode: string;
enumValueList: string[];
enumValueList: Array<string>;
}[];
}[]>;

View File

@ -2050,6 +2050,7 @@ async function sendCaptchaByMobile({ mobile, env, type: captchaType, }, context)
expired: false,
expiresAt: now + duration * 60 * 1000,
type: captchaType,
applicationId: application?.id,
},
}, {
dontCollect: true,
@ -2181,6 +2182,7 @@ async function sendCaptchaByEmail({ email, env, type: captchaType, }, context) {
// }
code = Array.from({ length: digit }, () => Math.floor(Math.random() * 10)).join('');
const id = await (0, uuid_1.generateNewIdAsync)();
const applicationId = context.getApplication()?.id;
await context.operate('captcha', {
id: await (0, uuid_1.generateNewIdAsync)(),
action: 'create',
@ -2194,6 +2196,7 @@ async function sendCaptchaByEmail({ email, env, type: captchaType, }, context) {
expired: false,
expiresAt: now + duration * 60 * 1000,
type: captchaType,
applicationId,
},
}, {
dontCollect: true,

View File

@ -2,6 +2,7 @@ import { EntityShape } from 'oak-domain/lib/types/Entity';
import { String, Text, Boolean, Datetime } from 'oak-domain/lib/types/DataType';
import { ActionDef } from 'oak-domain/lib/types';
import { EntityDesc } from 'oak-domain/lib/types/EntityDesc';
import { Schema as Application } from './Application';
export interface Schema extends EntityShape {
origin: 'mobile' | 'email';
content: String<32>;
@ -12,6 +13,7 @@ export interface Schema extends EntityShape {
expired: Boolean;
expiresAt: Datetime;
type: 'login' | 'changePassword' | 'confirm';
application?: Application;
}
export type IState = 'unsent' | 'sending' | 'sent' | 'failure';
export type IAction = 'send' | 'success' | 'fail';

View File

@ -25,6 +25,7 @@ exports.entityDesc = {
expiresAt: '过期时间',
iState: '状态',
type: '类型',
application: '应用',
},
action: {
send: '发送',

View File

@ -47,6 +47,10 @@ exports.desc = {
type: "enum",
enumeration: ["login", "changePassword", "confirm"]
},
applicationId: {
type: "ref",
ref: "application"
},
iState: {
type: "enum",
enumeration: ["unsent", "sending", "sent", "failure"]

View File

@ -1,3 +1,4 @@
import { ForeignKey } from "oak-domain/lib/types/DataType";
import { Q_DateValue, Q_BooleanValue, Q_NumberValue, Q_StringValue, Q_EnumValue, NodeId, ExprOp, ExpressionKey } from "oak-domain/lib/types/Demand";
import { MakeAction as OakMakeAction, EntityShape } from "oak-domain/lib/types/Entity";
import { Action, ParticularAction, IState } from "./Action";
@ -12,6 +13,7 @@ export type OpSchema = EntityShape & {
expired: Boolean;
expiresAt: Datetime;
type: "login" | "changePassword" | "confirm";
applicationId?: ForeignKey<"application"> | null;
iState?: IState | null;
} & {
[A in ExpressionKey]?: any;
@ -31,6 +33,7 @@ export type OpFilter = {
expired: Q_BooleanValue;
expiresAt: Q_DateValue;
type: Q_EnumValue<"login" | "changePassword" | "confirm">;
applicationId: Q_StringValue;
iState: Q_EnumValue<IState>;
} & ExprOp<OpAttr | string>;
export type OpProjection = {
@ -49,6 +52,7 @@ export type OpProjection = {
expired?: number;
expiresAt?: number;
type?: number;
applicationId?: number;
iState?: number;
} & Partial<ExprOp<OpAttr | string>>;
export type OpSortAttr = Partial<{
@ -64,6 +68,7 @@ export type OpSortAttr = Partial<{
expired: number;
expiresAt: number;
type: number;
applicationId: number;
iState: number;
[k: string]: any;
} | ExprOp<OpAttr | string>>;

View File

@ -10,7 +10,8 @@
"expired": "是否过期",
"expiresAt": "过期时间",
"iState": "状态",
"type": "类型"
"type": "类型",
"application": "应用"
},
"action": {
"send": "发送",

View File

@ -1038,6 +1038,7 @@ export type Application = {
system: System["Schema"];
domain?: Domain["Schema"];
applicationPassport$application?: Array<Omit<ApplicationPassport["Schema"], "application">>;
captcha$application?: Array<Omit<Captcha["Schema"], "application">>;
extraFile$application?: Array<Omit<ExtraFile["Schema"], "application">>;
notification$application?: Array<Omit<Notification["Schema"], "application">>;
sessionMessage$application?: Array<Omit<SessionMessage["Schema"], "application">>;
@ -1050,6 +1051,7 @@ export type Application = {
wechatUser$application?: Array<Omit<WechatUser["Schema"], "application">>;
session$entity?: Array<Omit<Session["Schema"], "entity">>;
applicationPassport$application$$aggr?: AggregationResult<Omit<ApplicationPassport["Schema"], "application">>;
captcha$application$$aggr?: AggregationResult<Omit<Captcha["Schema"], "application">>;
extraFile$application$$aggr?: AggregationResult<Omit<ExtraFile["Schema"], "application">>;
notification$application$$aggr?: AggregationResult<Omit<Notification["Schema"], "application">>;
sessionMessage$application$$aggr?: AggregationResult<Omit<SessionMessage["Schema"], "application">>;
@ -1071,6 +1073,12 @@ export type Application = {
applicationPassport$application$$aggr?: DeduceAggregation<Omit<ApplicationPassport["Projection"], "application">, Omit<ApplicationPassport["Filter"], "application">, ApplicationPassport["Sorter"]> & {
$entity: "applicationPassport";
};
captcha$application?: OakSelection<"select", Omit<Captcha["Projection"], "application">, Omit<Captcha["Filter"], "application">, Captcha["Sorter"]> & {
$entity: "captcha";
};
captcha$application$$aggr?: DeduceAggregation<Omit<Captcha["Projection"], "application">, Omit<Captcha["Filter"], "application">, Captcha["Sorter"]> & {
$entity: "captcha";
};
extraFile$application?: OakSelection<"select", Omit<ExtraFile["Projection"], "application">, Omit<ExtraFile["Filter"], "application">, ExtraFile["Sorter"]> & {
$entity: "extraFile";
};
@ -1142,6 +1150,7 @@ export type Application = {
system: MakeFilter<System["FilterUnit"]>;
domain: MakeFilter<Domain["FilterUnit"]>;
applicationPassport$application: MakeFilter<Omit<ApplicationPassport["FilterUnit"], "application">> & SubQueryPredicateMetadata;
captcha$application: MakeFilter<Omit<Captcha["FilterUnit"], "application">> & SubQueryPredicateMetadata;
extraFile$application: MakeFilter<Omit<ExtraFile["FilterUnit"], "application">> & SubQueryPredicateMetadata;
notification$application: MakeFilter<Omit<Notification["FilterUnit"], "application">> & SubQueryPredicateMetadata;
sessionMessage$application: MakeFilter<Omit<SessionMessage["FilterUnit"], "application">> & SubQueryPredicateMetadata;
@ -1170,6 +1179,7 @@ export type Application = {
system?: OakOperation<"create", System["CreateOperationData"]> | OakOperation<BaseSystem.OpUpdateAction, System["UpdateOperationData"], System["Filter"]>;
domain?: OakOperation<"create", Domain["CreateOperationData"]> | OakOperation<BaseDomain.OpUpdateAction, Domain["UpdateOperationData"], Domain["Filter"]>;
applicationPassport$application?: (OakOperation<"create", Omit<ApplicationPassport["CreateOperationData"], "application"> | Omit<ApplicationPassport["CreateOperationData"], "application">[]> | OakOperation<BaseApplicationPassport.OpUpdateAction, Omit<ApplicationPassport["UpdateOperationData"], "application">, ApplicationPassport["Filter"]>)[];
captcha$application?: (OakOperation<"create", Omit<Captcha["CreateOperationData"], "application"> | Omit<Captcha["CreateOperationData"], "application">[]> | OakOperation<BaseCaptcha.OpUpdateAction, Omit<Captcha["UpdateOperationData"], "application">, Captcha["Filter"]>)[];
extraFile$application?: (OakOperation<"create", Omit<ExtraFile["CreateOperationData"], "application"> | Omit<ExtraFile["CreateOperationData"], "application">[]> | OakOperation<BaseExtraFile.OpUpdateAction, Omit<ExtraFile["UpdateOperationData"], "application">, ExtraFile["Filter"]>)[];
notification$application?: (OakOperation<"create", Omit<Notification["CreateOperationData"], "application"> | Omit<Notification["CreateOperationData"], "application">[]> | OakOperation<BaseNotification.OpUpdateAction, Omit<Notification["UpdateOperationData"], "application">, Notification["Filter"]>)[];
sessionMessage$application?: (OakOperation<"create", Omit<SessionMessage["CreateOperationData"], "application"> | Omit<SessionMessage["CreateOperationData"], "application">[]> | OakOperation<BaseSessionMessage.OpUpdateAction, Omit<SessionMessage["UpdateOperationData"], "application">, SessionMessage["Filter"]>)[];
@ -1189,6 +1199,7 @@ export type Application = {
system?: OakOperation<"create", System["CreateOperationData"]> | OakOperation<BaseSystem.OpUpdateAction, System["UpdateOperationData"], System["Filter"]> | OakOperation<"remove", System["RemoveOperationData"], System["Filter"]>;
domain?: OakOperation<"create", Domain["CreateOperationData"]> | OakOperation<BaseDomain.OpUpdateAction, Domain["UpdateOperationData"], Domain["Filter"]> | OakOperation<"remove", Domain["RemoveOperationData"], Domain["Filter"]>;
applicationPassport$application?: (OakOperation<"create", Omit<ApplicationPassport["CreateOperationData"], "application"> | Omit<ApplicationPassport["CreateOperationData"], "application">[]> | OakOperation<BaseApplicationPassport.OpUpdateAction, Omit<ApplicationPassport["UpdateOperationData"], "application">, ApplicationPassport["Filter"]> | OakOperation<"remove", ApplicationPassport["RemoveOperationData"], ApplicationPassport["Filter"]>)[];
captcha$application?: (OakOperation<"create", Omit<Captcha["CreateOperationData"], "application"> | Omit<Captcha["CreateOperationData"], "application">[]> | OakOperation<BaseCaptcha.OpUpdateAction, Omit<Captcha["UpdateOperationData"], "application">, Captcha["Filter"]> | OakOperation<"remove", Captcha["RemoveOperationData"], Captcha["Filter"]>)[];
extraFile$application?: (OakOperation<"create", Omit<ExtraFile["CreateOperationData"], "application"> | Omit<ExtraFile["CreateOperationData"], "application">[]> | OakOperation<BaseExtraFile.OpUpdateAction, Omit<ExtraFile["UpdateOperationData"], "application">, ExtraFile["Filter"]> | OakOperation<"remove", ExtraFile["RemoveOperationData"], ExtraFile["Filter"]>)[];
notification$application?: (OakOperation<"create", Omit<Notification["CreateOperationData"], "application"> | Omit<Notification["CreateOperationData"], "application">[]> | OakOperation<BaseNotification.OpUpdateAction, Omit<Notification["UpdateOperationData"], "application">, Notification["Filter"]> | OakOperation<"remove", Notification["RemoveOperationData"], Notification["Filter"]>)[];
sessionMessage$application?: (OakOperation<"create", Omit<SessionMessage["CreateOperationData"], "application"> | Omit<SessionMessage["CreateOperationData"], "application">[]> | OakOperation<BaseSessionMessage.OpUpdateAction, Omit<SessionMessage["UpdateOperationData"], "application">, SessionMessage["Filter"]> | OakOperation<"remove", SessionMessage["RemoveOperationData"], SessionMessage["Filter"]>)[];
@ -1447,11 +1458,19 @@ export type ArticleMenu = {
export type Captcha = {
OpSchema: BaseCaptcha.OpSchema;
Action: BaseCaptcha.OpAction;
Schema: BaseCaptcha.OpSchema & {};
Projection: BaseCaptcha.OpProjection & {};
FilterUnit: BaseCaptcha.OpFilter & {};
Schema: BaseCaptcha.OpSchema & {
application?: Application["Schema"];
};
Projection: BaseCaptcha.OpProjection & {
application?: Application["Projection"];
};
FilterUnit: BaseCaptcha.OpFilter & {
application: MakeFilter<Application["FilterUnit"]>;
};
Filter: MakeFilter<Captcha["FilterUnit"]>;
SortAttr: Partial<BaseCaptcha.OpSortAttr | {}>;
SortAttr: Partial<BaseCaptcha.OpSortAttr | {
application: Application["SortAttr"];
}>;
SortNode: {
$attr: Captcha["SortAttr"];
$direction?: "asc" | "desc";
@ -1459,11 +1478,15 @@ export type Captcha = {
Sorter: Captcha["SortNode"][];
Selection: OakSelection<"select", Captcha["Projection"], Captcha["Filter"], Captcha["Sorter"]>;
Aggregation: DeduceAggregation<Captcha["Projection"], Captcha["Filter"], Captcha["Sorter"]>;
CreateOperationData: FormCreateData<BaseCaptcha.OpSchema>;
CreateOperationData: FormCreateData<BaseCaptcha.OpSchema & {
application?: OakOperation<"create", Application["CreateOperationData"]> | OakOperation<BaseApplication.OpUpdateAction, Application["UpdateOperationData"], Application["Filter"]>;
}>;
CreateSingle: OakOperation<"create", Captcha["CreateOperationData"]>;
CreateMulti: OakOperation<"create", Array<Captcha["CreateOperationData"]>>;
Create: Captcha["CreateSingle"] | Captcha["CreateMulti"];
UpdateOperationData: FormUpdateData<BaseCaptcha.OpSchema>;
UpdateOperationData: FormUpdateData<BaseCaptcha.OpSchema & {
application?: OakOperation<"create", Application["CreateOperationData"]> | OakOperation<BaseApplication.OpUpdateAction, Application["UpdateOperationData"], Application["Filter"]> | OakOperation<"remove", Application["RemoveOperationData"], Application["Filter"]>;
}>;
Update: OakOperation<BaseCaptcha.OpUpdateAction, Captcha["UpdateOperationData"], Captcha["Filter"], Captcha["Sorter"]>;
RemoveOperationData: {};
Remove: OakOperation<"remove", Captcha["RemoveOperationData"], Captcha["Filter"], Captcha["Sorter"]>;

View File

@ -1,2 +1,2 @@
declare const _default: (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, "application", 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, "address", 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, "articleMenu", 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, "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, "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, "parasite", 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>>)[];
declare const _default: (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>>)[];
export default _default;

View File

@ -1,6 +1,8 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.tryMakeEmailNotification = exports.tryMakeSmsNotification = exports.registerMessageNotificationConverters = void 0;
exports.registerMessageNotificationConverters = registerMessageNotificationConverters;
exports.tryMakeSmsNotification = tryMakeSmsNotification;
exports.tryMakeEmailNotification = tryMakeEmailNotification;
const uuid_1 = require("oak-domain/lib/utils/uuid");
const assert_1 = require("oak-domain/lib/utils/assert");
const lodash_1 = require("oak-domain/lib/utils/lodash");
@ -11,7 +13,6 @@ function registerMessageNotificationConverters(converters) {
ConverterDict[ele.type] = ele;
});
}
exports.registerMessageNotificationConverters = registerMessageNotificationConverters;
const InitialChannelByWeightMatrix = {
high: ['wechatMp', 'wechatPublic', 'sms', 'email'],
medium: ['wechatMp', 'wechatPublic', 'email'],
@ -46,7 +47,6 @@ async function tryMakeSmsNotification(message, context) {
}
}
}
exports.tryMakeSmsNotification = tryMakeSmsNotification;
async function tryMakeEmailNotification(message, context) {
const { userId, type, entity, entityId, router } = message;
const converter = ConverterDict[type] && ConverterDict[type].toEmail;
@ -61,7 +61,6 @@ async function tryMakeEmailNotification(message, context) {
}
}
}
exports.tryMakeEmailNotification = tryMakeEmailNotification;
async function createNotification(message, context) {
const { restriction, userId, weight, type, entity, entityId, platformId, channels } = message;
(0, assert_1.assert)(userId);

View File

@ -10,7 +10,7 @@ export declare function getEmail<ED extends EntityDict>(origin: string): Email<E
export declare function getOrigin(): string[];
export declare function sendEmail<ED extends EntityDict>(options: EmailOptions, context: BRC<ED>): Promise<{
success: boolean;
error?: string | undefined;
error?: string;
} | {
success: boolean;
error: unknown;

View File

@ -2718,6 +2718,7 @@ export async function sendCaptchaByMobile<ED extends EntityDict>(
expired: false,
expiresAt: now + duration * 60 * 1000,
type: captchaType,
applicationId: application?.id!,
},
},
{
@ -2885,6 +2886,7 @@ export async function sendCaptchaByEmail<ED extends EntityDict>(
// }
code = Array.from({ length: digit }, () => Math.floor(Math.random() * 10)).join('');
const id = await generateNewIdAsync();
const applicationId = context.getApplication()?.id!;
await context.operate(
'captcha',
{
@ -2900,6 +2902,7 @@ export async function sendCaptchaByEmail<ED extends EntityDict>(
expired: false,
expiresAt: now + duration * 60 * 1000,
type: captchaType,
applicationId,
},
},
{

View File

@ -2,6 +2,7 @@ import { ActionType, EntityShape } from 'oak-domain/lib/types/Entity';
import { String, Text, Boolean, Datetime } from 'oak-domain/lib/types/DataType';
import { ActionDef, Index } from 'oak-domain/lib/types';
import { EntityDesc } from 'oak-domain/lib/types/EntityDesc';
import { Schema as Application } from './Application';
export interface Schema extends EntityShape {
origin: 'mobile' | 'email';
@ -13,6 +14,7 @@ export interface Schema extends EntityShape {
expired: Boolean;
expiresAt: Datetime;
type: 'login' | 'changePassword' | 'confirm';
application?: Application;
};
export type IState = 'unsent' | 'sending' | 'sent' | 'failure';
@ -47,6 +49,7 @@ export const entityDesc: EntityDesc<Schema, Action, '', {
expiresAt: '过期时间',
iState: '状态',
type: '类型',
application: '应用',
},
action: {
send: '发送',