Moved away from local files to complete database driven articles
This commit is contained in:
54
database/tag.go
Normal file
54
database/tag.go
Normal file
@@ -0,0 +1,54 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user