1 | const Joi = require('@hapi/joi');
|
2 | const logger = require('../utils/logger');
|
3 |
|
4 | const createSchema = ((fn) => fn(Joi));
|
5 |
|
6 | const validate = (obj, schema) => {
|
7 | return new Promise((resolve) => {
|
8 | const result = Joi.validate(obj, schema);
|
9 |
|
10 | if (result.error) {
|
11 |
|
12 | delete result.error._object;
|
13 | logger.warn('物料数据校验不通过');
|
14 | console.log(result.error);
|
15 | }
|
16 | resolve(true);
|
17 | });
|
18 | };
|
19 |
|
20 | const authorSchema = createSchema((joi) => [joi.string().allow(''), joi.object().keys({
|
21 | name: joi.string(),
|
22 | email: joi.string().email(),
|
23 | }).unknown()]);
|
24 |
|
25 | const componentSchema = createSchema((joi) => joi.object().keys({
|
26 | name: joi.string().required(),
|
27 | title: joi.string().required(),
|
28 | description: joi.string().required(),
|
29 | homepage: joi.string().uri().required(),
|
30 | categories: joi.array(),
|
31 | category: joi.string().allow(''),
|
32 | repository: joi.string().uri(),
|
33 | source: joi.object().keys({
|
34 | type: joi.string().only(['npm']),
|
35 | npm: joi.string().required(),
|
36 | version: joi.string().required(),
|
37 | registry: joi.string().uri().required(),
|
38 | author: authorSchema,
|
39 | }),
|
40 | dependencies: joi.object().required(),
|
41 | publishTime: joi.string().isoDate().required(),
|
42 | updateTime: joi.string().isoDate().required(),
|
43 | }).unknown());
|
44 |
|
45 | const blockSchema = createSchema((joi) => joi.object().keys({
|
46 | name: joi.string().required(),
|
47 | title: joi.string().required(),
|
48 | description: joi.string().required(),
|
49 | homepage: joi.string().uri().required(),
|
50 | categories: joi.array(),
|
51 | category: joi.string().allow(''),
|
52 | repository: joi.string().uri().required(),
|
53 | source: joi.object().keys({
|
54 | type: joi.string().only(['npm']),
|
55 | npm: joi.string().required(),
|
56 | version: joi.string().required(),
|
57 | registry: joi.string().uri().required(),
|
58 | sourceCodeDirectory: joi.string().uri({ relativeOnly: true }).required(),
|
59 | author: authorSchema,
|
60 | }),
|
61 | screenshot: joi.string().uri().required(),
|
62 | screenshots: joi.array().items(joi.string().uri()),
|
63 | dependencies: joi.object().required(),
|
64 | publishTime: joi.string().isoDate().required(),
|
65 | updateTime: joi.string().isoDate().required(),
|
66 | }).unknown());
|
67 |
|
68 | const scaffoldSchema = createSchema((joi) => joi.object().keys({
|
69 | name: joi.string().required(),
|
70 | title: joi.string().required(),
|
71 | description: joi.string().required(),
|
72 | homepage: joi.string().uri().required(),
|
73 | category: joi.string().allow(''),
|
74 | repository: joi.string().uri().required(),
|
75 | source: joi.object().keys({
|
76 | type: joi.string().only(['npm']),
|
77 | npm: joi.string().required(),
|
78 | version: joi.string().required(),
|
79 | registry: joi.string().uri().required(),
|
80 | author: authorSchema,
|
81 | }),
|
82 | screenshot: joi.string().uri().required(),
|
83 | screenshots: joi.array().items(joi.string().uri()),
|
84 | dependencies: joi.object().required(),
|
85 | publishTime: joi.string().isoDate().required(),
|
86 | updateTime: joi.string().isoDate().required(),
|
87 | }).unknown());
|
88 |
|
89 | const materialSchema = createSchema((joi) => joi.object().keys({
|
90 | type: joi.string().required(),
|
91 | name: joi.string().required(),
|
92 | description: joi.string(),
|
93 | logo: joi.string().uri(),
|
94 | homepage: joi.string().uri(),
|
95 | author: authorSchema,
|
96 | components: joi.array().items(componentSchema).required(),
|
97 | blocks: joi.array().items(blockSchema).required(),
|
98 | scaffolds: joi.array().items(scaffoldSchema).required(),
|
99 | }).unknown());
|
100 |
|
101 | const validateMaterial = (obj) => validate(obj, materialSchema);
|
102 | const validateComponent = (obj) => validate(obj, componentSchema);
|
103 | const validateBlock = (obj) => validate(obj, blockSchema);
|
104 | const validateScaffold = (obj) => validate(obj, scaffoldSchema);
|
105 |
|
106 | module.exports = {
|
107 | validateMaterial,
|
108 | validateComponent,
|
109 | validateBlock,
|
110 | validateScaffold,
|
111 | };
|