Files
tm_back/internal/user/form.go
T
n.nakhostin dfcdef60d6 Add Device Token Support for Customer and User Entities
- 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.
2025-09-20 10:11:36 +03:30

141 lines
7.0 KiB
Go

package user
import "tm/pkg/response"
// User Registration DTOs
// CreateUserForm represents the data required to create a new user account
type CreateUserForm struct {
FullName string `json:"full_name" valid:"required,length(2|100)" example:"Admin User"` // Full name of the user
Username string `json:"username" valid:"required,alphanum,length(3|30)" example:"admin"` // Unique username (alphanumeric only)
Email string `json:"email" valid:"required,email" example:"admin@opplens.com"` // Valid email address
Password string `json:"password" valid:"required,length(8|128)" example:"Admin!1234"` // Password (minimum 8 characters)
Role string `json:"role" valid:"required,in(admin|manager|operator|viewer)" example:"admin"` // User role (admin, manager, operator, viewer)
Department *string `json:"department" valid:"optional,length(2|100)" example:"Information Technology"` // Optional department name
Position *string `json:"position" valid:"optional,length(2|100)" example:"Lead"` // Optional job position
Phone *string `json:"phone" valid:"optional,length(10|20)" example:"+18289784438"` // Optional phone number
ProfileImage *string `json:"profile_image" valid:"optional,url" example:""` // Optional profile image URL
}
// UpdateUserForm represents the data for updating an existing user account
type UpdateUserForm struct {
FullName *string `json:"full_name" valid:"optional,length(2|100)" example:"Admin User"` // Updated full name
Username *string `json:"username" valid:"optional,alphanum,length(3|30)" example:"admin"` // Updated username
Email *string `json:"email" valid:"optional,email" example:"admin@opplens.com"` // Updated email address
Role *string `json:"role" valid:"optional,in(admin|manager|operator|viewer)" example:"admin"` // Updated user role
Department *string `json:"department" valid:"optional,length(2|100)" example:"Information Technology"` // Updated department
Position *string `json:"position" valid:"optional,length(2|100)" example:"Lead"` // Updated position
Phone *string `json:"phone" valid:"optional,length(10|20)" example:"+18289784438"` // Updated phone number
ProfileImage *string `json:"profile_image" valid:"optional,url" example:""` // Updated profile image URL
}
// User Authentication DTOs
// LoginForm represents the credentials required for user authentication
type LoginForm struct {
Username string `json:"username" valid:"required" example:"admin"` // Username or email address
Password string `json:"password" valid:"required" example:"Admin!1234"` // User password
DeviceToken string `json:"device_token" valid:"optional" example:"device_token"` // Device token
}
// RefreshTokenForm represents the refresh token required to generate new access tokens
type RefreshTokenForm struct {
RefreshToken string `json:"refresh_token" valid:"required" example:"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."` // Valid refresh token
}
// ChangePasswordForm represents the data required to change user password
type ChangePasswordForm struct {
OldPassword string `json:"old_password" valid:"required" example:"Admin!1234"` // Current password for verification
NewPassword string `json:"new_password" valid:"required,length(8|128)" example:"NewAdmin!1234"` // New password (minimum 8 characters)
}
// UpdateProfileForm represents the data for updating user profile information
type UpdateProfileForm struct {
FullName *string `json:"full_name,omitempty" valid:"optional,length(2|100)" example:"Admin User"` // Updated full name
Department *string `json:"department,omitempty" valid:"optional,length(2|100)" example:"Information Technology"` // Updated department
Position *string `json:"position,omitempty" valid:"optional,length(2|100)" example:"Lead"` // Updated position
Phone *string `json:"phone,omitempty" valid:"optional,length(10|20)" example:"+18289784438"` // Updated phone number
ProfileImage *string `json:"profile_image,omitempty" valid:"optional,url" example:""` // Updated profile image URL
}
// ResetPasswordForm represents the email address for password reset
type ResetPasswordForm struct {
Email string `json:"email" valid:"required,email" example:"admin@opplens.com"` // Email address for password reset
}
// Admin DTOs
type ListUsersForm struct {
Search *string `query:"q" valid:"optional"`
Status *string `query:"status" valid:"optional,in(active|inactive|suspended)"`
Role *string `query:"role" valid:"optional,in(admin|manager|operator|viewer)"`
CompanyID *string `query:"company_id" valid:"optional"`
Limit *int `query:"limit" valid:"optional,range(1|100)"`
Offset *int `query:"offset" valid:"optional,min(0)"`
SortBy *string `query:"sort_by" valid:"optional,in(full_name|email|username|role|created_at|last_login_at)"`
SortOrder *string `query:"sort_order" valid:"optional,in(asc|desc)"`
}
type UpdateUserStatusForm struct {
Status string `json:"status" valid:"required,in(active|inactive|suspended)"`
}
type UpdateUserRoleForm struct {
Role string `json:"role" valid:"required,in(admin|manager|operator|viewer)"`
}
// Response DTOs
type UserResponse struct {
ID string `json:"id"`
FullName string `json:"full_name"`
Username string `json:"username"`
Email string `json:"email"`
Role string `json:"role"`
Status string `json:"status"`
Department *string `json:"department"`
Position *string `json:"position"`
Phone *string `json:"phone"`
ProfileImage *string `json:"profile_image"`
IsVerified bool `json:"is_verified"`
LastLoginAt *int64 `json:"last_login_at"`
UpdatedAt int64 `json:"updated_at"`
CreatedAt int64 `json:"created_at"`
}
type AuthResponse struct {
User *UserResponse `json:"user"`
AccessToken string `json:"access_token"`
RefreshToken string `json:"refresh_token"`
ExpiresAt int64 `json:"expires_at"`
}
type UserListResponse struct {
Users []*UserResponse `json:"users"`
Meta *response.Meta `json:"-"`
}
type SearchUsersForm struct {
Search *string `query:"search" valid:"optional"`
Status *string `query:"status" valid:"optional,in(active|inactive|suspended)"`
Role *string `query:"role" valid:"optional,in(admin|manager|operator|viewer)"`
}
// Helper function to convert User to UserResponse
func (u *User) ToResponse() *UserResponse {
return &UserResponse{
ID: u.ID.Hex(),
FullName: u.FullName,
Username: u.Username,
Email: u.Email,
Role: string(u.Role),
Status: string(u.Status),
Department: u.Department,
Position: u.Position,
Phone: u.Phone,
ProfileImage: u.ProfileImage,
IsVerified: u.IsVerified,
LastLoginAt: u.LastLoginAt,
UpdatedAt: u.UpdatedAt,
CreatedAt: u.CreatedAt,
}
}