131 lines
4.5 KiB
Markdown
131 lines
4.5 KiB
Markdown
|
|
# Table Restructuring Summary
|
||
|
|
|
||
|
|
## Overview
|
||
|
|
This document summarizes the changes made to restructure the letter dispositions system from a single table to a more normalized structure with an association table.
|
||
|
|
|
||
|
|
## Changes Made
|
||
|
|
|
||
|
|
### 1. Database Schema Changes
|
||
|
|
|
||
|
|
#### New Migration Files Created:
|
||
|
|
- `migrations/000012_rename_dispositions_table.up.sql` - Main migration to restructure tables
|
||
|
|
- `migrations/000012_rename_dispositions_table.down.sql` - Rollback migration
|
||
|
|
|
||
|
|
#### Table Changes:
|
||
|
|
- **`letter_dispositions`** → **`letter_incoming_dispositions`**
|
||
|
|
- Renamed table
|
||
|
|
- Removed columns: `from_user_id`, `to_user_id`, `to_department_id`, `status`, `completed_at`
|
||
|
|
- Renamed `from_department_id` → `department_id`
|
||
|
|
- Added `read_at` column
|
||
|
|
- Kept columns: `id`, `letter_id`, `department_id`, `notes`, `read_at`, `created_at`, `created_by`, `updated_at`
|
||
|
|
|
||
|
|
#### New Table Created:
|
||
|
|
- **`letter_incoming_dispositions_department`**
|
||
|
|
- Purpose: Associates dispositions with target departments
|
||
|
|
- Columns: `id`, `letter_incoming_disposition_id`, `department_id`, `created_at`
|
||
|
|
- Unique constraint on `(letter_incoming_disposition_id, department_id)`
|
||
|
|
|
||
|
|
### 2. Entity Changes
|
||
|
|
|
||
|
|
#### Updated Entities:
|
||
|
|
- **`LetterDisposition`** → **`LetterIncomingDisposition`**
|
||
|
|
- Simplified structure with only required fields
|
||
|
|
- New table name mapping
|
||
|
|
|
||
|
|
#### New Entity:
|
||
|
|
- **`LetterIncomingDispositionDepartment`**
|
||
|
|
- Represents the many-to-many relationship between dispositions and departments
|
||
|
|
|
||
|
|
### 3. Repository Changes
|
||
|
|
|
||
|
|
#### Updated Repositories:
|
||
|
|
- **`LetterDispositionRepository`** → **`LetterIncomingDispositionRepository`**
|
||
|
|
- Updated to work with new entity
|
||
|
|
|
||
|
|
#### New Repository:
|
||
|
|
- **`LetterIncomingDispositionDepartmentRepository`**
|
||
|
|
- Handles CRUD operations for the association table
|
||
|
|
- Methods: `CreateBulk`, `ListByDisposition`
|
||
|
|
|
||
|
|
### 4. Processor Changes
|
||
|
|
|
||
|
|
#### Updated Processor:
|
||
|
|
- **`LetterProcessorImpl`**
|
||
|
|
- Added new repository dependency
|
||
|
|
- Updated `CreateDispositions` method to:
|
||
|
|
- Create main disposition record
|
||
|
|
- Create department association records
|
||
|
|
- Maintain existing action selection functionality
|
||
|
|
|
||
|
|
### 5. Transformer Changes
|
||
|
|
|
||
|
|
#### Updated Transformer:
|
||
|
|
- **`DispositionsToContract`** function
|
||
|
|
- Updated to work with new entity structure
|
||
|
|
- Maps new fields: `DepartmentID`, `ReadAt`, `UpdatedAt`
|
||
|
|
- Removed old fields: `FromDepartmentID`, `ToDepartmentID`, `Status`
|
||
|
|
|
||
|
|
### 6. Contract Changes
|
||
|
|
|
||
|
|
#### Updated Contract:
|
||
|
|
- **`DispositionResponse`** struct
|
||
|
|
- Updated fields to match new entity structure
|
||
|
|
- Added `ReadAt` and `UpdatedAt` fields
|
||
|
|
- Replaced `FromDepartmentID` and `ToDepartmentID` with `DepartmentID`
|
||
|
|
|
||
|
|
### 7. Application Configuration Changes
|
||
|
|
|
||
|
|
#### Updated App Configuration:
|
||
|
|
- **`internal/app/app.go`**
|
||
|
|
- Updated repository initialization
|
||
|
|
- Added new repository dependency
|
||
|
|
- Updated processor initialization with new repository
|
||
|
|
|
||
|
|
## Migration Process
|
||
|
|
|
||
|
|
### Up Migration (000012_rename_dispositions_table.up.sql):
|
||
|
|
1. Rename `letter_dispositions` to `letter_incoming_dispositions`
|
||
|
|
2. Drop unnecessary columns
|
||
|
|
3. Rename `from_department_id` to `department_id`
|
||
|
|
4. Add missing columns (`read_at`, `updated_at`)
|
||
|
|
5. Create new association table
|
||
|
|
6. Update triggers and indexes
|
||
|
|
|
||
|
|
### Down Migration (000012_rename_dispositions_table.down.sql):
|
||
|
|
1. Drop association table
|
||
|
|
2. Restore removed columns
|
||
|
|
3. Rename `department_id` back to `from_department_id`
|
||
|
|
4. Restore old triggers and indexes
|
||
|
|
5. Rename table back to `letter_dispositions`
|
||
|
|
|
||
|
|
## Benefits of New Structure
|
||
|
|
|
||
|
|
1. **Normalization**: Separates disposition metadata from department associations
|
||
|
|
2. **Flexibility**: Allows multiple departments per disposition
|
||
|
|
3. **Cleaner Data Model**: Removes redundant fields and simplifies the main table
|
||
|
|
4. **Better Performance**: Smaller main table with focused indexes
|
||
|
|
5. **Easier Maintenance**: Clear separation of concerns
|
||
|
|
|
||
|
|
## Breaking Changes
|
||
|
|
|
||
|
|
- Table name change from `letter_dispositions` to `letter_incoming_dispositions`
|
||
|
|
- Entity structure changes (removed fields, renamed fields)
|
||
|
|
- Repository interface changes
|
||
|
|
- API response structure changes
|
||
|
|
|
||
|
|
## Testing Recommendations
|
||
|
|
|
||
|
|
1. Run migration on test database
|
||
|
|
2. Test disposition creation with new structure
|
||
|
|
3. Verify department associations are created correctly
|
||
|
|
4. Test existing functionality (action selections, notes)
|
||
|
|
5. Verify rollback migration works correctly
|
||
|
|
|
||
|
|
## Rollback Plan
|
||
|
|
|
||
|
|
If issues arise, the down migration will:
|
||
|
|
1. Restore the original table structure
|
||
|
|
2. Preserve all existing data
|
||
|
|
3. Remove the new association table
|
||
|
|
4. Restore original triggers and indexes
|