From 9d3ec04815e2b506682f99a8b1a42671714af250 Mon Sep 17 00:00:00 2001 From: GEEKiDoS Date: Thu, 7 Mar 2024 14:53:05 +0800 Subject: [PATCH] rename functions to services due to layout change --- src/functions/default.ts | 18 ------- src/functions/message/get.ts | 14 ------ src/main.ts | 48 +++++++++++++------ src/services/default.ts | 16 +++++++ .../get.ts => services/facility/index.ts} | 5 +- src/services/message/index.ts | 16 +++++++ .../list.ts => services/package/index.ts} | 4 +- .../put.ts => services/pcbevent/index.ts} | 4 +- .../alive.ts => services/pcbtracker/index.ts} | 3 +- .../get.ts => services/services/index.ts} | 5 +- src/types.ts | 9 ++-- 11 files changed, 80 insertions(+), 62 deletions(-) delete mode 100644 src/functions/default.ts delete mode 100644 src/functions/message/get.ts create mode 100644 src/services/default.ts rename src/{functions/facility/get.ts => services/facility/index.ts} (91%) create mode 100644 src/services/message/index.ts rename src/{functions/package/list.ts => services/package/index.ts} (57%) rename src/{functions/pcbevent/put.ts => services/pcbevent/index.ts} (58%) rename src/{functions/pcbtracker/alive.ts => services/pcbtracker/index.ts} (77%) rename src/{functions/services/get.ts => services/services/index.ts} (88%) diff --git a/src/functions/default.ts b/src/functions/default.ts deleted file mode 100644 index 7f7d7e0..0000000 --- a/src/functions/default.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { singleton } from 'tsyringe'; -import { Context, ILaochanService } from '../types.js'; -import { kxml } from '../decorators/to-kxml.js'; - -@singleton() -export class DefaultService implements ILaochanService { - @kxml() - async process(ctx: Context) { - const [module, method] = ctx.service.split('.'); - - return { - [module]: { - $method: method, - status: '0', - } - } - } -} diff --git a/src/functions/message/get.ts b/src/functions/message/get.ts deleted file mode 100644 index 682601d..0000000 --- a/src/functions/message/get.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { kxmlTemplate } from '../../decorators/render-kxml.js'; -import { ILaochanService } from '../../types.js'; -import { singleton } from 'tsyringe'; - -@singleton() -export default class implements ILaochanService { - @kxmlTemplate('message/get') - async process(): Promise { - return { - status: 0, - expire: 60, - }; - } -} diff --git a/src/main.ts b/src/main.ts index fa75ecc..5aee030 100644 --- a/src/main.ts +++ b/src/main.ts @@ -3,13 +3,14 @@ import 'reflect-metadata'; import Koa, { DefaultState } from 'koa'; import { InjectionToken, Provider, container } from 'tsyringe'; -import { ILaochanContext, ILaochanService } from './types.js'; -import { DefaultService } from './functions/default.js'; +import { ILaochanContext } from './types.js'; +import { DefaultService } from './services/default.js'; import { Logger } from '@cordisjs/logger'; import { crypto } from './middlewares/crypto.js'; import { binaryBody } from './middlewares/binarybody.js'; import { parseKxml } from './middlewares/parseKxml.js'; import { decompress } from './middlewares/decompress.js'; +import config from './utils/config.js'; function tryResolve(token: InjectionToken): T | undefined { if (!container.isRegistered(token)) return undefined; @@ -57,24 +58,39 @@ async function main(): Promise { throw new Error('invaild model'); } + let [serviceName, method] = ctx.query.f.split('.'); + ctx.model = ctx.query.model; - ctx.service = ctx.query.f; + ctx.service = { + name: serviceName, + method, + }; + ctx.logger = ctx.service - ? register(`logger:${ctx.service}`, { - useValue: new Logger(ctx.service), + ? register(`logger:${ctx.service.name}`, { + useValue: new Logger(ctx.service.name), }) : logger; - let service: ILaochanService | undefined = ctx.service - ? tryResolve(ctx.service) + let service: object | undefined = ctx.service + ? tryResolve(ctx.service.name) : container.resolve(DefaultService); if (service === undefined) { try { - const module = await import( - `./functions/${ctx.service.replace('.', '/')}.js` - ); - service = register(ctx.service, { + let module: any = null; + + try { + module = await import( + `./services/${ctx.service.name}/index.js` + ); + } catch { + module = await import( + `./services/${ctx.service.name}.js` + ); + } + + service = register(ctx.service.name, { useClass: module.default, }); } catch (e) { @@ -85,9 +101,11 @@ async function main(): Promise { } } - if (service === undefined) { - logger.warn(`unimplemented service ${ctx.service}`); + if (service === undefined || !(method in service)) { + logger.warn(`unimplemented method ${ctx.service.method} in ${ctx.service.name}`); + service = container.resolve(DefaultService); + method = 'default'; } logger.info( @@ -97,14 +115,14 @@ async function main(): Promise { JSON.stringify(ctx.request.body), ); - ctx.body = await service.process(ctx); + ctx.body = await service[method](ctx); ctx.status = 200; logger.info('%s [server]: status = %d', ctx.service, ctx.status); return await next(); }); - app.listen(10573); + app.listen(config.port); } main(); diff --git a/src/services/default.ts b/src/services/default.ts new file mode 100644 index 0000000..d816238 --- /dev/null +++ b/src/services/default.ts @@ -0,0 +1,16 @@ +import { singleton } from 'tsyringe'; +import { Context } from '../types.js'; +import { kxml } from '../decorators/to-kxml.js'; + +@singleton() +export class DefaultService { + @kxml() + async default(ctx: Context) { + return { + [ctx.service.name]: { + $method: ctx.service.method, + status: '0', + } + } + } +} diff --git a/src/functions/facility/get.ts b/src/services/facility/index.ts similarity index 91% rename from src/functions/facility/get.ts rename to src/services/facility/index.ts index a22bd36..8fbfe9a 100644 --- a/src/functions/facility/get.ts +++ b/src/services/facility/index.ts @@ -1,11 +1,10 @@ import { kxmlTemplate } from '../../decorators/render-kxml.js'; -import { ILaochanService } from '../../types.js'; import { singleton } from 'tsyringe'; @singleton() -export default class implements ILaochanService { +export default class { @kxmlTemplate('facility/get') - async process(): Promise { + async get(): Promise { return { status: 0, location: { diff --git a/src/services/message/index.ts b/src/services/message/index.ts new file mode 100644 index 0000000..59b7ff5 --- /dev/null +++ b/src/services/message/index.ts @@ -0,0 +1,16 @@ +import { kxml } from '../../decorators/to-kxml.js'; +import { singleton } from 'tsyringe'; + +@singleton() +export default class { + @kxml() + async get(): Promise { + return { + message: { + $status: 0, + $expire: 60, + $method: 'get', + } + }; + } +} diff --git a/src/functions/package/list.ts b/src/services/package/index.ts similarity index 57% rename from src/functions/package/list.ts rename to src/services/package/index.ts index fbe365b..736e8ef 100644 --- a/src/functions/package/list.ts +++ b/src/services/package/index.ts @@ -2,4 +2,6 @@ import { singleton } from 'tsyringe'; import { DefaultService } from '../default.js'; @singleton() -export default class extends DefaultService {} +export default class extends DefaultService { + list = this.default; +} diff --git a/src/functions/pcbevent/put.ts b/src/services/pcbevent/index.ts similarity index 58% rename from src/functions/pcbevent/put.ts rename to src/services/pcbevent/index.ts index fbe365b..2cbcfb3 100644 --- a/src/functions/pcbevent/put.ts +++ b/src/services/pcbevent/index.ts @@ -2,4 +2,6 @@ import { singleton } from 'tsyringe'; import { DefaultService } from '../default.js'; @singleton() -export default class extends DefaultService {} +export default class extends DefaultService { + put = this.default; +} diff --git a/src/functions/pcbtracker/alive.ts b/src/services/pcbtracker/index.ts similarity index 77% rename from src/functions/pcbtracker/alive.ts rename to src/services/pcbtracker/index.ts index 75c74f6..e5e13df 100644 --- a/src/functions/pcbtracker/alive.ts +++ b/src/services/pcbtracker/index.ts @@ -1,9 +1,8 @@ import { kxml } from '../../decorators/to-kxml.js'; -import { ILaochanService } from '../../types.js'; import { singleton } from 'tsyringe'; @singleton() -export default class implements ILaochanService { +export default class { @kxml() async process(): Promise { return { diff --git a/src/functions/services/get.ts b/src/services/services/index.ts similarity index 88% rename from src/functions/services/get.ts rename to src/services/services/index.ts index 9a8d46e..2278005 100644 --- a/src/functions/services/get.ts +++ b/src/services/services/index.ts @@ -1,12 +1,11 @@ -import { ILaochanService } from '../../types.js'; import { singleton } from 'tsyringe'; import config from '../../utils/config.js'; import { kxml } from '../../decorators/to-kxml.js'; @singleton() -export default class implements ILaochanService { +export default class { @kxml() - async process() { + async get() { const selfServices = [ 'services', 'dlstatus', 'cardmng', 'eacoin', 'userdata', 'userid', 'pcbtracker', 'pcbevent', diff --git a/src/types.ts b/src/types.ts index 9acf3a2..0795332 100644 --- a/src/types.ts +++ b/src/types.ts @@ -3,7 +3,10 @@ import { DefaultState, ParameterizedContext } from 'koa'; export interface ILaochanContext { model?: string; - service?: string; + service?: { + name: string, + method: string, + }; pcbid?: string; logger: Logger; @@ -13,7 +16,3 @@ export interface ILaochanContext { } export type Context = ParameterizedContext; - -export interface ILaochanService { - process(ctx: Context): Promise; -}