优化
This commit is contained in:
20
server/models/openapi/__tests__/app.spec.ts
Normal file
20
server/models/openapi/__tests__/app.spec.ts
Normal file
@@ -0,0 +1,20 @@
|
||||
import { filterAvailableAppCapability } from '../app';
|
||||
|
||||
describe('openapp', () => {
|
||||
describe('filterAvailableAppCapability', () => {
|
||||
test.each([
|
||||
[['bot'], ['bot']],
|
||||
[['bot', 'foo'], ['bot']],
|
||||
[
|
||||
['bot', 'webpage', 'oauth'],
|
||||
['bot', 'webpage', 'oauth'],
|
||||
],
|
||||
[
|
||||
['bot', 'webpage', 'oauth', 'a', 'b', 'c'],
|
||||
['bot', 'webpage', 'oauth'],
|
||||
],
|
||||
])('%p', (input, output) => {
|
||||
expect(filterAvailableAppCapability(input)).toEqual(output);
|
||||
});
|
||||
});
|
||||
});
|
||||
105
server/models/openapi/app.ts
Normal file
105
server/models/openapi/app.ts
Normal file
@@ -0,0 +1,105 @@
|
||||
import {
|
||||
getModelForClass,
|
||||
prop,
|
||||
DocumentType,
|
||||
index,
|
||||
ReturnModelType,
|
||||
Ref,
|
||||
} from '@typegoose/typegoose';
|
||||
import { Base, TimeStamps } from '@typegoose/typegoose/lib/defaultClasses';
|
||||
import type { Types } from 'mongoose';
|
||||
import { User } from '../user/user';
|
||||
|
||||
const openAppCapability = [
|
||||
'bot', // 机器人
|
||||
'webpage', // 网页
|
||||
'oauth', // 第三方登录
|
||||
] as const;
|
||||
|
||||
type OpenAppCapability = typeof openAppCapability[number];
|
||||
|
||||
/**
|
||||
* 确保输出类型为应用能力
|
||||
*/
|
||||
export function filterAvailableAppCapability(
|
||||
input: string[]
|
||||
): OpenAppCapability[] {
|
||||
return input.filter((item) =>
|
||||
openAppCapability.includes(item as OpenAppCapability)
|
||||
) as OpenAppCapability[];
|
||||
}
|
||||
|
||||
export interface OpenAppOAuth {
|
||||
redirectUrls: string[];
|
||||
}
|
||||
|
||||
export interface OpenAppBot {
|
||||
callbackUrl: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* 开放平台应用
|
||||
*/
|
||||
@index({ appId: 1 }, { unique: true })
|
||||
export class OpenApp extends TimeStamps implements Base {
|
||||
_id: Types.ObjectId;
|
||||
id: string;
|
||||
|
||||
@prop({
|
||||
ref: () => User,
|
||||
})
|
||||
owner: Ref<User>;
|
||||
|
||||
@prop()
|
||||
appId: string;
|
||||
|
||||
@prop()
|
||||
appSecret: string;
|
||||
|
||||
@prop()
|
||||
appName: string;
|
||||
|
||||
@prop()
|
||||
appDesc: string;
|
||||
|
||||
@prop()
|
||||
appIcon: string; // url
|
||||
|
||||
@prop({
|
||||
enum: openAppCapability,
|
||||
type: () => String,
|
||||
})
|
||||
capability: OpenAppCapability[];
|
||||
|
||||
@prop()
|
||||
oauth?: OpenAppOAuth;
|
||||
|
||||
@prop()
|
||||
bot?: OpenAppBot;
|
||||
|
||||
/**
|
||||
* 根据appId获取openapp的实例
|
||||
* 用于获得获得完整数据(包括secret)
|
||||
* 并顺便判断是否拥有该开放平台用户的修改权限
|
||||
*/
|
||||
static async findAppByIdAndOwner(
|
||||
this: ReturnModelType<typeof OpenApp>,
|
||||
appId: string,
|
||||
ownerId: string
|
||||
) {
|
||||
const res = await this.findOne({
|
||||
appId,
|
||||
owner: ownerId,
|
||||
}).exec();
|
||||
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
export type OpenAppDocument = DocumentType<OpenApp>;
|
||||
|
||||
const model = getModelForClass(OpenApp);
|
||||
|
||||
export type OpenAppModel = typeof model;
|
||||
|
||||
export default model;
|
||||
Reference in New Issue
Block a user