const path = require('path') const fs = require('fs') exports.teamsnapMembersSortLineupAvailabilityLastName = (a, b) => { status_code_sort = [ teamsnap.AVAILABILITIES.YES, teamsnap.AVAILABILITIES.MAYBE, teamsnap.AVAILABILITIES.NO, teamsnap.AVAILABILITIES.NONE, ]; if (a.benchcoach.eventLineupEntry != null && b.benchcoach.eventLineupEntry != null){ return a.benchcoach.eventLineupEntry.sequence - b.benchcoach.eventLineupEntry.sequence } else if (a.benchcoach.eventLineupEntry != null && b.benchcoach.eventLineupEntry == null){ return -1 } else if (a.benchcoach.eventLineupEntry == null && b.benchcoach.eventLineupEntry != null) { return 1 } else { return teamsnapMembersSortAvailabilityLastName(a,b) } }; teamsnapMembersSortAvailabilityLastName = (a, b) => { status_code_sort = [ teamsnap.AVAILABILITIES.YES, teamsnap.AVAILABILITIES.MAYBE, teamsnap.AVAILABILITIES.NO, teamsnap.AVAILABILITIES.NONE, ]; a_sort = status_code_sort.indexOf(a.benchcoach.availability?.statusCode); b_sort = status_code_sort.indexOf(b.benchcoach.availability?.statusCode); if (a_sort > b_sort) { return 1; } if (a_sort < b_sort) { return -1; } if (a_sort == b_sort) { if (a.lastName < b.lastName) { return -1; } if (a.lastName > b.lastName) { return 1; } } } exports.teamsnapMembersSortAvailabilityLastName = teamsnapMembersSortAvailabilityLastName exports.initTeamsnap = (req, res, next) => { if (!teamsnap.isAuthed()) { teamsnap.init(process.env["TEAMSNAP_CLIENT_ID"]); teamsnap.auth(req.user.accessToken); } teamsnap.loadCollections((err) => { teamsnap.enablePersistence(); next(req, res, next); }); }; exports.teamsnapLog = (method, types, id, req, message="") => { console.log( '\x1b[33mTeamSnap:\x1b[0m', `${method} for \x1b[33m\[${types}\]\x1b[0m on ${id}`, `on url ${req.url}`, `"${message}"` ) return; } exports.tsPromise = (func_name, params) => { return new Promise(function(resolve, reject) { teamsnap.bulkLoad( params, (err, data) => { console.log(); if (err !== null) { reject(err); } else { resolve(data); } } ) ; }); } exports.teamsnapCallback = (err,items) => { if (err) { console.log(err.message); throw new Error(err) } return items; } exports.teamsnapFailure = (err, next) => { if (err) { console.log(err.message); } next(err); } const getPluralType = (type) =>{ // There are some instances where a type is not // in the list of teamsnap.types, so a plural // is not generated in the lookup. this is a // kludge around that. (specifically availabilitySummary) plural = teamsnap.getPluralType(type) || (function() { switch (type.slice(-1)) { case 'y': return type.slice(0, -1) + 'ies'; case 's': return type + 'es'; default: return type + 's'; } })(); return plural } exports.groupTeamsnapItems = (items, types = [], params = {}) => { const result = {}; items.forEach(item => { const type = item.type const type_plural = getPluralType(type) if ((types.length > 0 && types.includes(type)) || (types.length == 0)) { if (!result[type_plural]) result[type_plural] = [] result[type_plural].push(item) } }) return result; } exports.embeddedSvgFromPath = (svg_path, additional_classes = "") => { const iconStaticPaths = { "/teamsnap-ui/assets":path.join(__dirname, "/../../node_modules/@teamsnap/teamsnap-ui/src/assets"), "/bootstrap-icons":path.join(__dirname, "/../../node_modules/bootstrap-icons/icons"), "/media":path.join(__dirname, "/../public/media") } for (const [key, value] of Object.entries(iconStaticPaths)) { if (svg_path.startsWith(key)) { svg_path = svg_path.replace(key, value) } } const svg = fs.readFileSync(`${svg_path}`, 'utf8'); svgRegExWithClass = new RegExp(//) svgRegExWithoutClass = new RegExp(//) if (svgRegExWithClass.test(svg)) { return svg.replace(svgRegExWithClass, ``) } else if (svgRegExWithoutClass.test(svg)) { return svg.replace(svgRegExWithoutClass, ``) } else return svg } exports.parsePositionLabel = (label) => { if (label == null) { return { positionLabelWithoutFlags: null, positionFlags: null } } const pattern = /(?[A-Z0-9]+)(?:\s\[(?.[A-z,]+)\])?/g const {pos, flags} = pattern.exec(label)?.groups || {} const positionLabelWithoutFlags= pos const positionFlags = flags?.split(',').map(f=>f.trim()) || [] return {positionLabelWithoutFlags, positionFlags} } exports.compilePositionLabel = (label, flags) => { if (flags == null || flags == '' || flags.lengh == 0) { return label } else { const flags_set = new Set(flags.split(',').map(s=>s.trim())) return `${label} [${Array.from(flags_set).sort().join(',')}]` } }