From 7baa7f808c83a343cd9acc78c95c732112729052 Mon Sep 17 00:00:00 2001 From: qcqcqc <1220204124@zust.edu.cn> Date: Wed, 22 Oct 2025 18:17:28 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BF=AE=E6=94=B9=E4=BA=86oauth?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E7=9B=B8=E5=85=B3=E7=9A=84=E5=AE=9E=E4=BD=93?= =?UTF-8?q?=E5=AE=9A=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- es/entities/OauthApplication.d.ts | 3 +- es/entities/OauthApplication.js | 1 + es/entities/OauthUserAuthorization.d.ts | 13 ++++- es/entities/OauthUserAuthorization.js | 29 ++++++++++ es/oak-app-domain/ActionDefDict.d.ts | 3 ++ es/oak-app-domain/ActionDefDict.js | 2 + es/oak-app-domain/EntityDict.d.ts | 19 ++++++- .../OauthApplication/Action.d.ts | 3 +- es/oak-app-domain/OauthApplication/Action.js | 2 +- .../OauthApplication/locales/zh_CN.json | 3 +- .../OauthUserAuthorization/Action.d.ts | 11 ++++ .../OauthUserAuthorization/Action.js | 9 ++++ .../OauthUserAuthorization/Storage.js | 11 +++- .../OauthUserAuthorization/Style.d.ts | 3 ++ .../OauthUserAuthorization/Style.js | 12 +++++ .../OauthUserAuthorization/_baseSchema.d.ts | 18 +++++-- .../OauthUserAuthorization/locales/zh_CN.json | 14 ++++- es/oak-app-domain/StyleDict.js | 2 + lib/entities/OauthApplication.d.ts | 3 +- lib/entities/OauthApplication.js | 1 + lib/entities/OauthUserAuthorization.d.ts | 13 ++++- lib/entities/OauthUserAuthorization.js | 31 ++++++++++- lib/oak-app-domain/ActionDefDict.d.ts | 3 ++ lib/oak-app-domain/ActionDefDict.js | 38 ++++++------- lib/oak-app-domain/EntityDict.d.ts | 19 ++++++- .../OauthApplication/Action.d.ts | 3 +- lib/oak-app-domain/OauthApplication/Action.js | 2 +- .../OauthApplication/locales/zh_CN.json | 3 +- .../OauthUserAuthorization/Action.d.ts | 11 ++++ .../OauthUserAuthorization/Action.js | 12 +++++ .../OauthUserAuthorization/Storage.js | 13 +++-- .../OauthUserAuthorization/Style.d.ts | 3 ++ .../OauthUserAuthorization/Style.js | 15 ++++++ .../OauthUserAuthorization/_baseSchema.d.ts | 18 +++++-- .../OauthUserAuthorization/locales/zh_CN.json | 14 ++++- lib/oak-app-domain/StyleDict.js | 54 ++++++++++--------- src/entities/OauthApplication.ts | 4 +- src/entities/OauthUserAuthorization.ts | 43 +++++++++++++-- 38 files changed, 381 insertions(+), 80 deletions(-) create mode 100644 es/oak-app-domain/OauthUserAuthorization/Action.d.ts create mode 100644 es/oak-app-domain/OauthUserAuthorization/Action.js create mode 100644 es/oak-app-domain/OauthUserAuthorization/Style.d.ts create mode 100644 es/oak-app-domain/OauthUserAuthorization/Style.js create mode 100644 lib/oak-app-domain/OauthUserAuthorization/Action.d.ts create mode 100644 lib/oak-app-domain/OauthUserAuthorization/Action.js create mode 100644 lib/oak-app-domain/OauthUserAuthorization/Style.d.ts create mode 100644 lib/oak-app-domain/OauthUserAuthorization/Style.js diff --git a/es/entities/OauthApplication.d.ts b/es/entities/OauthApplication.d.ts index b2c764759..1a737b936 100644 --- a/es/entities/OauthApplication.d.ts +++ b/es/entities/OauthApplication.d.ts @@ -15,7 +15,8 @@ export interface Schema extends EntityShape { isConfidential: Boolean; scopes?: StringListJson; } -export type Action = AbleAction; +export type SecretAction = 'resetSecret'; +export type Action = AbleAction | SecretAction; export declare const AbleActionDef: ActionDef; export declare const entityDesc: EntityDesc; +export type UsageState = 'granted' | 'denied' | 'revoked'; +export type UsageAction = 'revoke'; +export type Action = UsageAction; +export declare const UsageActionDef: ActionDef; +export declare const entityDesc: EntityDesc; diff --git a/es/entities/OauthUserAuthorization.js b/es/entities/OauthUserAuthorization.js index e9292e5e4..d2b7827be 100644 --- a/es/entities/OauthUserAuthorization.js +++ b/es/entities/OauthUserAuthorization.js @@ -1,4 +1,9 @@ ; +export const UsageActionDef = { + stm: { + revoke: ['granted', "revoked"] + } +}; export const entityDesc = { locales: { zh_CN: { @@ -9,7 +14,31 @@ export const entityDesc = { application: 'Oauth应用', authorizedAt: '首次授权时间', token: '关联的令牌', + code: '授权码', + usageState: '授权状态', }, + action: { + revoke: '撤销授权', + }, + v: { + usageState: { + granted: '已授权', + denied: '未授权', + revoked: '已撤销', + } + } }, }, + style: { + icon: { + revoke: 'fa-user-slash', + }, + color: { + usageState: { + granted: '#28a745', + denied: '#dc3545', + revoked: '#6c757d', + } + } + } }; diff --git a/es/oak-app-domain/ActionDefDict.d.ts b/es/oak-app-domain/ActionDefDict.d.ts index 3c0abc4bc..ec01ef5e9 100644 --- a/es/oak-app-domain/ActionDefDict.d.ts +++ b/es/oak-app-domain/ActionDefDict.d.ts @@ -31,6 +31,9 @@ export declare const actionDefDict: { oauthProvider: { ableState: import("oak-domain/lib/types").ActionDef; }; + oauthUserAuthorization: { + usageState: import("oak-domain/lib/types").ActionDef; + }; parasite: {}; toDo: { iState: import("oak-domain/lib/types").ActionDef; diff --git a/es/oak-app-domain/ActionDefDict.js b/es/oak-app-domain/ActionDefDict.js index 8e00c4870..91c3a7a12 100644 --- a/es/oak-app-domain/ActionDefDict.js +++ b/es/oak-app-domain/ActionDefDict.js @@ -9,6 +9,7 @@ import { actionDefDict as mobile } from "./Mobile/Action"; import { actionDefDict as notification } from "./Notification/Action"; import { actionDefDict as oauthApplication } from "./OauthApplication/Action"; import { actionDefDict as oauthProvider } from "./OauthProvider/Action"; +import { actionDefDict as oauthUserAuthorization } from "./OauthUserAuthorization/Action"; import { actionDefDict as parasite } from "./Parasite/Action"; import { actionDefDict as toDo } from "./ToDo/Action"; import { actionDefDict as token } from "./Token/Action"; @@ -30,6 +31,7 @@ export const actionDefDict = { notification, oauthApplication, oauthProvider, + oauthUserAuthorization, parasite, toDo, token, diff --git a/es/oak-app-domain/EntityDict.d.ts b/es/oak-app-domain/EntityDict.d.ts index f5e4b57b9..29f04e6ee 100644 --- a/es/oak-app-domain/EntityDict.d.ts +++ b/es/oak-app-domain/EntityDict.d.ts @@ -2223,7 +2223,9 @@ export type OauthAuthorizationCode = { application: OauthApplication["Schema"]; user: User["Schema"]; oauthToken$code?: Array>; + oauthUserAuthorization$code?: Array>; oauthToken$code$$aggr?: AggregationResult>; + oauthUserAuthorization$code$$aggr?: AggregationResult>; }; Projection: BaseOauthAuthorizationCode.OpProjection & { application?: OauthApplication["Projection"]; @@ -2234,11 +2236,18 @@ export type OauthAuthorizationCode = { oauthToken$code$$aggr?: DeduceAggregation, Omit, OauthToken["Sorter"]> & { $entity: "oauthToken"; }; + oauthUserAuthorization$code?: OakSelection<"select", Omit, Omit, OauthUserAuthorization["Sorter"]> & { + $entity: "oauthUserAuthorization"; + }; + oauthUserAuthorization$code$$aggr?: DeduceAggregation, Omit, OauthUserAuthorization["Sorter"]> & { + $entity: "oauthUserAuthorization"; + }; }; FilterUnit: BaseOauthAuthorizationCode.OpFilter & { application: MakeFilter; user: MakeFilter; oauthToken$code: MakeFilter> & SubQueryPredicateMetadata; + oauthUserAuthorization$code: MakeFilter> & SubQueryPredicateMetadata; }; Filter: MakeFilter; SortAttr: Partial | OakOperation; user?: OakOperation<"create", User["CreateOperationData"]> | OakOperation; oauthToken$code?: (OakOperation<"create", Omit | Omit[]> | OakOperation, OauthToken["Filter"]>)[]; + oauthUserAuthorization$code?: (OakOperation<"create", Omit | Omit[]> | OakOperation, OauthUserAuthorization["Filter"]>)[]; }>; CreateSingle: OakOperation<"create", OauthAuthorizationCode["CreateOperationData"]>; CreateMulti: OakOperation<"create", Array>; @@ -2264,6 +2274,7 @@ export type OauthAuthorizationCode = { application?: OakOperation<"create", OauthApplication["CreateOperationData"]> | OakOperation | OakOperation<"remove", OauthApplication["RemoveOperationData"], OauthApplication["Filter"]>; user?: OakOperation<"create", User["CreateOperationData"]> | OakOperation | OakOperation<"remove", User["RemoveOperationData"], User["Filter"]>; oauthToken$code?: (OakOperation<"create", Omit | Omit[]> | OakOperation, OauthToken["Filter"]> | OakOperation<"remove", OauthToken["RemoveOperationData"], OauthToken["Filter"]>)[]; + oauthUserAuthorization$code?: (OakOperation<"create", Omit | Omit[]> | OakOperation, OauthUserAuthorization["Filter"]> | OakOperation<"remove", OauthUserAuthorization["RemoveOperationData"], OauthUserAuthorization["Filter"]>)[]; }>; Update: OakOperation; RemoveOperationData: {}; @@ -2509,22 +2520,26 @@ export type OauthUserAuthorization = { Schema: BaseOauthUserAuthorization.OpSchema & { user: User["Schema"]; application: OauthApplication["Schema"]; - token: OauthToken["Schema"]; + code?: OauthAuthorizationCode["Schema"]; + token?: OauthToken["Schema"]; }; Projection: BaseOauthUserAuthorization.OpProjection & { user?: User["Projection"]; application?: OauthApplication["Projection"]; + code?: OauthAuthorizationCode["Projection"]; token?: OauthToken["Projection"]; }; FilterUnit: BaseOauthUserAuthorization.OpFilter & { user: MakeFilter; application: MakeFilter; + code: MakeFilter; token: MakeFilter; }; Filter: MakeFilter; SortAttr: Partial; SortNode: { @@ -2537,6 +2552,7 @@ export type OauthUserAuthorization = { CreateOperationData: FormCreateData | OakOperation; application?: OakOperation<"create", OauthApplication["CreateOperationData"]> | OakOperation; + code?: OakOperation<"create", OauthAuthorizationCode["CreateOperationData"]> | OakOperation; token?: OakOperation<"create", OauthToken["CreateOperationData"]> | OakOperation; }>; CreateSingle: OakOperation<"create", OauthUserAuthorization["CreateOperationData"]>; @@ -2545,6 +2561,7 @@ export type OauthUserAuthorization = { UpdateOperationData: FormUpdateData | OakOperation | OakOperation<"remove", User["RemoveOperationData"], User["Filter"]>; application?: OakOperation<"create", OauthApplication["CreateOperationData"]> | OakOperation | OakOperation<"remove", OauthApplication["RemoveOperationData"], OauthApplication["Filter"]>; + code?: OakOperation<"create", OauthAuthorizationCode["CreateOperationData"]> | OakOperation | OakOperation<"remove", OauthAuthorizationCode["RemoveOperationData"], OauthAuthorizationCode["Filter"]>; token?: OakOperation<"create", OauthToken["CreateOperationData"]> | OakOperation | OakOperation<"remove", OauthToken["RemoveOperationData"], OauthToken["Filter"]>; }>; Update: OakOperation; diff --git a/es/oak-app-domain/OauthApplication/Action.d.ts b/es/oak-app-domain/OauthApplication/Action.d.ts index ac9c792e1..31115b92e 100644 --- a/es/oak-app-domain/OauthApplication/Action.d.ts +++ b/es/oak-app-domain/OauthApplication/Action.d.ts @@ -1,7 +1,8 @@ import { AbleState, AbleAction } from "oak-domain/lib/actions/action"; import { ActionDef } from "oak-domain/lib/types/Action"; import { GenericAction } from "oak-domain/lib/actions/action"; -export type ParticularAction = AbleAction; +export type SecretAction = 'resetSecret' | string; +export type ParticularAction = AbleAction | SecretAction; export declare const actions: string[]; export declare const AbleActionDef: ActionDef; export type Action = GenericAction | ParticularAction | string; diff --git a/es/oak-app-domain/OauthApplication/Action.js b/es/oak-app-domain/OauthApplication/Action.js index 6ef316ca7..b123dada0 100644 --- a/es/oak-app-domain/OauthApplication/Action.js +++ b/es/oak-app-domain/OauthApplication/Action.js @@ -1,5 +1,5 @@ import { makeAbleActionDef } from "oak-domain/lib/actions/action"; -export const actions = ["count", "stat", "download", "select", "aggregate", "create", "remove", "update", "enable", "disable"]; +export const actions = ["count", "stat", "download", "select", "aggregate", "create", "remove", "update", "enable", "disable", "resetSecret"]; export const AbleActionDef = makeAbleActionDef('enabled'); export const actionDefDict = { ableState: AbleActionDef diff --git a/es/oak-app-domain/OauthApplication/locales/zh_CN.json b/es/oak-app-domain/OauthApplication/locales/zh_CN.json index 9beba9ee3..941c8e5bd 100644 --- a/es/oak-app-domain/OauthApplication/locales/zh_CN.json +++ b/es/oak-app-domain/OauthApplication/locales/zh_CN.json @@ -13,7 +13,8 @@ }, "action": { "enable": "启用", - "disable": "禁用" + "disable": "禁用", + "resetSecret": "重置密钥" }, "v": { "ableState": { diff --git a/es/oak-app-domain/OauthUserAuthorization/Action.d.ts b/es/oak-app-domain/OauthUserAuthorization/Action.d.ts new file mode 100644 index 000000000..f11ccc599 --- /dev/null +++ b/es/oak-app-domain/OauthUserAuthorization/Action.d.ts @@ -0,0 +1,11 @@ +import { ActionDef } from "oak-domain/lib/types/Action"; +import { GenericAction } from "oak-domain/lib/actions/action"; +export type UsageState = 'granted' | 'denied' | 'revoked' | string; +export type UsageAction = 'revoke' | string; +export type ParticularAction = UsageAction; +export declare const actions: string[]; +export declare const UsageActionDef: ActionDef; +export type Action = GenericAction | ParticularAction | string; +export declare const actionDefDict: { + usageState: ActionDef; +}; diff --git a/es/oak-app-domain/OauthUserAuthorization/Action.js b/es/oak-app-domain/OauthUserAuthorization/Action.js new file mode 100644 index 000000000..feb1ba707 --- /dev/null +++ b/es/oak-app-domain/OauthUserAuthorization/Action.js @@ -0,0 +1,9 @@ +export const actions = ["count", "stat", "download", "select", "aggregate", "create", "remove", "update", "revoke"]; +export const UsageActionDef = { + stm: { + revoke: ['granted', "revoked"] + } +}; +export const actionDefDict = { + usageState: UsageActionDef +}; diff --git a/es/oak-app-domain/OauthUserAuthorization/Storage.js b/es/oak-app-domain/OauthUserAuthorization/Storage.js index bfa120b5a..22711cf8e 100644 --- a/es/oak-app-domain/OauthUserAuthorization/Storage.js +++ b/es/oak-app-domain/OauthUserAuthorization/Storage.js @@ -1,4 +1,4 @@ -import { genericActions as actions } from "oak-domain/lib/actions/action"; +import { actions } from "./Action"; export const desc = { attributes: { userId: { @@ -15,10 +15,17 @@ export const desc = { notNull: true, type: "datetime" }, + codeId: { + type: "ref", + ref: "oauthAuthorizationCode" + }, tokenId: { - notNull: true, type: "ref", ref: "oauthToken" + }, + usageState: { + type: "enum", + enumeration: ["granted", "denied", "revoked"] } }, actionType: "crud", diff --git a/es/oak-app-domain/OauthUserAuthorization/Style.d.ts b/es/oak-app-domain/OauthUserAuthorization/Style.d.ts new file mode 100644 index 000000000..24c9a5eae --- /dev/null +++ b/es/oak-app-domain/OauthUserAuthorization/Style.d.ts @@ -0,0 +1,3 @@ +import { Action, OpSchema } from "./Schema"; +import { StyleDef } from "oak-domain/lib/types/Style"; +export declare const style: StyleDef; diff --git a/es/oak-app-domain/OauthUserAuthorization/Style.js b/es/oak-app-domain/OauthUserAuthorization/Style.js new file mode 100644 index 000000000..79cf7e378 --- /dev/null +++ b/es/oak-app-domain/OauthUserAuthorization/Style.js @@ -0,0 +1,12 @@ +export const style = { + icon: { + revoke: 'fa-user-slash', + }, + color: { + usageState: { + granted: '#28a745', + denied: '#dc3545', + revoked: '#6c757d', + } + } +}; diff --git a/es/oak-app-domain/OauthUserAuthorization/_baseSchema.d.ts b/es/oak-app-domain/OauthUserAuthorization/_baseSchema.d.ts index ea043e3b2..510821ddd 100644 --- a/es/oak-app-domain/OauthUserAuthorization/_baseSchema.d.ts +++ b/es/oak-app-domain/OauthUserAuthorization/_baseSchema.d.ts @@ -1,13 +1,15 @@ import { ForeignKey } from "oak-domain/lib/types/DataType"; -import { Q_DateValue, Q_NumberValue, Q_StringValue, NodeId, ExprOp, ExpressionKey } from "oak-domain/lib/types/Demand"; +import { Q_DateValue, 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 { GenericAction } from "oak-domain/lib/actions/action"; +import { Action, ParticularAction, UsageState } from "./Action"; import { Datetime } from "oak-domain/lib/types/DataType"; export type OpSchema = EntityShape & { userId: ForeignKey<"user">; applicationId: ForeignKey<"oauthApplication">; authorizedAt: Datetime; - tokenId: ForeignKey<"oauthToken">; + codeId?: ForeignKey<"oauthAuthorizationCode"> | null; + tokenId?: ForeignKey<"oauthToken"> | null; + usageState?: UsageState | null; } & { [A in ExpressionKey]?: any; }; @@ -20,7 +22,9 @@ export type OpFilter = { userId: Q_StringValue; applicationId: Q_StringValue; authorizedAt: Q_DateValue; + codeId: Q_StringValue; tokenId: Q_StringValue; + usageState: Q_EnumValue; } & ExprOp; export type OpProjection = { "#id"?: NodeId; @@ -32,7 +36,9 @@ export type OpProjection = { userId?: number; applicationId?: number; authorizedAt?: number; + codeId?: number; tokenId?: number; + usageState?: number; } & Partial>; export type OpSortAttr = Partial<{ id: number; @@ -42,8 +48,10 @@ export type OpSortAttr = Partial<{ userId: number; applicationId: number; authorizedAt: number; + codeId: number; tokenId: number; + usageState: number; [k: string]: any; } | ExprOp>; -export type OpAction = OakMakeAction; -export type OpUpdateAction = "update" | string; +export type OpAction = OakMakeAction; +export type OpUpdateAction = "update" | ParticularAction | string; diff --git a/es/oak-app-domain/OauthUserAuthorization/locales/zh_CN.json b/es/oak-app-domain/OauthUserAuthorization/locales/zh_CN.json index 3befa0b38..4722d0b2c 100644 --- a/es/oak-app-domain/OauthUserAuthorization/locales/zh_CN.json +++ b/es/oak-app-domain/OauthUserAuthorization/locales/zh_CN.json @@ -4,6 +4,18 @@ "user": "用户", "application": "Oauth应用", "authorizedAt": "首次授权时间", - "token": "关联的令牌" + "token": "关联的令牌", + "code": "授权码", + "usageState": "授权状态" + }, + "action": { + "revoke": "撤销授权" + }, + "v": { + "usageState": { + "granted": "已授权", + "denied": "未授权", + "revoked": "已撤销" + } } } diff --git a/es/oak-app-domain/StyleDict.js b/es/oak-app-domain/StyleDict.js index d3ffc95a2..f12895fe4 100644 --- a/es/oak-app-domain/StyleDict.js +++ b/es/oak-app-domain/StyleDict.js @@ -15,6 +15,7 @@ import { style as mobile } from "./Mobile/Style"; import { style as notification } from "./Notification/Style"; import { style as oauthApplication } from "./OauthApplication/Style"; import { style as oauthProvider } from "./OauthProvider/Style"; +import { style as oauthUserAuthorization } from "./OauthUserAuthorization/Style"; import { style as parasite } from "./Parasite/Style"; import { style as passport } from "./Passport/Style"; import { style as smsTemplate } from "./SmsTemplate/Style"; @@ -46,6 +47,7 @@ export const styleDict = { notification, oauthApplication, oauthProvider, + oauthUserAuthorization, parasite, passport, smsTemplate, diff --git a/lib/entities/OauthApplication.d.ts b/lib/entities/OauthApplication.d.ts index b2c764759..1a737b936 100644 --- a/lib/entities/OauthApplication.d.ts +++ b/lib/entities/OauthApplication.d.ts @@ -15,7 +15,8 @@ export interface Schema extends EntityShape { isConfidential: Boolean; scopes?: StringListJson; } -export type Action = AbleAction; +export type SecretAction = 'resetSecret'; +export type Action = AbleAction | SecretAction; export declare const AbleActionDef: ActionDef; export declare const entityDesc: EntityDesc; +export type UsageState = 'granted' | 'denied' | 'revoked'; +export type UsageAction = 'revoke'; +export type Action = UsageAction; +export declare const UsageActionDef: ActionDef; +export declare const entityDesc: EntityDesc; diff --git a/lib/entities/OauthUserAuthorization.js b/lib/entities/OauthUserAuthorization.js index 26111b171..84304d959 100644 --- a/lib/entities/OauthUserAuthorization.js +++ b/lib/entities/OauthUserAuthorization.js @@ -1,7 +1,12 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.entityDesc = void 0; +exports.entityDesc = exports.UsageActionDef = void 0; ; +exports.UsageActionDef = { + stm: { + revoke: ['granted', "revoked"] + } +}; exports.entityDesc = { locales: { zh_CN: { @@ -12,7 +17,31 @@ exports.entityDesc = { application: 'Oauth应用', authorizedAt: '首次授权时间', token: '关联的令牌', + code: '授权码', + usageState: '授权状态', }, + action: { + revoke: '撤销授权', + }, + v: { + usageState: { + granted: '已授权', + denied: '未授权', + revoked: '已撤销', + } + } }, }, + style: { + icon: { + revoke: 'fa-user-slash', + }, + color: { + usageState: { + granted: '#28a745', + denied: '#dc3545', + revoked: '#6c757d', + } + } + } }; diff --git a/lib/oak-app-domain/ActionDefDict.d.ts b/lib/oak-app-domain/ActionDefDict.d.ts index 3c0abc4bc..ec01ef5e9 100644 --- a/lib/oak-app-domain/ActionDefDict.d.ts +++ b/lib/oak-app-domain/ActionDefDict.d.ts @@ -31,6 +31,9 @@ export declare const actionDefDict: { oauthProvider: { ableState: import("oak-domain/lib/types").ActionDef; }; + oauthUserAuthorization: { + usageState: import("oak-domain/lib/types").ActionDef; + }; parasite: {}; toDo: { iState: import("oak-domain/lib/types").ActionDef; diff --git a/lib/oak-app-domain/ActionDefDict.js b/lib/oak-app-domain/ActionDefDict.js index 60e6c51eb..dff3aa3af 100644 --- a/lib/oak-app-domain/ActionDefDict.js +++ b/lib/oak-app-domain/ActionDefDict.js @@ -12,15 +12,16 @@ const Action_8 = require("./Mobile/Action"); const Action_9 = require("./Notification/Action"); const Action_10 = require("./OauthApplication/Action"); const Action_11 = require("./OauthProvider/Action"); -const Action_12 = require("./Parasite/Action"); -const Action_13 = require("./ToDo/Action"); -const Action_14 = require("./Token/Action"); -const Action_15 = require("./User/Action"); -const Action_16 = require("./UserEntityGrant/Action"); -const Action_17 = require("./UserWechatPublicTag/Action"); -const Action_18 = require("./WechatLogin/Action"); -const Action_19 = require("./WechatMenu/Action"); -const Action_20 = require("./WechatPublicTag/Action"); +const Action_12 = require("./OauthUserAuthorization/Action"); +const Action_13 = require("./Parasite/Action"); +const Action_14 = require("./ToDo/Action"); +const Action_15 = require("./Token/Action"); +const Action_16 = require("./User/Action"); +const Action_17 = require("./UserEntityGrant/Action"); +const Action_18 = require("./UserWechatPublicTag/Action"); +const Action_19 = require("./WechatLogin/Action"); +const Action_20 = require("./WechatMenu/Action"); +const Action_21 = require("./WechatPublicTag/Action"); exports.actionDefDict = { log: Action_1.actionDefDict, modi: Action_2.actionDefDict, @@ -33,13 +34,14 @@ exports.actionDefDict = { notification: Action_9.actionDefDict, oauthApplication: Action_10.actionDefDict, oauthProvider: Action_11.actionDefDict, - parasite: Action_12.actionDefDict, - toDo: Action_13.actionDefDict, - token: Action_14.actionDefDict, - user: Action_15.actionDefDict, - userEntityGrant: Action_16.actionDefDict, - userWechatPublicTag: Action_17.actionDefDict, - wechatLogin: Action_18.actionDefDict, - wechatMenu: Action_19.actionDefDict, - wechatPublicTag: Action_20.actionDefDict + oauthUserAuthorization: Action_12.actionDefDict, + parasite: Action_13.actionDefDict, + toDo: Action_14.actionDefDict, + token: Action_15.actionDefDict, + user: Action_16.actionDefDict, + userEntityGrant: Action_17.actionDefDict, + userWechatPublicTag: Action_18.actionDefDict, + wechatLogin: Action_19.actionDefDict, + wechatMenu: Action_20.actionDefDict, + wechatPublicTag: Action_21.actionDefDict }; diff --git a/lib/oak-app-domain/EntityDict.d.ts b/lib/oak-app-domain/EntityDict.d.ts index f5e4b57b9..29f04e6ee 100644 --- a/lib/oak-app-domain/EntityDict.d.ts +++ b/lib/oak-app-domain/EntityDict.d.ts @@ -2223,7 +2223,9 @@ export type OauthAuthorizationCode = { application: OauthApplication["Schema"]; user: User["Schema"]; oauthToken$code?: Array>; + oauthUserAuthorization$code?: Array>; oauthToken$code$$aggr?: AggregationResult>; + oauthUserAuthorization$code$$aggr?: AggregationResult>; }; Projection: BaseOauthAuthorizationCode.OpProjection & { application?: OauthApplication["Projection"]; @@ -2234,11 +2236,18 @@ export type OauthAuthorizationCode = { oauthToken$code$$aggr?: DeduceAggregation, Omit, OauthToken["Sorter"]> & { $entity: "oauthToken"; }; + oauthUserAuthorization$code?: OakSelection<"select", Omit, Omit, OauthUserAuthorization["Sorter"]> & { + $entity: "oauthUserAuthorization"; + }; + oauthUserAuthorization$code$$aggr?: DeduceAggregation, Omit, OauthUserAuthorization["Sorter"]> & { + $entity: "oauthUserAuthorization"; + }; }; FilterUnit: BaseOauthAuthorizationCode.OpFilter & { application: MakeFilter; user: MakeFilter; oauthToken$code: MakeFilter> & SubQueryPredicateMetadata; + oauthUserAuthorization$code: MakeFilter> & SubQueryPredicateMetadata; }; Filter: MakeFilter; SortAttr: Partial | OakOperation; user?: OakOperation<"create", User["CreateOperationData"]> | OakOperation; oauthToken$code?: (OakOperation<"create", Omit | Omit[]> | OakOperation, OauthToken["Filter"]>)[]; + oauthUserAuthorization$code?: (OakOperation<"create", Omit | Omit[]> | OakOperation, OauthUserAuthorization["Filter"]>)[]; }>; CreateSingle: OakOperation<"create", OauthAuthorizationCode["CreateOperationData"]>; CreateMulti: OakOperation<"create", Array>; @@ -2264,6 +2274,7 @@ export type OauthAuthorizationCode = { application?: OakOperation<"create", OauthApplication["CreateOperationData"]> | OakOperation | OakOperation<"remove", OauthApplication["RemoveOperationData"], OauthApplication["Filter"]>; user?: OakOperation<"create", User["CreateOperationData"]> | OakOperation | OakOperation<"remove", User["RemoveOperationData"], User["Filter"]>; oauthToken$code?: (OakOperation<"create", Omit | Omit[]> | OakOperation, OauthToken["Filter"]> | OakOperation<"remove", OauthToken["RemoveOperationData"], OauthToken["Filter"]>)[]; + oauthUserAuthorization$code?: (OakOperation<"create", Omit | Omit[]> | OakOperation, OauthUserAuthorization["Filter"]> | OakOperation<"remove", OauthUserAuthorization["RemoveOperationData"], OauthUserAuthorization["Filter"]>)[]; }>; Update: OakOperation; RemoveOperationData: {}; @@ -2509,22 +2520,26 @@ export type OauthUserAuthorization = { Schema: BaseOauthUserAuthorization.OpSchema & { user: User["Schema"]; application: OauthApplication["Schema"]; - token: OauthToken["Schema"]; + code?: OauthAuthorizationCode["Schema"]; + token?: OauthToken["Schema"]; }; Projection: BaseOauthUserAuthorization.OpProjection & { user?: User["Projection"]; application?: OauthApplication["Projection"]; + code?: OauthAuthorizationCode["Projection"]; token?: OauthToken["Projection"]; }; FilterUnit: BaseOauthUserAuthorization.OpFilter & { user: MakeFilter; application: MakeFilter; + code: MakeFilter; token: MakeFilter; }; Filter: MakeFilter; SortAttr: Partial; SortNode: { @@ -2537,6 +2552,7 @@ export type OauthUserAuthorization = { CreateOperationData: FormCreateData | OakOperation; application?: OakOperation<"create", OauthApplication["CreateOperationData"]> | OakOperation; + code?: OakOperation<"create", OauthAuthorizationCode["CreateOperationData"]> | OakOperation; token?: OakOperation<"create", OauthToken["CreateOperationData"]> | OakOperation; }>; CreateSingle: OakOperation<"create", OauthUserAuthorization["CreateOperationData"]>; @@ -2545,6 +2561,7 @@ export type OauthUserAuthorization = { UpdateOperationData: FormUpdateData | OakOperation | OakOperation<"remove", User["RemoveOperationData"], User["Filter"]>; application?: OakOperation<"create", OauthApplication["CreateOperationData"]> | OakOperation | OakOperation<"remove", OauthApplication["RemoveOperationData"], OauthApplication["Filter"]>; + code?: OakOperation<"create", OauthAuthorizationCode["CreateOperationData"]> | OakOperation | OakOperation<"remove", OauthAuthorizationCode["RemoveOperationData"], OauthAuthorizationCode["Filter"]>; token?: OakOperation<"create", OauthToken["CreateOperationData"]> | OakOperation | OakOperation<"remove", OauthToken["RemoveOperationData"], OauthToken["Filter"]>; }>; Update: OakOperation; diff --git a/lib/oak-app-domain/OauthApplication/Action.d.ts b/lib/oak-app-domain/OauthApplication/Action.d.ts index ac9c792e1..31115b92e 100644 --- a/lib/oak-app-domain/OauthApplication/Action.d.ts +++ b/lib/oak-app-domain/OauthApplication/Action.d.ts @@ -1,7 +1,8 @@ import { AbleState, AbleAction } from "oak-domain/lib/actions/action"; import { ActionDef } from "oak-domain/lib/types/Action"; import { GenericAction } from "oak-domain/lib/actions/action"; -export type ParticularAction = AbleAction; +export type SecretAction = 'resetSecret' | string; +export type ParticularAction = AbleAction | SecretAction; export declare const actions: string[]; export declare const AbleActionDef: ActionDef; export type Action = GenericAction | ParticularAction | string; diff --git a/lib/oak-app-domain/OauthApplication/Action.js b/lib/oak-app-domain/OauthApplication/Action.js index a0a081624..9d83862f6 100644 --- a/lib/oak-app-domain/OauthApplication/Action.js +++ b/lib/oak-app-domain/OauthApplication/Action.js @@ -2,7 +2,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.actionDefDict = exports.AbleActionDef = exports.actions = void 0; const action_1 = require("oak-domain/lib/actions/action"); -exports.actions = ["count", "stat", "download", "select", "aggregate", "create", "remove", "update", "enable", "disable"]; +exports.actions = ["count", "stat", "download", "select", "aggregate", "create", "remove", "update", "enable", "disable", "resetSecret"]; exports.AbleActionDef = (0, action_1.makeAbleActionDef)('enabled'); exports.actionDefDict = { ableState: exports.AbleActionDef diff --git a/lib/oak-app-domain/OauthApplication/locales/zh_CN.json b/lib/oak-app-domain/OauthApplication/locales/zh_CN.json index 9beba9ee3..941c8e5bd 100644 --- a/lib/oak-app-domain/OauthApplication/locales/zh_CN.json +++ b/lib/oak-app-domain/OauthApplication/locales/zh_CN.json @@ -13,7 +13,8 @@ }, "action": { "enable": "启用", - "disable": "禁用" + "disable": "禁用", + "resetSecret": "重置密钥" }, "v": { "ableState": { diff --git a/lib/oak-app-domain/OauthUserAuthorization/Action.d.ts b/lib/oak-app-domain/OauthUserAuthorization/Action.d.ts new file mode 100644 index 000000000..f11ccc599 --- /dev/null +++ b/lib/oak-app-domain/OauthUserAuthorization/Action.d.ts @@ -0,0 +1,11 @@ +import { ActionDef } from "oak-domain/lib/types/Action"; +import { GenericAction } from "oak-domain/lib/actions/action"; +export type UsageState = 'granted' | 'denied' | 'revoked' | string; +export type UsageAction = 'revoke' | string; +export type ParticularAction = UsageAction; +export declare const actions: string[]; +export declare const UsageActionDef: ActionDef; +export type Action = GenericAction | ParticularAction | string; +export declare const actionDefDict: { + usageState: ActionDef; +}; diff --git a/lib/oak-app-domain/OauthUserAuthorization/Action.js b/lib/oak-app-domain/OauthUserAuthorization/Action.js new file mode 100644 index 000000000..9ff1ad1ae --- /dev/null +++ b/lib/oak-app-domain/OauthUserAuthorization/Action.js @@ -0,0 +1,12 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.actionDefDict = exports.UsageActionDef = exports.actions = void 0; +exports.actions = ["count", "stat", "download", "select", "aggregate", "create", "remove", "update", "revoke"]; +exports.UsageActionDef = { + stm: { + revoke: ['granted', "revoked"] + } +}; +exports.actionDefDict = { + usageState: exports.UsageActionDef +}; diff --git a/lib/oak-app-domain/OauthUserAuthorization/Storage.js b/lib/oak-app-domain/OauthUserAuthorization/Storage.js index 4c983ebed..bad3322ef 100644 --- a/lib/oak-app-domain/OauthUserAuthorization/Storage.js +++ b/lib/oak-app-domain/OauthUserAuthorization/Storage.js @@ -1,7 +1,7 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.desc = void 0; -const action_1 = require("oak-domain/lib/actions/action"); +const Action_1 = require("./Action"); exports.desc = { attributes: { userId: { @@ -18,12 +18,19 @@ exports.desc = { notNull: true, type: "datetime" }, + codeId: { + type: "ref", + ref: "oauthAuthorizationCode" + }, tokenId: { - notNull: true, type: "ref", ref: "oauthToken" + }, + usageState: { + type: "enum", + enumeration: ["granted", "denied", "revoked"] } }, actionType: "crud", - actions: action_1.genericActions + actions: Action_1.actions }; diff --git a/lib/oak-app-domain/OauthUserAuthorization/Style.d.ts b/lib/oak-app-domain/OauthUserAuthorization/Style.d.ts new file mode 100644 index 000000000..24c9a5eae --- /dev/null +++ b/lib/oak-app-domain/OauthUserAuthorization/Style.d.ts @@ -0,0 +1,3 @@ +import { Action, OpSchema } from "./Schema"; +import { StyleDef } from "oak-domain/lib/types/Style"; +export declare const style: StyleDef; diff --git a/lib/oak-app-domain/OauthUserAuthorization/Style.js b/lib/oak-app-domain/OauthUserAuthorization/Style.js new file mode 100644 index 000000000..b8e5c9d55 --- /dev/null +++ b/lib/oak-app-domain/OauthUserAuthorization/Style.js @@ -0,0 +1,15 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.style = void 0; +exports.style = { + icon: { + revoke: 'fa-user-slash', + }, + color: { + usageState: { + granted: '#28a745', + denied: '#dc3545', + revoked: '#6c757d', + } + } +}; diff --git a/lib/oak-app-domain/OauthUserAuthorization/_baseSchema.d.ts b/lib/oak-app-domain/OauthUserAuthorization/_baseSchema.d.ts index ea043e3b2..510821ddd 100644 --- a/lib/oak-app-domain/OauthUserAuthorization/_baseSchema.d.ts +++ b/lib/oak-app-domain/OauthUserAuthorization/_baseSchema.d.ts @@ -1,13 +1,15 @@ import { ForeignKey } from "oak-domain/lib/types/DataType"; -import { Q_DateValue, Q_NumberValue, Q_StringValue, NodeId, ExprOp, ExpressionKey } from "oak-domain/lib/types/Demand"; +import { Q_DateValue, 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 { GenericAction } from "oak-domain/lib/actions/action"; +import { Action, ParticularAction, UsageState } from "./Action"; import { Datetime } from "oak-domain/lib/types/DataType"; export type OpSchema = EntityShape & { userId: ForeignKey<"user">; applicationId: ForeignKey<"oauthApplication">; authorizedAt: Datetime; - tokenId: ForeignKey<"oauthToken">; + codeId?: ForeignKey<"oauthAuthorizationCode"> | null; + tokenId?: ForeignKey<"oauthToken"> | null; + usageState?: UsageState | null; } & { [A in ExpressionKey]?: any; }; @@ -20,7 +22,9 @@ export type OpFilter = { userId: Q_StringValue; applicationId: Q_StringValue; authorizedAt: Q_DateValue; + codeId: Q_StringValue; tokenId: Q_StringValue; + usageState: Q_EnumValue; } & ExprOp; export type OpProjection = { "#id"?: NodeId; @@ -32,7 +36,9 @@ export type OpProjection = { userId?: number; applicationId?: number; authorizedAt?: number; + codeId?: number; tokenId?: number; + usageState?: number; } & Partial>; export type OpSortAttr = Partial<{ id: number; @@ -42,8 +48,10 @@ export type OpSortAttr = Partial<{ userId: number; applicationId: number; authorizedAt: number; + codeId: number; tokenId: number; + usageState: number; [k: string]: any; } | ExprOp>; -export type OpAction = OakMakeAction; -export type OpUpdateAction = "update" | string; +export type OpAction = OakMakeAction; +export type OpUpdateAction = "update" | ParticularAction | string; diff --git a/lib/oak-app-domain/OauthUserAuthorization/locales/zh_CN.json b/lib/oak-app-domain/OauthUserAuthorization/locales/zh_CN.json index 3befa0b38..4722d0b2c 100644 --- a/lib/oak-app-domain/OauthUserAuthorization/locales/zh_CN.json +++ b/lib/oak-app-domain/OauthUserAuthorization/locales/zh_CN.json @@ -4,6 +4,18 @@ "user": "用户", "application": "Oauth应用", "authorizedAt": "首次授权时间", - "token": "关联的令牌" + "token": "关联的令牌", + "code": "授权码", + "usageState": "授权状态" + }, + "action": { + "revoke": "撤销授权" + }, + "v": { + "usageState": { + "granted": "已授权", + "denied": "未授权", + "revoked": "已撤销" + } } } diff --git a/lib/oak-app-domain/StyleDict.js b/lib/oak-app-domain/StyleDict.js index bdd46e991..33d097bfb 100644 --- a/lib/oak-app-domain/StyleDict.js +++ b/lib/oak-app-domain/StyleDict.js @@ -18,19 +18,20 @@ const Style_14 = require("./Mobile/Style"); const Style_15 = require("./Notification/Style"); const Style_16 = require("./OauthApplication/Style"); const Style_17 = require("./OauthProvider/Style"); -const Style_18 = require("./Parasite/Style"); -const Style_19 = require("./Passport/Style"); -const Style_20 = require("./SmsTemplate/Style"); -const Style_21 = require("./ToDo/Style"); -const Style_22 = require("./Token/Style"); -const Style_23 = require("./User/Style"); -const Style_24 = require("./UserEntityGrant/Style"); -const Style_25 = require("./UserWechatPublicTag/Style"); -const Style_26 = require("./WechatLogin/Style"); -const Style_27 = require("./WechatMenu/Style"); -const Style_28 = require("./WechatPublicTag/Style"); -const Style_29 = require("./WechatQrCode/Style"); -const Style_30 = require("./WechatUser/Style"); +const Style_18 = require("./OauthUserAuthorization/Style"); +const Style_19 = require("./Parasite/Style"); +const Style_20 = require("./Passport/Style"); +const Style_21 = require("./SmsTemplate/Style"); +const Style_22 = require("./ToDo/Style"); +const Style_23 = require("./Token/Style"); +const Style_24 = require("./User/Style"); +const Style_25 = require("./UserEntityGrant/Style"); +const Style_26 = require("./UserWechatPublicTag/Style"); +const Style_27 = require("./WechatLogin/Style"); +const Style_28 = require("./WechatMenu/Style"); +const Style_29 = require("./WechatPublicTag/Style"); +const Style_30 = require("./WechatQrCode/Style"); +const Style_31 = require("./WechatUser/Style"); exports.styleDict = { log: Style_1.style, modi: Style_2.style, @@ -49,17 +50,18 @@ exports.styleDict = { notification: Style_15.style, oauthApplication: Style_16.style, oauthProvider: Style_17.style, - parasite: Style_18.style, - passport: Style_19.style, - smsTemplate: Style_20.style, - toDo: Style_21.style, - token: Style_22.style, - user: Style_23.style, - userEntityGrant: Style_24.style, - userWechatPublicTag: Style_25.style, - wechatLogin: Style_26.style, - wechatMenu: Style_27.style, - wechatPublicTag: Style_28.style, - wechatQrCode: Style_29.style, - wechatUser: Style_30.style + oauthUserAuthorization: Style_18.style, + parasite: Style_19.style, + passport: Style_20.style, + smsTemplate: Style_21.style, + toDo: Style_22.style, + token: Style_23.style, + user: Style_24.style, + userEntityGrant: Style_25.style, + userWechatPublicTag: Style_26.style, + wechatLogin: Style_27.style, + wechatMenu: Style_28.style, + wechatPublicTag: Style_29.style, + wechatQrCode: Style_30.style, + wechatUser: Style_31.style }; diff --git a/src/entities/OauthApplication.ts b/src/entities/OauthApplication.ts index 90c9a08df..4e0fc8089 100644 --- a/src/entities/OauthApplication.ts +++ b/src/entities/OauthApplication.ts @@ -22,7 +22,8 @@ export interface Schema extends EntityShape { scopes?: StringListJson; }; -export type Action = AbleAction; +export type SecretAction = 'resetSecret'; +export type Action = AbleAction | SecretAction; export const AbleActionDef: ActionDef = makeAbleActionDef('enabled'); export const entityDesc: EntityDesc = { +export type UsageState = 'granted' | 'denied' | 'revoked'; +export type UsageAction = 'revoke'; +export type Action = UsageAction; + +export const UsageActionDef: ActionDef = { + stm: { + revoke: ['granted', "revoked"] + } +}; + +export const entityDesc: EntityDesc = { locales: { zh_CN: { // 用户可以查看和管理已授权的应用 @@ -29,8 +42,32 @@ export const entityDesc: EntityDesc