Skip to content

Commit b8e200f

Browse files
committed
parse 示例脚手架,初始提交
0 parents  commit b8e200f

19 files changed

+1524
-0
lines changed

.eslintrc.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
module.exports = {
2+
parser: '@typescript-eslint/parser',
3+
parserOptions: {
4+
project: 'tsconfig.json',
5+
sourceType: 'module',
6+
},
7+
plugins: ['@typescript-eslint/eslint-plugin'],
8+
extends: [
9+
'plugin:@typescript-eslint/eslint-recommended',
10+
'plugin:@typescript-eslint/recommended',
11+
'prettier',
12+
'prettier/@typescript-eslint',
13+
],
14+
root: true,
15+
env: {
16+
node: true,
17+
jest: true,
18+
},
19+
rules: {
20+
'@typescript-eslint/interface-name-prefix': 'off',
21+
'@typescript-eslint/explicit-function-return-type': 'off',
22+
'@typescript-eslint/no-explicit-any': 'off',
23+
},
24+
};

.gitignore

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# compiled output
2+
/dist
3+
/node_modules
4+
yarn.lock
5+
package-lock.json
6+
cloud/algorithm/__pycache__
7+
8+
# Logs
9+
logs
10+
*.log
11+
npm-debug.log*
12+
yarn-debug.log*
13+
yarn-error.log*
14+
lerna-debug.log*
15+
16+
# OS
17+
.DS_Store
18+
19+
# Tests
20+
/coverage
21+
/.nyc_output
22+
23+
# IDEs and editors
24+
/.idea
25+
.project
26+
.classpath
27+
.c9/
28+
*.launch
29+
.settings/
30+
*.sublime-workspace
31+
32+
# IDE - VSCode
33+
.vscode/*
34+
!.vscode/settings.json
35+
!.vscode/tasks.json
36+
!.vscode/launch.json
37+
!.vscode/extensions.json
38+
39+
# others
40+
*.apk
41+
.vscode/settings.json

.prettierrc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"singleQuote": true,
3+
"trailingComma": "all"
4+
}

Dockerfile

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
FROM node:latest
2+
3+
RUN mkdir parse
4+
5+
ADD . /parse
6+
WORKDIR /parse
7+
RUN npm install
8+
9+
ENV APP_ID setYourAppId
10+
ENV MASTER_KEY setYourMasterKey
11+
ENV DATABASE_URI setMongoDBURI
12+
13+
# Optional (default : 'parse/cloud/main.js')
14+
# ENV CLOUD_CODE_MAIN cloudCodePath
15+
16+
# Optional (default : '/parse')
17+
# ENV PARSE_MOUNT mountPath
18+
19+
EXPOSE 1337
20+
21+
# Uncomment if you want to access cloud code outside of your container
22+
# A main.js file must be present, if not Parse will not start
23+
24+
# VOLUME /parse/cloud
25+
26+
CMD [ "npm", "start" ]

README.md

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# parse-scaffold
2+
3+
parse 示例脚手架,集成parse-server、parse-dashboard、parse-swagger
4+
5+
### Installation
6+
```
7+
npm i parse-scaffold
8+
npm install
9+
npm start
10+
```
11+
启动后,访问:https://${parse_host}:${parse_port}/,显示:
12+
```
13+
欢迎访问parse-scaffold(parse后台脚手架)!
14+
```
15+
即表示启动成功。
16+
17+
### Config
18+
19+
> 1. 配置前请确保您的app服务器有域名,且支持https访问(本项目中parse-dashboard配置为仅支持https);
20+
> 2. 根据服务器https的配置,配置index.js中的httpsOption;
21+
> 3. 根据服务器域名和数据库ip,配置index.js中的RELEASE_HOST和DEV_HOST;
22+
23+
1. app.json: 配置您的app、graphQL、数据库地址、云函数位置等;
24+
2. cloud/yourApp: 此目录为您的特定app的云函数所在文件夹(与app.json的applications.cloud.value字段配置对应);
25+
3. cloud/yourApp/triggerConfig.js: 配置您的trigger关联关系;
26+
4. cloud/common.js: trigger的实现部分,本项目暂只实现了afterSave trigger,欢迎大家补充;
27+
5. 自动生成swagger文档(发布版本建议删去swagger配置),地址为:https://${parse_host}:${parse_port}/swagger-${appId} (eg.https://api.yourApp.com:1337/swagger-yourApp);
28+
6. parse服务地址:https://${parse_host}:${parse_port}/${appId} (eg.https://api.yourApp.com:1337/yourApp);
29+
- > 因安全原因,一般显示为则表示服务已启动:
30+
```
31+
{"error":"unauthorized"}
32+
```
33+
34+
7. dashboard地址:https://${parse_host}:${dashboard_port}/dashboard (eg.https://api.yourApp.com:4040/dashboard/);
35+
36+
### TODO
37+
1. 除afterSave外,其他trigger函数均未实现;
38+
2. 缓存机制未设置;

app.json

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
{
2+
"name": "parse-scaffold",
3+
"description": "利用parse-dashboard和parse-server搭建的parse后台脚手架",
4+
"repository": "https://github.com/xiangdong9013/parse-scaffold",
5+
"parse_host": {
6+
"description": "parse-server服务所在的地址(域名表示)",
7+
"value": "testapi.yourCompany.com"
8+
},
9+
"parse_port": 1337,
10+
"dashboard_port": 4040,
11+
"applications": [{
12+
"appId": {
13+
"description": "必填,app唯一标识",
14+
"value": "yourApp"
15+
},
16+
"appName": {
17+
"description": "必填,app描述",
18+
"value": "yourAppName"
19+
},
20+
"masterKey": {
21+
"description": "必填,超级权限key,不可泄露",
22+
"value": "yourAppMasterKey"
23+
},
24+
"graphQLServerURL": {
25+
"description": "选填,graphQL配置,类似'/graphql_app'",
26+
"value": "/graphql_app"
27+
},
28+
"dbConfig": {
29+
"description": "以下所有除liveQuery外、都必填,该应用所对应的MongoDB数据库名称、用户名、密码",
30+
"dbName":"db_name",
31+
"user":"db_user",
32+
"pass":"db_pass",
33+
"liveQuery": {
34+
"classNames": [
35+
"Posts", "Comments"
36+
]
37+
}
38+
},
39+
"cloud": {
40+
"description": "cloud code所在路径(相对本项目根目录的路径,路径前不要加'/')",
41+
"value": "cloud/yourApp/main.js"
42+
}
43+
}
44+
],
45+
"dashboardUsers": [{
46+
"user": "user",
47+
"pass": "user_pass"
48+
}]
49+
}

cloud/common.js

Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
/**
2+
* parse后台脚手架
3+
* www.yourCompany.com
4+
*/
5+
6+
function defineCloudFunction(func) {
7+
Parse.Cloud.define(func.name, func);
8+
}
9+
10+
//给定一个对象,将其每个属性的value设置为其key的名字
11+
const assignObjValueWithKey = obj => {
12+
Object.keys(obj).forEach(key => {
13+
obj[key] = key;
14+
});
15+
};
16+
17+
if (typeof Trigger == 'undefined') {
18+
var Trigger = {
19+
beforeSave: '',
20+
afterSave: '',
21+
22+
beforeDelete: '',
23+
afterDelete: '',
24+
25+
beforeSaveFile: '',
26+
afterSaveFile: '',
27+
28+
beforeDeleteFile: '',
29+
afterDeleteFile: '',
30+
31+
beforeFind: '',
32+
afterFind: '',
33+
34+
beforeLogin: '',
35+
afterLogout: '',
36+
};
37+
assignObjValueWithKey(Trigger);
38+
}
39+
40+
const triggerCallback = triggerConfig => {
41+
const {
42+
triggerClassName,
43+
triggerRelations
44+
} = triggerConfig;
45+
if (triggerRelations !== undefined) {
46+
return request => {
47+
const {
48+
triggerName,
49+
object,
50+
original
51+
} = request;
52+
triggerRelations.forEach(triggerRelation => {
53+
const {
54+
triggerClassFieldName,
55+
relatedClassName,
56+
relatedClassFieldName
57+
} = triggerRelation;
58+
59+
const triggerField = object.get(triggerClassFieldName);
60+
const originalTriggerField = original.get(triggerClassFieldName);
61+
// 仅当触发条件字段为有效信息,且与该字段原来的id值不相同时才触发
62+
if (triggerField === undefined || triggerField === null) {
63+
return;
64+
} else if (originalTriggerField === undefined ||
65+
originalTriggerField === null ||
66+
triggerField.id !== originalTriggerField.id) {
67+
switch (triggerName) {
68+
case Trigger.afterSave:
69+
const query = new Parse.Query(relatedClassName);
70+
query
71+
.get(triggerField.id)
72+
.then(relatedObj => {
73+
var relation = relatedObj.relation(relatedClassFieldName);
74+
75+
relation.add(object);
76+
console.log(new Date().toLocaleString() +
77+
`: ${triggerName} triggered: ${triggerClassName}[${object.id}] => ${relatedClassName}[${relatedObj.id}].${relatedClassFieldName}[${object.id}]`);
78+
return relatedObj.save();
79+
})
80+
.catch(error => {
81+
console.error(`${error.code}: ${error.message}`);
82+
return error;
83+
});
84+
break;
85+
//TODO:
86+
case Trigger.afterDelete:
87+
break;
88+
default:
89+
break;
90+
}
91+
};
92+
});
93+
};
94+
}
95+
};
96+
97+
function defineTrigger(triggerName, triggerConfig) {
98+
let {
99+
triggerClassName
100+
} = triggerConfig;
101+
102+
switch (triggerName) {
103+
case Trigger.beforeSave:
104+
Parse.Cloud.beforeSave(triggerClassName, triggerCallback(triggerConfig));
105+
break;
106+
case Trigger.afterSave:
107+
Parse.Cloud.afterSave(triggerClassName, triggerCallback(triggerConfig));
108+
break;
109+
110+
case Trigger.beforeDelete:
111+
Parse.Cloud.beforeDelete(triggerClassName, triggerCallback(triggerConfig));
112+
break;
113+
case Trigger.afterDelete:
114+
Parse.Cloud.afterDelete(triggerClassName, triggerCallback(triggerConfig));
115+
break;
116+
117+
case Trigger.beforeSaveFile:
118+
Parse.Cloud.beforeSaveFile(triggerClassName, triggerCallback(triggerConfig));
119+
break;
120+
case Trigger.afterSaveFile:
121+
Parse.Cloud.afterSaveFile(triggerClassName, triggerCallback(triggerConfig));
122+
break;
123+
124+
case Trigger.beforeDeleteFile:
125+
Parse.Cloud.beforeDeleteFile(triggerClassName, triggerCallback(triggerConfig));
126+
break;
127+
case Trigger.afterDeleteFile:
128+
Parse.Cloud.afterDeleteFile(triggerClassName, triggerCallback(triggerConfig));
129+
break;
130+
131+
case Trigger.beforeFind:
132+
Parse.Cloud.beforeFind(triggerClassName, triggerCallback(triggerConfig));
133+
break;
134+
case Trigger.afterFind:
135+
Parse.Cloud.afterFind(triggerClassName, triggerCallback(triggerConfig));
136+
break;
137+
138+
case Trigger.beforeLogin:
139+
Parse.Cloud.beforeLogin(triggerCallback(triggerConfig));
140+
break;
141+
case Trigger.afterLogout:
142+
Parse.Cloud.afterLogout(triggerCallback(triggerConfig));
143+
break;
144+
}
145+
}
146+
147+
module.exports = {
148+
assignObjValueWithKey,
149+
Trigger,
150+
defineCloudFunction,
151+
defineTrigger,
152+
};

cloud/hi.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
/**
2+
* parse后台脚手架
3+
* www.yourCompany.com
4+
*/
5+
6+
Parse.Cloud.define('hello', function(req, res) {
7+
//Parse.Cloud.useMasterKey();
8+
res.success('Hi,parse-scaffold!');
9+
});

cloud/main.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
/**
2+
* parse后台脚手架
3+
* www.yourCompany.com
4+
*/
5+
6+
'use strict';
7+
8+
require('./hi.js');

cloud/yourApp/hi.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
/**
2+
* parse后台脚手架
3+
* www.yourCompany.com
4+
*/
5+
6+
const parse = require('../common');
7+
8+
const hello = request => {
9+
//Parse.Cloud.useMasterKey();
10+
return 'Hi, yourApp!';
11+
}
12+
13+
parse.defineCloudFunction(hello);

0 commit comments

Comments
 (0)