2026-02-01 04:00:26 +00:00
|
|
|
package progdoc
|
|
|
|
|
|
2026-02-01 05:46:48 +00:00
|
|
|
import (
|
|
|
|
|
"context"
|
|
|
|
|
"errors"
|
|
|
|
|
"os"
|
|
|
|
|
|
|
|
|
|
"github.com/go-openapi/runtime"
|
|
|
|
|
"github.com/go-openapi/strfmt"
|
|
|
|
|
"github.com/netlify/open-api/v2/go/porcelain"
|
|
|
|
|
netlify_ctx "github.com/netlify/open-api/v2/go/porcelain/context"
|
|
|
|
|
)
|
|
|
|
|
|
2026-02-01 04:00:26 +00:00
|
|
|
type SiteBuilder struct {
|
2026-02-01 06:04:15 +00:00
|
|
|
opts []Option
|
2026-02-01 04:00:26 +00:00
|
|
|
}
|
|
|
|
|
|
2026-02-01 06:04:15 +00:00
|
|
|
func Site(opts ...Option) *SiteBuilder {
|
|
|
|
|
return &SiteBuilder{
|
|
|
|
|
opts: opts,
|
|
|
|
|
}
|
2026-02-01 04:00:26 +00:00
|
|
|
}
|
|
|
|
|
|
2026-02-02 10:25:43 +00:00
|
|
|
func (sb *SiteBuilder) Generate() error {
|
|
|
|
|
_, err := sb.generate()
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-01 05:46:48 +00:00
|
|
|
func (sb *SiteBuilder) Publish() error {
|
2026-02-02 10:25:43 +00:00
|
|
|
genOut, err := sb.generate()
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return sb.deployToNetlify(genOut)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (sb *SiteBuilder) generate() (generation, error) {
|
2026-02-01 06:04:15 +00:00
|
|
|
siteMap := siteMap{}
|
|
|
|
|
|
|
|
|
|
for _, opt := range sb.opts {
|
|
|
|
|
if err := opt.configSitemap(&siteMap); err != nil {
|
2026-02-02 10:25:43 +00:00
|
|
|
return generation{}, err
|
2026-02-01 06:04:15 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if len(siteMap.Pages) == 0 {
|
2026-02-02 10:25:43 +00:00
|
|
|
return generation{}, errors.New("No pages found")
|
2026-02-01 04:00:26 +00:00
|
|
|
}
|
|
|
|
|
|
2026-02-01 05:46:48 +00:00
|
|
|
gen := generator{}
|
|
|
|
|
genOut, err := gen.genSite(siteMap)
|
|
|
|
|
if err != nil {
|
2026-02-02 10:25:43 +00:00
|
|
|
return generation{}, err
|
2026-02-01 05:46:48 +00:00
|
|
|
}
|
2026-02-02 10:25:43 +00:00
|
|
|
return genOut, nil
|
2026-02-01 05:46:48 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (sb *SiteBuilder) deployToNetlify(genOut generation) error {
|
|
|
|
|
netlifyAuthToken := os.Getenv("NETLIFY_AUTH_TOKEN")
|
|
|
|
|
if netlifyAuthToken == "" {
|
|
|
|
|
return errors.New("NETLIFY_AUTH_TOKEN is not set")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
netlifySiteID := os.Getenv("NETLIFY_SITE_ID")
|
|
|
|
|
if netlifySiteID == "" {
|
|
|
|
|
return errors.New("NETLIFY_SITE_ID is not set")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ctx := context.Background()
|
|
|
|
|
ctx = netlify_ctx.WithAuthInfo(ctx, runtime.ClientAuthInfoWriterFunc(func(r runtime.ClientRequest, _ strfmt.Registry) error {
|
|
|
|
|
return r.SetHeaderParam("Authorization", "Bearer "+netlifyAuthToken)
|
|
|
|
|
}))
|
|
|
|
|
client := porcelain.Default
|
|
|
|
|
_, err := client.DeploySite(ctx, porcelain.DeployOptions{
|
|
|
|
|
SiteID: netlifySiteID,
|
|
|
|
|
Dir: genOut.OutDir,
|
|
|
|
|
})
|
|
|
|
|
if err != nil {
|
2026-02-01 04:00:26 +00:00
|
|
|
return err
|
|
|
|
|
}
|
2026-02-01 05:46:48 +00:00
|
|
|
|
2026-02-01 04:00:26 +00:00
|
|
|
return nil
|
|
|
|
|
}
|