dfcdef60d6
- Introduced a new DeviceToken field in both Customer and User entities to store device tokens for authentication and notifications. - Updated LoginForm structures for both Customer and User to include an optional DeviceToken field, allowing clients to send device tokens during login. - Enhanced the Login methods in the customer and user services to append the device token to the respective entities if it does not already exist, improving user session management and notification capabilities. - Ensured proper validation and structured responses for the new DeviceToken field in the forms, maintaining compliance with best practices for API design.
173 lines
6.9 KiB
Go
173 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"`
|
|
CompanyIDs []string `json:"company_ids,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"`
|
|
CompanyIDs []string `json:"company_ids,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"`
|
|
CompanyIDs []string `json:"company_ids"`
|
|
UpdatedAt int64 `json:"updated_at"`
|
|
CreatedAt int64 `json:"created_at"`
|
|
LastLoginAt *int64 `json:"last_login_at"`
|
|
Companies []*CompanySummary `json:"companies"`
|
|
}
|
|
|
|
// 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,
|
|
CompanyIDs: c.CompanyIDs,
|
|
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 {
|
|
CompanyIDs []string `json:"company_ids" valid:"required"`
|
|
}
|
|
|
|
type RemoveCompaniesForm struct {
|
|
CompanyIDs []string `json:"company_ids" 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"`
|
|
}
|