Files
lcbp3/specs/06-tasks/TASK-BE-015-schema-v160-migration.md
admin ec35521258
Some checks failed
Spec Validation / validate-markdown (push) Has been cancelled
Spec Validation / validate-diagrams (push) Has been cancelled
Spec Validation / check-todos (push) Has been cancelled
251213:1509 Docunment Number Businee Rule not correct
2025-12-13 15:09:01 +07:00

7.4 KiB

Task: Backend Schema v1.6.0 Migration

Status: Completed Priority: P1 (High - Breaking Changes) Estimated Effort: 3-5 days Dependencies: Schema v1.6.0 already created Owner: Backend Team


📋 Overview

อัพเดท Backend Entities และ DTOs ให้ตรงกับ Schema v1.6.0 ที่มีการ Refactor โครงสร้างตาราง


🎯 Objectives

  • Update Correspondence Entities
  • Update RFA Entities (Shared PK Pattern)
  • Update DTOs for new field names
  • Update Services for new relationships
  • Add/Update Unit Tests

📝 Schema Changes Summary

Breaking Changes ⚠️

Table Change Impact
correspondence_recipients FK → correspondences(id) Update relation
rfa_items rfarev_correspondence_idrfa_revision_id Rename column

Column Changes

Table Old New Notes
correspondence_revisions title subject Rename
correspondence_revisions - body, remarks Add columns
rfa_revisions title subject Rename
rfa_revisions correspondence_id - Remove
rfa_revisions - body, remarks, due_date Add columns

Architecture Changes

Table Change
rfas Shared PK with correspondences (no AUTO_INCREMENT)
rfas id references correspondences(id)

🛠️ Implementation Steps

1. Update CorrespondenceRevision Entity

// File: backend/src/modules/correspondence/entities/correspondence-revision.entity.ts

// BEFORE
@Column()
title: string;

// AFTER
@Column()
subject: string;

@Column({ type: 'text', nullable: true })
body: string;

@Column({ type: 'text', nullable: true })
remarks: string;

@Column({ name: 'schema_version', default: 1 })
schemaVersion: number;

2. Update CorrespondenceRecipient Entity

// File: backend/src/modules/correspondence/entities/correspondence-recipient.entity.ts

// BEFORE
@ManyToOne(() => CorrespondenceRevision, { onDelete: 'CASCADE' })
@JoinColumn({ name: 'correspondence_id', referencedColumnName: 'correspondenceId' })
revision: CorrespondenceRevision;

// AFTER
@ManyToOne(() => Correspondence, { onDelete: 'CASCADE' })
@JoinColumn({ name: 'correspondence_id' })
correspondence: Correspondence;

3. Update RFA Entity (Shared PK Pattern)

// File: backend/src/modules/rfa/entities/rfa.entity.ts

// BEFORE
@PrimaryGeneratedColumn()
id: number;

// AFTER
@PrimaryColumn()
id: number;

@OneToOne(() => Correspondence, { onDelete: 'CASCADE' })
@JoinColumn({ name: 'id' })
correspondence: Correspondence;

4. Update RfaRevision Entity

// File: backend/src/modules/rfa/entities/rfa-revision.entity.ts

// REMOVE
@Column({ name: 'correspondence_id' })
correspondenceId: number;

// RENAME
@Column()
subject: string;  // was: title

// ADD
@Column({ type: 'text', nullable: true })
body: string;

@Column({ type: 'text', nullable: true })
remarks: string;

@Column({ name: 'due_date', type: 'datetime', nullable: true })
dueDate: Date;

5. Update RfaItem Entity

// File: backend/src/modules/rfa/entities/rfa-item.entity.ts

// BEFORE
@Column({ name: 'rfarev_correspondence_id' })
rfaRevCorrespondenceId: number;

// AFTER
@Column({ name: 'rfa_revision_id' })
rfaRevisionId: number;

@ManyToOne(() => RfaRevision, { onDelete: 'CASCADE' })
@JoinColumn({ name: 'rfa_revision_id' })
rfaRevision: RfaRevision;

6. Update DTOs

// correspondence/dto/create-correspondence-revision.dto.ts
export class CreateCorrespondenceRevisionDto {
  subject: string;  // was: title
  body?: string;
  remarks?: string;
}

// rfa/dto/create-rfa-revision.dto.ts
export class CreateRfaRevisionDto {
  subject: string;  // was: title
  body?: string;
  remarks?: string;
  dueDate?: Date;
}

🗂️ Files to Modify

Entities

File Status Changes
correspondence.entity.ts Minor: add recipients relation
correspondence-revision.entity.ts Rename title→subject, add body/remarks
correspondence-recipient.entity.ts FK change to correspondence
rfa.entity.ts Shared PK pattern
rfa-revision.entity.ts Remove correspondenceId, add body/remarks
rfa-item.entity.ts Rename column

DTOs

File Status Changes
create-correspondence-revision.dto.ts title→subject, add body/remarks
update-correspondence-revision.dto.ts Same
create-rfa-revision.dto.ts title→subject, add fields
update-rfa-revision.dto.ts Same
create-rfa-item.dto.ts Column rename

Services

File Status Changes
correspondence.service.ts Update queries for new relations
rfa.service.ts Handle Shared PK creation

Verification

Unit Tests

# Run existing tests to verify compatibility
pnpm test:watch correspondence
pnpm test:watch rfa

Integration Tests

  1. Create new Correspondence → verify subject field saved
  2. Create new RFA → verify Shared PK pattern works
  3. Verify recipients linked to correspondence (not revision)
  4. Verify RFA items linked via rfa_revision_id


🚨 Risks & Mitigation

Risk Impact Mitigation
Breaking frontend High Update frontend types simultaneously
Data migration Medium Schema already handles FK changes
Test failures Low Update tests with new field names

📌 Notes

  • Schema v1.6.0 SQL files already exist in specs/07-database/
  • This task focuses on backend code changes only
  • Frontend will need separate task for DTO/type updates
  • Consider feature flag for gradual rollout