Skip to content

Commit 0ca8e36

Browse files
committed
Allow saving cloud files from Dashboard
1 parent 6309d47 commit 0ca8e36

File tree

2 files changed

+64
-0
lines changed

2 files changed

+64
-0
lines changed

spec/CloudCode.spec.js

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,51 @@ describe('Cloud Code', () => {
9595
});
9696
});
9797

98+
it('can edit cloud code file from dashboard', async done => {
99+
const cloudDir = './spec/cloud/cloudCodeRequireFiles.js';
100+
await reconfigureServer({ cloud: cloudDir });
101+
const options = Object.assign({}, masterKeyOptions, {
102+
method: 'GET',
103+
url: Parse.serverURL + '/releases/latest',
104+
});
105+
let originalFile = '';
106+
request(options)
107+
.then(res => {
108+
expect(Array.isArray(res.data)).toBe(true);
109+
const first = res.data[0];
110+
expect(first.userFiles).toBeDefined();
111+
expect(first.checksums).toBeDefined();
112+
expect(first.userFiles).toContain(cloudDir);
113+
expect(first.checksums).toContain(cloudDir);
114+
options.url = Parse.serverURL + '/scripts/spec/cloud/cloudCodeRequireFiles.js';
115+
return request(options);
116+
})
117+
.then(res => {
118+
originalFile = res.data;
119+
let response = res.data;
120+
expect(response).toContain(`require('./cloudCodeAbsoluteFile.js`);
121+
response = response + '\nconst additionalData;\n';
122+
options.method = 'POST';
123+
options.url = Parse.serverURL + '/scripts/spec/cloud/cloudCodeRequireFiles.js';
124+
options.body = {
125+
data: response,
126+
};
127+
return request(options);
128+
})
129+
.then(res => {
130+
expect(res.data).toBe('This file has been saved.');
131+
options.method = 'POST';
132+
options.url = Parse.serverURL + '/scripts/spec/cloud/cloudCodeRequireFiles.js';
133+
options.body = {
134+
data: originalFile,
135+
};
136+
return request(options);
137+
})
138+
.then(() => {
139+
done();
140+
});
141+
});
142+
98143
it('can create functions', done => {
99144
Parse.Cloud.define('hello', () => {
100145
return 'Hello world!';

src/Routers/CloudCodeRouter.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,12 @@ export class CloudCodeRouter extends PromiseRouter {
6767
middleware.promiseEnforceMasterKeyAccess,
6868
CloudCodeRouter.getCloudFile
6969
);
70+
this.route(
71+
'POST',
72+
'/scripts/*',
73+
middleware.promiseEnforceMasterKeyAccess,
74+
CloudCodeRouter.saveCloudFile
75+
);
7076
}
7177

7278
static getJobs(req) {
@@ -134,6 +140,19 @@ export class CloudCodeRouter extends PromiseRouter {
134140
};
135141
});
136142
}
143+
static saveCloudFile(req) {
144+
const file = req.url.replace('/scripts', '');
145+
const dirName = __dirname.split('lib')[0].split('node_modules')[0];
146+
const filePath = path.join(dirName, file);
147+
const data = req.body.data;
148+
if (!data) {
149+
throw new Parse.Error(Parse.Error.INTERNAL_SERVER_ERROR, 'No data to save.');
150+
}
151+
fs.writeFileSync(filePath, data);
152+
return {
153+
response: 'This file has been saved.',
154+
};
155+
}
137156
static getCloudFile(req) {
138157
const file = req.url.replace('/scripts', '');
139158
const dirName = __dirname.split('lib')[0].split('node_modules')[0];

0 commit comments

Comments
 (0)