Skip to content

Commit 6b0e2ef

Browse files
authored
Optim, add user identities cache (#582)
* feat(): cache user identities locally and avoid multiple fetches if identity is already known. Signed-off-by: sBouzols <[email protected]>
1 parent 702b5b1 commit 6b0e2ef

File tree

2 files changed

+23
-10
lines changed

2 files changed

+23
-10
lines changed

src/hooks/useDirectoryContent.ts

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ const getName = (userId: string, data: UsersIdentitiesMap): string => {
3131

3232
export const useDirectoryContent = () => {
3333
const currentChildren = useSelector((state: AppState) => state.currentChildren);
34+
const knownUsersIdentitiesRef = useRef<UsersIdentitiesMap>({});
3435
const [childrenMetadata, setChildrenMetadata] = useState<Record<UUID, ElementAttributes>>({});
3536
const { snackError } = useSnackMessage();
3637
const previousData = useRef<ElementAttributes[]>();
@@ -58,8 +59,14 @@ export const useDirectoryContent = () => {
5859

5960
const metadata: Record<UUID, ElementAttributes> = {};
6061
const childrenToFetchElementsInfos = Object.values(currentChildren).map((e) => e.elementUuid);
61-
62-
const fetchUsersIdentitiesPromise = fetchUsersIdentities(childrenToFetchElementsInfos).catch(() => {
62+
const childrenToFetchUsersIdentitiesInfos = Object.values(currentChildren)
63+
.filter(
64+
(e) =>
65+
knownUsersIdentitiesRef.current?.[e.owner] === undefined ||
66+
knownUsersIdentitiesRef.current?.[e.lastModifiedBy] === undefined
67+
)
68+
.map((e) => e.elementUuid);
69+
const fetchUsersIdentitiesPromise = fetchUsersIdentities(childrenToFetchUsersIdentitiesInfos).catch(() => {
6370
// Last resort, server down, error 500, fallback to subs as users Identities
6471
// We write this code to have the same behavior as when there are partial results,
6572
// (missing users identities), see getName()
@@ -77,16 +84,19 @@ export const useDirectoryContent = () => {
7784
});
7885

7986
if (childrenToFetchElementsInfos.length > 0) {
80-
Promise.all([
81-
fetchUsersIdentitiesPromise, // TODO cache user identities across elements
82-
fetchElementsInfos(childrenToFetchElementsInfos),
83-
])
87+
Promise.all([fetchUsersIdentitiesPromise, fetchElementsInfos(childrenToFetchElementsInfos)])
8488
.then((res) => {
89+
if (res[0] && res[0].data) {
90+
Object.entries(res[0].data).forEach(([k, v]) => {
91+
knownUsersIdentitiesRef.current[k] = v;
92+
});
93+
}
94+
8595
// discarding request for older directory
8696
if (previousData.current === currentChildren) {
8797
res[1].forEach((e) => {
88-
e.ownerLabel = getName(e.owner, res[0].data);
89-
e.lastModifiedByLabel = getName(e.lastModifiedBy, res[0].data);
98+
e.ownerLabel = getName(e.owner, knownUsersIdentitiesRef.current);
99+
e.lastModifiedByLabel = getName(e.lastModifiedBy, knownUsersIdentitiesRef.current);
90100
metadata[e.elementUuid] = e;
91101
});
92102
setChildrenMetadata(metadata);
@@ -100,7 +110,7 @@ export const useDirectoryContent = () => {
100110
}
101111
}, [handleError, currentChildren]);
102112

103-
// TODO remove this when global user identity caching is implemented
113+
// TODO remove this when currentChildren and metadata are fetched at once
104114
const currentChildrenWithOwnerNames = useMemo(() => {
105115
if (!currentChildren) {
106116
return currentChildren;

src/utils/rest-api.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,10 @@ export function fetchVersion() {
185185
}
186186

187187
export function fetchUsersIdentities(elementUuids: string[]) {
188-
console.info('fetching users identities for elements : %s', elementUuids);
188+
if (elementUuids.length === 0) {
189+
return Promise.resolve();
190+
}
191+
console.info('fetching users identities for %s elements.', elementUuids.length);
189192
const idsParams = getRequestParamFromList('ids', elementUuids).toString();
190193
const fetchParams = `${PREFIX_EXPLORE_SERVER_QUERIES}/v1/explore/elements/users-identities?${idsParams}`;
191194
return backendFetchJson(fetchParams, {

0 commit comments

Comments
 (0)