Skip to content

Commit 3639be4

Browse files
authored
refactor(GeoLocationReader, MarkRights*): add query cache (qiuwenbaike#1679)
* refactor(GeoLocationReader, MarkRights*): add query cache
1 parent 29192d5 commit 3639be4

File tree

14 files changed

+308
-263
lines changed

14 files changed

+308
-263
lines changed

dist/GeoLocationReader/GeoLocationReader.js

Lines changed: 13 additions & 32 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/MarkRights-Userpage/MarkRights-Userpage.js

Lines changed: 9 additions & 18 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/MarkRights/MarkRights.js

Lines changed: 120 additions & 72 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/definition.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@
6666
* FilterAlteredClicks[ResourceLoader|hidden|requiresES6]|FilterAlteredClicks.js
6767
* Geo[ResourceLoader|dependencies=mediawiki.storage|hidden|requiresES6]|Geo.js
6868
* GeoLocation[ResourceLoader|dependencies=ext.gadget.Geo,ext.gadget.i18n,ext.gadget.Util,mediawiki.api|requiresES6]|GeoLocation.js
69-
* GeoLocationReader[ResourceLoader|default|dependencies=ext.gadget.i18n,ext.gadget.React,ext.gadget.Util,mediawiki.api,mediawiki.Title|namespaces=2|peers=GeoLocationReader-pagestyles|rights=edit|requiresES6]|GeoLocationReader.js
69+
* GeoLocationReader[ResourceLoader|default|dependencies=ext.gadget.i18n,ext.gadget.MarkRights,ext.gadget.React,ext.gadget.Util,mediawiki.api,mediawiki.Title|namespaces=2|peers=GeoLocationReader-pagestyles|rights=edit|requiresES6]|GeoLocationReader.js
7070
* GeoLocationReader-pagestyles[ResourceLoader|hidden|requiresES6]|GeoLocationReader-pagestyles.css
7171
* HistoryDisclaimer[ResourceLoader|default|dependencies=ext.gadget.React|hidden|requiresES6]|HistoryDisclaimer.js|HistoryDisclaimer.css
7272
* i18n[ResourceLoader|dependencies=ext.gadget.Util|hidden|requiresES6]|i18n.js

src/GeoLocationReader/definition.json

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,14 @@
44
"section": "compatibility",
55
"excludeSites": ["loginwiki"],
66
"default": true,
7-
"dependencies": ["ext.gadget.i18n", "ext.gadget.React", "ext.gadget.Util", "mediawiki.api", "mediawiki.Title"],
7+
"dependencies": [
8+
"ext.gadget.i18n",
9+
"ext.gadget.MarkRights",
10+
"ext.gadget.React",
11+
"ext.gadget.Util",
12+
"mediawiki.api",
13+
"mediawiki.Title"
14+
],
815
"namespaces": [2],
916
"peers": ["GeoLocationReader-pagestyles"],
1017
"rights": ["edit"]

src/GeoLocationReader/modules/addElement.ts

Lines changed: 8 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,16 @@
1-
import {api} from './api';
21
import {appendGeoIcon} from './appendGeoIcon';
3-
4-
const queryUserGroups = async (ususers: string) => {
5-
const params: ApiQueryUsersParams = {
6-
ususers,
7-
action: 'query',
8-
format: 'json',
9-
formatversion: '2',
10-
list: 'users',
11-
usprop: 'groups',
12-
smaxage: 600,
13-
maxage: 600,
14-
};
15-
const response = await api.get(params);
16-
17-
return response;
18-
};
2+
import {getLocalUserGroups} from 'ext.gadget.MarkRights';
193

204
const addElement = async (): Promise<void> => {
215
const {wgRelevantUserName} = mw.config.get();
6+
7+
if (!wgRelevantUserName) {
8+
return;
9+
}
10+
2211
try {
23-
const {
24-
query: {
25-
users: [{groups}],
26-
},
27-
}: {
28-
query: {
29-
users: [
30-
{
31-
groups: string[];
32-
},
33-
];
34-
};
35-
} = (await queryUserGroups(`${wgRelevantUserName}`)) as never;
12+
const groupsMap = await getLocalUserGroups([wgRelevantUserName]);
13+
const groups = groupsMap[wgRelevantUserName] ?? [];
3614

3715
if (groups.includes('bot') || groups.includes('qiuwen')) {
3816
/* empty */

src/MarkRights-Userpage/MarkRights-Userpage.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import * as OPTIONS from './options.json';
2-
import {getPermissions} from './modules/core';
2+
import {getPermissions} from './modules/getPermissions';
33

44
(function markRightsUserPage(): void {
55
const {wgAction, wgNamespaceNumber, wgPageName, wgRelevantUserName} = mw.config.get();

src/MarkRights-Userpage/modules/core.ts renamed to src/MarkRights-Userpage/modules/getPermissions.ts

Lines changed: 7 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,19 @@
11
import {SYSTEM_SCRIPT_LIST, WEBMASTER_LIST} from './constant';
2-
import {queryGlobalUserGroups, queryUserGroups} from 'ext.gadget.MarkRights';
2+
import {getGlobalUserGroups, getLocalUserGroups} from 'ext.gadget.MarkRights';
33
import type {UserRights} from '~/MarkRights/modules/types';
44
import {appendIcon} from './appendIcon';
55
import {getMessage} from './i18n';
66
import {uniqueArray} from 'ext.gadget.Util';
77

88
const getPermissions = async (wgRelevantUserName: string): Promise<void> => {
99
try {
10-
const {
11-
query: {
12-
users: [{groups: localgroups}],
13-
},
14-
}: {
15-
query: {
16-
users: [
17-
{
18-
groups: string[];
19-
},
20-
];
21-
};
22-
} = (await queryUserGroups(wgRelevantUserName)) as never;
23-
const {
24-
query: {
25-
globaluserinfo: {groups: globalgroups},
26-
},
27-
}: {
28-
query: {
29-
globaluserinfo: {
30-
groups: string[];
31-
};
32-
};
33-
} = (await queryGlobalUserGroups(wgRelevantUserName)) as never;
10+
const localGroupsMap = await getLocalUserGroups([wgRelevantUserName]);
11+
const localGroups = localGroupsMap[wgRelevantUserName] ?? [];
3412

35-
const groups = uniqueArray([...localgroups, ...globalgroups]).filter((element) => {
13+
const globalGroupsMap = await getGlobalUserGroups([wgRelevantUserName]);
14+
const globalGroups = globalGroupsMap[wgRelevantUserName] ?? [];
15+
16+
const groups = uniqueArray([...localGroups, ...globalGroups]).filter((element) => {
3617
// Do not show implicit groups. Bots Already shown in GeoLocationViewer
3718
return !['*', 'user', 'autoconfirmed', 'rnrsverify-confirmed', 'bot'].includes(element);
3819
});

src/MarkRights/MarkRights.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,9 @@ mw.hook('wikipage.content').add(function markRights($content): void {
99
}
1010
});
1111

12-
export {queryGlobalUserGroups, queryUserGroups} from './modules/util/query';
12+
export {
13+
getLocalUserGroups,
14+
getGlobalUserGroups,
15+
queryUserGroups,
16+
queryGlobalUserGroups,
17+
} from './modules/util/getUserGroups';

src/MarkRights/modules/core.ts

Lines changed: 9 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {queryGlobalUserGroups, queryUserGroups} from './util/query';
1+
import {getGlobalUserGroups, getLocalUserGroups} from './util/getUserGroups';
22
import {appendUserRightsMark} from './util/appendUserRightsMark';
33
import {generateUserLinks} from './util/generateUserLinks';
44

@@ -24,35 +24,16 @@ const markUserRights = ($content: JQuery): void => {
2424
const ususers = users.splice(0, 25).filter((element) => {
2525
return !(mw.util.isIPv4Address(element) || mw.util.isIPv6Address(element));
2626
});
27+
2728
if (!ususers.length) {
2829
continue;
2930
}
3031

3132
promises[promises.length] = async (): Promise<void> => {
32-
const userGroups: Record<string, string[]> = {};
33+
let userGroups: Record<string, string[]> = {};
3334

3435
try {
35-
const response = await queryUserGroups(ususers);
36-
const {users: queryUsers} = response['query'] as {
37-
users: {groups: string[]; name: string}[];
38-
};
39-
40-
for (const user of queryUsers) {
41-
if (!user?.name || !user?.groups) {
42-
continue;
43-
}
44-
45-
const {name, groups} = user;
46-
47-
userGroups[name] ??= [];
48-
49-
userGroups[name] = [
50-
...userGroups[name],
51-
...groups.filter((element) => {
52-
return element !== '*';
53-
}),
54-
];
55-
}
36+
userGroups = await getLocalUserGroups(ususers);
5637
} catch (error: unknown) {
5738
console.error('[MarkRights] Ajax error:', error);
5839
}
@@ -61,27 +42,12 @@ const markUserRights = ($content: JQuery): void => {
6142
};
6243

6344
promises[promises.length] = async (): Promise<void> => {
64-
const userGroups: Record<string, string[]> = {};
65-
66-
for (const user of ususers) {
67-
try {
68-
const response = await queryGlobalUserGroups(user);
69-
const {globaluserinfo} = response['query'] as {
70-
globaluserinfo: {groups: string[]};
71-
};
45+
let userGroups: Record<string, string[]> = {};
7246

73-
if (!globaluserinfo?.groups) {
74-
continue;
75-
}
76-
77-
const {groups} = globaluserinfo;
78-
79-
userGroups[user] ??= [];
80-
81-
userGroups[user] = [...userGroups[user], ...groups];
82-
} catch (error: unknown) {
83-
console.error('[MarkRights] Ajax error:', error);
84-
}
47+
try {
48+
userGroups = await getGlobalUserGroups(ususers);
49+
} catch (error: unknown) {
50+
console.error('[MarkRights] Ajax error:', error);
8551
}
8652

8753
appendUserRightsMark($userLinks, userGroups);

0 commit comments

Comments
 (0)