wowok_agent
Version:
Agent for WoWok: Unlock Co-Creation, Lighting Transaction, Empower Potential.
169 lines (158 loc) • 7.68 kB
text/typescript
import { LocalMark } from "../local/local.js";
import { AccountOrMark_Address, CallBase, CallResult, GetAccountOrMark_Address, GetManyAccountOrMark_Address,
GetObjectExisted, GetObjectMain, ObjectPermissionMain} from "./base.js";
import { PassportObject, Permission, BizPermission,
PermissionIndexType, TransactionBlock, Permission_Entity as Wowok_Permission_Entity, ERROR, Errors,
Permission_Index as Wowok_Permission_Index, Permission_Index_Entity as Wowok_Permission_Index_Entity,
} from 'wowok';
export interface Entity_Permission {
index: PermissionIndexType;
guard?: string;
}
export interface Permission_Entity {
address: AccountOrMark_Address;
permissions:Entity_Permission[];
}
export interface Permission_Index_Entity {
address: AccountOrMark_Address;
guard?: string;
}
export interface Permission_Index {
index: PermissionIndexType;
entities: Permission_Index_Entity[];
}
/// The execution priority is determined by the order in which the object attributes are arranged
export interface CallPermission_Data {
object?: ObjectPermissionMain;
description?: string;
biz_permission?: {op:'add'; data: BizPermission[]} | {op:'remove'; permissions: PermissionIndexType[]};
permission?: {op:'add entity'; entities:Permission_Entity[]} | {op:'add permission'; permissions:Permission_Index[]}
| {op:'remove entity'; addresses:AccountOrMark_Address[]} | {op:'remove permission'; address:AccountOrMark_Address; index:PermissionIndexType[]}
| {op:'transfer permission', from: AccountOrMark_Address, to: AccountOrMark_Address};
admin?: {op:'add' | 'remove' | 'set', addresses:AccountOrMark_Address[]} | {op:'removeall'};
builder?: AccountOrMark_Address;
}
export class CallPermission extends CallBase {
data: CallPermission_Data;
object_address: string | undefined = undefined;
constructor(data:CallPermission_Data) {
super();
this.data = data;
}
protected async prepare(): Promise<void> {
if (!this.object_address) {
this.object_address = await LocalMark.Instance().get_address(GetObjectExisted(this.data?.object));
}
}
async call(account?:string) : Promise<CallResult> {
var checkOwner = false; var checkAdmin = false;
await this.prepare();
if (this.object_address) {
if (this.data?.builder != null || this.data?.admin != null) {
checkOwner = true;
}
if (this.data?.permission != null || this.data?.biz_permission != null) {
checkAdmin = true;
}
if (this.data?.description != null) {
checkAdmin = true;
}
return await this.check_permission_and_call(this.object_address, [], [], checkOwner, checkAdmin, account)
}
return await this.exec(account)
}
protected async operate (txb:TransactionBlock, passport?:PassportObject, account?:string) {
let obj : Permission | undefined ;
if (!this.object_address) {
obj = Permission.New(txb, this.data?.description??'');
} else {
obj = Permission.From(txb, this.object_address)
}
if (!obj) ERROR(Errors.InvalidParam, 'CallPermission_Data.data.object');
if (this.data?.description != null && this.object_address) {
obj?.set_description(this.data.description)
}
if (this.data?.biz_permission != null) { // High priority operate
switch(this.data.biz_permission.op) {
case 'add':
this.data.biz_permission.data.forEach(v => {
obj?.add_bizPermission(v.index, v.name);
})
break;
case 'remove':
this.data.biz_permission.permissions.forEach(v => {
obj?.remove_bizPermission(v);
})
break;
}
}
if (this.data?.permission != null) {
switch (this.data.permission.op) {
case 'add entity':
var add_entity:Wowok_Permission_Entity[] = [];
for (let i = 0; i < this.data.permission.entities.length; ++i) {
const v = this.data.permission.entities[i];
const addr = await GetAccountOrMark_Address(v.address);
if (addr) {
add_entity.push({address:addr, permissions:v.permissions});
}
}
obj?.add_entity(add_entity);
break;
case 'add permission':
var add_permission: Wowok_Permission_Index[] = [];
for (let i = 0; i < this.data.permission.permissions.length; ++i) {
const v = this.data.permission.permissions[i];
const e:Wowok_Permission_Index_Entity[] = [];
for (let j = 0; j < v.entities.length; ++j) {
const addr = await GetAccountOrMark_Address(v.entities[j].address);
const guard = await LocalMark.Instance().get_address(v.entities[j].guard as string) ;
if (addr) {
e.push({address:addr, guard:guard})
}
}
add_permission.push({index:v.index, entities:e});
}
obj?.add_entity3(add_permission);
break;
case 'remove entity':
const entities:string[] = (await GetManyAccountOrMark_Address(this.data.permission.addresses)).filter((v): v is string => v!== undefined);
obj?.remove_entity(entities);
break;
case 'remove permission':
const addr = await GetAccountOrMark_Address(this.data.permission.address);
if (addr) obj?.remove_index(addr, this.data.permission.index);
break;
case 'transfer permission':
const from = await GetAccountOrMark_Address(this.data.permission.from);
const to = await GetAccountOrMark_Address(this.data.permission.to);
if (from && to) obj?.transfer_permission(from, to);
break;
}
}
if (this.data?.admin != null) {
switch(this.data.admin?.op) {
case 'add':
case 'set':
if (this.data.admin?.op === 'set') obj?.remove_admin([], true);
const add = await GetManyAccountOrMark_Address(this.data.admin.addresses);
obj?.add_admin(add.filter((v): v is string => v!== undefined));
break;
case 'remove':
const remove = await GetManyAccountOrMark_Address(this.data.admin.addresses);
obj?.remove_admin(remove.filter((v): v is string => typeof(v) === 'string'));
break;
case 'removeall':
obj?.remove_admin([], true);
break;
}
}
if (this.data?.builder != null ) {
const b = await GetAccountOrMark_Address(this.data.builder);
if (b) obj?.change_owner(b);
}
if (!this.object_address) {
await this.new_with_mark('Permission', txb, obj.launch(), GetObjectMain(this.data?.object), account);
}
}
}