narasiahli-be/plan/narasi-ahli-development-pla...

355 lines
14 KiB
Markdown
Raw Permalink Normal View History

2025-09-19 04:08:42 +00:00
# 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.