feat: implement userInfo() and cdn*() API calls into UI

This commit is contained in:
Rim
2025-04-19 21:56:33 -04:00
parent 1ddb12c6e8
commit 660bfb058d
6 changed files with 204 additions and 13 deletions

102
app.js
View File

@ -772,6 +772,9 @@ app.post('/api/user', async (req, res) => {
case 'friendsList':
data = await fetchWithTimeout(() => API.Me.friendsList());
break;
case 'userInfo':
data = await fetchWithTimeout(() => API.Me.userInfo());
break;
// case "settings":
// data = await fetchWithTimeout(() =>
// API.Me.settings(username, platform)
@ -807,6 +810,105 @@ app.post('/api/user', async (req, res) => {
}
});
// API endpoint for CDN-related API calls
app.post('/api/cdn', async (req, res) => {
logger.debug('Received request for /api/cdn');
logger.debug(
`Request IP: ${
req.headers['x-forwarded-for'] || req.ip || req.connection.remoteAddress
}`
);
logger.debug(
`Request JSON: ${JSON.stringify({
cdnCall: req.body.cdnCall,
})}`
);
try {
let { ssoToken, cdnCall } = req.body;
/*
logger.debug(
`Request details - User Call: ${cdnCall}`
);
logger.debug("=== USER DATA REQUEST ===");
logger.debug(`CDN Call: ${cdnCall}`);
logger.debug("========================="); */
const defaultToken = demoTracker.getDefaultSsoToken();
if (!ssoToken && defaultToken) {
ssoToken = defaultToken;
logger.info('Using default SSO token for demo mode');
} else if (!ssoToken) {
return res.status(200).json({
status: 'error',
message: 'SSO Token is required',
timestamp: global.Utils.toIsoString(new Date()),
});
}
try {
await ensureLogin(ssoToken);
} catch (loginError) {
return res.status(200).json({
status: 'error',
error_type: 'LoginError',
message: 'SSO token login failed',
details: loginError.message || 'Unknown login error',
timestamp: global.Utils.toIsoString(new Date()),
});
}
// Create a wrapped function for each API call to handle timeout
const fetchWithTimeout = async (apiFn) => {
return Promise.race([
apiFn(),
timeoutPromise(30000), // 30 second timeout
]);
};
try {
logger.debug(`Attempting to fetch CDN data for ${cdnCall}`);
let data;
// Fetch user data based on cdnCall
switch (cdnCall) {
case 'accolades':
data = await fetchWithTimeout(() => API.CDN.accolades());
break;
case 'allCDNData':
data = await fetchWithTimeout(() => API.CDN.allCDNData());
break;
default:
return res.status(200).json({
status: 'error',
message: 'Invalid user API call selected',
timestamp: global.Utils.toIsoString(new Date()),
});
}
demoTracker.incrementDemoCounter(req, ssoToken);
return res.json({
// status: "success",
data: data,
timestamp: global.Utils.toIsoString(new Date()),
});
} catch (apiError) {
return handleApiError(apiError, res);
}
} catch (serverError) {
return res.status(200).json({
status: 'server_error',
message: 'The server encountered an unexpected error',
error_details: serverError.message || 'Unknown server error',
timestamp: global.Utils.toIsoString(new Date()),
});
}
});
// API endpoint for fuzzy search
app.post('/api/search', async (req, res) => {
logger.debug('Received request for /api/search');