110 lines
2.8 KiB
Go
110 lines
2.8 KiB
Go
package curd
|
||
|
||
import (
|
||
"catface/app/model"
|
||
"catface/app/model_es"
|
||
"catface/app/utils/query_handler"
|
||
"strconv"
|
||
)
|
||
|
||
func CreateEncounterCurdFactory() *EncounterCurd {
|
||
return &EncounterCurd{model.CreateEncounterFactory("")}
|
||
}
|
||
|
||
type EncounterCurd struct {
|
||
encounter *model.Encounter
|
||
}
|
||
|
||
func (e *EncounterCurd) List(num, skip, user_id int, mode string) (result []model.EncounterList) {
|
||
if num == 0 {
|
||
num = 10
|
||
}
|
||
|
||
var likedAnimalIds []int
|
||
switch mode {
|
||
case "liked":
|
||
likedAnimalIds = model.CreateAnimalLikeFactory("").LikedCats(user_id)
|
||
}
|
||
result = model.CreateEncounterFactory("").Show(num, skip, user_id, likedAnimalIds)
|
||
return
|
||
}
|
||
|
||
func (e *EncounterCurd) Detail(id string) *model.EncounterDetail {
|
||
// 0. check id
|
||
idInt, err := strconv.Atoi(id)
|
||
if err != nil {
|
||
return nil
|
||
}
|
||
|
||
// 1. encounter data
|
||
encounter, err := model.CreateEncounterFactory("").ShowByID(int64(idInt))
|
||
if err != nil {
|
||
return nil
|
||
}
|
||
|
||
// 1.1 处理 Photos 为 []string,同时忽略原本的 Photos 字段。
|
||
encounter.PhotosList = query_handler.StringToStringArray(encounter.Photos)
|
||
encounter.Photos = "" // 清空。
|
||
|
||
// 2. user data
|
||
user, err := model.CreateUserFactory("").ShowByID(encounter.UsersModelId, "user_avatar", "user_name", "id")
|
||
if err != nil {
|
||
return nil
|
||
}
|
||
|
||
// 3. animals data
|
||
var animals []model.Animal
|
||
if animals_id, ok := model.CreateEncounterAnimalLinkFactory("").ShowByEncounterId(encounter.Id); ok {
|
||
animals = model.CreateAnimalFactory("").ShowByIDs(animals_id, "avatar", "name", "id")
|
||
}
|
||
|
||
// 4. 合并
|
||
return &model.EncounterDetail{
|
||
Encounter: *encounter,
|
||
UsersModel: *user,
|
||
Animals: animals,
|
||
}
|
||
}
|
||
|
||
func (e *EncounterCurd) MatchAll(query string, num int) (tmp []model.Encounter) {
|
||
// 1. encounter ES
|
||
encountersFromES, err := model_es.CreateEncounterESFactory(nil).QueryDocumentsMatchAll(query, num)
|
||
if err != nil || len(encountersFromES) == 0 {
|
||
return nil
|
||
}
|
||
|
||
var ids []int64
|
||
for _, encounter := range encountersFromES {
|
||
ids = append(ids, encounter.Id)
|
||
}
|
||
|
||
// 2. encounter SQL
|
||
encountersFromSQL := model.CreateEncounterFactory("").ShowByIDs(ids, "id", "avatar", "user_id")
|
||
|
||
// 3. users
|
||
ids = nil
|
||
for _, encounter := range encountersFromSQL {
|
||
ids = append(ids, encounter.UsersModelId)
|
||
}
|
||
users := model.CreateUserFactory("").ShowByIDs(ids, "user_avatar", "user_name", "id")
|
||
|
||
// end. Merge
|
||
for _, enencountersFromES := range encountersFromES {
|
||
for _, encounter := range encountersFromSQL {
|
||
for _, user := range users {
|
||
if encounter.Id == enencountersFromES.Id && encounter.UsersModelId == user.Id {
|
||
encounter.TagsList = enencountersFromES.Tags
|
||
encounter.TagsHighlight = enencountersFromES.TagsHighlight
|
||
encounter.Title = enencountersFromES.Title
|
||
encounter.Content = enencountersFromES.Content
|
||
|
||
encounter.UsersModel = &user
|
||
tmp = append(tmp, encounter)
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return
|
||
}
|