diff --git a/src/handler/analysis/analysisHandler.ts b/src/handler/analysis/analysisHandler.ts index 6772dc17..44f63999 100644 --- a/src/handler/analysis/analysisHandler.ts +++ b/src/handler/analysis/analysisHandler.ts @@ -120,7 +120,7 @@ export const createAnalysisHandler: < context, ); - res.set('X-Lovat-Cache','miss'); + res.set("X-Lovat-Cache", "miss"); res.status(200).send(calculatedAnalysis.error ?? calculatedAnalysis); try { @@ -143,7 +143,7 @@ export const createAnalysisHandler: < return; } } else { - res.set('X-Lovat-Cache','hit'); + res.set("X-Lovat-Cache", "hit"); res.status(200).send(JSON.parse(cacheRow.toString())); } } catch (error) { diff --git a/src/handler/analysis/teamLookUp/breakdownMetrics.ts b/src/handler/analysis/teamLookUp/breakdownMetrics.ts index ab2a371f..a43e67a9 100644 --- a/src/handler/analysis/teamLookUp/breakdownMetrics.ts +++ b/src/handler/analysis/teamLookUp/breakdownMetrics.ts @@ -1,4 +1,5 @@ import z from "zod"; +import prismaClient from "../../../prismaClient.js"; import { nonEventMetric } from "../coreAnalysis/nonEventMetric.js"; import { lowercaseToBreakdown, @@ -22,7 +23,27 @@ export const breakdownMetrics = createAnalysisHandler({ }; }, calculateAnalysis: async ({ params }, ctx) => { - const result = {}; + const teamRow = await prismaClient.team.findUnique({ + where: { number: params.team }, + select: { number: true }, + }); + + if (!teamRow) { + return { error: "TEAM_DOES_NOT_EXIST" }; + } + + const reportCount = await prismaClient.scoutReport.count({ + where: { + teamMatchData: { + teamNumber: params.team, + }, + }, + }); + if (reportCount === 0) { + return { error: "NO_DATA_FOR_TEAM" }; + } + + const result: Record = {}; for (const [key, metric] of Object.entries(lowercaseToBreakdown)) { const data = await nonEventMetric(ctx.user, { team: params.team, diff --git a/src/handler/analysis/teamLookUp/categoryMetrics.ts b/src/handler/analysis/teamLookUp/categoryMetrics.ts index 802f9c3b..aad18aef 100644 --- a/src/handler/analysis/teamLookUp/categoryMetrics.ts +++ b/src/handler/analysis/teamLookUp/categoryMetrics.ts @@ -1,4 +1,5 @@ import z from "zod"; +import prismaClient from "../../../prismaClient.js"; import { metricsCategory, metricToName } from "../analysisConstants.js"; import { averageManyFast } from "../coreAnalysis/averageManyFast.js"; import { createAnalysisHandler } from "../analysisHandler.js"; @@ -9,6 +10,7 @@ export const categoryMetrics = createAnalysisHandler({ team: z.preprocess((x) => Number(x), z.number()), }), }, + usesDataSource: true, shouldCache: true, createKey: ({ params }) => { @@ -19,9 +21,29 @@ export const categoryMetrics = createAnalysisHandler({ }; }, calculateAnalysis: async ({ params }, ctx) => { - const result = {}; + const teamRow = await prismaClient.team.findUnique({ + where: { number: params.team }, + select: { number: true }, + }); + + if (!teamRow) { + return { error: "TEAM_DOES_NOT_EXIST" }; + } + + const reportCount = await prismaClient.scoutReport.count({ + where: { + teamMatchData: { + teamNumber: params.team, + }, + }, + }); + + if (reportCount === 0) { + return { error: "NO_DATA_FOR_TEAM" }; + } + + const result: Record = {}; - //update if statments in arrayAndAverage if the metric needs to look at scoutReport instead of events table const data = await averageManyFast(ctx.user, { teams: [params.team], metrics: metricsCategory, diff --git a/src/handler/analysis/teamLookUp/getNotes.ts b/src/handler/analysis/teamLookUp/getNotes.ts index 02e7ddf8..6f76fe29 100644 --- a/src/handler/analysis/teamLookUp/getNotes.ts +++ b/src/handler/analysis/teamLookUp/getNotes.ts @@ -22,6 +22,26 @@ export const getNotes = createAnalysisHandler({ }; }, calculateAnalysis: async ({ params }, ctx) => { + const teamRow = await prismaClient.team.findUnique({ + where: { number: params.team }, + select: { number: true }, + }); + + if (!teamRow) { + return { error: "TEAM_DOES_NOT_EXIST" }; + } + + const reportCount = await prismaClient.scoutReport.count({ + where: { + teamMatchData: { + teamNumber: params.team, + }, + }, + }); + if (reportCount === 0) { + return { error: "NO_DATA_FOR_TEAM" }; + } + let notesAndMatches: { notes: string; match: string; @@ -30,7 +50,6 @@ export const getNotes = createAnalysisHandler({ scouterName?: string; }[]; - // Set up filters to decrease server load const sourceTnmtFilter = dataSourceRuleToPrismaFilter( dataSourceRuleSchema(z.string()).parse(ctx.user.tournamentSourceRule), ); @@ -71,7 +90,6 @@ export const getNotes = createAnalysisHandler({ }, }, orderBy: [ - // Ordered by most recent first { teamMatchData: { tournament: { date: "desc" } } }, { teamMatchData: { matchType: "desc" } }, { teamMatchData: { matchNumber: "desc" } }, diff --git a/src/handler/manager/getScouters.ts b/src/handler/manager/getScouters.ts index d86e81a5..6218fae1 100644 --- a/src/handler/manager/getScouters.ts +++ b/src/handler/manager/getScouters.ts @@ -5,7 +5,7 @@ import z from "zod"; export const getScouters = async ( req: AuthenticatedRequest, - res: Response + res: Response, ): Promise => { try { const params = z diff --git a/src/handler/manager/getScoutersOnTeam.ts b/src/handler/manager/getScoutersOnTeam.ts index a3933c71..83967451 100644 --- a/src/handler/manager/getScoutersOnTeam.ts +++ b/src/handler/manager/getScoutersOnTeam.ts @@ -4,7 +4,7 @@ import z from "zod"; export const getScoutersOnTeam = async ( req: Request, - res: Response + res: Response, ): Promise => { try { console.log(req.headers); diff --git a/src/handler/manager/scoutingLeadProgressPage.ts b/src/handler/manager/scoutingLeadProgressPage.ts index 5f48ec45..c4deebed 100644 --- a/src/handler/manager/scoutingLeadProgressPage.ts +++ b/src/handler/manager/scoutingLeadProgressPage.ts @@ -5,7 +5,7 @@ import { AuthenticatedRequest } from "../../lib/middleware/requireAuth.js"; export const scoutingLeadProgressPage = async ( req: AuthenticatedRequest, - res: Response + res: Response, ): Promise => { try { const params = z @@ -147,7 +147,7 @@ export const scoutingLeadProgressPage = async ( matchesScouted: matchesScoutedAtTournament.length, missedMatches: Math.max( 0, - totalAssignedScouterMatches - matchesScoutedAtTournament.length + totalAssignedScouterMatches - matchesScoutedAtTournament.length, ), }; result.push(currData); diff --git a/src/handler/slack/addSlackWorkspace.ts b/src/handler/slack/addSlackWorkspace.ts index a2b1252f..a17b5603 100644 --- a/src/handler/slack/addSlackWorkspace.ts +++ b/src/handler/slack/addSlackWorkspace.ts @@ -48,7 +48,7 @@ export const addSlackWorkspace = async ( if (!teamRow) { res.status(404).send("Team not found"); - return + return; } await prismaClient.slackWorkspace.upsert({ diff --git a/src/index.ts b/src/index.ts index d813e07b..49021ff7 100644 --- a/src/index.ts +++ b/src/index.ts @@ -140,7 +140,7 @@ app.post( "/v1/slack/command", express.urlencoded({ extended: true }), requireSlackToken, - processCommand + processCommand, ); app.post("/v1/slack/event", requireSlackToken, processEvent); @@ -148,7 +148,7 @@ app.post("/v1/slack/event", requireSlackToken, processEvent); app.post( "/v1/manager/onboarding/verifyemail", requireLovatSignature, - approveTeamEmail + approveTeamEmail, ); //tested // Log requests @@ -158,12 +158,12 @@ app.use(posthogReporter); app.get( "/v1/manager/tournament/:tournament/teams", requireAuth, - getTeamsInTournament + getTeamsInTournament, ); app.get( "/v1/manager/tournament/:tournament/rankedTeams", requireAuth, - getTeamRankings + getTeamRankings, ); app.get("/v1/manager/teams", requireAuth, getTeams); //tested app.get("/v1/manager/tournaments", requireAuth, getTournaments); //tested @@ -181,7 +181,7 @@ app.get("/v1/manager/scoutreports/:uuid", getScoutReport); //tested app.post( "/v1/manager/tournament/:tournament/scoutershifts", requireAuth, - addScouterShift + addScouterShift, ); //tested , expecting only 1 at a time // app.get('/manager/tournament/:tournament/scoutershifts',requireAuth, getScouterSchedule) //tested app.post("/v1/manager/scoutershifts/:uuid", requireAuth, updateScouterShift); //tested @@ -200,18 +200,18 @@ app.post("/v1/manager/mutablepicklists", requireAuth, addMutablePicklist); // te app.delete( "/v1/manager/mutablepicklists/:uuid", requireAuth, - deleteMutablePicklist + deleteMutablePicklist, ); //tested app.get("/v1/manager/mutablepicklists", requireAuth, getMutablePicklists); //tested app.get( "/v1/manager/mutablepicklists/:uuid", requireAuth, - getSingleMutablePicklist + getSingleMutablePicklist, ); //tested app.put( "/v1/manager/mutablepicklists/:uuid", requireAuth, - updateMutablePicklist + updateMutablePicklist, ); //tested // Also it would be nice to have an endpoint to subscribe to a mutable picklist, so that the client can get updates when it changes @@ -221,7 +221,7 @@ app.put( app.get( "/v1/manager/registeredteams/:team/registrationstatus", requireAuth, - checkRegisteredTeam + checkRegisteredTeam, ); //tested app.post("/v1/manager/onboarding/username", requireAuth, addUsername); //tested app.post("/v1/manager/onboarding/teamcode", requireAuth, checkCode); //tested @@ -229,18 +229,18 @@ app.post("/v1/manager/settings/teamsource", requireAuth, addTeamSource); //teste app.post( "/v1/manager/settings/tournamentsource", requireAuth, - addTournamentSource + addTournamentSource, ); app.post("/v1/manager/onboarding/team", requireAuth, addRegisteredTeam); //tested, is the link correct? app.post( "/v1/manager/registeredteams/:team/approve", requireLovatSignature, - approveRegisteredTeam + approveRegisteredTeam, ); //tested waiting for new middle ware app.post( "/v1/manager/registeredteams/:team/reject", requireLovatSignature, - rejectRegisteredTeam + rejectRegisteredTeam, ); // tested, waiting for new middle ware app.post("/v1/manager/onboarding/teamwebsite", requireAuth, addWebsite); //tested @@ -248,7 +248,7 @@ app.post( "/v1/manager/onboarding/resendverificationemail", resendEmailLimiter, requireAuth, - resendEmail + resendEmail, ); //tested app.get("/v1/manager/profile", requireAuth, getProfile); //tested app.get("/v1/manager/users", requireAuth, getUsers); //tested @@ -263,13 +263,13 @@ app.get("/v1/manager/settings/teamsource", requireAuth, getTeamSource); app.get( "/v1/manager/settings/tournamentsource", requireAuth, - getTournamentSource + getTournamentSource, ); app.put( "/v1/manager/settings/teamemail", updateTeamEmails, requireAuth, - updateTeamEmail + updateTeamEmail, ); //scouting lead information/QR codes @@ -277,13 +277,13 @@ app.get("/v1/manager/code", requireAuth, getTeamCode); app.get( "/v1/manager/tournament/:tournament/scoutershifts", requireAuth, - getScouterSchedule + getScouterSchedule, ); //tested app.post( "/v1/manager/dashboard/scoutreport", requireAuth, - addScoutReportDashboard + addScoutReportDashboard, ); //scouter onboarding @@ -310,7 +310,7 @@ app.get("/v1/analysis/breakdown/team/:team", requireAuth, breakdownMetrics); //t app.get( "/v1/analysis/breakdown/team/:team/:breakdown", requireAuth, - breakdownDetails + breakdownDetails, ); app.get("/v1/analysis/notes/team/:team", requireAuth, getNotes); //tested app.get("/v1/analysis/flag/team/:team", requireAuth, multipleFlags); //tested @@ -334,17 +334,17 @@ app.get("/v1/manager/scouterreports", requireAuth, scouterScoutReports); app.get( "/v1/analysis/metrics/scoutreport/:uuid", requireAuth, - matchPageSpecificScouter + matchPageSpecificScouter, ); app.get( "/v1/analysis/scoutreports/match/:match", requireAuth, - scoutReportForMatch + scoutReportForMatch, ); app.get( "/v1/analysis/timeline/scoutreport/:uuid", requireAuth, - timelineForScoutReport + timelineForScoutReport, ); //pit scouting @@ -361,7 +361,7 @@ app.get("/v1/analysis/reportcsv", requireAuth, getReportCSV); app.get( "/v1/manager/team-tournament-status", requireAuth, - getTeamTournamentStatus + getTeamTournamentStatus, ); // match results from scouting reports diff --git a/src/lib/middleware/posthogMiddleware.ts b/src/lib/middleware/posthogMiddleware.ts index 6f6c59f1..38dcc42e 100644 --- a/src/lib/middleware/posthogMiddleware.ts +++ b/src/lib/middleware/posthogMiddleware.ts @@ -61,7 +61,7 @@ const posthogReporter = async ( $set: userProps, $pathname: req.route?.path, method: req.method, - cache: res.getHeader('X-Lovat-Cache'), + cache: res.getHeader("X-Lovat-Cache"), path: req.path, query: req.query, reqBody: req.body,