Added a site picker plus options to create new sites

This commit is contained in:
Leon Mika 2026-03-24 11:08:51 +11:00
parent cc0da8d668
commit d80aacc180
14 changed files with 203 additions and 29 deletions

View file

@ -9,6 +9,7 @@ import (
"github.com/gofiber/fiber/v3"
"lmika.dev/lmika/weiro/models"
"lmika.dev/lmika/weiro/providers/db"
"lmika.dev/pkg/modash/moslice"
)
type Service struct {
@ -25,6 +26,22 @@ func (s *Service) HasUsersAsSites(ctx context.Context) (bool, error) {
return s.db.HasUsersAndSites(ctx)
}
func (s *Service) ListSites(ctx context.Context) ([]models.Site, error) {
user, ok := models.GetUser(ctx)
if !ok {
return nil, models.UserRequiredError
}
sites, err := s.db.SelectSitesOwnedByUser(ctx, user.ID)
if err != nil {
return nil, err
} else if len(sites) == 0 {
return nil, errors.New("no sites found")
}
return sites, nil
}
func (s *Service) BestSite(ctx context.Context, user models.User) (models.Site, error) {
sites, err := s.db.SelectSitesOwnedByUser(ctx, user.ID)
if err != nil {
@ -36,16 +53,20 @@ func (s *Service) BestSite(ctx context.Context, user models.User) (models.Site,
return sites[0], nil
}
type FirstRunRequest struct {
Username string `form:"username"`
Password1 string `form:"password1"`
Password2 string `form:"password2"`
type CreateSiteParams struct {
SiteName string `form:"siteName"`
SiteURL string `form:"siteUrl"`
NetlifySiteID string `form:"netlifySiteId"`
NetlifyAPIKey string `form:"netlifyAPIToken"`
}
type FirstRunRequest struct {
CreateSiteParams
Username string `form:"username"`
Password1 string `form:"password1"`
Password2 string `form:"password2"`
}
func (frr FirstRunRequest) Validate() error {
return validation.ValidateStruct(&frr,
validation.Field(&frr.Username, validation.Required, validation.Match(models.ValidUserName)),
@ -76,16 +97,31 @@ func (s *Service) FirstRun(ctx context.Context, req FirstRunRequest) (newUser mo
return newUser, newSite, err
}
ctx = models.WithUser(ctx, newUser)
newSite, err = s.CreateSite(ctx, req.CreateSiteParams)
if err != nil {
return newUser, newSite, err
}
return newUser, newSite, nil
}
func (s *Service) CreateSite(ctx context.Context, req CreateSiteParams) (newSite models.Site, _ error) {
user, ok := models.GetUser(ctx)
if !ok {
return newSite, models.UserRequiredError
}
newSite = models.Site{
Title: defaultIfEmpty(req.SiteName, "New Site"),
GUID: models.NewNanoID(),
OwnerID: newUser.ID,
OwnerID: user.ID,
Timezone: "UTC",
PostsPerPage: 10,
Created: time.Now(),
}
if err := s.db.SaveSite(ctx, &newSite); err != nil {
return newUser, newSite, err
return newSite, err
}
hasNetlifyConfig := req.SiteURL != "" && req.NetlifySiteID != "" && req.NetlifyAPIKey != ""
@ -100,11 +136,11 @@ func (s *Service) FirstRun(ctx context.Context, req FirstRunRequest) (newUser mo
TargetKey: req.NetlifyAPIKey,
}
if err := s.db.SavePublishTarget(ctx, &target); err != nil {
return newUser, newSite, err
return newSite, err
}
}
return newUser, newSite, nil
return newSite, nil
}
func (s *Service) GetSiteByID(ctx context.Context, siteID int64) (models.Site, error) {
@ -166,3 +202,17 @@ func (s *Service) UpdateSiteSettings(ctx context.Context, params UpdateSiteSetti
return site, nil
}
func (s *Service) BestPubTarget(ctx context.Context, site models.Site) (models.SitePublishTarget, error) {
pubTargets, err := s.db.SelectPublishTargetsOfSite(ctx, site.ID)
if err != nil {
return models.SitePublishTarget{}, err
}
enabledPubTargets := moslice.Filter(pubTargets, func(pubTarget models.SitePublishTarget) bool { return pubTarget.Enabled })
if len(enabledPubTargets) == 0 {
return models.SitePublishTarget{}, errors.New("no publish targets found")
}
return enabledPubTargets[0], nil
}