Skip to content

Commit caf6ee2

Browse files
Merge pull request #281 from LerianStudio/fix/update-lib-commons-v3-to-v4
2 parents bc89831 + f24228b commit caf6ee2

File tree

8 files changed

+92
-85
lines changed

8 files changed

+92
-85
lines changed

dev-team/agents/backend-engineer-golang.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,7 @@ MUST: Be bound to all sections in [standards-coverage-table.md](../skills/shared
305305
| New feature (full) | core.md, bootstrap.md, domain.md, quality.md | Covers most patterns |
306306
| Auth implementation | core.md, security.md | Auth-specific |
307307
| Add tracing | bootstrap.md | Observability focus |
308-
| Multi-tenant implementation | multi-tenant.md, bootstrap.md | Tenant Manager, JWT, lib-commons v3 |
308+
| Multi-tenant implementation | multi-tenant.md, bootstrap.md | Tenant Manager, JWT, lib-commons v4 |
309309
| Idempotency | idempotency.md, domain.md | Redis SetNX, tenant-aware keys |
310310
| Messaging / RabbitMQ | messaging.md, bootstrap.md | Worker pattern, reconnection strategy |
311311
| Testing | quality.md | Test patterns |

dev-team/docs/standards/golang/multi-tenant.md

Lines changed: 42 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,14 @@ This module covers multi-tenant patterns with Tenant Manager.
2929

3030
**Existence ≠ Compliance.** A service that has "some multi-tenant code" is NOT considered multi-tenant unless every component matches the canonical patterns defined in this document exactly.
3131

32-
MUST replace multi-tenant implementations that use custom middleware, manual DB switching, non-standard env var names, or any mechanism other than the lib-commons v3 tenant-manager sub-packages — they are **non-compliant**. Not patched, not adapted, **replaced**.
32+
MUST replace multi-tenant implementations that use custom middleware, manual DB switching, non-standard env var names, or any mechanism other than the lib-commons v4 tenant-manager sub-packages — they are **non-compliant**. Not patched, not adapted, **replaced**.
3333

3434
The only valid multi-tenant implementation uses:
35-
- `tenantId` from JWT via `TenantMiddleware` or `MultiPoolMiddleware` (from `lib-commons/v3/commons/tenant-manager/middleware`), registered per-route using a local `WhenEnabled` helper
36-
- `core.ResolvePostgres` / `core.ResolveMongo` / `core.ResolveModuleDB` for database resolution (from `lib-commons/v3/commons/tenant-manager/core`)
37-
- `valkey.GetKeyFromContext` for Redis key prefixing (from `lib-commons/v3/commons/tenant-manager/valkey`)
38-
- `s3.GetObjectStorageKeyForTenant` for S3 key prefixing (from `lib-commons/v3/commons/tenant-manager/s3`)
39-
- `tmrabbitmq.Manager` for RabbitMQ vhost isolation (from `lib-commons/v3/commons/tenant-manager/rabbitmq`)
35+
- `tenantId` from JWT via `TenantMiddleware` or `MultiPoolMiddleware` (from `lib-commons/v4/commons/tenant-manager/middleware`), registered per-route using a local `WhenEnabled` helper
36+
- `core.ResolvePostgres` / `core.ResolveMongo` / `core.ResolveModuleDB` for database resolution (from `lib-commons/v4/commons/tenant-manager/core`)
37+
- `valkey.GetKeyFromContext` for Redis key prefixing (from `lib-commons/v4/commons/tenant-manager/valkey`)
38+
- `s3.GetObjectStorageKeyForTenant` for S3 key prefixing (from `lib-commons/v4/commons/tenant-manager/s3`)
39+
- `tmrabbitmq.Manager` for RabbitMQ vhost isolation (from `lib-commons/v4/commons/tenant-manager/rabbitmq`)
4040
- The 8 canonical `MULTI_TENANT_*` environment variables with correct names and defaults
4141
- `client.WithCircuitBreaker` on the Tenant Manager HTTP client
4242
- `client.WithServiceAPIKey` on the Tenant Manager HTTP client for `/settings` endpoint authentication
@@ -53,7 +53,7 @@ These are the only files that require multi-tenant changes. The exact paths foll
5353

5454
| File | Gate | What Changes |
5555
|------|------|-------------|
56-
| `go.mod` | 2 | lib-commons v3, lib-auth v2 |
56+
| `go.mod` | 2 | lib-commons v4, lib-auth v2 |
5757
| `internal/bootstrap/config.go` | 3 | 8 canonical `MULTI_TENANT_*` env vars in Config struct |
5858
| `internal/bootstrap/service.go` (or equivalent init file) | 4 | Conditional initialization: Tenant Manager client, connection managers, middleware creation. Branch on `cfg.MultiTenantEnabled` |
5959
| `internal/bootstrap/routes.go` (or equivalent router file) | 4 | Per-route composition via `WhenEnabled(ttHandler)` — auth validates JWT before tenant resolves DB. Each project implements the `WhenEnabled` helper locally. See [Route-Level Auth-Before-Tenant Ordering](#route-level-auth-before-tenant-ordering-mandatory) |
@@ -96,31 +96,38 @@ These are the only files that require multi-tenant changes. The exact paths foll
9696
| `docs/multi-tenant-guide.md` | Activation guide: env vars, how to enable/disable, verification steps |
9797
| `docs/multi-tenant-preview.html` | Visual implementation preview (generated at Gate 1.5, kept for reference) |
9898

99-
**HARD GATE: Files outside this map that contain multi-tenant logic are non-compliant.** If a service has custom files like `internal/tenant/resolver.go`, `internal/middleware/tenant_middleware.go`, `pkg/multitenancy/pool.go` or similar — these MUST be removed and replaced with the canonical lib-commons v3 tenant-manager sub-packages wired through the files listed above.
99+
**HARD GATE: Files outside this map that contain multi-tenant logic are non-compliant.** If a service has custom files like `internal/tenant/resolver.go`, `internal/middleware/tenant_middleware.go`, `pkg/multitenancy/pool.go` or similar — these MUST be removed and replaced with the canonical lib-commons v4 tenant-manager sub-packages wired through the files listed above.
100100

101101
### Required lib-commons Version
102102

103-
Multi-tenant support requires **lib-commons v3** (`github.com/LerianStudio/lib-commons/v3`). The `tenant-manager` package does not exist in v2.
103+
Multi-tenant support requires **lib-commons v4** (`github.com/LerianStudio/lib-commons/v4`). The `tenant-manager` package does not exist in v2.
104104

105105
| lib-commons version | Multi-tenant support | Package path |
106106
|--------------------|-----------------------|-------------|
107107
| **v2** (`lib-commons/v2`) | Not available | N/A — no `tenant-manager` package |
108-
| **v3** (`lib-commons/v3`) | Full support | `github.com/LerianStudio/lib-commons/v3/commons/tenant-manager/...` (sub-packages: `core`, `client`, `postgres`, `mongo`, `middleware`, `rabbitmq`, `consumer`, `valkey`, `s3`). The `middleware` sub-package contains both `TenantMiddleware` (single-module) and `MultiPoolMiddleware` (multi-module). Route-level composition uses a local `WhenEnabled` helper (not from lib-commons). |
108+
| **v3** (`lib-commons/v3`) | Legacy | Same sub-packages as v4 but without `tenant-manager/cache`. Upgrade to v4. |
109+
| **v4** (`lib-commons/v4`) | Full support (current) | `github.com/LerianStudio/lib-commons/v4/commons/tenant-manager/...` (sub-packages: `core`, `client`, `cache`, `postgres`, `mongo`, `middleware`, `rabbitmq`, `consumer`, `valkey`, `s3`). The `middleware` sub-package contains both `TenantMiddleware` (single-module) and `MultiPoolMiddleware` (multi-module). Route-level composition uses a local `WhenEnabled` helper (not from lib-commons). |
109110

110-
**Migration from v2 to v3:**
111+
**Migration to v4:**
111112

112-
Services currently on lib-commons v2 MUST upgrade to v3 before implementing multi-tenant. The upgrade involves:
113+
Services on lib-commons v2 or v3 MUST upgrade to v4 before implementing multi-tenant. The upgrade involves:
113114

114-
1. Update `go.mod`: `github.com/LerianStudio/lib-commons/v2` -> `github.com/LerianStudio/lib-commons/v3`
115-
2. Update all import paths: `lib-commons/v2/commons/...` -> `lib-commons/v3/commons/...`
115+
1. Update `go.mod` to the latest v4 tag (currently beta — use latest beta until stable is released)
116+
2. Update all import paths to v4
116117
3. Add the `tenant-manager` package imports where needed
117118

118119
```bash
119-
# Update go.mod
120-
go get github.com/LerianStudio/lib-commons/v3@latest
120+
# Check latest v4 tag
121+
git ls-remote --tags https://github.com/LerianStudio/lib-commons.git | grep "v4" | sort -V | tail -1
122+
123+
# Update go.mod (use latest beta until stable is released)
124+
go get github.com/LerianStudio/lib-commons/v4@v4.1.0-beta.4
121125

122126
# Update import paths across the codebase (portable — works on macOS and Linux)
123-
find . -name "*.go" -exec perl -pi -e 's|lib-commons/v2|lib-commons/v3|g' {} +
127+
# From v2:
128+
find . -name "*.go" -exec perl -pi -e 's|lib-commons/v2|lib-commons/v4|g' {} +
129+
# From v3:
130+
find . -name "*.go" -exec perl -pi -e 's|lib-commons/v3|lib-commons/v4|g' {} +
124131

125132
# Verify build
126133
go build ./...
@@ -355,10 +362,10 @@ func extractTenantIDFromToken(c *fiber.Ctx) (string, error) {
355362
```go
356363
// internal/bootstrap/config.go
357364
import (
358-
"github.com/LerianStudio/lib-commons/v3/commons/tenant-manager/client"
359-
tmpostgres "github.com/LerianStudio/lib-commons/v3/commons/tenant-manager/postgres"
360-
tmmongo "github.com/LerianStudio/lib-commons/v3/commons/tenant-manager/mongo"
361-
"github.com/LerianStudio/lib-commons/v3/commons/tenant-manager/middleware"
365+
"github.com/LerianStudio/lib-commons/v4/commons/tenant-manager/client"
366+
tmpostgres "github.com/LerianStudio/lib-commons/v4/commons/tenant-manager/postgres"
367+
tmmongo "github.com/LerianStudio/lib-commons/v4/commons/tenant-manager/mongo"
368+
"github.com/LerianStudio/lib-commons/v4/commons/tenant-manager/middleware"
362369
)
363370

364371
func initService(cfg *Config) {
@@ -423,8 +430,8 @@ func initService(cfg *Config) {
423430

424431
```go
425432
import (
426-
"github.com/LerianStudio/lib-commons/v3/commons/tenant-manager/core"
427-
"github.com/LerianStudio/lib-commons/v3/commons/tenant-manager/valkey"
433+
"github.com/LerianStudio/lib-commons/v4/commons/tenant-manager/core"
434+
"github.com/LerianStudio/lib-commons/v4/commons/tenant-manager/valkey"
428435
)
429436

430437
// Single-module service: use generic getter
@@ -451,7 +458,7 @@ tenantID := core.GetTenantID(ctx)
451458

452459
```go
453460
import (
454-
tmmiddleware "github.com/LerianStudio/lib-commons/v3/commons/tenant-manager/middleware"
461+
tmmiddleware "github.com/LerianStudio/lib-commons/v4/commons/tenant-manager/middleware"
455462
)
456463
```
457464

@@ -481,7 +488,7 @@ import (
481488
```go
482489
// config.go - Multi-module service (e.g., unified ledger with onboarding + transaction)
483490
import (
484-
tmmiddleware "github.com/LerianStudio/lib-commons/v3/commons/tenant-manager/middleware"
491+
tmmiddleware "github.com/LerianStudio/lib-commons/v4/commons/tenant-manager/middleware"
485492
)
486493

487494
transactionPaths := []string{"/transactions", "/operations", "/balances", "/asset-rates"}
@@ -515,7 +522,7 @@ multiMid := tmmiddleware.NewMultiPoolMiddleware(
515522
**In repositories for multi-module services, use module-scoped getters:**
516523

517524
```go
518-
import "github.com/LerianStudio/lib-commons/v3/commons/tenant-manager/core"
525+
import "github.com/LerianStudio/lib-commons/v4/commons/tenant-manager/core"
519526

520527
// Multi-module: use module-specific getter
521528
db, err := core.ResolveModuleDB(ctx, "transaction", r.connection)
@@ -528,7 +535,7 @@ db, err := core.ResolveModuleDB(ctx, "onboarding", r.connection)
528535
// config.go - Single-module service (e.g., CRM, plugin, reporter)
529536
// Just use TenantMiddleware directly — no need for MultiPoolMiddleware
530537
import (
531-
tmmiddleware "github.com/LerianStudio/lib-commons/v3/commons/tenant-manager/middleware"
538+
tmmiddleware "github.com/LerianStudio/lib-commons/v4/commons/tenant-manager/middleware"
532539
)
533540

534541
ttMid := tmmiddleware.NewTenantMiddleware(
@@ -559,7 +566,7 @@ ttMid := tmmiddleware.NewTenantMiddleware(
559566
The `ConsumerTrigger` interface is defined in the lib-commons middleware package. Services that process messages in multi-tenant mode implement this interface and pass it to the middleware for lazy consumer activation.
560567

561568
```go
562-
// Defined in github.com/LerianStudio/lib-commons/v3/commons/tenant-manager/middleware
569+
// Defined in github.com/LerianStudio/lib-commons/v4/commons/tenant-manager/middleware
563570
type ConsumerTrigger interface {
564571
EnsureConsumerStarted(ctx context.Context, tenantID string)
565572
}
@@ -572,7 +579,7 @@ The middleware calls `EnsureConsumerStarted` after extracting the tenant ID. The
572579
The `ErrorMapper` type lets you customize how tenant-manager errors are converted into HTTP responses. When not set, the built-in default mapper handles standard cases (401, 403, 404, 503).
573580

574581
```go
575-
// Defined in github.com/LerianStudio/lib-commons/v3/commons/tenant-manager/middleware
582+
// Defined in github.com/LerianStudio/lib-commons/v4/commons/tenant-manager/middleware
576583
type ErrorMapper func(c *fiber.Ctx, err error, tenantID string) error
577584
```
578585

@@ -1247,8 +1254,8 @@ For `ConsumerTrigger` interface definition and usage, see [ConsumerTrigger inter
12471254

12481255
| Rationalization | Why It's WRONG | Required Action |
12491256
|-----------------|----------------|-----------------|
1250-
| "Service already has multi-tenant code" | Existence ≠ compliance. Code that doesn't match the Ring canonical model (lib-commons v3 tenant-manager sub-packages) is non-compliant and MUST be replaced entirely. | **STOP. Run compliance audit against this document. Replace every non-compliant component.** |
1251-
| "Our custom multi-tenant approach works" | Working ≠ compliant. Custom implementations create drift, block lib-commons upgrades, prevent standardized tooling, and cannot be validated by automated compliance checks. | **STOP. Replace with canonical lib-commons v3 implementation.** |
1257+
| "Service already has multi-tenant code" | Existence ≠ compliance. Code that doesn't match the Ring canonical model (lib-commons v4 tenant-manager sub-packages) is non-compliant and MUST be replaced entirely. | **STOP. Run compliance audit against this document. Replace every non-compliant component.** |
1258+
| "Our custom multi-tenant approach works" | Working ≠ compliant. Custom implementations create drift, block lib-commons upgrades, prevent standardized tooling, and cannot be validated by automated compliance checks. | **STOP. Replace with canonical lib-commons v4 implementation.** |
12521259
| "Just need to adapt/patch the existing code" | Non-standard implementations cannot be patched into compliance. The patterns are structurally different (context-based resolution vs static connections, lib-commons middleware vs custom middleware). | **STOP. Replace, do not patch.** |
12531260
| "We only have one customer" | Requirements change. Multi-tenant is easy to add now, hard later. | **Design for multi-tenant, deploy as single** |
12541261
| "Tenant Manager adds complexity" | Complexity is in connection management anyway. Tenant Manager standardizes it. | **Use Tenant Manager for multi-tenant** |
@@ -1911,7 +1918,7 @@ When `MULTI_TENANT_ENABLED=true`, each tenant has its own M2M credentials stored
19111918

19121919
```go
19131920
import (
1914-
secretsmanager "github.com/LerianStudio/lib-commons/v3/commons/secretsmanager"
1921+
secretsmanager "github.com/LerianStudio/lib-commons/v4/commons/secretsmanager"
19151922
)
19161923
```
19171924

@@ -1953,7 +1960,7 @@ import (
19531960

19541961
awsconfig "github.com/aws/aws-sdk-go-v2/config"
19551962
awssm "github.com/aws/aws-sdk-go-v2/service/secretsmanager"
1956-
secretsmanager "github.com/LerianStudio/lib-commons/v3/commons/secretsmanager"
1963+
secretsmanager "github.com/LerianStudio/lib-commons/v4/commons/secretsmanager"
19571964
)
19581965

19591966
// FetchCredentials retrieves M2M credentials from AWS Secrets Manager for a specific tenant.
@@ -1987,7 +1994,7 @@ import (
19871994
"sync"
19881995
"time"
19891996

1990-
secretsmanager "github.com/LerianStudio/lib-commons/v3/commons/secretsmanager"
1997+
secretsmanager "github.com/LerianStudio/lib-commons/v4/commons/secretsmanager"
19911998
)
19921999

19932000
type cachedCredentials struct {
@@ -2151,7 +2158,7 @@ The `secretsmanager` package provides sentinel errors for precise error handling
21512158
```go
21522159
import (
21532160
"errors"
2154-
secretsmanager "github.com/LerianStudio/lib-commons/v3/commons/secretsmanager"
2161+
secretsmanager "github.com/LerianStudio/lib-commons/v4/commons/secretsmanager"
21552162
)
21562163

21572164
creds, err := secretsmanager.GetM2MCredentials(ctx, client, env, tenantOrgID, appName, target)

dev-team/skills/dev-cycle/SKILL.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1782,7 +1782,7 @@ detected_dependencies = []
17821782
### ⛔ MANDATORY: Multi-Tenant Detection & Compliance Audit
17831783
17841784
<cannot_skip>
1785-
MANDATORY: Multi-tenant dual-mode applies to all Go services (no exceptions). Gate 0 implements dual-mode from the start using lib-commons v3 resolvers. Gate 0.5G verifies compliance. This detection captures the CURRENT state of the codebase for context.
1785+
MANDATORY: Multi-tenant dual-mode applies to all Go services (no exceptions). Gate 0 implements dual-mode from the start using lib-commons v4 resolvers. Gate 0.5G verifies compliance. This detection captures the CURRENT state of the codebase for context.
17861786
17871787
See [multi-tenant.md](../../docs/standards/golang/multi-tenant.md) for the canonical model and [dev-delivery-verification](../dev-delivery-verification/SKILL.md) Step 3.5G for the verification checks.
17881788
</cannot_skip>

dev-team/skills/dev-delivery-verification/SKILL.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -560,7 +560,7 @@ fi
560560
#### G. Multi-Tenant Dual-Mode Verification (Go backend only)
561561
**Reference:** [multi-tenant.md](../../docs/standards/golang/multi-tenant.md), [dev-multi-tenant SKILL.md § Sub-Package Import Reference](../dev-multi-tenant/SKILL.md)
562562

563-
This check only applies to Go backend services. It verifies that all resource access uses lib-commons v3 resolvers (which work transparently in both single-tenant and multi-tenant mode).
563+
This check only applies to Go backend services. It verifies that all resource access uses lib-commons v4 resolvers (which work transparently in both single-tenant and multi-tenant mode).
564564

565565
```bash
566566
# Step G.1: Detect if this is a Go project

dev-team/skills/dev-implementation/SKILL.md

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -397,26 +397,26 @@ Task:
397397
### TypeScript
398398
URL: `https://raw.githubusercontent.com/LerianStudio/ring/main/dev-team/docs/standards/typescript.md`
399399
400-
Multi-Tenant: Implement DUAL-MODE from the start. Use lib-commons v3 resolvers for ALL resources.
400+
Multi-Tenant: Implement DUAL-MODE from the start. Use lib-commons v4 resolvers for ALL resources.
401401
WebFetch: `https://raw.githubusercontent.com/LerianStudio/ring/main/dev-team/docs/standards/golang/multi-tenant.md`
402402
403403
## ⛔ Multi-Tenant Dual-Mode Implementation (Go backend only — skip for TypeScript/Frontend)
404404
405405
**Applies only when `language == "go"`.** TypeScript and frontend projects have different patterns.
406406
407-
All Go backend code must work in BOTH modes from the start. The lib-commons v3 resolvers handle both transparently — in single-tenant mode they return the default connection, in multi-tenant mode they resolve per-tenant. There is NO post-cycle adaptation step.
407+
All Go backend code must work in BOTH modes from the start. The lib-commons v4 resolvers handle both transparently — in single-tenant mode they return the default connection, in multi-tenant mode they resolve per-tenant. There is NO post-cycle adaptation step.
408408
409409
### Sub-Package Import Reference
410410
411411
| Alias | Import Path | Purpose |
412412
|-------|-------------|---------|
413-
| `core` | `github.com/LerianStudio/lib-commons/v3/commons/tenant-manager/core` | Resolvers, context helpers, types |
414-
| `tmmiddleware` | `github.com/LerianStudio/lib-commons/v3/commons/tenant-manager/middleware` | TenantMiddleware, WhenEnabled |
415-
| `tmpostgres` | `github.com/LerianStudio/lib-commons/v3/commons/tenant-manager/postgres` | PostgresManager |
416-
| `tmmongo` | `github.com/LerianStudio/lib-commons/v3/commons/tenant-manager/mongo` | MongoManager |
417-
| `tmrabbitmq` | `github.com/LerianStudio/lib-commons/v3/commons/tenant-manager/rabbitmq` | RabbitMQ Manager (vhost isolation) |
418-
| `valkey` | `github.com/LerianStudio/lib-commons/v3/commons/tenant-manager/valkey` | Redis key prefixing |
419-
| `s3` | `github.com/LerianStudio/lib-commons/v3/commons/tenant-manager/s3` | S3 key prefixing |
413+
| `core` | `github.com/LerianStudio/lib-commons/v4/commons/tenant-manager/core` | Resolvers, context helpers, types |
414+
| `tmmiddleware` | `github.com/LerianStudio/lib-commons/v4/commons/tenant-manager/middleware` | TenantMiddleware, WhenEnabled |
415+
| `tmpostgres` | `github.com/LerianStudio/lib-commons/v4/commons/tenant-manager/postgres` | PostgresManager |
416+
| `tmmongo` | `github.com/LerianStudio/lib-commons/v4/commons/tenant-manager/mongo` | MongoManager |
417+
| `tmrabbitmq` | `github.com/LerianStudio/lib-commons/v4/commons/tenant-manager/rabbitmq` | RabbitMQ Manager (vhost isolation) |
418+
| `valkey` | `github.com/LerianStudio/lib-commons/v4/commons/tenant-manager/valkey` | Redis key prefixing |
419+
| `s3` | `github.com/LerianStudio/lib-commons/v4/commons/tenant-manager/s3` | S3 key prefixing |
420420
421421
### Resource Resolver Rules (ALL resources the service uses)
422422

0 commit comments

Comments
 (0)