1 |
|
2 | export function get_root_path_prefix() {
|
3 | return path.join(__dirname, '../../../../')
|
4 | }
|
5 |
|
6 |
|
7 | require('../error')
|
8 | const path = require('path')
|
9 | require(path.join(get_root_path_prefix(), './app/error'))
|
10 |
|
11 | import {get_suffix_ts_or_js} from './base'
|
12 | import {__framework_session_init__} from './session'
|
13 |
|
14 | require(path.join(get_root_path_prefix(), './app/global.out') + '.' + get_suffix_ts_or_js())
|
15 |
|
16 |
|
17 | require(path.join(get_root_path_prefix(), './app/plugins/container'))
|
18 |
|
19 | const fs = require('fs')
|
20 | const view = require('nunjucks')
|
21 | const _ = require('lodash')
|
22 | const typeis = require('type-is')
|
23 | const querystring = require('querystring')
|
24 |
|
25 | function get_app_entries_path_prefix() {
|
26 | return path.join(get_root_path_prefix(), './app/entries')
|
27 | }
|
28 |
|
29 |
|
30 |
|
31 | export function parse_post_param(headers, body) {
|
32 | try {
|
33 | if (!body) {
|
34 | return {}
|
35 | }
|
36 | if (typeis({headers}, ['json'])) {
|
37 | return JSON.parse(body.toString(headers['content-encoding'] || 'utf8'))
|
38 | } else if (typeof headers['Content-Type'] == 'string' && headers['Content-Type'].match(/application\/json/)) {
|
39 |
|
40 | return JSON.parse(body.toString(headers['content-encoding'] || 'utf8'))
|
41 | }
|
42 | else if (typeis({headers}, ['urlencoded'])) {
|
43 | return querystring.parse(body.toString(headers['content-encoding'] || 'utf8'))
|
44 | } else if (typeof headers['Content-Type'] == 'string' && headers['Content-Type'] == 'application/x-www-form-urlencoded') {
|
45 |
|
46 |
|
47 | return querystring.parse(body.toString(headers['content-encoding'] ||
|
48 | headers['Content-Encoding'] || 'utf8'))
|
49 | }
|
50 | else {
|
51 | xthrow(ERR$PARAM, {headers, body})
|
52 | }
|
53 | } catch (err) {
|
54 | xthrow(err, {headers, body})
|
55 | }
|
56 | }
|
57 |
|
58 |
|
59 | async function filter_request_begin(api_path: string, param: any) {
|
60 | const entry = require(api_path).default
|
61 | xassert(entry)
|
62 | const obj = new entry()
|
63 | if (obj._) {
|
64 |
|
65 | xassert(_.isFunction(obj._))
|
66 | await obj._(param)
|
67 | }
|
68 |
|
69 | let api_callback = obj.$$
|
70 | if ('__mock__' in param) {
|
71 | api_callback = obj.$ ? obj.$ : undefined
|
72 | } else {
|
73 |
|
74 | if (obj.context) {
|
75 | xassert(_.isFunction(obj.context))
|
76 | const context = obj.context()
|
77 | xassert(_.isPlainObject(context.param) && _.isFunction(context.auth))
|
78 | await context.auth()
|
79 | }
|
80 | }
|
81 | return api_callback
|
82 | }
|
83 |
|
84 |
|
85 | async function web_request_process(api: string, param: any) {
|
86 | let prefix = get_app_entries_path_prefix()
|
87 | let api_path = `${prefix}/web/${api}`
|
88 | let out: any = undefined
|
89 | let is_html_request: boolean =
|
90 | fs.existsSync(path.resolve(__dirname, `${prefix}/web/${api}.html`))
|
91 |
|
92 | try {
|
93 | let api_callback = await filter_request_begin(api_path, param)
|
94 | xassert(_.isFunction(api_callback))
|
95 | out = await api_callback(param)
|
96 | if (is_html_request) {
|
97 |
|
98 | if (global['__redirect_url__'] !== undefined) {
|
99 | return
|
100 | }
|
101 |
|
102 | view.configure(path.resolve(__dirname, `${prefix}/web`), {noCache: true, autoescape: false})
|
103 | out = view.render(`./${api}.html`, out)
|
104 | return out
|
105 | } else {
|
106 |
|
107 | return {
|
108 | success: true,
|
109 | content: out,
|
110 | errorLevel: undefined,
|
111 | errorCode: undefined,
|
112 | errorMsg: undefined,
|
113 | }
|
114 | }
|
115 | } catch (err) {
|
116 |
|
117 | await xwarn(err, api, param)
|
118 |
|
119 | if (is_html_request) {
|
120 |
|
121 | xassert(fs.existsSync(path.resolve(__dirname, `${prefix}/web/error.` + get_suffix_ts_or_js())) &&
|
122 | fs.existsSync(path.resolve(__dirname, `${prefix}/web/error.html`)))
|
123 | let api_callback = require(`${prefix}/web/error.` + get_suffix_ts_or_js()).default
|
124 | xassert(_.isFunction(api_callback))
|
125 | out = await api_callback(err)
|
126 | view.configure(path.resolve(__dirname, `${prefix}/web`), {noCache: true, autoescape: false})
|
127 | out = view.render(`./error.html`, out)
|
128 | return out
|
129 | } else {
|
130 | let data = xerror(err)
|
131 | return {
|
132 | success: false,
|
133 | content: data.param,
|
134 | errorLevel: 'error',
|
135 | errorCode: data.code,
|
136 | errorMsg: data.msg,
|
137 | }
|
138 | }
|
139 | }
|
140 | }
|
141 |
|
142 |
|
143 | async function rest_request_process(api: string, param: any) {
|
144 | try {
|
145 | let prefix = get_app_entries_path_prefix()
|
146 | let api_path = `${prefix}/rest/${api}`
|
147 | let api_callback = await filter_request_begin(api_path, param)
|
148 | xassert(_.isFunction(api_callback))
|
149 | let out = await api_callback(param)
|
150 | return {
|
151 | success: true,
|
152 | content: out,
|
153 | errorLevel: undefined,
|
154 | errorCode: undefined,
|
155 | errorMsg: undefined,
|
156 | }
|
157 | } catch (err) {
|
158 | await xwarn(err, api, param)
|
159 | let data = xerror(err)
|
160 | return {
|
161 | success: false,
|
162 | content: data.param,
|
163 | errorLevel: 'error',
|
164 | errorCode: data.code,
|
165 | errorMsg: data.msg,
|
166 | }
|
167 | }
|
168 |
|
169 | }
|
170 |
|
171 |
|
172 |
|
173 |
|
174 | export async function request_process(api: string, param: any) {
|
175 | await __framework_session_init__()
|
176 |
|
177 | if (/^\/web\//.test(api)) {
|
178 | return await web_request_process(api.replace(/^\/web\//, ''), param)
|
179 | } else if (/^\/rest\//.test(api)) {
|
180 | let out = await rest_request_process(api.replace(/^\/rest\//, ''), param)
|
181 | global['__redirect_url__'] = undefined
|
182 | return out
|
183 | } else {
|
184 |
|
185 | xthrow(ERR$PARAM, [api, param])
|
186 | }
|
187 | }
|
188 |
|
189 |
|
190 |
|
191 |
|
192 |
|
193 |
|
194 |
|
195 |
|
196 |
|
197 |
|
198 |
|
199 |
|
200 |
|
\ | No newline at end of file |