This is sample project using gRPC with DDD architecture.
% npm install -g grpcc
% make protoc
% cat 'PORT=50055' > .env
% make run
% make grpcc
@hatajoe thanks for your amazing work! Go is just a hobby for me and I'm having fun. I'm learning a lot from your project.
I'm trying to understand if multi-tenancy column/table based is something to be "included", if it is "related to" the repository, usecase or handler level.
Adding tenant.go
model like this:
package model
type Tenant struct {
ID int64 `json:"id"`
Name string `json:"name"`
}
to other models like this:
package model
type User struct {
ID string
TenantID int64 `json:"tenant_id"` // <--- here
Tenant *Tenant // <--- here
Email string
}
Let's say my tenant_id
is a field of a User
struct in context
on every request (authenticated by a third party middleware).
Where do you think I should do something like below? In handler, usecase or repository?
tenantID := GetTenantIDFromUserInContext()
article.TenantID = tenantID
Today, before I discover the amazing "clean architecture", I'm using a where
clause in my SQL queries (go-pg/pg#1179), like this:
// Used as: "q.Apply(FilterByTenant(ctx))"
func FilterByTenant(ctx context.Context) func(q *orm.Query) (*orm.Query, error) {
user := ctx.Value(auth.CTXKeyUser).(*models.User)
return func(q *orm.Query) (*orm.Query, error) {
q = q.Where("tenant_id = ?", user.TenantID)
return q, nil
}
}
I think maybe the concept of FilterByTenant
in the usecase layer is an unnecessary repetition and should belong to lower levels like repositories?
But I also think that the main multi-tenancy logic does not change with the change of possible repository types (Postgres, Mysql, Mongo, microservices).
What do you think about it?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.