This README.md is also available in Spanish.
Is a command line interface that provides you with useful commands to help you build your application with the Hexagonal Architecture. It allows you to generate the initial structure of a project and to generate every layer of a new package.
- Create the initial structure of a project ✅
- Create a package on the different layers ✅
- Add one field on the desired layers (database, model, storage, etc.) WIP 🛠
- Remove one field on the desired layers (database, model, storage, etc.) WIP 🛠
- Override a package WIP 🛠
This command will install the CLI on $GOPATH/bin
so make sure that you have that on your $PATH
.
go install github.com/edteamlat/go-wizard@latest
If you want a different version, just replace the @latest
with the version @v1.0.0
To create the initial structure of a new project you just need to run the next command:
go-wizard init -m github.com/edteamlat/my-app
This will create the project on the current directory with the layers to work with the hexagonal architecture, and it'll automatically init git and the go modules.
.
└── my-app
├── cmd
│ ├── certificates
│ ├── logs
│ ├── config.go
│ ├── configuration.json.example
│ ├── database.go
│ ├── echo.go
│ ├── logger.go
│ ├── main.go
│ └── remoteconfig.go
├── domain
├── infrastructure
│ ├── handler
│ │ ├── request
│ │ │ ├── fields.go
│ │ │ ├── parameter.go
│ │ │ └── token.go
│ │ ├── response
│ │ │ ├── message.go
│ │ │ └── response.go
│ │ └── router.go
│ └── postgres
├── model
│ ├── config.go
│ ├── error.go
│ ├── logger.go
│ ├── messagehandler.go
│ ├── model.go
│ ├── model_test.go
│ ├── remoteconfig.go
│ └── router.go
├── sqlmigration
├── go.mod
├── README.md
└── wizard-config.yaml
Once the installation is done, you can open your project folder:
cd my-app
After we init the project the go mod tidy
command will be executed to download the dependencies.
If you want to get more information about this command, run:
go-wizard help init
With this command you can create the CRUD on the available layers that will read from a config yaml file that is generated when you run the init command:
# if you don't specify this field, the wizard will automatically use the path of working directory (pwd)
# here you'll have to change the username and set the correct path to your project
project_path: /home/username/Documents/code/
# the module_name is used to create the imports
module_name: github.com/edteamlat/go-wizzard
# Is Use for the name of the structs of the different layers
model: UserRole
# Will be use for the table name and constraints
# also, it'll be converted to UpperCamelCase to be use
# for the Slice model
table: user_roles
# table_comment will be use as the comment for the new table
table_comment: Write your comment here
# choose the type of the dates (valid options: time.Time and int64 for unix)
time_type: time.Time
# choose the type of the primary key (valid options: uint, uuid.UUID)
id_type: uint
# a list of objects where you specify the name, type and if it allows nulls
# by default, the id, created_at and updated_at fields, will be added
fields:
- name: user_id
type: uint
is_null: false
- name: description
type: string
is_null: true
field_size: 255 # only for string type, if not specified, it'll be 255, if you put -1, it'll be of type TEXT instead of VARCHAR
- name: is_active
type: bool
is_null: false
- name: begins_at
type: time.Time
is_null: false
- name: priority
type: float64
numeric_precision: 10 # only for float type, if not specify, it'll be 10, must be a positive number
numeric_scale: 2 # only for float type, if not specified, it'll be 2, can be either positive or negative
# The available layers that we can generate
# if you don't want to use one, just remove it
layers:
- domain
- handler_echo # we only support the echo framework for now
- storage_postgres # we don't support other db system for now
- model
- sqlmigration_postgres # here we'll save the sql files to modify our db, it only supports postgres syntax for now
This config file is added on the root of your project with the name wizard-config.yaml
when you exec the init command.
To create a new package just fill the config file and exec the next command:
go-wizard add package
With the config file of above this command will generate the following:
├── cmd
├── domain
│ └── userrole
│ ├── usecase.go
│ └── userrole.go
├── infrastructure
│ ├── handler
│ │ ├── request
│ │ ├── response
│ │ ├── userrole
│ │ │ ├── handler.go
│ │ │ └── route.go
│ └── postgres
│ └── userrole
│ └── userrole.go
├── model
│ └── userrole.go
├── sqlmigration
│ └── 20210908_063849_create_user_roles_table.sql
Now you can enter into every file that was generated to see what's inside.
You can also pass the flag -c
to indicate the path of the config file:
go-wizard add package -c /home/username/Documents/code/my-app/wizard-config.yaml
If you want to get more information about this command, run:
go-wizard help add
Go Type | Postgres type |
---|---|
string | VARCHAR(SIZE) and TEXT |
int | INTEGER |
int8 | INTEGER |
int16 | INTEGER |
int32 | INTEGER |
int64 | INTEGER |
uint | INTEGER |
uint8 | INTEGER |
uint16 | INTEGER |
uint32 | INTEGER |
uint64 | INTEGER |
float32 | NUMERIC() |
float64 | NUMERIC() |
bool | BOOLEAN |
time.Time | TIMESTAMP and INTEGER for unix |
uuid.UUID | UUID |
json.RawMessage | JSON |
If other types are used, the wizard will return set INVALID_TYPE as the type of the field, so if you want to use other types, you'll have to open an issue or make a PR.