2023-03-14 15:22:52 +00:00
|
|
|
package models
|
|
|
|
|
2023-03-14 23:52:24 +00:00
|
|
|
import (
|
|
|
|
"gorm.io/gorm"
|
|
|
|
"strconv"
|
|
|
|
)
|
2023-03-14 16:05:21 +00:00
|
|
|
|
2023-03-14 15:22:52 +00:00
|
|
|
type User struct {
|
|
|
|
ID uint `gorm:"primaryKey"`
|
|
|
|
Username string `form:"username" gorm:"uniqueIndex" validate:"required,max=24,alphanum,notreserved"`
|
|
|
|
Password string `form:"password" validate:"required"`
|
|
|
|
IsAdmin bool
|
|
|
|
CreatedAt int64
|
|
|
|
|
|
|
|
Gists []Gist `gorm:"constraint:OnUpdate:CASCADE,OnDelete:CASCADE;foreignKey:UserID"`
|
|
|
|
SSHKeys []SSHKey `gorm:"foreignKey:UserID"`
|
|
|
|
Liked []Gist `gorm:"many2many:likes;constraint:OnUpdate:CASCADE,OnDelete:CASCADE"`
|
|
|
|
}
|
|
|
|
|
2023-03-14 23:52:24 +00:00
|
|
|
func (u *User) BeforeDelete(tx *gorm.DB) error {
|
|
|
|
// Decrement likes counter for all gists liked by this user
|
|
|
|
// The likes will be automatically deleted by the foreign key constraint
|
|
|
|
err := tx.Model(&Gist{}).
|
|
|
|
Omit("updated_at").
|
|
|
|
Where("id IN (?)", tx.
|
|
|
|
Select("gist_id").
|
|
|
|
Table("likes").
|
|
|
|
Where("user_id = ?", u.ID),
|
|
|
|
).
|
|
|
|
UpdateColumn("nb_likes", gorm.Expr("nb_likes - 1")).
|
|
|
|
Error
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
// Decrement forks counter for all gists forked by this user
|
|
|
|
return tx.Model(&Gist{}).
|
|
|
|
Omit("updated_at").
|
|
|
|
Where("id IN (?)", tx.
|
|
|
|
Select("forked_id").
|
|
|
|
Table("gists").
|
|
|
|
Where("user_id = ?", u.ID),
|
|
|
|
).
|
|
|
|
UpdateColumn("nb_forks", gorm.Expr("nb_forks - 1")).
|
|
|
|
Error
|
|
|
|
}
|
|
|
|
|
2023-03-14 15:22:52 +00:00
|
|
|
func DoesUserExists(userName string, count *int64) error {
|
|
|
|
return db.Table("users").
|
|
|
|
Where("username like ?", userName).
|
|
|
|
Count(count).Error
|
|
|
|
}
|
|
|
|
|
|
|
|
func GetAllUsers(offset int) ([]*User, error) {
|
|
|
|
var all []*User
|
|
|
|
err := db.
|
|
|
|
Limit(11).
|
|
|
|
Offset(offset * 10).
|
|
|
|
Order("id asc").
|
|
|
|
Find(&all).Error
|
|
|
|
|
|
|
|
return all, err
|
|
|
|
}
|
|
|
|
|
|
|
|
func GetLoginUser(user *User) error {
|
|
|
|
return db.
|
|
|
|
Where("username like ?", user.Username).
|
|
|
|
First(&user).Error
|
|
|
|
}
|
|
|
|
|
|
|
|
func GetLoginUserById(user *User) error {
|
|
|
|
return db.
|
|
|
|
Where("id = ?", user.ID).
|
|
|
|
First(&user).Error
|
|
|
|
}
|
|
|
|
|
|
|
|
func CreateUser(user *User) error {
|
|
|
|
return db.Create(&user).Error
|
|
|
|
}
|
|
|
|
|
2023-03-14 23:52:24 +00:00
|
|
|
func DeleteUser(userid string) error {
|
|
|
|
// trigger hook with a user ID
|
|
|
|
intId, err := strconv.ParseUint(userid, 10, 64)
|
2023-03-14 16:05:21 +00:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2023-03-14 23:52:24 +00:00
|
|
|
var user = &User{ID: uint(intId)}
|
|
|
|
return db.Where("id = ?", userid).Delete(&user).Error
|
2023-03-14 15:22:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func SetAdminUser(user *User) error {
|
|
|
|
return db.Model(&user).Update("is_admin", true).Error
|
|
|
|
}
|
|
|
|
|
|
|
|
func GetUserBySSHKeyID(sshKeyId uint) (*User, error) {
|
|
|
|
user := new(User)
|
|
|
|
err := db.
|
|
|
|
Preload("SSHKeys").
|
|
|
|
Joins("join ssh_keys on users.id = ssh_keys.user_id").
|
|
|
|
Where("ssh_keys.id = ?", sshKeyId).
|
|
|
|
First(&user).Error
|
|
|
|
|
|
|
|
return user, err
|
|
|
|
}
|
|
|
|
|
|
|
|
func UserHasLikedGist(user *User, gist *Gist) (bool, error) {
|
|
|
|
association := db.Model(&gist).Where("user_id = ?", user.ID).Association("Likes")
|
|
|
|
if association.Error != nil {
|
|
|
|
return false, association.Error
|
|
|
|
}
|
|
|
|
|
|
|
|
if association.Count() == 0 {
|
|
|
|
return false, nil
|
|
|
|
}
|
|
|
|
return true, nil
|
|
|
|
}
|