1 |
|
2 |
|
3 |
|
4 | module.exports = function loadPlugin (projectPath, Plugin) {
|
5 | const plugin = new Plugin(__dirname);
|
6 |
|
7 |
|
8 | plugin.tplFolder = projectPath + '/node_modules/we-plugin-view/server/templates/';
|
9 |
|
10 |
|
11 | plugin.setConfigs({
|
12 |
|
13 |
|
14 | bootstrapMode: null,
|
15 |
|
16 |
|
17 | enableQueryWhere: false,
|
18 |
|
19 | updateMethods: ['POST', 'PUT', 'PATCH'],
|
20 |
|
21 | queryDefaultLimit: 25,
|
22 | queryMaxLimit: 300,
|
23 |
|
24 |
|
25 | responseTypes: [
|
26 | 'application/json',
|
27 | 'application/vnd.api+json'
|
28 | ],
|
29 | defaultResponseType: 'application/json',
|
30 |
|
31 | sendNestedModels: true,
|
32 | port: process.env.PORT || '4000',
|
33 | hostname: process.env.APP_HOSTNAME || 'http://localhost:' + ( process.env.PORT || '4000' ),
|
34 |
|
35 | favicon: __dirname + '/files/public/core-favicon.ico',
|
36 |
|
37 | appName: process.env.APP_NAME || 'We.js app',
|
38 | appLogo: '/public/plugin/we-core/files/images/logo-small.png',
|
39 |
|
40 | robotsTXT: __dirname + '/files/robots.txt',
|
41 | log: { level: 'debug' },
|
42 |
|
43 | enableRequestLog: process.env.APP_ENABLE_REQUEST_LOG || true,
|
44 |
|
45 | session: {
|
46 | secret: 'setASecreteKeyInYourAppConfig',
|
47 | resave: false,
|
48 | saveUninitialized: true,
|
49 | name: 'wejs.sid',
|
50 | rolling: false,
|
51 | cookie: {
|
52 | path: '/',
|
53 | httpOnly: true,
|
54 | secure: false,
|
55 | maxAge: 86400000*15
|
56 | }
|
57 | },
|
58 |
|
59 | bodyParser: {
|
60 | limit: 20000000
|
61 | },
|
62 |
|
63 | apiKeys: {},
|
64 |
|
65 | i18n: {
|
66 |
|
67 | locales:[],
|
68 |
|
69 | defaultLocale: process.env.APP_DEFAULT_LOCALE || 'en-us',
|
70 |
|
71 | cookie: 'weLocale',
|
72 |
|
73 | directory: projectPath + '/config/locales',
|
74 |
|
75 | updateFiles: false,
|
76 |
|
77 | indent: '\t',
|
78 |
|
79 |
|
80 | extension: '.json',
|
81 |
|
82 |
|
83 |
|
84 | prefix: '',
|
85 |
|
86 | objectNotation: false
|
87 | },
|
88 | clientside: {
|
89 |
|
90 | log: {},
|
91 |
|
92 | publicVars: {
|
93 |
|
94 | dynamicLayout: false
|
95 | }
|
96 | },
|
97 | metadata: {},
|
98 |
|
99 | database: {
|
100 | resetAllData: false,
|
101 | prod: {
|
102 | uri: process.env.DATABASE_URL,
|
103 | dialect: process.env.DB_DIALECT,
|
104 | protocol: process.env.DB_PROTOCOL,
|
105 | database: process.env.DB_NAME,
|
106 | username: process.env.DB_USER,
|
107 | password: process.env.DB_PASSWORD,
|
108 | host: process.env.DB_HOST,
|
109 | port: process.env.DB_PORT,
|
110 |
|
111 | logging: plugin.we.log.debug
|
112 | },
|
113 | dev: {
|
114 | uri: process.env.DATABASE_URL,
|
115 | dialect: process.env.DB_DIALECT,
|
116 | protocol: process.env.DB_PROTOCOL,
|
117 | database: process.env.DB_NAME,
|
118 | username: process.env.DB_USER,
|
119 | password: process.env.DB_PASSWORD,
|
120 | host: process.env.DB_HOST,
|
121 | port: process.env.DB_PORT,
|
122 |
|
123 | logging: plugin.we.log.debug
|
124 | },
|
125 | test: {
|
126 | uri: process.env.TEST_DATABASE_URL,
|
127 | dialect: process.env.TEST_DB_DIALECT,
|
128 | protocol: process.env.TEST_DB_PROTOCOL,
|
129 | database: process.env.TEST_DB_NAME,
|
130 | username: process.env.TEST_DB_USER,
|
131 | password: process.env.TEST_DB_PASSWORD,
|
132 | port: process.env.TEST_DB_PORT,
|
133 |
|
134 | logging: plugin.we.log.debug
|
135 | }
|
136 | },
|
137 |
|
138 |
|
139 | services: {},
|
140 |
|
141 | date: { defaultFormat: process.env.APP_DATE_FORMAT || 'L HH:mm' },
|
142 |
|
143 | cache: {
|
144 |
|
145 | resourceCacheActions: 'findOne',
|
146 | skipResourceCache: false,
|
147 |
|
148 | maxage: 86400000*15
|
149 | },
|
150 | security: {
|
151 |
|
152 |
|
153 | CORS: {
|
154 |
|
155 | origin: function(origin, cb){ cb(null, false); },
|
156 |
|
157 | methods: ['GET', 'OPTIONS'],
|
158 | allowedHeaders: ['Content-Type', 'Authorization', 'Accept']
|
159 | },
|
160 | sanitizer: {
|
161 | allowedTags: [
|
162 |
|
163 | 'p',
|
164 | 'pre',
|
165 | 'code',
|
166 | 'blockquote',
|
167 | 'br',
|
168 | 'a', 'img',
|
169 | 'hr',
|
170 | 'mention',
|
171 | 'iframe',
|
172 | 'div',
|
173 |
|
174 | 'table', 'thead', 'caption', 'tbody', 'tr', 'th', 'td', 'pre',
|
175 |
|
176 | 'b', 'i', 'em', 'strong', 'u',
|
177 | 'h1', 'h2', 'h3',
|
178 | 'h4', 'h5','h6',
|
179 |
|
180 | 'ul', 'ol', 'nl', 'li',
|
181 |
|
182 | 'form',
|
183 | 'button', 'datalist', 'legend', 'label',
|
184 | 'select', 'optgroup', 'option',
|
185 | 'textarea', 'keygen', 'fieldset', 'output', 'progress', 'meter',
|
186 | 'input',
|
187 |
|
188 | 'figure', 'figcaption',
|
189 |
|
190 | 'object', 'param', 'embed', 'video', 'source',
|
191 |
|
192 | 'audio', 'track'
|
193 | ],
|
194 | selfClosing: [
|
195 | 'br',
|
196 | 'img',
|
197 | 'hr',
|
198 | 'input'
|
199 | ],
|
200 | allowedAttributes: {
|
201 | '*': [
|
202 | 'id',
|
203 | 'style',
|
204 | 'align',
|
205 | 'alt',
|
206 | 'center',
|
207 | 'bgcolor',
|
208 | 'data-*',
|
209 | 'we-*',
|
210 | 'width',
|
211 | 'height',
|
212 | 'class',
|
213 | 'type',
|
214 | 'name',
|
215 | 'autocomplete',
|
216 | 'autofocus',
|
217 | 'required',
|
218 | 'value',
|
219 | 'disabled',
|
220 | 'src',
|
221 | 'tabindex',
|
222 | 'placeholder',
|
223 | 'type',
|
224 | 'multiple',
|
225 | 'rows',
|
226 | 'cols'
|
227 | ],
|
228 | 'a': ['href', 'target', 'type'],
|
229 | 'img': ['src'],
|
230 | 'iframe': ['src', 'frameborder'],
|
231 | 'form': ['action', 'method', 'accept', 'accept-charset', 'autocomplete', 'enctype', 'target' ],
|
232 | 'input': [
|
233 | 'accept', 'checked', 'maxlength', 'size', 'minlength'
|
234 | ],
|
235 | 'video': ['controls'],
|
236 | 'audio': ['controls'],
|
237 | 'embed': ['allowscriptaccess', 'allowfullscreen'],
|
238 | 'track': ['kind', 'srclang', 'label']
|
239 | },
|
240 | allowedSchemes: [ 'http', 'https', 'ftp', 'mailto' ],
|
241 | allowProtocolRelative: true
|
242 | }
|
243 | },
|
244 | router: {
|
245 | pluralize: false
|
246 | },
|
247 | JSONApi: {
|
248 | sendSubRecordAttributes: process.env.APP_SUB_RECORD_ATTRIBUTES || false
|
249 | },
|
250 | |
251 |
|
252 |
|
253 |
|
254 |
|
255 | resourceRoutes: {
|
256 |
|
257 | createAPI(we, cfg, opts) {
|
258 |
|
259 | we.routes['post '+opts.rootRoute] = we.utils._.merge(
|
260 | {
|
261 | resourceName: opts.namePrefix+opts.name,
|
262 | action: 'create',
|
263 | controller: cfg.controller,
|
264 | model: cfg.model,
|
265 | paramIdName: opts.paramIdName,
|
266 | permission: 'create_' + opts.name,
|
267 | breadcrumbHandler: 'create'
|
268 | },
|
269 | opts.create,
|
270 | we.routes['post '+opts.rootRoute] || {}
|
271 | );
|
272 | },
|
273 | findAll(we, cfg, opts) {
|
274 | we.routes['get ' + opts.rootRoute] = we.utils._.merge(
|
275 | {
|
276 | resourceName: opts.namePrefix+opts.name,
|
277 | layoutName: opts.layoutName,
|
278 | name: opts.namePrefix + opts.name + '.find',
|
279 | action: 'find',
|
280 | controller: cfg.controller,
|
281 | model: cfg.model,
|
282 | paramIdName: opts.paramIdName,
|
283 | template: opts.templateFolderPrefix + opts.name + '/find',
|
284 | fallbackTemplate: plugin.tplFolder + 'default/find.hbs',
|
285 | permission: 'find_' + opts.name,
|
286 | titleHandler: 'i18n',
|
287 | titleI18n: opts.name + '.find',
|
288 | routeQuery: opts.routeQuery,
|
289 |
|
290 | search: {
|
291 |
|
292 | since: {
|
293 | parser: 'since',
|
294 | target: {
|
295 | type: 'field',
|
296 | field: 'createdAt'
|
297 | }
|
298 | }
|
299 | },
|
300 | breadcrumbHandler: 'find'
|
301 | },
|
302 | opts.findAll,
|
303 | we.routes['get ' + opts.rootRoute] || {}
|
304 | );
|
305 | },
|
306 | findOne(we, cfg, opts, Model) {
|
307 | we.routes['get '+opts.itemRoute] = we.utils._.merge(
|
308 | {
|
309 | layoutName: opts.layoutName,
|
310 | resourceName: opts.namePrefix+opts.name,
|
311 | name: opts.namePrefix + opts.name + '.findOne',
|
312 | action: 'findOne',
|
313 | controller: cfg.controller,
|
314 | model: cfg.model,
|
315 | paramIdName: opts.paramIdName,
|
316 | template: opts.templateFolderPrefix + opts.name + '/findOne',
|
317 | fallbackTemplate: plugin.tplFolder + 'default/findOne.hbs',
|
318 | permission: 'find_' + opts.name,
|
319 | titleHandler: opts.itemTitleHandler,
|
320 | titleField: Model.options.titleField,
|
321 | titleI18n: opts.name + '.findOne',
|
322 | breadcrumbHandler: 'findOne'
|
323 | },
|
324 | opts.findOne,
|
325 | we.routes['get '+opts.itemRoute] || {}
|
326 | );
|
327 | },
|
328 | updateAPI(we, cfg, opts) {
|
329 |
|
330 | we.routes['put '+opts.itemRoute] = we.utils._.merge(
|
331 | {
|
332 | resourceName: opts.namePrefix+opts.name,
|
333 | action: 'edit',
|
334 | controller: cfg.controller,
|
335 | model: cfg.model,
|
336 | paramIdName: opts.paramIdName,
|
337 | permission: 'update_' + opts.name
|
338 | },
|
339 | opts.edit,
|
340 | we.routes['put '+opts.itemRoute] || {}
|
341 | );
|
342 |
|
343 | we.routes['patch '+opts.itemRoute] = we.utils._.merge(
|
344 | {
|
345 | resourceName: opts.namePrefix+opts.name,
|
346 | action: 'edit',
|
347 | controller: cfg.controller,
|
348 | model: cfg.model,
|
349 | paramIdName: opts.paramIdName,
|
350 | permission: 'update_' + opts.name
|
351 | },
|
352 | opts.edit,
|
353 | we.routes['patch '+opts.itemRoute] || {}
|
354 | );
|
355 | },
|
356 | deleteAPI(we, cfg, opts) {
|
357 | we.routes['delete '+opts.itemRoute] = we.utils._.merge(
|
358 | {
|
359 | resourceName: opts.namePrefix+opts.name,
|
360 | action: 'delete',
|
361 | controller: cfg.controller,
|
362 | model: cfg.model,
|
363 | paramIdName: opts.paramIdName,
|
364 | permission: 'delete_' + opts.name
|
365 | },
|
366 | opts.delete,
|
367 | we.routes['delete '+opts.itemRoute] || {}
|
368 | );
|
369 | },
|
370 | countAPI(we, cfg, opts) {
|
371 | we.routes[`get ${opts.rootRoute}/count`] = we.utils._.merge(
|
372 | {
|
373 | resourceName: opts.namePrefix+opts.name,
|
374 | name: opts.namePrefix + opts.name + '.count',
|
375 | action: 'count',
|
376 | controller: cfg.controller,
|
377 | model: cfg.model,
|
378 | paramIdName: opts.paramIdName,
|
379 | permission: 'find_' + opts.name,
|
380 | routeQuery: opts.routeQuery,
|
381 | search: {
|
382 | since: {
|
383 | parser: 'since',
|
384 | target: {
|
385 | type: 'field',
|
386 | field: 'createdAt'
|
387 | }
|
388 | }
|
389 | }
|
390 | },
|
391 | opts.count,
|
392 | we.routes[`get ${opts.rootRoute}/count`] || {}
|
393 | );
|
394 | }
|
395 | }
|
396 | });
|
397 |
|
398 | plugin.fastLoader = function fastLoader(we, done) {
|
399 | |
400 |
|
401 |
|
402 |
|
403 |
|
404 | we.controllers.main = new we.class.Controller({
|
405 | |
406 |
|
407 |
|
408 | index(req, res) {
|
409 | res.locals.title = null;
|
410 | res.ok();
|
411 | }
|
412 | });
|
413 |
|
414 | |
415 |
|
416 |
|
417 |
|
418 |
|
419 | we.controllers.t = new we.class.Controller({});
|
420 |
|
421 | done();
|
422 | };
|
423 |
|
424 | plugin.setResource({ name: 't' });
|
425 |
|
426 | plugin.setRoutes({
|
427 | 'get /': {
|
428 | 'controller': 'main',
|
429 | 'action': 'index',
|
430 | 'template' : 'home/index',
|
431 | 'layoutName' : 'home',
|
432 | titleHandler(req, res, next) {
|
433 | res.locals.title = '';
|
434 | return next();
|
435 | }
|
436 | }
|
437 | });
|
438 |
|
439 | return plugin;
|
440 | }; |
\ | No newline at end of file |