Robert Schäfer 00da9e8ecb
feat(backend): resize images with imagor (#8558)
* feat(backend): resize images with imagor

Open questions:
* Do we have external URLs for images? E.g. we have them for seeds. But
  in production?

* Do we want to apply image transformations on these as well? My current
implementation does not apply image transformations as of now. If we
want to do that, we will also expose internal URLs in the kubernetes
Cluster to the S3 endpoint to the client.

TODOs:
* The chat component is using a fixed size for all avatars at the moment.
Maybe we can pair-program on this how to implement responsive images in
this component library.

Commits:
* do not replace upload domain url in the database

* fix all webapp specs

* refactor: remove behaviour we won't need

We don't want to apply image transformations on files, right?

* refactor: replace the domain on read not on write

* wip: webapp fixes

* refactor(backend): add another url to config

I've given up. There seems to be no nice way to tell the minio to return
a location which differs from it's host name.

* refactor: add test for s3Service

* refactor(backend): proxy minio via backend in local development

Commits:
* provide tests for message attachments
* remove S3_PUBLIC_URL config value

* refactor: follow @ulfgebhardt's review

* add missing environment variable

---------

Co-authored-by: Ulf Gebhardt <ulf.gebhardt@webcraft-media.de>
2025-08-19 10:11:12 +02:00

1203 lines
27 KiB
Plaintext

// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`UserTeaser given an user avatar is disabled does not render the avatar 1`] = `
<div>
<div
class=""
placement="top-start"
>
<client-only-stub>
<v-popover-stub
autohide="true"
class="user-teaser"
container="body"
delay="0"
handleresize="true"
offset="16"
openclass="open"
opengroup="0"
placement="bottom-end"
popoverarrowclass="tooltip-arrow popover-arrow"
popoverbaseclass="tooltip popover"
popoverclass="vue-popover-theme"
popoverinnerclass="tooltip-inner popover-inner"
popoverwrapperclass="wrapper"
popperoptions="[object Object]"
trigger="manual"
>
<!---->
<div
class="info flex-direction-column"
>
<div
class="flex-direction-column"
>
<a>
<span
class="slug"
>
@tilda-swinton
</span>
<span
class="name"
>
Tilda Swinton
</span>
</a>
<!---->
<!---->
<span>
<!---->
</span>
</div>
<!---->
</div>
<div />
</v-popover-stub>
</client-only-stub>
</div>
</div>
`;
exports[`UserTeaser given an user user is deleted even if the current user is a moderator renders anonymous user 1`] = `
<div>
<div
class="user-teaser"
>
<div
class="profile-avatar --small --no-image"
>
<span
class="initials"
>
</span>
<span
class="base-icon"
>
<!---->
</span>
<!---->
</div>
<span
class="info anonymous"
>
profile.userAnonym
</span>
</div>
</div>
`;
exports[`UserTeaser given an user user is deleted renders anonymous user 1`] = `
<div>
<div
class="user-teaser"
>
<div
class="profile-avatar --small --no-image"
>
<span
class="initials"
>
</span>
<span
class="base-icon"
>
<!---->
</span>
<!---->
</div>
<span
class="info anonymous"
>
profile.userAnonym
</span>
</div>
</div>
`;
exports[`UserTeaser given an user user is disabled current user is a moderator renders user name 1`] = `
<div>
<div
class="disabled-content"
placement="top-start"
>
<client-only-stub>
<v-popover-stub
autohide="true"
class="user-teaser"
container="body"
delay="0"
handleresize="true"
offset="16"
openclass="open"
opengroup="0"
placement="bottom-end"
popoverarrowclass="tooltip-arrow popover-arrow"
popoverbaseclass="tooltip popover"
popoverclass="vue-popover-theme"
popoverinnerclass="tooltip-inner popover-inner"
popoverwrapperclass="wrapper"
popperoptions="[object Object]"
trigger="manual"
>
<a
data-test="avatarUserLink"
>
<div
class="profile-avatar --small"
>
<span
class="initials"
>
TS
</span>
<!---->
<img
alt="Tilda Swinton"
class="image"
sizes="320px"
src="/avatars/tilda-swinton"
srcset="/avatars/tilda-swinton-w320 320w, /avatars/tilda-swinton-w640 640w, /avatars/tilda-swinton-w1024 1024w"
title="Tilda Swinton"
/>
</div>
</a>
<div
class="info flex-direction-column"
>
<div
class="flex-direction-column"
>
<a>
<span
class="slug"
>
@tilda-swinton
</span>
<span
class="name"
>
Tilda Swinton
</span>
</a>
<!---->
<!---->
<span>
<!---->
</span>
</div>
<!---->
</div>
<div />
</v-popover-stub>
</client-only-stub>
</div>
</div>
`;
exports[`UserTeaser given an user user is disabled renders anonymous user 1`] = `
<div>
<div
class="user-teaser"
>
<div
class="profile-avatar --small --no-image"
>
<span
class="initials"
>
</span>
<span
class="base-icon"
>
<!---->
</span>
<!---->
</div>
<span
class="info anonymous"
>
profile.userAnonym
</span>
</div>
</div>
`;
exports[`UserTeaser given an user with linkToProfile, on desktop renders 1`] = `
<div>
<div
class=""
placement="top-start"
>
<client-only-stub>
<v-popover-stub
autohide="true"
class="user-teaser"
container="body"
delay="0"
handleresize="true"
offset="16"
openclass="open"
opengroup="0"
placement="bottom-end"
popoverarrowclass="tooltip-arrow popover-arrow"
popoverbaseclass="tooltip popover"
popoverclass="vue-popover-theme"
popoverinnerclass="tooltip-inner popover-inner"
popoverwrapperclass="wrapper"
popperoptions="[object Object]"
trigger="manual"
>
<a
data-test="avatarUserLink"
>
<div
class="profile-avatar --small"
>
<span
class="initials"
>
TS
</span>
<!---->
<img
alt="Tilda Swinton"
class="image"
sizes="320px"
src="/avatars/tilda-swinton"
srcset="/avatars/tilda-swinton-w320 320w, /avatars/tilda-swinton-w640 640w, /avatars/tilda-swinton-w1024 1024w"
title="Tilda Swinton"
/>
</div>
</a>
<div
class="info flex-direction-column"
>
<div
class="flex-direction-column"
>
<a>
<span
class="slug"
>
@tilda-swinton
</span>
<span
class="name"
>
Tilda Swinton
</span>
</a>
<!---->
<!---->
<span>
<!---->
</span>
</div>
<!---->
</div>
<div />
</v-popover-stub>
</client-only-stub>
</div>
</div>
`;
exports[`UserTeaser given an user with linkToProfile, on desktop when hovering the user name renders the popover 1`] = `
<div>
<div
class=""
placement="top-start"
>
<client-only-stub>
<v-popover-stub
autohide="true"
class="user-teaser"
container="body"
delay="0"
handleresize="true"
offset="16"
openclass="open"
opengroup="0"
placement="bottom-end"
popoverarrowclass="tooltip-arrow popover-arrow"
popoverbaseclass="tooltip popover"
popoverclass="vue-popover-theme"
popoverinnerclass="tooltip-inner popover-inner"
popoverwrapperclass="wrapper"
popperoptions="[object Object]"
trigger="manual"
>
<a
data-test="avatarUserLink"
>
<div
class="profile-avatar --small"
>
<span
class="initials"
>
TS
</span>
<!---->
<img
alt="Tilda Swinton"
class="image"
sizes="320px"
src="/avatars/tilda-swinton"
srcset="/avatars/tilda-swinton-w320 320w, /avatars/tilda-swinton-w640 640w, /avatars/tilda-swinton-w1024 1024w"
title="Tilda Swinton"
/>
</div>
</a>
<div
class="info flex-direction-column"
>
<div
class="flex-direction-column"
>
<a>
<span
class="slug"
>
@tilda-swinton
</span>
<span
class="name"
>
Tilda Swinton
</span>
</a>
<!---->
<!---->
<span>
<!---->
</span>
</div>
<!---->
</div>
<div />
</v-popover-stub>
</client-only-stub>
</div>
</div>
`;
exports[`UserTeaser given an user with linkToProfile, on touch screen renders 1`] = `
<div>
<div
class=""
placement="top-start"
>
<client-only-stub>
<v-popover-stub
autohide="true"
class="user-teaser"
container="body"
delay="0"
handleresize="true"
offset="16"
openclass="open"
opengroup="0"
placement="bottom-end"
popoverarrowclass="tooltip-arrow popover-arrow"
popoverbaseclass="tooltip popover"
popoverclass="vue-popover-theme"
popoverinnerclass="tooltip-inner popover-inner"
popoverwrapperclass="wrapper"
popperoptions="[object Object]"
trigger="manual"
>
<button
data-test="avatarUserLink"
>
<div
class="profile-avatar --small"
>
<span
class="initials"
>
TS
</span>
<!---->
<img
alt="Tilda Swinton"
class="image"
sizes="320px"
src="/avatars/tilda-swinton"
srcset="/avatars/tilda-swinton-w320 320w, /avatars/tilda-swinton-w640 640w, /avatars/tilda-swinton-w1024 1024w"
title="Tilda Swinton"
/>
</div>
</button>
<div
class="info flex-direction-column"
>
<div
class="flex-direction-column"
>
<button>
<span
class="slug"
>
@tilda-swinton
</span>
<span
class="name"
>
Tilda Swinton
</span>
</button>
<!---->
<!---->
<span>
<!---->
</span>
</div>
<!---->
</div>
<div />
</v-popover-stub>
</client-only-stub>
</div>
</div>
`;
exports[`UserTeaser given an user with linkToProfile, on touch screen when clicking the user name renders the popover 1`] = `
<div>
<div
class=""
placement="top-start"
>
<client-only-stub>
<v-popover-stub
autohide="true"
class="user-teaser"
container="body"
delay="0"
handleresize="true"
offset="16"
open="true"
openclass="open"
opengroup="0"
placement="bottom-end"
popoverarrowclass="tooltip-arrow popover-arrow"
popoverbaseclass="tooltip popover"
popoverclass="vue-popover-theme"
popoverinnerclass="tooltip-inner popover-inner"
popoverwrapperclass="wrapper"
popperoptions="[object Object]"
trigger="manual"
>
<button
data-test="avatarUserLink"
>
<div
class="profile-avatar --small"
>
<span
class="initials"
>
TS
</span>
<!---->
<img
alt="Tilda Swinton"
class="image"
sizes="320px"
src="/avatars/tilda-swinton"
srcset="/avatars/tilda-swinton-w320 320w, /avatars/tilda-swinton-w640 640w, /avatars/tilda-swinton-w1024 1024w"
title="Tilda Swinton"
/>
</div>
</button>
<div
class="info flex-direction-column"
>
<div
class="flex-direction-column"
>
<button>
<span
class="slug"
>
@tilda-swinton
</span>
<span
class="name"
>
Tilda Swinton
</span>
</button>
<!---->
<!---->
<span>
<!---->
</span>
</div>
<!---->
</div>
<div>
<user-teaser-popover-stub
user-id="user1"
user-link="[object Object]"
/>
</div>
</v-popover-stub>
</client-only-stub>
</div>
</div>
`;
exports[`UserTeaser given an user without linkToProfile, on desktop renders 1`] = `
<div>
<div
class=""
placement="top-start"
>
<client-only-stub>
<v-popover-stub
autohide="true"
class="user-teaser"
container="body"
delay="0"
handleresize="true"
offset="16"
openclass="open"
opengroup="0"
placement="bottom-end"
popoverarrowclass="tooltip-arrow popover-arrow"
popoverbaseclass="tooltip popover"
popoverclass="vue-popover-theme"
popoverinnerclass="tooltip-inner popover-inner"
popoverwrapperclass="wrapper"
popperoptions="[object Object]"
trigger="manual"
>
<span
data-test="avatarUserLink"
>
<div
class="profile-avatar --small"
>
<span
class="initials"
>
TS
</span>
<!---->
<img
alt="Tilda Swinton"
class="image"
sizes="320px"
src="/avatars/tilda-swinton"
srcset="/avatars/tilda-swinton-w320 320w, /avatars/tilda-swinton-w640 640w, /avatars/tilda-swinton-w1024 1024w"
title="Tilda Swinton"
/>
</div>
</span>
<div
class="info flex-direction-column"
>
<div
class="flex-direction-column"
>
<span>
<span
class="slug"
>
@tilda-swinton
</span>
<span
class="name"
>
Tilda Swinton
</span>
</span>
<!---->
<!---->
<span>
<!---->
</span>
</div>
<!---->
</div>
<div />
</v-popover-stub>
</client-only-stub>
</div>
</div>
`;
exports[`UserTeaser given an user without linkToProfile, on desktop when hovering the user avatar renders the popover 1`] = `
<div>
<div
class=""
placement="top-start"
>
<client-only-stub>
<v-popover-stub
autohide="true"
class="user-teaser"
container="body"
delay="0"
handleresize="true"
offset="16"
openclass="open"
opengroup="0"
placement="bottom-end"
popoverarrowclass="tooltip-arrow popover-arrow"
popoverbaseclass="tooltip popover"
popoverclass="vue-popover-theme"
popoverinnerclass="tooltip-inner popover-inner"
popoverwrapperclass="wrapper"
popperoptions="[object Object]"
trigger="manual"
>
<span
data-test="avatarUserLink"
>
<div
class="profile-avatar --small"
>
<span
class="initials"
>
TS
</span>
<!---->
<img
alt="Tilda Swinton"
class="image"
sizes="320px"
src="/avatars/tilda-swinton"
srcset="/avatars/tilda-swinton-w320 320w, /avatars/tilda-swinton-w640 640w, /avatars/tilda-swinton-w1024 1024w"
title="Tilda Swinton"
/>
</div>
</span>
<div
class="info flex-direction-column"
>
<div
class="flex-direction-column"
>
<span>
<span
class="slug"
>
@tilda-swinton
</span>
<span
class="name"
>
Tilda Swinton
</span>
</span>
<!---->
<!---->
<span>
<!---->
</span>
</div>
<!---->
</div>
<div />
</v-popover-stub>
</client-only-stub>
</div>
</div>
`;
exports[`UserTeaser given an user without linkToProfile, on desktop when hovering the user name renders the popover 1`] = `
<div>
<div
class=""
placement="top-start"
>
<client-only-stub>
<v-popover-stub
autohide="true"
class="user-teaser"
container="body"
delay="0"
handleresize="true"
offset="16"
openclass="open"
opengroup="0"
placement="bottom-end"
popoverarrowclass="tooltip-arrow popover-arrow"
popoverbaseclass="tooltip popover"
popoverclass="vue-popover-theme"
popoverinnerclass="tooltip-inner popover-inner"
popoverwrapperclass="wrapper"
popperoptions="[object Object]"
trigger="manual"
>
<span
data-test="avatarUserLink"
>
<div
class="profile-avatar --small"
>
<span
class="initials"
>
TS
</span>
<!---->
<img
alt="Tilda Swinton"
class="image"
sizes="320px"
src="/avatars/tilda-swinton"
srcset="/avatars/tilda-swinton-w320 320w, /avatars/tilda-swinton-w640 640w, /avatars/tilda-swinton-w1024 1024w"
title="Tilda Swinton"
/>
</div>
</span>
<div
class="info flex-direction-column"
>
<div
class="flex-direction-column"
>
<span>
<span
class="slug"
>
@tilda-swinton
</span>
<span
class="name"
>
Tilda Swinton
</span>
</span>
<!---->
<!---->
<span>
<!---->
</span>
</div>
<!---->
</div>
<div />
</v-popover-stub>
</client-only-stub>
</div>
</div>
`;
exports[`UserTeaser given an user without linkToProfile, on touch screen renders 1`] = `
<div>
<div
class=""
placement="top-start"
>
<client-only-stub>
<v-popover-stub
autohide="true"
class="user-teaser"
container="body"
delay="0"
handleresize="true"
offset="16"
openclass="open"
opengroup="0"
placement="bottom-end"
popoverarrowclass="tooltip-arrow popover-arrow"
popoverbaseclass="tooltip popover"
popoverclass="vue-popover-theme"
popoverinnerclass="tooltip-inner popover-inner"
popoverwrapperclass="wrapper"
popperoptions="[object Object]"
trigger="manual"
>
<button
data-test="avatarUserLink"
>
<div
class="profile-avatar --small"
>
<span
class="initials"
>
TS
</span>
<!---->
<img
alt="Tilda Swinton"
class="image"
sizes="320px"
src="/avatars/tilda-swinton"
srcset="/avatars/tilda-swinton-w320 320w, /avatars/tilda-swinton-w640 640w, /avatars/tilda-swinton-w1024 1024w"
title="Tilda Swinton"
/>
</div>
</button>
<div
class="info flex-direction-column"
>
<div
class="flex-direction-column"
>
<button>
<span
class="slug"
>
@tilda-swinton
</span>
<span
class="name"
>
Tilda Swinton
</span>
</button>
<!---->
<!---->
<span>
<!---->
</span>
</div>
<!---->
</div>
<div />
</v-popover-stub>
</client-only-stub>
</div>
</div>
`;
exports[`UserTeaser given an user without linkToProfile, on touch screen when clicking the user avatar renders the popover 1`] = `
<div>
<div
class=""
placement="top-start"
>
<client-only-stub>
<v-popover-stub
autohide="true"
class="user-teaser"
container="body"
delay="0"
handleresize="true"
offset="16"
open="true"
openclass="open"
opengroup="0"
placement="bottom-end"
popoverarrowclass="tooltip-arrow popover-arrow"
popoverbaseclass="tooltip popover"
popoverclass="vue-popover-theme"
popoverinnerclass="tooltip-inner popover-inner"
popoverwrapperclass="wrapper"
popperoptions="[object Object]"
trigger="manual"
>
<button
data-test="avatarUserLink"
>
<div
class="profile-avatar --small"
>
<span
class="initials"
>
TS
</span>
<!---->
<img
alt="Tilda Swinton"
class="image"
sizes="320px"
src="/avatars/tilda-swinton"
srcset="/avatars/tilda-swinton-w320 320w, /avatars/tilda-swinton-w640 640w, /avatars/tilda-swinton-w1024 1024w"
title="Tilda Swinton"
/>
</div>
</button>
<div
class="info flex-direction-column"
>
<div
class="flex-direction-column"
>
<button>
<span
class="slug"
>
@tilda-swinton
</span>
<span
class="name"
>
Tilda Swinton
</span>
</button>
<!---->
<!---->
<span>
<!---->
</span>
</div>
<!---->
</div>
<div>
<user-teaser-popover-stub
user-id="user1"
/>
</div>
</v-popover-stub>
</client-only-stub>
</div>
</div>
`;
exports[`UserTeaser given an user without linkToProfile, on touch screen when clicking the user name renders the popover 1`] = `
<div>
<div
class=""
placement="top-start"
>
<client-only-stub>
<v-popover-stub
autohide="true"
class="user-teaser"
container="body"
delay="0"
handleresize="true"
offset="16"
open="true"
openclass="open"
opengroup="0"
placement="bottom-end"
popoverarrowclass="tooltip-arrow popover-arrow"
popoverbaseclass="tooltip popover"
popoverclass="vue-popover-theme"
popoverinnerclass="tooltip-inner popover-inner"
popoverwrapperclass="wrapper"
popperoptions="[object Object]"
trigger="manual"
>
<button
data-test="avatarUserLink"
>
<div
class="profile-avatar --small"
>
<span
class="initials"
>
TS
</span>
<!---->
<img
alt="Tilda Swinton"
class="image"
sizes="320px"
src="/avatars/tilda-swinton"
srcset="/avatars/tilda-swinton-w320 320w, /avatars/tilda-swinton-w640 640w, /avatars/tilda-swinton-w1024 1024w"
title="Tilda Swinton"
/>
</div>
</button>
<div
class="info flex-direction-column"
>
<div
class="flex-direction-column"
>
<button>
<span
class="slug"
>
@tilda-swinton
</span>
<span
class="name"
>
Tilda Swinton
</span>
</button>
<!---->
<!---->
<span>
<!---->
</span>
</div>
<!---->
</div>
<div>
<user-teaser-popover-stub
user-id="user1"
/>
</div>
</v-popover-stub>
</client-only-stub>
</div>
</div>
`;
exports[`UserTeaser renders anonymous user 1`] = `
<div>
<div
class="user-teaser"
>
<div
class="profile-avatar --small --no-image"
>
<span
class="initials"
>
</span>
<span
class="base-icon"
>
<!---->
</span>
<!---->
</div>
<span
class="info anonymous"
>
profile.userAnonym
</span>
</div>
</div>
`;