package containers import ( "joybuywork/internal/repository/dbcheck" "joybuywork/internal/repository/model" "joybuywork/internal/repository/mtype" "joybuywork/internal/repository/withdefault" "joybuywork/internal/utils/logic" pb "joybuywork/proto/go_proto/w_fission" "joybuywork/proto/go_proto/workerr" "fmt" "strings" ) type FissionCreateTempGroup struct { logic.Logic Req *pb.CreateTempGroupReq Res *pb.CreateTempGroupRes } func (s *FissionCreateTempGroup) Run() error { return logic.Run(s) } func (s *FissionCreateTempGroup) Exec() (err error) { err = s.check() if err != nil { return } group, err := s.create() if err != nil { return } err = s.createGroupLang(group) if err != nil { return } err = s.createTemp(group) if err != nil { return } return } func (s *FissionCreateTempGroup) check() (err error) { m := s.GetDao().FissionTempGroup exist, err := m.WithContext(s.Ctx).Where(m.Mark.Eq(s.Req.GetMark())).Take() if err = dbcheck.DbError(err); err != nil { return s.BE().MysqlError(err) } if exist != nil { return workerr.BadRequest("mark exist") } if s.Req.GetLangParts() != "" { moduleM := s.GetDao().FissionLangModule marks := strings.Split(s.Req.GetLangParts(), ",") var list []*model.FissionLangModule list, err = moduleM.WithContext(s.Ctx).Where(moduleM.Mark.In(marks...)).Find() if err != nil { err = s.BE().MysqlError(err) return } var markKey = make(map[string]string) for _, v := range list { for _, kv := range v.GetParts() { markKey[kv.Key] = v.Mark } } for _, v := range s.Req.GetLang() { if module, ok := markKey[v.Key]; ok { err = s.BE().VerifyError(fmt.Sprintf("%s模块下已存在%s,请重新设置", module, v.Key)) return } } } return } func (s *FissionCreateTempGroup) create() (group *model.FissionTempGroup, err error) { group = withdefault.FissionTempGroup(&model.FissionTempGroup{ FissionID: s.Req.GetFissionId(), CoverURL: s.Req.GetCoverUrl(), Mark: s.Req.GetMark(), Sort: s.Req.GetSort(), LangParts: s.Req.GetLangParts(), ConvertCoverURL: s.Req.GetConvertCoverUrl(), }) m := s.GetDao().FissionTempGroup err = m.WithContext(s.Ctx).Create(group) if err != nil { err = s.BE().MysqlError(err) return } s.AddAfterRun(func() (err error) { s.Res.Id = group.ID return }) return } func (s *FissionCreateTempGroup) createGroupLang(group *model.FissionTempGroup) (err error) { var lts []string for _, v := range s.Req.GetLang() { lts = append(lts, v.Value) } ltmM := s.GetDao().LangTextMark list, err := ltmM.WithContext(s.Ctx).Where(ltmM.Text.In(lts...)).Find() if err != nil { err = s.BE().MysqlError(err) return } var vm = make(map[string]string) for _, v := range list { vm[v.Text] = v.Mark } for _, text := range lts { if _, ok := vm[text]; !ok { err = s.BE().VerifyError(fmt.Sprintf("[%s]未翻译", text)) return } } m := s.GetDao().FissionTempGroupLang var add []*model.FissionTempGroupLang for _, v := range s.Req.GetLang() { add = append(add, withdefault.FissionTempGroupLang(&model.FissionTempGroupLang{ GroupID: group.ID, Mark: v.Key, LangMark: vm[v.Value], Desc: v.Desc, })) } if len(add) == 0 { return } if err = m.WithContext(s.Ctx).Create(add...); err != nil { err = s.BE().MysqlError(err) return } return } func (s *FissionCreateTempGroup) createTemp(group *model.FissionTempGroup) (err error) { if len(s.Req.LangType) == 0 { return } m := s.GetDao().FissionTemp var add []*model.FissionTemp for _, v := range s.Req.GetLangType() { add = append(add, withdefault.FissionTemp(&model.FissionTemp{ FissionID: group.FissionID, GroupID: group.ID, LangType: int8(v), TextType: mtype.FissionLangTypeTextType[int8(v)], })) } if len(add) == 0 { return } if err = m.WithContext(s.Ctx).Create(add...); err != nil { err = s.BE().MysqlError(err) return } return }