148ed696b2
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.
122 lines
3.8 KiB
JavaScript
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 |