package sites import ( "context" "errors" "lmika.dev/lmika/hugo-cms/config" "lmika.dev/lmika/hugo-cms/models" "lmika.dev/lmika/hugo-cms/providers/db" "lmika.dev/lmika/hugo-cms/providers/themes" "lmika.dev/lmika/hugo-cms/services/jobs" "lmika.dev/lmika/hugo-cms/services/sitebuilder" "strings" "unicode" ) type Service struct { cfg config.Config db *db.DB themes *themes.Provider sb *sitebuilder.Service jobs *jobs.Service } func NewService( cfg config.Config, db *db.DB, themes *themes.Provider, sb *sitebuilder.Service, jobs *jobs.Service, ) *Service { return &Service{ cfg: cfg, db: db, themes: themes, sb: sb, jobs: jobs, } } func (s *Service) GetSite(ctx context.Context, id int) (models.Site, error) { return s.db.GetSite(ctx, int64(id)) } func (s *Service) CreateSite(ctx context.Context, name string) (models.Site, error) { newSite := models.Site{ Name: normaliseName(name), Title: name, Theme: "bear", } _, ok := s.themes.Lookup(newSite.Theme) if !ok { return models.Site{}, errors.New("theme not found") } if err := s.db.InsertSite(ctx, &newSite); err != nil { return models.Site{}, err } // 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 } return newSite, s.jobs.Queue(ctx, s.sb.CreateNewSite(newSite)) } 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)) } 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() }