feat(generic-file-field): prevent multiple session files of same name
This commit is contained in:
parent
192b6279d3
commit
98e1141e60
@ -897,9 +897,14 @@ genericFileField mkOpts = Field{..}
|
|||||||
handleUpload mIdent file = do
|
handleUpload mIdent file = do
|
||||||
for mIdent $ \ident -> do
|
for mIdent $ \ident -> do
|
||||||
now <- liftIO getCurrentTime
|
now <- liftIO getCurrentTime
|
||||||
|
oldSFIds <- fmap (Set.fromList . map E.unValue) . E.select . E.from $ \sessionFile -> do
|
||||||
|
E.where_ $ E.subSelectForeign sessionFile SessionFileFile (E.^. FileTitle) E.==. E.val (fileTitle file)
|
||||||
|
E.&&. sessionFile E.^. SessionFileTouched E.<=. E.val now
|
||||||
|
return $ sessionFile E.^. SessionFileId
|
||||||
fId <- insert file
|
fId <- insert file
|
||||||
sfId <- insert $ SessionFile fId now
|
sfId <- insert $ SessionFile fId now
|
||||||
tellSessionJson SessionFiles . MergeHashMap . HashMap.singleton ident $ Set.singleton sfId
|
modifySessionJson SessionFiles $ \(fromMaybe mempty -> MergeHashMap old) ->
|
||||||
|
Just . MergeHashMap $ HashMap.insert ident (Set.insert sfId . maybe Set.empty (`Set.difference` oldSFIds) $ HashMap.lookup ident old) old
|
||||||
return fId
|
return fId
|
||||||
|
|
||||||
fieldEnctype = Multipart
|
fieldEnctype = Multipart
|
||||||
@ -969,17 +974,17 @@ genericFileField mkOpts = Field{..}
|
|||||||
identSecret <- for mIdent $ encodedSecretBox SecretBoxShort
|
identSecret <- for mIdent $ encodedSecretBox SecretBoxShort
|
||||||
|
|
||||||
fileInfos <- liftHandler . runDB $ do
|
fileInfos <- liftHandler . runDB $ do
|
||||||
|
(uploads, references) <- runWriterT . for val $ \src -> do
|
||||||
|
fmap Set.fromList . sourceToList
|
||||||
|
$ transPipe (lift . lift) src
|
||||||
|
.| C.mapMaybeM (either (\fId -> Nothing <$ tell (Set.singleton fId)) $ lift . handleUpload mIdent)
|
||||||
|
|
||||||
permittedFiles <- getPermittedFiles mIdent opts
|
permittedFiles <- getPermittedFiles mIdent opts
|
||||||
|
|
||||||
let
|
let
|
||||||
handleReference fId
|
sentVals :: Either Text (Set FileId)
|
||||||
| fId `Map.member` permittedFiles = return $ Just fId
|
sentVals = uploads <&> Set.union (references `Set.intersection` Map.keysSet permittedFiles)
|
||||||
| otherwise = return Nothing
|
|
||||||
|
|
||||||
sentVals <- for val $ \src ->
|
|
||||||
fmap Set.fromList . sourceToList
|
|
||||||
$ transPipe lift src
|
|
||||||
.| C.mapMaybeM (either handleReference $ handleUpload mIdent)
|
|
||||||
let
|
let
|
||||||
toFUI (E.Value fuiId', E.Value fuiTitle) = do
|
toFUI (E.Value fuiId', E.Value fuiTitle) = do
|
||||||
fuiId <- encrypt fuiId'
|
fuiId <- encrypt fuiId'
|
||||||
|
|||||||
Reference in New Issue
Block a user