package responses import ( "time" "github.com/shopspring/decimal" "github.com/treytartt/mycrib-api/internal/models" ) // DocumentUserResponse represents a user in document context type DocumentUserResponse struct { ID uint `json:"id"` Username string `json:"username"` FirstName string `json:"first_name"` LastName string `json:"last_name"` } // DocumentResponse represents a document in the API response type DocumentResponse struct { ID uint `json:"id"` ResidenceID uint `json:"residence_id"` Residence uint `json:"residence"` // Alias for residence_id (KMM compatibility) CreatedByID uint `json:"created_by_id"` CreatedBy *DocumentUserResponse `json:"created_by,omitempty"` Title string `json:"title"` Description string `json:"description"` DocumentType models.DocumentType `json:"document_type"` FileURL string `json:"file_url"` FileName string `json:"file_name"` FileSize *int64 `json:"file_size"` MimeType string `json:"mime_type"` PurchaseDate *time.Time `json:"purchase_date"` ExpiryDate *time.Time `json:"expiry_date"` PurchasePrice *decimal.Decimal `json:"purchase_price"` Vendor string `json:"vendor"` SerialNumber string `json:"serial_number"` ModelNumber string `json:"model_number"` TaskID *uint `json:"task_id"` IsActive bool `json:"is_active"` CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` } // Note: Pagination removed - list endpoints now return arrays directly // === Factory Functions === // NewDocumentUserResponse creates a DocumentUserResponse from a User model func NewDocumentUserResponse(u *models.User) *DocumentUserResponse { if u == nil { return nil } return &DocumentUserResponse{ ID: u.ID, Username: u.Username, FirstName: u.FirstName, LastName: u.LastName, } } // NewDocumentResponse creates a DocumentResponse from a Document model func NewDocumentResponse(d *models.Document) DocumentResponse { resp := DocumentResponse{ ID: d.ID, ResidenceID: d.ResidenceID, Residence: d.ResidenceID, // Alias for KMM compatibility CreatedByID: d.CreatedByID, Title: d.Title, Description: d.Description, DocumentType: d.DocumentType, FileURL: d.FileURL, FileName: d.FileName, FileSize: d.FileSize, MimeType: d.MimeType, PurchaseDate: d.PurchaseDate, ExpiryDate: d.ExpiryDate, PurchasePrice: d.PurchasePrice, Vendor: d.Vendor, SerialNumber: d.SerialNumber, ModelNumber: d.ModelNumber, TaskID: d.TaskID, IsActive: d.IsActive, CreatedAt: d.CreatedAt, UpdatedAt: d.UpdatedAt, } if d.CreatedBy.ID != 0 { resp.CreatedBy = NewDocumentUserResponse(&d.CreatedBy) } return resp } // NewDocumentListResponse creates a list of document responses func NewDocumentListResponse(documents []models.Document) []DocumentResponse { results := make([]DocumentResponse, len(documents)) for i, d := range documents { results[i] = NewDocumentResponse(&d) } return results }