Have got first run working and publishing to Netlify
This commit is contained in:
parent
b7e0269e9d
commit
30d99eeb9e
22 changed files with 472 additions and 47 deletions
103
services/sites/services.go
Normal file
103
services/sites/services.go
Normal file
|
|
@ -0,0 +1,103 @@
|
|||
package sites
|
||||
|
||||
import (
|
||||
"context"
|
||||
"time"
|
||||
|
||||
"emperror.dev/errors"
|
||||
"github.com/go-ozzo/ozzo-validation/v4"
|
||||
"lmika.dev/lmika/weiro/models"
|
||||
"lmika.dev/lmika/weiro/providers/db"
|
||||
)
|
||||
|
||||
type Service struct {
|
||||
db *db.Provider
|
||||
}
|
||||
|
||||
func New(dbp *db.Provider) *Service {
|
||||
return &Service{
|
||||
db: dbp,
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Service) HasUsersAsSites(ctx context.Context) (bool, error) {
|
||||
return s.db.HasUsersAndSites(ctx)
|
||||
}
|
||||
|
||||
func (s *Service) BestSite(ctx context.Context, user models.User) (models.Site, error) {
|
||||
sites, err := s.db.SelectSitesOwnedByUser(ctx, user.ID)
|
||||
if err != nil {
|
||||
return models.Site{}, err
|
||||
} else if len(sites) == 0 {
|
||||
return models.Site{}, errors.New("no sites found")
|
||||
}
|
||||
|
||||
return sites[0], nil
|
||||
}
|
||||
|
||||
type FirstRunRequest struct {
|
||||
Username string `form:"username"`
|
||||
Password1 string `form:"password1"`
|
||||
Password2 string `form:"password2"`
|
||||
SiteName string `form:"siteName"`
|
||||
SiteURL string `form:"siteUrl"`
|
||||
NetlifySiteID string `form:"netlifySiteId"`
|
||||
NetlifyAPIKey string `form:"netlifyAPIToken"`
|
||||
}
|
||||
|
||||
func (frr FirstRunRequest) Validate() error {
|
||||
return validation.ValidateStruct(&frr,
|
||||
validation.Field(&frr.Username, validation.Required, validation.Match(models.ValidUserName)),
|
||||
validation.Field(&frr.Password1, validation.Required),
|
||||
validation.Field(&frr.Password2, validation.Required, validation.By(stringEquals(frr.Password1))),
|
||||
)
|
||||
}
|
||||
|
||||
func (s *Service) FirstRun(ctx context.Context, req FirstRunRequest) (newUser models.User, newSite models.Site, _ error) {
|
||||
if err := req.Validate(); err != nil {
|
||||
return newUser, newSite, err
|
||||
}
|
||||
|
||||
hasSite, err := s.db.HasUsersAndSites(ctx)
|
||||
if err != nil {
|
||||
return newUser, newSite, err
|
||||
} else if hasSite {
|
||||
return newUser, newSite, errors.New("user and site already exists")
|
||||
}
|
||||
|
||||
newUser = models.User{
|
||||
Username: req.Username,
|
||||
TimeZone: "UTC",
|
||||
Created: time.Now(),
|
||||
}
|
||||
newUser.SetPassword(req.Password1)
|
||||
if err := s.db.SaveUser(ctx, &newUser); err != nil {
|
||||
return newUser, newSite, err
|
||||
}
|
||||
|
||||
newSite = models.Site{
|
||||
Title: defaultIfEmpty(req.SiteName, "New Site"),
|
||||
OwnerID: newUser.ID,
|
||||
Created: time.Now(),
|
||||
}
|
||||
if err := s.db.SaveSite(ctx, &newSite); err != nil {
|
||||
return newUser, newSite, err
|
||||
}
|
||||
|
||||
hasNetlifyConfig := req.SiteURL != "" && req.NetlifySiteID != "" && req.NetlifyAPIKey != ""
|
||||
if hasNetlifyConfig {
|
||||
target := models.SitePublishTarget{
|
||||
SiteID: newSite.ID,
|
||||
Enabled: true,
|
||||
BaseURL: req.SiteURL,
|
||||
TargetType: "netlify",
|
||||
TargetRef: req.NetlifySiteID,
|
||||
TargetKey: req.NetlifyAPIKey,
|
||||
}
|
||||
if err := s.db.SavePublishTarget(ctx, &target); err != nil {
|
||||
return newUser, newSite, err
|
||||
}
|
||||
}
|
||||
|
||||
return newUser, newSite, nil
|
||||
}
|
||||
23
services/sites/utils.go
Normal file
23
services/sites/utils.go
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
package sites
|
||||
|
||||
import (
|
||||
"emperror.dev/errors"
|
||||
validation "github.com/go-ozzo/ozzo-validation/v4"
|
||||
)
|
||||
|
||||
func stringEquals(str string) validation.RuleFunc {
|
||||
return func(value interface{}) error {
|
||||
s, _ := value.(string)
|
||||
if s != str {
|
||||
return errors.New("unexpected string")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
func defaultIfEmpty(value string, defaultValue string) string {
|
||||
if value == "" {
|
||||
return defaultValue
|
||||
}
|
||||
return value
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue