104 lines
2.6 KiB
Go
104 lines
2.6 KiB
Go
|
|
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
|
||
|
|
}
|