This commit is contained in:
2025-05-19 01:49:56 +04:00
commit e6fec752f9
52 changed files with 4337 additions and 0 deletions

70
pkg/config/api.go Normal file
View File

@@ -0,0 +1,70 @@
package config
import (
"fmt"
"net/url"
"slices"
"github.com/aykhans/bsky-feedgen/pkg/types"
"github.com/aykhans/bsky-feedgen/pkg/utils"
"github.com/whyrusleeping/go-did"
)
type APIConfig struct {
FeedgenHostname *url.URL
ServiceDID *did.DID
FeedgenPublisherDID *did.DID
APIPort uint16
}
func NewAPIConfig() (*APIConfig, types.ErrMap) {
errs := make(types.ErrMap)
defaultHostname, _ := url.Parse("http://localhost")
feedgenHostname, err := utils.GetEnvOr("FEEDGEN_HOSTNAME", defaultHostname)
if err != nil {
errs["FEEDGEN_HOSTNAME"] = err
} else {
if !slices.Contains([]string{"", "http", "https"}, feedgenHostname.Scheme) {
errs["FEEDGEN_HOSTNAME"] = fmt.Errorf(
"invalid schema '%s' for FEEDGEN_HOSTNAME. Accepted schemas are: '', 'http', 'https'",
feedgenHostname.Scheme,
)
}
}
serviceDID, err := did.ParseDID("did:web:" + feedgenHostname.Hostname())
if err != nil {
errs["SERVICE_DID"] = fmt.Errorf("failed to parse service DID: %w", err)
}
defaultDID, _ := did.ParseDID("did:plc:development")
feedgenPublisherDID, err := utils.GetEnvOr("FEEDGEN_PUBLISHER_DID", &defaultDID)
if err != nil {
errs["FEEDGEN_PUBLISHER_DID"] = err
}
apiPort, err := utils.GetEnv[uint16]("API_PORT")
if err != nil {
errs["API_PORT"] = err
}
if len(errs) > 0 {
return nil, errs
}
if feedgenHostname.Scheme == "" {
if feedgenHostname.Host == "" {
feedgenHostname, _ = url.Parse("https://" + feedgenHostname.String())
} else {
feedgenHostname.Scheme = "https://"
}
}
return &APIConfig{
FeedgenHostname: feedgenHostname,
ServiceDID: &serviceDID,
FeedgenPublisherDID: feedgenPublisherDID,
APIPort: apiPort,
}, nil
}

40
pkg/config/consumer.go Normal file
View File

@@ -0,0 +1,40 @@
package config
import (
"time"
"github.com/aykhans/bsky-feedgen/pkg/types"
"github.com/aykhans/bsky-feedgen/pkg/utils"
)
type ConsumerConfig struct {
PostMaxDate time.Duration
PostCollectionCutoffCronDelay time.Duration
PostCollectionCutoffCronMaxDocument int64
}
func NewConsumerConfig() (*ConsumerConfig, types.ErrMap) {
errs := make(types.ErrMap)
maxDate, err := utils.GetEnv[time.Duration]("POST_MAX_DATE")
if err != nil {
errs["POST_MAX_DATE"] = err
}
cronDelay, err := utils.GetEnv[time.Duration]("POST_COLLECTION_CUTOFF_CRON_DELAY")
if err != nil {
errs["POST_COLLECTION_CUTOFF_CRON_DELAY"] = err
}
cronMaxDocument, err := utils.GetEnv[int64]("POST_COLLECTION_CUTOFF_CRON_MAX_DOCUMENT")
if err != nil {
errs["POST_COLLECTION_CUTOFF_CRON_MAX_DOCUMENT"] = err
}
if len(errs) > 0 {
return nil, errs
}
return &ConsumerConfig{
PostMaxDate: maxDate,
PostCollectionCutoffCronDelay: cronDelay,
PostCollectionCutoffCronMaxDocument: cronMaxDocument,
}, nil
}

40
pkg/config/feedgen.go Normal file
View File

@@ -0,0 +1,40 @@
package config
import (
"time"
"github.com/aykhans/bsky-feedgen/pkg/types"
"github.com/aykhans/bsky-feedgen/pkg/utils"
)
type FeedGenAzConfig struct {
CollectionMaxDocument int64
GeneratorCronDelay time.Duration
CutoffCronDelay time.Duration
}
func NewFeedGenAzConfig() (*FeedGenAzConfig, types.ErrMap) {
errs := make(types.ErrMap)
maxDocument, err := utils.GetEnv[int64]("FEED_AZ_COLLECTION_CUTOFF_CRON_MAX_DOCUMENT")
if err != nil {
errs["FEED_AZ_COLLECTION_CUTOFF_CRON_MAX_DOCUMENT"] = err
}
generatorCronDelay, err := utils.GetEnv[time.Duration]("FEED_AZ_GENERATER_CRON_DELAY")
if err != nil {
errs["FEED_AZ_GENERATER_CRON_DELAY"] = err
}
cutoffCronDelay, err := utils.GetEnv[time.Duration]("FEED_AZ_COLLECTION_CUTOFF_CRON_DELAY")
if err != nil {
errs["FEED_AZ_COLLECTION_CUTOFF_CRON_DELAY"] = err
}
if len(errs) > 0 {
return nil, errs
}
return &FeedGenAzConfig{
CollectionMaxDocument: maxDocument,
GeneratorCronDelay: generatorCronDelay,
CutoffCronDelay: cutoffCronDelay,
}, nil
}

46
pkg/config/mongodb.go Normal file
View File

@@ -0,0 +1,46 @@
package config
import (
"github.com/aykhans/bsky-feedgen/pkg/types"
"github.com/aykhans/bsky-feedgen/pkg/utils"
)
const MongoDBBaseDB = "main"
type MongoDBConfig struct {
Host string
Port uint16
Username string
Password string
}
func NewMongoDBConfig() (*MongoDBConfig, types.ErrMap) {
errs := make(types.ErrMap)
host, err := utils.GetEnv[string]("MONGODB_HOST")
if err != nil {
errs["host"] = err
}
port, err := utils.GetEnv[uint16]("MONGODB_PORT")
if err != nil {
errs["port"] = err
}
username, err := utils.GetEnvOr("MONGODB_USERNAME", "")
if err != nil {
errs["username"] = err
}
password, err := utils.GetEnvOr("MONGODB_PASSWORD", "")
if err != nil {
errs["password"] = err
}
if len(errs) > 0 {
return nil, errs
}
return &MongoDBConfig{
Host: host,
Port: port,
Username: username,
Password: password,
}, nil
}