Skip to content

Commit

Permalink
Merge pull request #40 from antony-ramos/dev
Browse files Browse the repository at this point in the history
Makes GuildOps more friendly
  • Loading branch information
antony-ramos authored Sep 26, 2023
2 parents fdd8e10 + 3915f96 commit 2a5b796
Show file tree
Hide file tree
Showing 31 changed files with 260 additions and 188 deletions.
36 changes: 13 additions & 23 deletions cmd/guildops/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,12 @@ import (
"os"
"time"

logger "github.com/antony-ramos/guildops/pkg/logger"

"github.com/antony-ramos/guildops/config"
"github.com/antony-ramos/guildops/internal/app"
"github.com/antony-ramos/guildops/pkg/tracing"
"github.com/prometheus/client_golang/prometheus/promhttp"
"go.opentelemetry.io/otel"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
Expand All @@ -28,27 +29,23 @@ var LogLevels = map[string]zapcore.Level{

func main() {
ctx := context.Background()
spanName := "main function"

// Configuration
configPath := os.Getenv("CONFIG_PATH")
if configPath == "" {
configPath = "config/config.yml"
}
cfg, err := config.NewConfig(configPath)
if err != nil {
log.Fatalf("error while loading config : %s", err.Error())
return
}

// Starting Log
// Logs
atom := zap.NewAtomicLevel()
atom.SetLevel(LogLevels[cfg.Log.Level])

encoderCfg := zap.NewProductionEncoderConfig()
encoderCfg.TimeKey = ""

logger := zap.New(zapcore.NewCore(
zapLog := zap.New(zapcore.NewCore(
zapcore.NewJSONEncoder(encoderCfg),
zapcore.Lock(os.Stdout),
atom,
Expand All @@ -58,33 +55,29 @@ func main() {
if err != nil {
log.Fatal(err)
}
}(logger)
}(zapLog)

undo := zap.ReplaceGlobals(logger)
defer undo()
zapLog = zapLog.With(zap.String("service", cfg.Name), zap.String("version", cfg.Version), zap.String("env", cfg.Env))

zap.L().Info("replaced zap's global loggers")

// Setup Zap Log Level
ctx = logger.AddLoggerToContext(ctx, zapLog)

// Tracing
zap.L().Info("Starting telemetry")
logger.FromContext(ctx).Info("Starting telemetry")
logger.FromContext(ctx).Info("Starting telemetry")

// Tracing
shutdown, err := tracing.InstallExportPipeline(ctx, cfg.Name, cfg.Version)
if err != nil {
zap.L().Error(err.Error())
logger.FromContext(ctx).Error(err.Error())
return
}
defer func() {
if err := shutdown(ctx); err != nil {
log.Fatal(err)
}
}()
ctx, span := otel.Tracer(spanName).Start(ctx, "main")

// Metrics
zap.L().Info(fmt.Sprintf("Starting metrics server on port %s", cfg.Metrics.Port))
logger.FromContext(ctx).Info(fmt.Sprintf("Starting metrics server on port %s", cfg.Metrics.Port))
http.Handle("/metrics", promhttp.Handler())
go func() {
server := &http.Server{
Expand All @@ -93,14 +86,11 @@ func main() {
}
err := server.ListenAndServe()
if err != nil {
span.RecordError(err)
zap.L().Fatal(err.Error())
span.End()
logger.FromContext(ctx).Fatal(err.Error())
}
}()

// Run
zap.L().Info("Starting app")
logger.FromContext(ctx).Info("Starting app")
app.Run(ctx, cfg)
span.End()
}
10 changes: 6 additions & 4 deletions config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,12 +54,14 @@ type (
func NewConfig(configPath string) (*Config, error) {
cfg := &Config{}

err := cleanenv.ReadConfig(configPath, cfg)
if err != nil {
return nil, fmt.Errorf("config error: %w", err)
if configPath != "" {
err := cleanenv.ReadConfig(configPath, cfg)
if err != nil {
return nil, fmt.Errorf("config error: %w", err)
}
}

err = cleanenv.ReadEnv(cfg)
err := cleanenv.ReadEnv(cfg)
if err != nil {
return nil, fmt.Errorf("config error: %w", err)
}
Expand Down
2 changes: 1 addition & 1 deletion config/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,4 @@ postgres:
pool_max: 10
conn_attempts: 10
conn_timeout: 2s
url: user=coven-bot dbname=coven password=JcJXS6FFsRjHD60vgbajSQ host=coven-bot-9798.8nj.cockroachlabs.cloud port=26257 sslmode=verify-full
url: <todo>
4 changes: 3 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,21 @@ go 1.21
require (
github.com/DATA-DOG/go-sqlmock v1.5.0
github.com/Masterminds/squirrel v1.5.4
github.com/alitto/pond v1.8.3
github.com/bwmarrin/discordgo v0.27.1
github.com/driftprogramming/pgxpoolmock v1.1.0
github.com/golang/mock v1.6.0
github.com/ilyakaznacheev/cleanenv v1.5.0
github.com/jackc/pgconn v1.14.1
github.com/jackc/pgx/v4 v4.18.1
github.com/lib/pq v1.10.9
github.com/pkg/errors v0.8.1
github.com/prometheus/client_golang v1.16.0
github.com/stretchr/testify v1.8.4
go.opentelemetry.io/otel v1.18.0
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.18.0
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.18.0
go.opentelemetry.io/otel/sdk v1.18.0
go.opentelemetry.io/otel/trace v1.18.0
go.uber.org/zap v1.26.0
)

Expand Down Expand Up @@ -51,6 +52,7 @@ require (
github.com/rogpeppe/go-internal v1.11.0 // indirect
github.com/stretchr/objx v0.5.1 // indirect
go.opentelemetry.io/otel/metric v1.18.0 // indirect
go.opentelemetry.io/otel/trace v1.18.0 // indirect
go.opentelemetry.io/proto/otlp v1.0.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
golang.org/x/crypto v0.13.0 // indirect
Expand Down
2 changes: 2 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuy
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/alitto/pond v1.8.3 h1:ydIqygCLVPqIX/USe5EaV/aSRXTRXDEI9JwuDdu+/xs=
github.com/alitto/pond v1.8.3/go.mod h1:CmvIIGd5jKLasGI3D87qDkQxjzChdKMmnXMg3fG6M6Q=
github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
Expand Down
17 changes: 11 additions & 6 deletions internal/app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@ package app
import (
"context"

"github.com/antony-ramos/guildops/pkg/logger"
"github.com/pkg/errors"

"github.com/antony-ramos/guildops/config"
discordHandler "github.com/antony-ramos/guildops/internal/controller/discord"
"github.com/antony-ramos/guildops/internal/usecase"
Expand All @@ -14,7 +17,7 @@ import (
)

func Run(ctx context.Context, cfg *config.Config) {
zap.L().Info("loading backend")
logger.FromContext(ctx).Info("loading backend")

pgHandler, err := postgres.New(
ctx,
Expand All @@ -23,13 +26,15 @@ func Run(ctx context.Context, cfg *config.Config) {
postgres.ConnAttempts(cfg.ConnAttempts),
postgres.ConnTimeout(cfg.ConnTimeOut))
if err != nil {
zap.L().Fatal(err.Error())
logger.FromContext(ctx).Fatal(err.Error())
}

ctx = logger.AddLoggerToContext(ctx, logger.FromContext(ctx).With(zap.String("backend", "postgres")))

backend := postgresbackend.PG{Postgres: pgHandler}
err = backend.Init(cfg.URL, nil)
err = backend.Init(ctx, cfg.URL, nil)
if err != nil {
zap.L().Fatal(err.Error())
logger.FromContext(ctx).Fatal(err.Error())
return
}

Expand Down Expand Up @@ -80,10 +85,10 @@ func Run(ctx context.Context, cfg *config.Config) {
discord.GuildID(cfg.Discord.GuildID),
discord.DeleteCommands(cfg.Discord.DeleteCommands))

zap.L().Info("starting to serve to discord webhooks")
logger.FromContext(ctx).Info("start guildOps")
err = serve.Run(ctx)
if err != nil {
zap.L().Error(err.Error())
logger.FromContext(ctx).Error(errors.Wrap(err, "run discord").Error())
return
}
}
16 changes: 10 additions & 6 deletions internal/controller/discord/absence.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ var AbsenceDescriptor = []discordgo.ApplicationCommand{
{
Type: discordgo.ApplicationCommandOptionString,
Name: "date",
Description: "(ex: 11-05-23 | ou 11-05-23 au 13-05-23)",
Description: "(ex: 11/05/23 | ou 11/05/23 au 13/05/23)",
Required: true,
},
},
Expand All @@ -28,7 +28,7 @@ var AbsenceDescriptor = []discordgo.ApplicationCommand{
{
Type: discordgo.ApplicationCommandOptionString,
Name: "date",
Description: "(ex: 11-05-23 | ou 11-05-23 au 13-05-23)",
Description: "(ex: 11/05/23 | ou 11/05/23 au 13/05/23)",
Required: true,
},
},
Expand All @@ -40,7 +40,7 @@ var AbsenceDescriptor = []discordgo.ApplicationCommand{
{
Type: discordgo.ApplicationCommandOptionString,
Name: "date",
Description: "example : 09/09/23",
Description: "(ex: 09/09/23)",
Required: true,
},
},
Expand All @@ -63,15 +63,19 @@ func (d Discord) GenerateListAbsenceHandlerMsg(ctx context.Context, date string)
select {
case <-ctx.Done():
return ctxError,
fmt.Errorf("discord - GenerateListAbsenceHandlerMsg - ctx.Done: %w", ctx.Err())
fmt.Errorf("discord - GenerateListAbsenceHandlerMsg - ctx.Done: request took too much time to be proceed")
default:
var msg string
dates, err := parseDate(date)
if err != nil {
msg = errorMsg + HumanReadableError(err)
} else {
msg = "Absence(s) pour le " + dates[0].Format("02-01-2006") + " :\n"
absences, err := d.ListAbsence(ctx, dates[0])
if len(absences) == 0 {
msg = "Aucune absence pour le " + date + "\n"
return msg, err
}
msg = "Absence(s) pour le " + dates[0].Format("02-01-2006") + " :\n"
if err != nil {
msg = errorMsg + HumanReadableError(err)
return msg, err
Expand Down Expand Up @@ -115,7 +119,7 @@ func (d Discord) GenerateAbsenceHandlerMsg(
select {
case <-ctx.Done():
return ctxError,
fmt.Errorf("discord - GenerateAbsenceHandlerMsg - ctx.Done: %w", ctx.Err())
fmt.Errorf("discord - GenerateAbsenceHandlerMsg - ctx.Done: request took too much time to be proceed")
default:
dates, err := parseDate(dates)
if err != nil {
Expand Down
2 changes: 1 addition & 1 deletion internal/controller/discord/absence_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -242,7 +242,7 @@ func TestDiscord_GenerateListAbsenceHandlerMsg(t *testing.T) {
msg, err := discord.GenerateListAbsenceHandlerMsg(context.Background(), "01/01/21")

assert.Error(t, err)
assert.Equal(t, "Error while listing absences: Backend Error", msg)
assert.Equal(t, "Aucune absence pour le 01/01/21\n", msg)
mockAbsenceUseCase.AssertExpectations(t)
})
}
12 changes: 6 additions & 6 deletions internal/controller/discord/loot.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,13 @@ var LootDescriptors = []discordgo.ApplicationCommand{
{
Type: discordgo.ApplicationCommandOptionInteger,
Name: "raid-id",
Description: "ex: 4488766425",
Description: "(ex: 123456789)",
Required: true,
},
{
Type: discordgo.ApplicationCommandOptionString,
Name: "player-name",
Description: "ex: Milowenn",
Description: "(ex: milowenn)",
Required: true,
},
},
Expand All @@ -42,7 +42,7 @@ var LootDescriptors = []discordgo.ApplicationCommand{
{
Type: discordgo.ApplicationCommandOptionString,
Name: "player-name",
Description: "ex: Milowenn",
Description: "(ex: milowenn)",
Required: true,
},
},
Expand All @@ -54,7 +54,7 @@ var LootDescriptors = []discordgo.ApplicationCommand{
{
Type: discordgo.ApplicationCommandOptionString,
Name: "id",
Description: "ex: 5465-4444-5557",
Description: "(ex: 123456789)",
Required: true,
},
},
Expand All @@ -66,13 +66,13 @@ var LootDescriptors = []discordgo.ApplicationCommand{
{
Type: discordgo.ApplicationCommandOptionString,
Name: "player-list",
Description: "ex: Milowenn,Arthas,Jailer",
Description: "(ex: arthas,jailer,garrosh)",
Required: true,
},
{
Type: discordgo.ApplicationCommandOptionString,
Name: "difficulty",
Description: "ex: HM",
Description: "(ex: mythic, heroic, normal)",
Required: true,
},
},
Expand Down
2 changes: 1 addition & 1 deletion internal/controller/discord/player.go
Original file line number Diff line number Diff line change
Expand Up @@ -201,7 +201,7 @@ func (d Discord) GenerateLinkPlayerMsg(ctx context.Context, discordName, playerN
select {
case <-ctx.Done():
return ctxError,
fmt.Errorf("discord - GenerateLinkPlayerMsg - ctx.Done: %w", ctx.Err())
fmt.Errorf("discord - GenerateLinkPlayerMsg - ctx.Done: request took too much time to be proceed")
default:
var msg string

Expand Down
14 changes: 7 additions & 7 deletions internal/entity/player.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package entity
import (
"fmt"
"strings"
"unicode"
)

type Player struct {
Expand All @@ -15,7 +16,7 @@ type Player struct {
MissedRaids []Raid
}

func (p Player) Validate() error {
func (p *Player) Validate() error {
if len(p.Name) == 0 {
return fmt.Errorf("name cannot be empty")
}
Expand All @@ -25,14 +26,13 @@ func (p Player) Validate() error {
return fmt.Errorf("name must be between 1 and 12 characters")
}
// only a-z characters
for _, c := range p.Name {
if c < 'a' || c > 'z' {
return fmt.Errorf("name must only contain a-z characters")
for _, char := range p.Name {
if !unicode.IsLetter(char) {
return fmt.Errorf("name must only contain letters")
}
}

if p.Name != strings.ToLower(p.Name) {
return fmt.Errorf("name must be lowercase")
}
p.Name = strings.ToLower(p.Name)

return nil
}
11 changes: 0 additions & 11 deletions internal/entity/player_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,17 +64,6 @@ func TestPlayer_Validate(t *testing.T) {
},
wantErr: true,
},
{
name: "Invalid Player - Name Lowercase",
fields: fields{
ID: 1,
Name: "PlayerName",
Strikes: []entity.Strike{},
Loots: []entity.Loot{},
MissedRaids: []entity.Raid{},
},
wantErr: true,
},
}
for _, tt := range tests {
test := tt
Expand Down
Loading

0 comments on commit 2a5b796

Please sign in to comment.