259 lines
11 KiB
Go
259 lines
11 KiB
Go
package contract
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/google/uuid"
|
|
)
|
|
|
|
type CreateIncomingLetterAttachment struct {
|
|
FileURL string `json:"file_url"`
|
|
FileName string `json:"file_name"`
|
|
FileType string `json:"file_type"`
|
|
}
|
|
|
|
type CreateIncomingLetterRequest struct {
|
|
LetterNumber string `json:"-"` // Generated by service layer
|
|
ReferenceNumber *string `json:"reference_number,omitempty"`
|
|
Subject string `json:"subject"`
|
|
Description *string `json:"description,omitempty"`
|
|
PriorityID *uuid.UUID `json:"priority_id,omitempty"`
|
|
SenderInstitutionID *uuid.UUID `json:"sender_institution_id,omitempty"`
|
|
ReceivedDate time.Time `json:"received_date"`
|
|
DueDate *time.Time `json:"due_date,omitempty"`
|
|
Attachments []CreateIncomingLetterAttachment `json:"attachments,omitempty"`
|
|
}
|
|
|
|
type IncomingLetterAttachmentResponse struct {
|
|
ID uuid.UUID `json:"id"`
|
|
FileURL string `json:"file_url"`
|
|
FileName string `json:"file_name"`
|
|
FileType string `json:"file_type"`
|
|
UploadedAt time.Time `json:"uploaded_at"`
|
|
}
|
|
|
|
type IncomingLetterResponse struct {
|
|
ID uuid.UUID `json:"id"`
|
|
LetterNumber string `json:"letter_number"`
|
|
ReferenceNumber *string `json:"reference_number,omitempty"`
|
|
Subject string `json:"subject"`
|
|
Description *string `json:"description,omitempty"`
|
|
Priority *PriorityResponse `json:"priority,omitempty"`
|
|
SenderInstitution *InstitutionResponse `json:"sender_institution,omitempty"`
|
|
ReceivedDate time.Time `json:"received_date"`
|
|
DueDate *time.Time `json:"due_date,omitempty"`
|
|
Status string `json:"status"`
|
|
CreatedBy uuid.UUID `json:"created_by"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
Attachments []IncomingLetterAttachmentResponse `json:"attachments"`
|
|
IsRead bool `json:"is_read"`
|
|
}
|
|
|
|
type UpdateIncomingLetterRequest struct {
|
|
ReferenceNumber *string `json:"reference_number,omitempty"`
|
|
Subject *string `json:"subject,omitempty"`
|
|
Description *string `json:"description,omitempty"`
|
|
PriorityID *uuid.UUID `json:"priority_id,omitempty"`
|
|
SenderInstitutionID *uuid.UUID `json:"sender_institution_id,omitempty"`
|
|
ReceivedDate *time.Time `json:"received_date,omitempty"`
|
|
DueDate *time.Time `json:"due_date,omitempty"`
|
|
Status *string `json:"status,omitempty"`
|
|
}
|
|
|
|
type ListIncomingLettersRequest struct {
|
|
Page int `json:"page"`
|
|
Limit int `json:"limit"`
|
|
Status *string `json:"status,omitempty"`
|
|
Query *string `json:"query,omitempty"`
|
|
DepartmentID *uuid.UUID
|
|
IsRead *bool `json:"is_read,omitempty"`
|
|
PriorityIDs []uuid.UUID `json:"priority_ids,omitempty"`
|
|
IsDispositioned *bool `json:"is_dispositioned,omitempty"`
|
|
IsArchived *bool `json:"is_archived,omitempty"`
|
|
}
|
|
|
|
type ListIncomingLettersResponse struct {
|
|
Letters []IncomingLetterResponse `json:"letters"`
|
|
Pagination PaginationResponse `json:"pagination"`
|
|
TotalUnread int `json:"total_unread"`
|
|
}
|
|
|
|
type LetterUnreadCountResponse struct {
|
|
IncomingLetter struct {
|
|
Unread int `json:"unread"`
|
|
} `json:"incoming_letter"`
|
|
OutgoingLetter struct {
|
|
Unread int `json:"unread"`
|
|
} `json:"outgoing_letter"`
|
|
}
|
|
|
|
type MarkLetterReadResponse struct {
|
|
Success bool `json:"success"`
|
|
Message string `json:"message"`
|
|
}
|
|
|
|
type CreateDispositionActionSelection struct {
|
|
ActionID uuid.UUID `json:"action_id"`
|
|
Note *string `json:"note,omitempty"`
|
|
}
|
|
|
|
type CreateLetterDispositionRequest struct {
|
|
FromDepartment uuid.UUID `json:"from_department"`
|
|
LetterID uuid.UUID `json:"letter_id"`
|
|
ToDepartmentIDs []uuid.UUID `json:"to_department_ids"`
|
|
Notes *string `json:"notes,omitempty"`
|
|
SelectedActions []CreateDispositionActionSelection `json:"selected_actions,omitempty"`
|
|
CreatedBy uuid.UUID `json:"created_by"`
|
|
}
|
|
|
|
type DispositionResponse struct {
|
|
ID uuid.UUID `json:"id"`
|
|
LetterID uuid.UUID `json:"letter_id"`
|
|
DepartmentID *uuid.UUID `json:"department_id,omitempty"`
|
|
Notes *string `json:"notes,omitempty"`
|
|
ReadAt *time.Time `json:"read_at,omitempty"`
|
|
CreatedBy uuid.UUID `json:"created_by"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
}
|
|
|
|
type ListDispositionsResponse struct {
|
|
Dispositions []DispositionResponse `json:"dispositions"`
|
|
}
|
|
|
|
type EnhancedDispositionResponse struct {
|
|
ID uuid.UUID `json:"id"`
|
|
LetterID uuid.UUID `json:"letter_id"`
|
|
DepartmentID *uuid.UUID `json:"department_id,omitempty"`
|
|
Notes *string `json:"notes,omitempty"`
|
|
ReadAt *time.Time `json:"read_at,omitempty"`
|
|
CreatedBy uuid.UUID `json:"created_by"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
Department DepartmentResponse `json:"department"`
|
|
Departments []DispositionDepartmentResponse `json:"departments"`
|
|
Actions []DispositionActionSelectionResponse `json:"actions"`
|
|
DispositionNotes []DispositionNoteResponse `json:"disposition_notes"`
|
|
}
|
|
|
|
type DispositionDepartmentResponse struct {
|
|
ID uuid.UUID `json:"id"`
|
|
DepartmentID uuid.UUID `json:"department_id"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
Department *DepartmentResponse `json:"department,omitempty"`
|
|
}
|
|
|
|
type DispositionActionSelectionResponse struct {
|
|
ID uuid.UUID `json:"id"`
|
|
ActionID uuid.UUID `json:"action_id"`
|
|
Action *DispositionActionResponse `json:"action,omitempty"`
|
|
Note *string `json:"note,omitempty"`
|
|
CreatedBy uuid.UUID `json:"created_by"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
}
|
|
|
|
type DispositionNoteResponse struct {
|
|
ID uuid.UUID `json:"id"`
|
|
UserID *uuid.UUID `json:"user_id,omitempty"`
|
|
Note string `json:"note"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
User *UserResponse `json:"user,omitempty"`
|
|
}
|
|
|
|
type ListEnhancedDispositionsResponse struct {
|
|
Dispositions []EnhancedDispositionResponse `json:"dispositions"`
|
|
Discussions []LetterDiscussionResponse `json:"discussions"`
|
|
}
|
|
|
|
type GetDepartmentDispositionStatusRequest struct {
|
|
LetterIncomingID uuid.UUID `json:"letter_incoming_id"`
|
|
DepartmentID uuid.UUID `json:"department_id"`
|
|
}
|
|
|
|
type DepartmentDispositionStatusResponse struct {
|
|
ID uuid.UUID `json:"id"`
|
|
LetterID uuid.UUID `json:"letter_id"`
|
|
Letter *IncomingLetterResponse `json:"letter,omitempty"`
|
|
FromDepartmentID *uuid.UUID `json:"from_department_id,omitempty"`
|
|
FromDepartment *DepartmentResponse `json:"from_department,omitempty"`
|
|
ToDepartmentID uuid.UUID `json:"to_department_id"`
|
|
ToDepartment *DepartmentResponse `json:"to_department,omitempty"`
|
|
Status string `json:"status"`
|
|
Notes *string `json:"notes,omitempty"`
|
|
ReadAt *time.Time `json:"read_at,omitempty"`
|
|
CompletedAt *time.Time `json:"completed_at,omitempty"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
}
|
|
|
|
type ListDepartmentDispositionStatusResponse struct {
|
|
Dispositions []DepartmentDispositionStatusResponse `json:"dispositions"`
|
|
Pagination PaginationResponse `json:"pagination"`
|
|
}
|
|
|
|
type UpdateDispositionStatusRequest struct {
|
|
LetterIncomingID uuid.UUID `json:"letter_incoming_id"`
|
|
Status string `json:"status"`
|
|
Notes *string `json:"notes,omitempty"`
|
|
}
|
|
|
|
type CreateLetterDiscussionRequest struct {
|
|
ParentID *uuid.UUID `json:"parent_id,omitempty"`
|
|
Message string `json:"message"`
|
|
Mentions map[string]interface{} `json:"mentions,omitempty"`
|
|
}
|
|
|
|
type UpdateLetterDiscussionRequest struct {
|
|
Message string `json:"message"`
|
|
Mentions map[string]interface{} `json:"mentions,omitempty"`
|
|
}
|
|
|
|
type LetterDiscussionResponse struct {
|
|
ID uuid.UUID `json:"id"`
|
|
LetterID uuid.UUID `json:"letter_id"`
|
|
ParentID *uuid.UUID `json:"parent_id,omitempty"`
|
|
UserID uuid.UUID `json:"user_id"`
|
|
Message string `json:"message"`
|
|
Mentions map[string]interface{} `json:"mentions,omitempty"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
EditedAt *time.Time `json:"edited_at,omitempty"`
|
|
|
|
// Preloaded user profile who created the discussion
|
|
User *UserResponse `json:"user,omitempty"`
|
|
|
|
// Preloaded user profiles for mentions
|
|
MentionedUsers []UserResponse `json:"mentioned_users,omitempty"`
|
|
}
|
|
|
|
type GetLetterCTARequest struct {
|
|
LetterIncomingID uuid.UUID `json:"letter_incoming_id"`
|
|
}
|
|
|
|
type LetterCTAAction struct {
|
|
Type string `json:"type"` // "create_disposition", "update_status", "view"
|
|
Label string `json:"label"` // Human-readable label for the action
|
|
Path string `json:"path"` // API endpoint path
|
|
Method string `json:"method"` // HTTP method: GET, POST, PUT, etc.
|
|
Description string `json:"description"` // Description of what this action does
|
|
}
|
|
|
|
type LetterCTAResponse struct {
|
|
LetterIncomingID uuid.UUID `json:"letter_incoming_id"`
|
|
Actions []LetterCTAAction `json:"actions"`
|
|
DispositionID *uuid.UUID `json:"disposition_id,omitempty"`
|
|
CurrentStatus *string `json:"current_status,omitempty"`
|
|
Message string `json:"message"`
|
|
}
|
|
|
|
type BulkArchiveLettersRequest struct {
|
|
LetterIDs []uuid.UUID `json:"letter_ids" binding:"required,min=1"`
|
|
}
|
|
|
|
type BulkArchiveLettersResponse struct {
|
|
Success bool `json:"success"`
|
|
Message string `json:"message"`
|
|
ArchivedCount int `json:"archived_count"`
|
|
}
|