directory/internal/store/site_tag.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
}