9037cb5917
- Updated the notification handling logic to utilize a new SDK for sending notifications, improving the flexibility and scalability of the notification system. - Introduced new methods in the notification service for sending notifications to users and customers based on various target audience types, enhancing the notification delivery capabilities. - Added a new endpoint to assign companies to a customer, improving customer management functionalities. - Refactored the customer entity and forms to replace 'CompanyIDs' with 'Companies', ensuring consistency across the data model. - Enhanced API documentation with Swagger comments for the new endpoint and updated notification structures, ensuring clarity for API consumers.
172 lines
6.9 KiB
Go
172 lines
6.9 KiB
Go
package customer
|
|
|
|
import "tm/pkg/response"
|
|
|
|
// CreateCustomerForm represents the form for creating a new customer
|
|
type CreateCustomerForm struct {
|
|
FullName *string `json:"full_name,omitempty" valid:"optional,length(2|100)" example:"User"`
|
|
Type string `json:"type" valid:"required,in(individual|company|government)" example:"individual"`
|
|
Role string `json:"role" valid:"required,in(admin|analyst)" example:"analyst"`
|
|
Companies []string `json:"companies,omitempty" valid:"optional"`
|
|
Username string `json:"username" valid:"required,alphanum,length(3|30)" example:"user"`
|
|
Email string `json:"email" valid:"required,email" example:"user@opplens.com"`
|
|
Password string `json:"password" valid:"required,length(8|128)" example:"User!1234"`
|
|
Phone *string `json:"phone,omitempty" valid:"optional,length(10|20)" example:"+1234567890"`
|
|
}
|
|
|
|
// UpdateCustomerForm represents the form for updating a customer
|
|
type UpdateCustomerForm struct {
|
|
FullName *string `json:"full_name,omitempty" valid:"optional,length(2|100)" example:"User"`
|
|
Type string `json:"type" valid:"required,in(individual|company|government)" example:"individual"`
|
|
Role string `json:"role" valid:"required,in(admin|analyst)" example:"analyst"`
|
|
Companies []string `json:"companies,omitempty" valid:"optional"`
|
|
Username string `json:"username" valid:"required,alphanum,length(3|30)" example:"user"`
|
|
Email string `json:"email" valid:"required,email" example:"user@opplens.com"`
|
|
Password string `json:"password" valid:"required,length(8|128)" example:"User!1234"`
|
|
Phone *string `json:"phone,omitempty" valid:"optional,length(10|20)" example:"+1234567890"`
|
|
}
|
|
|
|
// CustomerStatusForm represents the form for suspending a customer
|
|
type UpdateStatusForm struct {
|
|
Status string `json:"status" valid:"required,in(active|inactive|suspended)" example:"active"`
|
|
Reason string `json:"reason" valid:"required,length(10|500)" example:"Customer is active"`
|
|
}
|
|
|
|
// ListCustomersForm represents the form for listing customers with filters
|
|
type SearchCustomersForm struct {
|
|
Search *string `query:"q" valid:"optional"`
|
|
Type *string `query:"type" valid:"optional,in(individual|company|government)"`
|
|
Status *string `query:"status" valid:"optional,in(active|inactive|suspended)"`
|
|
CompanyID *string `query:"company_id" valid:"optional"`
|
|
}
|
|
|
|
// CompanySummary represents company summary data for customer responses
|
|
type CompanySummary struct {
|
|
ID string `json:"id"`
|
|
Name string `json:"name"`
|
|
}
|
|
|
|
// CustomerResponse represents the customer data sent in API responses
|
|
type CustomerResponse struct {
|
|
ID string `json:"id"`
|
|
FullName *string `json:"full_name"`
|
|
Username string `json:"username"`
|
|
Email string `json:"email"`
|
|
Status string `json:"status"`
|
|
Type string `json:"type"`
|
|
Role string `json:"role"`
|
|
Phone *string `json:"phone"`
|
|
UpdatedAt int64 `json:"updated_at"`
|
|
CreatedAt int64 `json:"created_at"`
|
|
LastLoginAt *int64 `json:"last_login_at"`
|
|
Companies []*CompanySummary `json:"companies"`
|
|
DeviceToken []string `json:"-"`
|
|
}
|
|
|
|
// ToResponse converts Customer to CustomerResponse
|
|
func (c *Customer) ToResponse(companies []*CompanySummary) *CustomerResponse {
|
|
return &CustomerResponse{
|
|
ID: c.ID.Hex(),
|
|
FullName: c.FullName,
|
|
Username: c.Username,
|
|
Email: c.Email,
|
|
Type: string(c.Type),
|
|
Status: string(c.Status),
|
|
Role: string(c.Role),
|
|
Phone: c.Phone,
|
|
UpdatedAt: c.UpdatedAt,
|
|
CreatedAt: c.CreatedAt,
|
|
LastLoginAt: c.LastLoginAt,
|
|
Companies: companies,
|
|
}
|
|
}
|
|
|
|
// CustomerListResponse represents the response for listing customers
|
|
type CustomerListResponse struct {
|
|
Customers []*CustomerResponse `json:"customers"`
|
|
Meta *response.Meta `json:"-"`
|
|
}
|
|
|
|
type LoginForm struct {
|
|
Username string `json:"username" valid:"required" example:"app"`
|
|
Password string `json:"password" valid:"required" example:"App!1234"`
|
|
DeviceToken string `json:"device_token" valid:"optional" example:"device_token"`
|
|
}
|
|
|
|
type RefreshTokenForm struct {
|
|
RefreshToken string `json:"refresh_token" valid:"required"`
|
|
}
|
|
|
|
type ChangePasswordForm struct {
|
|
OldPassword string `json:"old_password" valid:"required"`
|
|
NewPassword string `json:"new_password" valid:"required,length(8|128)"`
|
|
}
|
|
|
|
type UpdateProfileForm struct {
|
|
FullName *string `json:"full_name,omitempty" valid:"optional,length(2|100)"`
|
|
Username *string `json:"username,omitempty" valid:"optional,alphanum,length(3|30)"`
|
|
Phone *string `json:"phone,omitempty" valid:"optional,length(10|20)"`
|
|
}
|
|
|
|
type AuthResponse struct {
|
|
Customer *CustomerResponse `json:"customer"`
|
|
AccessToken string `json:"access_token"`
|
|
RefreshToken string `json:"refresh_token"`
|
|
ExpiresAt int64 `json:"expires_at"`
|
|
}
|
|
|
|
type AssignCompaniesForm struct {
|
|
Companies []string `json:"companies" valid:"required"`
|
|
}
|
|
|
|
type RemoveCompaniesForm struct {
|
|
Companies []string `json:"companies" valid:"required"`
|
|
}
|
|
|
|
// RequestResetPasswordForm represents the form for requesting password reset
|
|
type RequestResetPasswordForm struct {
|
|
Email string `json:"email" valid:"required,email" example:"app@opplens.com"`
|
|
}
|
|
|
|
// VerifyOTPForm represents the form for verifying OTP code
|
|
type VerifyOTPForm struct {
|
|
Email string `json:"email" valid:"required,email" example:"app@opplens.com"`
|
|
Code string `json:"code" valid:"required,length(6|6)" example:"123456"`
|
|
}
|
|
|
|
// ResetPasswordForm represents the form for resetting password
|
|
type ResetPasswordForm struct {
|
|
Token string `json:"token" valid:"required" example:"reset_token_here"`
|
|
NewPassword string `json:"new_password" valid:"required,length(5|128)" example:"NewPass!123"`
|
|
}
|
|
|
|
// RequestResetPasswordResponse represents the response for password reset request
|
|
type RequestResetPasswordResponse struct {
|
|
Message string `json:"message" example:"Password reset code sent to your email"`
|
|
Success bool `json:"success" example:"true"`
|
|
}
|
|
|
|
// VerifyOTPResponse represents the response for OTP verification
|
|
type VerifyOTPResponse struct {
|
|
Message string `json:"message" example:"OTP verified successfully"`
|
|
Token string `json:"token" example:"reset_token_here"`
|
|
Success bool `json:"success" example:"true"`
|
|
}
|
|
|
|
// ResetPasswordResponse represents the response for password reset
|
|
type ResetPasswordResponse struct {
|
|
Message string `json:"message" example:"Password reset successfully"`
|
|
Success bool `json:"success" example:"true"`
|
|
}
|
|
|
|
// AssignRoleForm represents the form for assigning a role to a customer
|
|
type AssignRoleForm struct {
|
|
Role string `json:"role" valid:"required,in(admin|analyst)" example:"analyst"`
|
|
}
|
|
|
|
// AssignRoleResponse represents the response for role assignment
|
|
type AssignRoleResponse struct {
|
|
Message string `json:"message" example:"Role assigned successfully"`
|
|
Success bool `json:"success" example:"true"`
|
|
}
|