package dto import ( "time" "tyapi-server/internal/domains/user/entities" ) // CreateUserRequest 创建用户请求 type CreateUserRequest struct { Username string `json:"username" binding:"required,min=3,max=50" example:"john_doe"` Email string `json:"email" binding:"required,email" example:"john@example.com"` Password string `json:"password" binding:"required,min=6,max=128" example:"password123"` FirstName string `json:"first_name" binding:"max=50" example:"John"` LastName string `json:"last_name" binding:"max=50" example:"Doe"` Phone string `json:"phone" binding:"omitempty,max=20" example:"+86-13800138000"` } // UpdateUserRequest 更新用户请求 type UpdateUserRequest struct { FirstName *string `json:"first_name,omitempty" binding:"omitempty,max=50" example:"John"` LastName *string `json:"last_name,omitempty" binding:"omitempty,max=50" example:"Doe"` Phone *string `json:"phone,omitempty" binding:"omitempty,max=20" example:"+86-13800138000"` Avatar *string `json:"avatar,omitempty" binding:"omitempty,url" example:"https://example.com/avatar.jpg"` } // ChangePasswordRequest 修改密码请求 type ChangePasswordRequest struct { OldPassword string `json:"old_password" binding:"required" example:"oldpassword123"` NewPassword string `json:"new_password" binding:"required,min=6,max=128" example:"newpassword123"` } // UserResponse 用户响应 type UserResponse struct { ID string `json:"id" example:"123e4567-e89b-12d3-a456-426614174000"` Username string `json:"username" example:"john_doe"` Email string `json:"email" example:"john@example.com"` FirstName string `json:"first_name" example:"John"` LastName string `json:"last_name" example:"Doe"` Phone string `json:"phone" example:"+86-13800138000"` Avatar string `json:"avatar" example:"https://example.com/avatar.jpg"` Status entities.UserStatus `json:"status" example:"active"` LastLoginAt *time.Time `json:"last_login_at,omitempty" example:"2024-01-01T00:00:00Z"` CreatedAt time.Time `json:"created_at" example:"2024-01-01T00:00:00Z"` UpdatedAt time.Time `json:"updated_at" example:"2024-01-01T00:00:00Z"` Profile *UserProfileResponse `json:"profile,omitempty"` } // UserProfileResponse 用户档案响应 type UserProfileResponse struct { Bio string `json:"bio,omitempty" example:"Software Developer"` Location string `json:"location,omitempty" example:"Beijing, China"` Website string `json:"website,omitempty" example:"https://johndoe.com"` Birthday *time.Time `json:"birthday,omitempty" example:"1990-01-01T00:00:00Z"` Gender string `json:"gender,omitempty" example:"male"` Timezone string `json:"timezone,omitempty" example:"Asia/Shanghai"` Language string `json:"language,omitempty" example:"zh-CN"` } // UserListRequest 用户列表请求 type UserListRequest struct { Page int `form:"page" binding:"omitempty,min=1" example:"1"` PageSize int `form:"page_size" binding:"omitempty,min=1,max=100" example:"20"` Sort string `form:"sort" binding:"omitempty,oneof=created_at updated_at username email" example:"created_at"` Order string `form:"order" binding:"omitempty,oneof=asc desc" example:"desc"` Status entities.UserStatus `form:"status" binding:"omitempty,oneof=active inactive suspended pending" example:"active"` Search string `form:"search" binding:"omitempty,max=100" example:"john"` Filters map[string]interface{} `form:"-"` } // UserListResponse 用户列表响应 type UserListResponse struct { Users []*UserResponse `json:"users"` Pagination PaginationMeta `json:"pagination"` } // PaginationMeta 分页元数据 type PaginationMeta struct { Page int `json:"page" example:"1"` PageSize int `json:"page_size" example:"20"` Total int64 `json:"total" example:"100"` TotalPages int `json:"total_pages" example:"5"` HasNext bool `json:"has_next" example:"true"` HasPrev bool `json:"has_prev" example:"false"` } // LoginRequest 登录请求 type LoginRequest struct { Login string `json:"login" binding:"required" example:"john_doe"` Password string `json:"password" binding:"required" example:"password123"` } // LoginResponse 登录响应 type LoginResponse struct { User *UserResponse `json:"user"` AccessToken string `json:"access_token" example:"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."` TokenType string `json:"token_type" example:"Bearer"` ExpiresIn int64 `json:"expires_in" example:"86400"` } // UpdateProfileRequest 更新用户档案请求 type UpdateProfileRequest struct { Bio *string `json:"bio,omitempty" binding:"omitempty,max=500" example:"Software Developer"` Location *string `json:"location,omitempty" binding:"omitempty,max=100" example:"Beijing, China"` Website *string `json:"website,omitempty" binding:"omitempty,url" example:"https://johndoe.com"` Birthday *time.Time `json:"birthday,omitempty" example:"1990-01-01T00:00:00Z"` Gender *string `json:"gender,omitempty" binding:"omitempty,oneof=male female other" example:"male"` Timezone *string `json:"timezone,omitempty" binding:"omitempty,max=50" example:"Asia/Shanghai"` Language *string `json:"language,omitempty" binding:"omitempty,max=10" example:"zh-CN"` } // UserStatsResponse 用户统计响应 type UserStatsResponse struct { TotalUsers int64 `json:"total_users" example:"1000"` ActiveUsers int64 `json:"active_users" example:"950"` InactiveUsers int64 `json:"inactive_users" example:"30"` SuspendedUsers int64 `json:"suspended_users" example:"20"` NewUsersToday int64 `json:"new_users_today" example:"5"` NewUsersWeek int64 `json:"new_users_week" example:"25"` NewUsersMonth int64 `json:"new_users_month" example:"120"` } // UserSearchRequest 用户搜索请求 type UserSearchRequest struct { Query string `form:"q" binding:"required,min=1,max=100" example:"john"` Page int `form:"page" binding:"omitempty,min=1" example:"1"` PageSize int `form:"page_size" binding:"omitempty,min=1,max=50" example:"10"` } // 转换方法 func (r *CreateUserRequest) ToEntity() *entities.User { return &entities.User{ Username: r.Username, Email: r.Email, Password: r.Password, FirstName: r.FirstName, LastName: r.LastName, Phone: r.Phone, Status: entities.UserStatusActive, } } func FromEntity(user *entities.User) *UserResponse { if user == nil { return nil } return &UserResponse{ ID: user.ID, Username: user.Username, Email: user.Email, FirstName: user.FirstName, LastName: user.LastName, Phone: user.Phone, Avatar: user.Avatar, Status: user.Status, LastLoginAt: user.LastLoginAt, CreatedAt: user.CreatedAt, UpdatedAt: user.UpdatedAt, } } func FromEntities(users []*entities.User) []*UserResponse { if users == nil { return []*UserResponse{} } responses := make([]*UserResponse, len(users)) for i, user := range users { responses[i] = FromEntity(user) } return responses }