committed by
Julius Härtl
parent
1e3ff41cb2
commit
725f99d8b8
@@ -21,16 +21,24 @@
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCA\Deck;
|
||||
namespace OCA\Deck\Exceptions;
|
||||
|
||||
use OCA\Deck\StatusException;
|
||||
|
||||
class ConflictException extends \Exception {
|
||||
class ConflictException extends StatusException {
|
||||
|
||||
public function __construct($message) {
|
||||
private $data;
|
||||
|
||||
public function __construct($message, $data = null) {
|
||||
parent::__construct($message);
|
||||
$this->data = $data;
|
||||
}
|
||||
|
||||
public function getStatus() {
|
||||
return 409;
|
||||
}
|
||||
|
||||
public function getData() {
|
||||
return $this->data;
|
||||
}
|
||||
}
|
||||
@@ -25,6 +25,7 @@ namespace OCA\Deck\Middleware;
|
||||
|
||||
use OCA\Deck\Controller\PageController;
|
||||
use OCA\Deck\StatusException;
|
||||
use OCA\Deck\Exceptions\ConflictException;
|
||||
use OCP\AppFramework\Db\DoesNotExistException;
|
||||
use OCP\AppFramework\Middleware;
|
||||
use OCP\AppFramework\Http\JSONResponse;
|
||||
@@ -63,6 +64,17 @@ class ExceptionMiddleware extends Middleware {
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function afterException($controller, $methodName, \Exception $exception) {
|
||||
if ($exception instanceof ConflictException) {
|
||||
if ($this->config->getSystemValue('loglevel', Util::WARN) === Util::DEBUG) {
|
||||
$this->logger->logException($exception);
|
||||
}
|
||||
return new JSONResponse([
|
||||
'status' => $exception->getStatus(),
|
||||
'message' => $exception->getMessage(),
|
||||
'data' => $exception->getData(),
|
||||
], $exception->getStatus());
|
||||
}
|
||||
|
||||
if ($exception instanceof StatusException) {
|
||||
if ($this->config->getSystemValue('loglevel', Util::WARN) === Util::DEBUG) {
|
||||
$this->logger->logException($exception);
|
||||
|
||||
@@ -26,6 +26,7 @@ namespace OCA\Deck\Service;
|
||||
use OC\Security\CSP\ContentSecurityPolicyManager;
|
||||
use OCA\Deck\Db\Attachment;
|
||||
use OCA\Deck\StatusException;
|
||||
use OCA\Deck\Exceptions\ConflictException;
|
||||
use OCP\AppFramework\Http\ContentSecurityPolicy;
|
||||
use OCP\AppFramework\Http\EmptyContentSecurityPolicy;
|
||||
use OCP\AppFramework\Http\FileDisplayResponse;
|
||||
@@ -42,7 +43,7 @@ use OCP\IConfig;
|
||||
use OCP\IL10N;
|
||||
use OCP\ILogger;
|
||||
use OCP\IRequest;
|
||||
use OCP\Deck\ConflictException;
|
||||
|
||||
|
||||
class FileService implements IAttachmentService {
|
||||
|
||||
@@ -154,7 +155,7 @@ class FileService implements IAttachmentService {
|
||||
$folder = $this->getFolder($attachment);
|
||||
$fileName = $file['name'];
|
||||
if ($folder->fileExists($fileName)) {
|
||||
throw new ConflictException('File already exists.');
|
||||
throw new ConflictException('File already exists.', $attachment);
|
||||
}
|
||||
|
||||
$target = $folder->newFile($fileName);
|
||||
|
||||
@@ -45,17 +45,38 @@
|
||||
type="file"
|
||||
style="display: none;"
|
||||
@change="onLocalAttachmentSelected">
|
||||
|
||||
<Modal v-if="modalShow" title="File already exists" @close="modalShow=false">
|
||||
<div class="modal__content">
|
||||
<h2>{{ t('deck', 'File already exists') }}</h2>
|
||||
<p>
|
||||
{{ t('deck', 'A file with the name') }}
|
||||
{{ file.name }}
|
||||
{{ t('deck', 'already exists.') }}
|
||||
</p>
|
||||
<p>
|
||||
{{ t('deck', 'Do you want to overwrite it?') }}
|
||||
</p>
|
||||
<button class="primary" @click="overrideAttachment">
|
||||
{{ t('deck', 'Yes') }}
|
||||
</button>
|
||||
<button @click="modalShow=false">
|
||||
{{ t('deck', 'No') }}
|
||||
</button>
|
||||
</div>
|
||||
</Modal>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { Actions, ActionButton } from '@nextcloud/vue'
|
||||
import { Actions, ActionButton, Modal } from '@nextcloud/vue'
|
||||
|
||||
export default {
|
||||
name: 'CardSidebarTabAttachments',
|
||||
components: {
|
||||
Actions,
|
||||
ActionButton,
|
||||
Modal,
|
||||
},
|
||||
props: {
|
||||
card: {
|
||||
@@ -65,6 +86,9 @@ export default {
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
modalShow: false,
|
||||
file: '',
|
||||
overrideError: null
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
@@ -85,11 +109,12 @@ export default {
|
||||
bodyFormData.append('cardId', this.card.id)
|
||||
bodyFormData.append('type', 'deck_file')
|
||||
bodyFormData.append('file', e.target.files[0])
|
||||
this.file = e.target.files[0]
|
||||
try {
|
||||
await this.$store.dispatch('createAttachment', { cardId: this.card.id, formData: bodyFormData })
|
||||
const data = await this.$store.dispatch('createAttachment', { cardId: this.card.id, formData: bodyFormData })
|
||||
console.log(data)
|
||||
} catch (e) {
|
||||
console.log("doppelt")
|
||||
console.log(e)
|
||||
this.modalShow = true
|
||||
}
|
||||
},
|
||||
deleteAttachment(attachment) {
|
||||
@@ -105,6 +130,15 @@ export default {
|
||||
attachmentUrl(attachment) {
|
||||
return OC.generateUrl(`/apps/deck/cards/${attachment.cardId}/attachment/${attachment.id}`)
|
||||
},
|
||||
overrideAttachment() {
|
||||
const bodyFormData = new FormData()
|
||||
bodyFormData.append('cardId', this.card.id)
|
||||
bodyFormData.append('type', 'deck_file')
|
||||
bodyFormData.append('file', this.file)
|
||||
this.$store.dispatch('updateAttachment', { cardId: this.card.id, attachmentId: 1, formData: bodyFormData })
|
||||
|
||||
this.modalShow = false
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
@@ -117,4 +151,16 @@ export default {
|
||||
height: 32px;
|
||||
background-size: contain;
|
||||
}
|
||||
.modal__content {
|
||||
width: 25vw;
|
||||
min-width: 250px;
|
||||
height: 120px;
|
||||
text-align: center;
|
||||
margin: 20px 20px 60px 20px;
|
||||
}
|
||||
|
||||
.modal__content button {
|
||||
float: right;
|
||||
margin: 40px 3px 3px 0;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -38,7 +38,7 @@ export class AttachmentApi {
|
||||
}
|
||||
|
||||
async createAttachment({ cardId, formData }) {
|
||||
const response = await axios({
|
||||
const response = await axios({
|
||||
method: 'POST',
|
||||
url: this.url(`/cards/${cardId}/attachment`),
|
||||
data: formData,
|
||||
@@ -46,6 +46,15 @@ export class AttachmentApi {
|
||||
return response.data
|
||||
}
|
||||
|
||||
async updateAttachment({ cardId, attachmentId, formData }) {
|
||||
const response = await axios({
|
||||
method: 'PUT',
|
||||
url: this.url(`/cards/${cardId}/attachment/${attachmentId}`),
|
||||
data: formData,
|
||||
})
|
||||
return response.data
|
||||
}
|
||||
|
||||
async deleteAttachment(attachment) {
|
||||
await axios({
|
||||
method: 'DELETE',
|
||||
|
||||
@@ -47,6 +47,10 @@ export default {
|
||||
}
|
||||
},
|
||||
|
||||
updateAttachment(state, { cardId, attachment }) {
|
||||
Vue.set(state.attachments, cardId, attachment)
|
||||
},
|
||||
|
||||
deleteAttachment(state, deletedAttachment) {
|
||||
const existingIndex = state.attachments[deletedAttachment.cardId].findIndex(a => a.id === deletedAttachment.id)
|
||||
if (existingIndex !== -1) {
|
||||
@@ -67,6 +71,11 @@ export default {
|
||||
commit('cardIncreaseAttachmentCount', cardId)
|
||||
},
|
||||
|
||||
async updateAttachment({ commit }, { cardId, attachmentId, formData }) {
|
||||
const attachment = await apiClient.updateAttachment({ cardId, attachmentId, formData })
|
||||
commit('updateAttachment', { cardId, attachment })
|
||||
},
|
||||
|
||||
async deleteAttachment({ commit }, attachment) {
|
||||
await apiClient.deleteAttachment(attachment)
|
||||
commit('deleteAttachment', attachment)
|
||||
|
||||
Reference in New Issue
Block a user