Compare commits
3 Commits
fb648d477f
...
c8d0221247
| Author | SHA1 | Date | |
|---|---|---|---|
|
c8d0221247
|
|||
|
a9fa89107e
|
|||
|
7efb083e1d
|
4
.dockerignore
Normal file
4
.dockerignore
Normal file
@@ -0,0 +1,4 @@
|
||||
node_modules
|
||||
npm-debug.log
|
||||
Dockerfile
|
||||
.dockerignore
|
||||
14
Dockerfile
Normal file
14
Dockerfile
Normal 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
24
bin/www
@@ -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
3
caddy/Caddyfile
Normal file
@@ -0,0 +1,3 @@
|
||||
localhost {
|
||||
reverse_proxy app:3000
|
||||
}
|
||||
24
docker-compose.yml
Normal file
24
docker-compose.yml
Normal 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
4
package-lock.json
generated
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -163,4 +163,6 @@ app.use(function (err, req, res, next) {
|
||||
// next(createError(404));
|
||||
// });
|
||||
|
||||
app.set('trust proxy')
|
||||
|
||||
module.exports = {app};
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
@@ -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) => {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) => {
|
||||
|
||||
@@ -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`)
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user