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
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
-- AlterTable
ALTER TABLE "public"."UserProfile" ALTER COLUMN "dependencyLevel" DROP NOT NULL;
2 changes: 1 addition & 1 deletion prisma/schema.prisma
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ model EducationContent {
model UserProfile {
id String @id @default(uuid())
answers Json
dependencyLevel String
dependencyLevel String?
aiSummary String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
Expand Down
14 changes: 13 additions & 1 deletion src/api/auth/auth.controller.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import type { Request, Response } from 'express';
import { saveOnboardingData, verifyGoogleTokenAndLogin } from './auth.service.js';
import { analyzeOnboardingAnswers } from '../ai/ai.service.js';
import { asyncHandler } from '../../handler/async.handler.js';
import { errorResponse, successResponse } from '../../core/response.js';

Expand All @@ -25,5 +26,16 @@ export const onboardingHandler = asyncHandler(async (req: Request, res: Response

const profile = await saveOnboardingData(userId, onboardingData);

return successResponse(res, 201, 'Data onboarding berhasil disimpan', profile);
let aiSummary;
try {
aiSummary = await analyzeOnboardingAnswers(onboardingData.answers);
} catch (error) {
console.error('AI summary generation failed:', error);
aiSummary = { error: 'AI summary tidak tersedia saat ini' };
}

return successResponse(res, 201, 'Data onboarding berhasil disimpan', {
...profile,
aiSummary,
});
});
8 changes: 4 additions & 4 deletions src/api/auth/auth.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,9 @@ export async function saveOnboardingData(
userId: string,
data: {
answers: Record<string, any>;
dependencyLevel: string;
dependencyLevel?: string;
userWhy?: string;
checkinTime: string;
checkinTime?: string;
}
) {
const { answers, dependencyLevel, userWhy, checkinTime } = data;
Expand All @@ -69,12 +69,12 @@ export async function saveOnboardingData(
const userProfile = await prisma.userProfile.create({
data: {
answers,
dependencyLevel,
dependencyLevel: dependencyLevel || null,
userId,
},
});

const formattedCheckinTime = parseCheckinTime(checkinTime);
const formattedCheckinTime = parseCheckinTime(checkinTime || '09:00');

if (userWhy || formattedCheckinTime) {
await prisma.user.update({
Expand Down
5 changes: 3 additions & 2 deletions src/api/auth/auth.validation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ export const googleLoginSchema = z.object({
export const onboardingSchema = z.object({
body: z.object({
answers: z.record(z.string(), z.unknown()),
dependencyLevel: z.string().min(1, 'Tingkat ketergantungan harus diisi').trim(),
dependencyLevel: z.string().min(1, 'Tingkat ketergantungan harus diisi').trim().optional(),
userWhy: z
.string()
.optional()
Expand All @@ -19,6 +19,7 @@ export const onboardingSchema = z.object({
.regex(/^([01]\d|2[0-3]):([0-5]\d)$/, {
message: 'Format waktu check-in tidak valid, gunakan format HH:mm',
})
.trim(),
.trim()
.optional(),
}),
});
2 changes: 2 additions & 0 deletions src/database/seed/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ async function main() {

console.log('[database]: Resetting existing data...');
await prisma.communityComment.deleteMany();
await prisma.communityPostLike.deleteMany();
await prisma.communityPost.deleteMany();
await prisma.journal.deleteMany();
await prisma.checkin.deleteMany();
Expand All @@ -23,6 +24,7 @@ async function main() {
await prisma.educationContent.deleteMany();
await prisma.dailyMotivation.deleteMany();
await prisma.dailyChallenge.deleteMany();
await prisma.aiChatHistory.deleteMany();
await prisma.user.deleteMany();

console.log('[database]: Starting full seeding process...');
Expand Down
Loading