Files
EMI-Backend/routes/subsplash.js
T
Adolfo Reyna 148ed696b2 feat: Add Swagger API documentation
This commit introduces Swagger API documentation for all endpoints in the
application.

- Installs  and .
- Configures Swagger in  to generate and serve API documentation
  at .
- Adds JSDoc-style Swagger annotations to all routes in  and
  the  directory (, , ,
  , , ).
- Defines a cookie-based security scheme for authenticated routes.

This allows for interactive API documentation and testing via the
endpoint.
2025-07-17 09:52:37 -04:00

122 lines
3.8 KiB
JavaScript

const axios = require('axios');
const cheerio = require('cheerio');
var express = require('express')
var router = express.Router()
const DB = require("./../mongoDB.js");
const fetchAndParse = async (url) => {
let detailHtml = await axios.get(url);
return cheerio.load(detailHtml.data);
}
const getDetails = async (event) => {
const $ = await fetchAndParse(event.detailPage);
let detailsObj = {
content: $(".kit-expanding-text-block__text-content").text(),
subtitle: $(".route-event__basic-info h3").text(),
image: $($('.kit-image__image')[0]).attr('src'),
}
return detailsObj;
};
//g2cc4gr Florida
//vwkqc93 Global
const getEvents = async (eventId) => {
const $ = await fetchAndParse('https://subsplash.com/+p4y7/lb/ca/+' + eventId + '?embed');
let events = $('.kit-list-item');
let eventsArr = [];
let promises = [];
for (let index = 0; index < events.length; index++) {
const element = events[index];
let event = {}
event.title = $(element).find(".kit-list-item__title").text();
event.date = $(element).find(".kit-list-item__subtitle").text();
event.summary = $(element).find(".kit-list-item__summary").text();
event.detailPage = 'https://subsplash.com' + $(element).parent().attr('href');
promises.push(getDetails(event).then((r) => {
event.details = r;
eventsArr.push(event);
}));
}
let r = await Promise.all(promises);
return eventsArr;
};
//https://subsplash.com/+p4y7/lb/ms/+y42zyf3?embed&1665854077751
//https://subsplash.com/+p4y7/embed/mi/+b2zqkyb?audio&video&info&logoWatermark&shareable&embeddable"frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>
//kit-list-item
const getMedia = async (eventId) => {
const $ = await fetchAndParse('https://subsplash.com/+p4y7/lb/ms/+' + eventId + '?embed&1665854077751');
let events = $('.kit-list-item');
let eventsArr = [];
let promises = [];
for (let index = 0; index < events.length; index++) {
const element = events[index];
let event = {}
event.title = $(element).find(".kit-list-item__title").text();
event.date = $(element).find(".kit-list-item__subtitle").text();
event.summary = $(element).find(".kit-list-item__summary").text();
event.detailPage = 'https://subsplash.com' + $(element).find('a').attr('href');
promises.push(getDetails(event).then((r) => {
event.details = r;
eventsArr.push(event);
}));
}
let r = await Promise.all(promises);
return eventsArr;
};
//getMedia('y42zyf3').then(console.log)
/**
* @swagger
* tags:
* name: Subsplash
* description: Subsplash API integration
*/
DB.getDB.then((DB) => {
/**
* @swagger
* /subsplash/events/{calendarId}:
* get:
* summary: Get events from a Subsplash calendar
* tags: [Subsplash]
* parameters:
* - in: path
* name: calendarId
* required: true
* schema:
* type: string
* responses:
* 200:
* description: OK
*/
router.get("/events/:calendarId", async (req, res) => {
const events = await getEvents(req.params.calendarId)
return res.json(events);
});
/**
* @swagger
* /subsplash/media/{seriesId}:
* get:
* summary: Get media from a Subsplash media series
* tags: [Subsplash]
* parameters:
* - in: path
* name: seriesId
* required: true
* schema:
* type: string
* responses:
* 200:
* description: OK
*/
router.get("/media/:seriesId", async (req, res) => {
const events = await getMedia(req.params.seriesId)
return res.json(events);
});
});
module.exports = router