Files
AniKotoAPI/src/controllers/status.controller.js
T
Shinei Nouzen d0432e1654 fix: Bug fixes from full API diagnostic sweep — all 33 endpoints now 200 OK
- Fix /api/watch 500: correct URL path format (slug/ep-N -> slug/ep-N)
- Fix /api/info: accept both ?id= and ?slug= query params
- Fix /api/status/airing 500: map short status names (ongoing/airing/completed) to correct slugs
- Fix /api/top-rankings: correct selectors (#top-anime .scaff.side.items a.item) + extract rank from rankN class
- Fix /api/completed: correct selectors (section.top-table[data-name='completed'] a.item)
- Fix /api/recently-updated: correct selectors (#recent-update .ani.items .item) + client-side tab filtering
- Fix parseListItem: detect self-as-anchor (<a> elements) + fallback slug extraction
- Fix category extractor: add status name mapping (ongoing->currently-airing, etc.)
- Add /api/cache/stats endpoint for LRU cache diagnostics
- 33 endpoints verified: 0 errors, 0 timeouts
2026-07-28 20:17:58 +05:30

79 lines
3.2 KiB
JavaScript

/*
* ======= • ======= • ======= • ======= • =======• =======
* AniKotoAPI — status.controller.js
* Repository: https://github.com/Shineii86/AniKotoAPI
*
* @description
* Controller for anime filtering by airing status. Returns anime
* filtered by their current airing status (currently-airing,
* finished-airing, not-yet-aired) with pagination support.
*
* @exports
* getStatus - Express route handler for GET /api/status/:status
*
* @author Shinei Nouzen
* @license MIT
* ======= • ======= • ======= • ======= • =======• =======
*/
import { extractStatus } from "../extractors/status.extractor.js";
import { getCache, setCache, TTL } from "../helper/cache.helper.js";
import { addPaginationMeta } from "../helper/pagination.helper.js";
// ══════════════════════════════════════════════════════════════
// CONTROLLER: STATUS
// ══════════════════════════════════════════════════════════════
// ---- FEATURE: Anime by airing status endpoint ----
/**
* Handles GET /api/status/:status requests. Returns paginated
* anime list filtered by their airing status.
*
* @param {object} req - Express request object
* @param {string} req.params.status - Airing status filter
* @param {number} req.query.page - Page number (default: 1)
* @param {object} res - Express response object
* @param {Function} next - Express next middleware function
* @returns {void} Sends JSON response with filtered anime list
*
* @example
* GET /api/status/currently-airing?page=2
* Response: { success: true, results: { anime, pagination, ... } }
*
* @throws {400} If status parameter is invalid
* NOTE: Valid statuses: "currently-airing", "finished-airing", "not-yet-aired"
*/
const getStatus = async (req, res, next) => {
try {
const { status } = req.params;
const { page = 1 } = req.query;
if (!status) {
return res.status(400).json({ success: false, message: "Status is required (currently-airing, finished-airing, not-yet-aired)" });
}
const cacheKey = `status_${status}_${page}`;
const cached = getCache(cacheKey);
if (cached) {
return res.json({ success: true, results: cached });
}
// Map short status names to full slugs
const statusMap = {
ongoing: "currently-airing",
airing: "currently-airing",
completed: "finished-airing",
finished: "finished-airing",
upcoming: "not-yet-aired",
"not-yet-aired": "not-yet-aired"
};
const mappedStatus = statusMap[status] || status;
const data = await extractStatus(mappedStatus, page);
const response = addPaginationMeta(data, page);
setCache(cacheKey, response, TTL.genres);
res.json({ success: true, results: response });
} catch (error) {
next(error);
}
};
export { getStatus };
// ══════════════════════════════════════════════════════════════ END: status.controller.js