diff --git a/plugins/attachment-resources/src/index.ts b/plugins/attachment-resources/src/index.ts index 86ddc95acd..51b17a7f1f 100644 --- a/plugins/attachment-resources/src/index.ts +++ b/plugins/attachment-resources/src/index.ts @@ -17,7 +17,7 @@ import AttachmentsPresenter from './components/AttachmentsPresenter.svelte' import AttachmentPresenter from './components/AttachmentPresenter.svelte' import TxAttachmentCreate from './components/activity/TxAttachmentCreate.svelte' import Attachments from './components/Attachments.svelte' -import { uploadFile } from './utils' +import { uploadFile, deleteFile } from './utils' export { Attachments, AttachmentsPresenter } @@ -31,6 +31,7 @@ export default async () => ({ TxAttachmentCreate }, helper: { - UploadFile: uploadFile + UploadFile: uploadFile, + DeleteFile: deleteFile } }) diff --git a/plugins/attachment-resources/src/utils.ts b/plugins/attachment-resources/src/utils.ts index 787fb3eddc..d04cef4c9d 100644 --- a/plugins/attachment-resources/src/utils.ts +++ b/plugins/attachment-resources/src/utils.ts @@ -45,3 +45,19 @@ export async function uploadFile (file: File, space?: Ref, attachedTo?: R console.log(uuid) return uuid } + +export async function deleteFile (id: string): Promise { + const uploadUrl = getMetadata(login.metadata.UploadUrl) + + const url = `${uploadUrl as string}?file=${id}` + const resp = await fetch(url, { + method: 'DELETE', + headers: { + Authorization: 'Bearer ' + (getMetadata(login.metadata.LoginToken) as string) + } + }) + + if (resp.status !== 200) { + throw new Error('Failed to delete file') + } +} diff --git a/plugins/attachment/src/index.ts b/plugins/attachment/src/index.ts index 677790c096..40345eaf56 100644 --- a/plugins/attachment/src/index.ts +++ b/plugins/attachment/src/index.ts @@ -46,6 +46,7 @@ export default plugin(attachmentId, { Attachment: '' as Ref> }, helper: { - UploadFile: '' as Resource<(file: File, space?: Ref, attachedTo?: Ref) => Promise> + UploadFile: '' as Resource<(file: File, space?: Ref, attachedTo?: Ref) => Promise>, + DeleteFile: '' as Resource<(id: string) => Promise> } }) diff --git a/plugins/contact-resources/src/components/EditPerson.svelte b/plugins/contact-resources/src/components/EditPerson.svelte index 7a47e022e5..2052ac33c5 100644 --- a/plugins/contact-resources/src/components/EditPerson.svelte +++ b/plugins/contact-resources/src/components/EditPerson.svelte @@ -66,8 +66,12 @@ async function onAvatarDone (e: any) { const uploadFile = await getResource(attachment.helper.UploadFile) + const deleteFile = await getResource(attachment.helper.DeleteFile) const { file: avatar } = e.detail + if (object.avatar != null) { + await deleteFile(object.avatar) + } const uuid = await uploadFile(avatar) await client.updateDoc(object._class, object.space, object._id, { avatar: uuid diff --git a/server/front/src/app.ts b/server/front/src/app.ts index 4bfb4dbf35..4a779c547b 100644 --- a/server/front/src/app.ts +++ b/server/front/src/app.ts @@ -198,6 +198,28 @@ export function start (config: { transactorEndpoint: string, elasticUrl: string, } }) + // eslint-disable-next-line @typescript-eslint/no-misused-promises + app.delete('/files', async (req, res) => { + try { + const authHeader = req.headers.authorization + if (authHeader === undefined) { + res.status(403).send() + return + } + + const token = authHeader.split(' ')[1] + const payload = decode(token ?? '', 'secret', false) as Token + const uuid = req.query.file as string + + await config.minio.removeObject(payload.workspace, uuid) + + res.status(200).send() + } catch (error) { + console.log(error) + res.status(500).send() + } + }) + app.get('/import', (req, res) => { const authHeader = req.headers.authorization if (authHeader === undefined) {