https://github.com/meganewsopensource/tenantcontext
Tenant Context: Middleware para Gerenciamento de Múltiplos Locatários com Schemas no PostgreSQL (Baseado em Headers)
https://github.com/meganewsopensource/tenantcontext
gin grpc multitenancy postgres postgresql rest tenant
Last synced: about 2 months ago
JSON representation
Tenant Context: Middleware para Gerenciamento de Múltiplos Locatários com Schemas no PostgreSQL (Baseado em Headers)
- Host: GitHub
- URL: https://github.com/meganewsopensource/tenantcontext
- Owner: meganewsopensource
- License: gpl-3.0
- Created: 2024-09-25T20:10:14.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2025-04-24T13:25:59.000Z (about 1 year ago)
- Last Synced: 2026-01-15T05:17:02.505Z (5 months ago)
- Topics: gin, grpc, multitenancy, postgres, postgresql, rest, tenant
- Language: Go
- Homepage:
- Size: 39.1 KB
- Stars: 1
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
## Tenant Context : Middleware para Gerenciamento de Múltiplos Locatários com Schemas no PostgreSQL (Baseado em Headers)
Tenant Context é um middleware projetado com o objetivo de simplificar a gestão de múltiplos locatários em aplicações que utilizam o banco de dados PostgreSQL. A biblioteca ajuda a implementar a abordagem de isolamento de dados por schema, onde cada locatário possui um schema exclusivo no banco de dados. A troca de schema é realizada com base em um header específico presente na requisição HTTP.
### Funcionalidade Principal:
* Troca Automática de Schema Baseada em Header: O middleware intercepta as requisições HTTP e busca um header predefinido (por exemplo, X-Tenant-ID) para identificar o locatário associado. Antes que o controlador da sua aplicação acesse o banco de dados, o middleware realiza a troca do schema ativo na conexão, garantindo que todas as operações subsequentes sejam executadas no contexto correto do locatário.
### Exemplo gin
~~~ go
dbs := map[string]*gorm.DB{
"tenant1": dbTenant1,
"tenant2": dbTenant1,
}
context := newTenantContext(dbs, "X-Tenant-ID")
router := gin.Default()
router.Use(context.ChangeContextRest())
router.GET("/test", func(c *gin.Context) {
db, exists := c.MustGet("db").(*gorm.DB)
var employee []Employee
if exists{
db.Find(&employee)
}
c.JSON(http.StatusOK, employee)
})
~~~
### Exemplo GRPc
~~~ go
dbs := map[string]*gorm.DB{
"tenant1": dbTenant1,
"tenant2": dbTenant1,
}
context := newTenantContext(dbs, "X-Tenant-ID")
l, err := net.Listen("tcp", ":8080")
if err != nil {
log.Fatal(err)
}
fmt.Println("run on port: 8080")
server := grpc.NewServer(grpc.UnaryInterceptor(ChangeContextGrpc()))
pb.RegisterMegaMDFeServer(server, NewMyController())
err = server.Serve(l)
if err != nil {
log.Fatal(err)
}
/////////
func (M MyController) resource(ctx context.Context, c *pb.mymessage) (*emptypb.Empty, error) {
db := ctx.Value("db").(*gorm.db)
db.ping()
return &emptypb.Empty{}, nil
}
~~~