Skip to content

Commit 9a67f44

Browse files
committed
Clone files in questionnaire if copying questionnaire
1 parent 5f5673f commit 9a67f44

File tree

5 files changed

+56
-8
lines changed

5 files changed

+56
-8
lines changed

wizard-server/src/Wizard/Database/DAO/Questionnaire/QuestionnaireFileDAO.hs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,13 @@ findQuestionnaireFilesPage mQuery mQtnUuid pageable sort = do
9292
}
9393
return $ Page pageLabel metadata entities
9494

95-
findQuestionnaireFilesByQuestionnaire :: U.UUID -> AppContextM [QuestionnaireFileSimple]
95+
findQuestionnaireFilesByQuestionnaire :: U.UUID -> AppContextM [QuestionnaireFile]
9696
findQuestionnaireFilesByQuestionnaire qtnUuid = do
97+
tenantUuid <- asks currentTenantUuid
98+
createFindEntitiesWithFieldsByFn "*" entityName [tenantQueryUuid tenantUuid, ("questionnaire_uuid", U.toString qtnUuid)]
99+
100+
findQuestionnaireFilesSimpleByQuestionnaire :: U.UUID -> AppContextM [QuestionnaireFileSimple]
101+
findQuestionnaireFilesSimpleByQuestionnaire qtnUuid = do
97102
tenantUuid <- asks currentTenantUuid
98103
createFindEntitiesWithFieldsByFn "uuid, file_name, content_type, file_size" entityName [tenantQueryUuid tenantUuid, ("questionnaire_uuid", U.toString qtnUuid)]
99104

wizard-server/src/Wizard/S3/Questionnaire/QuestionnaireFileS3.hs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ retrieveFileConduitAction questionnaireUuid fileUuid = createGetObjectConduitAct
2121
putFile :: U.UUID -> U.UUID -> String -> BS.ByteString -> AppContextM String
2222
putFile questionnaireUuid fileUuid contentType = createPutObjectFn (f' "%s/%s/%s" [folderName, U.toString questionnaireUuid, U.toString fileUuid]) (Just contentType) Nothing
2323

24+
putFileConduit :: U.UUID -> U.UUID -> String -> String -> Minio (C.ConduitM () BS.ByteString Minio ()) -> AppContextM String
25+
putFileConduit questionnaireUuid fileUuid contentType contentDisposition = createPutObjectConduitFn (f' "%s/%s/%s" [folderName, U.toString questionnaireUuid, U.toString fileUuid]) (Just contentType) (Just contentDisposition)
26+
2427
presigneGetFileUrl :: U.UUID -> U.UUID -> Int -> AppContextM String
2528
presigneGetFileUrl questionnaireUuid fileUuid = createPresignedGetObjectUrl (f' "%s/%s/%s" [folderName, U.toString questionnaireUuid, U.toString fileUuid])
2629

wizard-server/src/Wizard/Service/Document/Context/DocumentContextService.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ createDocumentContext doc pkg branchEvents qtn mReplies = do
6464
(Just eventUuid) -> findQuestionnaireVersionUuid eventUuid qtn.versions
6565
_ -> Nothing
6666
qtnVersionDtos <- traverse enhanceQuestionnaireVersion qtn.versions
67-
qtnFiles <- findQuestionnaireFilesByQuestionnaire doc.questionnaireUuid
67+
qtnFiles <- findQuestionnaireFilesSimpleByQuestionnaire doc.questionnaireUuid
6868
(users, groups) <- heSettingsToPerms qtn
6969
return $
7070
toDocumentContext

wizard-server/src/Wizard/Service/Questionnaire/File/QuestionnaireFileService.hs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import Shared.Common.Model.Common.Page
99
import Shared.Common.Model.Common.Pageable
1010
import Shared.Common.Model.Common.Sort
1111
import Shared.Common.Service.Acl.AclService
12+
import Shared.Common.Util.String
1213
import Shared.Common.Util.Uuid
1314
import Wizard.Api.Resource.File.FileCreateDTO
1415
import Wizard.Api.Resource.TemporaryFile.TemporaryFileDTO
@@ -55,6 +56,22 @@ createQuestionnaireFile qtnUuid questionUuid reqDto =
5556
addFile qtnUuid (toSimple qtnFile)
5657
return $ toList qtnFile qtn mCurrentUser
5758

59+
cloneQuestionnaireFiles :: U.UUID -> U.UUID -> AppContextM [(QuestionnaireFile, QuestionnaireFile)]
60+
cloneQuestionnaireFiles oldQtnUuid newQtnUuid = do
61+
runInTransaction $ do
62+
oldFiles <- findQuestionnaireFilesByQuestionnaire oldQtnUuid
63+
traverse
64+
( \oldFile -> do
65+
contentAction <- retrieveFileConduitAction oldQtnUuid oldFile.uuid
66+
newFileUuid <- liftIO generateUuid
67+
let newFile = oldFile {uuid = newFileUuid, questionnaireUuid = newQtnUuid}
68+
let contentDisposition = f' "attachment;filename=\"%s\"" [trim newFile.fileName]
69+
insertQuestionnaireFile newFile
70+
putFileConduit newQtnUuid newFile.uuid newFile.contentType contentDisposition contentAction
71+
return (oldFile, newFile)
72+
)
73+
oldFiles
74+
5875
downloadQuestionnaireFile :: U.UUID -> U.UUID -> AppContextM TemporaryFileDTO
5976
downloadQuestionnaireFile qtnUuid fileUuid = do
6077
runInTransaction $ do
@@ -67,7 +84,7 @@ downloadQuestionnaireFile qtnUuid fileUuid = do
6784
deleteQuestionnaireFilesByQuestionnaireUuid :: U.UUID -> AppContextM ()
6885
deleteQuestionnaireFilesByQuestionnaireUuid qtnUuid = do
6986
runInTransaction $ do
70-
files <- findQuestionnaireFilesByQuestionnaire qtnUuid
87+
files <- findQuestionnaireFilesSimpleByQuestionnaire qtnUuid
7188
checkEditPermissionToFile qtnUuid
7289
traverse_
7390
( \file -> do

wizard-server/src/Wizard/Service/Questionnaire/QuestionnaireService.hs

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,9 @@ import Wizard.Model.Questionnaire.QuestionnaireDetailQuestionnaire
5555
import Wizard.Model.Questionnaire.QuestionnaireDetailSettings
5656
import Wizard.Model.Questionnaire.QuestionnaireEvent
5757
import Wizard.Model.Questionnaire.QuestionnaireEventLenses ()
58+
import Wizard.Model.Questionnaire.QuestionnaireFile
5859
import Wizard.Model.Questionnaire.QuestionnairePerm
60+
import Wizard.Model.Questionnaire.QuestionnaireReply
5961
import Wizard.Model.Tenant.Config.TenantConfig
6062
import Wizard.S3.Document.DocumentS3
6163
import Wizard.Service.KnowledgeModel.KnowledgeModelService
@@ -178,13 +180,15 @@ createQuestionnaireFromTemplate reqDto =
178180
, updatedAt = now
179181
}
180182
:: Questionnaire
181-
newQtnEvents <- cloneQuestinonaireEvents newQtnUuid originQtnEvents
182183
insertQuestionnaire newQtn
183-
insertQuestionnaireEvents newQtnEvents
184+
clonedFiles <- cloneQuestionnaireFiles originQtn.uuid newQtn.uuid
185+
newQtnEvents <- cloneQuestinonaireEvents newQtnUuid originQtnEvents
186+
let newQtnEventsWithReplacedFiles = replaceQuestinonaireEventsWithNewFiles clonedFiles newQtnEvents
187+
insertQuestionnaireEvents newQtnEventsWithReplacedFiles
184188
duplicateCommentThreads reqDto.questionnaireUuid newQtnUuid
185189
state <- getQuestionnaireState newQtnUuid pkg.pId
186190
permissionDtos <- traverse enhanceQuestionnairePerm newQtn.permissions
187-
qtnCtn <- compileQuestionnaire newQtnEvents
191+
qtnCtn <- compileQuestionnaire newQtnEventsWithReplacedFiles
188192
return $ toSimpleDTO newQtn pkg state permissionDtos
189193

190194
cloneQuestionnaire :: U.UUID -> AppContextM QuestionnaireDTO
@@ -209,9 +213,11 @@ cloneQuestionnaire cloneUuid =
209213
, updatedAt = now
210214
}
211215
:: Questionnaire
212-
newQtnEvents <- cloneQuestinonaireEvents newQtnUuid originQtnEvents
213216
insertQuestionnaire newQtn
214-
insertQuestionnaireEvents newQtnEvents
217+
clonedFiles <- cloneQuestionnaireFiles originQtn.uuid newQtn.uuid
218+
newQtnEvents <- cloneQuestinonaireEvents newQtnUuid originQtnEvents
219+
let newQtnEventsWithReplacedFiles = replaceQuestinonaireEventsWithNewFiles clonedFiles newQtnEvents
220+
insertQuestionnaireEvents newQtnEventsWithReplacedFiles
215221
duplicateCommentThreads cloneUuid newQtnUuid
216222
state <- getQuestionnaireState newQtnUuid pkg.pId
217223
permissionDtos <- traverse enhanceQuestionnairePerm newQtn.permissions
@@ -427,3 +433,20 @@ cloneQuestinonaireEvents newQtnUuid =
427433
newEventUuid <- liftIO generateUuid
428434
return $ setQuestionnaireUuid (setUuid event newEventUuid) newQtnUuid
429435
)
436+
437+
replaceQuestinonaireEventsWithNewFiles :: [(QuestionnaireFile, QuestionnaireFile)] -> [QuestionnaireEvent] -> [QuestionnaireEvent]
438+
replaceQuestinonaireEventsWithNewFiles clonedFiles qtnEvents =
439+
let findFile :: U.UUID -> Maybe (QuestionnaireFile, QuestionnaireFile)
440+
findFile fileUuid = L.find (\(oldFile, newFile) -> oldFile.uuid == fileUuid) clonedFiles
441+
replaceEvent :: QuestionnaireEvent -> QuestionnaireEvent
442+
replaceEvent (SetReplyEvent' event) =
443+
let value' =
444+
case event.value of
445+
r@FileReply {..} ->
446+
case findFile r.fValue of
447+
Just (oldFile, newFile) -> r {fValue = newFile.uuid}
448+
_ -> r
449+
r -> r
450+
in SetReplyEvent' (event {value = value'})
451+
replaceEvent event' = event'
452+
in fmap replaceEvent qtnEvents

0 commit comments

Comments
 (0)