From 697f4909d70ad59538b2ab57cdfc3dce34945da8 Mon Sep 17 00:00:00 2001 From: CarterPerez-dev Date: Sun, 10 May 2026 06:15:26 -0400 Subject: [PATCH] fix(canary-phase1): clear all post-phase-1 audit observations + header normalization MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit No 'logged for later' — every non-blocking finding from the Phase 1 audits is fixed now, in this commit, before declaring the phase truly closed. Code cleanups (5 items): 1. Database.SQLDB() *sql.DB accessor on core.Database; main.go uses db.SQLDB() instead of the awkward db.DB.DB triple-chain. 2. Hoisted list-default literals (50, 20) to package-level defaultListLimit consts in token + event repositories. MEMORY.md 'no magic numbers' rule honored. 3. Moved ptr[T any] helper to internal/testutil/ptr.go as testutil.Ptr; removed local copies from token + event repository_test.go. 4. Renamed CHECK constraints in 0001_create_tokens.sql to match spec text exactly: chk_token_type → chk_type, chk_alert_channel → chk_channel. Spec was the original contract; impl now aligns. 5. Resolved APP_ENVIRONMENT vs ENVIRONMENT divergence per spec §12.1: - compose.yml: ENVIRONMENT=production → APP_ENVIRONMENT=production - dev.compose.yml: ENVIRONMENT=development → APP_ENVIRONMENT=development - config.go envKeyMap: ENVIRONMENT → APP_ENVIRONMENT mapping Concurrency bug fix (real, not just polish): - core/migrations.go: added sync.Mutex around goose calls. goose's package-level state (SetBaseFS, SetDialect) raced under t.Parallel() testcontainers tests. Race detector caught it under -race after parallel test counts climbed. Mutex serializes goose invocation globally; testcontainer-parallelism otherwise unaffected. Header normalization (50 files): - Bulk-normalized every project file's header to canonical '©AngelaMos | 2026' (no space, with © glyph, year 2026) per MEMORY.md style rule. Eliminated 4 distinct non-canonical variants: '// AngelaMos', '// ©AngelaMos | 2025', '// © AngelaMos | 202X', '# AngelaMos'. - Verified clean: grep returns zero non-canonical headers across the whole project tree (excluding gitignored docs/ and node_modules/). Backlog discipline: - Created docs/plans/BACKLOG.md with strict format: open items only, HIGH/MEDIUM/LOW severity, must-clear-before-ship contract. - BACKLOG currently has zero open items — every observation was fixed here, not deferred. Closed-items section logs what was cleared. Verification: - go build ./... clean - go vet ./... clean - go test -tags=integration -race ./internal/token/... 11/11 PASS - go test -tags=integration -race ./internal/event/... 9/9 PASS - docker compose -f compose.yml config parses - docker compose -f dev.compose.yml config parses - grep for non-canonical headers zero matches --- .../beginner/canary-token-generator/backend/.air.toml | 2 +- .../canary-token-generator/backend/.golangci.yml | 2 +- .../canary-token-generator/backend/cmd/canary/main.go | 2 +- .../canary-token-generator/backend/config.yaml | 2 +- .../backend/internal/config/config.go | 4 ++-- .../backend/internal/core/database.go | 6 +++++- .../backend/internal/core/errors.go | 2 +- .../backend/internal/core/migrations.go | 6 ++++++ .../internal/core/migrations/0001_create_tokens.sql | 4 ++-- .../backend/internal/core/redis.go | 2 +- .../backend/internal/core/response.go | 2 +- .../backend/internal/core/security.go | 2 +- .../backend/internal/core/telemetry.go | 2 +- .../backend/internal/core/validation.go | 2 +- .../backend/internal/event/repository.go | 4 +++- .../backend/internal/event/repository_test.go | 8 +++----- .../backend/internal/health/handler.go | 2 +- .../backend/internal/middleware/headers.go | 2 +- .../backend/internal/middleware/logging.go | 2 +- .../backend/internal/middleware/ratelimit.go | 2 +- .../backend/internal/middleware/request_id.go | 2 +- .../backend/internal/server/server.go | 2 +- .../backend/internal/testutil/ptr.go | 6 ++++++ .../backend/internal/token/repository.go | 4 +++- .../backend/internal/token/repository_test.go | 10 ++++------ PROJECTS/beginner/canary-token-generator/compose.yml | 2 +- .../beginner/canary-token-generator/dev.compose.yml | 2 +- .../canary-token-generator/frontend/.stylelintignore | 2 +- .../frontend/src/api/hooks/index.ts | 2 +- .../canary-token-generator/frontend/src/api/index.ts | 2 +- .../frontend/src/api/types/index.ts | 2 +- .../frontend/src/components/index.tsx | 2 +- .../canary-token-generator/frontend/src/config.ts | 2 +- .../frontend/src/core/api/api.config.ts | 2 +- .../frontend/src/core/api/errors.ts | 2 +- .../frontend/src/core/api/index.ts | 2 +- .../frontend/src/core/api/query.config.ts | 2 +- .../frontend/src/core/app/routers.tsx | 2 +- .../frontend/src/core/app/shell.module.scss | 2 +- .../frontend/src/core/app/toast.module.scss | 2 +- .../frontend/src/core/lib/index.ts | 2 +- .../frontend/src/core/lib/shell.ui.store.ts | 2 +- .../canary-token-generator/frontend/src/main.tsx | 2 +- .../frontend/src/pages/dashboard/dashboard.module.scss | 2 +- .../frontend/src/pages/landing/index.tsx | 2 +- .../frontend/src/pages/landing/landing.module.scss | 2 +- .../frontend/src/pages/settings/settings.module.scss | 2 +- .../canary-token-generator/frontend/src/styles.scss | 2 +- .../frontend/src/styles/_fonts.scss | 2 +- .../frontend/src/styles/_index.scss | 2 +- .../frontend/src/styles/_mixins.scss | 2 +- .../frontend/src/styles/_reset.scss | 2 +- .../frontend/src/styles/_tokens.scss | 2 +- .../frontend/stylelint.config.js | 2 +- .../canary-token-generator/frontend/vite.config.ts | 2 +- .../canary-token-generator/infra/nginx/dev.nginx | 2 +- .../canary-token-generator/infra/nginx/nginx.conf | 2 +- .../canary-token-generator/infra/nginx/nginx.prod.conf | 2 +- .../canary-token-generator/infra/nginx/prod.nginx | 2 +- .../canary-token-generator/scripts/randomize-ports.sh | 2 +- 60 files changed, 85 insertions(+), 69 deletions(-) create mode 100644 PROJECTS/beginner/canary-token-generator/backend/internal/testutil/ptr.go diff --git a/PROJECTS/beginner/canary-token-generator/backend/.air.toml b/PROJECTS/beginner/canary-token-generator/backend/.air.toml index 1289f607..14654197 100644 --- a/PROJECTS/beginner/canary-token-generator/backend/.air.toml +++ b/PROJECTS/beginner/canary-token-generator/backend/.air.toml @@ -1,4 +1,4 @@ -# AngelaMos | 2026 +# ©AngelaMos | 2026 # .air.toml - Hot reload configuration root = "." diff --git a/PROJECTS/beginner/canary-token-generator/backend/.golangci.yml b/PROJECTS/beginner/canary-token-generator/backend/.golangci.yml index 0d37a865..62aae485 100644 --- a/PROJECTS/beginner/canary-token-generator/backend/.golangci.yml +++ b/PROJECTS/beginner/canary-token-generator/backend/.golangci.yml @@ -1,4 +1,4 @@ -# AngelaMos | 2026 +# ©AngelaMos | 2026 # .golangci.yml version: "2" diff --git a/PROJECTS/beginner/canary-token-generator/backend/cmd/canary/main.go b/PROJECTS/beginner/canary-token-generator/backend/cmd/canary/main.go index 686f870a..868e7e04 100644 --- a/PROJECTS/beginner/canary-token-generator/backend/cmd/canary/main.go +++ b/PROJECTS/beginner/canary-token-generator/backend/cmd/canary/main.go @@ -67,7 +67,7 @@ func run(configPath string) error { } logger.Info("database connected") - if err := core.RunMigrations(db.DB.DB); err != nil { + if err := core.RunMigrations(db.SQLDB()); err != nil { return fmt.Errorf("run migrations: %w", err) } logger.Info("migrations applied") diff --git a/PROJECTS/beginner/canary-token-generator/backend/config.yaml b/PROJECTS/beginner/canary-token-generator/backend/config.yaml index 959fc851..1b1fd5fe 100644 --- a/PROJECTS/beginner/canary-token-generator/backend/config.yaml +++ b/PROJECTS/beginner/canary-token-generator/backend/config.yaml @@ -1,4 +1,4 @@ -# AngelaMos | 2026 +# ©AngelaMos | 2026 # config.yaml - Default configuration app: diff --git a/PROJECTS/beginner/canary-token-generator/backend/internal/config/config.go b/PROJECTS/beginner/canary-token-generator/backend/internal/config/config.go index 955afe68..e4f08ac5 100644 --- a/PROJECTS/beginner/canary-token-generator/backend/internal/config/config.go +++ b/PROJECTS/beginner/canary-token-generator/backend/internal/config/config.go @@ -1,4 +1,4 @@ -// AngelaMos | 2026 +// ©AngelaMos | 2026 // config.go package config @@ -199,7 +199,7 @@ func loadDefaults(k *koanf.Koanf) error { var envKeyMap = map[string]string{ "DATABASE_URL": "database.url", "REDIS_URL": "redis.url", - "ENVIRONMENT": "app.environment", + "APP_ENVIRONMENT": "app.environment", "HOST": "server.host", "PORT": "server.port", "LOG_LEVEL": "log.level", diff --git a/PROJECTS/beginner/canary-token-generator/backend/internal/core/database.go b/PROJECTS/beginner/canary-token-generator/backend/internal/core/database.go index 72190b03..d4849ce3 100644 --- a/PROJECTS/beginner/canary-token-generator/backend/internal/core/database.go +++ b/PROJECTS/beginner/canary-token-generator/backend/internal/core/database.go @@ -1,4 +1,4 @@ -// AngelaMos | 2026 +// ©AngelaMos | 2026 // database.go package core @@ -20,6 +20,10 @@ type Database struct { DB *sqlx.DB } +func (d *Database) SQLDB() *sql.DB { + return d.DB.DB +} + func NewDatabase( ctx context.Context, cfg config.DatabaseConfig, diff --git a/PROJECTS/beginner/canary-token-generator/backend/internal/core/errors.go b/PROJECTS/beginner/canary-token-generator/backend/internal/core/errors.go index b478a6ee..2c177a07 100644 --- a/PROJECTS/beginner/canary-token-generator/backend/internal/core/errors.go +++ b/PROJECTS/beginner/canary-token-generator/backend/internal/core/errors.go @@ -1,4 +1,4 @@ -// AngelaMos | 2026 +// ©AngelaMos | 2026 // errors.go package core diff --git a/PROJECTS/beginner/canary-token-generator/backend/internal/core/migrations.go b/PROJECTS/beginner/canary-token-generator/backend/internal/core/migrations.go index 1f874fbe..57384167 100644 --- a/PROJECTS/beginner/canary-token-generator/backend/internal/core/migrations.go +++ b/PROJECTS/beginner/canary-token-generator/backend/internal/core/migrations.go @@ -7,6 +7,7 @@ import ( "database/sql" "embed" "fmt" + "sync" "github.com/pressly/goose/v3" ) @@ -14,7 +15,12 @@ import ( //go:embed migrations/*.sql var migrationsFS embed.FS +var gooseMu sync.Mutex + func RunMigrations(db *sql.DB) error { + gooseMu.Lock() + defer gooseMu.Unlock() + goose.SetBaseFS(migrationsFS) if err := goose.SetDialect("postgres"); err != nil { diff --git a/PROJECTS/beginner/canary-token-generator/backend/internal/core/migrations/0001_create_tokens.sql b/PROJECTS/beginner/canary-token-generator/backend/internal/core/migrations/0001_create_tokens.sql index 8d72b01c..854430e0 100644 --- a/PROJECTS/beginner/canary-token-generator/backend/internal/core/migrations/0001_create_tokens.sql +++ b/PROJECTS/beginner/canary-token-generator/backend/internal/core/migrations/0001_create_tokens.sql @@ -25,9 +25,9 @@ CREATE TABLE tokens ( metadata JSONB NOT NULL DEFAULT '{}'::jsonb, - CONSTRAINT chk_token_type CHECK (type IN + CONSTRAINT chk_type CHECK (type IN ('webbug', 'slowredirect', 'docx', 'pdf', 'kubeconfig', 'envfile', 'mysql')), - CONSTRAINT chk_alert_channel CHECK (alert_channel IN ('telegram', 'webhook')), + CONSTRAINT chk_channel CHECK (alert_channel IN ('telegram', 'webhook')), CONSTRAINT chk_telegram_complete CHECK ( alert_channel <> 'telegram' OR (telegram_bot IS NOT NULL AND telegram_chat IS NOT NULL) diff --git a/PROJECTS/beginner/canary-token-generator/backend/internal/core/redis.go b/PROJECTS/beginner/canary-token-generator/backend/internal/core/redis.go index 4391d459..6349fcd5 100644 --- a/PROJECTS/beginner/canary-token-generator/backend/internal/core/redis.go +++ b/PROJECTS/beginner/canary-token-generator/backend/internal/core/redis.go @@ -1,4 +1,4 @@ -// AngelaMos | 2026 +// ©AngelaMos | 2026 // redis.go package core diff --git a/PROJECTS/beginner/canary-token-generator/backend/internal/core/response.go b/PROJECTS/beginner/canary-token-generator/backend/internal/core/response.go index e37ac737..2a1b53b8 100644 --- a/PROJECTS/beginner/canary-token-generator/backend/internal/core/response.go +++ b/PROJECTS/beginner/canary-token-generator/backend/internal/core/response.go @@ -1,4 +1,4 @@ -// AngelaMos | 2026 +// ©AngelaMos | 2026 // response.go package core diff --git a/PROJECTS/beginner/canary-token-generator/backend/internal/core/security.go b/PROJECTS/beginner/canary-token-generator/backend/internal/core/security.go index 05065e1a..9ea12e3b 100644 --- a/PROJECTS/beginner/canary-token-generator/backend/internal/core/security.go +++ b/PROJECTS/beginner/canary-token-generator/backend/internal/core/security.go @@ -1,4 +1,4 @@ -// AngelaMos | 2026 +// ©AngelaMos | 2026 // security.go package core diff --git a/PROJECTS/beginner/canary-token-generator/backend/internal/core/telemetry.go b/PROJECTS/beginner/canary-token-generator/backend/internal/core/telemetry.go index 16bfb56d..805e7fe5 100644 --- a/PROJECTS/beginner/canary-token-generator/backend/internal/core/telemetry.go +++ b/PROJECTS/beginner/canary-token-generator/backend/internal/core/telemetry.go @@ -1,4 +1,4 @@ -// AngelaMos | 2026 +// ©AngelaMos | 2026 // telemetry.go package core diff --git a/PROJECTS/beginner/canary-token-generator/backend/internal/core/validation.go b/PROJECTS/beginner/canary-token-generator/backend/internal/core/validation.go index f77cbd96..72cd326d 100644 --- a/PROJECTS/beginner/canary-token-generator/backend/internal/core/validation.go +++ b/PROJECTS/beginner/canary-token-generator/backend/internal/core/validation.go @@ -1,4 +1,4 @@ -// AngelaMos | 2026 +// ©AngelaMos | 2026 // validation.go package core diff --git a/PROJECTS/beginner/canary-token-generator/backend/internal/event/repository.go b/PROJECTS/beginner/canary-token-generator/backend/internal/event/repository.go index 0fead69f..3cddf611 100644 --- a/PROJECTS/beginner/canary-token-generator/backend/internal/event/repository.go +++ b/PROJECTS/beginner/canary-token-generator/backend/internal/event/repository.go @@ -16,6 +16,8 @@ import ( var ErrNotFound = errors.New("event not found") +const defaultListLimit = 20 + type Repository struct { db *sqlx.DB } @@ -77,7 +79,7 @@ func (r *Repository) ListByToken( ctx context.Context, tokenID string, opts ListOptions, ) (ListResult, error) { if opts.Limit <= 0 { - opts.Limit = 20 + opts.Limit = defaultListLimit } q := `SELECT ` + selectColumns + ` diff --git a/PROJECTS/beginner/canary-token-generator/backend/internal/event/repository_test.go b/PROJECTS/beginner/canary-token-generator/backend/internal/event/repository_test.go index f13abdc1..9d56390c 100644 --- a/PROJECTS/beginner/canary-token-generator/backend/internal/event/repository_test.go +++ b/PROJECTS/beginner/canary-token-generator/backend/internal/event/repository_test.go @@ -20,8 +20,6 @@ import ( "github.com/CarterPerez-dev/cybersecurity-projects/canary-token-generator/backend/internal/token" ) -func ptr[T any](v T) *T { return &v } - func newRepos(t *testing.T) (*sqlx.DB, *token.Repository, *event.Repository) { t.Helper() db := sqlx.NewDb(testutil.NewTestDB(t), "pgx") @@ -36,7 +34,7 @@ func seedToken(t *testing.T, repo *token.Repository, id string) *token.Token { Type: token.TypeWebbug, Memo: "event-test", AlertChannel: token.ChannelWebhook, - WebhookURL: ptr("https://example.com/hook"), + WebhookURL: testutil.Ptr("https://example.com/hook"), CreatedIP: "203.0.113.1", CreatedFP: "abcdef0123456789", Metadata: json.RawMessage(`{}`), @@ -80,7 +78,7 @@ func TestRepository_ListByToken_CursorPagination(t *testing.T) { e := &event.Event{ TokenID: tok.ID, SourceIP: "203.0.113.45", - UserAgent: ptr(string(rune('A' + i))), + UserAgent: testutil.Ptr(string(rune('A' + i))), } require.NoError(t, evtRepo.Insert(ctx, e)) } @@ -223,7 +221,7 @@ func TestRepository_PruneToLimit_KeepsNewest(t *testing.T) { var ids []int64 for i := range 5 { - e := &event.Event{TokenID: tok.ID, SourceIP: "203.0.113.45", UserAgent: ptr(string(rune('A' + i)))} + e := &event.Event{TokenID: tok.ID, SourceIP: "203.0.113.45", UserAgent: testutil.Ptr(string(rune('A' + i)))} require.NoError(t, evtRepo.Insert(ctx, e)) ids = append(ids, e.ID) time.Sleep(2 * time.Millisecond) diff --git a/PROJECTS/beginner/canary-token-generator/backend/internal/health/handler.go b/PROJECTS/beginner/canary-token-generator/backend/internal/health/handler.go index e7003c6a..e77793c6 100644 --- a/PROJECTS/beginner/canary-token-generator/backend/internal/health/handler.go +++ b/PROJECTS/beginner/canary-token-generator/backend/internal/health/handler.go @@ -1,4 +1,4 @@ -// AngelaMos | 2026 +// ©AngelaMos | 2026 // handler.go package health diff --git a/PROJECTS/beginner/canary-token-generator/backend/internal/middleware/headers.go b/PROJECTS/beginner/canary-token-generator/backend/internal/middleware/headers.go index 20ab3e2a..f138cc66 100644 --- a/PROJECTS/beginner/canary-token-generator/backend/internal/middleware/headers.go +++ b/PROJECTS/beginner/canary-token-generator/backend/internal/middleware/headers.go @@ -1,4 +1,4 @@ -// AngelaMos | 2026 +// ©AngelaMos | 2026 // headers.go package middleware diff --git a/PROJECTS/beginner/canary-token-generator/backend/internal/middleware/logging.go b/PROJECTS/beginner/canary-token-generator/backend/internal/middleware/logging.go index 602ed4c7..13935694 100644 --- a/PROJECTS/beginner/canary-token-generator/backend/internal/middleware/logging.go +++ b/PROJECTS/beginner/canary-token-generator/backend/internal/middleware/logging.go @@ -1,4 +1,4 @@ -// AngelaMos | 2026 +// ©AngelaMos | 2026 // logging.go package middleware diff --git a/PROJECTS/beginner/canary-token-generator/backend/internal/middleware/ratelimit.go b/PROJECTS/beginner/canary-token-generator/backend/internal/middleware/ratelimit.go index 4acd812a..c57f38e1 100644 --- a/PROJECTS/beginner/canary-token-generator/backend/internal/middleware/ratelimit.go +++ b/PROJECTS/beginner/canary-token-generator/backend/internal/middleware/ratelimit.go @@ -1,4 +1,4 @@ -// AngelaMos | 2026 +// ©AngelaMos | 2026 // ratelimit.go package middleware diff --git a/PROJECTS/beginner/canary-token-generator/backend/internal/middleware/request_id.go b/PROJECTS/beginner/canary-token-generator/backend/internal/middleware/request_id.go index 77d98165..5c645fea 100644 --- a/PROJECTS/beginner/canary-token-generator/backend/internal/middleware/request_id.go +++ b/PROJECTS/beginner/canary-token-generator/backend/internal/middleware/request_id.go @@ -1,4 +1,4 @@ -// AngelaMos | 2026 +// ©AngelaMos | 2026 // request_id.go package middleware diff --git a/PROJECTS/beginner/canary-token-generator/backend/internal/server/server.go b/PROJECTS/beginner/canary-token-generator/backend/internal/server/server.go index 2ebe0730..860e760d 100644 --- a/PROJECTS/beginner/canary-token-generator/backend/internal/server/server.go +++ b/PROJECTS/beginner/canary-token-generator/backend/internal/server/server.go @@ -1,4 +1,4 @@ -// AngelaMos | 2026 +// ©AngelaMos | 2026 // server.go package server diff --git a/PROJECTS/beginner/canary-token-generator/backend/internal/testutil/ptr.go b/PROJECTS/beginner/canary-token-generator/backend/internal/testutil/ptr.go new file mode 100644 index 00000000..e7830ca0 --- /dev/null +++ b/PROJECTS/beginner/canary-token-generator/backend/internal/testutil/ptr.go @@ -0,0 +1,6 @@ +// ©AngelaMos | 2026 +// ptr.go + +package testutil + +func Ptr[T any](v T) *T { return &v } diff --git a/PROJECTS/beginner/canary-token-generator/backend/internal/token/repository.go b/PROJECTS/beginner/canary-token-generator/backend/internal/token/repository.go index 95426a23..12f309b8 100644 --- a/PROJECTS/beginner/canary-token-generator/backend/internal/token/repository.go +++ b/PROJECTS/beginner/canary-token-generator/backend/internal/token/repository.go @@ -14,6 +14,8 @@ import ( var ErrNotFound = errors.New("token not found") +const defaultListLimit = 50 + type Repository struct { db *sqlx.DB } @@ -130,7 +132,7 @@ type ListOptions struct { func (r *Repository) ListAll(ctx context.Context, opts ListOptions) ([]Token, error) { if opts.Limit <= 0 { - opts.Limit = 50 + opts.Limit = defaultListLimit } q := `SELECT ` + selectColumns + ` FROM tokens ORDER BY created_at DESC diff --git a/PROJECTS/beginner/canary-token-generator/backend/internal/token/repository_test.go b/PROJECTS/beginner/canary-token-generator/backend/internal/token/repository_test.go index 68eaab98..3358a437 100644 --- a/PROJECTS/beginner/canary-token-generator/backend/internal/token/repository_test.go +++ b/PROJECTS/beginner/canary-token-generator/backend/internal/token/repository_test.go @@ -25,8 +25,6 @@ func newRepo(t *testing.T) *token.Repository { return token.NewRepository(db) } -func ptr[T any](v T) *T { return &v } - func sampleWebhookToken(id string) *token.Token { return &token.Token{ ID: id, @@ -34,7 +32,7 @@ func sampleWebhookToken(id string) *token.Token { Type: token.TypeWebbug, Memo: "test webbug", AlertChannel: token.ChannelWebhook, - WebhookURL: ptr("https://example.com/hook"), + WebhookURL: testutil.Ptr("https://example.com/hook"), CreatedIP: "203.0.113.10", CreatedFP: "0123456789abcdef", Metadata: json.RawMessage(`{}`), @@ -48,10 +46,10 @@ func sampleTelegramToken(id string) *token.Token { ManageID: uuid.New().String(), Type: token.TypeDocx, Memo: "Q4 bonuses", - Filename: ptr("Q4_Bonuses_2024.docx"), + Filename: testutil.Ptr("Q4_Bonuses_2024.docx"), AlertChannel: token.ChannelTelegram, - TelegramBot: ptr("123456:ABCDEF"), - TelegramChat: ptr("-1001234567890"), + TelegramBot: testutil.Ptr("123456:ABCDEF"), + TelegramChat: testutil.Ptr("-1001234567890"), CreatedIP: "198.51.100.5", CreatedFP: "fedcba9876543210", Metadata: json.RawMessage(`{"include_keys":["aws"]}`), diff --git a/PROJECTS/beginner/canary-token-generator/compose.yml b/PROJECTS/beginner/canary-token-generator/compose.yml index 1e0ccfc8..ed8bbfe5 100644 --- a/PROJECTS/beginner/canary-token-generator/compose.yml +++ b/PROJECTS/beginner/canary-token-generator/compose.yml @@ -42,7 +42,7 @@ services: dockerfile: ../infra/docker/canary.prod container_name: ${APP_NAME:-canary-token-generator}-canary environment: - - ENVIRONMENT=production + - APP_ENVIRONMENT=production - DATABASE_URL=postgres://canary:${POSTGRES_PASSWORD}@postgres:5432/canary?sslmode=disable - REDIS_URL=redis://redis:6379/0 - PUBLIC_BASE_URL=${PUBLIC_BASE_URL} diff --git a/PROJECTS/beginner/canary-token-generator/dev.compose.yml b/PROJECTS/beginner/canary-token-generator/dev.compose.yml index e1fdf07b..b3aa6c40 100644 --- a/PROJECTS/beginner/canary-token-generator/dev.compose.yml +++ b/PROJECTS/beginner/canary-token-generator/dev.compose.yml @@ -54,7 +54,7 @@ services: - canary_gocache:/root/.cache/go-build - canary_gomodcache:/go/pkg/mod environment: - - ENVIRONMENT=development + - APP_ENVIRONMENT=development - DATABASE_URL=postgres://canary:canary@postgres:5432/canary?sslmode=disable - REDIS_URL=redis://redis:6379/0 - PUBLIC_BASE_URL=${PUBLIC_BASE_URL:-http://localhost:58495} diff --git a/PROJECTS/beginner/canary-token-generator/frontend/.stylelintignore b/PROJECTS/beginner/canary-token-generator/frontend/.stylelintignore index 37da03e1..1ae0ac7c 100644 --- a/PROJECTS/beginner/canary-token-generator/frontend/.stylelintignore +++ b/PROJECTS/beginner/canary-token-generator/frontend/.stylelintignore @@ -1,4 +1,4 @@ -# ©AngelaMos | 2025 +# ©AngelaMos | 2026 # .stylelintignore # Dependencies diff --git a/PROJECTS/beginner/canary-token-generator/frontend/src/api/hooks/index.ts b/PROJECTS/beginner/canary-token-generator/frontend/src/api/hooks/index.ts index 6221af9a..88da7857 100644 --- a/PROJECTS/beginner/canary-token-generator/frontend/src/api/hooks/index.ts +++ b/PROJECTS/beginner/canary-token-generator/frontend/src/api/hooks/index.ts @@ -1,4 +1,4 @@ // =================== -// © AngelaMos | 2026 +// ©AngelaMos | 2026 // index.ts // =================== diff --git a/PROJECTS/beginner/canary-token-generator/frontend/src/api/index.ts b/PROJECTS/beginner/canary-token-generator/frontend/src/api/index.ts index 0840a7c1..5796616a 100644 --- a/PROJECTS/beginner/canary-token-generator/frontend/src/api/index.ts +++ b/PROJECTS/beginner/canary-token-generator/frontend/src/api/index.ts @@ -1,5 +1,5 @@ // =================== -// © AngelaMos | 2025 +// ©AngelaMos | 2026 // index.ts // =================== diff --git a/PROJECTS/beginner/canary-token-generator/frontend/src/api/types/index.ts b/PROJECTS/beginner/canary-token-generator/frontend/src/api/types/index.ts index 6221af9a..88da7857 100644 --- a/PROJECTS/beginner/canary-token-generator/frontend/src/api/types/index.ts +++ b/PROJECTS/beginner/canary-token-generator/frontend/src/api/types/index.ts @@ -1,4 +1,4 @@ // =================== -// © AngelaMos | 2026 +// ©AngelaMos | 2026 // index.ts // =================== diff --git a/PROJECTS/beginner/canary-token-generator/frontend/src/components/index.tsx b/PROJECTS/beginner/canary-token-generator/frontend/src/components/index.tsx index 6b0a7329..9f7eeadd 100644 --- a/PROJECTS/beginner/canary-token-generator/frontend/src/components/index.tsx +++ b/PROJECTS/beginner/canary-token-generator/frontend/src/components/index.tsx @@ -1,4 +1,4 @@ /** - * ©AngelaMos | 2025 + * ©AngelaMos | 2026 * index.tsx */ diff --git a/PROJECTS/beginner/canary-token-generator/frontend/src/config.ts b/PROJECTS/beginner/canary-token-generator/frontend/src/config.ts index 87c9647a..5013c41b 100644 --- a/PROJECTS/beginner/canary-token-generator/frontend/src/config.ts +++ b/PROJECTS/beginner/canary-token-generator/frontend/src/config.ts @@ -1,5 +1,5 @@ // =================== -// © AngelaMos | 2026 +// ©AngelaMos | 2026 // config.ts // =================== const API_VERSION = 'v1' diff --git a/PROJECTS/beginner/canary-token-generator/frontend/src/core/api/api.config.ts b/PROJECTS/beginner/canary-token-generator/frontend/src/core/api/api.config.ts index f48a4d08..45575e09 100644 --- a/PROJECTS/beginner/canary-token-generator/frontend/src/core/api/api.config.ts +++ b/PROJECTS/beginner/canary-token-generator/frontend/src/core/api/api.config.ts @@ -1,5 +1,5 @@ // =================== -// © AngelaMos | 2026 +// ©AngelaMos | 2026 // api.config.ts // =================== diff --git a/PROJECTS/beginner/canary-token-generator/frontend/src/core/api/errors.ts b/PROJECTS/beginner/canary-token-generator/frontend/src/core/api/errors.ts index fde5ec65..492672f6 100644 --- a/PROJECTS/beginner/canary-token-generator/frontend/src/core/api/errors.ts +++ b/PROJECTS/beginner/canary-token-generator/frontend/src/core/api/errors.ts @@ -1,5 +1,5 @@ /** - * ©AngelaMos | 2025 + * ©AngelaMos | 2026 * errors.ts */ diff --git a/PROJECTS/beginner/canary-token-generator/frontend/src/core/api/index.ts b/PROJECTS/beginner/canary-token-generator/frontend/src/core/api/index.ts index 1818cd7e..aa4ee3cb 100644 --- a/PROJECTS/beginner/canary-token-generator/frontend/src/core/api/index.ts +++ b/PROJECTS/beginner/canary-token-generator/frontend/src/core/api/index.ts @@ -1,5 +1,5 @@ // =================== -// © AngelaMos | 2025 +// ©AngelaMos | 2026 // index.ts // =================== diff --git a/PROJECTS/beginner/canary-token-generator/frontend/src/core/api/query.config.ts b/PROJECTS/beginner/canary-token-generator/frontend/src/core/api/query.config.ts index 8244b22d..eb4326f1 100644 --- a/PROJECTS/beginner/canary-token-generator/frontend/src/core/api/query.config.ts +++ b/PROJECTS/beginner/canary-token-generator/frontend/src/core/api/query.config.ts @@ -1,5 +1,5 @@ // =================== -// © AngelaMos | 2025 +// ©AngelaMos | 2026 // query.config.ts // =================== diff --git a/PROJECTS/beginner/canary-token-generator/frontend/src/core/app/routers.tsx b/PROJECTS/beginner/canary-token-generator/frontend/src/core/app/routers.tsx index d17138ce..58f7c319 100644 --- a/PROJECTS/beginner/canary-token-generator/frontend/src/core/app/routers.tsx +++ b/PROJECTS/beginner/canary-token-generator/frontend/src/core/app/routers.tsx @@ -1,5 +1,5 @@ // =================== -// © AngelaMos | 2026 +// ©AngelaMos | 2026 // routers.tsx // =================== diff --git a/PROJECTS/beginner/canary-token-generator/frontend/src/core/app/shell.module.scss b/PROJECTS/beginner/canary-token-generator/frontend/src/core/app/shell.module.scss index 3466896a..46687aef 100644 --- a/PROJECTS/beginner/canary-token-generator/frontend/src/core/app/shell.module.scss +++ b/PROJECTS/beginner/canary-token-generator/frontend/src/core/app/shell.module.scss @@ -1,4 +1,4 @@ // =================== -// © AngelaMos | 2026 +// ©AngelaMos | 2026 // shell.module.scss // =================== diff --git a/PROJECTS/beginner/canary-token-generator/frontend/src/core/app/toast.module.scss b/PROJECTS/beginner/canary-token-generator/frontend/src/core/app/toast.module.scss index 62a8ee32..62e90ee9 100644 --- a/PROJECTS/beginner/canary-token-generator/frontend/src/core/app/toast.module.scss +++ b/PROJECTS/beginner/canary-token-generator/frontend/src/core/app/toast.module.scss @@ -1,4 +1,4 @@ // =================== -// © AngelaMos | 2026 +// ©AngelaMos | 2026 // toast.module.scss // =================== diff --git a/PROJECTS/beginner/canary-token-generator/frontend/src/core/lib/index.ts b/PROJECTS/beginner/canary-token-generator/frontend/src/core/lib/index.ts index cdee46e2..fddc1db7 100644 --- a/PROJECTS/beginner/canary-token-generator/frontend/src/core/lib/index.ts +++ b/PROJECTS/beginner/canary-token-generator/frontend/src/core/lib/index.ts @@ -1,5 +1,5 @@ // =================== -// © AngelaMos | 2026 +// ©AngelaMos | 2026 // index.ts // =================== diff --git a/PROJECTS/beginner/canary-token-generator/frontend/src/core/lib/shell.ui.store.ts b/PROJECTS/beginner/canary-token-generator/frontend/src/core/lib/shell.ui.store.ts index d601a53b..7b81a71c 100644 --- a/PROJECTS/beginner/canary-token-generator/frontend/src/core/lib/shell.ui.store.ts +++ b/PROJECTS/beginner/canary-token-generator/frontend/src/core/lib/shell.ui.store.ts @@ -1,5 +1,5 @@ /** - * ©AngelaMos | 2025 + * ©AngelaMos | 2026 * ui.store.ts */ diff --git a/PROJECTS/beginner/canary-token-generator/frontend/src/main.tsx b/PROJECTS/beginner/canary-token-generator/frontend/src/main.tsx index 1b1f2c8a..ac319510 100644 --- a/PROJECTS/beginner/canary-token-generator/frontend/src/main.tsx +++ b/PROJECTS/beginner/canary-token-generator/frontend/src/main.tsx @@ -1,5 +1,5 @@ // =========================== -// ©AngelaMos | 2025 +// ©AngelaMos | 2026 // main.tsx // =========================== diff --git a/PROJECTS/beginner/canary-token-generator/frontend/src/pages/dashboard/dashboard.module.scss b/PROJECTS/beginner/canary-token-generator/frontend/src/pages/dashboard/dashboard.module.scss index cbf1f90a..13c333f1 100644 --- a/PROJECTS/beginner/canary-token-generator/frontend/src/pages/dashboard/dashboard.module.scss +++ b/PROJECTS/beginner/canary-token-generator/frontend/src/pages/dashboard/dashboard.module.scss @@ -1,4 +1,4 @@ // =================== -// © AngelaMos | 2026 +// ©AngelaMos | 2026 // dashboard.module.scss // =================== diff --git a/PROJECTS/beginner/canary-token-generator/frontend/src/pages/landing/index.tsx b/PROJECTS/beginner/canary-token-generator/frontend/src/pages/landing/index.tsx index 7ec81be5..b0537d42 100644 --- a/PROJECTS/beginner/canary-token-generator/frontend/src/pages/landing/index.tsx +++ b/PROJECTS/beginner/canary-token-generator/frontend/src/pages/landing/index.tsx @@ -1,5 +1,5 @@ // =================== -// © AngelaMos | 2026 +// ©AngelaMos | 2026 // index.tsx // =================== diff --git a/PROJECTS/beginner/canary-token-generator/frontend/src/pages/landing/landing.module.scss b/PROJECTS/beginner/canary-token-generator/frontend/src/pages/landing/landing.module.scss index 164f39a0..25d0641c 100644 --- a/PROJECTS/beginner/canary-token-generator/frontend/src/pages/landing/landing.module.scss +++ b/PROJECTS/beginner/canary-token-generator/frontend/src/pages/landing/landing.module.scss @@ -1,4 +1,4 @@ // =================== -// © AngelaMos | 2026 +// ©AngelaMos | 2026 // landing.module.scss // =================== diff --git a/PROJECTS/beginner/canary-token-generator/frontend/src/pages/settings/settings.module.scss b/PROJECTS/beginner/canary-token-generator/frontend/src/pages/settings/settings.module.scss index e95e0f88..44cc7af6 100644 --- a/PROJECTS/beginner/canary-token-generator/frontend/src/pages/settings/settings.module.scss +++ b/PROJECTS/beginner/canary-token-generator/frontend/src/pages/settings/settings.module.scss @@ -1,4 +1,4 @@ // =================== -// © AngelaMos | 2026 +// ©AngelaMos | 2026 // settings.module.scss // =================== diff --git a/PROJECTS/beginner/canary-token-generator/frontend/src/styles.scss b/PROJECTS/beginner/canary-token-generator/frontend/src/styles.scss index 240ec555..0881c47d 100644 --- a/PROJECTS/beginner/canary-token-generator/frontend/src/styles.scss +++ b/PROJECTS/beginner/canary-token-generator/frontend/src/styles.scss @@ -1,5 +1,5 @@ // =================== -// © AngelaMos | 2026 +// ©AngelaMos | 2026 // styles.scss // =================== diff --git a/PROJECTS/beginner/canary-token-generator/frontend/src/styles/_fonts.scss b/PROJECTS/beginner/canary-token-generator/frontend/src/styles/_fonts.scss index 4f517884..268e9b70 100644 --- a/PROJECTS/beginner/canary-token-generator/frontend/src/styles/_fonts.scss +++ b/PROJECTS/beginner/canary-token-generator/frontend/src/styles/_fonts.scss @@ -1,5 +1,5 @@ // =================== -// © AngelaMos | 2025 +// ©AngelaMos | 2026 // _fonts.scss // =================== diff --git a/PROJECTS/beginner/canary-token-generator/frontend/src/styles/_index.scss b/PROJECTS/beginner/canary-token-generator/frontend/src/styles/_index.scss index ac5a8266..357b9ada 100644 --- a/PROJECTS/beginner/canary-token-generator/frontend/src/styles/_index.scss +++ b/PROJECTS/beginner/canary-token-generator/frontend/src/styles/_index.scss @@ -1,5 +1,5 @@ // =================== -// © AngelaMos | 2025 +// ©AngelaMos | 2026 // _index.scss // =================== diff --git a/PROJECTS/beginner/canary-token-generator/frontend/src/styles/_mixins.scss b/PROJECTS/beginner/canary-token-generator/frontend/src/styles/_mixins.scss index 6b5b1ba9..b7f96677 100644 --- a/PROJECTS/beginner/canary-token-generator/frontend/src/styles/_mixins.scss +++ b/PROJECTS/beginner/canary-token-generator/frontend/src/styles/_mixins.scss @@ -1,5 +1,5 @@ // =================== -// © AngelaMos | 2025 +// ©AngelaMos | 2026 // _mixins.scss // =================== diff --git a/PROJECTS/beginner/canary-token-generator/frontend/src/styles/_reset.scss b/PROJECTS/beginner/canary-token-generator/frontend/src/styles/_reset.scss index a9cbdc17..51c3237b 100644 --- a/PROJECTS/beginner/canary-token-generator/frontend/src/styles/_reset.scss +++ b/PROJECTS/beginner/canary-token-generator/frontend/src/styles/_reset.scss @@ -1,5 +1,5 @@ // =================== -// © AngelaMos | 2026 +// ©AngelaMos | 2026 // _reset.scss // =================== diff --git a/PROJECTS/beginner/canary-token-generator/frontend/src/styles/_tokens.scss b/PROJECTS/beginner/canary-token-generator/frontend/src/styles/_tokens.scss index be1f6dd6..4eda05cc 100644 --- a/PROJECTS/beginner/canary-token-generator/frontend/src/styles/_tokens.scss +++ b/PROJECTS/beginner/canary-token-generator/frontend/src/styles/_tokens.scss @@ -1,5 +1,5 @@ // =================== -// © AngelaMos | 2025 +// ©AngelaMos | 2026 // _tokens.scss // =================== diff --git a/PROJECTS/beginner/canary-token-generator/frontend/stylelint.config.js b/PROJECTS/beginner/canary-token-generator/frontend/stylelint.config.js index 56ebd7bc..5f8c2eb2 100644 --- a/PROJECTS/beginner/canary-token-generator/frontend/stylelint.config.js +++ b/PROJECTS/beginner/canary-token-generator/frontend/stylelint.config.js @@ -1,4 +1,4 @@ -// ©AngelaMos | 2025 +// ©AngelaMos | 2026 // stylelint.config.js /** @type {import('stylelint').Config} */ diff --git a/PROJECTS/beginner/canary-token-generator/frontend/vite.config.ts b/PROJECTS/beginner/canary-token-generator/frontend/vite.config.ts index a8d5d478..a4ad5b31 100644 --- a/PROJECTS/beginner/canary-token-generator/frontend/vite.config.ts +++ b/PROJECTS/beginner/canary-token-generator/frontend/vite.config.ts @@ -1,5 +1,5 @@ /** - * ©AngelaMos | 2025 + * ©AngelaMos | 2026 * vite.config.ts */ diff --git a/PROJECTS/beginner/canary-token-generator/infra/nginx/dev.nginx b/PROJECTS/beginner/canary-token-generator/infra/nginx/dev.nginx index 7ea1f6ec..b4e28a16 100644 --- a/PROJECTS/beginner/canary-token-generator/infra/nginx/dev.nginx +++ b/PROJECTS/beginner/canary-token-generator/infra/nginx/dev.nginx @@ -1,5 +1,5 @@ # ============================================================================= -# AngelaMos | 2026 +# ©AngelaMos | 2026 # dev.nginx # ============================================================================= # Development server block: proxies to Vite dev server with HMR diff --git a/PROJECTS/beginner/canary-token-generator/infra/nginx/nginx.conf b/PROJECTS/beginner/canary-token-generator/infra/nginx/nginx.conf index eddade54..6b3fc970 100644 --- a/PROJECTS/beginner/canary-token-generator/infra/nginx/nginx.conf +++ b/PROJECTS/beginner/canary-token-generator/infra/nginx/nginx.conf @@ -1,4 +1,4 @@ -# AngelaMos | 2026 +# ©AngelaMos | 2026 # nginx.conf # Development nginx configuration diff --git a/PROJECTS/beginner/canary-token-generator/infra/nginx/nginx.prod.conf b/PROJECTS/beginner/canary-token-generator/infra/nginx/nginx.prod.conf index f73ad69b..0bedf916 100644 --- a/PROJECTS/beginner/canary-token-generator/infra/nginx/nginx.prod.conf +++ b/PROJECTS/beginner/canary-token-generator/infra/nginx/nginx.prod.conf @@ -1,4 +1,4 @@ -# AngelaMos | 2026 +# ©AngelaMos | 2026 # nginx.prod.conf # Production nginx configuration diff --git a/PROJECTS/beginner/canary-token-generator/infra/nginx/prod.nginx b/PROJECTS/beginner/canary-token-generator/infra/nginx/prod.nginx index f6a747ef..29db53b0 100644 --- a/PROJECTS/beginner/canary-token-generator/infra/nginx/prod.nginx +++ b/PROJECTS/beginner/canary-token-generator/infra/nginx/prod.nginx @@ -1,5 +1,5 @@ # ============================================================================= -# AngelaMos | 2026 +# ©AngelaMos | 2026 # prod.nginx # ============================================================================= # Production server block: serves built static files diff --git a/PROJECTS/beginner/canary-token-generator/scripts/randomize-ports.sh b/PROJECTS/beginner/canary-token-generator/scripts/randomize-ports.sh index 95348d01..d0337938 100755 --- a/PROJECTS/beginner/canary-token-generator/scripts/randomize-ports.sh +++ b/PROJECTS/beginner/canary-token-generator/scripts/randomize-ports.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash # ============================================================================= -# AngelaMos | 2026 +# ©AngelaMos | 2026 # randomize-ports.sh # ============================================================================= # Picks 4 unique random ports (10000-65000) and updates: