You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

125 lines
4.0 KiB

package user
import (
"database/sql"
"net/http"
"strings"
"time"
"github.com/imdotdev/im.dev/server/internal/cache"
"github.com/imdotdev/im.dev/server/internal/tags"
"github.com/imdotdev/im.dev/server/pkg/db"
"github.com/imdotdev/im.dev/server/pkg/e"
"github.com/imdotdev/im.dev/server/pkg/models"
)
func GetUsers(q string) ([]*models.User, *e.Error) {
allUsers := cache.Users
users := make([]*models.User, 0)
for _, u := range allUsers {
if strings.HasPrefix(strings.ToLower(u.Nickname), strings.ToLower(q)) {
users = append(users, u)
continue
}
if strings.HasPrefix(strings.ToLower(u.Username), strings.ToLower(q)) {
users = append(users, u)
continue
}
}
return users, nil
}
func GetUserDetail(id int64, username string) (*models.User, *e.Error) {
user := &models.User{}
err := user.Query(id, username, "")
if err != nil {
logger.Warn("query user error", "error", err)
return nil, e.New(http.StatusInternalServerError, e.Internal)
}
err = db.Conn.QueryRow("SELECT tagline,cover,location,avail_for,about,website,twitter,github,zhihu,weibo,facebook,stackoverflow from user_profile WHERE id=?", user.ID).Scan(
&user.Tagline, &user.Cover, &user.Location, &user.AvailFor, &user.About, &user.Website, &user.Twitter,
&user.Github, &user.Zhihu, &user.Weibo, &user.Facebook, &user.Stackoverflow,
)
if err != nil && err != sql.ErrNoRows {
logger.Warn("query user profile error", "error", err)
return nil, e.New(http.StatusInternalServerError, e.Internal)
}
if user.Cover == "" {
user.Cover = models.DefaultCover
}
// get user skills
user.Skills = make([]int64, 0)
user.RawSkills = make([]*models.Tag, 0)
rows, err := db.Conn.Query("SELECT skill_id from user_skills WHERE user_id=?", user.ID)
if err != nil && err != sql.ErrNoRows {
logger.Warn("query user skills error", "error", err)
}
for rows.Next() {
var skill int64
rows.Scan(&skill)
user.Skills = append(user.Skills, skill)
rawTag, err := tags.GetTag(skill, "")
if err != nil {
logger.Warn("get tag error", "error", err)
continue
}
user.RawSkills = append(user.RawSkills, rawTag)
}
return user, nil
}
func UpdateUser(u *models.User) *e.Error {
_, err := db.Conn.Exec("UPDATE user SET nickname=?,avatar=?,email=?,updated=? WHERE id=?", u.Nickname, u.Avatar, u.Email, time.Now(), u.ID)
if err != nil {
if e.IsErrUniqueConstraint(err) {
return e.New(http.StatusConflict, "email已经存在")
}
logger.Warn("update user error", "error", err)
return e.New(http.StatusInternalServerError, e.Internal)
}
var nid int64
err = db.Conn.QueryRow("SELECT id FROM user_profile WHERE id=?", u.ID).Scan(&nid)
if err != nil && err != sql.ErrNoRows {
logger.Warn("update user profile error", "error", err)
return e.New(http.StatusInternalServerError, e.Internal)
}
now := time.Now()
if err == sql.ErrNoRows {
_, err = db.Conn.Exec("INSERT INTO user_profile (id,tagline,cover,location,avail_for,about,website,twitter,github,zhihu,weibo,facebook,stackoverflow,updated) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)",
u.ID, u.Tagline, u.Cover, u.Location, u.AvailFor, u.About, u.Website, u.Twitter, u.Github, u.Zhihu, u.Weibo, u.Facebook, u.Stackoverflow, now)
} else {
_, err = db.Conn.Exec("UPDATE user_profile SET tagline=?,cover=?,location=?,avail_for=?,about=?,website=?,twitter=?,github=?,zhihu=?,weibo=?,facebook=?,stackoverflow=?,updated=? WHERE id=?",
u.Tagline, u.Cover, u.Location, u.AvailFor, u.About, u.Website, u.Twitter, u.Github, u.Zhihu, u.Weibo, u.Facebook, u.Stackoverflow, now, u.ID)
}
if err != nil {
logger.Warn("update user profile error", "error", err)
return e.New(http.StatusInternalServerError, e.Internal)
}
//update user skills
_, err = db.Conn.Exec("DELETE FROM user_skills WHERE user_id=?", u.ID)
if err != nil {
logger.Warn("delete user skills error", "error", err)
}
for _, skill := range u.Skills {
_, err = db.Conn.Exec("INSERT INTO user_skills (user_id,skill_id) VALUES (?,?)", u.ID, skill)
if err != nil {
logger.Warn("add user skill error", "error", err)
}
}
return nil
}