From b46d247792ebb622ec1487c611e346638801bd4b Mon Sep 17 00:00:00 2001 From: JoaquinOlivero Date: Mon, 26 Aug 2024 18:58:02 +0000 Subject: [PATCH] refactor: checks if the default avatar is cached to avoid creating duplicates for different users --- server/routes/auth.ts | 33 ++++- server/routes/avatarproxy.ts | 10 +- server/routes/user/index.ts | 16 +- src/components/IssueDetails/index.tsx | 140 +++++++++--------- src/components/ManageSlideOver/index.tsx | 85 ++++++----- .../UserList/JellyfinImportModal.tsx | 31 ++-- src/components/UserList/index.tsx | 50 ++++--- 7 files changed, 213 insertions(+), 152 deletions(-) diff --git a/server/routes/auth.ts b/server/routes/auth.ts index 395c987d8..14ede058f 100644 --- a/server/routes/auth.ts +++ b/server/routes/auth.ts @@ -343,6 +343,14 @@ authRoutes.post('/jellyfin', async (req, res, next) => { }), userType: UserType.EMBY, }); + + if ( + user.avatar.includes('https://gravatar.com') && + user.avatar.includes('default=mm&size=200') + ) { + user.avatar = 'https://gravatar.com/avatar/?default=mm&size=200'; + } + break; case MediaServerType.JELLYFIN: settings.main.mediaServerType = MediaServerType.JELLYFIN; @@ -361,6 +369,14 @@ authRoutes.post('/jellyfin', async (req, res, next) => { }), userType: UserType.JELLYFIN, }); + + if ( + user.avatar.includes('https://gravatar.com') && + user.avatar.includes('default=mm&size=200') + ) { + user.avatar = 'https://gravatar.com/avatar/?default=mm&size=200'; + } + break; default: throw new Error('select_server_type'); @@ -415,15 +431,23 @@ authRoutes.post('/jellyfin', async (req, res, next) => { } user.avatar = avatar; } else { - const avatar = gravatarUrl(user.email || account.User.Name, { + let avatar = gravatarUrl(user.email || account.User.Name, { default: 'mm', size: 200, }); + if ( + avatar.includes('https://gravatar.com') && + avatar.includes('default=mm&size=200') + ) { + avatar = 'https://gravatar.com/avatar/?default=mm&size=200'; + } + if (avatar !== user.avatar) { const avatarProxy = new ImageProxy('avatar', ''); avatarProxy.clearCachedImage(user.avatar); } + user.avatar = avatar; } user.jellyfinUsername = account.User.Name; @@ -474,6 +498,13 @@ authRoutes.post('/jellyfin', async (req, res, next) => { ? UserType.JELLYFIN : UserType.EMBY, }); + + if ( + user.avatar.includes('https://gravatar.com') && + user.avatar.includes('default=mm&size=200') + ) { + user.avatar = 'https://gravatar.com/avatar/?default=mm&size=200'; + } //initialize Jellyfin/Emby users with local login const passedExplicitPassword = body.password && body.password.length > 0; if (passedExplicitPassword) { diff --git a/server/routes/avatarproxy.ts b/server/routes/avatarproxy.ts index 746bc51da..e6f5c2ee0 100644 --- a/server/routes/avatarproxy.ts +++ b/server/routes/avatarproxy.ts @@ -7,8 +7,16 @@ const router = Router(); const avatarImageProxy = new ImageProxy('avatar', ''); // Proxy avatar images router.get('/*', async (req, res) => { - const imagePath = req.url.startsWith('/') ? req.url.slice(1) : req.url; + let imagePath = req.url.startsWith('/') ? req.url.slice(1) : req.url; + try { + if ( + imagePath.includes('https://gravatar.com') && + imagePath.includes('default=mm&size=200') + ) { + imagePath = 'https://gravatar.com/avatar/?default=mm&size=200'; + } + const imageData = await avatarImageProxy.getImage(imagePath); res.writeHead(200, { diff --git a/server/routes/user/index.ts b/server/routes/user/index.ts index da9b649cd..caa3be580 100644 --- a/server/routes/user/index.ts +++ b/server/routes/user/index.ts @@ -121,7 +121,14 @@ router.post( } const passedExplicitPassword = body.password && body.password.length > 0; - const avatar = gravatarUrl(email, { default: 'mm', size: 200 }); + let avatar = gravatarUrl(email, { default: 'mm', size: 200 }); + + if ( + avatar.includes('https://gravatar.com') && + avatar.includes('default=mm&size=200') + ) { + avatar = 'https://gravatar.com/avatar/?default=mm&size=200'; + } if ( !passedExplicitPassword && @@ -553,6 +560,13 @@ router.post( userType: UserType.JELLYFIN, }); + if ( + newUser.avatar.includes('https://gravatar.com') && + newUser.avatar.includes('default=mm&size=200') + ) { + newUser.avatar = 'https://gravatar.com/avatar/?default=mm&size=200'; + } + await userRepository.save(newUser); createdUsers.push(newUser); } diff --git a/src/components/IssueDetails/index.tsx b/src/components/IssueDetails/index.tsx index b16af8e9e..c011eb04e 100644 --- a/src/components/IssueDetails/index.tsx +++ b/src/components/IssueDetails/index.tsx @@ -28,7 +28,6 @@ import type Issue from '@server/entity/Issue'; import type { MovieDetails } from '@server/models/Movie'; import type { TvDetails } from '@server/models/Tv'; import { Field, Form, Formik } from 'formik'; -import Image from 'next/image'; import Link from 'next/link'; import { useRouter } from 'next/router'; import { useState } from 'react'; @@ -264,8 +263,9 @@ const IssueDetails = () => {

{title} @@ -302,7 +302,7 @@ const IssueDetails = () => { { { {settings.currentSettings.mediaServerType === - MediaServerType.EMBY + MediaServerType.EMBY ? intl.formatMessage(messages.playonplex, { - mediaServerName: 'Emby', - }) + mediaServerName: 'Emby', + }) : settings.currentSettings.mediaServerType === MediaServerType.PLEX - ? intl.formatMessage(messages.playonplex, { + ? intl.formatMessage(messages.playonplex, { mediaServerName: 'Plex', }) - : intl.formatMessage(messages.playonplex, { + : intl.formatMessage(messages.playonplex, { mediaServerName: 'Jellyfin', })} @@ -436,16 +436,16 @@ const IssueDetails = () => { {settings.currentSettings.mediaServerType === - MediaServerType.EMBY + MediaServerType.EMBY ? intl.formatMessage(messages.play4konplex, { - mediaServerName: 'Emby', - }) + mediaServerName: 'Emby', + }) : settings.currentSettings.mediaServerType === MediaServerType.PLEX - ? intl.formatMessage(messages.play4konplex, { + ? intl.formatMessage(messages.play4konplex, { mediaServerName: 'Plex', }) - : intl.formatMessage(messages.play4konplex, { + : intl.formatMessage(messages.play4konplex, { mediaServerName: 'Jellyfin', })} @@ -530,52 +530,52 @@ const IssueDetails = () => {
{(hasPermission(Permission.MANAGE_ISSUES) || belongsToUser) && ( - <> - {issueData.status === IssueStatus.OPEN ? ( - - ) : ( - + ) : ( + - )} - - )} + if (values.message) { + handleSubmit(); + } + }} + > + + + {intl.formatMessage( + values.message + ? messages.reopenissueandcomment + : messages.reopenissue + )} + + + )} + + )}
diff --git a/src/components/UserList/JellyfinImportModal.tsx b/src/components/UserList/JellyfinImportModal.tsx index 2f9099346..e36989116 100644 --- a/src/components/UserList/JellyfinImportModal.tsx +++ b/src/components/UserList/JellyfinImportModal.tsx @@ -6,7 +6,6 @@ import globalMessages from '@app/i18n/globalMessages'; import defineMessages from '@app/utils/defineMessages'; import { MediaServerType } from '@server/constants/server'; import type { UserResultsResponse } from '@server/interfaces/api/userInterfaces'; -import Image from 'next/image'; import { useState } from 'react'; import { useIntl } from 'react-intl'; import { useToasts } from 'react-toast-notifications'; @@ -158,7 +157,7 @@ const JellyfinImportModal: React.FC = ({ title={intl.formatMessage(messages.newJellyfinsigninenabled, { mediaServerName: settings.currentSettings.mediaServerType === - MediaServerType.EMBY + MediaServerType.EMBY ? 'Emby' : 'Jellyfin', strong: (msg: React.ReactNode) => ( @@ -190,13 +189,15 @@ const JellyfinImportModal: React.FC = ({ > @@ -230,17 +231,19 @@ const JellyfinImportModal: React.FC = ({ > diff --git a/src/components/UserList/index.tsx b/src/components/UserList/index.tsx index 89b00592b..ce246c6f1 100644 --- a/src/components/UserList/index.tsx +++ b/src/components/UserList/index.tsx @@ -29,7 +29,6 @@ import { MediaServerType } from '@server/constants/server'; import type { UserResultsResponse } from '@server/interfaces/api/userInterfaces'; import { hasPermission } from '@server/lib/permissions'; import { Field, Form, Formik } from 'formik'; -import Image from 'next/image'; import Link from 'next/link'; import { useRouter } from 'next/router'; import { useEffect, useState } from 'react'; @@ -104,7 +103,8 @@ const UserList = () => { error, mutate: revalidate, } = useSWR( - `/api/v1/user?take=${currentPageSize}&skip=${pageIndex * currentPageSize + `/api/v1/user?take=${currentPageSize}&skip=${ + pageIndex * currentPageSize }&sort=${currentSort}` ); @@ -215,9 +215,9 @@ const UserList = () => { !value ? Yup.string() : Yup.string().min( - 8, - intl.formatMessage(messages.validationpasswordminchars) - ) + 8, + intl.formatMessage(messages.validationpasswordminchars) + ) ), }); @@ -406,8 +406,9 @@ const UserList = () => {
{user.id === currentUser?.id || - currentHasPermission( - [Permission.MANAGE_REQUESTS, Permission.REQUEST_VIEW], - { type: 'or' } - ) ? ( + currentHasPermission( + [Permission.MANAGE_REQUESTS, Permission.REQUEST_VIEW], + { type: 'or' } + ) ? ( { {user.id === 1 ? intl.formatMessage(messages.owner) : hasPermission(Permission.ADMIN, user.permissions) - ? intl.formatMessage(messages.admin) - : intl.formatMessage(messages.user)} + ? intl.formatMessage(messages.admin) + : intl.formatMessage(messages.user)} {intl.formatDate(user.createdAt, {