Facebook-Events-iCal-Converter/lib/utils.js

98 lines
2.3 KiB
JavaScript

const dayjs = require('dayjs')
const winston = require('winston')
require('winston-daily-rotate-file')
const path = require('path')
const checkValidURL = (url) => {
return checkURLFormat(url) ||
checkNumberURLParameter(url)
}
const checkURLFormat = (url) => {
return /^(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/.test(url)
}
const checkNumberURLParameter = (url) => {
return /^\d+$/.test(url)
}
const createParserError = () => {
const err = new Error('Unable to parse event data.')
err.statusCode = 422
return err
}
// NOTE: Using mobile facebook URL because it usually
// contains stringified JSON with event information
const createMobileURL = (originalURL) => {
const urlWithProtocol = originalURL.includes('http') ?
originalURL :
`https://${originalURL}`
const url = new URL(urlWithProtocol)
return `${url.protocol}//mobile.facebook.com${url.port}${url.pathname}${url.hash}`
}
// NOTE: Detect whether URL parameter contains
// number or http address
const createURL = (param) => {
if (checkURLFormat(param)) {
return param
}
if (checkNumberURLParameter(param)) {
return `https://facebook.com/events/${param}`
}
return ''
}
const getNormalizedUrl = (URLparameter) => {
const fbURL = createURL(URLparameter)
const mobileUrl = createMobileURL(fbURL)
return mobileUrl
}
const createDailyRotateLogFileTransport = () => {
const transport = new (winston.transports.DailyRotateFile)({
filename: path.join(__dirname, '..', 'logs', 'app-%DATE%.log'),
datePattern: 'YYYY-MM-DD-HH',
zippedArchive: false,
maxSize: '20m',
maxFiles: '14d',
})
return transport
}
const createTransports = (dev) => {
return [
dev && new winston.transports.Console(),
createDailyRotateLogFileTransport(),
].filter(transport => transport)
}
const createAppLogger = ({ dev }) => {
return winston.createLogger({
transports: createTransports(dev),
format: winston.format.combine(
winston.format.colorize(),
winston.format.json()
),
})
}
module.exports = {
checkValidURL,
checkURLFormat,
checkNumberURLParameter,
createParserError,
createMobileURL,
createURL,
getNormalizedUrl,
createAppLogger,
createTransports,
}