err0r500 / clean-architecture-in-golang Goto Github PK
View Code? Open in Web Editor NEWA Clean Architecture in Golang
License: MIT License
A Clean Architecture in Golang
License: MIT License
@err0r500 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 domain
type Tenant struct {
ID int64 `json:"id"`
Name string `json:"name"`
}
to other models like this:
package domain
type User struct {
Address string
TenantID int64 `json:"tenant_id"` // <--- here
Tenant *Tenant // <--- here
UserAddressChecker
}
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.