mirror of
https://git.mirrors.martin98.com/https://github.com/sub-store-org/Sub-Store.git
synced 2025-10-17 03:11:28 +08:00
147 lines
5.0 KiB
JavaScript
147 lines
5.0 KiB
JavaScript
import { SETTINGS_KEY, ARTIFACT_REPOSITORY_KEY } from '@/constants';
|
|
import { success, failed } from './response';
|
|
import { InternalServerError } from '@/restful/errors';
|
|
import $ from '@/core/app';
|
|
import Gist from '@/utils/gist';
|
|
|
|
export default function register($app) {
|
|
const settings = $.read(SETTINGS_KEY);
|
|
if (!settings) $.write({}, SETTINGS_KEY);
|
|
$app.route('/api/settings').get(getSettings).patch(updateSettings);
|
|
}
|
|
|
|
async function getSettings(req, res) {
|
|
try {
|
|
let settings = $.read(SETTINGS_KEY);
|
|
if (!settings) {
|
|
settings = {};
|
|
$.write(settings, SETTINGS_KEY);
|
|
}
|
|
|
|
if (!settings.avatarUrl) await updateAvatar();
|
|
if (!settings.artifactStore) await updateArtifactStore();
|
|
|
|
success(res, settings);
|
|
} catch (e) {
|
|
$.error(`Failed to get settings: ${e.message ?? e}`);
|
|
failed(
|
|
res,
|
|
new InternalServerError(
|
|
`FAILED_TO_GET_SETTINGS`,
|
|
`Failed to get settings`,
|
|
`Reason: ${e.message ?? e}`,
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
async function updateSettings(req, res) {
|
|
try {
|
|
const settings = $.read(SETTINGS_KEY);
|
|
const newSettings = {
|
|
...settings,
|
|
...req.body,
|
|
};
|
|
$.write(newSettings, SETTINGS_KEY);
|
|
await updateAvatar();
|
|
await updateArtifactStore();
|
|
success(res, newSettings);
|
|
} catch (e) {
|
|
$.error(`Failed to update settings: ${e.message ?? e}`);
|
|
failed(
|
|
res,
|
|
new InternalServerError(
|
|
`FAILED_TO_UPDATE_SETTINGS`,
|
|
`Failed to update settings`,
|
|
`Reason: ${e.message ?? e}`,
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
export async function updateAvatar() {
|
|
const settings = $.read(SETTINGS_KEY);
|
|
const { githubUser: username, syncPlatform } = settings;
|
|
if (username) {
|
|
if (syncPlatform === 'gitlab') {
|
|
try {
|
|
const data = await $.http
|
|
.get({
|
|
url: `https://gitlab.com/api/v4/users?username=${encodeURIComponent(
|
|
username,
|
|
)}`,
|
|
headers: {
|
|
'User-Agent':
|
|
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.141 Safari/537.36',
|
|
},
|
|
})
|
|
.then((resp) => JSON.parse(resp.body));
|
|
settings.avatarUrl = data[0]['avatar_url'].replace(
|
|
/(\?|&)s=\d+(&|$)/,
|
|
'$1s=160$2',
|
|
);
|
|
$.write(settings, SETTINGS_KEY);
|
|
} catch (err) {
|
|
$.error(
|
|
`Failed to fetch GitLab avatar for User: ${username}. Reason: ${
|
|
err.message ?? err
|
|
}`,
|
|
);
|
|
}
|
|
} else {
|
|
try {
|
|
const data = await $.http
|
|
.get({
|
|
url: `https://api.github.com/users/${encodeURIComponent(
|
|
username,
|
|
)}`,
|
|
headers: {
|
|
'User-Agent':
|
|
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.141 Safari/537.36',
|
|
},
|
|
})
|
|
.then((resp) => JSON.parse(resp.body));
|
|
settings.avatarUrl = data['avatar_url'];
|
|
$.write(settings, SETTINGS_KEY);
|
|
} catch (err) {
|
|
$.error(
|
|
`Failed to fetch GitHub avatar for User: ${username}. Reason: ${
|
|
err.message ?? err
|
|
}`,
|
|
);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
export async function updateArtifactStore() {
|
|
$.log('Updating artifact store');
|
|
const settings = $.read(SETTINGS_KEY);
|
|
const { gistToken, syncPlatform } = settings;
|
|
if (gistToken) {
|
|
const manager = new Gist({
|
|
token: gistToken,
|
|
key: ARTIFACT_REPOSITORY_KEY,
|
|
syncPlatform,
|
|
});
|
|
|
|
try {
|
|
const gist = await manager.locate();
|
|
const url = gist?.html_url ?? gist?.web_url;
|
|
if (url) {
|
|
$.log(`找到 Sub-Store Gist: ${url}`);
|
|
// 只需要保证 token 是对的, 现在 username 错误只会导致头像错误
|
|
settings.artifactStore = url;
|
|
settings.artifactStoreStatus = 'VALID';
|
|
} else {
|
|
$.error(`找不到 Sub-Store Gist`);
|
|
settings.artifactStoreStatus = 'NOT FOUND';
|
|
}
|
|
} catch (err) {
|
|
$.error(`查找 Sub-Store Gist 时发生错误: ${err.message ?? err}`);
|
|
settings.artifactStoreStatus = 'ERROR';
|
|
}
|
|
$.write(settings, SETTINGS_KEY);
|
|
}
|
|
}
|