Added a site picker plus options to create new sites
This commit is contained in:
parent
cc0da8d668
commit
d80aacc180
14 changed files with 203 additions and 29 deletions
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue