Files
sundynix-micro-be/app/plant/rpc/internal/logic/wikiRelations.go
T
2026-05-23 13:55:05 +08:00

105 lines
3.2 KiB
Go

package logic
import (
plantModel "sundynix-micro-go/app/plant/model"
"sundynix-micro-go/app/plant/rpc/plant"
"gorm.io/gorm"
)
func wikiRelationIDs(db *gorm.DB, wikiID string) (classIDs, ossIDs, relatedWikiIDs []string) {
var classes []plantModel.WikiClassRelation
_ = db.Where("wiki_id = ?", wikiID).Find(&classes).Error
for _, item := range classes {
classIDs = append(classIDs, item.ClassID)
}
var ossList []plantModel.WikiOss
_ = db.Where("wiki_id = ?", wikiID).Find(&ossList).Error
for _, item := range ossList {
ossIDs = append(ossIDs, item.OssID)
}
var related []plantModel.WikiRelated
_ = db.Where("wiki_id = ?", wikiID).Find(&related).Error
for _, item := range related {
relatedWikiIDs = append(relatedWikiIDs, item.RelatedWikiID)
}
return
}
func wikiInfoFromModel(db *gorm.DB, item plantModel.Wiki) *plant.WikiInfo {
classIDs, ossIDs, relatedWikiIDs := wikiRelationIDs(db, item.ID)
return &plant.WikiInfo{
Id: item.ID,
Name: item.Name,
LatinName: item.LatinName,
Aliases: item.Aliases,
Genus: item.Genus,
Difficulty: int32(item.Difficulty),
IsHot: int32(item.IsHot),
GrowthHabit: item.GrowthHabit,
LightIntensity: item.LightIntensity,
OptimalTempPeriod: item.OptimalTempPeriod,
CreatedAt: item.CreatedAt.Unix(),
ClassId: item.ClassID,
DistributionArea: item.DistributionArea,
LifeCycle: item.LifeCycle,
ClassIds: classIDs,
OssIds: ossIDs,
RelatedWikiIds: relatedWikiIDs,
IsVectorSynced: item.IsVectorSynced == 1,
ReproductionMethod: item.ReproductionMethod,
PestsDiseases: item.PestsDiseases,
LightType: item.LightType,
Stem: item.Stem,
Fruit: item.Fruit,
FoliageType: item.FoliageType,
FoliageColor: item.FoliageColor,
FoliageShape: item.FoliageShape,
Height: int32(item.Height),
FloweringPeriod: item.FloweringPeriod,
FloweringColor: item.FloweringColor,
FloweringShape: item.FloweringShape,
FloweringDiameter: int32(item.FlowerDiameter),
}
}
func replaceWikiRelations(tx *gorm.DB, wikiID string, classIDs, ossIDs, relatedWikiIDs []string) error {
if err := tx.Where("wiki_id = ?", wikiID).Delete(&plantModel.WikiClassRelation{}).Error; err != nil {
return err
}
if err := tx.Where("wiki_id = ?", wikiID).Delete(&plantModel.WikiOss{}).Error; err != nil {
return err
}
if err := tx.Where("wiki_id = ?", wikiID).Delete(&plantModel.WikiRelated{}).Error; err != nil {
return err
}
for _, classID := range classIDs {
if classID == "" {
continue
}
if err := tx.Create(&plantModel.WikiClassRelation{WikiID: wikiID, ClassID: classID}).Error; err != nil {
return err
}
}
for _, ossID := range ossIDs {
if ossID == "" {
continue
}
if err := tx.Create(&plantModel.WikiOss{WikiID: wikiID, OssID: ossID}).Error; err != nil {
return err
}
}
for _, relatedID := range relatedWikiIDs {
if relatedID == "" || relatedID == wikiID {
continue
}
if err := tx.Create(&plantModel.WikiRelated{WikiID: wikiID, RelatedWikiID: relatedID}).Error; err != nil {
return err
}
}
return nil
}