77
88namespace OCA \Forms \Db ;
99
10+ use OCA \Forms \Service \FormsService ;
1011use OCP \AppFramework \Db \DoesNotExistException ;
1112use OCP \AppFramework \Db \QBMapper ;
1213use OCP \DB \QueryBuilder \IQueryBuilder ;
14+ use OCP \Files \Folder ;
15+ use OCP \Files \IRootFolder ;
16+ use OCP \Files \NotFoundException ;
1317use OCP \IDBConnection ;
18+ use Psr \Log \LoggerInterface ;
1419
1520/**
1621 * @extends QBMapper<Submission>
@@ -20,10 +25,16 @@ class SubmissionMapper extends QBMapper {
2025 * SubmissionMapper constructor.
2126 * @param IDBConnection $db
2227 * @param AnswerMapper $answerMapper
28+ * @param IRootFolder $rootFolder
29+ * @param LoggerInterface $logger
30+ * @param FormsService $formsService
2331 */
2432 public function __construct (
2533 IDBConnection $ db ,
2634 private AnswerMapper $ answerMapper ,
35+ private IRootFolder $ rootFolder ,
36+ private LoggerInterface $ logger ,
37+ private FormsService $ formsService ,
2738 ) {
2839 parent ::__construct ($ db , 'forms_v2_submissions ' , Submission::class);
2940 }
@@ -179,22 +190,17 @@ protected function countSubmissionsWithFilters(int $formId, ?string $userId = nu
179190
180191 /**
181192 * Delete the Submission, including answers.
193+ * @param Form $form Form the submission belongs to.
182194 * @param int $id of the submission to delete
183195 */
184- public function deleteById (int $ id ): void {
185- $ qb = $ this ->db ->getQueryBuilder ();
186-
187- // First delete corresponding answers.
196+ public function deleteById (Form $ form , int $ id ): void {
188197 $ submissionEntity = $ this ->findById ($ id );
189- $ this ->answerMapper ->deleteBySubmission ($ submissionEntity ->getId ());
190198
191- //Delete Submission
192- $ qb ->delete ($ this ->getTableName ())
193- ->where (
194- $ qb ->expr ()->eq ('id ' , $ qb ->createNamedParameter ($ id , IQueryBuilder::PARAM_INT ))
195- );
199+ $ this ->deleteSubmissionFolder ($ form , $ submissionEntity ->getId ());
196200
197- $ qb ->executeStatement ();
201+ $ this ->answerMapper ->deleteBySubmission ($ submissionEntity ->getId ());
202+
203+ $ this ->delete ($ submissionEntity );
198204 }
199205
200206 /**
@@ -218,4 +224,34 @@ public function deleteByForm(int $formId): void {
218224
219225 $ qb ->executeStatement ();
220226 }
227+
228+ /**
229+ * Delete the submission folder from the file system
230+ * @param Form $form The form instance
231+ * @param int $submissionId The submission ID
232+ */
233+ private function deleteSubmissionFolder (Form $ form , int $ submissionId ): void {
234+ try {
235+ $ userFolder = $ this ->rootFolder ->getUserFolder ($ form ->getOwnerId ());
236+ $ formFolderPath = $ this ->formsService ->getFormUploadedFilesFolderPath ($ form );
237+
238+ $ formFolder = $ userFolder ->get ($ formFolderPath );
239+ if (!$ formFolder instanceof Folder) {
240+ return ;
241+ }
242+
243+ $ submissionFolder = $ formFolder ->get ((string )$ submissionId );
244+ if ($ submissionFolder instanceof Folder) {
245+ $ submissionFolder ->delete ();
246+ }
247+ } catch (NotFoundException ) {
248+ // Folder doesn't exist, do nothing
249+ } catch (\Throwable $ e ) {
250+ $ this ->logger ->warning ('Failed to delete submission folder: {error} ' , [
251+ 'error ' => $ e ->getMessage (),
252+ 'submissionId ' => $ submissionId ,
253+ 'formId ' => $ form ->getId (),
254+ ]);
255+ }
256+ }
221257}
0 commit comments