mirror of
https://github.com/comatory/fb2iCal
synced 2024-12-26 16:33:32 +01:00
98 lines
2.3 KiB
JavaScript
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,
|
|
}
|