Files
libredesk/internal/user/models/models.go
T
Ubuntu 0a5e5de544 fix: Handle NULL password field for imported contacts
Change Password field from string to null.String in User model to properly
handle contacts imported from external systems (e.g., Magento) that have
NULL passwords in the database.

Previously, fetching contacts with NULL passwords caused a SQL scan error:
"sql: Scan error on column index 4, name \"password\": converting NULL to
string is unsupported"
2025-12-17 12:25:58 +00:00

103 lines
4.1 KiB
Go

package models
import (
"encoding/json"
"slices"
"time"
rmodels "github.com/abhinavxd/libredesk/internal/role/models"
tmodels "github.com/abhinavxd/libredesk/internal/team/models"
"github.com/lib/pq"
"github.com/volatiletech/null/v9"
)
const (
UserModel = "user"
SystemUserEmail = "System"
// User types
UserTypeAgent = "agent"
UserTypeContact = "contact"
// User availability statuses
Online = "online"
Offline = "offline"
// Away due to inactivity
Away = "away"
// Away due to manual setting from sidebar
AwayManual = "away_manual"
AwayAndReassigning = "away_and_reassigning"
)
type UserCompact struct {
ID int `db:"id" json:"id"`
Type string `db:"type" json:"type"`
FirstName string `db:"first_name" json:"first_name"`
LastName string `db:"last_name" json:"last_name"`
Email null.String `db:"email" json:"email"`
Enabled bool `db:"enabled" json:"enabled"`
AvatarURL null.String `db:"avatar_url" json:"avatar_url"`
CreatedAt time.Time `db:"created_at" json:"created_at"`
UpdatedAt time.Time `db:"updated_at" json:"updated_at"`
Total int `db:"total" json:"-"`
}
type User struct {
ID int `db:"id" json:"id"`
CreatedAt time.Time `db:"created_at" json:"created_at"`
UpdatedAt time.Time `db:"updated_at" json:"updated_at"`
FirstName string `db:"first_name" json:"first_name"`
LastName string `db:"last_name" json:"last_name"`
Email null.String `db:"email" json:"email"`
Type string `db:"type" json:"type"`
AvailabilityStatus string `db:"availability_status" json:"availability_status"`
PhoneNumberCountryCode null.String `db:"phone_number_country_code" json:"phone_number_country_code"`
PhoneNumber null.String `db:"phone_number" json:"phone_number"`
AvatarURL null.String `db:"avatar_url" json:"avatar_url"`
Enabled bool `db:"enabled" json:"enabled"`
Password null.String `db:"password" json:"-"`
LastActiveAt null.Time `db:"last_active_at" json:"last_active_at"`
LastLoginAt null.Time `db:"last_login_at" json:"last_login_at"`
Roles pq.StringArray `db:"roles" json:"roles"`
Permissions pq.StringArray `db:"permissions" json:"permissions"`
CustomAttributes json.RawMessage `db:"custom_attributes" json:"custom_attributes"`
Teams tmodels.TeamsCompact `db:"teams" json:"teams"`
ContactChannelID int `db:"contact_channel_id" json:"contact_channel_id,omitempty"`
NewPassword string `db:"-" json:"new_password,omitempty"`
SendWelcomeEmail bool `db:"-" json:"send_welcome_email,omitempty"`
InboxID int `json:"-"`
SourceChannel null.String `json:"-"`
SourceChannelID null.String `json:"-"`
// API Key fields
APIKey null.String `db:"api_key" json:"api_key"`
APIKeyLastUsedAt null.Time `db:"api_key_last_used_at" json:"api_key_last_used_at"`
APISecret null.String `db:"api_secret" json:"-"`
}
type Note struct {
ID int `db:"id" json:"id"`
CreatedAt time.Time `db:"created_at" json:"created_at"`
UpdatedAt time.Time `db:"updated_at" json:"updated_at"`
ContactID int `db:"contact_id" json:"contact_id"`
Note string `db:"note" json:"note"`
UserID int `db:"user_id" json:"user_id"`
FirstName string `db:"first_name" json:"first_name"`
LastName string `db:"last_name" json:"last_name"`
AvatarURL null.String `db:"avatar_url" json:"avatar_url"`
}
func (u *User) FullName() string {
return u.FirstName + " " + u.LastName
}
func (u *User) HasAdminRole() bool {
return slices.Contains(u.Roles, rmodels.RoleAdmin)
}
func (u *User) IsSystemUser() bool {
return u.Email.String == SystemUserEmail
}