Skip to content

Commit 8dc7b64

Browse files
authored
Merge pull request #3106 from processing/revert-changes
Revert some changes from previous updates to deleteProject
2 parents 7526a12 + 9ad7dae commit 8dc7b64

File tree

4 files changed

+120
-88
lines changed

4 files changed

+120
-88
lines changed

.github/workflows/deploy-staging.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ on:
33
workflow_run:
44
workflows: ["Test"]
55
branches:
6-
- release-delete-sketch
6+
- develop
77
types:
88
- completed
99
env:

server/controllers/aws.controller.js

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -43,19 +43,6 @@ export function getObjectKey(url) {
4343
export async function deleteObjectsFromS3(keyList, callback) {
4444
const objectsToDelete = keyList?.map((key) => ({ Key: key }));
4545

46-
const sendResponse = (cb, err) => {
47-
if (cb && err) {
48-
callback(err);
49-
} else if (cb) {
50-
callback();
51-
} else if (!cb && err) {
52-
console.error('Failed to delete objects from S3.');
53-
throw err;
54-
}
55-
56-
return 'Objects successfully deleted from S3.';
57-
};
58-
5946
if (objectsToDelete.length > 0) {
6047
const params = {
6148
Bucket: process.env.S3_BUCKET,
@@ -64,12 +51,17 @@ export async function deleteObjectsFromS3(keyList, callback) {
6451

6552
try {
6653
await s3Client.send(new DeleteObjectsCommand(params));
67-
sendResponse();
54+
if (callback) {
55+
callback();
56+
}
6857
} catch (error) {
69-
sendResponse();
58+
console.error('Error deleting objects from S3: ', error);
59+
if (callback) {
60+
callback(error);
61+
}
7062
}
71-
} else {
72-
sendResponse();
63+
} else if (callback) {
64+
callback();
7365
}
7466
}
7567

server/controllers/project.controller/__test__/deleteProject.test.js

Lines changed: 81 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -3,79 +3,112 @@
33
*/
44
import { Request, Response } from 'jest-express';
55

6-
import Project from '../../../models/project';
6+
import Project, {
7+
createMock,
8+
createInstanceMock
9+
} from '../../../models/project';
710
import User from '../../../models/user';
811
import deleteProject from '../../project.controller/deleteProject';
912
import { deleteObjectsFromS3 } from '../../aws.controller';
1013

1114
jest.mock('../../../models/project');
1215
jest.mock('../../aws.controller');
1316

14-
// TODO: incomplete test, 500 response status needs to be added
15-
1617
describe('project.controller', () => {
17-
let request;
18-
let response;
18+
describe('deleteProject()', () => {
19+
let ProjectMock;
20+
let ProjectInstanceMock;
1921

20-
beforeEach(() => {
21-
request = new Request();
22-
response = new Response();
23-
Project.findById = jest.fn();
24-
});
22+
beforeEach(() => {
23+
ProjectMock = createMock();
24+
ProjectInstanceMock = createInstanceMock();
25+
});
2526

26-
afterEach(() => {
27-
request.resetMocked();
28-
response.resetMocked();
29-
});
27+
afterEach(() => {
28+
ProjectMock.restore();
29+
ProjectInstanceMock.restore();
30+
});
3031

31-
it('returns 403 if project is not owned by authenticated user', async () => {
32-
const user = new User();
33-
const project = new Project();
34-
project.user = user;
32+
it('returns 403 if project is not owned by authenticated user', (done) => {
33+
const user = new User();
34+
const project = new Project();
35+
project.user = user;
3536

36-
request.setParams({ project_id: project._id });
37-
request.user = { _id: 'abc123' };
37+
const request = new Request();
38+
request.setParams({ project_id: project._id });
39+
request.user = { _id: 'abc123' };
3840

39-
Project.findById.mockResolvedValue(project);
41+
const response = new Response();
4042

41-
await deleteProject(request, response);
43+
ProjectMock.expects('findById').resolves(project);
4244

43-
expect(response.status).toHaveBeenCalledWith(403);
44-
expect(response.json).toHaveBeenCalledWith({
45-
message: 'Authenticated user does not match owner of project'
45+
const promise = deleteProject(request, response);
46+
47+
function expectations() {
48+
expect(response.status).toHaveBeenCalledWith(403);
49+
expect(response.json).toHaveBeenCalledWith({
50+
message: 'Authenticated user does not match owner of project'
51+
});
52+
53+
done();
54+
}
55+
56+
promise.then(expectations, expectations).catch(expectations);
4657
});
47-
});
4858

49-
it('returns 404 if project does not exist', async () => {
50-
request.setParams({ project_id: 'random_id' });
51-
request.user = { _id: 'abc123' };
59+
it('returns 404 if project does not exist', (done) => {
60+
const user = new User();
61+
const project = new Project();
62+
project.user = user;
63+
64+
const request = new Request();
65+
request.setParams({ project_id: project._id });
66+
request.user = { _id: 'abc123' };
5267

53-
Project.findById.mockResolvedValue(null);
68+
const response = new Response();
5469

55-
await deleteProject(request, response);
70+
ProjectMock.expects('findById').resolves(null);
5671

57-
expect(response.status).toHaveBeenCalledWith(404);
58-
expect(response.json).toHaveBeenCalledWith({
59-
message: 'Project with that id does not exist'
72+
const promise = deleteProject(request, response);
73+
74+
function expectations() {
75+
expect(response.status).toHaveBeenCalledWith(404);
76+
expect(response.json).toHaveBeenCalledWith({
77+
message: 'Project with that id does not exist'
78+
});
79+
80+
done();
81+
}
82+
83+
promise.then(expectations, expectations).catch(expectations);
6084
});
61-
});
6285

63-
it('delete project and dependent files from S3', async () => {
64-
const user = new User();
65-
const project = new Project();
66-
project.user = user;
67-
project.remove = jest.fn().mockResolvedValue();
86+
it('deletes project and dependent files from S3 ', (done) => {
87+
const user = new User();
88+
const project = new Project();
89+
project.user = user;
90+
91+
const request = new Request();
92+
request.setParams({ project_id: project._id });
93+
request.user = { _id: user._id };
6894

69-
request.setParams({ project_id: project._id });
70-
request.user = { _id: user._id };
95+
const response = new Response();
7196

72-
Project.findById.mockResolvedValue(project);
73-
deleteObjectsFromS3.mockResolvedValue();
97+
ProjectMock.expects('findById').resolves(project);
7498

75-
await deleteProject(request, response);
99+
ProjectInstanceMock.expects('remove').yields();
76100

77-
expect(deleteObjectsFromS3).toHaveBeenCalled();
78-
expect(project.remove).toHaveBeenCalled();
79-
expect(response.status).toHaveBeenCalledWith(200);
101+
const promise = deleteProject(request, response);
102+
103+
function expectations() {
104+
expect(response.status).toHaveBeenCalledWith(200);
105+
expect(response.json).not.toHaveBeenCalled();
106+
expect(deleteObjectsFromS3).toHaveBeenCalled();
107+
108+
done();
109+
}
110+
111+
promise.then(expectations, expectations).catch(expectations);
112+
});
80113
});
81114
});

server/controllers/project.controller/deleteProject.js

Lines changed: 29 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ const ProjectDeletionError = createApplicationErrorClass(
77
'ProjectDeletionError'
88
);
99

10-
async function deleteFilesFromS3(files) {
10+
function deleteFilesFromS3(files) {
1111
const filteredFiles = files
1212
.filter((file) => {
1313
const isValidFile =
@@ -22,27 +22,25 @@ async function deleteFilesFromS3(files) {
2222
})
2323
.map((file) => getObjectKey(file.url));
2424

25-
try {
26-
await deleteObjectsFromS3(filteredFiles);
27-
} catch (error) {
28-
console.error('Failed to delete files from S3:', error);
29-
}
25+
deleteObjectsFromS3(filteredFiles);
3026
}
3127

32-
export default async function deleteProject(req, res) {
33-
const sendFailure = (error) => {
28+
export default function deleteProject(req, res) {
29+
function sendFailure(error) {
3430
res.status(error.code).json({ message: error.message });
35-
};
31+
}
3632

37-
try {
38-
const project = await Project.findById(req.params.project_id);
33+
function sendProjectNotFound() {
34+
sendFailure(
35+
new ProjectDeletionError('Project with that id does not exist', {
36+
code: 404
37+
})
38+
);
39+
}
3940

40-
if (!project) {
41-
sendFailure(
42-
new ProjectDeletionError('Project with that id does not exist', {
43-
code: 404
44-
})
45-
);
41+
function handleProjectDeletion(project) {
42+
if (project == null) {
43+
sendProjectNotFound();
4644
return;
4745
}
4846

@@ -56,10 +54,19 @@ export default async function deleteProject(req, res) {
5654
return;
5755
}
5856

59-
await deleteFilesFromS3(project.files);
60-
await project.remove();
61-
res.status(200).end();
62-
} catch (error) {
63-
sendFailure(error);
57+
deleteFilesFromS3(project.files);
58+
59+
project.remove((removeProjectError) => {
60+
if (removeProjectError) {
61+
sendProjectNotFound();
62+
return;
63+
}
64+
65+
res.status(200).end();
66+
});
6467
}
68+
69+
return Project.findById(req.params.project_id)
70+
.then(handleProjectDeletion)
71+
.catch(sendFailure);
6572
}

0 commit comments

Comments
 (0)