diff options
-rw-r--r-- | index.html | 6 | ||||
-rw-r--r-- | lib/AppInfo/Application.php | 2 | ||||
-rw-r--r-- | lib/Controller/AttachmentController.php | 26 | ||||
-rw-r--r-- | lib/Service/AttachmentService.php | 4 | ||||
-rw-r--r-- | src/components/Editor.provider.js | 8 | ||||
-rw-r--r-- | src/components/Editor.vue | 12 | ||||
-rw-r--r-- | src/components/Menu/ActionAttachmentUpload.vue (renamed from src/components/Menu/ActionImageUpload.vue) | 2 | ||||
-rw-r--r-- | src/components/Menu/entries.js | 4 | ||||
-rw-r--r-- | src/nodes/ImageView.vue | 18 | ||||
-rw-r--r-- | src/package.js | 6 | ||||
-rw-r--r-- | src/services/AttachmentResolver.js (renamed from src/services/ImageResolver.js) | 2 | ||||
-rw-r--r-- | src/tests/services/AttachmentResolver.spec.js (renamed from src/tests/services/ImageResolver.spec.js) | 32 | ||||
-rw-r--r-- | tests/psalm-baseline.xml | 10 |
13 files changed, 70 insertions, 62 deletions
diff --git a/index.html b/index.html index be6aea332..88da39dfb 100644 --- a/index.html +++ b/index.html @@ -13,7 +13,7 @@ OC = { webroot: '/OC_WEBROOT' } </script> <script type="module"> - import { RichTextReader, ImageResolver, IMAGE_RESOLVER } from './src/package.js' + import { RichTextReader, AttachmentResolver, ATTACHMENT_RESOLVER } from './src/package.js' import Vue from 'vue' import content from './src/tests/fixtures/basic.md?raw' const app = new Vue({ @@ -25,7 +25,7 @@ provide() { const val = {} Object.defineProperties(val, { - [IMAGE_RESOLVER]: { get: () => this.$imageResolver }, + [ATTACHMENT_RESOLVER]: { get: () => this.$attachmentResolver }, }) return val }, @@ -47,7 +47,7 @@ }), ]), created() { - this.$imageResolver = new ImageResolver({ + this.$attachmentResolver = new AttachmentResolver({ currentDirectory: '/dir/', shareToken: 'SHARE_TOKEN', user: { uid: 'USER_UID' }, diff --git a/lib/AppInfo/Application.php b/lib/AppInfo/Application.php index 2b1287705..1133e8eee 100644 --- a/lib/AppInfo/Application.php +++ b/lib/AppInfo/Application.php @@ -61,7 +61,7 @@ class Application extends App implements IBootstrap { $context->registerEventListener(LoadViewer::class, LoadViewerListener::class); $context->registerEventListener(LoadAdditionalScriptsEvent::class, FilesLoadAdditionalScriptsListener::class); $context->registerEventListener(BeforeTemplateRenderedEvent::class, FilesSharingLoadAdditionalScriptsListener::class); - // for image attachments + // for attachments $context->registerEventListener(NodeCopiedEvent::class, NodeCopiedListener::class); $context->registerEventListener(BeforeNodeRenamedEvent::class, BeforeNodeRenamedListener::class); $context->registerEventListener(BeforeNodeDeletedEvent::class, BeforeNodeDeletedListener::class); diff --git a/lib/Controller/AttachmentController.php b/lib/Controller/AttachmentController.php index 501aada9d..cbe983cfa 100644 --- a/lib/Controller/AttachmentController.php +++ b/lib/Controller/AttachmentController.php @@ -211,18 +211,18 @@ class AttachmentController extends Controller { } /** - * @NoAdminRequired - * @NoCSRFRequired - * @PublicPage - * - * Serve the media files in the editor - * @param int $documentId - * @param int $sessionId - * @param string $sessionToken - * @param string $mediaFileName - * @param string|null $shareToken - * @return DataDownloadResponse|DataResponse - */ + * @NoAdminRequired + * @NoCSRFRequired + * @PublicPage + * + * Serve the media files in the editor + * @param int $documentId + * @param int $sessionId + * @param string $sessionToken + * @param string $mediaFileName + * @param string|null $shareToken + * @return DataDownloadResponse|DataResponse + */ public function getMediaFile(int $documentId, int $sessionId, string $sessionToken, string $mediaFileName, ?string $shareToken = null) { if (!$this->sessionService->isValidSession($documentId, $sessionId, $sessionToken)) { return new DataResponse('', Http::STATUS_FORBIDDEN); @@ -287,8 +287,8 @@ class AttachmentController extends Controller { } } catch (Exception $e) { $this->logger->error('getMediaFilePreview error', ['exception' => $e]); - return new DataResponse('', Http::STATUS_NOT_FOUND); } + return new DataResponse('', Http::STATUS_NOT_FOUND); } /** diff --git a/lib/Service/AttachmentService.php b/lib/Service/AttachmentService.php index 625bb34d7..1a27265ef 100644 --- a/lib/Service/AttachmentService.php +++ b/lib/Service/AttachmentService.php @@ -196,8 +196,8 @@ class AttachmentService { * @throws \OC\User\NoUserException */ public function getMediaFilePreviewPublic(int $documentId, string $mediaFileName, string $shareToken): ?array { - $textFile = $this->getTextFilePublic($documentId, $shareToken); - return $this->getMediaFilePreviewFile($mediaFileName, $textFile); + $textFile = $this->getTextFilePublic($documentId, $shareToken); + return $this->getMediaFilePreviewFile($mediaFileName, $textFile); } /** diff --git a/src/components/Editor.provider.js b/src/components/Editor.provider.js index b791075c5..132e1fd9d 100644 --- a/src/components/Editor.provider.js +++ b/src/components/Editor.provider.js @@ -22,7 +22,7 @@ export const EDITOR = Symbol('tiptap:editor') export const FILE = Symbol('editor:file') -export const IMAGE_RESOLVER = Symbol('image:resolver') +export const ATTACHMENT_RESOLVER = Symbol('attachment:resolver') export const IS_MOBILE = Symbol('editor:is-mobile') export const IS_PUBLIC = Symbol('editor:is-public') export const IS_RICH_EDITOR = Symbol('editor:is-rich-editor') @@ -78,10 +78,10 @@ export const useFileMixin = { }, } -export const useImageResolver = { +export const useAttachmentResolver = { inject: { - $imageResolver: { - from: IMAGE_RESOLVER, + $attachmentResolver: { + from: ATTACHMENT_RESOLVER, default: { resolve(src) { console.warn('No image resolver provided. Some image sources cannot be resolved.') diff --git a/src/components/Editor.vue b/src/components/Editor.vue index 4148f125f..5a881c26e 100644 --- a/src/components/Editor.vue +++ b/src/components/Editor.vue @@ -77,7 +77,7 @@ import { loadState } from '@nextcloud/initial-state' import { EDITOR, FILE, - IMAGE_RESOLVER, + ATTACHMENT_RESOLVER, IS_MOBILE, IS_PUBLIC, IS_RICH_EDITOR, @@ -86,7 +86,7 @@ import { } from './Editor.provider.js' import { SyncService, ERROR_TYPE, IDLE_TIMEOUT } from './../services/SyncService.js' -import ImageResolver from './../services/ImageResolver.js' +import AttachmentResolver from './../services/AttachmentResolver.js' import { extensionHighlight } from '../helpers/mappings.js' import { createEditor, serializePlainText, loadSyntaxHighlight } from './../EditorFactory.js' import { createMarkdownSerializer } from './../extensions/Markdown.js' @@ -139,8 +139,8 @@ export default { [FILE]: { get: () => this.fileData, }, - [IMAGE_RESOLVER]: { - get: () => this.$imageResolver, + [ATTACHMENT_RESOLVER]: { + get: () => this.$attachmentResolver, }, [IS_PUBLIC]: { get: () => this.isPublic, @@ -291,7 +291,7 @@ export default { created() { this.$editor = null this.$syncService = null - this.$imageResolver = null + this.$attachmentResolver = null this.saveStatusPolling = setInterval(() => { this.updateLastSavedStatus() }, 2000) @@ -449,7 +449,7 @@ export default { this.lock = this.$syncService.lock localStorage.setItem('nick', this.currentSession.guestName) this.$store.dispatch('setCurrentSession', this.currentSession) - this.$imageResolver = new ImageResolver({ + this.$attachmentResolver = new AttachmentResolver({ session: this.currentSession, user: getCurrentUser(), shareToken: this.shareToken, diff --git a/src/components/Menu/ActionImageUpload.vue b/src/components/Menu/ActionAttachmentUpload.vue index d0dff5234..a6f1918de 100644 --- a/src/components/Menu/ActionImageUpload.vue +++ b/src/components/Menu/ActionAttachmentUpload.vue @@ -68,7 +68,7 @@ import { } from '../Editor/MediaHandler.provider.js' export default { - name: 'ActionImageUpload', + name: 'ActionAttachmentUpload', components: { NcActions, NcActionButton, diff --git a/src/components/Menu/entries.js b/src/components/Menu/entries.js index d29c284ec..0d92f51e5 100644 --- a/src/components/Menu/entries.js +++ b/src/components/Menu/entries.js @@ -48,7 +48,7 @@ import { Images, } from '../icons.js' import EmojiPickerAction from './EmojiPickerAction.vue' -import ActionImageUpload from './ActionImageUpload.vue' +import ActionAttachmentUpload from './ActionAttachmentUpload.vue' import { MODIFIERS } from './keys.js' @@ -322,7 +322,7 @@ export default [ key: 'insert-image', label: t('text', 'Insert image'), icon: Images, - component: ActionImageUpload, + component: ActionAttachmentUpload, priority: 2, }, { diff --git a/src/nodes/ImageView.vue b/src/nodes/ImageView.vue index afacbf5c2..065482bfa 100644 --- a/src/nodes/ImageView.vue +++ b/src/nodes/ImageView.vue @@ -37,9 +37,9 @@ <div v-if="isMediaAttachment" class="media"> <img v-show="loaded" - :src="imageUrl" - class="image__main" - @load="onLoaded"> + :src="imageUrl" + class="image__main" + @load="onLoaded"> <div class="metadata"> <span class="name"> {{ alt }} @@ -107,7 +107,7 @@ import { NodeViewWrapper } from '@tiptap/vue-2' import ClickOutside from 'vue-click-outside' import { Image as ImageIcon, Delete as DeleteIcon } from '../components/icons.js' import store from './../mixins/store.js' -import { useImageResolver } from './../components/Editor.provider.js' +import { useAttachmentResolver } from './../components/Editor.provider.js' import { mimetypesImages as IMAGE_MIMES } from '../helpers/mime.js' @@ -150,7 +150,7 @@ export default { }, mixins: [ store, - useImageResolver, + useAttachmentResolver, ], props: ['editor', 'node', 'extension', 'updateAttributes', 'deleteNode'], // eslint-disable-line data() { @@ -167,7 +167,7 @@ export default { }, computed: { isMediaAttachment() { - return this.attachmentType === this.$imageResolver.ATTACHMENT_TYPE_MEDIA + return this.attachmentType === this.$attachmentResolver.ATTACHMENT_TYPE_MEDIA }, canDisplayImage() { if (!this.isSupportedImage) { @@ -235,7 +235,7 @@ export default { }, methods: { async init() { - const candidates = this.$imageResolver.resolve(this.src) + const candidates = this.$attachmentResolver.resolve(this.src) return this.load(candidates) }, async load(candidates) { @@ -256,7 +256,7 @@ export default { this.imageLoaded = true this.loaded = true this.attachmentType = attachmentType - if (attachmentType === this.$imageResolver.ATTACHMENT_TYPE_MEDIA) { + if (attachmentType === this.$attachmentResolver.ATTACHMENT_TYPE_MEDIA) { this.loadMediaMetadata(name) } resolve(imageUrl) @@ -268,7 +268,7 @@ export default { }) }, loadMediaMetadata(name) { - this.$imageResolver.getMediaMetadata(name).then((response) => { + this.$attachmentResolver.getMediaMetadata(name).then((response) => { this.attachmentMetadata = response.data }) }, diff --git a/src/package.js b/src/package.js index 60303b01a..8653d70bf 100644 --- a/src/package.js +++ b/src/package.js @@ -21,7 +21,7 @@ */ import RichTextReader from './components/RichTextReader.vue' -import ImageResolver from './services/ImageResolver.js' -import { IMAGE_RESOLVER } from './components/Editor.provider.js' +import AttachmentResolver from './services/AttachmentResolver.js' +import { ATTACHMENT_RESOLVER } from './components/Editor.provider.js' -export { RichTextReader, ImageResolver, IMAGE_RESOLVER } +export { RichTextReader, AttachmentResolver, ATTACHMENT_RESOLVER } diff --git a/src/services/ImageResolver.js b/src/services/AttachmentResolver.js index 0a356f343..10b9fa083 100644 --- a/src/services/ImageResolver.js +++ b/src/services/AttachmentResolver.js @@ -24,7 +24,7 @@ import { generateUrl, generateRemoteUrl } from '@nextcloud/router' import axios from '@nextcloud/axios' import pathNormalize from 'path-normalize' -export default class ImageResolver { +export default class AttachmentResolver { #session #user diff --git a/src/tests/services/ImageResolver.spec.js b/src/tests/services/AttachmentResolver.spec.js index 55837a8f2..8ac76501c 100644 --- a/src/tests/services/ImageResolver.spec.js +++ b/src/tests/services/AttachmentResolver.spec.js @@ -1,4 +1,4 @@ -import ImageResolver from './../../services/ImageResolver.js' +import AttachmentResolver from './../../services/AttachmentResolver.js' describe('Image resolver', () => { @@ -15,20 +15,20 @@ describe('Image resolver', () => { const shareToken = 'myShareToken' it('is a class with one constructor argument', () => { - const resolver = new ImageResolver({}) - expect(resolver).toBeInstanceOf(ImageResolver) + const resolver = new AttachmentResolver({}) + expect(resolver).toBeInstanceOf(AttachmentResolver) }) it('handles text:// urls via Text API', () => { const src = 'text://image?imageFileName=group%20pic.jpg' - const resolver = new ImageResolver({ session }) + const resolver = new AttachmentResolver({ session }) const [url] = resolver.resolve(src) expect(url).toBe('/nc-webroot/apps/text/image?documentId=4173&sessionId=456&sessionToken=mySessionToken&imageFileName=group%20pic.jpg') }) it('handles text:// urls with token via Text API', () => { const src = 'text://image?imageFileName=group%20pic.jpg' - const resolver = new ImageResolver({ + const resolver = new AttachmentResolver({ session, shareToken: 'myShareToken', }) @@ -38,7 +38,7 @@ describe('Image resolver', () => { it('uses user auth over token auth', () => { const src = 'text://image?imageFileName=group%20pic.jpg' - const resolver = new ImageResolver({ + const resolver = new AttachmentResolver({ session, user, shareToken: 'myShareToken', @@ -49,14 +49,14 @@ describe('Image resolver', () => { it('handles .attachments urls via Text API', () => { const src = `.attachments.${session.documentId}/group%20pic.jpg` - const resolver = new ImageResolver({ session }) + const resolver = new AttachmentResolver({ session }) const [url] = resolver.resolve(src) expect(url).toBe('/nc-webroot/apps/text/image?documentId=4173&sessionId=456&sessionToken=mySessionToken&imageFileName=group%20pic.jpg') }) it('handles .attachments urls with token via Text API', () => { const src = `.attachments.${session.documentId}/group%20pic.jpg` - const resolver = new ImageResolver({ + const resolver = new AttachmentResolver({ session, shareToken, }) @@ -72,7 +72,7 @@ describe('Image resolver', () => { '/core/preview.png?file=pic.jpg&x=1024&y=1024&a=true', '/apps/files_sharing/publicpreview/ASDFWERASDF?x=1024&y=1024&a=true', ] - const resolver = new ImageResolver({ }) + const resolver = new AttachmentResolver({ }) for (const src of sources) { const [url] = resolver.resolve(src) expect(url).toBe(src) @@ -81,21 +81,21 @@ describe('Image resolver', () => { it('uses fileId for preview', () => { const src = '/Media/photo.jpeg?fileId=7#mimetype=image%2Fjpeg&hasPreview=true' - const resolver = new ImageResolver({ user }) + const resolver = new AttachmentResolver({ user }) const [url] = resolver.resolve(src) expect(url).toContain('/core/preview?fileId=7') }) it('uses .png endpoint if no fileId is given', () => { const src = '/Media/photo.jpeg?mimetype=image%2Fjpeg&hasPreview=true' - const resolver = new ImageResolver({ user }) + const resolver = new AttachmentResolver({ user }) const [url] = resolver.resolve(src) expect(url).toBe('/nc-webroot/core/preview.png?file=%2FMedia%2Fphoto.jpeg&x=1024&y=1024&a=true') }) it('retrieves public preview by path', () => { const src = '/Media/photo.jpeg?fileId=7#mimetype=image%2Fjpeg&hasPreview=true' - const resolver = new ImageResolver({ + const resolver = new AttachmentResolver({ shareToken: 'SHARE_TOKEN' }) const [url] = resolver.resolve(src) @@ -104,7 +104,7 @@ describe('Image resolver', () => { it('handles old .attachments urls via webdav with text API fallback', () => { const src = `.attachments.${session.documentId + 1}/group%20pic.jpg` - const resolver = new ImageResolver({ session, user, currentDirectory }) + const resolver = new AttachmentResolver({ session, user, currentDirectory }) const [url, fallback] = resolver.resolve(src) expect(url).toBe('http://localhost/nc-webroot/remote.php/dav/files/user-uid/parentDir/.attachments.4174/group%20pic.jpg') expect(fallback).toBe('/nc-webroot/apps/text/image?documentId=4173&sessionId=456&sessionToken=mySessionToken&imageFileName=group%20pic.jpg') @@ -114,7 +114,7 @@ describe('Image resolver', () => { it('resolves text:// urls as authenticated dav', () => { const src = 'text://image?imageFileName=group%20pic.jpg' - const resolver = new ImageResolver({ + const resolver = new AttachmentResolver({ fileId: 4173, user, currentDirectory, @@ -125,7 +125,7 @@ describe('Image resolver', () => { it('resolves text:// urls as share token download', () => { const src = 'text://image?imageFileName=group%20pic.jpg' - const resolver = new ImageResolver({ + const resolver = new AttachmentResolver({ fileId, shareToken, currentDirectory, @@ -136,7 +136,7 @@ describe('Image resolver', () => { it('handles .attachments urls for other fileIds via webdav with webdav fallback', () => { const src = `.attachments.${session.documentId + 1}/group%20pic.jpg` - const resolver = new ImageResolver({ user, currentDirectory, fileId }) + const resolver = new AttachmentResolver({ user, currentDirectory, fileId }) const [url, fallback] = resolver.resolve(src) expect(url).toBe('http://localhost/nc-webroot/remote.php/dav/files/user-uid/parentDir/.attachments.4174/group%20pic.jpg') expect(fallback).toBe('http://localhost/nc-webroot/remote.php/dav/files/user-uid/parentDir/.attachments.4173/group%20pic.jpg') diff --git a/tests/psalm-baseline.xml b/tests/psalm-baseline.xml index ce87d40b5..4280c4a47 100644 --- a/tests/psalm-baseline.xml +++ b/tests/psalm-baseline.xml @@ -86,7 +86,15 @@ <code>ConnectException</code> <code>ServerException</code> </UndefinedClass> - <UndefinedDocblockClass occurrences="8"> + <UndefinedDocblockClass occurrences="16"> + <code>\OC\User\NoUserException</code> + <code>\OC\User\NoUserException</code> + <code>\OC\User\NoUserException</code> + <code>\OC\User\NoUserException</code> + <code>\OC\User\NoUserException</code> + <code>\OC\User\NoUserException</code> + <code>\OC\User\NoUserException</code> + <code>\OC\User\NoUserException</code> <code>\OC\User\NoUserException</code> <code>\OC\User\NoUserException</code> <code>\OC\User\NoUserException</code> |