89 lines
1.9 KiB
Go
89 lines
1.9 KiB
Go
package store
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"github.com/oklog/ulid/v2"
|
|
"github.com/rs/zerolog/log"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type SiteTag struct {
|
|
ID ulid.ULID `gorm:"primaryKey"`
|
|
SiteID ulid.ULID `gorm:"not null"`
|
|
Value string `gorm:"not null"`
|
|
db *gorm.DB `gorm:"-"`
|
|
}
|
|
|
|
func (SiteTag) TableName() string {
|
|
return "site_tags"
|
|
}
|
|
|
|
func (s *Site) AddTag(value string) error {
|
|
value = strings.ToLower(value)
|
|
if s.HasTag(value) {
|
|
log.Debug().Str("tag", value).Msg("tag already exists")
|
|
return nil
|
|
}
|
|
|
|
tag := &SiteTag{
|
|
SiteID: s.ID,
|
|
Value: value,
|
|
db: s.db,
|
|
}
|
|
|
|
result := s.db.Create(tag)
|
|
if result.Error != nil {
|
|
log.Error().Err(result.Error).Msg("unable to add site tag")
|
|
return result.Error
|
|
}
|
|
|
|
log.Debug().
|
|
Str("siteid", s.ID.String()).
|
|
Str("tag", value).
|
|
Msg("site tag added")
|
|
return nil
|
|
}
|
|
|
|
func (s *Site) DeleteAttribute(value string) error {
|
|
value = strings.ToLower(value)
|
|
result := s.db.Where("user_id = ? AND value = ?", s.ID, value).Delete(&SiteTag{})
|
|
if result.Error != nil {
|
|
log.Error().Err(result.Error).Msg("unable to delete site tag")
|
|
return result.Error
|
|
}
|
|
|
|
log.Debug().
|
|
Str("siteid", s.ID.String()).
|
|
Str("tag", value).
|
|
Msg("site tag deleted")
|
|
return nil
|
|
}
|
|
|
|
func (s *Site) HasTag(value string) bool {
|
|
value = strings.ToLower(value)
|
|
var count int64
|
|
result := s.db.Model(&SiteTag{}).Where("site_id = ? AND value = ?", s.ID, value).Count(&count)
|
|
if result.Error != nil {
|
|
log.Error().Err(result.Error).Msg("unable to check site tag existence")
|
|
return false
|
|
}
|
|
return count > 0
|
|
}
|
|
|
|
func (s *Site) GetTags() ([]string, error) {
|
|
var tags []SiteTag
|
|
result := s.db.Where("site_id = ?", s.ID).Find(&tags)
|
|
if result.Error != nil {
|
|
log.Error().Err(result.Error).Msg("unable to get site tags")
|
|
return nil, result.Error
|
|
}
|
|
|
|
var tagValues []string
|
|
for _, attr := range tags {
|
|
tagValues = append(tagValues, attr.Value)
|
|
}
|
|
|
|
return tagValues, nil
|
|
}
|