|
|
|
// Copyright 2023 ROC. All rights reserved.
|
|
|
|
// Use of this source code is governed by a MIT style
|
|
|
|
// license that can be found in the LICENSE file.
|
|
|
|
|
|
|
|
package sakila
|
|
|
|
|
|
|
|
import (
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/bitbus/sqlx"
|
|
|
|
"github.com/rocboss/paopao-ce/internal/core/cs"
|
|
|
|
)
|
|
|
|
|
|
|
|
func (s *sqlxSrv) deleteTags(tx *sqlx.Tx, tags []string) (err error) {
|
|
|
|
var tagInfos []cs.TagInfo
|
|
|
|
if err = tx.Stmtx(s.y.TagsFromNames).Select(&tagInfos, tags); err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
now := time.Now().Unix()
|
|
|
|
for _, tag := range tagInfos {
|
|
|
|
tag.QuoteNum--
|
|
|
|
if _, err = tx.Stmtx(s.y.UpdateTagQuote).Exec(tag.QuoteNum, now, tag.ID); err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *sqlxSrv) createTags(tx *sqlx.Tx, userId int64, tags []string) (res cs.TagInfoList, xerr error) {
|
|
|
|
if len(tags) == 0 {
|
|
|
|
return nil, nil
|
|
|
|
}
|
|
|
|
xerr = s.db.Withx(func(tx *sqlx.Tx) error {
|
|
|
|
var upTags cs.TagInfoList
|
|
|
|
err := tx.InSelect(&upTags, s.y.TagsForIncr, tags)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
now := time.Now().Unix()
|
|
|
|
if len(upTags) > 0 {
|
|
|
|
var ids []int64
|
|
|
|
for _, t := range upTags {
|
|
|
|
ids = append(ids, t.ID)
|
|
|
|
t.QuoteNum++
|
|
|
|
// prepare remain tags just delete updated tag
|
|
|
|
// notice ensure tags slice is distinct elements
|
|
|
|
for i, name := range tags {
|
|
|
|
if name == t.Tag {
|
|
|
|
lastIdx := len(tags) - 1
|
|
|
|
tags[i] = tags[lastIdx]
|
|
|
|
tags = tags[:lastIdx]
|
|
|
|
break
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if _, err := tx.InExec(s.y.IncrTagsById, now, ids); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
res = append(res, upTags...)
|
|
|
|
}
|
|
|
|
// process remain tags if tags is not empty
|
|
|
|
if len(tags) == 0 {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
var (
|
|
|
|
id int64
|
|
|
|
ids []int64
|
|
|
|
)
|
|
|
|
for _, tag := range tags {
|
|
|
|
if err = s.insertTag.Get(&id, userId, tag, now, now); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
ids = append(ids, id)
|
|
|
|
}
|
|
|
|
var newTags cs.TagInfoList
|
|
|
|
if err := tx.InSelect(&newTags, s.y.TagsByIdB, ids); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
res = append(res, newTags...)
|
|
|
|
return nil
|
|
|
|
})
|
|
|
|
return
|
|
|
|
}
|