dukcapil/internal/repository/document_repository.go
2025-08-29 16:10:05 +07:00

218 lines
6.8 KiB
Go

package repository
import (
"context"
"eslogad-be/internal/entities"
"github.com/google/uuid"
"gorm.io/gorm"
)
// DocumentSessionRepository handles document session operations
type DocumentSessionRepository struct {
db *gorm.DB
}
func NewDocumentSessionRepository(db *gorm.DB) *DocumentSessionRepository {
return &DocumentSessionRepository{db: db}
}
func (r *DocumentSessionRepository) Create(ctx context.Context, session *entities.DocumentSession) error {
db := DBFromContext(ctx, r.db)
return db.WithContext(ctx).Create(session).Error
}
func (r *DocumentSessionRepository) GetByKey(ctx context.Context, documentKey string) (*entities.DocumentSession, error) {
db := DBFromContext(ctx, r.db)
var session entities.DocumentSession
err := db.WithContext(ctx).
Preload("User").
Where("document_key = ?", documentKey).
First(&session).Error
if err != nil {
return nil, err
}
return &session, nil
}
func (r *DocumentSessionRepository) GetActiveByDocument(ctx context.Context, documentID uuid.UUID) (*entities.DocumentSession, error) {
db := DBFromContext(ctx, r.db)
var session entities.DocumentSession
err := db.WithContext(ctx).
Preload("User").
Where("document_id = ? AND status != 4", documentID). // Status 4 = closed
Order("created_at DESC").
First(&session).Error
if err != nil {
return nil, err
}
return &session, nil
}
func (r *DocumentSessionRepository) Update(ctx context.Context, session *entities.DocumentSession) error {
db := DBFromContext(ctx, r.db)
// Only update specific fields to avoid association issues
updates := map[string]interface{}{
"status": session.Status,
"is_locked": session.IsLocked,
"locked_by": session.LockedBy,
"locked_at": session.LockedAt,
"last_saved_at": session.LastSavedAt,
"version": session.Version,
"updated_at": session.UpdatedAt,
}
return db.WithContext(ctx).Model(&entities.DocumentSession{}).Where("id = ?", session.ID).Updates(updates).Error
}
func (r *DocumentSessionRepository) ListByDocument(ctx context.Context, documentID uuid.UUID) ([]entities.DocumentSession, error) {
db := DBFromContext(ctx, r.db)
var sessions []entities.DocumentSession
err := db.WithContext(ctx).
Preload("User").
Where("document_id = ?", documentID).
Order("created_at DESC").
Find(&sessions).Error
return sessions, err
}
// DocumentVersionRepository handles document version operations
type DocumentVersionRepository struct {
db *gorm.DB
}
func NewDocumentVersionRepository(db *gorm.DB) *DocumentVersionRepository {
return &DocumentVersionRepository{db: db}
}
func (r *DocumentVersionRepository) Create(ctx context.Context, version *entities.DocumentVersion) error {
db := DBFromContext(ctx, r.db)
return db.WithContext(ctx).Create(version).Error
}
func (r *DocumentVersionRepository) GetByID(ctx context.Context, id uuid.UUID) (*entities.DocumentVersion, error) {
db := DBFromContext(ctx, r.db)
var version entities.DocumentVersion
err := db.WithContext(ctx).
Preload("User").
Where("id = ?", id).
First(&version).Error
if err != nil {
return nil, err
}
return &version, nil
}
func (r *DocumentVersionRepository) GetActiveVersion(ctx context.Context, documentID uuid.UUID) (*entities.DocumentVersion, error) {
db := DBFromContext(ctx, r.db)
var version entities.DocumentVersion
err := db.WithContext(ctx).
Preload("User").
Where("document_id = ? AND is_active = ?", documentID, true).
First(&version).Error
if err != nil {
return nil, err
}
return &version, nil
}
func (r *DocumentVersionRepository) ListByDocument(ctx context.Context, documentID uuid.UUID) ([]entities.DocumentVersion, error) {
db := DBFromContext(ctx, r.db)
var versions []entities.DocumentVersion
err := db.WithContext(ctx).
Preload("User").
Where("document_id = ?", documentID).
Order("version DESC").
Find(&versions).Error
return versions, err
}
func (r *DocumentVersionRepository) DeactivateAllVersions(ctx context.Context, documentID uuid.UUID) error {
db := DBFromContext(ctx, r.db)
return db.WithContext(ctx).
Model(&entities.DocumentVersion{}).
Where("document_id = ?", documentID).
Update("is_active", false).Error
}
// DocumentMetadataRepository handles document metadata operations
type DocumentMetadataRepository struct {
db *gorm.DB
}
func NewDocumentMetadataRepository(db *gorm.DB) *DocumentMetadataRepository {
return &DocumentMetadataRepository{db: db}
}
func (r *DocumentMetadataRepository) Create(ctx context.Context, metadata *entities.DocumentMetadata) error {
db := DBFromContext(ctx, r.db)
return db.WithContext(ctx).Create(metadata).Error
}
func (r *DocumentMetadataRepository) GetByDocumentID(ctx context.Context, documentID uuid.UUID) (*entities.DocumentMetadata, error) {
db := DBFromContext(ctx, r.db)
var metadata entities.DocumentMetadata
err := db.WithContext(ctx).
Where("document_id = ?", documentID).
First(&metadata).Error
if err != nil {
return nil, err
}
return &metadata, nil
}
func (r *DocumentMetadataRepository) Update(ctx context.Context, metadata *entities.DocumentMetadata) error {
db := DBFromContext(ctx, r.db)
// Only update specific fields to avoid association issues
updates := map[string]interface{}{
"document_type": metadata.DocumentType,
"reference_id": metadata.ReferenceID,
"file_name": metadata.FileName,
"file_type": metadata.FileType,
"file_size": metadata.FileSize,
"mime_type": metadata.MimeType,
"updated_at": metadata.UpdatedAt,
}
return db.WithContext(ctx).Model(&entities.DocumentMetadata{}).Where("id = ?", metadata.ID).Updates(updates).Error
}
func (r *DocumentMetadataRepository) Delete(ctx context.Context, documentID uuid.UUID) error {
db := DBFromContext(ctx, r.db)
return db.WithContext(ctx).
Where("document_id = ?", documentID).
Delete(&entities.DocumentMetadata{}).Error
}
// DocumentErrorRepository handles document error logging
type DocumentErrorRepository struct {
db *gorm.DB
}
func NewDocumentErrorRepository(db *gorm.DB) *DocumentErrorRepository {
return &DocumentErrorRepository{db: db}
}
func (r *DocumentErrorRepository) Create(ctx context.Context, docError *entities.DocumentError) error {
db := DBFromContext(ctx, r.db)
return db.WithContext(ctx).Create(docError).Error
}
func (r *DocumentErrorRepository) ListByDocument(ctx context.Context, documentID uuid.UUID) ([]entities.DocumentError, error) {
db := DBFromContext(ctx, r.db)
var errors []entities.DocumentError
err := db.WithContext(ctx).
Preload("Session").
Where("document_id = ?", documentID).
Order("created_at DESC").
Find(&errors).Error
return errors, err
}
func (r *DocumentErrorRepository) ListBySession(ctx context.Context, sessionID uuid.UUID) ([]entities.DocumentError, error) {
db := DBFromContext(ctx, r.db)
var errors []entities.DocumentError
err := db.WithContext(ctx).
Where("session_id = ?", sessionID).
Order("created_at DESC").
Find(&errors).Error
return errors, err
}