From 6a84434259df6eafb00aa9f9e7d2611db2b5fd90 Mon Sep 17 00:00:00 2001 From: salmanabdurrahman Date: Fri, 24 Oct 2025 10:09:09 +0700 Subject: [PATCH 1/2] feat(user): add endpoint to reset user data for testing - add endpoint to reset user data - delete all comments related to the user's posts - delete all related data for the user - reset userWhy and checkinTime fields --- src/api/users/user.controller.ts | 27 ++++++++++++++++++++- src/api/users/user.routes.ts | 8 ++++++- src/api/users/user.service.ts | 41 ++++++++++++++++++++++++++++++++ 3 files changed, 74 insertions(+), 2 deletions(-) diff --git a/src/api/users/user.controller.ts b/src/api/users/user.controller.ts index 3bf3eb2..8734366 100644 --- a/src/api/users/user.controller.ts +++ b/src/api/users/user.controller.ts @@ -1,5 +1,5 @@ import type { Request, Response } from 'express'; -import { findUserById, updateUserSettings } from './user.service.js'; +import { findUserById, resetUserDataForTesting, updateUserSettings } from './user.service.js'; import { asyncHandler } from '../../handler/async.handler.js'; import { errorResponse, successResponse } from '../../core/response.js'; @@ -43,3 +43,28 @@ export const updateUserSettingsHandler = asyncHandler(async (req: Request, res: const updatedUser = await updateUserSettings(userId, dataToUpdate); return successResponse(res, 200, 'Pengaturan pengguna berhasil diperbarui', updatedUser); }); + +export const resetUserDataHandler = asyncHandler(async (req: Request, res: Response) => { + // Uncomment the following lines if you want to restrict this endpoint to development environment only + // if (config.nodeEnv !== 'development') { + // return errorResponse( + // res, + // 403, + // 'Akses ditolak', + // 'Endpoint ini hanya dapat diakses di lingkungan pengembangan' + // ); + // } + + const userId = req.user?.id; + if (!userId) { + return errorResponse( + res, + 401, + 'Tidak diizinkan', + 'ID pengguna tidak ditemukan dalam permintaan' + ); + } + + const result = await resetUserDataForTesting(userId); + return successResponse(res, 200, 'Data pengguna berhasil direset', result); +}); diff --git a/src/api/users/user.routes.ts b/src/api/users/user.routes.ts index 8bae19c..ec67adf 100644 --- a/src/api/users/user.routes.ts +++ b/src/api/users/user.routes.ts @@ -1,5 +1,9 @@ import { Router } from 'express'; -import { getMeHandler, updateUserSettingsHandler } from './user.controller.js'; +import { + getMeHandler, + resetUserDataHandler, + updateUserSettingsHandler, +} from './user.controller.js'; import { requireAuth } from '../../middleware/auth.middleware.js'; import { validate } from '../../middleware/validate.middleware.js'; import { updateUserSettingsSchema } from './user.validation.js'; @@ -10,4 +14,6 @@ router.get('/me', requireAuth, getMeHandler); router.put('/settings', requireAuth, validate(updateUserSettingsSchema), updateUserSettingsHandler); +router.delete('/me/reset-data', requireAuth, resetUserDataHandler); + export default router; diff --git a/src/api/users/user.service.ts b/src/api/users/user.service.ts index 1d8fd32..610f232 100644 --- a/src/api/users/user.service.ts +++ b/src/api/users/user.service.ts @@ -53,3 +53,44 @@ export async function updateUserSettings( return updatedUser; } + +export async function resetUserDataForTesting(userId: string) { + return prisma.$transaction(async tx => { + // Delete all comments related to the user's posts + const userPosts = await tx.communityPost.findMany({ + where: { + userId, + }, + select: { + id: true, + }, + }); + const postIds = userPosts.map(post => post.id); + if (postIds.length > 0) { + await tx.communityComment.deleteMany({ + where: { postId: { in: postIds } }, + }); + } + + // Delete all related data for the user + await tx.communityComment.deleteMany({ where: { userId } }); + await tx.communityPostLike.deleteMany({ where: { userId } }); + await tx.communityPost.deleteMany({ where: { userId } }); + await tx.journal.deleteMany({ where: { userId } }); + await tx.checkin.deleteMany({ where: { userId } }); + await tx.streak.deleteMany({ where: { userId } }); + await tx.userProfile.deleteMany({ where: { userId } }); + + const resetUser = await tx.user.update({ + where: { + id: userId, + }, + data: { + userWhy: null, + checkinTime: null, + }, + }); + + return resetUser; + }); +} From a5f984f94592985e3ab698fb2fd37d405cfec030 Mon Sep 17 00:00:00 2001 From: salmanabdurrahman Date: Fri, 24 Oct 2025 10:11:36 +0700 Subject: [PATCH 2/2] docs(user): add documentation for endpoint to reset user data - add delete endpoint for resetting user data --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 86bc2b7..3ed0192 100644 --- a/README.md +++ b/README.md @@ -198,6 +198,7 @@ Semua endpoint berada di bawah prefix: **`/api/v1`**. Pengaturan rute utama terd - **`/api/v1/users`**: Rute untuk manajemen profil dan data pengguna. - `GET /me` - Ambil detail profil pengguna. - `PUT /settings` - Update pengaturan profil. + - `DELETE /me/reset-data` - Reset data pengguna untuk testing (hanya untuk development). - **`/api/v1/ai`**: Rute untuk fitur berbasis AI. - `POST /ask-coach` - Kirim pesan ke AI Coach.