update api incoming letter
This commit is contained in:
parent
58128495a6
commit
92440953cb
@ -77,6 +77,7 @@ type IncomingLetterResponse struct {
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
Attachments []IncomingLetterAttachmentResponse `json:"attachments"`
|
||||
IsRead bool `json:"is_read"`
|
||||
Dispositions []EnhancedDispositionResponse `json:"dispositions"`
|
||||
}
|
||||
|
||||
type UpdateIncomingLetterRequest struct {
|
||||
|
||||
@ -101,6 +101,7 @@ func (p *LetterProcessorImpl) GetIncomingLetterByID(ctx context.Context, id uuid
|
||||
return nil, err
|
||||
}
|
||||
atts, _ := p.attachRepo.ListByLetter(ctx, id)
|
||||
dispo, _ := p.dispositionRepo.ListByLetter(ctx, id)
|
||||
var pr *entities.Priority
|
||||
if entity.PriorityID != nil && p.priorityRepo != nil {
|
||||
if got, err := p.priorityRepo.Get(ctx, *entity.PriorityID); err == nil {
|
||||
@ -119,10 +120,11 @@ func (p *LetterProcessorImpl) GetIncomingLetterByID(ctx context.Context, id uuid
|
||||
if p.recipientRepo != nil {
|
||||
if recipient, err := p.recipientRepo.GetByLetterAndUser(ctx, id, userID); err == nil {
|
||||
isRead = recipient.ReadAt != nil
|
||||
fmt.Printf("Recipient: %+v\n", recipient)
|
||||
}
|
||||
}
|
||||
|
||||
resp := transformer.LetterEntityToContract(entity, atts, pr, inst)
|
||||
resp := transformer.LetterEntityToContract(entity, atts, dispo, pr, inst)
|
||||
resp.IsRead = isRead
|
||||
|
||||
// Include created_by if the current user is the creator
|
||||
@ -209,6 +211,13 @@ func (p *LetterProcessorImpl) GetBatchAttachments(ctx context.Context, letterIDs
|
||||
return p.attachRepo.ListByLetterIDs(ctx, letterIDs)
|
||||
}
|
||||
|
||||
func (p *LetterProcessorImpl) GetBatchDispositions(ctx context.Context, letterIDs []uuid.UUID) (map[uuid.UUID][]entities.LetterIncomingDisposition, error) {
|
||||
if p.dispositionRepo == nil || len(letterIDs) == 0 {
|
||||
return make(map[uuid.UUID][]entities.LetterIncomingDisposition), nil
|
||||
}
|
||||
return p.dispositionRepo.ListByLetterIDs(ctx, letterIDs)
|
||||
}
|
||||
|
||||
func (p *LetterProcessorImpl) GetBatchPriorities(ctx context.Context, priorityIDs []uuid.UUID) (map[uuid.UUID]*entities.Priority, error) {
|
||||
if p.priorityRepo == nil || len(priorityIDs) == 0 {
|
||||
return make(map[uuid.UUID]*entities.Priority), nil
|
||||
@ -290,6 +299,7 @@ func (p *LetterProcessorImpl) UpdateIncomingLetter(ctx context.Context, id uuid.
|
||||
}
|
||||
}
|
||||
atts, _ := p.attachRepo.ListByLetter(txCtx, id)
|
||||
dispo, _ := p.dispositionRepo.ListByLetter(txCtx, id)
|
||||
var pr *entities.Priority
|
||||
if entity.PriorityID != nil && p.priorityRepo != nil {
|
||||
if got, err := p.priorityRepo.Get(txCtx, *entity.PriorityID); err == nil {
|
||||
@ -302,7 +312,7 @@ func (p *LetterProcessorImpl) UpdateIncomingLetter(ctx context.Context, id uuid.
|
||||
inst = got
|
||||
}
|
||||
}
|
||||
out = transformer.LetterEntityToContract(entity, atts, pr, inst)
|
||||
out = transformer.LetterEntityToContract(entity, atts, dispo, pr, inst)
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
@ -601,6 +611,7 @@ func (p *LetterProcessorImpl) SearchIncomingLetters(ctx context.Context, filters
|
||||
|
||||
func (p *LetterProcessorImpl) buildLetterResponse(ctx context.Context, entity *entities.LetterIncoming) (*contract.IncomingLetterResponse, error) {
|
||||
savedAttachments, _ := p.attachRepo.ListByLetter(ctx, entity.ID)
|
||||
dispo, _ := p.dispositionRepo.ListByLetter(ctx, entity.ID)
|
||||
|
||||
var pr *entities.Priority
|
||||
if entity.PriorityID != nil && p.priorityRepo != nil {
|
||||
@ -616,7 +627,7 @@ func (p *LetterProcessorImpl) buildLetterResponse(ctx context.Context, entity *e
|
||||
}
|
||||
}
|
||||
|
||||
return transformer.LetterEntityToContract(entity, savedAttachments, pr, inst), nil
|
||||
return transformer.LetterEntityToContract(entity, savedAttachments, dispo, pr, inst), nil
|
||||
}
|
||||
|
||||
func (p *LetterProcessorImpl) BulkArchiveIncomingLetters(ctx context.Context, letterIDs []uuid.UUID) (int64, error) {
|
||||
|
||||
@ -463,6 +463,33 @@ func (r *LetterIncomingDispositionRepository) ListByLetter(ctx context.Context,
|
||||
return list, nil
|
||||
}
|
||||
|
||||
func (r *LetterIncomingDispositionRepository) ListByLetterIDs(ctx context.Context, letterIDs []uuid.UUID) (map[uuid.UUID][]entities.LetterIncomingDisposition, error) {
|
||||
if len(letterIDs) == 0 {
|
||||
return make(map[uuid.UUID][]entities.LetterIncomingDisposition), nil
|
||||
}
|
||||
|
||||
db := DBFromContext(ctx, r.db)
|
||||
var dispositions []entities.LetterIncomingDisposition
|
||||
if err := db.WithContext(ctx).Where("letter_id IN ?", letterIDs).
|
||||
Preload("Department").
|
||||
Preload("Departments.Department").
|
||||
Preload("ActionSelections.Action").
|
||||
Preload("DispositionNotes.User").
|
||||
Order("created_at ASC").
|
||||
Find(&dispositions).Error; err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Group by letter ID
|
||||
result := make(map[uuid.UUID][]entities.LetterIncomingDisposition)
|
||||
for i := range dispositions { // Gunakan index, bukan value
|
||||
letterID := dispositions[i].LetterID
|
||||
result[letterID] = append(result[letterID], dispositions[i])
|
||||
}
|
||||
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (r *LetterIncomingDispositionRepository) GetByLetterIncomingID(ctx context.Context, letterIncomingID uuid.UUID) ([]entities.LetterIncomingDisposition, error) {
|
||||
db := DBFromContext(ctx, r.db)
|
||||
var list []entities.LetterIncomingDisposition
|
||||
|
||||
@ -37,6 +37,7 @@ type LetterProcessor interface {
|
||||
|
||||
// Batch loading methods
|
||||
GetBatchAttachments(ctx context.Context, letterIDs []uuid.UUID) (map[uuid.UUID][]entities.LetterIncomingAttachment, error)
|
||||
GetBatchDispositions(ctx context.Context, letterIDs []uuid.UUID) (map[uuid.UUID][]entities.LetterIncomingDisposition, error)
|
||||
GetBatchPriorities(ctx context.Context, priorityIDs []uuid.UUID) (map[uuid.UUID]*entities.Priority, error)
|
||||
GetBatchInstitutions(ctx context.Context, institutionIDs []uuid.UUID) (map[uuid.UUID]*entities.Institution, error)
|
||||
GetBatchRecipientsByUser(ctx context.Context, letterIDs []uuid.UUID, userID uuid.UUID) (map[uuid.UUID]*entities.LetterIncomingRecipient, error)
|
||||
@ -347,6 +348,7 @@ func (s *LetterServiceImpl) ListIncomingLetters(ctx context.Context, req *contra
|
||||
priorities map[uuid.UUID]*entities.Priority
|
||||
institutions map[uuid.UUID]*entities.Institution
|
||||
recipients map[uuid.UUID]*entities.LetterIncomingRecipient
|
||||
dispostions map[uuid.UUID][]entities.LetterIncomingDisposition
|
||||
err error
|
||||
}
|
||||
|
||||
@ -358,9 +360,10 @@ func (s *LetterServiceImpl) ListIncomingLetters(ctx context.Context, req *contra
|
||||
priorities: make(map[uuid.UUID]*entities.Priority),
|
||||
institutions: make(map[uuid.UUID]*entities.Institution),
|
||||
recipients: make(map[uuid.UUID]*entities.LetterIncomingRecipient),
|
||||
dispostions: make(map[uuid.UUID][]entities.LetterIncomingDisposition),
|
||||
}
|
||||
|
||||
errChan := make(chan error, 4)
|
||||
errChan := make(chan error, 5)
|
||||
|
||||
go func() {
|
||||
var err error
|
||||
@ -386,7 +389,13 @@ func (s *LetterServiceImpl) ListIncomingLetters(ctx context.Context, req *contra
|
||||
errChan <- err
|
||||
}()
|
||||
|
||||
for i := 0; i < 4; i++ {
|
||||
go func() {
|
||||
var err error
|
||||
result.dispostions, err = s.processor.GetBatchDispositions(ctx, letterIDs)
|
||||
errChan <- err
|
||||
}()
|
||||
|
||||
for i := 0; i < 5; i++ {
|
||||
if err := <-errChan; err != nil {
|
||||
// Batch load error, continue anyway
|
||||
}
|
||||
@ -414,12 +423,17 @@ func (s *LetterServiceImpl) ListIncomingLetters(ctx context.Context, req *contra
|
||||
institution = batchData.institutions[*letter.SenderInstitutionID]
|
||||
}
|
||||
|
||||
dispositions := batchData.dispostions[letter.ID]
|
||||
if dispositions == nil {
|
||||
dispositions = []entities.LetterIncomingDisposition{}
|
||||
}
|
||||
|
||||
isRead := false
|
||||
if recipient, exists := batchData.recipients[letter.ID]; exists && recipient != nil {
|
||||
isRead = recipient.ReadAt != nil
|
||||
}
|
||||
|
||||
resp := transformer.LetterEntityToContract(&letter, attachments, priority, institution)
|
||||
resp := transformer.LetterEntityToContract(&letter, attachments, dispositions, priority, institution)
|
||||
resp.IsRead = isRead
|
||||
respList = append(respList, *resp)
|
||||
}
|
||||
@ -910,8 +924,6 @@ func (s *LetterServiceImpl) sendDispositionCreatorNotification(ctx context.Conte
|
||||
fmt.Printf("[DEBUG] Successfully retrieved letter: %s\n", letter.Subject)
|
||||
fmt.Printf("[DEBUG] Successfully retrieved letter: %s\n", letter.CreatedBy)
|
||||
|
||||
|
||||
|
||||
letterCreatorID := letter.CreatedBy
|
||||
|
||||
// Don't send notification if the disposition creator is the same as letter creator
|
||||
|
||||
@ -7,7 +7,7 @@ import (
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
func LetterEntityToContract(e *entities.LetterIncoming, attachments []entities.LetterIncomingAttachment, refs ...interface{}) *contract.IncomingLetterResponse {
|
||||
func LetterEntityToContract(e *entities.LetterIncoming, attachments []entities.LetterIncomingAttachment, dispositions []entities.LetterIncomingDisposition, refs ...interface{}) *contract.IncomingLetterResponse {
|
||||
resp := &contract.IncomingLetterResponse{
|
||||
ID: e.ID,
|
||||
LetterNumber: e.LetterNumber,
|
||||
@ -24,6 +24,7 @@ func LetterEntityToContract(e *entities.LetterIncoming, attachments []entities.L
|
||||
CreatedAt: e.CreatedAt,
|
||||
UpdatedAt: e.UpdatedAt,
|
||||
Attachments: make([]contract.IncomingLetterAttachmentResponse, 0, len(attachments)),
|
||||
Dispositions: make([]contract.EnhancedDispositionResponse, 0, len(dispositions)),
|
||||
}
|
||||
|
||||
// optional refs: allow passing already-fetched related objects
|
||||
@ -65,6 +66,23 @@ func LetterEntityToContract(e *entities.LetterIncoming, attachments []entities.L
|
||||
UploadedAt: a.UploadedAt,
|
||||
})
|
||||
}
|
||||
|
||||
for _, d := range dispositions {
|
||||
resp.Dispositions = append(resp.Dispositions, contract.EnhancedDispositionResponse{
|
||||
ID: d.ID,
|
||||
LetterID: d.LetterID,
|
||||
DepartmentID: d.DepartmentID,
|
||||
Notes: d.Notes,
|
||||
ReadAt: d.ReadAt,
|
||||
CreatedBy: d.CreatedBy,
|
||||
CreatedAt: d.CreatedAt,
|
||||
UpdatedAt: d.UpdatedAt,
|
||||
Departments: DispositionDepartmentsWithDetailsToContract(d.Departments),
|
||||
Actions: DispositionActionSelectionsWithDetailsToContract(d.ActionSelections),
|
||||
DispositionNotes: DispositionNotesWithDetailsToContract(d.DispositionNotes),
|
||||
Department: DepartmentToContract(d.Department),
|
||||
})
|
||||
}
|
||||
return resp
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user