2025-01-26 22:26:15 +00:00
|
|
|
package sites
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"errors"
|
|
|
|
"lmika.dev/lmika/hugo-crm/config"
|
|
|
|
"lmika.dev/lmika/hugo-crm/models"
|
|
|
|
"lmika.dev/lmika/hugo-crm/providers/db"
|
|
|
|
"lmika.dev/lmika/hugo-crm/providers/themes"
|
2025-01-26 23:19:31 +00:00
|
|
|
"lmika.dev/lmika/hugo-crm/services/jobs"
|
|
|
|
"lmika.dev/lmika/hugo-crm/services/sitebuilder"
|
2025-01-26 22:26:15 +00:00
|
|
|
"strings"
|
|
|
|
"unicode"
|
|
|
|
)
|
|
|
|
|
|
|
|
type Service struct {
|
|
|
|
cfg config.Config
|
|
|
|
db *db.DB
|
|
|
|
themes *themes.Provider
|
2025-01-26 23:19:31 +00:00
|
|
|
sb *sitebuilder.Service
|
|
|
|
jobs *jobs.Service
|
2025-01-26 22:26:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func NewService(
|
|
|
|
cfg config.Config,
|
|
|
|
db *db.DB,
|
|
|
|
themes *themes.Provider,
|
2025-01-26 23:19:31 +00:00
|
|
|
sb *sitebuilder.Service,
|
|
|
|
jobs *jobs.Service,
|
2025-01-26 22:26:15 +00:00
|
|
|
) *Service {
|
|
|
|
return &Service{
|
2025-01-26 23:19:31 +00:00
|
|
|
cfg: cfg,
|
|
|
|
db: db,
|
|
|
|
themes: themes,
|
|
|
|
sb: sb,
|
|
|
|
jobs: jobs,
|
2025-01-26 22:26:15 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2025-01-26 23:19:31 +00:00
|
|
|
func (s *Service) GetSite(ctx context.Context, id int) (models.Site, error) {
|
|
|
|
return s.db.GetSite(ctx, int64(id))
|
|
|
|
}
|
|
|
|
|
2025-01-26 22:26:15 +00:00
|
|
|
func (s *Service) CreateSite(ctx context.Context, name string) (models.Site, error) {
|
|
|
|
newSite := models.Site{
|
|
|
|
Name: normaliseName(name),
|
|
|
|
Title: name,
|
|
|
|
Theme: "bear",
|
|
|
|
}
|
|
|
|
|
2025-01-26 23:19:31 +00:00
|
|
|
_, ok := s.themes.Lookup(newSite.Theme)
|
2025-01-26 22:26:15 +00:00
|
|
|
if !ok {
|
|
|
|
return models.Site{}, errors.New("theme not found")
|
|
|
|
}
|
|
|
|
|
|
|
|
if err := s.db.InsertSite(ctx, &newSite); err != nil {
|
|
|
|
return models.Site{}, err
|
|
|
|
}
|
|
|
|
|
2025-01-27 04:45:53 +00:00
|
|
|
// TEMP
|
|
|
|
if err := s.db.InsertPublishTarget(ctx, &models.PublishTarget{
|
|
|
|
SiteID: newSite.ID,
|
|
|
|
Role: models.TargetRoleProduction,
|
|
|
|
Type: models.TargetTypeNetlify,
|
|
|
|
URL: "https://meek-meringue-060cfc.netlify.app",
|
|
|
|
TargetRef: "e628dc6e-e6e1-45a9-847a-982adef940a8",
|
|
|
|
}); err != nil {
|
|
|
|
return models.Site{}, err
|
|
|
|
}
|
|
|
|
|
2025-01-26 23:19:31 +00:00
|
|
|
return newSite, s.jobs.Queue(ctx, s.sb.CreateNewSite(newSite))
|
2025-01-26 22:26:15 +00:00
|
|
|
}
|
|
|
|
|
2025-01-27 04:45:53 +00:00
|
|
|
func (s *Service) Rebuild(ctx context.Context, site models.Site) error {
|
|
|
|
if site.ID == 0 {
|
|
|
|
return errors.New("site id required")
|
|
|
|
}
|
|
|
|
|
|
|
|
return s.jobs.Queue(ctx, s.sb.RebuildSite(site))
|
|
|
|
}
|
|
|
|
|
2025-01-26 22:26:15 +00:00
|
|
|
func normaliseName(name string) string {
|
|
|
|
var sb strings.Builder
|
|
|
|
|
|
|
|
seenDash := false
|
|
|
|
for _, r := range strings.TrimSpace(name) {
|
|
|
|
if unicode.IsLetter(r) || unicode.IsNumber(r) {
|
|
|
|
sb.WriteRune(unicode.ToLower(r))
|
|
|
|
seenDash = false
|
|
|
|
} else if r == '_' || r == '-' || r == '.' || unicode.IsSpace(r) {
|
|
|
|
if !seenDash {
|
|
|
|
sb.WriteRune('-')
|
|
|
|
}
|
|
|
|
seenDash = true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return sb.String()
|
|
|
|
}
|