Files
backend/database/tag.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
}