# Narasi Ahli Backend Development Plan ## Overview This document outlines the development plan for implementing the Narasi Ahli backend features based on the existing codebase architecture and requirements. ## Current Architecture Analysis ### Existing Structure - **Framework**: Go with Fiber web framework - **Database**: PostgreSQL with GORM ORM - **Architecture**: Clean Architecture with modules containing: - Entity (Database models) - Repository (Data access layer) - Service (Business logic layer) - Controller (HTTP handlers) - Request/Response DTOs - Mapper (Entity ↔ DTO conversion) - **Dependency Injection**: Uber FX - **Middleware**: Audit trails, CSRF, Client authentication - **Documentation**: Swagger/OpenAPI ### Current Users Entity Structure The existing users entity already contains many required fields: - ID, Username, Email, Fullname - PhoneNumber, Address, WorkType, GenderType - IdentityType, IdentityGroup, IdentityNumber - DateOfBirth, LastEducation - UserRoleId, UserLevelId, StatusId - ProfilePicturePath, CreatedAt, UpdatedAt ## Development Plan ### Phase 1: Database Schema & Entity Updates #### 1.1 Update Users Entity for Profile Requirements **File**: `app/database/entity/users/users.entity.go` **Required Fields to Add/Modify**: - `Degree` (gelar) - string - `WhatsappNumber` - string - `LastJobTitle` (pekerjaan terakhir) - string **Changes Needed**: ```go type Users struct { // ... existing fields ... Degree *string `json:"degree" gorm:"type:varchar"` // Gelar WhatsappNumber *string `json:"whatsapp_number" gorm:"type:varchar"` // Nomor WhatsApp LastJobTitle *string `json:"last_job_title" gorm:"type:varchar"` // Pekerjaan terakhir // ... rest of existing fields ... } ``` #### 1.2 Create New Entities **1.2.1 Education History Entity** **File**: `app/database/entity/education_history.entity.go` ```go type EducationHistory struct { ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` UserID uint `json:"user_id" gorm:"type:int4;not null"` SchoolName string `json:"school_name" gorm:"type:varchar;not null"` Major string `json:"major" gorm:"type:varchar;not null"` // Jurusan EducationLevel string `json:"education_level" gorm:"type:varchar;not null"` // Tingkat pendidikan GraduationYear int `json:"graduation_year" gorm:"type:int4;not null"` // Tahun lulus CertificateImage *string `json:"certificate_image" gorm:"type:varchar"` // Ijazah image CreatedAt time.Time `json:"created_at" gorm:"default:now()"` UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` User *users.Users `json:"user" gorm:"foreignKey:UserID;references:ID"` } ``` **1.2.2 Work History Entity** **File**: `app/database/entity/work_history.entity.go` ```go type WorkHistory struct { ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` UserID uint `json:"user_id" gorm:"type:int4;not null"` JobTitle string `json:"job_title" gorm:"type:varchar;not null"` // Nama pekerjaan CompanyName string `json:"company_name" gorm:"type:varchar;not null"` // Nama perusahaan StartDate time.Time `json:"start_date" gorm:"not null"` // Tanggal mulai EndDate *time.Time `json:"end_date"` // Tanggal selesai (nullable untuk pekerjaan saat ini) CreatedAt time.Time `json:"created_at" gorm:"default:now()"` UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` User *users.Users `json:"user" gorm:"foreignKey:UserID;references:ID"` } ``` **1.2.3 Research Journals Entity** **File**: `app/database/entity/research_journals.entity.go` ```go type ResearchJournals struct { ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` UserID uint `json:"user_id" gorm:"type:int4;not null"` JournalTitle string `json:"journal_title" gorm:"type:varchar;not null"` // Nama judul jurnal Publisher string `json:"publisher" gorm:"type:varchar;not null"` // Tempat publish JournalURL string `json:"journal_url" gorm:"type:varchar;not null"` // URL jurnal PublishedDate *time.Time `json:"published_date"` // Tanggal publikasi CreatedAt time.Time `json:"created_at" gorm:"default:now()"` UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` User *users.Users `json:"user" gorm:"foreignKey:UserID;references:ID"` } ``` **1.2.4 Communication/Chat Entities** **File**: `app/database/entity/communications.entity.go` ```go type Conversations struct { ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` Participant1ID uint `json:"participant1_id" gorm:"type:int4;not null"` Participant2ID uint `json:"participant2_id" gorm:"type:int4;not null"` LastMessageAt *time.Time `json:"last_message_at"` CreatedAt time.Time `json:"created_at" gorm:"default:now()"` UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` Participant1 *users.Users `json:"participant1" gorm:"foreignKey:Participant1ID;references:ID"` Participant2 *users.Users `json:"participant2" gorm:"foreignKey:Participant2ID;references:ID"` } type ChatMessages struct { ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` ConversationID uint `json:"conversation_id" gorm:"type:int4;not null"` SenderID uint `json:"sender_id" gorm:"type:int4;not null"` MessageText *string `json:"message_text" gorm:"type:text"` MessageType string `json:"message_type" gorm:"type:varchar;not null;default:'text'"` // text, image, file, audio FileURL *string `json:"file_url" gorm:"type:varchar"` // untuk file/image/audio FileName *string `json:"file_name" gorm:"type:varchar"` FileSize *int64 `json:"file_size" gorm:"type:bigint"` IsRead bool `json:"is_read" gorm:"default:false"` CreatedAt time.Time `json:"created_at" gorm:"default:now()"` Conversation *Conversations `json:"conversation" gorm:"foreignKey:ConversationID;references:ID"` Sender *users.Users `json:"sender" gorm:"foreignKey:SenderID;references:ID"` } ``` **1.2.5 AI Chat Entities** **File**: `app/database/entity/ai_chat.entity.go` ```go type ChatSessions struct { ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` AISessionID string `json:"ai_session_id" gorm:"type:varchar;not null;unique"` UserID uint `json:"user_id" gorm:"type:int4;not null"` AgentID *string `json:"agent_id" gorm:"type:varchar"` Title string `json:"title" gorm:"type:varchar;not null"` MessageCount int `json:"message_count" gorm:"type:int4;default:0"` Status string `json:"status" gorm:"type:varchar;default:'active'"` // active, archived, deleted CreatedAt time.Time `json:"created_at" gorm:"default:now()"` UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` User *users.Users `json:"user" gorm:"foreignKey:UserID;references:ID"` } type ChatMessages struct { ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` SessionID uint `json:"session_id" gorm:"type:int4;not null"` MessageType string `json:"message_type" gorm:"type:varchar;not null"` // user, assistant Content string `json:"content" gorm:"type:text;not null"` CreatedAt time.Time `json:"created_at" gorm:"default:now()"` Session *ChatSessions `json:"session" gorm:"foreignKey:SessionID;references:ID"` } ``` **1.2.6 AI Chat Logs Entity** **File**: `app/database/entity/ai_chat_logs.entity.go` ```go type AIChatLogs struct { ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` SessionID uint `json:"session_id" gorm:"type:int4;not null"` UserID uint `json:"user_id" gorm:"type:int4;not null"` StartDate time.Time `json:"start_date" gorm:"not null"` EndDate *time.Time `json:"end_date"` TotalDuration int64 `json:"total_duration" gorm:"type:bigint"` // in seconds CreatedAt time.Time `json:"created_at" gorm:"default:now()"` UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` Session *ChatSessions `json:"session" gorm:"foreignKey:SessionID;references:ID"` User *users.Users `json:"user" gorm:"foreignKey:UserID;references:ID"` } ``` ### Phase 2: Module Implementation Each module will follow the existing pattern with: - **Module file** (dependency injection setup) - **Controller** (HTTP handlers) - **Service** (business logic) - **Repository** (data access) - **Request DTOs** (input validation) - **Response DTOs** (output formatting) - **Mapper** (entity ↔ DTO conversion) #### 2.1 Education History Module **Location**: `app/module/education_history/` **API Endpoints**: - `GET /education-history` - Get all user's education history - `GET /education-history/:id` - Get specific education record - `POST /education-history` - Create new education record - `PUT /education-history/:id` - Update education record - `DELETE /education-history/:id` - Delete education record - `POST /education-history/:id/certificate` - Upload certificate image #### 2.2 Work History Module **Location**: `app/module/work_history/` **API Endpoints**: - `GET /work-history` - Get all user's work history - `GET /work-history/:id` - Get specific work record - `POST /work-history` - Create new work record - `PUT /work-history/:id` - Update work record - `DELETE /work-history/:id` - Delete work record #### 2.3 Research Journals Module **Location**: `app/module/research_journals/` **API Endpoints**: - `GET /research-journals` - Get all user's research journals - `GET /research-journals/:id` - Get specific journal - `POST /research-journals` - Create new journal record - `PUT /research-journals/:id` - Update journal record - `DELETE /research-journals/:id` - Delete journal record #### 2.4 Communication Module **Location**: `app/module/communications/` **API Endpoints**: - `GET /conversations` - Get user's conversations - `GET /conversations/:id` - Get specific conversation - `POST /conversations` - Start new conversation - `GET /conversations/:id/messages` - Get conversation messages - `POST /conversations/:id/messages` - Send message - `POST /conversations/:id/messages/file` - Send file message - `PUT /conversations/:id/messages/:messageId/read` - Mark message as read #### 2.5 AI Chat Module **Location**: `app/module/ai_chat/` **API Endpoints**: - `GET /ai-chat/sessions` - Get user's AI chat sessions - `POST /ai-chat/sessions` - Create new AI chat session - `GET /ai-chat/sessions/:id` - Get specific session - `PUT /ai-chat/sessions/:id` - Update session (title, status) - `DELETE /ai-chat/sessions/:id` - Delete session - `GET /ai-chat/sessions/:id/messages` - Get session messages - `POST /ai-chat/sessions/:id/messages` - Send message to AI - `PUT /ai-chat/sessions/:id/archive` - Archive session #### 2.6 AI Chat Logs Module **Location**: `app/module/ai_chat_logs/` **API Endpoints**: - `GET /ai-chat-logs` - Get user's chat logs - `GET /ai-chat-logs/:id` - Get specific log - `POST /ai-chat-logs` - Create new log entry - `PUT /ai-chat-logs/:id` - Update log (end session) ### Phase 3: Updated Users Module #### 3.1 Update Users Request/Response DTOs **Files to modify**: - `app/module/users/request/users.request.go` - `app/module/users/response/users.response.go` - `app/module/users/mapper/users.mapper.go` **New fields to handle**: - Degree (gelar) - WhatsappNumber (nomor whatsapp) - LastJobTitle (pekerjaan terakhir) ### Phase 4: Database Migrations & Router Updates #### 4.1 Update Database Models Registration **File**: `app/database/index.database.go` Add new entities to the `Models()` function: ```go entity.EducationHistory{}, entity.WorkHistory{}, entity.ResearchJournals{}, entity.Conversations{}, entity.ChatMessages{}, entity.ChatSessions{}, entity.AIChatLogs{}, ``` #### 4.2 Update Router Registration **Files to modify**: - `app/router/api.go` - Add new module routers - `main.go` - Add new module imports and dependency injection ### Phase 5: Implementation Order 1. **Database Schema Updates** (Users entity modification) 2. **Education History Module** (Complete implementation) 3. **Work History Module** (Complete implementation) 4. **Research Journals Module** (Complete implementation) 5. **Communication Module** (Complete implementation) 6. **AI Chat Module** (Complete implementation) 7. **AI Chat Logs Module** (Complete implementation) 8. **Users Module Updates** (Profile API enhancements) 9. **Integration Testing** (All modules) 10. **Documentation Updates** (Swagger/API docs) ### Phase 6: Additional Considerations #### 6.1 File Upload Handling - Implement file upload service for certificate images - Support for chat file attachments (images, documents, audio) - Integration with existing MinIO storage #### 6.2 Real-time Features - WebSocket support for real-time chat - Push notifications for new messages #### 6.3 AI Integration - External AI service integration - API rate limiting for AI calls - Response caching strategies #### 6.4 Security & Validation - File upload validation (size, type restrictions) - Message content validation - User authorization for accessing conversations #### 6.5 Performance Optimization - Database indexing for chat queries - Pagination for message history - Caching for frequently accessed data ## API Documentation Structure Each module will include comprehensive Swagger documentation following the existing pattern: - Endpoint descriptions - Request/response schemas - Authentication requirements - Error response formats - Example payloads ## Testing Strategy - Unit tests for service layer - Integration tests for API endpoints - Database migration testing - File upload testing - Real-time communication testing ## Deployment Considerations - Database migration scripts - Environment-specific configurations - MinIO bucket setup for file storage - AI service endpoint configuration - Performance monitoring setup --- This plan provides a comprehensive roadmap for implementing all the Narasi Ahli backend requirements while maintaining consistency with the existing codebase architecture and patterns.