I am trying to standardize an architecture for my Go projects, so I have a 
file structure like this:

    ├── go.mod
    ├── go.sum
    ├── internal
    │   ├── domain
    │   │   ├── models
    │   │   │   └── user.go
    │   │   └── services
    │   │       └── user.go
    │   └── repositories
    │       └── mongodb
    │           ├── base.go
    │           ├── config.go
    │           └── user.go

File services/user.go:

 https://go.dev/play/p/ZYWhgHRLU5V

In the services I have business logic and in another folder called 
repositories I have implementations in different technologies as needed. 
For example I can have an implementation of UserStore in Mongo DB... or 
Postgres etc.... And the idea is then to have a layer on top of these 
services... that can be, an APIRest, a serverless etc....
I have doubts about where I should define the errors in my system. For 
example, a common error could be *ErrRecordNotFound*, but depending on the 
repository/technology, this error will be different. 
I was thinking of defining the errors inside the domain folder, and then in 
the repositories, the errors are mapped to my domain errors.... for example 
if it was in mongo, my code would look like this:

    if errors.Is(err, mongo.ErrNoDocuments) {
    return nil, domain.ErrDocumentNotFound
    }
   
(or in some cases wrap the library specific error in my domain error). 
This way my business logic would not depend on specific technologies, but 
the implementations/libraries depend on my business logic. A possible 
disadvantage is that my repositories code may no longer be reusable because 
it is “smeared” with specific business logic.

Is this approach correct? Or should I approach it differently?

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion visit 
https://groups.google.com/d/msgid/golang-nuts/85b7fa7d-1c01-4281-be20-4837f6019743n%40googlegroups.com.

Reply via email to