chore: initial commit

This commit is contained in:
2024-04-16 22:27:52 +01:00
commit 531b5dabe2
194 changed files with 27071 additions and 0 deletions

View File

@@ -0,0 +1,70 @@
// Copyright (C) 2024 Declan Teevan
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
package config
import (
"os"
"github.com/hexolan/stocklet/internal/pkg/errors"
)
// Load an option from an environment variable
func loadFromEnv(name string) *string {
value, exists := os.LookupEnv(name)
if !exists || value == "" {
return nil
}
return &value
}
// Require an option from an environment variable
func RequireFromEnv(name string) (string, error) {
value := loadFromEnv(name)
if value == nil {
return "", errors.NewServiceErrorf(errors.ErrCodeService, "failed to load required cfg option (%s)", name)
}
return *value, nil
}
// Shared configuration implemented by all services
type SharedConfig struct {
// Env Var: "MODE" (optional)
// 'dev' or 'development' -> true
// Defaults to false
DevMode bool
Otel OtelConfig
}
// Load the options in the shared config
func (cfg *SharedConfig) Load() error {
// Determine application mode
cfg.DevMode = false
if mode, err := RequireFromEnv("MODE"); err == nil && (mode == "dev" || mode == "development") {
cfg.DevMode = true
}
// load the Open Telemetry config
cfg.Otel = OtelConfig{}
if err := cfg.Otel.Load(); err != nil {
return err
}
// Config succesfully loaded
return nil
}

View File

@@ -0,0 +1,40 @@
// Copyright (C) 2024 Declan Teevan
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
package config
import (
"strings"
)
type KafkaConfig struct {
// Env Var: "KAFKA_BROKERS"
// Comma delimited from env var.
Brokers []string
}
func (cfg *KafkaConfig) Load() error {
// load configurations from env
brokersOpt, err := RequireFromEnv("KAFKA_BROKERS")
if err != nil {
return err
}
// Comma seperate the kafka brokers
cfg.Brokers = strings.Split(brokersOpt, ",")
// Config options were succesfully loaded
return nil
}

View File

@@ -0,0 +1,33 @@
// Copyright (C) 2024 Declan Teevan
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
package config
type OtelConfig struct {
// Env Var: "OTEL_COLLECTOR_GRPC"
CollectorGrpc string
}
func (cfg *OtelConfig) Load() error {
// Load configurations from env
if collectorGrpc, err := RequireFromEnv("OTEL_COLLECTOR_GRPC"); err != nil {
return err
} else {
cfg.CollectorGrpc = collectorGrpc
}
// Succesfully loaded config properties
return nil
}

View File

@@ -0,0 +1,85 @@
// Copyright (C) 2024 Declan Teevan
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
package config
import (
"fmt"
)
type PostgresConfig struct {
// Env Var: "PG_USER"
Username string
// Env Var: "PG_PASS"
Password string
// Env Var: "PG_HOST"
Host string
// Env Var: "PG_PORT" (optional)
// Defaults to "5432"
Port string
// Env Var: "PG_DB"
Database string
}
func (conf *PostgresConfig) GetDSN() string {
return fmt.Sprintf(
"postgresql://%s:%s@%s:%s/%s?sslmode=disable",
conf.Username,
conf.Password,
conf.Host,
conf.Port,
conf.Database,
)
}
func (cfg *PostgresConfig) Load() error {
// Load configurations from env
if opt, err := RequireFromEnv("PG_USER"); err != nil {
return err
} else {
cfg.Username = opt
}
if opt, err := RequireFromEnv("PG_PASS"); err != nil {
return err
} else {
cfg.Password = opt
}
if opt, err := RequireFromEnv("PG_HOST"); err != nil {
return err
} else {
cfg.Host = opt
}
if opt, err := RequireFromEnv("PG_PORT"); err != nil {
cfg.Port = "5432"
} else {
cfg.Port = opt
}
if opt, err := RequireFromEnv("PG_DB"); err != nil {
return err
} else {
cfg.Database = opt
}
// Config properties succesfully loaded
return nil
}