55 lines
1.2 KiB
Go
55 lines
1.2 KiB
Go
package database
|
|
|
|
import (
|
|
"gorm.io/gorm/clause"
|
|
"strings"
|
|
)
|
|
|
|
type Tag struct {
|
|
ID int
|
|
Name string
|
|
}
|
|
|
|
func ArticleTagsFromTagSlice(article Article, tags []Tag) (tagsTable []ArticleTags) {
|
|
for _, tag := range tags {
|
|
tagsTable = append(tagsTable, ArticleTags{
|
|
ArticleID: article.ID,
|
|
TagID: tag.ID,
|
|
})
|
|
}
|
|
return
|
|
}
|
|
|
|
type ArticleTags struct {
|
|
ArticleID int
|
|
TagID int
|
|
}
|
|
|
|
func (db *Database) AddOrGetTags(names []string) (tags []Tag, err error) {
|
|
for i, name := range names {
|
|
names[i] = strings.ToLower(name)
|
|
}
|
|
|
|
err = db.gormDB.Table("tag").Clauses(clause.OnConflict{
|
|
Columns: []clause.Column{{Name: "name"}},
|
|
DoNothing: true,
|
|
}).Select("name").Create(&names).Error
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
err = db.gormDB.Table("tag").Find(&tags).Where("name in (?)", &names).Error
|
|
return
|
|
}
|
|
|
|
func (db *Database) SetTags(article Article, tags []Tag) error {
|
|
return db.gormDB.Table("tags").Clauses(clause.OnConflict{
|
|
Columns: []clause.Column{{Name: "article_id"}, {Name: "tag_id"}},
|
|
DoNothing: true,
|
|
}).Create(ArticleTagsFromTagSlice(article, tags)).Error
|
|
}
|
|
|
|
func (db *Database) RemoveTags(article Article, tags []Tag) error {
|
|
return db.gormDB.Table("tags").Delete(ArticleTagsFromTagSlice(article, tags)).Error
|
|
}
|