From ce2a472caccdcc00491d7773b36a81486979553d Mon Sep 17 00:00:00 2001 From: JakkrapartXD Date: Mon, 23 Feb 2026 13:18:38 +0700 Subject: [PATCH] feat: Update enrollment last accessed timestamp on course content access and correct k6 test comment typo. --- .../src/services/CoursesStudent.service.ts | 33 ++++++++++++------- Backend/tests/k6/login-load-test.js | 2 +- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/Backend/src/services/CoursesStudent.service.ts b/Backend/src/services/CoursesStudent.service.ts index 0e9e5b86..f7b7c681 100644 --- a/Backend/src/services/CoursesStudent.service.ts +++ b/Backend/src/services/CoursesStudent.service.ts @@ -340,6 +340,17 @@ export class CoursesStudentService { throw new ForbiddenError('You are not enrolled in this course'); } + // Update last_accessed_at (fire-and-forget — ไม่ block response) + prisma.enrollment.update({ + where: { + unique_enrollment: { + user_id: decoded.id, + course_id, + }, + }, + data: { last_accessed_at: new Date() }, + }).catch(err => logger.warn(`Failed to update last_accessed_at: ${err}`)); + // Get all lesson progress for this user and course const lessonIds = course.chapters.flatMap(ch => ch.lessons.map(l => l.id)); const lessonProgress = await prisma.lessonProgress.findMany({ @@ -1249,17 +1260,17 @@ export class CoursesStudentService { } catch (error) { logger.error(`Error completing lesson: ${error}`); const decoded = jwt.decode(input.token) as { id: number } | null; - await auditService.logSync({ - userId: decoded?.id || 0, - action: AuditAction.ERROR, - entityType: 'LessonProgress', - entityId: input.lesson_id, - metadata: { - operation: 'complete_lesson', - lesson_id: input.lesson_id, - error: error instanceof Error ? error.message : String(error) - } - }); + await auditService.logSync({ + userId: decoded?.id || 0, + action: AuditAction.ERROR, + entityType: 'LessonProgress', + entityId: input.lesson_id, + metadata: { + operation: 'complete_lesson', + lesson_id: input.lesson_id, + error: error instanceof Error ? error.message : String(error) + } + }); throw error; } } diff --git a/Backend/tests/k6/login-load-test.js b/Backend/tests/k6/login-load-test.js index 2a0c375d..aee4cb4a 100644 --- a/Backend/tests/k6/login-load-test.js +++ b/Backend/tests/k6/login-load-test.js @@ -31,7 +31,7 @@ export const options = { thresholds: { http_req_duration: ['p(95)<2000'], // 95% of requests < 2s errors: ['rate<0.1'], // Error rate < 10% - login_duration: ['p(95)<2000'], // 95% of logins < 2s + login_duration: ['p(95)<2000'], // 95% pof logins < 2s }, };