diff --git a/backend/api/controllers/result.ts b/backend/api/controllers/result.ts index 3c840956e..8f60ffe4b 100644 --- a/backend/api/controllers/result.ts +++ b/backend/api/controllers/result.ts @@ -45,6 +45,14 @@ export async function getResults( ): Promise { const { uid } = req.ctx.decodedToken; const results = await ResultDAL.getResults(uid); + return new MonkeyResponse("Results retrieved", results); +} + +export async function getLastResult( + req: MonkeyTypes.Request +): Promise { + const { uid } = req.ctx.decodedToken; + const results = await ResultDAL.getLastResult(uid); return new MonkeyResponse("Result retrieved", results); } diff --git a/backend/api/routes/results.ts b/backend/api/routes/results.ts index f08922c02..5da2a7a11 100644 --- a/backend/api/routes/results.ts +++ b/backend/api/routes/results.ts @@ -9,6 +9,7 @@ import * as RateLimit from "../../middlewares/rate-limit"; import { Router } from "express"; import { authenticateRequest } from "../../middlewares/auth"; import joi from "joi"; +import apeRateLimit from "../../middlewares/ape-rate-limit"; const router = Router(); @@ -57,4 +58,14 @@ router.delete( asyncHandler(ResultController.deleteAll) ); +router.get( + "/last", + RateLimit.resultsGet, + authenticateRequest({ + acceptApeKeys: true, + }), + apeRateLimit, + asyncHandler(ResultController.getLastResult) +); + export default router; diff --git a/backend/documentation/public-swagger.json b/backend/documentation/public-swagger.json index a6bc6f507..09158092c 100644 --- a/backend/documentation/public-swagger.json +++ b/backend/documentation/public-swagger.json @@ -21,6 +21,10 @@ { "name": "leaderboards", "description": "Leaderboard data and related operations" + }, + { + "name": "results", + "description": "User results data and related operations" } ], "paths": { @@ -68,6 +72,20 @@ } } }, + "/results/last": { + "get": { + "tags": ["results"], + "summary": "Gets a user's last saved result", + "responses": { + "200": { + "description": "", + "schema": { + "$ref": "#/definitions/Result" + } + } + } + } + }, "/leaderboards": { "get": { "tags": ["leaderboards"], @@ -284,6 +302,130 @@ "example": 1644438189583 } } + }, + "Result": { + "type": "object", + "properties": { + "_id": { + "type": "string", + "example": "6226b17aebc27a4a8d1ce04b" + }, + "wpm": { + "type": "number", + "format": "double", + "example": 154.84 + }, + "rawWpm": { + "type": "number", + "format": "double", + "example": 154.84 + }, + "charStats": { + "type": "array", + "example": [44, 0, 0, 0] + }, + "acc": { + "type": "number", + "format": "double", + "example": 100 + }, + "mode": { + "type": "string", + "example": "words" + }, + "mode2": { + "type": "string", + "example": "10" + }, + "quoteLength": { + "type": "integer", + "example": -1 + }, + "timestamp": { + "type": "integer", + "example": 1651141719000 + }, + "restartCount": { + "type": "integer", + "example": 0 + }, + "incompleteTestSeconds": { + "type": "number", + "format": "double", + "example": 14.5 + }, + "tags": { + "type": "array", + "example": ["6210edbfc4fdc8a1700e648b"] + }, + "consistency": { + "type": "number", + "format": "double", + "example": 78.68 + }, + "keyConsistency": { + "type": "number", + "format": "double", + "example": 60.22 + }, + "chartData": { + "type": "object", + "properties": { + "wpm": { + "type": "array", + "example": [144, 144, 144, 154] + }, + "raw": { + "type": "array", + "example": [150, 148, 124, 114] + }, + "err": { + "type": "array", + "example": [0, 0, 0, 0] + } + } + }, + "testDuration": { + "type": "number", + "format": "double", + "example": 3.41 + }, + "afkDuration": { + "type": "number", + "format": "double", + "example": 0 + }, + "keySpacingStats": { + "type": "object", + "properties": { + "average": { + "type": "number", + "format": "double", + "example": 77.61 + }, + "sd": { + "type": "number", + "format": "double", + "example": 33.31 + } + } + }, + "keyDurationStats": { + "type": "object", + "properties": { + "average": { + "type": "number", + "format": "double", + "example": 42.01 + }, + "sd": { + "type": "number", + "format": "double", + "example": 19.65 + } + } + } + } } } }