diff --git a/prisma/migrations/20251114134933_simplify_schema_for_mvp/migration.sql b/prisma/migrations/20251114134933_simplify_schema_for_mvp/migration.sql new file mode 100644 index 0000000..7df9007 --- /dev/null +++ b/prisma/migrations/20251114134933_simplify_schema_for_mvp/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "public"."UserProfile" ALTER COLUMN "dependencyLevel" DROP NOT NULL; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index ce0dc0b..01fe291 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -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 diff --git a/src/api/auth/auth.controller.ts b/src/api/auth/auth.controller.ts index efa622b..f088a0f 100644 --- a/src/api/auth/auth.controller.ts +++ b/src/api/auth/auth.controller.ts @@ -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'; @@ -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, + }); }); diff --git a/src/api/auth/auth.service.ts b/src/api/auth/auth.service.ts index 7627994..2d29851 100644 --- a/src/api/auth/auth.service.ts +++ b/src/api/auth/auth.service.ts @@ -50,9 +50,9 @@ export async function saveOnboardingData( userId: string, data: { answers: Record; - dependencyLevel: string; + dependencyLevel?: string; userWhy?: string; - checkinTime: string; + checkinTime?: string; } ) { const { answers, dependencyLevel, userWhy, checkinTime } = data; @@ -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({ diff --git a/src/api/auth/auth.validation.ts b/src/api/auth/auth.validation.ts index 65c8bef..d81cc3c 100644 --- a/src/api/auth/auth.validation.ts +++ b/src/api/auth/auth.validation.ts @@ -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() @@ -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(), }), }); diff --git a/src/database/seed/index.ts b/src/database/seed/index.ts index 5eab877..b215aa2 100644 --- a/src/database/seed/index.ts +++ b/src/database/seed/index.ts @@ -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(); @@ -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...');