bilibili-backup/app/service/openplatform/ticket-item/dao/guest.go
2019-04-22 02:59:20 +00:00

145 lines
3.9 KiB
Go

package dao
import (
"context"
"fmt"
"strconv"
"go-common/app/common/openplatform/random"
item "go-common/app/service/openplatform/ticket-item/api/grpc/v1"
"go-common/app/service/openplatform/ticket-item/model"
"go-common/library/database/elastic"
"go-common/library/ecode"
"go-common/library/log"
)
// AddGuest 添加新嘉宾
func (d *Dao) AddGuest(c context.Context, info *item.GuestInfoRequest) (ret bool, err error) {
// 此处guest_id调用订单号生成器
guestID := random.Uniqid(19)
// 插入新数据
if dbErr := d.db.Create(&model.Guest{
Name: info.Name,
GuestImg: info.GuestImg,
Description: info.Description,
GuestID: guestID,
}).Error; dbErr != nil {
log.Error("insertion failed")
return false, ecode.NothingFound
}
return true, nil
}
// UpdateGuest 编辑嘉宾信息
func (d *Dao) UpdateGuest(c context.Context, info *item.GuestInfoRequest) (res bool, err error) {
// find original guest with id
var oriGuest model.Guest
if dbErr := d.db.First(&oriGuest, info.ID).Error; dbErr != nil {
log.Error("guest(%d) not found", info.ID)
return false, ecode.NothingFound
}
// update guest with new info (using map can update the column with empty string)
updateErr := d.db.Model(&oriGuest).Updates(
map[string]interface{}{
"name": info.Name,
"guest_img": info.GuestImg,
"description": info.Description,
}).Error
if updateErr != nil {
log.Error("UPDATE FAILED")
return false, ecode.NotModified
}
return true, nil
}
// GuestStatus 更新嘉宾状态
func (d *Dao) GuestStatus(c context.Context, id int64, status int8) (res bool, err error) {
// find original guest with id
var oriGuest model.Guest
if dbErr := d.db.First(&oriGuest, id).Error; dbErr != nil {
log.Error("guest (%d) not found", id)
return false, ecode.NothingFound
}
// update guest with new info (using map can update the column with empty string)
updateErr := d.db.Model(&oriGuest).Update("status", status).Error
if updateErr != nil {
log.Error("CHANGE STATUS FAILED")
return false, ecode.NotModified
}
return true, nil
}
// GetGuests 获取项目下所有嘉宾
func (d *Dao) GetGuests(c context.Context, pid int64) (res []*model.Guest, err error) {
// 获取项目下所有guestID
var projectGuests []*model.ProjectGuest
if dbErr := d.db.Select("guest_id").Order("position").Where("project_id = ? and delete_status = 0", pid).Find(&projectGuests).Error; dbErr != nil {
log.Error("获取项目嘉宾id失败: %s", dbErr)
err = ecode.NothingFound
return
}
var guestIDs []int64
for idx := range projectGuests {
guestIDs = append(guestIDs, projectGuests[idx].GuestID)
}
// 获取未禁用嘉宾信息 并用id当键值组成map
var guestInfo []*model.Guest
if dbErr := d.db.Where("status = 1 and id in (?)", guestIDs).Find(&guestInfo).Error; dbErr != nil {
log.Error("获取项目嘉宾信息失败: %s", dbErr)
err = ecode.NothingFound
return
}
guestInfoMap := make(map[int64]*model.Guest)
for _, value := range guestInfo {
guestInfoMap[value.ID] = value
}
// 根据guestIDs重新排序嘉宾信息
for _, value := range guestIDs {
if guestInfoMap[value].Status == 1 {
res = append(res, guestInfoMap[value])
}
}
return
}
// GuestSearch guest es search.
func (d *Dao) GuestSearch(c context.Context, arg *model.GuestSearchParam) (guests *model.GuestSearchList, err error) {
r := d.es.NewRequest("ticket_guest").
Index("ticket_guest").
Order("ctime", elastic.OrderDesc).
Order("id", elastic.OrderAsc).
Ps(arg.Ps).Pn(arg.Pn)
if arg.Keyword != "" {
if id, err1 := strconv.Atoi(arg.Keyword); err1 == nil {
r = r.WhereEq("id", id)
} else {
r = r.WhereLike([]string{"name"}, []string{arg.Keyword}, true, elastic.LikeLevelLow)
}
}
log.Info(fmt.Sprintf("%s/x/admin/search/query?%s", d.c.URL.ElasticHost, r.Params()))
guests = new(model.GuestSearchList)
err = r.Scan(c, guests)
if err != nil {
log.Error("GuestSearch() Scan() error(%v)", err)
}
return
}