Skip to content

Commit 4e6a375

Browse files
authored
feat: Deprecation DEPPS7: Remove deprecated Cloud Code file trigger syntax (#8855)
BREAKING CHANGE: Cloud Code file trigger syntax has been aligned with object trigger syntax, for example `Parse.Cloud.beforeDeleteFile'` has been changed to `Parse.Cloud.beforeDelete(Parse.File, (request) => {})'`
1 parent df3d0bc commit 4e6a375

File tree

6 files changed

+27
-201
lines changed

6 files changed

+27
-201
lines changed

Diff for: DEPRECATIONS.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ The following is a list of deprecations, according to the [Deprecation Policy](h
1010
| DEPPS4 | Remove convenience method for http request `Parse.Cloud.httpRequest` | [#7589](https://github.com/parse-community/parse-server/pull/7589) | 5.0.0 (2022) | 6.0.0 (2023) | removed | - |
1111
| DEPPS5 | Config option `allowClientClassCreation` defaults to `false` | [#7925](https://github.com/parse-community/parse-server/pull/7925) | 5.3.0 (2022) | 7.0.0 (2024) | deprecated | - |
1212
| DEPPS6 | Auth providers disabled by default | [#7953](https://github.com/parse-community/parse-server/pull/7953) | 5.3.0 (2022) | 7.0.0 (2024) | deprecated | - |
13-
| DEPPS7 | Remove file trigger syntax `Parse.Cloud.beforeSaveFile((request) => {})` | [#7966](https://github.com/parse-community/parse-server/pull/7966) | 5.3.0 (2022) | 7.0.0 (2024) | deprecated | - |
13+
| DEPPS7 | Remove file trigger syntax `Parse.Cloud.beforeSaveFile((request) => {})` | [#7966](https://github.com/parse-community/parse-server/pull/7966) | 5.3.0 (2022) | 7.0.0 (2024) | removed | - |
1414
| DEPPS8 | Login with expired 3rd party authentication token defaults to `false` | [#7079](https://github.com/parse-community/parse-server/pull/7079) | 5.3.0 (2022) | 7.0.0 (2024) | deprecated | - |
1515
| DEPPS9 | Rename LiveQuery `fields` option to `keys` | [#8389](https://github.com/parse-community/parse-server/issues/8389) | 6.0.0 (2023) | 7.0.0 (2024) | deprecated | - |
1616
| DEPPS10 | Config option `encodeParseObjectInCloudFunction` defaults to `true` | [#8634](https://github.com/parse-community/parse-server/issues/8634) | 6.2.0 (2023) | 8.0.0 (2025) | deprecated | - |

Diff for: spec/CloudCode.spec.js

+16-65
Original file line numberDiff line numberDiff line change
@@ -3635,7 +3635,7 @@ describe('afterLogin hook', () => {
36353635
});
36363636

36373637
describe('saveFile hooks', () => {
3638-
it('beforeSaveFile should return file that is already saved and not save anything to files adapter', async () => {
3638+
it('beforeSave(Parse.File) should return file that is already saved and not save anything to files adapter', async () => {
36393639
await reconfigureServer({ filesAdapter: mockAdapter });
36403640
const createFileSpy = spyOn(mockAdapter, 'createFile').and.callThrough();
36413641
Parse.Cloud.beforeSave(Parse.File, () => {
@@ -3651,7 +3651,7 @@ describe('saveFile hooks', () => {
36513651
expect(createFileSpy).not.toHaveBeenCalled();
36523652
});
36533653

3654-
it('beforeSaveFile should throw error', async () => {
3654+
it('beforeSave(Parse.File) should throw error', async () => {
36553655
await reconfigureServer({ filesAdapter: mockAdapter });
36563656
Parse.Cloud.beforeSave(Parse.File, () => {
36573657
throw new Parse.Error(400, 'some-error-message');
@@ -3664,7 +3664,7 @@ describe('saveFile hooks', () => {
36643664
}
36653665
});
36663666

3667-
it('beforeSaveFile should change values of uploaded file by editing fileObject directly', async () => {
3667+
it('beforeSave(Parse.File) should change values of uploaded file by editing fileObject directly', async () => {
36683668
await reconfigureServer({ filesAdapter: mockAdapter });
36693669
const createFileSpy = spyOn(mockAdapter, 'createFile').and.callThrough();
36703670
Parse.Cloud.beforeSave(Parse.File, async req => {
@@ -3693,7 +3693,7 @@ describe('saveFile hooks', () => {
36933693
);
36943694
});
36953695

3696-
it('beforeSaveFile should change values by returning new fileObject', async () => {
3696+
it('beforeSave(Parse.File) should change values by returning new fileObject', async () => {
36973697
await reconfigureServer({ filesAdapter: mockAdapter });
36983698
const createFileSpy = spyOn(mockAdapter, 'createFile').and.callThrough();
36993699
Parse.Cloud.beforeSave(Parse.File, async req => {
@@ -3727,7 +3727,7 @@ describe('saveFile hooks', () => {
37273727
expect(file._name.indexOf(expectedFileName)).toBe(file._name.length - expectedFileName.length);
37283728
});
37293729

3730-
it('beforeSaveFile should contain metadata and tags saved from client', async () => {
3730+
it('beforeSave(Parse.File) should contain metadata and tags saved from client', async () => {
37313731
await reconfigureServer({ filesAdapter: mockAdapter });
37323732
const createFileSpy = spyOn(mockAdapter, 'createFile').and.callThrough();
37333733
Parse.Cloud.beforeSave(Parse.File, async req => {
@@ -3755,7 +3755,7 @@ describe('saveFile hooks', () => {
37553755
);
37563756
});
37573757

3758-
it('beforeSaveFile should return same file data with new file name', async () => {
3758+
it('beforeSave(Parse.File) should return same file data with new file name', async () => {
37593759
await reconfigureServer({ filesAdapter: mockAdapter });
37603760
const config = Config.get('test');
37613761
config.filesController.options.preserveFileName = true;
@@ -3770,7 +3770,7 @@ describe('saveFile hooks', () => {
37703770
expect(result.name()).toBe('2020-04-01.txt');
37713771
});
37723772

3773-
it('afterSaveFile should set fileSize to null if beforeSave returns an already saved file', async () => {
3773+
it('afterSave(Parse.File) should set fileSize to null if beforeSave returns an already saved file', async () => {
37743774
await reconfigureServer({ filesAdapter: mockAdapter });
37753775
const createFileSpy = spyOn(mockAdapter, 'createFile').and.callThrough();
37763776
Parse.Cloud.beforeSave(Parse.File, req => {
@@ -3790,7 +3790,7 @@ describe('saveFile hooks', () => {
37903790
expect(createFileSpy).not.toHaveBeenCalled();
37913791
});
37923792

3793-
it('afterSaveFile should throw error', async () => {
3793+
it('afterSave(Parse.File) should throw error', async () => {
37943794
await reconfigureServer({ filesAdapter: mockAdapter });
37953795
Parse.Cloud.afterSave(Parse.File, async () => {
37963796
throw new Parse.Error(400, 'some-error-message');
@@ -3804,7 +3804,7 @@ describe('saveFile hooks', () => {
38043804
}
38053805
});
38063806

3807-
it('afterSaveFile should call with fileObject', async done => {
3807+
it('afterSave(Parse.File) should call with fileObject', async done => {
38083808
await reconfigureServer({ filesAdapter: mockAdapter });
38093809
Parse.Cloud.beforeSave(Parse.File, async req => {
38103810
req.file.setTags({ tagA: 'some-tag' });
@@ -3820,7 +3820,7 @@ describe('saveFile hooks', () => {
38203820
await file.save({ useMasterKey: true });
38213821
});
38223822

3823-
it('afterSaveFile should change fileSize when file data changes', async done => {
3823+
it('afterSave(Parse.File) should change fileSize when file data changes', async done => {
38243824
await reconfigureServer({ filesAdapter: mockAdapter });
38253825
Parse.Cloud.beforeSave(Parse.File, async req => {
38263826
expect(req.fileSize).toBe(3);
@@ -3837,7 +3837,7 @@ describe('saveFile hooks', () => {
38373837
await file.save({ useMasterKey: true });
38383838
});
38393839

3840-
it('beforeDeleteFile should call with fileObject', async () => {
3840+
it('beforeDelete(Parse.File) should call with fileObject', async () => {
38413841
await reconfigureServer({ filesAdapter: mockAdapter });
38423842
Parse.Cloud.beforeDelete(Parse.File, req => {
38433843
expect(req.file).toBeInstanceOf(Parse.File);
@@ -3849,7 +3849,7 @@ describe('saveFile hooks', () => {
38493849
await file.destroy({ useMasterKey: true });
38503850
});
38513851

3852-
it('beforeDeleteFile should throw error', async done => {
3852+
it('beforeDelete(Parse.File) should throw error', async done => {
38533853
await reconfigureServer({ filesAdapter: mockAdapter });
38543854
Parse.Cloud.beforeDelete(Parse.File, () => {
38553855
throw new Error('some error message');
@@ -3863,7 +3863,7 @@ describe('saveFile hooks', () => {
38633863
}
38643864
});
38653865

3866-
it('afterDeleteFile should call with fileObject', async done => {
3866+
it('afterDelete(Parse.File) should call with fileObject', async done => {
38673867
await reconfigureServer({ filesAdapter: mockAdapter });
38683868
Parse.Cloud.beforeDelete(Parse.File, req => {
38693869
expect(req.file).toBeInstanceOf(Parse.File);
@@ -3880,7 +3880,7 @@ describe('saveFile hooks', () => {
38803880
await file.destroy({ useMasterKey: true });
38813881
});
38823882

3883-
it('beforeSaveFile should not change file if nothing is returned', async () => {
3883+
it('beforeSave(Parse.File) should not change file if nothing is returned', async () => {
38843884
await reconfigureServer({ filesAdapter: mockAdapter });
38853885
Parse.Cloud.beforeSave(Parse.File, () => {
38863886
return;
@@ -3890,7 +3890,7 @@ describe('saveFile hooks', () => {
38903890
expect(result).toBe(file);
38913891
});
38923892

3893-
it('throw custom error from beforeSaveFile', async done => {
3893+
it('throw custom error from beforeSave(Parse.File) ', async done => {
38943894
Parse.Cloud.beforeSave(Parse.File, () => {
38953895
throw new Parse.Error(Parse.Error.SCRIPT_FAILED, 'It should fail');
38963896
});
@@ -3904,7 +3904,7 @@ describe('saveFile hooks', () => {
39043904
}
39053905
});
39063906

3907-
it('throw empty error from beforeSaveFile', async done => {
3907+
it('throw empty error from beforeSave(Parse.File)', async done => {
39083908
Parse.Cloud.beforeSave(Parse.File, () => {
39093909
throw null;
39103910
});
@@ -3917,55 +3917,6 @@ describe('saveFile hooks', () => {
39173917
done();
39183918
}
39193919
});
3920-
3921-
it('legacy hooks', async () => {
3922-
await reconfigureServer({ filesAdapter: mockAdapter });
3923-
const logger = require('../lib/logger').logger;
3924-
const logSpy = spyOn(logger, 'warn').and.callFake(() => {});
3925-
const triggers = {
3926-
beforeSaveFile(req) {
3927-
req.file.setTags({ tagA: 'some-tag' });
3928-
req.file.setMetadata({ foo: 'bar' });
3929-
expect(req.triggerName).toEqual('beforeSave');
3930-
expect(req.master).toBe(true);
3931-
},
3932-
afterSaveFile(req) {
3933-
expect(req.master).toBe(true);
3934-
expect(req.file._tags).toEqual({ tagA: 'some-tag' });
3935-
expect(req.file._metadata).toEqual({ foo: 'bar' });
3936-
},
3937-
beforeDeleteFile(req) {
3938-
expect(req.file).toBeInstanceOf(Parse.File);
3939-
expect(req.file._name).toEqual('popeye.txt');
3940-
expect(req.file._url).toEqual('http://www.somewhere.com/popeye.txt');
3941-
expect(req.fileSize).toBe(null);
3942-
},
3943-
afterDeleteFile(req) {
3944-
expect(req.file).toBeInstanceOf(Parse.File);
3945-
expect(req.file._name).toEqual('popeye.txt');
3946-
expect(req.file._url).toEqual('http://www.somewhere.com/popeye.txt');
3947-
},
3948-
};
3949-
3950-
for (const key in triggers) {
3951-
spyOn(triggers, key).and.callThrough();
3952-
Parse.Cloud[key](triggers[key]);
3953-
}
3954-
3955-
const file = new Parse.File('popeye.txt', [1, 2, 3], 'text/plain');
3956-
await file.save({ useMasterKey: true });
3957-
await new Parse.File('popeye.txt', [1, 2, 3], 'text/plain').destroy({ useMasterKey: true });
3958-
await new Promise(resolve => setTimeout(resolve, 100));
3959-
for (const key in triggers) {
3960-
expect(triggers[key]).toHaveBeenCalled();
3961-
expect(logSpy).toHaveBeenCalledWith(
3962-
`DeprecationWarning: Parse.Cloud.${key} is deprecated and will be removed in a future version. Use Parse.Cloud.${key.replace(
3963-
'File',
3964-
''
3965-
)}(Parse.File, (request) => {})`
3966-
);
3967-
}
3968-
});
39693920
});
39703921

39713922
describe('sendEmail', () => {

Diff for: src/Options/Definitions.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -1063,19 +1063,19 @@ module.exports.LogLevels = {
10631063
triggerAfter: {
10641064
env: 'PARSE_SERVER_LOG_LEVELS_TRIGGER_AFTER',
10651065
help:
1066-
'Log level used by the Cloud Code Triggers `afterSave`, `afterDelete`, `afterSaveFile`, `afterDeleteFile`, `afterFind`, `afterLogout`. Default is `info`.',
1066+
'Log level used by the Cloud Code Triggers `afterSave`, `afterDelete`, `afterFind`, `afterLogout`. Default is `info`.',
10671067
default: 'info',
10681068
},
10691069
triggerBeforeError: {
10701070
env: 'PARSE_SERVER_LOG_LEVELS_TRIGGER_BEFORE_ERROR',
10711071
help:
1072-
'Log level used by the Cloud Code Triggers `beforeSave`, `beforeSaveFile`, `beforeDeleteFile`, `beforeFind`, `beforeLogin` on error. Default is `error `.',
1072+
'Log level used by the Cloud Code Triggers `beforeSave`, `beforeDelete`, `beforeFind`, `beforeLogin` on error. Default is `error`.',
10731073
default: 'error',
10741074
},
10751075
triggerBeforeSuccess: {
10761076
env: 'PARSE_SERVER_LOG_LEVELS_TRIGGER_BEFORE_SUCCESS',
10771077
help:
1078-
'Log level used by the Cloud Code Triggers `beforeSave`, `beforeSaveFile`, `beforeDeleteFile`, `beforeFind`, `beforeLogin` on success. Default is `info`.',
1078+
'Log level used by the Cloud Code Triggers `beforeSave`, `beforeDelete`, `beforeFind`, `beforeLogin` on success. Default is `info`.',
10791079
default: 'info',
10801080
},
10811081
};

Diff for: src/Options/docs.js

+3-3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: src/Options/index.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -607,15 +607,15 @@ export interface AuthAdapter {
607607
}
608608

609609
export interface LogLevels {
610-
/* Log level used by the Cloud Code Triggers `afterSave`, `afterDelete`, `afterSaveFile`, `afterDeleteFile`, `afterFind`, `afterLogout`. Default is `info`.
610+
/* Log level used by the Cloud Code Triggers `afterSave`, `afterDelete`, `afterFind`, `afterLogout`. Default is `info`.
611611
:DEFAULT: info
612612
*/
613613
triggerAfter: ?string;
614-
/* Log level used by the Cloud Code Triggers `beforeSave`, `beforeSaveFile`, `beforeDeleteFile`, `beforeFind`, `beforeLogin` on success. Default is `info`.
614+
/* Log level used by the Cloud Code Triggers `beforeSave`, `beforeDelete`, `beforeFind`, `beforeLogin` on success. Default is `info`.
615615
:DEFAULT: info
616616
*/
617617
triggerBeforeSuccess: ?string;
618-
/* Log level used by the Cloud Code Triggers `beforeSave`, `beforeSaveFile`, `beforeDeleteFile`, `beforeFind`, `beforeLogin` on error. Default is `error `.
618+
/* Log level used by the Cloud Code Triggers `beforeSave`, `beforeDelete`, `beforeFind`, `beforeLogin` on error. Default is `error`.
619619
:DEFAULT: error
620620
*/
621621
triggerBeforeError: ?string;

0 commit comments

Comments
 (0)