diff --git a/overseerr-api.yml b/overseerr-api.yml index f3be28ad2..4bcd76125 100644 --- a/overseerr-api.yml +++ b/overseerr-api.yml @@ -3781,6 +3781,11 @@ paths: required: false schema: type: string + - in: query + name: includeIds + required: false + schema: + type: string responses: '200': description: A JSON array of all users diff --git a/server/routes/user/index.ts b/server/routes/user/index.ts index c9bc98341..568124f7f 100644 --- a/server/routes/user/index.ts +++ b/server/routes/user/index.ts @@ -32,7 +32,14 @@ const router = Router(); router.get('/', async (req, res, next) => { try { - const pageSize = req.query.take ? Number(req.query.take) : 10; + const includeIds = [ + ...new Set( + req.query.includeIds ? req.query.includeIds.toString().split(',') : [] + ), + ]; + const pageSize = req.query.take + ? Number(req.query.take) + : Math.max(10, includeIds.length); const skip = req.query.skip ? Number(req.query.skip) : 0; const q = req.query.q ? req.query.q.toString().toLowerCase() : ''; let query = getRepository(User).createQueryBuilder('user'); @@ -44,6 +51,10 @@ router.get('/', async (req, res, next) => { ); } + if (includeIds.length > 0) { + query.andWhereInIds(includeIds); + } + switch (req.query.sort) { case 'updated': query = query.orderBy('user.updatedAt', 'DESC'); @@ -84,6 +95,7 @@ router.get('/', async (req, res, next) => { const [users, userCount] = await query .take(pageSize) .skip(skip) + .distinct(true) .getManyAndCount(); return res.status(200).json({ diff --git a/src/components/Selector/index.tsx b/src/components/Selector/index.tsx index 6c8319090..b698caac6 100644 --- a/src/components/Selector/index.tsx +++ b/src/components/Selector/index.tsx @@ -567,7 +567,10 @@ export const UserSelector = ({ const users = defaultValue.split(','); - const res = await fetch(`/api/v1/user`); + const res = await fetch( + `/api/v1/user?includeIds=${encodeURIComponent(defaultValue)}` + ); + if (!res.ok) { throw new Error('Network response was not ok'); } diff --git a/src/components/Settings/OverrideRule/OverrideRuleTile.tsx b/src/components/Settings/OverrideRule/OverrideRuleTile.tsx index c5c0451a7..aa1bb8d87 100644 --- a/src/components/Settings/OverrideRule/OverrideRuleTile.tsx +++ b/src/components/Settings/OverrideRule/OverrideRuleTile.tsx @@ -73,19 +73,18 @@ const OverrideRuleTile = ({ }) ); setKeywords(keywords); - const users = await Promise.all( - rules - .map((rule) => rule.users?.split(',')) - .flat() - .filter((userId) => userId) - .map(async (userId) => { - const res = await fetch(`/api/v1/user/${userId}`); - if (!res.ok) throw new Error(); - const user: User = await res.json(); - return user; - }) - ); - setUsers(users); + const allUsersFromRules = rules + .map((rule) => rule.users) + .filter((users) => users) + .join(','); + if (allUsersFromRules) { + const res = await fetch( + `/api/v1/user?includeIds=${encodeURIComponent(allUsersFromRules)}` + ); + if (!res.ok) throw new Error(); + const users: User[] = (await res.json()).results; + setUsers(users); + } })(); }, [rules]);