I'm working on a project with vapor and I'm trying to make a function who edit an item with multiples pictures and I don't know how to make it properly for making update the pictures.
Currently, my func is really really lengthy (200 lines :o and I want to add others pictures) and I didn't how to do more properly.
Thanks you for any help :)
''''
func editItemPostHandler(_ req: Request) throws
-> EventLoopFuture<Response> {
let updateData =
try req.content.decode(CreateItemFormData.self)
return Item
.find(req.parameters.get("itemID"), on: req.db)
.unwrap(or: Abort(.notFound)).flatMap { item in
// 3
item.title = updateData.title
item.price = updateData.price
item.description = updateData.description
item.condition = updateData.condition
item.weight = updateData.weight
item.$category.id = updateData.categoryID
item.$size.id = updateData.sizeID
item.$genderCollection.id = updateData.collectionGenderID
item.$brand.id = updateData.brandID
if !updateData.picture.isEmpty && !updateData.frontPicture.isEmpty {
let imageName = "\(UUID()).jpg"
let NewPath =
req.application.directory.workingDirectory +
imageFolder + imageName
let frontPictureImageName = "\(UUID()).jpg"
let frontPictureNewPath =
req.application.directory.workingDirectory +
imageFolder + frontPictureImageName
return req.fileio
.writeFile(.init(data: updateData.picture), at: NewPath)
.flatMap {
return req.fileio
.writeFile(.init(data: updateData.frontPicture), at: frontPictureNewPath)
.flatMap {
return Item
.find(req.parameters.get("itemID"), on: req.db)
.unwrap(or: Abort(.notFound)).flatMapThrowing
{ item in
let filename = item.pictures
// 3 3. Construct the path of the picture.
let oldPicturePath = req.application.directory
.workingDirectory + imageFolder + filename
let frontPicturefilename = item.frontPicture
// 3 3. Construct the path of the picture.
let oldFrontPicturePath = req.application.directory
.workingDirectory + imageFolder + frontPicturefilename
do {
try FileManager.default.removeItem(atPath: oldPicturePath)
try FileManager.default.removeItem(atPath: oldFrontPicturePath)
}
item.pictures = imageName
item.frontPicture = frontPictureImageName
return item
}
.flatMap {
(item: Item) -> EventLoopFuture<Response> in
guard let id = item.id else {
let error = Abort(.internalServerError)
return req.eventLoop.future(error: error)
}
// 5
let redirect = req.redirect(to: "/items/\(id)")
return item.save(on: req.db).transform(to: redirect)
}
}
}
}
else if !updateData.picture.isEmpty {
let imageName = "\(UUID()).jpg"
let NewPath =
req.application.directory.workingDirectory +
imageFolder + imageName
return req.fileio
.writeFile(.init(data: updateData.picture), at: NewPath)
.flatMap {
return Item
.find(req.parameters.get("itemID"), on: req.db)
.unwrap(or: Abort(.notFound)).flatMapThrowing
{ item in
let filename = item.pictures
let oldPicturePath = req.application.directory
.workingDirectory + imageFolder + filename
do {
try FileManager.default.removeItem(atPath: oldPicturePath)
}
item.pictures = imageName
return item
}
.flatMap {
(item: Item) -> EventLoopFuture<Response> in
guard let id = item.id else {
let error = Abort(.internalServerError)
return req.eventLoop.future(error: error)
}
// 5
let redirect = req.redirect(to: "/items/\(id)")
return item.save(on: req.db).transform(to: redirect)
}
}
}
else if !updateData.frontPicture.isEmpty {
let frontPictureImageName = "\(UUID()).jpg"
let frontPictureNewPath =
req.application.directory.workingDirectory +
imageFolder + frontPictureImageName
return req.fileio
.writeFile(.init(data: updateData.frontPicture), at: frontPictureNewPath)
.flatMap {
return Item
.find(req.parameters.get("itemID"), on: req.db)
.unwrap(or: Abort(.notFound)).flatMapThrowing
{ item in
let frontPicturefilename = item.frontPicture
// 3 3. Construct the path of the picture.
let oldFrontPicturePath = req.application.directory
.workingDirectory + imageFolder + frontPicturefilename
do {
try FileManager.default.removeItem(atPath: oldFrontPicturePath)
}
item.frontPicture = frontPictureImageName
return item
}
.flatMap {
(item: Item) -> EventLoopFuture<Response> in
guard let id = item.id else {
let error = Abort(.internalServerError)
return req.eventLoop.future(error: error)
}
let redirect = req.redirect(to: "/items/\(id)")
return item.save(on: req.db).transform(to: redirect)
}
}
}
else {
guard let id = item.id else {
let error = Abort(.internalServerError)
return req.eventLoop.future(error: error)
}
let redirect = req.redirect(to: "/items/\(id)")
return item.save(on: req.db).transform(to: redirect)
}
}
}
'''
Thanks you for your help.
Emmanuel