Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
27 changes: 26 additions & 1 deletion src/api/users/user.controller.ts
Original file line number Diff line number Diff line change
@@ -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';

Expand Down Expand Up @@ -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);
});
8 changes: 7 additions & 1 deletion src/api/users/user.routes.ts
Original file line number Diff line number Diff line change
@@ -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';
Expand All @@ -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;
41 changes: 41 additions & 0 deletions src/api/users/user.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
});
}
Loading