package models import ( "time" "gorm.io/gorm" ) type User struct { ID uint `json:"id" gorm:"primaryKey"` GiteaUserID *uint `json:"gitea_user_id" gorm:"uniqueIndex"` Username string `json:"username" gorm:"unique;not null"` Email string `json:"email" gorm:"not null"` FullName string `json:"full_name"` AvatarURL string `json:"avatar_url"` Role string `json:"role" gorm:"default:'developer'"` CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` } type UserRole string const ( RoleAdmin UserRole = "admin" RoleManager UserRole = "manager" RoleDeveloper UserRole = "developer" RoleTester UserRole = "tester" RoleViewer UserRole = "viewer" ) func (u *User) BeforeCreate(tx *gorm.DB) error { return nil } func (u *User) GetOwnedProjects() ([]Project, error) { var projects []Project err := DB.Where("owner_id = ?", u.ID).Find(&projects).Error return projects, err } func (u *User) GetJoinedProjects() ([]Project, error) { var projects []Project err := DB.Joins("JOIN project_members ON projects.id = project_members.project_id"). Where("project_members.user_id = ?", u.ID). Find(&projects).Error return projects, err } func (u *User) GetAssignedTasks() ([]Task, error) { var tasks []Task err := DB.Where("assignee_id = ?", u.ID).Find(&tasks).Error return tasks, err } func CreateUser(user *User) error { return DB.Create(user).Error } func GetUserByID(id uint) (*User, error) { var user User err := DB.First(&user, id).Error return &user, err } func GetUserByUsername(username string) (*User, error) { var user User err := DB.Where("username = ?", username).First(&user).Error return &user, err } func GetUserByGiteaID(giteaUserID uint) (*User, error) { var user User err := DB.Where("gitea_user_id = ?", giteaUserID).First(&user).Error return &user, err } func UpdateUser(user *User) error { return DB.Save(user).Error } func DeleteUser(id uint) error { return DB.Delete(&User{}, id).Error } func ListUsers(offset, limit int) ([]User, int64, error) { var users []User var total int64 err := DB.Model(&User{}).Count(&total).Error if err != nil { return nil, 0, err } err = DB.Offset(offset).Limit(limit).Find(&users).Error return users, total, err }