Merge branch 'release'
This commit is contained in:
commit
7d9f21281a
|
|
@ -1,5 +1,8 @@
|
|||
export declare const ActionDefDict: {
|
||||
modi: {
|
||||
iState: import("../types").ActionDef<import("./Modi/Action").IAction, import("./Modi/Action").IState>;
|
||||
iState: import("../types").ActionDef<string, string>;
|
||||
};
|
||||
user: {
|
||||
userState: import("../types").ActionDef<string, string>;
|
||||
};
|
||||
};
|
||||
|
|
|
|||
|
|
@ -2,6 +2,8 @@
|
|||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.ActionDefDict = void 0;
|
||||
var Action_1 = require("./Modi/Action");
|
||||
var Action_2 = require("./User/Action");
|
||||
exports.ActionDefDict = {
|
||||
modi: Action_1.ActionDefDict
|
||||
modi: Action_1.ActionDefDict,
|
||||
user: Action_2.ActionDefDict
|
||||
};
|
||||
|
|
|
|||
|
|
@ -3,10 +3,12 @@ import { EntityDef as ModiEntity } from "./ModiEntity/Schema";
|
|||
import { EntityDef as Oper } from "./Oper/Schema";
|
||||
import { EntityDef as OperEntity } from "./OperEntity/Schema";
|
||||
import { EntityDef as User } from "./User/Schema";
|
||||
import { EntityDef as UserEntityGrant } from "./UserEntityGrant/Schema";
|
||||
export declare type EntityDict = {
|
||||
modi: Modi;
|
||||
modiEntity: ModiEntity;
|
||||
oper: Oper;
|
||||
operEntity: OperEntity;
|
||||
user: User;
|
||||
userEntityGrant: UserEntityGrant;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
import { ActionDef } from "../../types/Action";
|
||||
import { GenericAction } from "../../actions/action";
|
||||
export declare type IState = 'active' | 'applied' | 'abandoned';
|
||||
export declare type IAction = 'apply' | 'abandon';
|
||||
export declare type IState = 'active' | 'applied' | 'abandoned' | string;
|
||||
export declare type IAction = 'apply' | 'abandon' | string;
|
||||
export declare type ParticularAction = IAction;
|
||||
export declare type Action = GenericAction | ParticularAction;
|
||||
export declare type Action = GenericAction | ParticularAction | string;
|
||||
export declare const actions: string[];
|
||||
export declare const ActionDefDict: {
|
||||
iState: ActionDef<IAction, IState>;
|
||||
iState: ActionDef<string, string>;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -6,18 +6,20 @@ import { FormCreateData, FormUpdateData, DeduceAggregation, Operation as OakOper
|
|||
import { AppendOnlyAction } from "../../actions/action";
|
||||
import * as Modi from "../Modi/Schema";
|
||||
import * as User from "../User/Schema";
|
||||
import * as UserEntityGrant from "../UserEntityGrant/Schema";
|
||||
export declare type OpSchema = EntityShape & {
|
||||
modiId: ForeignKey<"modi">;
|
||||
entity: "user" | string;
|
||||
entity: "user" | "userEntityGrant" | string;
|
||||
entityId: String<64>;
|
||||
};
|
||||
export declare type OpAttr = keyof OpSchema;
|
||||
export declare type Schema = EntityShape & {
|
||||
modiId: ForeignKey<"modi">;
|
||||
entity: "user" | string;
|
||||
entity: "user" | "userEntityGrant" | string;
|
||||
entityId: String<64>;
|
||||
modi: Modi.Schema;
|
||||
user?: User.Schema;
|
||||
userEntityGrant?: UserEntityGrant.Schema;
|
||||
} & {
|
||||
[A in ExpressionKey]?: any;
|
||||
};
|
||||
|
|
@ -31,8 +33,9 @@ declare type AttrFilter<E> = {
|
|||
entity: E;
|
||||
entityId: Q_StringValue;
|
||||
user: User.Filter;
|
||||
userEntityGrant: UserEntityGrant.Filter;
|
||||
};
|
||||
export declare type Filter<E = Q_EnumValue<"user" | string>> = MakeFilter<AttrFilter<E> & ExprOp<OpAttr | string>>;
|
||||
export declare type Filter<E = Q_EnumValue<"user" | "userEntityGrant" | string>> = MakeFilter<AttrFilter<E> & ExprOp<OpAttr | string>>;
|
||||
export declare type Projection = {
|
||||
"#id"?: NodeId;
|
||||
[k: string]: any;
|
||||
|
|
@ -45,6 +48,7 @@ export declare type Projection = {
|
|||
entity?: number;
|
||||
entityId?: number;
|
||||
user?: User.Projection;
|
||||
userEntityGrant?: UserEntityGrant.Projection;
|
||||
} & Partial<ExprOp<OpAttr | string>>;
|
||||
declare type ModiEntityIdProjection = OneOf<{
|
||||
id: number;
|
||||
|
|
@ -55,6 +59,9 @@ declare type ModiIdProjection = OneOf<{
|
|||
declare type UserIdProjection = OneOf<{
|
||||
entityId: number;
|
||||
}>;
|
||||
declare type UserEntityGrantIdProjection = OneOf<{
|
||||
entityId: number;
|
||||
}>;
|
||||
export declare type SortAttr = {
|
||||
id: number;
|
||||
} | {
|
||||
|
|
@ -73,6 +80,8 @@ export declare type SortAttr = {
|
|||
entityId: number;
|
||||
} | {
|
||||
user: User.SortAttr;
|
||||
} | {
|
||||
userEntityGrant: UserEntityGrant.SortAttr;
|
||||
} | {
|
||||
[k: string]: any;
|
||||
} | OneOf<ExprOp<OpAttr | string>>;
|
||||
|
|
@ -103,6 +112,17 @@ export declare type CreateOperationData = FormCreateData<Omit<OpSchema, "entity"
|
|||
} | {
|
||||
entity: "user";
|
||||
entityId: String<64>;
|
||||
} | {
|
||||
entity?: never;
|
||||
entityId?: never;
|
||||
userEntityGrant: UserEntityGrant.CreateSingleOperation;
|
||||
} | {
|
||||
entity: "userEntityGrant";
|
||||
entityId: String<64>;
|
||||
userEntityGrant: UserEntityGrant.UpdateOperation;
|
||||
} | {
|
||||
entity: "userEntityGrant";
|
||||
entityId: String<64>;
|
||||
} | {
|
||||
entity?: string;
|
||||
entityId?: string;
|
||||
|
|
@ -128,7 +148,11 @@ export declare type UpdateOperationData = FormUpdateData<Omit<OpSchema, "entity"
|
|||
entityId?: never;
|
||||
entity?: never;
|
||||
} | {
|
||||
entity?: ("user" | string) | null;
|
||||
userEntityGrant?: UserEntityGrant.CreateSingleOperation | UserEntityGrant.UpdateOperation | UserEntityGrant.RemoveOperation;
|
||||
entityId?: never;
|
||||
entity?: never;
|
||||
} | {
|
||||
entity?: ("user" | "userEntityGrant" | string) | null;
|
||||
entityId?: String<64> | null;
|
||||
}) & {
|
||||
[k: string]: any;
|
||||
|
|
@ -138,6 +162,8 @@ export declare type RemoveOperationData = {} & (({
|
|||
modi?: Modi.UpdateOperation | Modi.RemoveOperation;
|
||||
})) & ({
|
||||
user?: User.UpdateOperation | User.RemoveOperation;
|
||||
} | {
|
||||
userEntityGrant?: UserEntityGrant.UpdateOperation | UserEntityGrant.RemoveOperation;
|
||||
} | {
|
||||
[k: string]: any;
|
||||
});
|
||||
|
|
@ -145,6 +171,7 @@ export declare type RemoveOperation = OakOperation<"remove", RemoveOperationData
|
|||
export declare type Operation = CreateOperation | UpdateOperation | RemoveOperation;
|
||||
export declare type ModiIdSubQuery = Selection<ModiIdProjection>;
|
||||
export declare type UserIdSubQuery = Selection<UserIdProjection>;
|
||||
export declare type UserEntityGrantIdSubQuery = Selection<UserEntityGrantIdProjection>;
|
||||
export declare type ModiEntityIdSubQuery = Selection<ModiEntityIdProjection>;
|
||||
export declare type EntityDef = {
|
||||
Schema: Schema;
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ exports.desc = {
|
|||
params: {
|
||||
length: 32
|
||||
},
|
||||
ref: ["user"]
|
||||
ref: ["user", "userEntityGrant"]
|
||||
},
|
||||
entityId: {
|
||||
type: "varchar",
|
||||
|
|
|
|||
|
|
@ -7,19 +7,21 @@ import { AppendOnlyAction } from "../../actions/action";
|
|||
import * as Oper from "../Oper/Schema";
|
||||
import * as Modi from "../Modi/Schema";
|
||||
import * as User from "../User/Schema";
|
||||
import * as UserEntityGrant from "../UserEntityGrant/Schema";
|
||||
export declare type OpSchema = EntityShape & {
|
||||
operId: ForeignKey<"oper">;
|
||||
entity: "modi" | "user" | string;
|
||||
entity: "modi" | "user" | "userEntityGrant" | string;
|
||||
entityId: String<64>;
|
||||
};
|
||||
export declare type OpAttr = keyof OpSchema;
|
||||
export declare type Schema = EntityShape & {
|
||||
operId: ForeignKey<"oper">;
|
||||
entity: "modi" | "user" | string;
|
||||
entity: "modi" | "user" | "userEntityGrant" | string;
|
||||
entityId: String<64>;
|
||||
oper: Oper.Schema;
|
||||
modi?: Modi.Schema;
|
||||
user?: User.Schema;
|
||||
userEntityGrant?: UserEntityGrant.Schema;
|
||||
} & {
|
||||
[A in ExpressionKey]?: any;
|
||||
};
|
||||
|
|
@ -34,8 +36,9 @@ declare type AttrFilter<E> = {
|
|||
entityId: Q_StringValue;
|
||||
modi: Modi.Filter;
|
||||
user: User.Filter;
|
||||
userEntityGrant: UserEntityGrant.Filter;
|
||||
};
|
||||
export declare type Filter<E = Q_EnumValue<"modi" | "user" | string>> = MakeFilter<AttrFilter<E> & ExprOp<OpAttr | string>>;
|
||||
export declare type Filter<E = Q_EnumValue<"modi" | "user" | "userEntityGrant" | string>> = MakeFilter<AttrFilter<E> & ExprOp<OpAttr | string>>;
|
||||
export declare type Projection = {
|
||||
"#id"?: NodeId;
|
||||
[k: string]: any;
|
||||
|
|
@ -49,6 +52,7 @@ export declare type Projection = {
|
|||
entityId?: number;
|
||||
modi?: Modi.Projection;
|
||||
user?: User.Projection;
|
||||
userEntityGrant?: UserEntityGrant.Projection;
|
||||
} & Partial<ExprOp<OpAttr | string>>;
|
||||
declare type OperEntityIdProjection = OneOf<{
|
||||
id: number;
|
||||
|
|
@ -62,6 +66,9 @@ declare type ModiIdProjection = OneOf<{
|
|||
declare type UserIdProjection = OneOf<{
|
||||
entityId: number;
|
||||
}>;
|
||||
declare type UserEntityGrantIdProjection = OneOf<{
|
||||
entityId: number;
|
||||
}>;
|
||||
export declare type SortAttr = {
|
||||
id: number;
|
||||
} | {
|
||||
|
|
@ -82,6 +89,8 @@ export declare type SortAttr = {
|
|||
modi: Modi.SortAttr;
|
||||
} | {
|
||||
user: User.SortAttr;
|
||||
} | {
|
||||
userEntityGrant: UserEntityGrant.SortAttr;
|
||||
} | {
|
||||
[k: string]: any;
|
||||
} | OneOf<ExprOp<OpAttr | string>>;
|
||||
|
|
@ -120,6 +129,17 @@ export declare type CreateOperationData = FormCreateData<Omit<OpSchema, "entity"
|
|||
} | {
|
||||
entity: "user";
|
||||
entityId: String<64>;
|
||||
} | {
|
||||
entity?: never;
|
||||
entityId?: never;
|
||||
userEntityGrant: UserEntityGrant.CreateSingleOperation;
|
||||
} | {
|
||||
entity: "userEntityGrant";
|
||||
entityId: String<64>;
|
||||
userEntityGrant: UserEntityGrant.UpdateOperation;
|
||||
} | {
|
||||
entity: "userEntityGrant";
|
||||
entityId: String<64>;
|
||||
} | {
|
||||
entity?: string;
|
||||
entityId?: string;
|
||||
|
|
@ -143,7 +163,11 @@ export declare type UpdateOperationData = FormUpdateData<Omit<OpSchema, "entity"
|
|||
entityId?: never;
|
||||
entity?: never;
|
||||
} | {
|
||||
entity?: ("modi" | "user" | string) | null;
|
||||
userEntityGrant?: UserEntityGrant.CreateSingleOperation | UserEntityGrant.UpdateOperation | UserEntityGrant.RemoveOperation;
|
||||
entityId?: never;
|
||||
entity?: never;
|
||||
} | {
|
||||
entity?: ("modi" | "user" | "userEntityGrant" | string) | null;
|
||||
entityId?: String<64> | null;
|
||||
}) & {
|
||||
[k: string]: any;
|
||||
|
|
@ -153,6 +177,8 @@ export declare type RemoveOperationData = {} & ({
|
|||
modi?: Modi.UpdateOperation | Modi.RemoveOperation;
|
||||
} | {
|
||||
user?: User.UpdateOperation | User.RemoveOperation;
|
||||
} | {
|
||||
userEntityGrant?: UserEntityGrant.UpdateOperation | UserEntityGrant.RemoveOperation;
|
||||
} | {
|
||||
[k: string]: any;
|
||||
});
|
||||
|
|
@ -161,6 +187,7 @@ export declare type Operation = CreateOperation | UpdateOperation | RemoveOperat
|
|||
export declare type OperIdSubQuery = Selection<OperIdProjection>;
|
||||
export declare type ModiIdSubQuery = Selection<ModiIdProjection>;
|
||||
export declare type UserIdSubQuery = Selection<UserIdProjection>;
|
||||
export declare type UserEntityGrantIdSubQuery = Selection<UserEntityGrantIdProjection>;
|
||||
export declare type OperEntityIdSubQuery = Selection<OperEntityIdProjection>;
|
||||
export declare type EntityDef = {
|
||||
Schema: Schema;
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ exports.desc = {
|
|||
params: {
|
||||
length: 32
|
||||
},
|
||||
ref: ["modi", "user"]
|
||||
ref: ["modi", "user", "userEntityGrant"]
|
||||
},
|
||||
entityId: {
|
||||
type: "varchar",
|
||||
|
|
|
|||
|
|
@ -6,10 +6,12 @@ var Storage_2 = require("./ModiEntity/Storage");
|
|||
var Storage_3 = require("./Oper/Storage");
|
||||
var Storage_4 = require("./OperEntity/Storage");
|
||||
var Storage_5 = require("./User/Storage");
|
||||
var Storage_6 = require("./UserEntityGrant/Storage");
|
||||
exports.storageSchema = {
|
||||
modi: Storage_1.desc,
|
||||
modiEntity: Storage_2.desc,
|
||||
oper: Storage_3.desc,
|
||||
operEntity: Storage_4.desc,
|
||||
user: Storage_5.desc
|
||||
user: Storage_5.desc,
|
||||
userEntityGrant: Storage_6.desc
|
||||
};
|
||||
|
|
|
|||
|
|
@ -0,0 +1,10 @@
|
|||
import { ActionDef } from "../../types/Action";
|
||||
import { GenericAction, RelationAction } from "../../actions/action";
|
||||
export declare type UserAction = 'mergeTo' | string;
|
||||
export declare type UserState = 'normal' | 'merged' | string;
|
||||
export declare type ParticularAction = UserAction;
|
||||
export declare type Action = GenericAction | ParticularAction | RelationAction | string;
|
||||
export declare const actions: string[];
|
||||
export declare const ActionDefDict: {
|
||||
userState: ActionDef<string, string>;
|
||||
};
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.ActionDefDict = exports.actions = void 0;
|
||||
exports.actions = ["count", "stat", "download", "select", "aggregate", "create", "remove", "update", "grant", "revoke", "mergeTo"];
|
||||
var UserActionDef = {
|
||||
stm: {
|
||||
mergeTo: ['normal', 'merged']
|
||||
}
|
||||
};
|
||||
exports.ActionDefDict = {
|
||||
userState: UserActionDef
|
||||
};
|
||||
|
|
@ -1,9 +1,10 @@
|
|||
import { String, Text } from "../../types/DataType";
|
||||
import { Q_DateValue, Q_StringValue, NodeId, MakeFilter, ExprOp, ExpressionKey } from "../../types/Demand";
|
||||
import { String, Text, ForeignKey } from "../../types/DataType";
|
||||
import { Q_DateValue, Q_StringValue, Q_EnumValue, NodeId, MakeFilter, ExprOp, ExpressionKey } from "../../types/Demand";
|
||||
import { OneOf } from "../../types/Polyfill";
|
||||
import * as SubQuery from "../_SubQuery";
|
||||
import { FormCreateData, FormUpdateData, DeduceAggregation, Operation as OakOperation, Selection as OakSelection, MakeAction as OakMakeAction, EntityShape, AggregationResult } from "../../types/Entity";
|
||||
import { GenericAction, RelationAction } from "../../actions/action";
|
||||
import { Action, ParticularAction, UserState } from "./Action";
|
||||
import { RelationAction } from "../../actions/action";
|
||||
import * as Oper from "../Oper/Schema";
|
||||
import * as OperEntity from "../OperEntity/Schema";
|
||||
import * as ModiEntity from "../ModiEntity/Schema";
|
||||
|
|
@ -11,14 +12,21 @@ export declare type OpSchema = EntityShape & {
|
|||
name?: String<16> | null;
|
||||
nickname?: String<64> | null;
|
||||
password?: Text | null;
|
||||
refId?: ForeignKey<"user"> | null;
|
||||
userState?: UserState | null;
|
||||
};
|
||||
export declare type OpAttr = keyof OpSchema;
|
||||
export declare type Schema = EntityShape & {
|
||||
name?: String<16> | null;
|
||||
nickname?: String<64> | null;
|
||||
password?: Text | null;
|
||||
refId?: ForeignKey<"user"> | null;
|
||||
userState?: UserState | null;
|
||||
ref?: Schema | null;
|
||||
oper$operator?: Array<Oper.Schema>;
|
||||
oper$operator$$aggr?: AggregationResult<Oper.Schema>;
|
||||
user$ref?: Array<Schema>;
|
||||
user$ref$$aggr?: AggregationResult<Schema>;
|
||||
operEntity$entity?: Array<OperEntity.Schema>;
|
||||
operEntity$entity$$aggr?: AggregationResult<OperEntity.Schema>;
|
||||
modiEntity$entity?: Array<ModiEntity.Schema>;
|
||||
|
|
@ -34,6 +42,9 @@ declare type AttrFilter = {
|
|||
name: Q_StringValue;
|
||||
nickname: Q_StringValue;
|
||||
password: Q_StringValue;
|
||||
refId: Q_StringValue | SubQuery.UserIdSubQuery;
|
||||
ref: Filter;
|
||||
userState: Q_EnumValue<UserState>;
|
||||
};
|
||||
export declare type Filter = MakeFilter<AttrFilter & ExprOp<OpAttr | string>>;
|
||||
export declare type Projection = {
|
||||
|
|
@ -46,12 +57,21 @@ export declare type Projection = {
|
|||
name?: number;
|
||||
nickname?: number;
|
||||
password?: number;
|
||||
refId?: number;
|
||||
ref?: Projection;
|
||||
userState?: number;
|
||||
oper$operator?: Oper.Selection & {
|
||||
$entity: "oper";
|
||||
};
|
||||
oper$operator$$aggr?: Oper.Aggregation & {
|
||||
$entity: "oper";
|
||||
};
|
||||
user$ref?: Selection & {
|
||||
$entity: "user";
|
||||
};
|
||||
user$ref$$aggr?: Aggregation & {
|
||||
$entity: "user";
|
||||
};
|
||||
operEntity$entity?: OperEntity.Selection & {
|
||||
$entity: "operEntity";
|
||||
};
|
||||
|
|
@ -67,6 +87,7 @@ export declare type Projection = {
|
|||
} & Partial<ExprOp<OpAttr | string>>;
|
||||
declare type UserIdProjection = OneOf<{
|
||||
id: number;
|
||||
refId: number;
|
||||
}>;
|
||||
export declare type SortAttr = {
|
||||
id: number;
|
||||
|
|
@ -82,6 +103,12 @@ export declare type SortAttr = {
|
|||
nickname: number;
|
||||
} | {
|
||||
password: number;
|
||||
} | {
|
||||
refId: number;
|
||||
} | {
|
||||
ref: SortAttr;
|
||||
} | {
|
||||
userState: number;
|
||||
} | {
|
||||
[k: string]: any;
|
||||
} | OneOf<ExprOp<OpAttr | string>>;
|
||||
|
|
@ -93,29 +120,53 @@ export declare type Sorter = SortNode[];
|
|||
export declare type SelectOperation<P extends Object = Projection> = OakSelection<"select", P, Filter, Sorter>;
|
||||
export declare type Selection<P extends Object = Projection> = Omit<SelectOperation<P>, "action">;
|
||||
export declare type Aggregation = DeduceAggregation<Projection, Filter, Sorter>;
|
||||
export declare type CreateOperationData = FormCreateData<OpSchema> & {
|
||||
export declare type CreateOperationData = FormCreateData<Omit<OpSchema, "refId">> & (({
|
||||
refId?: never;
|
||||
ref?: CreateSingleOperation;
|
||||
} | {
|
||||
refId: String<64>;
|
||||
ref?: UpdateOperation;
|
||||
} | {
|
||||
refId?: String<64>;
|
||||
})) & {
|
||||
oper$operator?: OakOperation<"create", Omit<Oper.CreateOperationData, "operator" | "operatorId">[]> | Array<OakOperation<"create", Omit<Oper.CreateOperationData, "operator" | "operatorId">>>;
|
||||
user$ref?: OakOperation<UpdateOperation["action"], Omit<UpdateOperationData, "ref" | "refId">, Filter> | OakOperation<"create", Omit<CreateOperationData, "ref" | "refId">[]> | Array<OakOperation<"create", Omit<CreateOperationData, "ref" | "refId">> | OakOperation<UpdateOperation["action"], Omit<UpdateOperationData, "ref" | "refId">, Filter>>;
|
||||
operEntity$entity?: OakOperation<"create", Omit<OperEntity.CreateOperationData, "entity" | "entityId">[]> | Array<OakOperation<"create", Omit<OperEntity.CreateOperationData, "entity" | "entityId">>>;
|
||||
modiEntity$entity?: OakOperation<"create", Omit<ModiEntity.CreateOperationData, "entity" | "entityId">[]> | Array<OakOperation<"create", Omit<ModiEntity.CreateOperationData, "entity" | "entityId">>>;
|
||||
};
|
||||
export declare type CreateSingleOperation = OakOperation<"create", CreateOperationData>;
|
||||
export declare type CreateMultipleOperation = OakOperation<"create", Array<CreateOperationData>>;
|
||||
export declare type CreateOperation = CreateSingleOperation | CreateMultipleOperation;
|
||||
export declare type UpdateOperationData = FormUpdateData<OpSchema> & {
|
||||
export declare type UpdateOperationData = FormUpdateData<Omit<OpSchema, "refId">> & (({
|
||||
ref: CreateSingleOperation;
|
||||
refId?: never;
|
||||
} | {
|
||||
ref: UpdateOperation;
|
||||
refId?: never;
|
||||
} | {
|
||||
ref: RemoveOperation;
|
||||
refId?: never;
|
||||
} | {
|
||||
ref?: never;
|
||||
refId?: String<64> | null;
|
||||
})) & {
|
||||
[k: string]: any;
|
||||
oper$operator?: OakOperation<"create", Omit<Oper.CreateOperationData, "operator" | "operatorId">[]> | Array<OakOperation<"create", Omit<Oper.CreateOperationData, "operator" | "operatorId">>>;
|
||||
user$ref?: UpdateOperation | RemoveOperation | OakOperation<"create", Omit<CreateOperationData, "ref" | "refId">[]> | Array<OakOperation<"create", Omit<CreateOperationData, "ref" | "refId">> | UpdateOperation | RemoveOperation>;
|
||||
operEntity$entity?: OakOperation<"create", Omit<OperEntity.CreateOperationData, "entity" | "entityId">[]> | Array<OakOperation<"create", Omit<OperEntity.CreateOperationData, "entity" | "entityId">>>;
|
||||
modiEntity$entity?: OakOperation<"create", Omit<ModiEntity.CreateOperationData, "entity" | "entityId">[]> | Array<OakOperation<"create", Omit<ModiEntity.CreateOperationData, "entity" | "entityId">>>;
|
||||
};
|
||||
export declare type UpdateOperation = OakOperation<"update" | RelationAction | string, UpdateOperationData, Filter, Sorter>;
|
||||
export declare type RemoveOperationData = {};
|
||||
export declare type UpdateOperation = OakOperation<"update" | ParticularAction | RelationAction | string, UpdateOperationData, Filter, Sorter>;
|
||||
export declare type RemoveOperationData = {} & (({
|
||||
ref?: UpdateOperation | RemoveOperation;
|
||||
}));
|
||||
export declare type RemoveOperation = OakOperation<"remove", RemoveOperationData, Filter, Sorter>;
|
||||
export declare type Operation = CreateOperation | UpdateOperation | RemoveOperation;
|
||||
export declare type UserIdSubQuery = Selection<UserIdProjection>;
|
||||
export declare type EntityDef = {
|
||||
Schema: Schema;
|
||||
OpSchema: OpSchema;
|
||||
Action: OakMakeAction<GenericAction | RelationAction> | string;
|
||||
Action: OakMakeAction<Action | RelationAction> | string;
|
||||
Selection: Selection;
|
||||
Aggregation: Aggregation;
|
||||
Operation: Operation;
|
||||
|
|
@ -124,5 +175,6 @@ export declare type EntityDef = {
|
|||
Remove: RemoveOperation;
|
||||
CreateSingle: CreateSingleOperation;
|
||||
CreateMulti: CreateMultipleOperation;
|
||||
ParticularAction: ParticularAction;
|
||||
};
|
||||
export {};
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.desc = void 0;
|
||||
var Action_1 = require("./Action");
|
||||
var action_1 = require("../../actions/action");
|
||||
exports.desc = {
|
||||
attributes: {
|
||||
|
|
@ -18,8 +19,18 @@ exports.desc = {
|
|||
},
|
||||
password: {
|
||||
type: "text"
|
||||
},
|
||||
refId: {
|
||||
type: "ref",
|
||||
ref: "user"
|
||||
},
|
||||
userState: {
|
||||
type: "varchar",
|
||||
params: {
|
||||
length: 24
|
||||
}
|
||||
}
|
||||
},
|
||||
actionType: "crud",
|
||||
actions: action_1.genericActions.concat(action_1.relationActions)
|
||||
actions: Action_1.actions.concat(action_1.relationActions)
|
||||
};
|
||||
|
|
|
|||
|
|
@ -0,0 +1,121 @@
|
|||
import { String } from "../../types/DataType";
|
||||
import { Q_DateValue, Q_StringValue, NodeId, MakeFilter, ExprOp, ExpressionKey } from "../../types/Demand";
|
||||
import { OneOf } from "../../types/Polyfill";
|
||||
import * as SubQuery from "../_SubQuery";
|
||||
import { FormCreateData, FormUpdateData, DeduceAggregation, Operation as OakOperation, Selection as OakSelection, MakeAction as OakMakeAction, EntityShape, AggregationResult } from "../../types/Entity";
|
||||
import { GenericAction } from "../../actions/action";
|
||||
import * as OperEntity from "../OperEntity/Schema";
|
||||
import * as ModiEntity from "../ModiEntity/Schema";
|
||||
export declare type OpSchema = EntityShape & {
|
||||
entity: String<32>;
|
||||
entityId: String<64>;
|
||||
relation: String<32>;
|
||||
};
|
||||
export declare type OpAttr = keyof OpSchema;
|
||||
export declare type Schema = EntityShape & {
|
||||
entity: String<32>;
|
||||
entityId: String<64>;
|
||||
relation: String<32>;
|
||||
operEntity$entity?: Array<OperEntity.Schema>;
|
||||
operEntity$entity$$aggr?: AggregationResult<OperEntity.Schema>;
|
||||
modiEntity$entity?: Array<ModiEntity.Schema>;
|
||||
modiEntity$entity$$aggr?: AggregationResult<ModiEntity.Schema>;
|
||||
} & {
|
||||
[A in ExpressionKey]?: any;
|
||||
};
|
||||
declare type AttrFilter = {
|
||||
id: Q_StringValue | SubQuery.UserEntityGrantIdSubQuery;
|
||||
$$createAt$$: Q_DateValue;
|
||||
$$seq$$: Q_StringValue;
|
||||
$$updateAt$$: Q_DateValue;
|
||||
entity: Q_StringValue;
|
||||
entityId: Q_StringValue;
|
||||
relation: Q_StringValue;
|
||||
};
|
||||
export declare type Filter = MakeFilter<AttrFilter & ExprOp<OpAttr | string>>;
|
||||
export declare type Projection = {
|
||||
"#id"?: NodeId;
|
||||
[k: string]: any;
|
||||
id?: number;
|
||||
$$createAt$$?: number;
|
||||
$$updateAt$$?: number;
|
||||
$$seq$$?: number;
|
||||
entity?: number;
|
||||
entityId?: number;
|
||||
relation?: number;
|
||||
operEntity$entity?: OperEntity.Selection & {
|
||||
$entity: "operEntity";
|
||||
};
|
||||
operEntity$entity$$aggr?: OperEntity.Aggregation & {
|
||||
$entity: "operEntity";
|
||||
};
|
||||
modiEntity$entity?: ModiEntity.Selection & {
|
||||
$entity: "modiEntity";
|
||||
};
|
||||
modiEntity$entity$$aggr?: ModiEntity.Aggregation & {
|
||||
$entity: "modiEntity";
|
||||
};
|
||||
} & Partial<ExprOp<OpAttr | string>>;
|
||||
declare type UserEntityGrantIdProjection = OneOf<{
|
||||
id: number;
|
||||
}>;
|
||||
export declare type SortAttr = {
|
||||
id: number;
|
||||
} | {
|
||||
$$createAt$$: number;
|
||||
} | {
|
||||
$$seq$$: number;
|
||||
} | {
|
||||
$$updateAt$$: number;
|
||||
} | {
|
||||
entity: number;
|
||||
} | {
|
||||
entityId: number;
|
||||
} | {
|
||||
relation: number;
|
||||
} | {
|
||||
[k: string]: any;
|
||||
} | OneOf<ExprOp<OpAttr | string>>;
|
||||
export declare type SortNode = {
|
||||
$attr: SortAttr;
|
||||
$direction?: "asc" | "desc";
|
||||
};
|
||||
export declare type Sorter = SortNode[];
|
||||
export declare type SelectOperation<P extends Object = Projection> = OakSelection<"select", P, Filter, Sorter>;
|
||||
export declare type Selection<P extends Object = Projection> = Omit<SelectOperation<P>, "action">;
|
||||
export declare type Aggregation = DeduceAggregation<Projection, Filter, Sorter>;
|
||||
export declare type CreateOperationData = FormCreateData<Omit<OpSchema, "entity" | "entityId">> & ({
|
||||
entity?: string;
|
||||
entityId?: string;
|
||||
[K: string]: any;
|
||||
}) & {
|
||||
operEntity$entity?: OakOperation<"create", Omit<OperEntity.CreateOperationData, "entity" | "entityId">[]> | Array<OakOperation<"create", Omit<OperEntity.CreateOperationData, "entity" | "entityId">>>;
|
||||
modiEntity$entity?: OakOperation<"create", Omit<ModiEntity.CreateOperationData, "entity" | "entityId">[]> | Array<OakOperation<"create", Omit<ModiEntity.CreateOperationData, "entity" | "entityId">>>;
|
||||
};
|
||||
export declare type CreateSingleOperation = OakOperation<"create", CreateOperationData>;
|
||||
export declare type CreateMultipleOperation = OakOperation<"create", Array<CreateOperationData>>;
|
||||
export declare type CreateOperation = CreateSingleOperation | CreateMultipleOperation;
|
||||
export declare type UpdateOperationData = FormUpdateData<OpSchema> & {
|
||||
[k: string]: any;
|
||||
operEntity$entity?: OakOperation<"create", Omit<OperEntity.CreateOperationData, "entity" | "entityId">[]> | Array<OakOperation<"create", Omit<OperEntity.CreateOperationData, "entity" | "entityId">>>;
|
||||
modiEntity$entity?: OakOperation<"create", Omit<ModiEntity.CreateOperationData, "entity" | "entityId">[]> | Array<OakOperation<"create", Omit<ModiEntity.CreateOperationData, "entity" | "entityId">>>;
|
||||
};
|
||||
export declare type UpdateOperation = OakOperation<"update" | string, UpdateOperationData, Filter, Sorter>;
|
||||
export declare type RemoveOperationData = {};
|
||||
export declare type RemoveOperation = OakOperation<"remove", RemoveOperationData, Filter, Sorter>;
|
||||
export declare type Operation = CreateOperation | UpdateOperation | RemoveOperation;
|
||||
export declare type UserEntityGrantIdSubQuery = Selection<UserEntityGrantIdProjection>;
|
||||
export declare type EntityDef = {
|
||||
Schema: Schema;
|
||||
OpSchema: OpSchema;
|
||||
Action: OakMakeAction<GenericAction> | string;
|
||||
Selection: Selection;
|
||||
Aggregation: Aggregation;
|
||||
Operation: Operation;
|
||||
Create: CreateOperation;
|
||||
Update: UpdateOperation;
|
||||
Remove: RemoveOperation;
|
||||
CreateSingle: CreateSingleOperation;
|
||||
CreateMulti: CreateMultipleOperation;
|
||||
};
|
||||
export {};
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
import { StorageDesc } from "../../types/Storage";
|
||||
import { OpSchema } from "./Schema";
|
||||
export declare const desc: StorageDesc<OpSchema>;
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.desc = void 0;
|
||||
var action_1 = require("../../actions/action");
|
||||
exports.desc = {
|
||||
attributes: {
|
||||
entity: {
|
||||
type: "varchar",
|
||||
params: {
|
||||
length: 32
|
||||
}
|
||||
},
|
||||
entityId: {
|
||||
type: "varchar",
|
||||
params: {
|
||||
length: 64
|
||||
}
|
||||
},
|
||||
relation: {
|
||||
type: "varchar",
|
||||
params: {
|
||||
length: 32
|
||||
}
|
||||
}
|
||||
},
|
||||
actionType: "crud",
|
||||
actions: action_1.genericActions
|
||||
};
|
||||
|
|
@ -3,6 +3,7 @@ import * as ModiEntity from "./ModiEntity/Schema";
|
|||
import * as Oper from "./Oper/Schema";
|
||||
import * as OperEntity from "./OperEntity/Schema";
|
||||
import * as User from "./User/Schema";
|
||||
import * as UserEntityGrant from "./UserEntityGrant/Schema";
|
||||
export declare type ModiIdSubQuery = {
|
||||
[K in "$in" | "$nin"]?: (ModiEntity.ModiIdSubQuery & {
|
||||
entity: "modiEntity";
|
||||
|
|
@ -32,5 +33,12 @@ export declare type UserIdSubQuery = {
|
|||
entity: "oper";
|
||||
}) | (User.UserIdSubQuery & {
|
||||
entity: "user";
|
||||
}) | (User.UserIdSubQuery & {
|
||||
entity: "user";
|
||||
}) | any;
|
||||
};
|
||||
export declare type UserEntityGrantIdSubQuery = {
|
||||
[K in "$in" | "$nin"]?: (UserEntityGrant.UserEntityGrantIdSubQuery & {
|
||||
entity: "userEntityGrant";
|
||||
}) | any;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ var modi_1 = require("../store/modi");
|
|||
function createDynamicCheckers(schema, authDict) {
|
||||
var checkers = [];
|
||||
checkers.push.apply(checkers, tslib_1.__spreadArray([], tslib_1.__read((0, modi_1.createModiRelatedCheckers)(schema)), false));
|
||||
// checkers.push(...createRemoveCheckers<ED, Cxt>(schema));
|
||||
checkers.push.apply(checkers, tslib_1.__spreadArray([], tslib_1.__read((0, checker_1.createRemoveCheckers)(schema)), false));
|
||||
if (authDict) {
|
||||
checkers.push.apply(checkers, tslib_1.__spreadArray([], tslib_1.__read((0, checker_1.createAuthCheckers)(schema, authDict)), false));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -51,6 +51,20 @@ function addRelationship(many, one, key, notNull) {
|
|||
_b));
|
||||
}
|
||||
}
|
||||
/**
|
||||
* 对relationship去重。一旦发生对象重定义这里就有可能重复
|
||||
*/
|
||||
function uniqRelationships() {
|
||||
for (var entity in ManyToOne) {
|
||||
ManyToOne[entity] = (0, lodash_1.uniqBy)(ManyToOne[entity], function (ele) { return "".concat(ele[0], "-").concat(ele[1]); });
|
||||
}
|
||||
for (var entity in OneToMany) {
|
||||
OneToMany[entity] = (0, lodash_1.uniqBy)(OneToMany[entity], function (ele) { return "".concat(ele[0], "-").concat(ele[1]); });
|
||||
}
|
||||
for (var entity in ReversePointerRelations) {
|
||||
OneToMany[entity] = (0, lodash_1.uniq)(OneToMany[entity]);
|
||||
}
|
||||
}
|
||||
function createForeignRef(entity, foreignKey, ref) {
|
||||
if (entity === foreignKey) {
|
||||
return factory.createIdentifier(ref);
|
||||
|
|
@ -317,9 +331,10 @@ function analyzeEntity(filename, path, program, relativePath) {
|
|||
var sourceFile = program.getSourceFile(fullPath);
|
||||
var moduleName = filename.split('.')[0];
|
||||
if (Schema.hasOwnProperty(moduleName)) {
|
||||
if (!path.includes('oak-general-business')) {
|
||||
console.log("\u51FA\u73B0\u4E86\u540C\u540D\u7684Entity\u5B9A\u4E49\u300C".concat(moduleName, "\u300D\uFF0C\u5C06\u4F7F\u7528\u60A8\u6240\u5B9A\u4E49\u7684\u5BF9\u8C61\u7ED3\u6784\u53D6\u4EE3\u6389\u9ED8\u8BA4\u5BF9\u8C61\uFF0C\u8BF7\u786E\u8BA4"));
|
||||
}
|
||||
delete ActionAsts[moduleName];
|
||||
delete SchemaAsts[moduleName];
|
||||
// removeFromRelationShip(moduleName);
|
||||
console.warn("\u51FA\u73B0\u4E86\u540C\u540D\u7684Entity\u5B9A\u4E49\u300C".concat(moduleName, "\u300D\uFF0C\u5C06\u4F7F\u7528").concat(fullPath, "\u53D6\u4EE3\u6389\u9ED8\u8BA4\u5BF9\u8C61\uFF0C\u8BF7\u68C0\u67E5\u65B0\u7684\u5BF9\u8C61\u7ED3\u6784\u53CA\u76F8\u5173\u5E38\u91CF\u5B9A\u4E49\u4E0E\u539F\u6709\u7684\u517C\u5BB9\uFF0C\u5426\u5219\u539F\u6709\u5BF9\u8C61\u7684\u76F8\u5173\u903B\u8F91\u4F1A\u51FA\u73B0\u4E0D\u53EF\u77E5\u5F02\u5E38"));
|
||||
}
|
||||
var referencedSchemas = [];
|
||||
var schemaAttrs = [];
|
||||
|
|
@ -340,7 +355,7 @@ function analyzeEntity(filename, path, program, relativePath) {
|
|||
// let relationHierarchy: ts.ObjectLiteralExpression | undefined = undefined;
|
||||
// let reverseCascadeRelationHierarchy: ts.ObjectLiteralExpression | undefined = undefined;
|
||||
ts.forEachChild(sourceFile, function (node) {
|
||||
var _a, _b, _c, _d;
|
||||
var _a, _b, _c, _d, _e;
|
||||
if (ts.isImportDeclaration(node)) {
|
||||
var entityImported = getEntityImported(node);
|
||||
if (entityImported) {
|
||||
|
|
@ -389,7 +404,9 @@ function analyzeEntity(filename, path, program, relativePath) {
|
|||
&& referencedSchemas.includes(typeArguments[0].typeName.text), "\u300C".concat(filename, "\u300D\u975E\u6CD5\u7684\u5C5E\u6027\u5B9A\u4E49\u300C").concat(attrName, "\u300D"));
|
||||
var reverseEntity = typeArguments[0].typeName.text;
|
||||
if (ReversePointerRelations[reverseEntity]) {
|
||||
ReversePointerRelations[reverseEntity].push(moduleName);
|
||||
if (!ReversePointerRelations[reverseEntity].includes(moduleName)) {
|
||||
ReversePointerRelations[reverseEntity].push(moduleName);
|
||||
}
|
||||
}
|
||||
else {
|
||||
(0, lodash_1.assign)(ReversePointerRelations, (_a = {},
|
||||
|
|
@ -520,6 +537,9 @@ function analyzeEntity(filename, path, program, relativePath) {
|
|||
if (hasRelationDef || moduleName === 'User') {
|
||||
actionDefNodes.push(factory.createTypeReferenceNode('RelationAction', undefined));
|
||||
}
|
||||
if (process.env.COMPLING_AS_LIB) {
|
||||
actionDefNodes.push(factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword));
|
||||
}
|
||||
pushStatementIntoActionAst(moduleName, factory.createTypeAliasDeclaration(undefined, [factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createIdentifier("Action"), undefined, factory.createUnionTypeNode(actionDefNodes)), sourceFile);
|
||||
dealWithActions(moduleName, filename, node.type, program, sourceFile, !!hasRelationDef || moduleName === 'User');
|
||||
}
|
||||
|
|
@ -558,12 +578,35 @@ function analyzeEntity(filename, path, program, relativePath) {
|
|||
_d));
|
||||
addRelationship(relationEntityName, 'User', 'user', true);
|
||||
addRelationship(relationEntityName, moduleName, entityLc, true);
|
||||
// 对UserEntityGrant对象,建立相应的反指关系
|
||||
if (ReversePointerRelations['UserEntityGrant']) {
|
||||
if (!ReversePointerRelations['UserEntityGrant'].includes(moduleName)) {
|
||||
ReversePointerRelations['UserEntityGrant'].push(moduleName);
|
||||
}
|
||||
}
|
||||
else {
|
||||
(0, lodash_1.assign)(ReversePointerRelations, (_e = {},
|
||||
_e['UserEntityGrant'] = [moduleName],
|
||||
_e));
|
||||
}
|
||||
hasRelationDef = node;
|
||||
}
|
||||
else if (node.name.text.endsWith('Action') || node.name.text.endsWith('State')) {
|
||||
(0, assert_1.default)(!localeDef, "\u3010".concat(filename, "\u3011locale\u5B9A\u4E49\u987B\u5728Action/State\u4E4B\u540E"));
|
||||
hasActionOrStateDef = true;
|
||||
pushStatementIntoActionAst(moduleName, factory.updateTypeAliasDeclaration(node, node.decorators, [factory.createModifier(ts.SyntaxKind.ExportKeyword)], node.name, node.typeParameters, node.type), sourceFile);
|
||||
var type = node.type;
|
||||
if (ts.isUnionTypeNode(type)) {
|
||||
pushStatementIntoActionAst(moduleName, factory.updateTypeAliasDeclaration(node, node.decorators, [factory.createModifier(ts.SyntaxKind.ExportKeyword)], node.name, node.typeParameters, process.env.COMPLING_AS_LIB ? factory.createUnionTypeNode(tslib_1.__spreadArray(tslib_1.__spreadArray([], tslib_1.__read(type.types), false), [
|
||||
factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword)
|
||||
], false)) : type), sourceFile);
|
||||
}
|
||||
else {
|
||||
(0, assert_1.default)(ts.isLiteralTypeNode(type) || ts.isTypeReferenceNode(type), "".concat(moduleName, " - ").concat(node.name));
|
||||
pushStatementIntoActionAst(moduleName, factory.updateTypeAliasDeclaration(node, node.decorators, [factory.createModifier(ts.SyntaxKind.ExportKeyword)], node.name, node.typeParameters, process.env.COMPLING_AS_LIB ? factory.createUnionTypeNode([
|
||||
type,
|
||||
factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword)
|
||||
]) : type), sourceFile);
|
||||
}
|
||||
}
|
||||
else if (beforeSchema) {
|
||||
// 本地规定的一些形状定义,直接使用
|
||||
|
|
@ -3291,6 +3334,7 @@ function analyzeEntities(inputDir, relativePath) {
|
|||
analyzeEntity(filename, inputDir, program, relativePath);
|
||||
});
|
||||
analyzeInModi();
|
||||
uniqRelationships();
|
||||
}
|
||||
exports.analyzeEntities = analyzeEntities;
|
||||
function buildSchema(outputDir) {
|
||||
|
|
|
|||
|
|
@ -4,4 +4,5 @@ export interface Schema extends EntityShape {
|
|||
name?: String<16>;
|
||||
nickname?: String<64>;
|
||||
password?: Text;
|
||||
ref?: Schema;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,12 +1,28 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
;
|
||||
var UserActionDef = {
|
||||
stm: {
|
||||
mergeTo: ['normal', 'merged'],
|
||||
},
|
||||
};
|
||||
var locale = {
|
||||
zh_CN: {
|
||||
attr: {
|
||||
name: '姓名',
|
||||
nickname: '昵称',
|
||||
password: '密码',
|
||||
ref: '指向用户',
|
||||
userState: '状态',
|
||||
},
|
||||
action: {
|
||||
mergeTo: '合并',
|
||||
},
|
||||
v: {
|
||||
userState: {
|
||||
normal: '正常',
|
||||
merged: '已被合并',
|
||||
},
|
||||
}
|
||||
},
|
||||
};
|
||||
|
|
|
|||
|
|
@ -0,0 +1,7 @@
|
|||
import { String } from '../types/DataType';
|
||||
import { EntityShape } from '../types/Entity';
|
||||
export interface Schema extends EntityShape {
|
||||
entity: String<32>;
|
||||
entityId: String<64>;
|
||||
relation: String<32>;
|
||||
}
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
;
|
||||
var locale = {
|
||||
zh_CN: {
|
||||
attr: {
|
||||
relation: '关系',
|
||||
entity: '关联对象',
|
||||
entityId: '关联对象id',
|
||||
},
|
||||
},
|
||||
};
|
||||
|
|
@ -546,8 +546,8 @@ function createRemoveCheckers(schema) {
|
|||
}
|
||||
};
|
||||
for (var entity in schema) {
|
||||
if (['operEntity'].includes(entity)) {
|
||||
continue; // OperEntity会指向每一个对象,不必处理
|
||||
if (['operEntity', 'modiEntity', 'userEntityGrant'].includes(entity)) {
|
||||
continue; // 系统功能性数据,不用处理
|
||||
}
|
||||
var attributes = schema[entity].attributes;
|
||||
for (var attr in attributes) {
|
||||
|
|
@ -565,7 +565,7 @@ function createRemoveCheckers(schema) {
|
|||
}
|
||||
}
|
||||
// 当删除一时,要确认多上面没有指向一的数据
|
||||
var entities = (0, lodash_1.intersection)(Object.keys(OneToManyMatrix), Object.keys(OneToManyOnEntityMatrix));
|
||||
var entities = (0, lodash_1.union)(Object.keys(OneToManyMatrix), Object.keys(OneToManyOnEntityMatrix));
|
||||
var _loop_3 = function (entity) {
|
||||
checkers.push({
|
||||
entity: entity,
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.createModiRelatedTriggers = exports.createModiRelatedCheckers = exports.abandonModis = exports.applyModis = exports.createOperationsFromModies = void 0;
|
||||
var tslib_1 = require("tslib");
|
||||
var types_1 = require("../types");
|
||||
var action_1 = require("../actions/action");
|
||||
var lodash_1 = require("../utils/lodash");
|
||||
var uuid_1 = require("../utils/uuid");
|
||||
|
|
@ -154,35 +155,52 @@ function createModiRelatedTriggers(schema) {
|
|||
if (inModi) {
|
||||
// 当关联modi的对象被删除时,对应的modi也删除
|
||||
triggers.push({
|
||||
name: "\u5F53\u5220\u9664".concat(entity, "\u5BF9\u8C61\u65F6\uFF0C\u5220\u9664\u76F8\u5173\u8054\u8FD8\u6D3B\u8DC3\u7684modi"),
|
||||
name: "\u5F53\u5220\u9664".concat(entity, "\u5BF9\u8C61\u65F6\uFF0C\u5220\u9664\u76F8\u5173\u8054\u7684modi\u7684modiEntity"),
|
||||
action: 'remove',
|
||||
entity: entity,
|
||||
when: 'after',
|
||||
priority: types_1.REMOVE_CASCADE_PRIORITY,
|
||||
fn: function (_a, context, option) {
|
||||
var operation = _a.operation;
|
||||
return tslib_1.__awaiter(_this, void 0, void 0, function () {
|
||||
var data, id, _b, _c, _d;
|
||||
var _e;
|
||||
return tslib_1.__generator(this, function (_f) {
|
||||
switch (_f.label) {
|
||||
var data, id, _b, _c, _d, _e, _f, _g;
|
||||
var _h, _j;
|
||||
return tslib_1.__generator(this, function (_k) {
|
||||
switch (_k.label) {
|
||||
case 0:
|
||||
data = operation.data;
|
||||
id = data.id;
|
||||
_c = (_b = context).operate;
|
||||
_d = ['modi'];
|
||||
_e = {};
|
||||
_d = ['modiEntity'];
|
||||
_h = {};
|
||||
return [4 /*yield*/, (0, uuid_1.generateNewIdAsync)()];
|
||||
case 1: return [4 /*yield*/, _c.apply(_b, _d.concat([(_e.id = _f.sent(),
|
||||
_e.action = 'remove',
|
||||
_e.data = {},
|
||||
_e.filter = {
|
||||
case 1: return [4 /*yield*/, _c.apply(_b, _d.concat([(_h.id = _k.sent(),
|
||||
_h.action = 'remove',
|
||||
_h.data = {},
|
||||
_h.filter = {
|
||||
modi: {
|
||||
entity: entity,
|
||||
entityId: id,
|
||||
},
|
||||
},
|
||||
_h), { dontCollect: true }]))];
|
||||
case 2:
|
||||
_k.sent();
|
||||
_f = (_e = context).operate;
|
||||
_g = ['modi'];
|
||||
_j = {};
|
||||
return [4 /*yield*/, (0, uuid_1.generateNewIdAsync)()];
|
||||
case 3: return [4 /*yield*/, _f.apply(_e, _g.concat([(_j.id = _k.sent(),
|
||||
_j.action = 'remove',
|
||||
_j.data = {},
|
||||
_j.filter = {
|
||||
entity: entity,
|
||||
entityId: id,
|
||||
},
|
||||
_e), option]))];
|
||||
case 2:
|
||||
_f.sent();
|
||||
return [2 /*return*/, 1];
|
||||
_j), { dontCollect: true }]))];
|
||||
case 4:
|
||||
_k.sent();
|
||||
return [2 /*return*/, 0];
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@ export declare const TRIGGER_MIN_PRIORITY = 1;
|
|||
export declare const TRIGGER_MAX_PRIORITY = 99;
|
||||
export declare const DATA_CHECKER_DEFAULT_PRIORITY = 60;
|
||||
export declare const CHECKER_DEFAULT_PRIORITY = 99;
|
||||
export declare const REMOVE_CASCADE_PRIORITY = 70;
|
||||
interface TriggerBase<ED extends EntityDict, T extends keyof ED> {
|
||||
checkerType?: CheckerType;
|
||||
entity: T;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.CHECKER_DEFAULT_PRIORITY = exports.DATA_CHECKER_DEFAULT_PRIORITY = exports.TRIGGER_MAX_PRIORITY = exports.TRIGGER_MIN_PRIORITY = exports.TRIGGER_DEFAULT_PRIORITY = void 0;
|
||||
exports.REMOVE_CASCADE_PRIORITY = exports.CHECKER_DEFAULT_PRIORITY = exports.DATA_CHECKER_DEFAULT_PRIORITY = exports.TRIGGER_MAX_PRIORITY = exports.TRIGGER_MIN_PRIORITY = exports.TRIGGER_DEFAULT_PRIORITY = void 0;
|
||||
/**
|
||||
* 优先级越小,越早执行。定义在1~99之间
|
||||
*/
|
||||
|
|
@ -9,6 +9,7 @@ exports.TRIGGER_MIN_PRIORITY = 1;
|
|||
exports.TRIGGER_MAX_PRIORITY = 99;
|
||||
exports.DATA_CHECKER_DEFAULT_PRIORITY = 60;
|
||||
exports.CHECKER_DEFAULT_PRIORITY = 99;
|
||||
exports.REMOVE_CASCADE_PRIORITY = 70;
|
||||
;
|
||||
;
|
||||
;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "oak-domain",
|
||||
"version": "2.4.4",
|
||||
"version": "2.5.1",
|
||||
"author": {
|
||||
"name": "XuChang"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ import { StorageSchema, EntityDict as BaseEntityDict, Checker, AuthDef, AuthDefD
|
|||
export function createDynamicCheckers<ED extends EntityDict & BaseEntityDict, Cxt extends AsyncContext<ED> | SyncContext<ED>>(schema: StorageSchema<ED>, authDict?: AuthDefDict<ED>){
|
||||
const checkers: Checker<ED, keyof ED, Cxt>[] = [];
|
||||
checkers.push(...createModiRelatedCheckers<ED, Cxt>(schema));
|
||||
// checkers.push(...createRemoveCheckers<ED, Cxt>(schema));
|
||||
checkers.push(...createRemoveCheckers<ED, Cxt>(schema));
|
||||
if (authDict) {
|
||||
checkers.push(...createAuthCheckers<ED, Cxt>(schema, authDict));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -139,6 +139,22 @@ function addRelationship(many: string, one: string, key: string, notNull: boolea
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 对relationship去重。一旦发生对象重定义这里就有可能重复
|
||||
*/
|
||||
function uniqRelationships() {
|
||||
for (const entity in ManyToOne) {
|
||||
ManyToOne[entity] = uniqBy(ManyToOne[entity], (ele) => `${ele[0]}-${ele[1]}`);
|
||||
}
|
||||
for (const entity in OneToMany) {
|
||||
OneToMany[entity] = uniqBy(OneToMany[entity], (ele) => `${ele[0]}-${ele[1]}`);
|
||||
}
|
||||
for (const entity in ReversePointerRelations) {
|
||||
OneToMany[entity] = uniq(OneToMany[entity]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function createForeignRef(entity: string, foreignKey: string, ref: string) {
|
||||
if (entity === foreignKey) {
|
||||
return factory.createIdentifier(ref)
|
||||
|
|
@ -477,9 +493,10 @@ function analyzeEntity(filename: string, path: string, program: ts.Program, rela
|
|||
const moduleName = filename.split('.')[0];
|
||||
|
||||
if (Schema.hasOwnProperty(moduleName)) {
|
||||
if (!path.includes('oak-general-business')) {
|
||||
console.log(`出现了同名的Entity定义「${moduleName}」,将使用您所定义的对象结构取代掉默认对象,请确认`);
|
||||
}
|
||||
delete ActionAsts[moduleName];
|
||||
delete SchemaAsts[moduleName];
|
||||
// removeFromRelationShip(moduleName);
|
||||
console.warn(`出现了同名的Entity定义「${moduleName}」,将使用${fullPath}取代掉默认对象,请检查新的对象结构及相关常量定义与原有的兼容,否则原有对象的相关逻辑会出现不可知异常`);
|
||||
}
|
||||
const referencedSchemas: string[] = [];
|
||||
const schemaAttrs: ts.TypeElement[] = [];
|
||||
|
|
@ -565,7 +582,9 @@ function analyzeEntity(filename: string, path: string, program: ts.Program, rela
|
|||
`「${filename}」非法的属性定义「${attrName}」`);
|
||||
const reverseEntity = typeArguments![0].typeName.text;
|
||||
if (ReversePointerRelations[reverseEntity]) {
|
||||
ReversePointerRelations[reverseEntity].push(moduleName);
|
||||
if (!ReversePointerRelations[reverseEntity].includes(moduleName)) {
|
||||
ReversePointerRelations[reverseEntity].push(moduleName);
|
||||
}
|
||||
}
|
||||
else {
|
||||
assign(ReversePointerRelations, {
|
||||
|
|
@ -721,7 +740,7 @@ function analyzeEntity(filename: string, path: string, program: ts.Program, rela
|
|||
'ParticularAction',
|
||||
undefined
|
||||
)
|
||||
];
|
||||
] as ts.TypeNode[];
|
||||
if (hasRelationDef || moduleName === 'User') {
|
||||
actionDefNodes.push(
|
||||
factory.createTypeReferenceNode(
|
||||
|
|
@ -730,6 +749,11 @@ function analyzeEntity(filename: string, path: string, program: ts.Program, rela
|
|||
)
|
||||
);
|
||||
}
|
||||
if (process.env.COMPLING_AS_LIB) {
|
||||
actionDefNodes.push(
|
||||
factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword)
|
||||
);
|
||||
}
|
||||
pushStatementIntoActionAst(
|
||||
moduleName,
|
||||
factory.createTypeAliasDeclaration(
|
||||
|
|
@ -819,21 +843,55 @@ function analyzeEntity(filename: string, path: string, program: ts.Program, rela
|
|||
addRelationship(relationEntityName, 'User', 'user', true);
|
||||
addRelationship(relationEntityName, moduleName, entityLc, true);
|
||||
|
||||
// 对UserEntityGrant对象,建立相应的反指关系
|
||||
if (ReversePointerRelations['UserEntityGrant']) {
|
||||
if (!ReversePointerRelations['UserEntityGrant'].includes(moduleName)) {
|
||||
ReversePointerRelations['UserEntityGrant'].push(moduleName);
|
||||
}
|
||||
}
|
||||
else {
|
||||
assign(ReversePointerRelations, {
|
||||
['UserEntityGrant']: [moduleName],
|
||||
});
|
||||
}
|
||||
|
||||
hasRelationDef = node;
|
||||
}
|
||||
else if (node.name.text.endsWith('Action') || node.name.text.endsWith('State')) {
|
||||
assert(!localeDef, `【${filename}】locale定义须在Action/State之后`);
|
||||
hasActionOrStateDef = true;
|
||||
pushStatementIntoActionAst(moduleName,
|
||||
factory.updateTypeAliasDeclaration(
|
||||
node,
|
||||
node.decorators,
|
||||
[factory.createModifier(ts.SyntaxKind.ExportKeyword)],
|
||||
node.name,
|
||||
node.typeParameters,
|
||||
node.type
|
||||
),
|
||||
sourceFile!);
|
||||
const { type } = node;
|
||||
if (ts.isUnionTypeNode(type)) {
|
||||
pushStatementIntoActionAst(moduleName,
|
||||
factory.updateTypeAliasDeclaration(
|
||||
node,
|
||||
node.decorators,
|
||||
[factory.createModifier(ts.SyntaxKind.ExportKeyword)],
|
||||
node.name,
|
||||
node.typeParameters,
|
||||
process.env.COMPLING_AS_LIB ? factory.createUnionTypeNode([
|
||||
...type.types,
|
||||
factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword)
|
||||
]) : type
|
||||
),
|
||||
sourceFile!);
|
||||
}
|
||||
else {
|
||||
assert(ts.isLiteralTypeNode(type) || ts.isTypeReferenceNode(type), `${moduleName} - ${node.name}`);
|
||||
pushStatementIntoActionAst(moduleName,
|
||||
factory.updateTypeAliasDeclaration(
|
||||
node,
|
||||
node.decorators,
|
||||
[factory.createModifier(ts.SyntaxKind.ExportKeyword)],
|
||||
node.name,
|
||||
node.typeParameters,
|
||||
process.env.COMPLING_AS_LIB ? factory.createUnionTypeNode([
|
||||
type,
|
||||
factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword)
|
||||
]) : type
|
||||
),
|
||||
sourceFile!);
|
||||
}
|
||||
}
|
||||
else if (beforeSchema) {
|
||||
// 本地规定的一些形状定义,直接使用
|
||||
|
|
@ -5237,7 +5295,7 @@ function constructAttributes(entity: string): ts.PropertyAssignment[] {
|
|||
ele => factory.createStringLiteral(ele)
|
||||
),
|
||||
false
|
||||
)
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
|
@ -6146,6 +6204,7 @@ export function analyzeEntities(inputDir: string, relativePath?: string) {
|
|||
}
|
||||
);
|
||||
analyzeInModi();
|
||||
uniqRelationships();
|
||||
}
|
||||
|
||||
export function buildSchema(outputDir: string): void {
|
||||
|
|
|
|||
|
|
@ -1,20 +1,45 @@
|
|||
import { String, Int, Text, Image, Datetime } from '../types/DataType';
|
||||
import { LocaleDef } from '../types/Locale';
|
||||
import { EntityShape } from '../types/Entity';
|
||||
import { ActionDef } from '../types/Action';
|
||||
|
||||
export interface Schema extends EntityShape {
|
||||
name?: String<16>;
|
||||
nickname?: String<64>;
|
||||
password?: Text;
|
||||
ref?: Schema;
|
||||
};
|
||||
|
||||
type UserAction = 'mergeTo';
|
||||
type UserState = 'normal' | 'merged';
|
||||
|
||||
const locale: LocaleDef<Schema, '', '', {}> = {
|
||||
type Action = UserAction;
|
||||
|
||||
const UserActionDef: ActionDef<UserAction, UserState> = {
|
||||
stm: {
|
||||
mergeTo: ['normal', 'merged'],
|
||||
},
|
||||
};
|
||||
|
||||
const locale: LocaleDef<Schema, Action, '', {
|
||||
userState: UserState;
|
||||
}> = {
|
||||
zh_CN: {
|
||||
attr: {
|
||||
name: '姓名',
|
||||
nickname: '昵称',
|
||||
password: '密码',
|
||||
ref: '指向用户',
|
||||
userState: '状态',
|
||||
},
|
||||
action: {
|
||||
mergeTo: '合并',
|
||||
},
|
||||
v: {
|
||||
userState: {
|
||||
normal: '正常',
|
||||
merged: '已被合并',
|
||||
},
|
||||
}
|
||||
},
|
||||
};
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
import { String } from '../types/DataType';
|
||||
import { LocaleDef } from '../types/Locale';
|
||||
import { EntityShape } from '../types/Entity';
|
||||
|
||||
export interface Schema extends EntityShape {
|
||||
entity: String<32>;
|
||||
entityId: String<64>;
|
||||
relation: String<32>;
|
||||
};
|
||||
|
||||
const locale: LocaleDef<
|
||||
Schema,
|
||||
'',
|
||||
'',
|
||||
{}
|
||||
> = {
|
||||
zh_CN: {
|
||||
attr: {
|
||||
relation: '关系',
|
||||
entity: '关联对象',
|
||||
entityId: '关联对象id',
|
||||
},
|
||||
},
|
||||
};
|
||||
|
|
@ -10,7 +10,7 @@ import { AsyncContext } from "./AsyncRowStore";
|
|||
import { getFullProjection } from './actionDef';
|
||||
import { SyncContext } from './SyncRowStore';
|
||||
import { firstLetterUpperCase } from '../utils/string';
|
||||
import { intersection, uniq, difference } from '../utils/lodash';
|
||||
import { union, uniq, difference } from '../utils/lodash';
|
||||
import { judgeRelation } from './relation';
|
||||
|
||||
export function translateCheckerInAsyncContext<
|
||||
|
|
@ -518,8 +518,8 @@ export function createRemoveCheckers<ED extends EntityDict & BaseEntityDict, Cxt
|
|||
};
|
||||
|
||||
for (const entity in schema) {
|
||||
if (['operEntity'].includes(entity)) {
|
||||
continue; // OperEntity会指向每一个对象,不必处理
|
||||
if (['operEntity', 'modiEntity', 'userEntityGrant'].includes(entity)) {
|
||||
continue; // 系统功能性数据,不用处理
|
||||
}
|
||||
const { attributes } = schema[entity];
|
||||
for (const attr in attributes) {
|
||||
|
|
@ -538,7 +538,7 @@ export function createRemoveCheckers<ED extends EntityDict & BaseEntityDict, Cxt
|
|||
}
|
||||
|
||||
// 当删除一时,要确认多上面没有指向一的数据
|
||||
const entities = intersection(Object.keys(OneToManyMatrix), Object.keys(OneToManyOnEntityMatrix));
|
||||
const entities = union(Object.keys(OneToManyMatrix), Object.keys(OneToManyOnEntityMatrix));
|
||||
for (const entity of entities) {
|
||||
checkers.push({
|
||||
entity: entity as keyof ED,
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
import { EntityDict as BaseEntityDict } from '../base-app-domain';
|
||||
import { OpSchema as Modi, Filter } from '../base-app-domain/Modi/Schema';
|
||||
import { Checker, Operation, StorageSchema, RowChecker, EntityDict, OakRowLockedException, Context, OperateOption, Trigger, RemoveTrigger, RelationChecker, LogicalChecker, LogicalRelationChecker, OakUserUnpermittedException } from '../types';
|
||||
import { OpSchema as Modi } from '../base-app-domain/Modi/Schema';
|
||||
import { Operation, StorageSchema, RowChecker, EntityDict, OperateOption, Trigger, RemoveTrigger, REMOVE_CASCADE_PRIORITY } from '../types';
|
||||
import { appendOnlyActions } from '../actions/action';
|
||||
import { difference } from '../utils/lodash';
|
||||
import { AsyncContext } from './AsyncRowStore';
|
||||
|
|
@ -153,13 +153,25 @@ export function createModiRelatedTriggers<ED extends EntityDict & BaseEntityDict
|
|||
if (inModi) {
|
||||
// 当关联modi的对象被删除时,对应的modi也删除
|
||||
triggers.push({
|
||||
name: `当删除${entity}对象时,删除相关联还活跃的modi`,
|
||||
name: `当删除${entity}对象时,删除相关联的modi的modiEntity`,
|
||||
action: 'remove',
|
||||
entity,
|
||||
when: 'after',
|
||||
priority: REMOVE_CASCADE_PRIORITY,
|
||||
fn: async ({ operation }, context, option) => {
|
||||
const { data } = operation;
|
||||
const { id } = data;
|
||||
await context.operate('modiEntity', {
|
||||
id: await generateNewIdAsync(),
|
||||
action: 'remove',
|
||||
data: {},
|
||||
filter: {
|
||||
modi: {
|
||||
entity,
|
||||
entityId: id,
|
||||
},
|
||||
}
|
||||
}, { dontCollect: true });
|
||||
await context.operate('modi', {
|
||||
id: await generateNewIdAsync(),
|
||||
action: 'remove',
|
||||
|
|
@ -168,8 +180,8 @@ export function createModiRelatedTriggers<ED extends EntityDict & BaseEntityDict
|
|||
entity,
|
||||
entityId: id,
|
||||
}
|
||||
}, option);
|
||||
return 1;
|
||||
}, { dontCollect: true });
|
||||
return 0;
|
||||
},
|
||||
} as RemoveTrigger<ED, keyof ED, Cxt>);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@ export const TRIGGER_MIN_PRIORITY = 1;
|
|||
export const TRIGGER_MAX_PRIORITY = 99;
|
||||
export const DATA_CHECKER_DEFAULT_PRIORITY = 60;
|
||||
export const CHECKER_DEFAULT_PRIORITY = 99;
|
||||
export const REMOVE_CASCADE_PRIORITY = 70;
|
||||
|
||||
interface TriggerBase<ED extends EntityDict, T extends keyof ED> {
|
||||
checkerType?: CheckerType;
|
||||
|
|
|
|||
Loading…
Reference in New Issue