14 KiB
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) - stringWhatsappNumber- stringLastJobTitle(pekerjaan terakhir) - string
Changes Needed:
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
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
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
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
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
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
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 historyGET /education-history/:id- Get specific education recordPOST /education-history- Create new education recordPUT /education-history/:id- Update education recordDELETE /education-history/:id- Delete education recordPOST /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 historyGET /work-history/:id- Get specific work recordPOST /work-history- Create new work recordPUT /work-history/:id- Update work recordDELETE /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 journalsGET /research-journals/:id- Get specific journalPOST /research-journals- Create new journal recordPUT /research-journals/:id- Update journal recordDELETE /research-journals/:id- Delete journal record
2.4 Communication Module
Location: app/module/communications/
API Endpoints:
GET /conversations- Get user's conversationsGET /conversations/:id- Get specific conversationPOST /conversations- Start new conversationGET /conversations/:id/messages- Get conversation messagesPOST /conversations/:id/messages- Send messagePOST /conversations/:id/messages/file- Send file messagePUT /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 sessionsPOST /ai-chat/sessions- Create new AI chat sessionGET /ai-chat/sessions/:id- Get specific sessionPUT /ai-chat/sessions/:id- Update session (title, status)DELETE /ai-chat/sessions/:id- Delete sessionGET /ai-chat/sessions/:id/messages- Get session messagesPOST /ai-chat/sessions/:id/messages- Send message to AIPUT /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 logsGET /ai-chat-logs/:id- Get specific logPOST /ai-chat-logs- Create new log entryPUT /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.goapp/module/users/response/users.response.goapp/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:
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 routersmain.go- Add new module imports and dependency injection
Phase 5: Implementation Order
- Database Schema Updates (Users entity modification)
- Education History Module (Complete implementation)
- Work History Module (Complete implementation)
- Research Journals Module (Complete implementation)
- Communication Module (Complete implementation)
- AI Chat Module (Complete implementation)
- AI Chat Logs Module (Complete implementation)
- Users Module Updates (Profile API enhancements)
- Integration Testing (All modules)
- 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.