875447ac58
- Introduced a new contact management feature, including the ability to create, retrieve, search, update, and delete contact messages. - Implemented the Contact entity, repository, service, and handler layers following Clean Architecture principles. - Added API endpoints for contact operations in Swagger documentation, ensuring comprehensive API specifications. - Enhanced error handling and validation for contact data, improving robustness and user experience. - Updated the main application to initialize the contact repository and service, integrating them into the existing system.
80 lines
2.9 KiB
Go
80 lines
2.9 KiB
Go
package contact
|
|
|
|
import "tm/pkg/response"
|
|
|
|
// CreateContactForm represents the form for creating a new contact message
|
|
type CreateContactForm struct {
|
|
FullName string `json:"full_name" valid:"required,length(2|100)" example:"John Doe"`
|
|
Email string `json:"email" valid:"required,email" example:"john.doe@example.com"`
|
|
Phone string `json:"phone" valid:"required,length(10|20)" example:"+1234567890"`
|
|
Message string `json:"message" valid:"required,length(10|1000)" example:"I have a question about your services"`
|
|
}
|
|
|
|
// UpdateContactStatusForm represents the form for updating contact status (admin only)
|
|
type UpdateContactStatusForm struct {
|
|
Status string `json:"status" valid:"required,in(pending|in_progress|resolved|closed)" example:"in_progress"`
|
|
AdminNotes *string `json:"admin_notes,omitempty" valid:"optional,length(0|500)" example:"Customer inquiry handled"`
|
|
}
|
|
|
|
// SearchContactsForm represents the form for searching contacts with filters
|
|
type SearchContactsForm struct {
|
|
Search *string `query:"q" valid:"optional"`
|
|
Status *string `query:"status" valid:"optional,in(pending|in_progress|resolved|closed)"`
|
|
DateFrom *int64 `query:"date_from" valid:"optional"`
|
|
DateTo *int64 `query:"date_to" valid:"optional"`
|
|
}
|
|
|
|
// ContactResponse represents the contact data sent in API responses
|
|
type ContactResponse struct {
|
|
ID string `json:"id"`
|
|
FullName string `json:"full_name"`
|
|
Email string `json:"email"`
|
|
Phone string `json:"phone"`
|
|
Message string `json:"message"`
|
|
Status string `json:"status"`
|
|
AdminNotes *string `json:"admin_notes,omitempty"`
|
|
ResolvedAt *int64 `json:"resolved_at,omitempty"`
|
|
ResolvedBy *string `json:"resolved_by,omitempty"`
|
|
CreatedAt int64 `json:"created_at"`
|
|
UpdatedAt int64 `json:"updated_at"`
|
|
}
|
|
|
|
// PublicContactResponse represents the contact data sent in public API responses (limited fields)
|
|
type PublicContactResponse struct {
|
|
ID string `json:"id"`
|
|
Status string `json:"status"`
|
|
CreatedAt int64 `json:"created_at"`
|
|
}
|
|
|
|
// ToResponse converts Contact to ContactResponse
|
|
func (c *Contact) ToResponse() *ContactResponse {
|
|
return &ContactResponse{
|
|
ID: c.ID.Hex(),
|
|
FullName: c.FullName,
|
|
Email: c.Email,
|
|
Phone: c.Phone,
|
|
Message: c.Message,
|
|
Status: string(c.Status),
|
|
AdminNotes: c.AdminNotes,
|
|
ResolvedAt: c.ResolvedAt,
|
|
ResolvedBy: c.ResolvedBy,
|
|
CreatedAt: c.CreatedAt,
|
|
UpdatedAt: c.UpdatedAt,
|
|
}
|
|
}
|
|
|
|
// ToPublicResponse converts Contact to PublicContactResponse (limited fields for public API)
|
|
func (c *Contact) ToPublicResponse() *PublicContactResponse {
|
|
return &PublicContactResponse{
|
|
ID: c.ID.Hex(),
|
|
Status: string(c.Status),
|
|
CreatedAt: c.CreatedAt,
|
|
}
|
|
}
|
|
|
|
// ContactListResponse represents the response for listing contacts
|
|
type ContactListResponse struct {
|
|
Contacts []*ContactResponse `json:"contacts"`
|
|
Meta *response.Meta `json:"-"`
|
|
}
|