@@ -8,50 +8,47 @@ import { deleteObjectsFromS3, getObjectKey } from './aws.controller';
88// Bug -> timestamps don't get created, but it seems like this will
99// be fixed in mongoose soon
1010// https://github.com/Automattic/mongoose/issues/4049
11- export function createFile ( req , res ) {
12- Project . findOneAndUpdate (
13- {
14- _id : req . params . project_id ,
15- user : req . user . _id
16- } ,
17- {
18- $push : {
19- files : req . body
20- }
21- } ,
22- {
23- new : true
24- } ,
25- ( err , updatedProject ) => {
26- if ( err || ! updatedProject ) {
27- console . log ( err ) ;
28- res . status ( 403 ) . send ( {
29- success : false ,
30- message : 'Project does not exist, or user does not match owner.'
31- } ) ;
32- return ;
33- }
34- const newFile = updatedProject . files [ updatedProject . files . length - 1 ] ;
35- updatedProject . files . id ( req . body . parentId ) . children . push ( newFile . id ) ;
36- updatedProject . save ( ( innerErr , savedProject ) => {
37- if ( innerErr ) {
38- console . log ( innerErr ) ;
39- res . json ( { success : false } ) ;
40- return ;
11+ export async function createFile ( req , res ) {
12+ try {
13+ const updatedProject = await Project . findOneAndUpdate (
14+ {
15+ _id : req . params . project_id ,
16+ user : req . user . _id
17+ } ,
18+ {
19+ $push : {
20+ files : req . body
4121 }
42- savedProject . populate (
43- { path : 'user' , select : 'username' } ,
44- ( _ , populatedProject ) => {
45- res . json ( {
46- updatedFile :
47- updatedProject . files [ updatedProject . files . length - 1 ] ,
48- project : populatedProject
49- } ) ;
50- }
51- ) ;
22+ } ,
23+ {
24+ new : true
25+ }
26+ ) . exec ( ) ;
27+
28+ if ( ! updatedProject ) {
29+ return res . status ( 403 ) . send ( {
30+ success : false ,
31+ message : 'Project does not exist, or user does not match owner.'
5232 } ) ;
5333 }
54- ) ;
34+
35+ const newFile = updatedProject . files [ updatedProject . files . length - 1 ] ;
36+ updatedProject . files . id ( req . body . parentId ) . children . push ( newFile . id ) ;
37+
38+ const savedProject = await updatedProject . save ( ) ;
39+ const populatedProject = await savedProject . populate ( {
40+ path : 'user' ,
41+ select : 'username'
42+ } ) ;
43+
44+ return res . json ( {
45+ updatedFile : newFile ,
46+ project : populatedProject
47+ } ) ;
48+ } catch ( err ) {
49+ console . error ( err ) ;
50+ return res . status ( 500 ) . json ( { success : false } ) ;
51+ }
5552}
5653
5754function getAllDescendantIds ( files , nodeId ) {
@@ -82,7 +79,7 @@ function deleteMany(files, ids) {
8279 objectKeys . push ( objectKey ) ;
8380 }
8481 }
85- files . id ( id ) . remove ( ) ;
82+ files . id ( id ) . deleteOne ( ) ;
8683 cb ( ) ;
8784 } ,
8885 ( err ) => {
@@ -102,69 +99,88 @@ function deleteChild(files, parentId, id) {
10299}
103100
104101export function deleteFile ( req , res ) {
105- Project . findById ( req . params . project_id , ( err , project ) => {
106- if ( ! project ) {
107- res
108- . status ( 404 )
109- . send ( { success : false , message : 'Project does not exist.' } ) ;
110- }
111- if ( ! project . user . equals ( req . user . _id ) ) {
112- res . status ( 403 ) . send ( {
113- success : false ,
114- message : 'Session does not match owner of project.'
115- } ) ;
116- return ;
117- }
102+ Project . findById ( req . params . project_id )
103+ . then ( ( project ) => {
104+ if ( ! project ) {
105+ return res . status ( 404 ) . send ( {
106+ success : false ,
107+ message : 'Project does not exist.'
108+ } ) ;
109+ }
118110
119- // make sure file exists for project
120- const fileToDelete = project . files . find (
121- ( file ) => file . id === req . params . file_id
122- ) ;
123- if ( ! fileToDelete ) {
124- res
125- . status ( 404 )
126- . send ( { success : false , message : 'File does not exist in project.' } ) ;
127- return ;
128- }
111+ if ( ! project . user . equals ( req . user . _id ) ) {
112+ return res . status ( 403 ) . send ( {
113+ success : false ,
114+ message : 'Session does not match owner of project.'
115+ } ) ;
116+ }
117+
118+ const fileToDelete = project . files . find (
119+ ( file ) => file . id === req . params . file_id
120+ ) ;
121+
122+ if ( ! fileToDelete ) {
123+ return res . status ( 404 ) . send ( {
124+ success : false ,
125+ message : 'File does not exist in project.'
126+ } ) ;
127+ }
128+
129+ const idsToDelete = getAllDescendantIds (
130+ project . files ,
131+ req . params . file_id
132+ ) ;
133+ deleteMany ( project . files , [ req . params . file_id , ...idsToDelete ] ) ;
129134
130- const idsToDelete = getAllDescendantIds ( project . files , req . params . file_id ) ;
131- deleteMany ( project . files , [ req . params . file_id , ...idsToDelete ] ) ;
132- project . files = deleteChild (
133- project . files ,
134- req . query . parentId ,
135- req . params . file_id
136- ) ;
137- project . save ( ( innerErr , savedProject ) => {
138- res . json ( { project : savedProject } ) ;
135+ project . files = deleteChild (
136+ project . files ,
137+ req . query . parentId ,
138+ req . params . file_id
139+ ) ;
140+
141+ return project . save ( ) . then ( ( savedProject ) => {
142+ res . json ( { project : savedProject } ) ;
143+ } ) ;
144+ } )
145+ . catch ( ( error ) => {
146+ console . error ( error ) ;
147+ res . status ( 500 ) . json ( { message : 'Failed to process deletion' } ) ;
139148 } ) ;
140- } ) ;
141149}
142150
143151export function getFileContent ( req , res ) {
144152 const projectId = req . params . project_id ;
145- Project . findOne (
146- { $or : [ { _id : projectId } , { slug : projectId } ] } ,
147- ( err , project ) => {
148- if ( err || project === null ) {
153+
154+ Project . findOne ( { $or : [ { _id : projectId } , { slug : projectId } ] } )
155+ . then ( ( project ) => {
156+ if ( ! project ) {
149157 res . status ( 404 ) . send ( {
150158 success : false ,
151159 message : 'Project with that id does not exist.'
152160 } ) ;
153161 return ;
154162 }
163+
155164 const filePath = req . params [ 0 ] ;
156165 const resolvedFile = resolvePathToFile ( filePath , project . files ) ;
166+
157167 if ( ! resolvedFile ) {
158168 res . status ( 404 ) . send ( {
159169 success : false ,
160170 message : 'File with that name and path does not exist.'
161171 } ) ;
162172 return ;
163173 }
174+
164175 const contentType =
165176 mime . getType ( resolvedFile . name ) || 'application/octet-stream' ;
166177 res . set ( 'Content-Type' , contentType ) ;
167178 res . send ( resolvedFile . content ) ;
168- }
169- ) ;
179+ } )
180+ . catch ( ( err ) => {
181+ console . error ( err ) ;
182+ res
183+ . status ( 500 )
184+ . send ( { success : false , message : 'Internal server error' } ) ;
185+ } ) ;
170186}
0 commit comments