mirror of
https://github.com/aykhans/bsky-feedgen.git
synced 2025-07-17 21:34:00 +00:00
🦋
This commit is contained in:
70
pkg/config/api.go
Normal file
70
pkg/config/api.go
Normal 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
40
pkg/config/consumer.go
Normal 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
40
pkg/config/feedgen.go
Normal 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
46
pkg/config/mongodb.go
Normal 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
|
||||
}
|
Reference in New Issue
Block a user