Compare commits

...

3 Commits

Author SHA1 Message Date
c8d0221247 dockerizing 2024-03-10 14:16:31 -05:00
a9fa89107e updates to teamsnapCallback 2024-03-10 14:01:09 -05:00
7efb083e1d update branch of teamsnap-javascript-sdk 2024-03-10 14:00:39 -05:00
17 changed files with 139 additions and 78 deletions

4
.dockerignore Normal file
View File

@@ -0,0 +1,4 @@
node_modules
npm-debug.log
Dockerfile
.dockerignore

14
Dockerfile Normal file
View File

@@ -0,0 +1,14 @@
FROM node:21
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
RUN mkdir -p /home/node/app/var/db && chown -R node:node /home/node/app
WORKDIR /home/node/app
USER node
COPY --chown=node:node package*.json ./
RUN npm install
COPY --chown=node:node src src
COPY --chown=node:node bin bin
EXPOSE 3000
CMD [ "npm", "start" ]

24
bin/www
View File

@@ -20,20 +20,18 @@ const path = require("path");
var port = normalizePort(process.env.PORT || "3000");
app.set("port", port);
/**
* Create HTTPS server.
*/
const https_options = {
key: fs.readFileSync("certs/key.pem"),
cert: fs.readFileSync("certs/cert.pem"),
};
if (process.env.NODE_ENV === "development") {
// console.log(`starting livereload, watching ${path.join(__dirname, "../src/views")}`)
/**
* Create HTTPS server.
*/
const https_options = {
key: fs.readFileSync("certs/key.pem"),
cert: fs.readFileSync("certs/cert.pem"),
};
var livereload = require("livereload");
var connectLiveReload = require("connect-livereload");
const liveReloadServer = livereload.createServer({https: https_options, extraExts: ['pug']});
const liveReloadServer = livereload.createServer({https: https_options});
liveReloadServer.watch(path.join(__dirname, "../src/views"));
liveReloadServer.server.once("connection", () => {
setTimeout(() => {
@@ -41,9 +39,11 @@ if (process.env.NODE_ENV === "development") {
}, 100);
});
var server = https.createServer(https_options, app);
}
else {
var server = http.createServer(app);
}
var server = https.createServer(https_options, app);
/**
* Listen on provided port, on all network interfaces.

3
caddy/Caddyfile Normal file
View File

@@ -0,0 +1,3 @@
localhost {
reverse_proxy app:3000
}

24
docker-compose.yml Normal file
View File

@@ -0,0 +1,24 @@
version: "3.3"
services:
app:
env_file:
- .env
build: .
networks:
- web
expose:
- 3000
caddy:
image: caddy
ports:
- 80:80
- 443:443
volumes:
- ./caddy/Caddyfile:/etc/caddy/Caddyfile
networks:
- web
networks:
web:

4
package-lock.json generated
View File

@@ -34,7 +34,7 @@
"pluralize": "^8.0.0",
"pug": "^3.0.2",
"sortablejs": "^1.15.0",
"teamsnap.js": "github:anthonyscorrea/teamsnap-javascript-sdk#add-eventLineup-eventLineupEntry",
"teamsnap.js": "github:anthonyscorrea/teamsnap-javascript-sdk#link-with-null-link",
"tinymce": "^6.8.3",
"underscore": "^1.13.6",
"xhr2": "^0.2.1"
@@ -4708,7 +4708,7 @@
},
"node_modules/teamsnap.js": {
"version": "1.62.1",
"resolved": "git+ssh://git@github.com/anthonyscorrea/teamsnap-javascript-sdk.git#67168be49492fe5a0331bbbeb33408a42c40ab9a",
"resolved": "git+ssh://git@github.com/anthonyscorrea/teamsnap-javascript-sdk.git#cf747f97f030270615f6d293e734adb6fb1b5e86",
"dependencies": {
"form-data": "1.0.0-rc3",
"xmlhttprequest": "1.8.0"

View File

@@ -55,7 +55,7 @@
"pluralize": "^8.0.0",
"pug": "^3.0.2",
"sortablejs": "^1.15.0",
"teamsnap.js": "github:anthonyscorrea/teamsnap-javascript-sdk#add-eventLineup-eventLineupEntry",
"teamsnap.js": "github:anthonyscorrea/teamsnap-javascript-sdk#link-with-null-link",
"tinymce": "^6.8.3",
"underscore": "^1.13.6",
"xhr2": "^0.2.1"

View File

@@ -163,4 +163,6 @@ app.use(function (err, req, res, next) {
// next(createError(404));
// });
app.set('trust proxy')
module.exports = {app};

View File

@@ -1,6 +1,7 @@
tsUtils = require("../lib/utils");
const path = require('path');
const { teamsnapFailure, tsPromise } = require("../lib/utils");
const { teamsnapFailure, tsPromise, teamsnapCallback } = require("../lib/utils");
const {promisify} = require('util')
exports.helpers = {
@@ -23,8 +24,12 @@ exports.partials = path.join(__dirname, "../views/event/partials")
exports.getEvents = async (req, res, next) => {
const {user, team, layout} = req
const bulkLoadTypes = ["event", "availabilitySummary"]
req.promises.push(
tsPromise('bulkLoad', {teamId: team.id, types: bulkLoadTypes})
// const tsPromiseBulkload = promisify(teamsnap.bulkLoad)
const promise = teamsnap.bulkLoad(
{teamId: team.id, types: bulkLoadTypes},
undefined,
(err,items) => {teamsnapCallback(err, items, {req, source: 'getEvents', method: 'bulkLoad'})}
)
.then(items=>tsUtils.groupTeamsnapItems(items))
.then(items=>{
items.events.forEach((event) => {
@@ -34,13 +39,10 @@ exports.getEvents = async (req, res, next) => {
req.events = items.events;
}
)
.then(tsUtils.teamsnapLog('bulkLoad', types=bulkLoadTypes, team.id, req))
.catch((err) => {
teamsnapFailure(err,next)
})
)
await Promise.all(req.promises)
req.promises.push(promise)
all = await Promise.all(req.promises)
try {
const context = {
title: "Events",

View File

@@ -10,7 +10,6 @@ exports.getTeams = async (req, res, next) => {
teamsnapCallback(err,items);
req.teams = items;
})
.then(() => tsUtils.teamsnapLog('loadTeams', types=['teams'], null, req))
.fail(
next
)

View File

@@ -61,40 +61,25 @@ exports.initTeamsnap = (req, res, next) => {
});
};
exports.teamsnapLog = (method, types, id, req, message="") => {
console.log(
exports.teamsnapCallback = (err,result, d) => {
if (Array.isArray(result)){
types = new Set(result.map(i=>i.type))
}
else {
types = [result?.type]
}
if (d) {
console.log(
'\x1b[33mTeamSnap:\x1b[0m',
`${method} for \x1b[33m\[${types}\]\x1b[0m on ${id}`,
`on url ${req.url}`,
`"${message}"`
`${d.source} using ${d.method ? "teamsnap."+d.method : "?"} \x1b[33m\[${Array.from(types).join(", ")}\]\x1b[0m`
)
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) {
}
if (err) {
console.log(err.message);
throw new Error(err)
}
return items;
return result;
}
exports.teamsnapFailure = (err, next) => {

View File

@@ -18,6 +18,7 @@ passport.use(
callbackURL: "/auth/teamsnap/callback",
passReqToCallback: true,
scope: ["read", "write"],
proxy: true
},
async function (req, accessToken, refreshToken, profile, done) {
json = JSON.parse(profile._raw);

View File

@@ -2,16 +2,20 @@ const express = require("express");
const eventsController = require("../controllers/event");
const router = express.Router();
const tsUtils = require("../lib/utils")
const {teamsnapCallback} = require("../lib/utils")
// Middleware
const loadEvent = (req,res,next) => {
const {team_id, event_id} = req.params;
const bulkLoadTypes = ["event", "availabilitySummary"]
tsUtils.teamsnapLog('bulkLoad', types=bulkLoadTypes, team_id, req);
req.promises.push(teamsnap.bulkLoad({teamId: team_id, types: bulkLoadTypes, scopeTo:'event', event__id:event_id}, null, tsUtils.teamsnapCallback)
req.promises.push(
teamsnap.bulkLoad(
{teamId: team_id, types: bulkLoadTypes, scopeTo:'event', event__id:event_id},
null,
(err, items) => {teamsnapCallback(err, items, {req, source:"loadEvent", method:'bulkLoad'})}
)
.then(bulkLoadItems=>{
const items = tsUtils.groupTeamsnapItems(bulkLoadItems, bulkLoadTypes);
tsUtils.teamsnapLog('bulkLoad', types=bulkLoadTypes, team_id, req);
req.availabilitySummary = items.availabilitySummaries.find(e=>e.eventId==event_id);
req.event = items.events.find(e=>e.id==event_id);
}

View File

@@ -5,6 +5,7 @@ const tsUtils = require('../lib/utils')
const multer = require("multer");
const upload = multer()
const { doubleCsrfProtection } = require('../middlewares/csrf');
const {teamsnapCallback} = require("../lib/utils")
// Middleware
@@ -12,16 +13,24 @@ const loadEventLineup = (req,res,next) => {
const {team_id, event_id} = req.params
if (!req.event_lineup){
bulkLoadTypes = ['eventLineup', 'eventLineupEntry']
req.promises.push(teamsnap.bulkLoad({teamId: team_id, types: bulkLoadTypes, scopeTo:'event', event__id:event_id}, null, tsUtils.teamsnapCallback)
req.promises.push(
teamsnap.bulkLoad(
{teamId: team_id, types: bulkLoadTypes, scopeTo:'event', event__id:event_id},
null,
(err, items) => {teamsnapCallback(err, items, {req, source:"loadEventLineup", method:'bulkLoad'})}
)
.then(items => tsUtils.groupTeamsnapItems(items, bulkLoadTypes))
.then(items => {
tsUtils.teamsnapLog('bulkLoad', types=bulkLoadTypes, team_id, req);
req.event_lineup = items.eventLineups.pop();
req.event_lineup_entries = items.eventLineupEntries?.sort((a,b)=>a.sequence-b.sequence) || [];
})
)
tsUtils.teamsnapLog('loadAvailabilites', types=['availabilities'], team_id, req);
req.promises.push(teamsnap.loadAvailabilities({eventId: event_id}).then(availabilities => req.availabilities = availabilities))
req.promises.push(
teamsnap.loadAvailabilities(
{eventId: event_id},
(err, items) => {teamsnapCallback(err, items, {req, source:"loadEventLineup", method:'loadAvailabilities'})}
)
.then(availabilities => req.availabilities = availabilities))
}
else {
// const {event_lineup} = req

View File

@@ -5,6 +5,7 @@ const {loadEvent} = require("./event");
const {loadRecentAndUpcomingEvents} = require("../middlewares/bulkload")
const router = express.Router();
const tsUtils = require('../lib/utils')
const {teamsnapCallback} = require('../lib/utils')
const multer = require("multer");
const upload = multer()
@@ -18,19 +19,25 @@ const loadEvents = async (req,res,next) => {
const eventIds = [...recent_events.map(e=>e.id), event_id, ...upcoming_events.map(e=>e.id)]
// if (!req.event_lineup){
bulkLoadTypes = ['event','eventLineup', 'eventLineupEntry']
req.promises.push(teamsnap.bulkLoad({teamId: team_id, types: bulkLoadTypes, scopeTo:'event', event__id:eventIds}, null, tsUtils.teamsnapCallback)
req.promises.push(
teamsnap.bulkLoad(
{teamId: team_id, types: bulkLoadTypes, scopeTo:'event', event__id:eventIds},
null,
(err, items) => {teamsnapCallback(err, items, {req, source:"loadEvents", method:'bulkLoad'})}
)
.then(items => tsUtils.groupTeamsnapItems(items, bulkLoadTypes))
.then(items => {
tsUtils.teamsnapLog('bulkLoad', types=bulkLoadTypes, team_id, req);
req.timeline.events = items.events;
req.timeline.event_lineups = items.eventLineups;
req.timeline.event_lineup_entries = items.eventLineupEntries;
})
)
tsUtils.teamsnapLog('loadAvailabilites', types=['availabilities'], team_id, req);
req.promises.push(
teamsnap.loadAvailabilities({eventId: eventIds}).then(availabilities => {
teamsnap.loadAvailabilities(
{eventId: eventIds},
(err, items) => {teamsnapCallback(err, items, {req, source:"loadEvents", method:'loadAvailabilities'})}
).then(availabilities => {
req.timeline.availabilities = availabilities
}
)
@@ -53,7 +60,7 @@ const linksForEventSheet = async (req, res, next) => {
}
router.use("/:team_id([0-9]+)/event/:event_id([0-9]+)/sheet", loadEventLineup)
router.get("/:team_id([0-9]+)/event/:event_id([0-9]+)/lineup/:event_lineup_id([0-9]+)/sheet", loadEventLineup, loadRecentAndUpcomingEvents, loadEvents, eventsSheetController.getEventSheet)
router.get("/:team_id([0-9]+)/event/:event_id([0-9]+)/lineup/:event_lineup_id([0-9]+)/sheet", loadRecentAndUpcomingEvents, loadEvents, eventsSheetController.getEventSheet)
// Routes
router.get("/:team_id([0-9]+)/event/:event_id([0-9]+)/sheet", async (req,res) => {

View File

@@ -5,21 +5,25 @@ var router = express.Router();
const multer = require("multer");
const upload = multer()
const { doubleCsrfProtection } = require('../middlewares/csrf');
const {teamsnapCallback} = require('../lib/utils')
// Middleware
const loadOpponent = (req,res,next) => {
const {opponent_id} = req.params;
const {team} = req
req.promises.push(
teamsnap.loadOpponents(team.id, (err, opponents)=>{
if (err) console.log("error in route/opponent.js", err);
}).then(opponents => {req.opponent=opponents.find(o=>o.id==opponent_id);})
teamsnap.loadOpponents(
team.id,
(err, opponents) => {teamsnapCallback(err, opponents, {req, source:"loadOpponent", method:'loadOpponent'})}
)
.then(opponents => {req.opponent=opponents.find(o=>o.id==opponent_id);})
)
req.promises.push(
teamsnap.loadTeamMedia(team.id, (err, team_media)=>{
if (err) console.log("error in route/opponent.js", err);
})
teamsnap.loadTeamMedia(
team.id,
(err, opponents) => {teamsnapCallback(err, opponents, {req, source:"loadOpponent", method:'teamMedia'})}
)
.then(team_media => {
req.opponent_logo = team_media.find(tm=>tm.description==`opponent-logo-${opponent_id}.png`)
}

View File

@@ -4,28 +4,31 @@ const {loadRecentAndUpcomingEvents} = require("../middlewares/bulkload")
const { load } = require("dotenv");
const router = express.Router();
const tsUtils = require('../lib/utils')
const {teamsnapCallback} = require('../lib/utils')
// Middleware
const loadTeam = async (req,res,next) => {
const {team_id} = req.params;
req.team = await teamsnap.loadTeam(team_id)
tsUtils.teamsnapLog('loadTeam', types=["team"], team_id, req);
req.team = await teamsnap.loadTeam(
team_id,
(err, result) => {teamsnapCallback(err, result, {req, source: 'loadTeam', method: 'loadTeam'})}
)
const bulkLoadTypes = ['teamMediaGroup', 'teamPreferences', 'member'];
const items = tsUtils.groupTeamsnapItems(teamsnap.getAllItems(), bulkLoadTypes)
if (req.session.current_team_id == null || req.session.current_team_id != team_id || bulkLoadTypes.filter(t=> !items[t] || items[t].length==0).length > 0){
req.promises.push(teamsnap.bulkLoad(
team_id,
bulkLoadTypes,
tsUtils.teamsnapCallback
).then(bulkLoadItems=>{
(err,items) => {teamsnapCallback(err, items, {req, source: 'loadTeam', method: 'bulkLoad'})}
)
.then(bulkLoadItems=>{
const items = tsUtils.groupTeamsnapItems(bulkLoadItems, bulkLoadTypes)
req.members = items.members;
req.team_media_group = items.teamMediaGroups?.pop();
req.team_preferences = items.teamsPreferences.pop();
req.session.current_team_id = req.team.id
req.session.current_team_id = req.team.id;
}
)
.then(() => tsUtils.teamsnapLog('bulkLoad', types=bulkLoadTypes, team_id, req))
)
}
else {